linux中的根文件系統(tǒng) rootfs

淺談linux中的根文件系統(tǒng)(rootfs的原理和介紹)

linux中有一個(gè)讓很多初學(xué)者都不是特別清楚的概念酌心,叫做“根文件系統(tǒng)”。我接觸linux前前后后也好幾年了逸绎,但是對這個(gè)問題,至今也不是特別的清楚,至少?zèng)]法給出一個(gè)很全面很到位的解釋稽亏。于是,今天我們就來理一理這個(gè)話題讲弄。

一措左、先交代一下文件系統(tǒng)

在開始討論根文件系統(tǒng)這個(gè)話題之前,我們必首先交代一下文件系統(tǒng)這個(gè)概念避除。畢竟怎披,根文件系統(tǒng)只是文件系統(tǒng)中的一種比較特殊的形式而已。根據(jù)偉大的百度百科:

文件系統(tǒng)是操作系統(tǒng)用于明確存儲(chǔ)設(shè)備(常見的是磁盤瓶摆,也有基于NAND Flash的固態(tài)硬盤)或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu)凉逛;即在存儲(chǔ)設(shè)備上組織文件的方法。操作系統(tǒng)中負(fù)責(zé)管理和存儲(chǔ)文件信息的軟件機(jī)構(gòu)稱為文件管理系統(tǒng)群井,簡稱文件系統(tǒng)状飞。文件系統(tǒng)由三部分組成:文件系統(tǒng)的接口,對對象操作和管理的軟件集合书斜,對象及屬性诬辈。從系統(tǒng)角度來看,文件系統(tǒng)是對文件存儲(chǔ)設(shè)備的空間進(jìn)行組織和分配荐吉,負(fù)責(zé)文件存儲(chǔ)并對存入的文件進(jìn)行保護(hù)和檢索的系統(tǒng)焙糟。具體地說,它負(fù)責(zé)為用戶建立文件样屠,存入穿撮、讀出、修改痪欲、轉(zhuǎn)儲(chǔ)文件悦穿,控制文件的存取,當(dāng)用戶不再使用時(shí)撤銷文件等业踢。

文件系統(tǒng)的重要性栗柒,我想大家都很清楚,不用多說了知举。這里有一句話傍衡,我覺得非常精辟而且到位的點(diǎn)出了文件系統(tǒng)在linux中的重要性:

盡管內(nèi)核是linux的核心深员,但文件卻是用戶與操作系統(tǒng)交互所采用的主要工具。這對linux來說尤其如此蛙埂,這是因?yàn)樵赨NIX傳統(tǒng)中倦畅,它使用文件I/O機(jī)制管理硬件設(shè)備和數(shù)據(jù)文件。

二绣的、什么是根文件系統(tǒng)

然后來解釋一下“根文件系統(tǒng)”這個(gè)名詞的基本概念叠赐。同樣引自百度百科的解釋:

根文件系統(tǒng)首先是內(nèi)核啟動(dòng)時(shí)所mount的第一個(gè)文件系統(tǒng),內(nèi)核代碼映像文件保存在根文件系統(tǒng)中屡江,而系統(tǒng)引導(dǎo)啟動(dòng)程序會(huì)在根文件系統(tǒng)掛載之后從中把一些基本的初始化腳本和服務(wù)等加載到內(nèi)存中去運(yùn)行芭概。

展開來細(xì)說就是,根文件系統(tǒng)首先是一種文件系統(tǒng)惩嘉,該文件系統(tǒng)不僅具有普通文件系統(tǒng)的存儲(chǔ)數(shù)據(jù)文件的功能罢洲,但是相對于普通的文件系統(tǒng),它的特殊之處在于文黎,它是內(nèi)核啟動(dòng)時(shí)所掛載(mount)的第一個(gè)文件系統(tǒng)惹苗,內(nèi)核代碼的映像文件保存在根文件系統(tǒng)中,系統(tǒng)引導(dǎo)啟動(dòng)程序會(huì)在根文件系統(tǒng)掛載之后從中把一些初始化腳本(如rcS,inittab)和服務(wù)加載到內(nèi)存中去運(yùn)行耸峭。我們要明白文件系統(tǒng)和內(nèi)核是完全獨(dú)立的兩個(gè)部分桩蓉。在嵌入式中移植的內(nèi)核下載到開發(fā)板上,是沒有辦法真正的啟動(dòng)Linux操作系統(tǒng)的劳闹,會(huì)出現(xiàn)無法加載文件系統(tǒng)的錯(cuò)誤院究。

三、根文件系統(tǒng)為什么這么重要

根文件系統(tǒng)之所以在前面加一個(gè)”根“本涕,說明它是加載其它文件系統(tǒng)的”根“业汰,那么如果沒有這個(gè)根,其它的文件系統(tǒng)也就沒有辦法進(jìn)行加載的菩颖。

根文件系統(tǒng)包含系統(tǒng)啟動(dòng)時(shí)所必須的目錄和關(guān)鍵性的文件样漆,以及使其他文件系統(tǒng)得以掛載(mount)所必要的文件。例如:

  1. init進(jìn)程的應(yīng)用程序必須運(yùn)行在根文件系統(tǒng)上位他;
  2. 根文件系統(tǒng)提供了根目錄“/”;
  3. linux掛載分區(qū)時(shí)所依賴的信息存放于根文件系統(tǒng)/etc/fstab這個(gè)文件中产场;
  4. shell命令程序必須運(yùn)行在根文件系統(tǒng)上鹅髓,譬如ls、cd等命令京景;

總之:一套linux體系窿冯,只有內(nèi)核本身是不能工作的,必須要rootfs(上的etc目錄下的配置文件确徙、/bin /sbin等目錄下的shell命令醒串,還有/lib目錄下的庫文件等···)相配合才能工作执桌。

Linux啟動(dòng)時(shí),第一個(gè)必須掛載的是根文件系統(tǒng)芜赌;若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng)仰挣,則系統(tǒng)會(huì)出錯(cuò)而退出啟動(dòng)。成功之后可以自動(dòng)或手動(dòng)掛載其他的文件系統(tǒng)缠沈。因此膘壶,一個(gè)系統(tǒng)中可以同時(shí)存在不同的文件系統(tǒng)。在 Linux 中將一個(gè)文件系統(tǒng)與一個(gè)存儲(chǔ)設(shè)備關(guān)聯(lián)起來的過程稱為掛載(mount)洲愤。使用 mount 命令將一個(gè)文件系統(tǒng)附著到當(dāng)前文件系統(tǒng)層次結(jié)構(gòu)中(根)颓芭。在執(zhí)行掛裝時(shí),要提供文件系統(tǒng)類型柬赐、文件系統(tǒng)和一個(gè)掛裝點(diǎn)亡问。根文件系統(tǒng)被掛載到根目錄下“/”上后,在根目錄下就有根文件系統(tǒng)的各個(gè)目錄肛宋,文件:/bin /sbin /mnt等州藕,再將其他分區(qū)掛接到/mnt目錄上,/mnt目錄下就有這個(gè)分區(qū)的各個(gè)目錄和文件悼吱。

四慎框、如何在內(nèi)核中掛載根文件系統(tǒng)

init/main.c->

start_kernel()->vfs_caches_init(totalram_pages)–>

mnt_init()–>

/* sysfs用來記錄和展示linux驅(qū)動(dòng)模型,sysfs先于rootfs掛載是為全面展示linux驅(qū)動(dòng)模型做好準(zhǔn)備 /
     /
mnt_init()調(diào)用sysfs_init()注冊并掛載sysfs文件系統(tǒng)后添,然后調(diào)用kobject_create_and_add()創(chuàng)建fs目錄 */
     sysfs_init();

/* init_rootfs()注冊rootfs笨枯,然后調(diào)用init_mount_tree()掛載rootfs */
     init_rootfs();

init_mount_tree();

1、sysfs文件系統(tǒng)目前還沒有掛載到rootfs的某個(gè)掛載點(diǎn)上遇西,后續(xù)init程序會(huì)把sysfs掛載到rootfs的sys掛載點(diǎn)上馅精;

2、rootfs是基于內(nèi)存的文件系統(tǒng)粱檀,所有操作都在內(nèi)存中完成洲敢;也沒有實(shí)際的存儲(chǔ)設(shè)備,所以不需要設(shè)備驅(qū)動(dòng)程序的參與茄蚯⊙古恚基于以上原因,linux在啟動(dòng)階段使用rootfs文件系統(tǒng)渗常,當(dāng)磁盤驅(qū)動(dòng)程序和磁盤文件系統(tǒng)成功加載后壮不,linux系統(tǒng)會(huì)將系統(tǒng)根目錄從rootfs切換到磁盤文件系統(tǒng)。

start_kernel
  vfs_caches_init
    mnt_init
      init_rootfs注冊rootfs文件系統(tǒng)
      init_mount_tree 掛載rootfs文件系統(tǒng)
        vfs_kern_mount
          mount_fs
            type->mount其實(shí)是rootfs_mount
              mount_nodev
                fill_super 其實(shí)是ramfs_fill_super
                  inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0);
                  sb->s_root = d_make_root(inode);
                    static const struct qstr name = QSTR_INIT(“/”, 1);[1]
                    __d_alloc(root_inode->i_sb, &name);
          …
          mnt->mnt.mnt_root = root;[2
]
          mnt->mnt.mnt_sb = root->d_sb;[3]
          mnt->mnt_mountpoint = mnt->mnt.mnt_root;[4
]
          mnt->mnt_parent = mnt;[5*]
root.mnt = mnt;
        root.dentry = mnt->mnt_root;
        mnt->mnt_flags |= MNT_LOCKED;
        set_fs_pwd(current->fs, &root);
        set_fs_root(current->fs, &root);
  …
  rest_init
  kernel_thread(kernel_init, NULL, CLONE_FS);

在執(zhí)行kernel_init之前皱碘,會(huì)建立roofs文件系統(tǒng)询一。

[1]處設(shè)置了根目錄的名字為“/”;
[2
]處設(shè)置了vfsmount中的root目錄;
[3]處設(shè)置了vfsmount中的超級塊健蕊;
[4
]處設(shè)置了vfsmount中的文件掛載點(diǎn)菱阵,指向了自己;
[5*]處設(shè)置了vfsmount中的父文件系統(tǒng)的vfsmount為自己缩功;

五晴及、根文件系統(tǒng)各個(gè)常用目錄簡介

正常來說,根文件系統(tǒng)至少包括以下目錄:

  1. /etc/:存儲(chǔ)重要的配置文件掂之。
  2. /bin/:存儲(chǔ)常用且開機(jī)時(shí)必須用到的執(zhí)行文件抗俄。
  3. /sbin/:存儲(chǔ)著開機(jī)過程中所需的系統(tǒng)執(zhí)行文件。
  4. /lib/:存儲(chǔ)/bin/及/sbin/的執(zhí)行文件所需的鏈接庫世舰,以及Linux的內(nèi)核模塊动雹。
  5. /dev/:存儲(chǔ)設(shè)備文件。

注:五大目錄必須存儲(chǔ)在根文件系統(tǒng)上跟压,缺一不可胰蝠。

六、順便說下linux文件系統(tǒng)的常用目錄

Linux文件系統(tǒng)中一般有如下幾個(gè)目錄:

  1. /bin目錄
    該目錄下存放所有用戶都可以使用的震蒋、基本的命令茸塞,這些命令在掛接其它文件系統(tǒng)之前就可以使用,所以/bin目錄必須和根文件系統(tǒng)在同一個(gè)分區(qū)中查剖。
    /bin目錄下常用的命令有:cat钾虐,chgrp,chmod笋庄,cp效扫,ls,sh直砂,kill菌仁,mount,umount静暂,mkdir济丘,mknod,test等洽蛀,我們在利用Busybox制作根文件系統(tǒng)時(shí)摹迷,在生成的bin目錄下,可以看到一些可執(zhí)行的文件郊供,也就是可用的一些命令峡碉。

  2. /sbin 目錄
    該目錄下存放系統(tǒng)命令,即只有管理員能夠使用的命令颂碘,系統(tǒng)命令還可以存放在/usr/sbin,/usr/local/sbin目錄下异赫,/sbin目錄中存放的是基本的系統(tǒng)命令,它們用于啟動(dòng)系統(tǒng)头岔,修復(fù)系統(tǒng)等塔拳,與/bin目錄相似,在掛接其他文件系統(tǒng)之前就可以使用/sbin峡竣,所以/sbin目錄必須和根文件系統(tǒng)在同一個(gè)分區(qū)中靠抑。
    /sbin目錄下常用的命令有:shutdown,reboot适掰,fdisk颂碧,fsck等,本地用戶自己安裝的系統(tǒng)命令放在/usr/local/sbin目錄下类浪。

  3. /dev目錄
    該目錄下存放的是設(shè)備文件载城,設(shè)備文件是Linux中特有的文件類型,在Linux系統(tǒng)下费就,以文件的方式訪問各種設(shè)備诉瓦,即通過讀寫某個(gè)設(shè)備文件操作某個(gè)具體硬件。比如通過”dev/ttySAC0”文件可以操作串口0力细,通過”/dev/mtdblock1”可以訪問MTD設(shè)備的第2個(gè)分區(qū)睬澡。

  4. /etc目錄
    該目錄下存放著各種配置文件,對于PC上的Linux系統(tǒng)眠蚂,/etc目錄下的文件和目錄非常多煞聪,這些目錄文件是可選的,它們依賴于系統(tǒng)中所擁有的應(yīng)用程序逝慧,依賴于這些程序是否需要配置文件昔脯。在嵌入式系統(tǒng)中,這些內(nèi)容可以大為精減馋艺。

  5. /lib目錄
    該目錄下存放共享庫和可加載(驅(qū)動(dòng)程序)栅干,共享庫用于啟動(dòng)系統(tǒng)。運(yùn)行根文件系統(tǒng)中的可執(zhí)行程序捐祠,比如:/bin /sbin 目錄下的程序碱鳞。

  6. /home目錄
    用戶目錄,它是可選的踱蛀,對于每個(gè)普通用戶窿给,在/home目錄下都有一個(gè)以用戶名命名的子目錄,里面存放用戶相關(guān)的配置文件率拒。

  7. /root目錄
    根用戶的目錄崩泡,與此對應(yīng),普通用戶的目錄是/home下的某個(gè)子目錄猬膨。

  8. /usr目錄
    /usr目錄的內(nèi)容可以存在另一個(gè)分區(qū)中角撞,在系統(tǒng)啟動(dòng)后再掛接到根文件系統(tǒng)中的/usr目錄下。里面存放的是共享、只讀的程序和數(shù)據(jù)谒所,這表明/usr目錄下的內(nèi)容可以在多個(gè)主機(jī)間共享热康,這些主要也符合FHS標(biāo)準(zhǔn)的。/usr中的文件應(yīng)該是只讀的劣领,其他主機(jī)相關(guān)的姐军,可變的文件應(yīng)該保存在其他目錄下,比如/var尖淘。/usr目錄在嵌入式中可以精減奕锌。

  9. /var目錄
    與/usr目錄相反,/var目錄中存放可變的數(shù)據(jù)村生,比如spool目錄(mail,news)惊暴,log文件,臨時(shí)文件趁桃。

  10. /proc目錄
    這是一個(gè)空目錄缴守,常作為proc文件系統(tǒng)的掛接點(diǎn),proc文件系統(tǒng)是個(gè)虛擬的文件系統(tǒng)镇辉,它沒有實(shí)際的存儲(chǔ)設(shè)備屡穗,里面的目錄,文件都是由內(nèi)核臨時(shí)生成的忽肛,用來表示系統(tǒng)的運(yùn)行狀態(tài)村砂,也可以操作其中的文件控制系統(tǒng)。

  11. /mnt目錄
    用于臨時(shí)掛載某個(gè)文件系統(tǒng)的掛接點(diǎn)屹逛,通常是空目錄础废,也可以在里面創(chuàng)建一引起空的子目錄,比如/mnt/cdram /mnt/hda1 罕模。用來臨時(shí)掛載光盤评腺、硬盤。

  12. /tmp目錄
    用于存放臨時(shí)文件淑掌,通常是空目錄蒿讥,一些需要生成臨時(shí)文件的程序用到的/tmp目錄下,所以/tmp目錄必須存在并可以訪問抛腕。

</article>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芋绸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子担敌,更是在濱河造成了極大的恐慌摔敛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件全封,死亡現(xiàn)場離奇詭異马昙,居然都是意外死亡桃犬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門行楞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疫萤,“玉大人,你說我怎么就攤上這事敢伸。” “怎么了恒削?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵池颈,是天一觀的道長。 經(jīng)常有香客問我钓丰,道長躯砰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任携丁,我火速辦了婚禮琢歇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梦鉴。我一直安慰自己李茫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布肥橙。 她就那樣靜靜地躺著魄宏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪存筏。 梳的紋絲不亂的頭發(fā)上宠互,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音椭坚,去河邊找鬼予跌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛善茎,可吹牛的內(nèi)容都是我干的券册。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼垂涯,長吁一口氣:“原來是場噩夢啊……” “哼汁掠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起集币,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤考阱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鞠苟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乞榨,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秽之,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吃既。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考榨。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹦倚,靈堂內(nèi)的尸體忽然破棺而出河质,到底是詐尸還是另有隱情,我是刑警寧澤震叙,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布掀鹅,位于F島的核電站,受9級特大地震影響媒楼,放射性物質(zhì)發(fā)生泄漏乐尊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一划址、第九天 我趴在偏房一處隱蔽的房頂上張望扔嵌。 院中可真熱鬧,春花似錦夺颤、人聲如沸痢缎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牺弄。三九已至,卻和暖如春宜狐,著一層夾襖步出監(jiān)牢的瞬間势告,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工抚恒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咱台,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓俭驮,卻偏偏與公主長得像回溺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子混萝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351