轉載:linux 根目錄的建立
1.2 根目錄的建立
大家一般都會知道根目錄的產生方式,就是系統使用mount指令,將系統所在的分區掛載到【/】目錄中,這樣便完成了所謂的根目錄。但你是否想過, 雖然看起來合理卻有點詭異,因為根目錄既然是Linux的"根",那沒有根,哪來的mount指令?系統怎么可以使用呢?這正是要在這一節解釋的部分。
講到如何產生根目錄,必須先知道根目錄產生之前的一些基本系統運行動作(如圖1-3所示),在開機管理程序啟動操作系統,在加載kernel之后 (也就是當用戶在開機畫面選擇某系統選項按【Enter】后),kernel會自行在內存中建立一塊叫做rootfs的區域供本身使用,而里面的功能都是 kernel本身所提供的,這也就是編譯kernel時所賦予的能力,不過大部分kernel的能力都是在安裝完操作系統后就已經定義好了的,除非是自行 重新將kernel編譯過。
而這一段kernel執行的過程,並不是產生根目錄【/】的階段,也就是說,在kernel啟動階段,並沒有使用到根目錄,而根目錄產生出來的時間 點,是在kernel加載完成后,下一個initrd(Initial ramdisk)加載模塊期間。
這其實是因為在尚未加載initrd之前,如果操作系統是在網絡或SCSI接口上,必須要等到相關模塊加載后才可以使用(除非是手動將該模塊嵌入到 kernel中),在這種情況下,如果kernel不支持該存儲設備或功能(像SAN),如何能辨認及使用正確的根目錄?所以,必須等到initrd加載 正確的模塊,並且正確地辨認出存儲設備的硬件之后,才能將系統分割區准確地掛載到根目錄上,產生出一般使用的【/】根目錄。
從這一段啟動的信息(如圖1-4所示)可看出,基本上經歷了以下3個步驟,根目錄被產生出來,不過不同廠商所推出的Linux,有可能會有不一樣的 動作,但概念是差不多的,圖1-4所圈選的部分,是用戶可以通過啟動信息所看到的建立基本目錄的三大步驟。

建立根目錄所需的設備文件。
先將該設備文件所指的位置(分割區)掛載到【/sysroot】目錄下。
切換目錄到根目錄下。

摘自:《Linux系統架構與目錄解析》作者: 邱世華
文件結構是文件存放在磁盤等存貯設備上的組織方法。主要體現在對文件和目錄的組織上。
目錄提供了管理文件的一個方便而有效的途徑。
Linux使用標准的目錄結構,在安裝的時候,安裝程序就已經為用戶創建了文件系統和完整而固定的目錄組成形式,並指定了每個目錄的作用和其中的文件類型。
/根目錄
┃
┏━━┳━━━┳━━━┳━━━╋━━━┳━━━┳━━━┳━━━┓
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
bin home dev etc lib sbin tmp usr var
┃ ┃
┏━┻━┓ ┏━━┳━━┳━━┳━┻━┳━━┓
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
rc.d cron.d X11R6 src lib local man bin
┃
┏━━━┳━━┳━┻━┳━━━┓
┃ ┃ ┃ ┃ ┃
init.d rc0.d rc1.d rc2.d …… linux bin lib src
Linux采用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。微軟的DOS和windows也是采用樹型結構,但是在DOS和 windows中這樣的樹型結構的根是磁盤分區的盤符,有幾個分區就有幾個樹型結構,他們之間的關系是並列的。但是在linux中,無論操作系統管理幾個磁盤分區,這樣的目錄樹只有一個。從結構上講,各個磁盤分區上的樹型目錄不一定是並列的。
如果這樣講不好理解的話,我來舉個例子:
有一塊硬盤,分成了4個分區,分別是/;/boot;/usr和windows下的fat
對於/和/boot或者/和/usr,它們是從屬關系;對於/boot和/usr,它們是並列關系。
如果我把windows下的fat分區掛載到/mnt/winc下,(掛載??哦,別急,呵呵,一會就講,一會就講。)那么對於/mnt/winc和/usr或/mnt/winc和/boot來說,它們是從屬於目錄樹上沒有任何關系的兩個分支。
因為linux是一個多用戶系統,制定一個固定的目錄規划有助於對系統文件和不同的用戶文件進行統一管理。但就是這一點讓很多從windows轉到linux的初學者感到頭疼。下面列出了linux下一些主要目錄的功用。
/bin 二進制可執行命令
/dev 設備特殊文件
/etc 系統管理和配置文件
/etc/rc.d 啟動的配置文件和腳本
/home 用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示
/lib 標准程序設計庫,又叫動態鏈接共享庫,作用類似windows里的.dll文件
/sbin 系統管理命令,這里存放的是系統管理員使用的管理程序
/tmp 公用的臨時文件存儲點
/root 系統管理員的主目錄(呵呵,特權階級)
/mnt 系統提供這個目錄是讓用戶臨時掛載其他的文件系統。
/lost+found 這個目錄平時是空的,系統非正常關機而留下“無家可歸”的文件(windows下叫什么.chk)就在這里
/proc 虛擬的目錄,是系統內存的映射。可直接訪問這個目錄來獲取系統信 息。
/var 某些大文件的溢出區,比方說各種服務的日志文件
/usr 最龐大的目錄,要用到的應用程序和文件幾乎都在這個目錄。其中包 含:
/usr/X11R6 存放X window的目錄
/usr/bin 眾多的應用程序
/usr/sbin 超級用戶的一些管理程序
/usr/doc linux文檔
/usr/include linux下開發和編譯應用程序所需要的頭文件
/usr/lib 常用的動態鏈接庫和軟件包的配置文件
/usr/man 幫助文檔
/usr/src 源代碼,linux內核的源代碼就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的庫
二 、linux文件系統
文件系統指文件存在的物理空間,linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。linux會將這些分屬不同分區的、單獨的文件系統按一定的方式形成一個系統的總的目錄層次結構。一個操作系統的運行離不開對文件的操作,因此必然要擁有並維護自己的文件系統。
Llinux文件系統使用索引節點來記錄文件信息,作用像windows的文件分配表。
索引節點是一個結構,它包含了一個文件的長度、創建及修改時間、權限、所屬關系、磁盤中的位置等信息。一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一一個元素對應。系統給每個索引節點分配了一個號碼,也就是該節點在數組中的索引號,稱為索引節點號。
linux文件系統將文件索引節點號和文件名同時保存在目錄中。所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。
對於一個文件來說有唯一的索引節點號與之對應,對於一個索引節點號,卻可以有多個文件名與之對應。因此,在磁盤上的同一個文件可以通過不同的路徑去訪問它。
可以用ln命令對一個已經存在的文件再建立一個新的連接,而不復制文件的內容。連接有軟連接和硬連接之分,軟連接又叫符號連接。它們各自的特點是:
硬連接:原文件名和連接文件名都指向相同的物理地址。
目錄不能有硬連接;硬連接不能跨越文件系統(不能跨越不同的分區)
文件在磁盤中只有一個拷貝,節省硬盤空間;
由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此可以防止不必要的誤刪除。
符號連接:用ln -s命令建立文件的符號連接符號連接是linux特殊文件的一種,作為一個文件,它的數據是它所連接的文件的路徑名。類似windows下的快捷方式。
可以刪除原有的文件而保存連接文件,沒有防止誤刪除功能。
這一段的的內容過於抽象,又是節點又是數組的,我已經盡量通俗再通俗了,又不好加例子作演示。大家如果還是雲里霧里的話,我也沒有什么辦法了,只有先記住,日后在實際應用中慢慢體會、理解了。這也是我學習的一個方法吧。
三 、掛載文件系統
由上一節知道,linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。linux會將這些分屬不同分區的、單獨的文件系統按一定的方式形成一個系統的總的目錄層次結構。這里所說的“按一定方式”就是指的掛載。
將一個文件系統的頂層目錄掛到另一個文件系統的子目錄上,使它們成為一個整體,稱為掛載。把該子目錄稱為掛載點。
舉個例子吧:
根分區:
/根目錄
┃
┏━━━━┳━━━━━┳━━━━━┳━━━━━╋━━━━━┳━━━━━┳━━━━━┳━━━━━┓
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
bin home dev etc lib sbin tmp usr var
┃
┏━┻━┓
┃ ┃
rc.d cron.d
┃
┏━━━┳━━━┳━┻━┳━━━━┓
┃ ┃ ┃ ┃ ┃
init.d rc0.d rc1.d rc2.d ……
/usr分區 :
usr
┃
┏━━━━┳━━━╋━━━┳━━━┳━━━┓
┃ ┃ ┃ ┃ ┃ ┃
X11R6 src lib local man bin
┃ ┃
┃ ┏━━━╋━━━┓
┃ ┃ ┃ ┃
linux bin lib src
掛載之后就形成了文章開始時的那個圖。像不像掛上去的?
注意:1、掛載點必須是一個目錄。
2、一個分區掛載在一個已存在的目錄上,這個目錄可以不為空,但掛載后這個目錄下以前的內容將不可用。
對於其他操作系統建立的文件系統的掛載也是這樣。但是需要理解的是:光盤、軟盤、其他操作系統使用的文件系統的格式與linux使用的文件系統格式是不一樣的。光盤是ISO9660;軟盤是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、 NTFS。掛載前要了解linux是否支持所要掛載的文件系統格式。
掛載時使用mount命令:
格式:mount [-參數] [設備名稱] [掛載點]
其中常用的參數有
-t 指定設備的文件系統類型,常見的有:
minix linux最早使用的文件系統
ext2 linux目前常用的文件系統
msdos MS-DOS的fat,就是fat16
vfat windows98常用的fat32
nfs 網絡文件系統
iso9660 CD-ROM光盤標准文件系統
ntfs windows NT 2000的文件系統
hpfs OS/2文件系統
auto 自動檢測文件系統
-o 指定掛載文件系統時的選項。有些也可用在/etc/fstab中。常用的 有
codepage=XXX 代碼頁
iocharset=XXX 字符集
ro 以只讀方式掛載
rw 以讀寫方式掛載
nouser 使一般用戶無法掛載
user 可以讓一般用戶掛載設備
提醒一下,mount命令沒有建立掛載點的功能,因此你應該確保執行mount命令時,掛載點已經存在。(不懂?說白了點就是你要把文件系統掛載到哪,首先要先建上個目錄。這樣OK?)
例子:windows98裝在hda1分區,同時計算機上還有軟盤和光盤需要掛載。
# mk /mnt/winc
# mk /mnt/floppy
# mk /mnt/cdrom
# mount -t vfat /dev/hda1 /mnt/winc
# mount -t msdos /dev/fd0 /mnt/floppy
# mount -t iso9660 /dev/cdrom /mnt/cdrom
現在就可以進入/mnt/winc等目錄讀寫這些文件系統了。
要保證最后兩行的命令不出錯,要確保軟驅和光驅里有盤。(要是硬盤的磁盤片也可以經常隨時更換的話,我想就不會犯這樣的錯誤了 :-> )
如果你的windows98目錄里有中文文件名,使用上面的命令掛載后,顯示的是一堆亂碼。這就要用到 -o 參數里的codepage iocharset選項。codepage指定文件系統的代碼頁,簡體中文中文代碼是936;iocharset指定字符集,簡體中文一般用cp936或 gb2312。
當掛載的文件系統linux不支持時,mount一定報錯,如windows2000的ntfs文件系統。可以重新編譯linux內核以獲得對該文件系統的支持。關於重新編譯linux內核,就不在這里說了。
四 、自動掛載
每次開機訪問windows分區都要運行mount命令顯然太煩瑣,為什么訪問其他的linux分區不用使用mount命令呢?
其實,每次開機時,linux自動將需要掛載的linux分區掛載上了。那么我們是不是可以設定讓linux在啟動的時候也掛載我們希望掛載的分區,如windows分區,以實現文件系統的自動掛載呢?
這是完全可以的。在/etc目錄下有個fstab文件,它里面列出了linux開機時自動掛載的文件系統的列表。我的/etc/fstab文件如下:
/dev/hda2 / ext3 defaults 1 1
/dev/hda1 /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda3 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0
在/etc/fstab文件里,第一列是掛載的文件系統的設備名,第二列是掛載點,第三列是掛載的文件系統類型,第四列是掛載的選項,選項間用逗號分隔。第五六列不知道是什么意思,還望高手指點。
在最后兩行是我手工添加的windows下的C;D盤,加了codepage=936和iocharset=cp936參數以支持中文文件名。參數defaults實際上包含了一組默認參數:
rw 以可讀寫模式掛載
suid 開啟用戶ID和群組ID設置位
dev 可解讀文件系統上的字符或區塊設備
exec 可執行二進制文件
auto 自動掛載
nouser 使一般用戶無法掛載
async 以非同步方式執行文件系統的輸入輸出操作
大家可以看到在這個列表里,光驅和軟驅是不自動掛載的,參數設置為noauto。(如果你非要設成自動掛載,你要確保每次開機時你的光驅和軟驅里都要有盤,呵呵。)
本文來自ChinaUnix博客,如果查看原文請點: http://blog.chinaunix.net/u/21990/showart_267948.html

根據以上原因 ,FHS認為根目錄(/)下應該包含如下子目錄:
目錄 | 應放置檔案內容 |
/bin | 系統有很多放置執行檔的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式[quest-?]下還能夠被操作的指令。在/bin底下的指令可以被root與一般帳號所使用,主要有:cat, chmod(修改權限), chown, date, mv, mkdir, cp, bash等等常用的指令。 |
/boot | 主要放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。 Linux kernel常用的檔名為:vmlinuz,如果使用的是grub這個開機管理程式,則還會存在/boot/grub/這個目錄! |
/dev | 在Linux系統上,任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中。 只要通過存取這個目錄下的某個檔案,就等於存取某個裝置。比要重要的檔案有/dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等 |
/etc | 系統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、各種服務的啟始檔等等。 一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,但是只有root有權力修改。FHS建議不要放置可執行檔(binary)在這個目錄中。 比較重要的檔案有: /etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目錄有:
|
/home | 這是系統預設的使用者家目錄(home directory)。 在你新增一個一般使用者帳號時,預設的使用者家目錄都會規范到這里來。比較重要的是,家目錄有兩種代號: ~ :代表當前使用者的家目錄,而 ~guest:則代表用戶名為guest的家目錄! |
/lib | 系統的函式庫非常的多,而/lib放置的則是在開機時會用到的函式庫,以及在/bin或/sbin底下的指令會呼叫的函式庫而已 。 什么是函式庫呢?妳可以將他想成是『外掛』,某些指令必須要有這些『外掛』才能夠順利完成程式的執行之意。 尤其重要的是/lib/modules/這個目錄,因為該目錄會放置核心相關的模組(驅動程式)喔! |
/media | media是『媒體』的英文,顧名思義,這個/media底下放置的就是可移除的裝置啦! 包括軟碟、光碟、DVD等等裝置都暫時掛載於此。 常見的檔名有:/media/floppy, /media/cdrom等等。 |
/mnt | 如果妳想要暫時掛載某些額外的裝置,一般建議妳可以放置到這個目錄中。在古早時候,這個目錄的用途與/media相同啦! 只是有了/media之后,這個目錄就用來暫時掛載用了。 |
/opt | 這個是給第三方協力軟體放置的目錄 。 什么是第三方協力軟體啊?舉例來說,KDE這個桌面管理系統是一個獨立的計畫,不過他可以安裝到Linux系統中,因此KDE的軟體就建議放置到此目錄下了。 另外,如果妳想要自行安裝額外的軟體(非原本的distribution提供的),那么也能夠將你的軟體安裝到這里來。不過,以前的Linux系統中,我們還是習慣放置在/usr/local目錄下! |
/root | 系統管理員(root)的家目錄。 之所以放在這里,是因為如果進入單人維護模式而僅掛載根目錄時,該目錄就能夠擁有root的家目錄,所以我們會希望root的家目錄與根目錄放置在同一個分區中。 |
/sbin | Linux有非常多指令是用來設定系統環境的,這些指令只有root才能夠利用來『設定』系統,其他使用者最多只能用來『查詢』而已。放在/sbin底下的為開機過程中所需要的,里面包括了開機、修復、還原系統所需要的指令。至於某些伺服器軟體程式,一般則放置到/usr/sbin/當中。至於本機自行安裝的軟體所產生的系統執行檔(system binary),則放置到/usr/local/sbin/當中了。常見的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。 |
/srv | srv可以視為『service』的縮寫,是一些網路服務啟動之后,這些服務所需要取用的資料目錄。 常見的服務例如WWW, FTP等等。 舉例來說,WWW伺服器需要的網頁資料就可以放置在/srv/www/里面。呵呵,看來平時我們編寫的代碼應該放到這里了。 |
/tmp | 這是讓一般使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都能夠存取的,所以你需要定期的清理一下。當然,重要資料不可放置在此目錄啊! 因為FHS甚至建議在開機時,應該要將/tmp下的資料都刪除! |
事實上FHS針對根目錄所定義的標准就僅限於上表,不過仍舊有些目錄也需要我們了解一下,具體如下 :
目錄 | 應放置文件內容 |
/lost+found | 這個目錄是使用標准的ext2/ext3檔案系統格式才會產生的一個目錄,目的在於當檔案系統發生錯誤時,將一些遺失的片段放置到這個目錄下。 這個目錄通常會在分割槽的最頂層存在,例如你加裝一個硬盤於/disk中,那在這個系統下就會自動產生一個這樣的目錄『/disk/lost+found』 |
/proc | 這個目錄本身是一個『虛擬文件系統(virtual filesystem)』喔! 他放置的資料都是在內存當中,例如系統核心、行程資訊(process)(是進程嗎?)、周邊裝置的狀態及網絡狀態等等。因為這個目錄下的資料都是在記憶體(內存)當中,所以本身不占任何硬盤空間!比較重要的檔案(目錄)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虛擬內存嗎[guest]? |
/sys | 這個目錄其實跟/proc非常類似,也是一個虛擬的檔案系統,主要也是記錄與核心相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。 這個目錄同樣不占硬盤容量! |
除了這些目錄的內容之外,另外要注意的是,因為根目錄與開機有關,開機過程中僅有根目錄會被掛載,其他分區則是在開機完成之后才會持續的進行掛載的行為。 因此根目錄下與開機過程有關的目錄,就不能夠與根目錄放到不同的分區去(在linux下目錄和分區是完全區分的,windows下有時會混淆,例如“D盤”可以說是個目錄也是個分區,要想搞清楚,看看Windows和Linux在目錄上的區別吧,很不錯啊,我寫的

- /etc:設定檔
- /bin:重要執行檔
- /dev:所需要的裝置檔案
- /lib:執行檔所需的函式庫與核心所需的模組
- /sbin:重要的系統執行檔
這五個目錄千萬不可與根目錄分開在不同的分區!
PS:
竟然沒有/boot [quest-?],這么說boot應該更早被訪問嘍
在類Unix的系統(如FreeBSD和Linux)里,有一個重要的概念:一切設備皆是文件。怎么理解呢,就是說,在系統的角度看來,所有的外部設備都是一個個不同的文件,都能以文件調用的方式去使用對應的設備。在系統安裝的時候,必須要在硬盤上划出一塊空間,這塊特殊的空間就叫作根(root), 是一切文件的出發點,在系統路徑中表示為“/”,然后你也可以划分其他子路徑為區如存放系統可執行文件的/usr, /bin 存放類庫和程序配置文件的/etc, /lib 存入設備目錄的/dev,存放臨時文件的/tmp,存放用戶文件的/home和管理員的/root等分區。如果你不去划分這些分區,系統會自動幫你分配