共計 4382 個字符,預計需要花費 11 分鐘才能閱讀完成。
這篇文章主要介紹“linux rootfs 指的是什么”,在日常操作中,相信很多人在 linux rootfs 指的是什么問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”linux rootfs 指的是什么”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
linux rootfs 是指 linux 中的根文件系統;根文件系統首先是內核啟動時所 mount 的第一個文件系統,內核代碼映像文件保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載之后從中把一些基本的初始化腳本和服務等加載到內存中去運行。
一、什么是文件系統
文件系統是操作系統用于明確存儲設備(常見的是磁盤,也有基于 NAND Flash 的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操作和管理的軟件集合,對象及屬性。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲并對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。
盡管內核是 linux 的核心,但文件卻是用戶與操作系統交互所采用的主要工具。這對 linux 來說尤其如此,這是因為在 UNIX 傳統中,它使用文件 I / O 機制管理硬件設備和數據文件。
二、什么是根文件系統
根文件系統首先是內核啟動時所 mount 的第一個文件系統,內核代碼映像文件保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載之后從中把一些基本的初始化腳本和服務等加載到內存中去運行。
三、根文件系統為什么這么重要
根文件系統之所以在前面加一個”根“,說明它是加載其它文件系統的”根“,那么如果沒有這個根,其它的文件系統也就沒有辦法進行加載的。
根文件系統包含系統啟動時所必須的目錄和關鍵性的文件,以及使其他文件系統得以掛載(mount)所必要的文件。例如:
init 進程的應用程序必須運行在根文件系統上;
根文件系統提供了根目錄“/”;
linux 掛載分區時所依賴的信息存放于根文件系統 /etc/fstab 這個文件中;
shell 命令程序必須運行在根文件系統上,譬如 ls、cd 等命令;
總之:一套 linux 體系,只有內核本身是不能工作的,必須要 rootfs(上的 etc 目錄下的配置文件、/bin /sbin 等目錄下的 shell 命令,還有 /lib 目錄下的庫文件等···)相配合才能工作。
Linux 啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。成功之后可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。在 Linux 中將一個文件系統與一個存儲設備關聯起來的過程稱為掛載(mount)。使用 mount 命令將一個文件系統附著到當前文件系統層次結構中(根)。在執行掛裝時,要提供文件系統類型、文件系統和一個掛裝點。根文件系統被掛載到根目錄下“/”上后,在根目錄下就有根文件系統的各個目錄,文件:/bin /sbin /mnt 等,再將其他分區掛接到 /mnt 目錄上,/mnt 目錄下就有這個分區的各個目錄和文件。
四、如何在內核中掛載根文件系統
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();
1、sysfs 文件系統目前還沒有掛載到 rootfs 的某個掛載點上,后續 init 程序會把 sysfs 掛載到 rootfs 的 sys 掛載點上;2、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 為自己;
五、根文件系統各個常用目錄簡介
正常來說,根文件系統至少包括以下目錄:
/etc/:存儲重要的配置文件。/bin/:存儲常用且開機時必須用到的執行文件。/sbin/:存儲著開機過程中所需的系統執行文件。/lib/:存儲 /bin/ 及 /sbin/ 的執行文件所需的鏈接庫,以及 Linux 的內核模塊。/dev/:存儲設備文件。
六、常用目錄
Linux 文件系統中一般有如下幾個目錄:
/bin 目錄
該目錄下存放所有用戶都可以使用的、基本的命令,這些命令在掛接其它文件系統之前就可以使用,所以 /bin 目錄必須和根文件系統在同一個分區中。
/bin 目錄下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test 等,我們在利用 Busybox 制作根文件系統時,在生成的 bin 目錄下,可以看到一些可執行的文件,也就是可用的一些命令。
/sbin 目錄
該目錄下存放系統命令,即只有管理員能夠使用的命令,系統命令還可以存放在 /usr/sbin,/usr/local/sbin 目錄下,/sbin 目錄中存放的是基本的系統命令,它們用于啟動系統,修復系統等,與 /bin 目錄相似,在掛接其他文件系統之前就可以使用 /sbin,所以 /sbin 目錄必須和根文件系統在同一個分區中。
/sbin 目錄下常用的命令有:shutdown,reboot,fdisk,fsck 等,本地用戶自己安裝的系統命令放在 /usr/local/sbin 目錄下。
/dev 目錄
該目錄下存放的是設備文件,設備文件是 Linux 中特有的文件類型,在 Linux 系統下,以文件的方式訪問各種設備,即通過讀寫某個設備文件操作某個具體硬件。比如通過 dev/ttySAC0 文件可以操作串口 0,通過 /dev/mtdblock1 可以訪問 MTD 設備的第 2 個分區。
/etc 目錄
該目錄下存放著各種配置文件,對于 PC 上的 Linux 系統,/etc 目錄下的文件和目錄非常多,這些目錄文件是可選的,它們依賴于系統中所擁有的應用程序,依賴于這些程序是否需要配置文件。在嵌入式系統中,這些內容可以大為精減。
/lib 目錄
該目錄下存放共享庫和可加載 (驅動程序),共享庫用于啟動系統。運行根文件系統中的可執行程序,比如:/bin /sbin 目錄下的程序。
/home 目錄
用戶目錄,它是可選的,對于每個普通用戶,在 /home 目錄下都有一個以用戶名命名的子目錄,里面存放用戶相關的配置文件。
/root 目錄
根用戶的目錄,與此對應,普通用戶的目錄是 /home 下的某個子目錄。
/usr 目錄
/usr 目錄的內容可以存在另一個分區中,在系統啟動后再掛接到根文件系統中的 /usr 目錄下。里面存放的是共享、只讀的程序和數據,這表明 /usr 目錄下的內容可以在多個主機間共享,這些主要也符合 FHS 標準的。/usr 中的文件應該是只讀的,其他主機相關的,可變的文件應該保存在其他目錄下,比如 /var。/usr 目錄在嵌入式中可以精減。
/var 目錄
與 /usr 目錄相反,/var 目錄中存放可變的數據,比如 spool 目錄 (mail,news),log 文件,臨時文件。
/proc 目錄
這是一個空目錄,常作為 proc 文件系統的掛接點,proc 文件系統是個虛擬的文件系統,它沒有實際的存儲設備,里面的目錄,文件都是由內核臨時生成的,用來表示系統的運行狀態,也可以操作其中的文件控制系統。
/mnt 目錄
用于臨時掛載某個文件系統的掛接點,通常是空目錄,也可以在里面創建一引起空的子目錄,比如 /mnt/cdram /mnt/hda1。用來臨時掛載光盤、硬盤。
/tmp 目錄
用于存放臨時文件,通常是空目錄,一些需要生成臨時文件的程序用到的 /tmp 目錄下,所以 /tmp 目錄必須存在并可以訪問。
到此,關于“linux rootfs 指的是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!