根文件系統首先是內核啟動時所mount的第一個文件系統,內核代碼映像文件保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載之後從中把一些基本的初始化腳本和服務等載入到內存中去運行。
linux啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。成功之後可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。
在Linux中,必須要有一個根文件系統的概念。根文件系統首先是一種文件系統,該文件系統不僅具有普通文件系統的存儲數據文件的功能,但是相對於普通的文件系統,它的特殊之處在於,它是內核啟動時所掛載(mount)的第一個文件系統,內核代碼的映像文件保存在根文件系統中,系統引導啟動程序會在根文件系統掛載之後從中把一些初始化腳本(如rcS,inittab)和服務載入到內存中去運行。
mount是Linux下的一個命令,它可以將分區掛接到Linux的一個文件夾下,從而將分區和該目錄聯系起來,因此我們只要訪問這個文件夾,就相當於訪問該分區了。 目前mount已經不僅僅局限於Linux了。在Windows系統下的應用也越來越廣了,多用在虛擬光碟機類軟體上,比如Clone CD,Daemon tool,WinMount等。
根文件系統在系統啟動中到底是什麼時候掛載的呢?先將/dev/ram0掛載,而後執行/linuxrc.等其執行完後。切換根目錄,再掛載具體的根文件系統.根文件系統執行完之後,也就是到了Start_kernel()函數的最後,執行init的進程,也就第一個用戶進程。對系統進行各種初始化的操作。
根文件系統之所以在前面加一個」根「,說明它是載入其它文件系統的」根「,既然是根的話,那麼如果沒有這個根,其它的文件系統也就沒有辦法進行載入的。它包含系統引導和使其他文件系統得以掛載(mount)所必要的文件。
2. 什麼是根文件系統
文件系統:File System => FS;
根文件系統:Root File System => RFS。
首先你考慮一點描述語句:根文件系統也是一種「文件系統」,可以認為是一種「特殊的」「文件系統」,為什麼是叫「特殊的」呢?因為這種「根文件系統」承載著某些「特殊的功能」(其實「文件系統」相同的話,所具備的功能都是一樣的),那就是「操作系統」可能需要通過某種「布局」來管理相關設備的,諸如軟盤設備、硬碟設備、虛擬磁碟設備等等,這里可能就是用了一種已被定義好了「數據結構」的「布局」,即「文件系統」,而出現的「根文件系統」,可能是用來擔當主要或重要角色。
形象點來說,Windows下的C盤分區是有一定文件系統的,如FAT32、NTFS,這當然也都是文件系統呀。在安裝Windows操作系統時,會要求你先「格式化」C盤[當然我們目前考慮操作系統是被安裝在C盤中],採用一種「文件系統」比如NTFS、FAT32等,這一步呀,就類似於安裝「根文件系統」,也就是說在C盤中的NTFS文件系統會被稱作是「根文件系統」,而在D盤等中的NTFS文件系統會被稱作是「文件系統」或你想加上前綴名稱也不是不可以,比如「普通文件系統」,而我們從名稱上來說的話,因為這里出現了一個字眼「根」,所以我們就有兩種名稱的叫法了,自然就是FS與RFS,所以這種名稱叫法就會讓人感覺很是「雲里霧里」,而後「不知所雲」的],這個「格式化」過程就是將C盤上的存儲空間按預先定義好的一種FS的「數據結構」去「初始化」這些磁碟,[這里假設MINIX FS也可被Windows用來「格式化」C盤呀]比如建立引導塊、建立超級塊、建立兩類點陣圖塊、建立i節點點陣圖塊、建立好數據區塊等)也就是說,這個磁碟分區必須已經按一定數據結構的方式把磁碟空間「組織」好,以便「某種系統」(OS或FS,好象是FS更准確吧)能「訪問」該分區,所以在 0.11內核中會有兩種區分:mount_root() 和 sys_mount(),分別指「掛載根文件系統」、「掛載文件系統」[這里我覺得不應該用一個詞:安裝!我所理解的意思是,「安裝」就是指把某種東西 「放」到另一種東西上面去,比如你要安裝某種軟體到C盤,這種軟體的安裝程序可能在D盤,這時你會啟動D盤上該軟體的安裝程序,然後安裝程序就會把軟體默認安裝到C盤上,所以這個過程會叫做「安裝」,安裝前C盤上沒有該軟體的任何信息,安裝後C盤上就會有該軟體的信息啦],所以呢,要使用 sys_mount()功能,某種設備(具體來說就是某一分區)必須已經被某種FS的格式「安裝」好,然後該設備才會被「掛載」(mount)到「一個地 方」去。
那我們就以MINIX FS和FAT FS來分析吧。
在0.11內核代碼中,從mount_root(void)中的注釋可知,該函數會被「系統調用函數」sys_setup()調用,而在系統開機初始化設置時函數sys_setup()會被調用。為什麼不會調用sys_mount()呢?那我們又何時使用sys_mount()函數呢?其實 sys_mount()函數也是「系統調用函數」。我們在linux系統中,當你在某個shell的命令行中輸入mount後回車,你會看到以下提示信 息:
mount: usage: mount dev dir
你大概應該清楚了,而這是「正確的提示信息」,因為我們用錯mount用法了(另外,在/bin目錄下,可以看到有mount這樣一個文件,mount應 該就是一個單獨的程序了吧:-),好多地方都說mount是shell內部命令,而我更可能會認為cd才是shell的內部命令之一)。
那我們從sys_mount()函數的注釋中可以知道,該函數是「安裝文件系統調用函數」(我個人覺得這句話不太好理解),而我知道函數的功能,所以我會這么理解:這個函數是一「系統調用函數」,其功能是「將一個『文件系統』即FS『掛載』到(現有『根文件系統』即RFS的)一個「目錄」上,即目錄文件的i節點。所以呢,這個就與「mount dev dir」這樣的提示信息對應起來了;另外,我們需要知道,dev表示的是某個設備上的一個分區,而dir表示的是某一個「現有的」文件系統中的「目錄文件」,注意一定是「現有的」,在這里就是我們說的「根文件系統」,所以,你要使用mount功能,就得有以下條件:
1、在一個現有「文件系統」(根文件系統RFS)下面
2、該RFS中已經有了一些設備文件的存在,比如 /dev 下面的 hd0,hd1,等等
3、2中的/dev其實就是由RFS來管理的
4、還需要有一個目錄存在,而該目錄也是在該RFS中的即由RFS來管理的
5、當然你要有實際的磁碟設備存在(/dev/hd0隻是表示一個「虛」的設備文件名而已)且該設備已被「FS」格式化好了
6、最後你就會用mount dev dir這樣的方式,將實際的磁碟分區「掛載」到dir中
假如,你有一個硬碟(假設大小是512MB),就只是一個分區,該分區中的FS是 FAT FS(假設unix可以直接訪問,大不了看成是與minix fs是一樣的,只是名稱不同而已,以下就是把它看成就是一個minix fs來分析的)。
所以當你啟動了「0.11系統」(這個說法比較簡化,意思就是你進入了sh命令行)後,其實RFS就已經被「自動」「掛載」好了(就是 mount_root()),這時,你需要在該「0.11系統」中訪問那個硬碟,假設硬體上你已經安裝好了硬碟了,然後你會在sh命令行中進行「安裝」過 程了,假如是:
mount /dev/hd0 /mnt/fatc
即將第一個硬碟的第一個分區(目前只有一個分區)「掛載」到「RFS」中的根目錄下的mnt目錄中的fatc目錄上。所以,你可以直接「進入」到 fatc目錄中去訪問該硬碟里的文件了。
成功了!掛載成功,大功告成!
因為你了解內核代碼,所以你應該知道mount一系列過程的,你要知道以下幾點:
1、/dev/hd0, /mnt/fatc都是RFS中的「文件」(統稱),前者是設備文件,後者是目錄文件。
[體現在i節點結構中,就是各自的inode->i_mode中會區分是「設備類型文件」還是「目錄類型文件」,且前者的 inode->zone[0]存有該設備的設備號(還有inode->i_dev也是設備號,但實際含義不一樣),後者的 inode->i_mount就被置位啦,注意因為這個i節點就是一個「被『安裝』/『掛載』好了FS的i節點]
2、/這是目錄,但這個是RFS的目錄,且是根目錄。
3、/mnt/fatc 「相當於」就是那個硬碟分區中FS的根目錄。但其實該硬碟中的根目錄也是/。
[假設當你去訪問那個分區「根」目錄(其實也是/,但你能直接進去嗎?)中的某個文件hello.c,時,你會在現有sh命令行中,cd /mnt/fatc回車後 ls hello* -l,然後你會發現有hello.c這個文件,其實你就應該需要知道RFS是怎麼「定位」尋找到該hello.c文件的,當中有一個重要的過程就是需要取 每一個文件的inode信息即iget()函數,該函數中發現某文件的inode->i_mount被置位時,就「特別小心」了,為什麼?因為該 inode表示被「掛載」了一個文件系統,所以RFS會「切換」到那個FS的根目錄中去(使用了ROOT_INO,super_block.s_dev這樣的參數),然後再在該FS中按正常的過程繼續尋找所需要的文件,所以你能找到]
「正常的過程」就是指:要麼從一個FS的根目錄中開始查找文件,要不從一個文件系統當前用戶進程的當前工作目錄中開始查找文件。
所以就有一個重要的說法(我是這么理解的):跨文件系統訪問文件。這一過程涉及面較廣,主要數據結構有:i節點、超級塊。
4、最後,當你不需要使用該分區或是你想把硬碟拿走,則你會使用 umount 功能啦,這就對應 sys_umount()這一「系統調用函數」,那你就要知道該函數做了些什麼事了。
最後,總的來說:
mount_root()掛載了一個MINI FS又被稱為是RFS。
然後你可以在該RFS中再掛載別的FS。RFS與系統「共存亡」,自動被「掛載」,自動被「卸載」。
所以,FAT等也可以是根文件系統,當然也是文件系統。
所以,當你在你電腦上安裝了多操作系統時,假設在C盤(FAT32 FS)被裝了 win98,在D盤(NTFS FS)被安裝了winxp,那麼,當你進入了win98時,你FAT32好象就是RFS,那麼NTFS就是FS了;當你進入了winxp時,NTFS好象就是RFS,那麼FAT32就是FS了。
(為什麼C盤是要FAT32呢,因為win98不支持ntfs fs,而你又是裝的win98)
3. 根文件系統的講解
Linux引導啟動時,默認使用的文件系統是根文件系統。其中一般都包括這樣一些子版目錄:
/etc/, /dev/, /usr/, /usr/bin/, /bin/, /var/等。
etc/目錄主要含有一些系權統配置文件;dev/含有設備特殊文件,用於使用文件操作語句操作設備;/usr/存放庫函數、手冊和其它一些文件。bin/存放執行程序;var/用於存放系統運行時可變的數據或者是日誌等信息。
存放文件系統的設備就是文件系統設備。比如,對於一般使用的windows 2000操作系統,硬碟C盤就是文件系統設備,而硬碟上按一定規則存放的文件就組成文件系統,windows 2000有NTFS或FAT32等文件系統。
4. 什麼是根文件系統
下面是從Undertanding the linux kernel 3rd摘錄的 12.4. Filesystem Handling Like every traditional Unix system, Linux makes use of a system 's root filesystem : it is the filesystem that is directly mounted by the kernel ring the booting phase and that holds the system initialization scripts and the most essential system programs. Other filesystems can be mountedeither by the initialization scripts or directly by the userson directories of already mounted filesystems. Being a tree of directories, every filesystem has its own root directory. The directory on which a filesystem is mounted is called the mount point. A mounted filesystem is a child of the mounted filesystem to which the mount point directory belongs. For instance, the /proc virtual filesystem is a child of the system 's root filesystem (and the system 's root filesystem is the parent of /proc). The root directory of a mounted filesystem hides the content of the mount point directory of the parent filesystem, as well as the whole subtree of the parent filesystem below the mount point.簡單的來說,我認為根文件系統就是一種目錄結構,那麼根文件系統和普通的文件系統有什麼區別呢?我認為根文件系統就是要包括Linux啟動時所 必須的目錄和關鍵性的文件,例如Linux啟動時都需要有init目錄下的相關文件,在Linux掛載分區時Linux一定會找/etc/fstab這個 掛載文件等,根文件系統中還包括了許多的應用程序bin目錄等,任何包括這些Linux系統啟動所必須的文件都可以成為根文件系統。 Linux支持多種文件系統類型,在嵌入式上常用的有:ROMFS,JFFS2,NFS,CRAMFS,YAFFS等等。在Linux系統中是通過mount命令來掛載不同的文件系統。在ARM Linux中常用的文件系統的配置:RAM Disk Driver + EXT2;MTD Driver + JFFS2/YAFFS;NFS;uclinux中常見的文件系統配置為:Blkmem Driver + ROMFS(支持 Nor Flash);RAM Disk Driver + ROMFS(不支持FLASH);MTD Driver + JFFS2/YAFFS(支持多種flash); 建立根文件系統的步驟:1.創建根文件系統目錄。2.創建各種必要的系統文件目錄。3.創建設備文件。4.建立啟動相關的配置文件。這里重點要建立啟動相關的配置文件(Linux-2.6):創建/etc/inittab::sysinit:/etc/init.d/rcS::respawn:/sbin/getty 115200 s3c2410_serial0::restart:/sbin/init::shutdown:/bin/umount -a -r創建/etc/init.d文件#!/bin/shmount -a/etc/init.d/udev startmkdir /dev/ptsmount -t devpts devpts /dev/ptshwclock --hctosysifup eth0ifup lo/etc/init.d/sshd startthttpd -C /etc/thttpd.conf建立開發板上的文件系統配置文件/etc/fstabproc /proc proc defaults 0 0sys /sys sysfs defaults 0 0
5. uboot、內核、操作系統、根文件系統他們之間到底是什麼關系,求大神指點!!
uboot是個引導啟動程序。BIOS自檢完成後就把電腦控制權交給uboot,由uboot來載入並引導操作系回統運行。
內核就是最最答最核心的那部份。操作系統內核就是操作系統的最最最最核心的那些程序。新安裝的操作系統中,一些自帶的小工具啊,小游戲啊,甚至連鍵盤滑鼠控制功能,這些都不屬於內核。內核是不包括硬體驅動程序的。
操作系統就是控制計算機硬體的軟體系統。它與內核的區別是它包含硬體驅動和一些基本的實用功能。
根文件系統這個名詞很少出現在windows中。在計算機存儲中,目錄結構都是以樹形結構表示的,根就是指這棵樹的根部。其他所有目錄都是在這個「根」上面逐級分配而來。「根文件系統」因為你加了「系統」二字,所以可以解釋為是指「整棵樹」,整個「樹形結構的文件系統」
它們之間的關系是:BIOS自檢---uboot引導----載入內核----操作系統啟動---啟動完成,系統待機。這幾個步驟所需要用到的文件與程序什麼的全部存貯在文件系統中。在這幾個名詞來說,文件系統可以獨立存在,但其他幾樣則無法脫離文件系統而存在。
6. Linux根文件系統詳解
Linux的文件和目錄組織是一個單根的倒置的樹狀結構,文件系統從根目錄下開始,用"/"表示,我們也可稱為根文件系統(rootfs),這樣的根文件系統,有以下特性:
(1) 文件名稱區分大小寫
(2)滾余 以.開頭的文件為隱藏文件
(3) 以/作為路徑分隔符
在Linux各大發行版中它們的文件和目錄組織其實是遵循FHS(Filesystem Hierarchy Standard)標准,FHS定義了系統中每個目錄的用途。FHS有2層規范,第一層里定義了/下的各個目錄應該要放什麼數據。第2層則是針對/usr及/var這2個目錄的子目錄來定義。最新版本FHS2.3,大致內容如下表所示大銷滾:
各大發行版除了遵循基本的LFS之外,也可以追加自己的目錄結構,形成自己的風格;例如:在Ubuntu中網卡配置文件是存放在/etc/network/目錄下,CentOS是在/etc/sysconfig/network-scripts/目錄下。CentOS系統一些重要的目錄及其基本用斗和途如下圖所示:
CentOS7之後bin,lib,lib64,sbin合並到/usr/bin,/usr/lib/,/usr/lib64,/usr/sbin里了。