linux rootfs是指linux中的根檔案系統;根檔案系統首先是核心啟動時所mount的第一個檔案系統,核心程式碼映像檔保存在根檔案系統中,而係統引導啟動程式會在根檔案系統掛載之後從中把一些基本的初始化腳本和服務等載入到記憶體中去運行。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
linux rootfs是什麼?
linux中的根檔案系統(rootfs的原理與介紹)
一、什麼是檔案系統
檔案系統是作業系統用於明確儲存設備(常見的是磁碟,也有基於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影片教學》
以上是linux rootfs是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!