Linux根文件系统学习总结
一、什么是根文件系統
根文件系統首先是內核啟動時所mount的第一個文件系統,內核代碼映像文件保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載之后從中把一些基本的初始化腳本和服務等加載到內存中去運行。
它是內核啟動時所掛載(mount)的第一個文件系統,內核代碼的映像文件保存在根文件系統中,系統引導啟動程序會在根文件系統掛載之后從中把一些初始化腳本(如rcS,inittab)和服務加載到內存中去運行。我們要明白文件系統和內核是完全獨立的兩個部分。
二、根文件系統作用
根文件系統之所以在前面加一個”根“,說明它是加載其它文件系統的”根“,那么如果沒有這個根,其它的文件系統也就沒有辦法進行加載的。
根文件系統包含系統啟動時所必須的目錄和關鍵性的文件,以及使其他文件系統得以掛載(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文件系統。
四、根文件系統各個常用目錄簡介
正常來說,根文件系統至少包括以下目錄:
/etc/:存儲重要的配置文件。
/bin/:存儲常用且開機時必須用到的執行文件。
/sbin/:存儲著開機過程中所需的系統執行文件。
/lib/:存儲/bin/及/sbin/的執行文件所需的鏈接庫,以及Linux的內核模塊。
/dev/:存儲設備文件。
注:五大目錄必須存儲在根文件系統上,缺一不可。
總結
以上是生活随笔為你收集整理的Linux根文件系统学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux新建用户图解
- 下一篇: Linux文件查看命令图解