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
採用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。微軟的DOSwindows也是採用樹型結構,但是在DOS windows中這樣的樹型結構的根是磁盤分區的盤符,有幾個分區就有幾個樹型結構,他們之間的關係是並列的。但是在linux中,無論操作系統管理幾個 磁盤分區,這樣的目錄樹只有一個。從結構上講,各個磁盤分區上的樹型目錄不一定是並列的。
如果這樣講不好理解的話,我來舉個例子:

有一塊硬盤,分成了4個分區,分別是//boot/usrwindows下的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;軟盤是fat16ext2windows NTfat16NTFSwindows98fat16fat32windows2000windowsXPfat16fat32 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指定文件系統的代碼頁,簡體中文中文代碼是936iocharset指定字符集,簡體中文一般用cp936 gb2312


當掛載的文件系統linux不支持時,mount一定報錯,如windows2000ntfs文件系統。可以重新編譯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下的CD盤,加了codepage=936iocharset=cp936參數以支持中文文件名。參數defaults實際上包含了一組默認參數:

rw
以可讀寫模式掛載
suid
開啓用戶ID和羣組ID設置位
dev
可解讀文件系統上的字符或區塊設備
exec
可執行二進制文件
auto
自動掛載
nouser
使一般用戶無法掛載
async
以非同步方式執行文件系統的輸入輸出操作

大家可以看到在這個列表裏,光驅和軟驅是不自動掛載的,參數設置爲noauto。(如果你非要設成自動掛載,你要確保每次開機時你的光驅和軟驅裏都要有盤,呵呵。)

 

Linux開機程序內幕

由於操作系統正在變得越來越複雜,所以開機引導和 關機下電的過程也越來越智能化。從簡單的DOS系統轉移到Windows NT系統,人們已經親身感受到了這些變化——這已不僅僅是核心操作系統的啓動引導和關閉了,還包括必須要同時啓動或者關閉相當數量的服務項目。類似於 Windows NTLinux系統啓動過程需要打開的服務項目也是數量極大的。

這裏,我們假設大家已經熟悉其它操作系統的引導過程,瞭解硬件的自檢引導步驟,就只從Linux操作系統的引導加載程序(對個人電腦而言通常是LILO)開始,介紹Linux開機引導的步驟。

加載內核

LILO
啓動之後,如果你選擇了Linux作爲準備引導的操作系統,第一個被加載的東西就是內核。請記住此時的計算機內存中還不存在任何操作系統,PC (因爲它們天然的設計缺陷)也還沒有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個兆字節之內。爲了實現這個目的,內核是被 壓縮了的。這個文件的頭部包含着必要的代碼,先設置CPU進入安全模式(以此解除內存限制),再對內核的剩餘部分進行解壓縮。

執行內核

內核在內存中解壓縮之後,就可以開始運行了。此時的內核只知道它本身內建的各種功能,也就是說被編譯爲模塊的內核部分還不能使用。最基本的是,內核必須有 足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啓動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始 化。從這裏開始,內核就能夠掛裝根文件系統(這個過程類似於Windows識別並存取C盤的過程)。內核掛裝了根文件系統之後,將啓動並運行一個叫做 init的程序。

注意:在這裏我們故意略去了Linux內核啓動的許多細節,這些細節只有內核開發人員才感興趣。如果你好奇的話,可以訪問http//www.redhat.com:8080地址處的 “Kernel Hackers Guide”

init
進程

init
進程是非內核進程中第一個被啓動運行的,因此它的進程編號PID的值總是1init讀它的配置文件/etc/inittab,決定需要啓動的運 行級別(Runlevel)。從根本上說,運行級別規定了整個系統的行爲,每個級別(分別由06的整數表示)滿足特定的目的。如果定義了 initdefault級別,這個值就直接被選中,否則需要由用戶輸入一個代表運行級別的數值。

輸入代表運行級別的數字之後,init根據/etc/inittab文件中的定義執行一個命令腳本程序。缺省的運行級別取決於安裝階段對登錄程序的選擇:是使用基於文本的,還是使用基於X-Window的登錄程序。


rc
命令腳本程序


我們已經知道,當運行級別發生改變時,將由/etc/inittab文件定義需要運行哪一個命令腳本程序。這些命令腳本程序負責啓動或者停止該運行級別特 定的各種服務。由於需要管理的服務數量很多,因此需要使用rc命令腳本程序。其中,最主要的一個是/etc/rc.d/rc,它負責爲每一個運行級別按照 正確的順序調用相應的命令腳本程序。我們可以想象,這樣一個命令腳本程序很容易變得難以控制!爲了防止這類事件的發生,需要使用精心設計的方案。

對每一個運行級別來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。這些運行級別的下級子目錄的命名方法是rcX.d,其中的X就是代表運行級別的數字。比如說,運行級別3的全部命令腳本程序都保存在/etc/rc.d/rc3.d子目錄中。

在各個運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接,但是,這些符號鏈接並不使用命令腳本程序在 /etc/rc.d/init.d子目錄中原來的名字。如果命令腳本程序是用來啓動一個服務的,其符號鏈接的名字就以字母S打頭;如果命令腳本程序是用來 關閉一個服務的,其符號鏈接的名字就以字母K打頭。

許多情況下,這些命令腳本程序的執行順序都很重要。如果沒有先配置網絡接口,就沒有辦法使用DNS服務解析主機名!爲了安排它們的執行順序,在字母S或者 K的後面緊跟着一個兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/S50inet就會在 /etc/rc.d/rc3.d/S55named之前執行(S50inet配置網絡設置,S55named啓動DNS服務器)。

存放在/etc/rc.d/init.d子目錄中的、被符號鏈接上的命令腳本程序是真正的實幹家,是它們完成了啓動或者停止各種服務的操作過程。當 /etc/rc.d/rc運行通過每個特定的運行級別子目錄的時候,它會根據數字的順序依次調用各個命令腳本程序執行。它先運行以字母K打頭的命令腳本程 序,然後再運行以字母S打頭的命令腳本程序。對以字母K打頭的命令腳本程序來說,會傳遞Stop參數;類似地對以字母S打頭的命令腳本程序來說,會傳遞 Start參數。

編寫自己的rc命令腳本



在維護Linux系統運轉的日子裏,肯定會遇到需要系統管理員對開機或者關機命令腳本進行修改的情況。有兩種方法可以用來實現修改的目的:

如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個命令腳本程序是在引導過程的最後一步被執行的。

如果所做的修改比較細緻,或者還要求關閉進程使之明確地停止運行,則需要在/etc/rc.d/init.d子目錄中添加一個命令腳本程序。這個命令腳本程序必須可以接受StartStop參數並完成相應的操作。

第一種方法,編輯/etc/rc.d/rc.local腳本,當然是兩種方法中比較簡單的。如果想在這個命令腳本程序中添加內容,只需要使用喜歡的編輯器程序打開它,再把打算執行的命令附加到文件的末尾就可以了。這對一兩行的修改來說的確很便利。

如果確實需要使用一個命令腳本程序,這時必須選擇第二個方法。編寫一個rc命令腳本程序的過程並不像想象中那麼困難。我們下面就給出一個例子,看看它是怎樣實現的(順便說一句,你可以把我們的例子當作範本,按照自己的需要進行修改和添加)。

假設你打算每隔60分鐘調用一個特殊的程序來彈出一條消息,提醒自己需要從鍵盤前面離開休息一會兒,命令腳本程序將包括下面幾個部分:

關於這個命令腳本程序功能的說明(這樣就不會在一年之後忘記它);

在試圖運行它之前驗證這個命令腳本程序確實存在;

接受startstop參數並執行要求的動作。

參數給定後,我們就可以編寫命令的腳本程序。這個程序很簡單,大家可以自己編寫一下,我在這裏就不給出了。

編寫好新的命令腳本程序之後,再從相關的運行級別子目錄中加上必要的符號鏈接,來控制這個命令腳本程序的啓動或者停止。在我的印象中,只想讓它在運行級別 3或者運行級別5中啓動,原因是我認爲只有這兩個運行級別纔是日常工作的地方。最後,希望這個命令腳本程序在進入運行級別6(重啓動)的時候被關閉。


激活或者禁止服務項目


有的時候會發現,在引導的時候並不需要某個特定的服務被啓動。如果你正在考慮使用Linux替換Windows NT的文件和打印服務器,就更是如此。

我們已經知道,在特定的運行級別子目錄中給符號鏈接改個名稱,就可以讓該服務不被啓動,如把其名稱的第一個字母由S改爲K。一旦熟練掌握了命令行和符號鏈接,就會發現這是激活或者禁止服務的最快辦法。

在學習這個改名方法的時候,可能會覺得圖形化的操作界面ksysv比較容易掌握。雖然它原來是設計使用在KDE環境裏的,但在Red Hat Linux 7.2下缺省安裝的GNOME環境裏也運行得很好。如果想啓動它,只需簡單地打開一個xterm窗口,並輸入ksysv命令就可以了。屏幕上會出現一個窗 口,其中列出了能夠修改的全部參數,需要時還包括在線幫助。

警告:如果是在一個現實中的系統上學習本文的知識,要多多運用常識。當試着對啓動腳本程序進行修改的時候,要記住所做的修改可能會造成你的系統不能正常工 作,而且無法採用重啓動的方法恢復。不要在正常運轉的系統上實驗新的設置,對你準備修改的文件要全部進行備份。最重要的是,在手邊要準備一張引導盤以防不 測。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章