淺談linux中的根文件系統(rootfs的原理和介紹)【轉】


轉自:https://www.shangmayuan.com/a/1abfb5ae43904c6792501bc8.html

這篇文章主要向大家介紹淺談linux中的根文件系統(rootfs的原理和介紹),主要內容包括基礎應用、實用技巧、原理機制等方面,希望對大家有所幫助。

linux中有一個讓不少初學者都不是特別清楚的概念,叫作“根文件系統”。我接觸linux前先后后也好幾年了,可是對這個問題,至今也不是特別的清楚,至少無法給出一個很全面很到位的解釋。因而,今天咱們就來理一理這個話題。node

1、先交代一下文件系統linux

在開始討論根文件系統這個話題以前,咱們必首先交代一下文件系統這個概念。畢竟,根文件系統只是文件系統中的一種比較特殊的形式而已。根據偉大的百度百科:web

文件系統是操做系統用於明確存儲設備(常見的是磁盤,也有基於NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操做系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操做和管理的軟件集合,對象及屬性。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶創建文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶再也不使用時撤銷文件等。shell

文件系統的重要性,我想你們都很清楚,不用多說了。這里有一句話,我以為很是精辟並且到位的點出了文件系統在linux中的重要性:數據結構

盡管內核是linux的核心,但文件倒是用戶與操做系統交互所采用的主要工具。這對linux來講尤為如此,這是由於在UNIX傳統中,它使用文件I/O機制管理硬件設備和數據文件。svg

2、什么是根文件系統工具

而后來解釋一下“根文件系統”這個名詞的基本概念。一樣引自百度百科的解釋:操作系統

根文件系統首先是內核啟動時所mount的第一個文件系統,內核代碼映像文件保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載以后從中把一些基本的初始化腳本和服務等加載到內存中去運行。rest

展開來細說就是,根文件系統首先是一種文件系統,該文件系統不只具備普通文件系統的存儲數據文件的功能,可是相對於普通的文件系統,它的特殊之處在於,它是內核啟動時所掛載(mount)的第一個文件系統,內核代碼的映像文件保存在根文件系統中,系統引導啟動程序會在根文件系統掛載以后從中把一些初始化腳本(如rcS,inittab)和服務加載到內存中去運行。咱們要明白文件系統和內核是徹底獨立的兩個部分。在嵌入式中移植的內核下載到開發板上,是沒有辦法真正的啟動Linux操做系統的,會出現沒法加載文件系統的錯誤。xml

3、根文件系統為何這么重要

根文件系統之因此在前面加一個”根“,說明它是加載其它文件系統的”根“,那么若是沒有這個根,其它的文件系統也就沒有辦法進行加載的。

根文件系統包含系統啟動時所必須的目錄和關鍵性的文件,以及使其余文件系統得以掛載(mount)所必要的文件。例如:

  1. init進程的應用程序必須運行在根文件系統上;
  2. 根文件系統提供了根目錄“/”;
  3. linux掛載分區時所依賴的信息存放於根文件系統/etc/fstab這個文件中;
  4. shell命令程序必須運行在根文件系統上,譬如ls、cd等命令;

總之:一套linux體系,只有內核自己是不能工做的,必需要rootfs(上的etc目錄下的配置文件、/bin /sbin等目錄下的shell命令,還有/lib目錄下的庫文件等···)相配合才能工做。

Linux啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。成功以后能夠自動或手動掛載其余的文件系統。所以,一個系統中能夠同時存在不一樣的文件系統。在 Linux 中將一個文件系統與一個存儲設備關聯起來的過程稱為掛載(mount)。使用 mount 命令將一個文件系統附着到當前文件系統層次結構中(根)。在執行掛裝時,要提供文件系統類型、文件系統和一個掛裝點。根文件系統被掛載到根目錄下“/”上后,在根目錄下就有根文件系統的各個目錄,文件:/bin /sbin /mnt等,再將其余分區掛接到/mnt目錄上,/mnt目錄下就有這個分區的各個目錄和文件。

4、如何在內核中掛載根文件系統

init/main.c->

 start_kernel()->vfs_caches_init(totalram_pages)–>

   mnt_init()–>

     /* sysfs用來記錄和展現linux驅動模型,sysfs先於rootfs掛載是為全面展現linux驅動模型作好准備 */
     /* mnt_init()調用sysfs_init()注冊並掛載sysfs文件系統,而后調用kobject_create_and_add()建立fs目錄 */
     sysfs_init();

     /* init_rootfs()注冊rootfs,而后調用init_mount_tree()掛載rootfs */
     init_rootfs();

     init_mount_tree();

一、sysfs文件系統目前尚未掛載到rootfs的某個掛載點上,后續init程序會把sysfs掛載到rootfs的sys掛載點上;

二、rootfs是基於內存的文件系統,全部操做都在內存中完成;也沒有實際的存儲設備,因此不須要設備驅動程序的參與。基於以上緣由,linux在啟動階段使用rootfs文件系統,當磁盤驅動程序和磁盤文件系統成功加載后,linux系統會將系統根目錄從rootfs切換到磁盤文件系統。

start_kernel
  vfs_caches_init
    mnt_init
      init_rootfs注冊rootfs文件系統
      init_mount_tree 掛載rootfs文件系統
        vfs_kern_mount
          mount_fs
            type->mount實際上是rootfs_mount
              mount_nodev
                fill_super 實際上是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);

在執行kernel_init以前,會創建roofs文件系統。

[1*]處設置了根目錄的名字為“/”;
[2*]處設置了vfsmount中的root目錄;
[3*]處設置了vfsmount中的超級塊;
[4*]處設置了vfsmount中的文件掛載點,指向了本身;
[5*]處設置了vfsmount中的父文件系統的vfsmount為本身;

5、根文件系統各個經常使用目錄簡介

正常來講,根文件系統至少包括如下目錄:

  1. /etc/:存儲重要的配置文件。
  2. /bin/:存儲經常使用且開機時必須用到的執行文件。
  3. /sbin/:存儲着開機過程當中所需的系統執行文件。
  4. /lib/:存儲/bin/及/sbin/的執行文件所需的連接庫,以及Linux的內核模塊。
  5. /dev/:存儲設備文件。

注:五大目錄必須存儲在根文件系統上,缺一不可。

6、順便說下linux文件系統的經常使用目錄

Linux文件系統中通常有以下幾個目錄:

    1. /bin目錄
      該目錄下存放全部用戶均可以使用的、基本的命令,這些命令在掛接其它文件系統以前就可使用,因此/bin目錄必須和根文件系統在同一個分區中。
      /bin目錄下經常使用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,咱們在利用Busybox制做根文件系統時,在生成的bin目錄下,能夠看到一些可執行的文件,也就是可用的一些命令。

    2. /sbin 目錄
      該目錄下存放系統命令,即只有管理員可以使用的命令,系統命令還能夠存放在/usr/sbin,/usr/local/sbin目錄下,/sbin目錄中存放的是基本的系統命令,它們用於啟動系統,修復系統等,與/bin目錄類似,在掛接其余文件系統以前就可使用/sbin,因此/sbin目錄必須和根文件系統在同一個分區中。
      /sbin目錄下經常使用的命令有:shutdown,reboot,fdisk,fsck等,本地用戶本身安裝的系統命令放在/usr/local/sbin目錄下。

    3. /dev目錄
      該目錄下存放的是設備文件,設備文件是Linux中特有的文件類型,在Linux系統下,以文件的方式訪問各類設備,即經過讀寫某個設備文件操做某個具體硬件。好比經過”dev/ttySAC0”文件能夠操做串口0,經過”/dev/mtdblock1”能夠訪問MTD設備的第2個分區。

    4. /etc目錄
      該目錄下存放着各類配置文件,對於PC上的Linux系統,/etc目錄下的文件和目錄很是多,這些目錄文件是可選的,它們依賴於系統中所擁有的應用程序,依賴於這些程序是否須要配置文件。在嵌入式系統中,這些內容能夠大為精減。

    5. /lib目錄
      該目錄下存放共享庫和可加載(驅動程序),共享庫用於啟動系統。運行根文件系統中的可執行程序,好比:/bin /sbin 目錄下的程序。

    6. /home目錄
      用戶目錄,它是可選的,對於每一個普通用戶,在/home目錄下都有一個以用戶名命名的子目錄,里面存放用戶相關的配置文件。

    7. /root目錄
      根用戶的目錄,與此對應,普通用戶的目錄是/home下的某個子目錄。

    8. /usr目錄
      /usr目錄的內容能夠存在另外一個分區中,在系統啟動后再掛接到根文件系統中的/usr目錄下。里面存放的是共享、只讀的程序和數據,這代表/usr目錄下的內容能夠在多個主機間共享,這些主要也符合FHS標准的。/usr中的文件應該是只讀的,其余主機相關的,可變的文件應該保存在其余目錄下,好比/var。/usr目錄在嵌入式中能夠精減。

    9. /var目錄
      與/usr目錄相反,/var目錄中存放可變的數據,好比spool目錄(mail,news),log文件,臨時文件。

    10. /proc目錄
      這是一個空目錄,常做為proc文件系統的掛接點,proc文件系統是個虛擬的文件系統,它沒有實際的存儲設備,里面的目錄,文件都是由內核臨時生成的,用來表示系統的運行狀態,也能夠操做其中的文件控制系統。

    11. /mnt目錄
      用於臨時掛載某個文件系統的掛接點,一般是空目錄,也能夠在里面建立一引發空的子目錄,好比/mnt/cdram /mnt/hda1 。用來臨時掛載光盤、硬盤。

    12. /tmp目錄
      用於存放臨時文件,一般是空目錄,一些須要生成臨時文件的程序用到的/tmp目錄下,因此/tmp目錄必須存在並能夠訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM