文件系统简介
文件系统就是个软件,帮用户来管理一些二进制的信息,管理外存上存储的这些二进制
各种文件在内存中都是以二进制的形式来存在的,如果没有文件系统,用户就需要自己去决定这些二进制的东西是什么,需要自己去和硬件打交道,有了文件系统,就省去了用户和硬件直接打交道的过程。
linux和windows以及嵌入式linux文件系统的区别?
在pc机上的linux的boot和根文件系统是一起的,不在一起,是挂载看到的,虽然是在根文件系统是能看到boot的,但是物理上是分开的。因为这个的boot是有文件系统的
而在嵌入式linux中,boot和根文件系统是分开的,在根文件下是看不到内核grub等东西的,1.是因为根文件系统没有去把boot做进来,2.因为嵌入式linux的boot中是没有文件系统用的。在嵌入式linux中是没有swap
优盘上的文件系统
挂载机制
基于内存的文件系统
可以把内存中的一块当成文件系统中的一部分
文件系统就分为:根文件系统和普通的文件系统。比如优盘就有自己的普通的文件系统,是fat32的文件系统
而根文件系统则不一定是fat32的。
还有一种nfs的网络文件系统
根文件系统为这些文件系统提供了一种框架
VFS
不基于硬件,作用是去识别各个设备上的文件系统,只存在于内存中的
执行的linux.rc这个可执行程序,进程号是1的程序就是这个。
pc机上的内核会通过bootpImage来识别硬盘上的文件系统
用ext3的read读出来数据,在用ext2的write写进去,中间就是用VFS这个借口来,调用不同的文件系统的函数来去实现一个cp的命令。
常见的根文件系统有基于flash的jffs2、yaffs、yaffs2、cramfs、基于网络的nfs等
nfs比较特别
用df来查看自己的根文件系统挂载
看到的就是这样子
/dev/mapper/VolGroup00-LogVol00
14093368 9200464 4165456 69% /
/dev/sda1 101086 15783 80084 17% /boot
tmpfs 257800 0 257800 0% /dev/shm
.host:/ 122873120 51227228 71645892 42% /mnt/hgfs
sda1中挂载的就是boot
tmpfs就内存中的根文件系统
69%本来应该是sda1
显示的是挂载过来的
Linux根文件系统目录结构
/bin /sbin /dev /etc /lib /usr /var
/proc /tmp /home /root /mnt /sys
/bin /sbin
放的是命令,bin下是常用的
sbin是系统常用的命令
usr/bin 下是用户的命令
/dev 下是一些设备文件
比如 tty0 touchscreen sound usb 等
一般挂载devfs或udev
这些名字可以自己改,是在内核中去修改的,修改的自己认识就可以的,这些东西都是内核启动完成后放进去的,做文件系统的只是起个文件夹得名字就可以了,具体放什么,是在内核启动中去放的
/etc 系统启动中需要的各种配置文件
比如启动时自动挂载的文件系统,自动运行的脚本,包括root一般的初始密码为什么是6个1,boa服务器配置脚本等东西,这是linux做根文件系统特别重要的文件,一般启动不起来,都是以为这个文件夹中的东西没有配置好
/lib
存放应从程序所需要的共享库
如 ls,cp ifconfig等系统明亮以及自己交叉编译器所用的
/usr/bin
比如qt需要的库就会放到这里
/usr
一般存放用户需要的东西,比如用户自己安装的东西,总的来说就是不是根文件系统需要的东西会放在这里
/var
存放系统启动过程会自动保存的一些东西,这里放的一些,日志之类的东西,都是掉电丢失的
一般挂载ramfs
ramfs就是把内存中的一块拿出来当做文件系统
tmpfs也是用来基于ramfs的文件系统
/tmp
一般是些临时文件的程序需要的目录
上面的这两个都是占的内存的
/proc
dev 是用来放设备节点
而这里是用来放 存放记录了当前存在多少模块,还有中断的使用情况,使用次数,包括当前系统的字符设备
里面存放的那些数字表示的是进程,里面就存放了这些进程所需要的一些东西,实际去做的时候做成空的,去挂载,一般都是需要去写脚本自动挂载,若不挂载一般系统会出各种奇怪的错误
/root
root的家
/home
其他用户的家目录
/mnt
临时文件系统挂载的目录
/sys
和proc类似,每加载一个驱动,就会记录这个驱动申请了哪些硬件资源等等,dev中只是存放了设备的名字,而这里面则是具体的东西
/rc(pc 机上的linux没,在开发板上才有)
是启动起来的第一个进程
(重要 :根文件系统的构建)
需要了解嵌入linux的启动过程
"noinitrd root=/dev/mtdblock/1 init=/linuxrc console=ttyS0";
root: 指定了根文件系统在FLASH分区中的位置
console:指定了内核启动后首选的控制台
init: 指定了linux内核启动完毕后调用的第一个用户态程序,即进程号为1的进程。
root=/dev/mtdblock/1 表示从这里去找根文件系统 ,看内核中去怎么写,内核中是2就是2
init=/linuxrc 启动以后的第一个用户态的进程
console=ttyS0 启动信息打印到那里去 ,这个是串口
linuxrc那里来的?linuxrc就是init进程,内核只启动这一个程序,其他的根文件系统都是由这个进程来启动的,内核是工作在内核态的,只要启动用户态的这个linuxrc这个进程,就表示内核启动的工作的结束(有系统调用的时候内核还是会工作的)。
其他的用户进程都是属于这个进程子进程,因为都是这个进程的子进程
会读取inittab的配置文件,来按照这个脚本来执行
linuxrc的执行过程
(结合ppt来看)
(后续补充……)
inittab是在etc文件下的
inittab文件的格式
(补图)
第一个id是表示使用的控制台,啥也不写,表示和内核是一样的,可以和内核不一样,一般是默认不写
第二个runlevels是 对嵌入式是没有意义,对于pc机的linux有意思,从0到5,5代表图形界面,表示开机的时候是进图形界面,3是表示字符界面 ,0是启动不起来了,1是单用户模式,类似于安全模式,2是多用户
可以在/etc/inittab 中看到
第三action个是 表示程序是怎么去执行的(补图)
respawn 启动的进程是不允许退出的 在嵌入式linux中的bash就是不允许退出的 会不断的重启
第四个process是要执行的程序的名字(需要路径)
init进程只能控制这8个进程
console c 5 1 (c是字符 5 是主设备号 1是从设备号)
比如 5 表示是串口,1就是具体com1或者别的com口
什么是设备节点?
就是dev下的一个名字
字符设备
最多可以有0到254,共255个(类)设备,是空的就可以去申请
块设备
网络设备
所有的驱动都是工作在内核态的
内核启动linuxrc就把工作权利交给根文件系统了
在profile中写
alies vi = ‘vim’ 这样以后vi就相当于vim了
嵌入式领域中的命令基本上都是从busybox连接过来的
可以在bin下执行ll -h来看