文件系統簡介
文件系統就是個軟件,幫用戶來管理一些二進制的信息,管理外存上存儲的這些二進制
各種文件在內存中都是以二進制的形式來存在的,如果沒有文件系統,用戶就需要自己去決定這些二進制的東西是什么,需要自己去和硬件打交道,有了文件系統,就省去了用戶和硬件直接打交道的過程。
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來看