linux檔案系統基礎(轉)

post0發表於2007-08-09
linux檔案系統基礎(轉)[@more@]

linux檔案系統基礎

一 、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會將這些分屬不同分割槽的、單獨的檔案系統按一定的方式形成一個系統的總的目錄層次結構。一個作業系統的執行離不開對檔案的操作,因此必然要擁有並維護自己的檔案系統。

linux檔案系統使用索引節點來記錄檔案資訊,作用像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。(如果你非要設成自動掛載,你要確保每次開機時你的光碟機和軟碟機裡都要有盤,呵呵。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938992/,如需轉載,請註明出處,否則將追究法律責任。

相關文章