LINUX文件系統(tǒng)

Linux文件系統(tǒng)簡介

Linux下磁盤分區(qū)和目錄的關(guān)系如下:

  • 任何一個分區(qū)都必須掛載到某個目錄上。
  • 目錄是邏輯上的區(qū)分。分區(qū)是物理上的區(qū)分。
  • 磁盤Linux分區(qū)都必須掛載到目錄樹中的某個具體的目錄上才能進(jìn)行讀寫操作。
  • 根目錄是所有Linux的文件和目錄所在的地方,需要掛載上一個磁盤分區(qū)。

Linux操作系統(tǒng)文件系統(tǒng)基礎(chǔ)知識詳解

舉個例子:

有一塊硬盤,分成了4個分區(qū),分別是:

/
/boot
/usr
/windows下的fat

對于/和/boot或者/和/usr,它們是從屬關(guān)系;對于/boot和/usr,它們是并列關(guān)系。

如果我把windows下的fat分區(qū)掛載到/mnt/winc下,(掛載??哦,別急,呵呵,一會就講,一會就講。)那么對于/mnt/winc和/usr或/mnt/winc和/boot來說,它們是從屬于目錄樹上沒有任何關(guān)系的兩個分支。

文件系統(tǒng)指文件存在的物理空間,linux系統(tǒng)中每個分區(qū)都是一個文件系統(tǒng),都有自己的目錄層次結(jié)構(gòu)。linux會將這些分屬不同分區(qū)的、單獨(dú)的文件系統(tǒng)按一定的方式形成一個系統(tǒng)的總的目錄層次結(jié)構(gòu)。一個操作系統(tǒng)的運(yùn)行離不開對文件的操作,因此必然要擁有并維護(hù)自己的文件系統(tǒng)。

將一個文件系統(tǒng)的頂層目錄掛到另一個文件系統(tǒng)的子目錄上,使它們成為一個整體,稱為掛載。把該子目錄稱為掛載點(diǎn)。

注意:
1、掛載點(diǎn)必須是一個目錄。
2、一個分區(qū)掛載在一個已存在的目錄上,這個目錄可以不為空,但掛載后這個目錄下以前的內(nèi)容將不可用。

Linux 文件系統(tǒng)基礎(chǔ)

linux文件系統(tǒng)使用索引節(jié)點(diǎn)(inode)來記錄文件信息。

索引節(jié)點(diǎn)是一個結(jié)構(gòu),它包含了一個文件的長度、創(chuàng)建及修改時間、權(quán)限、所屬關(guān)系、磁盤中的位置等信息。一個文件系統(tǒng)維護(hù)了一個索引節(jié)點(diǎn)的數(shù)組,每個文件或目錄都與索引節(jié)點(diǎn)數(shù)組中的唯一一個元素對應(yīng)。系統(tǒng)給每個索引節(jié)點(diǎn)分配了一個號碼,也就是該節(jié)點(diǎn)在數(shù)組中的索引號,稱為索引節(jié)點(diǎn)號。

linux文件系統(tǒng)將文件索引節(jié)點(diǎn)號和文件名同時保存在目錄中。所以,目錄只是將文件的名稱和它的索引節(jié)點(diǎn)號結(jié)合在一起的一張表,目錄中每一對文件名稱和索引節(jié)點(diǎn)號稱為一個連接。

文件系統(tǒng)存儲結(jié)構(gòu)圖

補(bǔ)充一下,硬連接在windows里叫junction,軟連接叫shortcut。并不是windows沒有硬鏈接,只是不鼓勵使用這個東東。

對于一個文件來說有唯一的索引節(jié)點(diǎn)號與之對應(yīng),對于一個索引節(jié)點(diǎn)號,卻可以有多個文件名與之對應(yīng)(硬鏈接的原理)。因此,在磁盤上的同一個文件可以通過不同的路徑去訪問它。

linux啟動時掛載rootfs的幾種方式

mount根文件系統(tǒng)

linux啟動時,經(jīng)過一系列初始化之后,需要mount 根文件系統(tǒng),為最后運(yùn)行init進(jìn)程等做準(zhǔn)備,mount 根文件系統(tǒng)有這么幾種方式:

  1. 文件系統(tǒng)已經(jīng)存在于硬盤(或者類似的設(shè)備)的某個分區(qū)上了,kernel根據(jù)啟動的命令行參數(shù)(root=/dev/xxx),直接進(jìn)行mount。這里有一個問題,在root文件系統(tǒng)本身還不存在的情況下,kernel如何根據(jù)/dev/xxx來找到對應(yīng)的設(shè)備呢?注意:根文件系統(tǒng)和其他文件系統(tǒng)的mount方式是不一樣的,kernel通過直接解析設(shè)備的名稱來獲得設(shè)備的主、從設(shè)備號,然后就可以訪問對應(yīng)的設(shè)備驅(qū)動了。**所以在init/main.c中有很長一串的root_dev_names(如hda,hdab,sda,sdb,nfs,ram,mtdblock……),通過這個表就可以根據(jù)設(shè)備名稱得到設(shè)備號。注意,bootloader或內(nèi)核中設(shè)定的啟動參數(shù)(root=/dev/xxx)只是一個代號,實(shí)際的根文件系統(tǒng)中不一定存在這個設(shè)備文件!

  2. 從軟驅(qū)等比較慢的設(shè)備上裝載根文件系統(tǒng),如果kernel支持ramdisk,在裝載root文件系統(tǒng)時,內(nèi)核判斷到需要從軟盤(fdx)mount(root=/dev/fd0),就會自動把文件系統(tǒng)映象復(fù)制到ramdisk,一般對應(yīng)設(shè)備ram0,然后在ram0上mount根文件系統(tǒng)。從源碼看,如果kernel編譯時沒有支持ramdisk,而啟動參數(shù)又是root=/dev/fd0,系統(tǒng)將直接在軟盤上mount,除了速度比較慢,理論上是可行的(沒試過,不知道是不是這樣?)

  3. 啟動時用到initrd來mount根文件系統(tǒng)。注意理解ramdisk和initrd這兩個概念,其實(shí)ramdisk只是在ram上實(shí)現(xiàn)的塊設(shè)備,類似與硬盤操作,但有更快的讀寫速度,它可以在系統(tǒng)運(yùn)行的任何時候使用,而不僅僅是用于啟動;initrd(boot loader initialized RAM disk)可以說是啟動過程中用到的一種機(jī)制,具體的實(shí)現(xiàn)過程也使用ramdisk技術(shù)。就是在裝載linux之前,bootloader可以把一個比較小的根文件系統(tǒng)的映象裝載在內(nèi)存的某個指定位置,姑且把這段內(nèi)存稱為initrd(這里是initrd所占的內(nèi)存,不是ramdisk,注意區(qū)別),然后bootloader通過傳遞參數(shù)的方式告訴內(nèi)核initrd的起始地址和大?。ㄒ部梢园堰@些參數(shù)編譯在內(nèi)核中),在啟動階段就可以暫時的用initrd來mount根文件系統(tǒng)。initrd的最初的目的是為了把kernel的啟動分成兩個階段:在kernel中保留最少最基本的啟動代碼,然后把對各種各樣硬件設(shè)備的支持以模塊的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根文件系統(tǒng)中裝載需要的模塊。這樣的一個好處就是在保持kernel不變的情況下,通過修改initrd中的內(nèi)容就可以靈活的支持不同的硬件。在啟動完成的最后階段,根文件系統(tǒng)可以重新mount到其他設(shè)備上,但是也可以不再 重新mount(很多嵌入式系統(tǒng)就是這樣)。 initrd的具體實(shí)現(xiàn)過程是這樣的:bootloader把根文件系統(tǒng)映象裝載到內(nèi)存指定位置,把相關(guān)參數(shù)傳遞給內(nèi)核,內(nèi)核啟動時把initrd中的內(nèi)容復(fù)制到ramdisk中(ram0),把initrd占用的內(nèi)存釋放掉,在ram0上mount根文件系統(tǒng)。從這個過程可以看出,內(nèi)核需要對同時對ramdisk和initrd的支持(這種需要都編入內(nèi)核,不能作為模塊)。

嵌入式系統(tǒng)根文件系統(tǒng)

嵌入式系統(tǒng)根文件系統(tǒng)的一種實(shí)現(xiàn)方法:對于kernel和根文件系統(tǒng)都存儲在flash中的系統(tǒng),一般可以利用linux啟動的initrd的機(jī)制。具體的過程前面已經(jīng)比較清楚了,還有一點(diǎn)就是在啟動參數(shù)中傳遞root=/dev/ram0,這樣使得用initrd進(jìn)行mount的根文件系統(tǒng)不再切換,因?yàn)檫@個時候?qū)嶋H的設(shè)備就是ram0。還有就是initrd的起始地址參數(shù)為虛擬地址,需要和bootloader中用的物理地址對應(yīng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容