九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

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

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

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

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

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

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

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

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

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

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

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

根文件系統(tǒng)之所以在前面加一個”根“,說明它是加載其它文件系統(tǒng)的”根“,那么如果沒有這個根,其它的文件系統(tǒng)也就沒有辦法進行加載的。

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

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

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

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

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

init/main.c->

 start_kernel()->vfs_caches_init(totalram_pages)–>

   mnt_init()–>

     /* sysfs用來記錄和展示linux驅(qū)動模型,sysfs先于rootfs掛載是為全面展示linux驅(qū)動模型做好準備 */
     /* 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的某個掛載點上,后續(xù)init程序會把sysfs掛載到rootfs的sys掛載點上;

2、rootfs是基于內(nèi)存的文件系統(tǒng),所有操作都在內(nèi)存中完成;也沒有實際的存儲設備,所以不需要設備驅(qū)動程序的參與?;谝陨显颍琹inux在啟動階段使用rootfs文件系統(tǒng),當磁盤驅(qū)動程序和磁盤文件系統(tǒng)成功加載后,linux系統(tǒng)會將系統(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其實是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);

在執(zhí)行kernel_init之前,會建立roofs文件系統(tǒng)。

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

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

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

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

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

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

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

  1. /bin目錄
    該目錄下存放所有用戶都可以使用的、基本的命令,這些命令在掛接其它文件系統(tǒng)之前就可以使用,所以/bin目錄必須和根文件系統(tǒng)在同一個分區(qū)中。
    /bin目錄下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,我們在利用Busybox制作根文件系統(tǒng)時,在生成的bin目錄下,可以看到一些可執(zhí)行的文件,也就是可用的一些命令。

  2. /sbin 目錄
    該目錄下存放系統(tǒng)命令,即只有管理員能夠使用的命令,系統(tǒng)命令還可以存放在/usr/sbin,/usr/local/sbin目錄下,/sbin目錄中存放的是基本的系統(tǒng)命令,它們用于啟動系統(tǒng),修復系統(tǒng)等,與/bin目錄相似,在掛接其他文件系統(tǒng)之前就可以使用/sbin,所以/sbin目錄必須和根文件系統(tǒng)在同一個分區(qū)中。
    /sbin目錄下常用的命令有:shutdown,reboot,fdisk,fsck等,本地用戶自己安裝的系統(tǒng)命令放在/usr/local/sbin目錄下。

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

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

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

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

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

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

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

  10. /proc目錄
    這是一個空目錄,常作為proc文件系統(tǒng)的掛接點,proc文件系統(tǒng)是個虛擬的文件系統(tǒng),它沒有實際的存儲設備,里面的目錄,文件都是由內(nèi)核臨時生成的,用來表示系統(tǒng)的運行狀態(tài),也可以操作其中的文件控制系統(tǒng)。

  11. /mnt目錄
    用于臨時掛載某個文件系統(tǒng)的掛接點,通常是空目錄,也可以在里面創(chuàng)建一引起空的子目錄,比如/mnt/cdram /mnt/hda1 。用來臨時掛載光盤、硬盤。

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

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
linux文件系統(tǒng)初始化過程(2)
解析 Linux 中的 VFS 文件系統(tǒng)機制
嵌入式開發(fā)實戰(zhàn)5——LINUX的根文件系統(tǒng)之一基本環(huán)境的搭建和BUSYBOX編譯
Linux內(nèi)核移植和yaffs2根文件系統(tǒng)制作V1.2(6)
Linux文件目錄筆記
Linux 內(nèi)核移植和根文件系統(tǒng)制作
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服