1. 程式人生 > >《Linux系統》之"皮毛系列"(二) Linux檔案系統的簡介

《Linux系統》之"皮毛系列"(二) Linux檔案系統的簡介

一、Linux檔案系統

1、檔案系統簡介

Linux系統的理念是:一切都是檔案。 其實這個是Unix系統的哲學思想,而Linux是由Unix系統而來,所以也繼承了這個思想:

Unix系統把一切資源都看作是檔案,包括硬體裝置。硬體所形成的檔案,通常稱為裝置檔案。這樣使用者就可以用讀寫檔案的方式實現對硬體的訪問,這樣帶來的優勢也是顯而易見的。Unix 許可權模型也是圍繞檔案的概念來建立的,所以對裝置也就可以同樣處理了。

Linux檔案系統的設計目的:就是用來儲存檔案和管理檔案。Linux檔案系統的檔案是資料的集合,檔案系統不僅包含著檔案中的資料,而且還有檔案系統的結構,Linux使用者和應用程式看到的檔案、目錄、軟連線及檔案保護資訊等都儲存在其中。注意:作業系統是用來管理硬體和應用程式及其檔案系統的,別弄混這個概念。

2、Linux檔案系統的目錄結構

Linux檔案系統採用樹狀級結構圖。因為樹狀結構圖方便歸類和整理,就好像圖書館的書一樣,先進行大類分成不同的書架,在進行逐級細分,方便檔案的查詢和管理。

    


1)根目錄 (/) 的意義與內容:

根目錄是整個檔案系統中最重要的一個目錄,位於Linux檔案系統目錄結構的頂層。因為不但所有的目錄都是由根目錄衍生出來的, 同時根目錄也與作業系統的開機、還原、系統修復等行為有關。

系統開機所需要的特定檔案資料有:核心檔案、開機程式、 函式庫等等。如果系統出現錯誤,根目錄也必須要包含有能夠修復檔案系統的程式才行。

因此FHS標準建議:根目錄(/)所在分割槽應該越小越好, 且應用程式所安裝的軟體最好不要與根目錄放在同一個分割槽內,保持根目錄越小越好。 如此不但效能較佳,根目錄所在的檔案系統也較不容易發生問題。說白了,就是根目錄和Windows的C盤一個樣。因為越大的分割槽內你會放入越多的資料,如此一來根目錄所在分割槽就可能會有較多發生錯誤的機會。

因為根目錄與開機有關,開機過程中僅有根目錄會被掛載, 其他分割槽則是在開機完成之後才會持續的進行掛載行為。因此根目錄下與開機過程有關的目錄, 就應該與根目錄放在同一個分割槽裡。這些目錄分別是:/etc,/bin,/dev,/lib,/sbin。

下面對目錄樹進行一下介紹:

/:根目錄,位於Linux檔案系統目錄結構的頂層。通常根目錄下只存放目錄,不存放檔案,/etc,/bin,/dev,/lib,/sbin應該和根目錄放置在一個分割槽中。

/bin,/usr/bin:該目錄為命令檔案目錄,也稱為二進位制目錄。包含了供系統管理員及普通使用者使用的重要的linux命令和二進位制(可執行)檔案,包含shell直譯器等。

/boot 該目錄中存放系統的核心檔案和引導裝載程式檔案,/boot/vmlinuz為linux的核心檔案,以及/boot/gurb。建議單獨分割槽,分割槽大小100M即可。

/dev: 裝置(device)檔案目錄,存放linux系統下的裝置檔案,訪問該目錄下某個檔案,相當於訪問某個裝置(終端、磁碟驅動器、光碟機及網絡卡等,包括字元裝置和塊裝置)等,常用的是掛載光碟機mount /dev/cdrom/mnt。 

/etc: 系統配置檔案目錄,該目錄存放系統的大部分配置檔案和子目錄,不建議在此目錄下存放可執行檔案。該目錄下的檔案由系統管理員來使用,普通使用者對大部分檔案有隻讀許可權。

/home: 系統預設的使用者宿主目錄,新增使用者賬號時,使用者的宿主目錄都存放在此目錄下,~表示當前使用者的宿主目錄。建議單獨分割槽,並設定較大的磁碟空間,方便使用者存放資料。

/lib,/usr/lib,/usr/local/lib:系統最基本的動態連線資源庫,核心模組檔案目錄。幾乎所有的應用程式都用到此資源庫。/lib目錄存放了所有重要的庫檔案,其他的庫檔案則大部分存放在/usr/lib目錄下。

/lost+fount: 在EXT2或EXT3檔案系統中,系統意外崩潰或意外關機時,產生的一些檔案碎片放在這裡。當系統重新啟動時,fsck工具會檢查這裡,並修復已經損壞的檔案系統。

/mnt,/media: mnt目錄主要用來臨時掛載檔案系統,為某些裝置提供預設掛載點。

/opt: 給主機額外安裝軟體所擺放的目錄。

/proc: 此目錄的資料都在記憶體中,如系統核心,外部裝置,網路狀態,由於資料都存放於記憶體中,所以不佔用磁碟空間。

/root:系統管理員root的宿主目錄,系統第一個啟動的分割槽為/,所以最好將/root和/放置在一個分割槽下

/sbin,/usr/sbin,/usr/local/sbin:放置系統管理員使用的可執行命令,如fdisk、shutdown、mount等。與/bin不同的是,這幾個目錄是給系統管理員root使用的命令,一般使用者只能"檢視"而不能設定和使用。

/tmp: 存放系統產生的臨時檔案,因此重要檔案不要放在此目錄下。

/srv: 服務啟動之後需要訪問的資料目錄,如www服務需要訪問的網頁資料存放在/srv/www內。

/usr: 應用程式存放目錄,/usr/bin 存放應用程式, /usr/share 存放共享資料,/usr/lib 存放不能直接執行的,卻是許多程式執行所必需的一些函式庫檔案,/usr/local 存放軟體升級包,/usr/share/doc 系統說明檔案存放目錄。

/usr/share/man:  程式說明檔案存放目錄,使用 man ls時會查詢/usr/share/man/man1/ls.1.gz的內容。建議單獨分割槽,設定較大的磁碟空間。

/var: 放置系統執行過程中經常變化的檔案,如隨時更改的日誌檔案 /var/log。

/sys:這個目錄其實跟/proc非常類似,也是一個虛擬的檔案系統,主要也是記錄與核心相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。 這個目錄同樣不佔硬碟容量。

3、絕對路徑與相對路徑

在訪問檔案或目錄時,會涉及到所謂的路徑。我們根據寫法的不同來分成絕對路徑(absolute)與相對路徑(relative)。

絕對路徑:由根目錄(/)開始寫起的檔名或目錄名稱。例如 /home/hyxy/.bashrc;

相對路徑:相對於你當前所在路徑的寫法。 不是以 / 開頭的寫法就屬於相對路徑的寫法。

舉例來說,你目前在 /home/hyxy 這個目錄下, 如果想要進入 /var/log 這個目錄時,可以怎麼寫呢?

cd  /var/log                     --絕對路徑寫法

cd ../../var/log                 --相對路徑寫法。因為我們的位置是/home/hyxy裡,所以要回到上一層(../)到達/home/裡,然後再回到上                                          一層(../)到達根目錄,此時才能看到/var,然後向裡移動。

兩個特殊的目錄:

.  :代表當前的目錄,也可以使用 ./ 來表示;

.. :代表上一層目錄,也可以 ../ 來代表。

4、檔案型別

當我們使用命令“ll”查詢檔案屬性時,我們會看到第一列是由10個字元組成的。而10個字元的第一個字元就表示檔案型別。

                         

現在,來看看Linux檔案系統支援的檔案型別:

-(f):普通檔案

d:目錄檔案

b:塊裝置。就是一些儲存資料,以提供系統存取的介面裝置。例如你的一號硬碟的程式碼是 /dev/hda1。

c:字元檔案。一些串列埠的介面裝置,例如鍵盤、滑鼠等等!

l:符號連結檔案,分為軟連結和硬連結。類似於windows系統的快捷方式。

p:管道檔案,FIFO也是一種特殊的檔案型別,它主要的目的是,解決多個程式同時存取一個檔案所造成的錯誤。

s:套接字檔案,socket。如啟動一個MySql伺服器時產生的一個mysql.sock檔案。

檢視檔案型別的三種方法:

方法1:ls -l或者ll
方法2:file命令
方法3:stat命令

5、檔案屬性

當使用命令   ls  -lih時,我們就會看到以下屬性。

     

二、Linux虛擬檔案系統

Linux 中允許不同的檔案系統共存,如 ext2, ext3, vfat 等。通過使用同一套檔案 I/O 系統呼叫,即可對 Linux 中的任意檔案進行操作而無需考慮其所在的具體檔案系統格式;更進一步,可以跨檔案系統來操作檔案。如下圖,我們可以使用 cp 命令從 vfat 檔案系統格式的硬碟拷貝資料到 ext3 檔案系統格式的硬碟,而這樣的操作涉及到兩個不同的檔案系統。

                            

那麼,是什麼原因可以讓Linux系統有這樣強大的功能呢?

Linux中,有一個虛擬檔案系統(Virtual File System, 簡稱VFS),是Linux核心中的一個軟體層,用於給應用程式提供檔案系統介面;同時,它也提供了核心中的一個抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴VFS共存,而且也依靠VFS協同工作。

為了能夠支援各種實際檔案系統,VFS定義了所有檔案系統都支援的基本的、概念上的介面和資料結構;同時實際檔案系統也提供VFS所期望的抽象介面和資料結構,將自身的諸如檔案、目錄等概念在形式 上與VFS的定義保持一致。換句話說,一個實際的檔案系統想要被 Linux 支援,就必須提供一個符合VFS標準 的介面,才能與 VFS 協同工作。實際檔案系統在統一的介面和資料結構下隱藏了具體的實現細節,所以在VFS 層和核心的其他部分看來,所有檔案系統都是相同的。下圖顯示了VFS在核心中與實際的檔案系統的協同關係。

                   

VFS主要有四個資料結構,分別是超級塊、索引節點、目錄項和檔案物件(檔案物件是針對於記憶體來說的)。正是這四種資料結構的支援,因此不論是普通的檔案,還是特殊的目錄、裝置等,VFS都將它們同等看待成檔案,通過同一套檔案操作介面來對它們進行操作。

操作檔案時需先開啟;開啟檔案時,VFS會知道該檔案對應的檔案系統格式;當VFS把控制權傳給實際的檔案系統時,實際的檔案系統再做出具體區分,對不同的檔案型別執行不同的操作。這也就是“一切皆是檔案”的根本所在。

三、檔案儲存結構

我們都知道,硬碟是用來持久化儲存記憶體中的資訊,斷電後不會丟失。由於這個原因,檔案系統也就安裝在了硬碟上。就像windows系統一樣,一個分割槽,就是一個檔案系統。那麼,檔案系統是怎麼管理磁碟的呢?

它將磁碟塊分為以下三個部分:
1)  超級塊,檔案系統中第一個塊被稱為超級塊。這個塊存放檔案系統本身的結構資訊。比如,超級塊記錄了每個區域的大小,超級塊也存放未被使用的磁碟塊的資訊。
2)  i-節點表。超級塊的下一個部分就是i-節點表。每個i-節點就是一個對應一個檔案/目錄的結構,這個結構它包含了一個檔案的長度、建立及修改時間、許可權、所屬關係、磁碟中的位置等資訊。一個檔案系統維護了一個索引節點的陣列,每個檔案或目錄都與索引節點陣列中的唯一一個元素對應。系統給每個索引節點分配了一個號碼,也就是該節點在陣列中的索引號,稱為索引節點號
3)  資料區。檔案系統的第3個部分是資料區。檔案的內容儲存在這個區域。磁碟上所有塊的大小都一樣。如果檔案包含了超過一個塊的內容,則檔案內容會存放在多個磁碟塊中。一個較大的檔案很容易分佈上千個獨產的磁碟塊中。

下面對上圖裡邊的構成元素做個簡單的講解:

引導塊:為磁碟分割槽的第一個塊,記錄檔案系統分割槽的一些資訊,,引導載入當前分割槽的程式和資料被儲存在這個塊中。一般佔用2kB,

超級塊:

超級塊用於儲存檔案系統全域性的配置引數(譬如:塊大小,總的塊數和inode數)和動態資訊(譬如:當前空閒塊數和inode數),其處於檔案系統開始位置的1k處,所佔大小為1k。為了系統的健壯性,最初每個塊組都有超級塊和組描述符表(以下將用GDT)的一個拷貝,但是當檔案系統很大時,這樣浪費了很多塊(尤其是GDT佔用的塊多),後來採用了一種稀疏的方式來儲存這些拷貝,只有塊組號是3, 5 ,7的冪的塊組(譬如說1,3,5,7,9,25,49…)才備份這個拷貝。通常情況下,只有主拷貝(第0塊塊組)的超級塊資訊被檔案系統使用,其它拷貝只有在主拷貝被破壞的情況下才使用。

塊組描述符:

GDT用於儲存塊組描述符,其佔用一個或者多個數據塊,具體取決於檔案系統的大小。它主要包含塊點陣圖,inode點陣圖和inode表位置,當前空閒塊數,inode數以及使用的目錄數(用於平衡各個塊組目錄數),具體定義可以參見ext3_fs.h檔案中struct ext3_group_desc。每個塊組都對應這樣一個描述符,目前該結構佔用32個位元組,因此對於塊大小為4k的檔案系統來說,每個塊可以儲存128個塊組描述符。由於GDT對於定位檔案系統的元資料非常重要,因此和超級塊一樣,也對其進行了備份。GDT在每個塊組(如果有備份)中內容都是一樣的,其所佔塊數也是相同的。從上面的介紹可以看出塊組中的元資料譬如塊點陣圖,inode點陣圖,inode表其位置不是固定的,當然預設情況下,檔案系統在建立時其位置在每個塊組中都是一樣的,如圖2所示(假設按照稀疏方式儲存,且n不是3,5,7的冪)

塊組:

每個塊組包含一個塊點陣圖塊,一個 inode 點陣圖塊,一個或多個塊用於描述 inode 表和用於儲存檔案資料的資料塊,除此之外,還有可能包含超級塊和所有塊組描述符表(取決於塊組號和檔案系統建立時使用的引數)。下面將對這些元資料作一些簡要介紹。

塊點陣圖:

塊點陣圖用於描述該塊組所管理的塊的分配狀態。如果某個塊對應的位未置位,那麼代表該塊未分配,可以用於儲存資料;否則,代表該塊已經用於儲存資料或者該塊不能夠使用(譬如該塊物理上不存在)。由於塊點陣圖僅佔一個塊,因此這也就決定了塊組的大小。

Inode點陣圖:

Inode點陣圖用於描述該塊組所管理的inode的分配狀態。我們知道inode是用於描述檔案的元資料,每個inode對應檔案系統中唯一的一個號,如果inode點陣圖中相應位置位,那麼代表該inode已經分配出去;否則可以使用。由於其僅佔用一個塊,因此這也限制了一個塊組中所能夠使用的最大inode數量。

Inode表:

Inode表用於儲存inode資訊。它佔用一個或多個塊(為了有效的利用空間,多個inode儲存在一個塊中),其大小取決於檔案系統建立時的引數,由於inode點陣圖的限制,決定了其最大所佔用的空間。

以上這幾個構成元素所處的磁碟塊成為檔案系統的元資料塊,剩餘的部分則用來儲存真正的檔案內容,稱為資料塊,而資料塊其實也包含資料和目錄。

Linux檔案系統的檔案

Linux檔案系統(如ext2、ext3)中的一個檔案由目錄項、inode和資料塊組成。

目錄項:包括檔名和inode節點號。
Inode:又稱檔案索引節點,是檔案基本資訊的存放地和資料塊指標存放地。
資料塊:檔案的具體內容存放地。

                                                   
Inode包含檔案的屬性(如讀寫屬性、owner等,以及指向資料塊的指標),資料區域塊則是檔案內容。當檢視某個檔案時,會先從inode table中查出檔案屬性及資料存放點,再從資料塊中讀取資料。

 

                                                     

四、df命令詳解

df命令的作用:列出檔案系統的整體磁碟空間使用情況,包括磁碟已使用空間和還剩餘空間。在預設情況下,磁碟空間是以1KB為單位進行顯示的,我們可以設定環境變數POSIXLY_CORRECT環境變數為true,這種情況下使用512位元組為單位顯示。

命令語法:df   [選項]    [檔名] 
常用引數: 
-a:--all,顯示所有的檔案系統,包括虛擬檔案系統,參考示例2。 
-B:--block-size,指定單位大小。比如1k,1m等,參考示例3。 
-h:--human-readable,以人們易讀的GB、MB、KB等格式顯示,參考示例4。 
-H:--si,和-h引數一樣,但是不是以1024,而是1000,即1k=1000,而不是1k=1024。 
-i:--inodes,不用硬碟容量,而是以inode的數量來顯示,參考示例5。 
-k:以KB的容量顯示各檔案系統,相當於--block-size=1k。 
-m:以KB的容量顯示各檔案系統,相當於--block-size=1m。 
-l:--local,只顯示本地檔案系統。 
--no-sync:在統計使用資訊之前不呼叫sync命令(預設)。 
-sync:在統計使用資訊之前呼叫sync命令。 
-P:--portability,使用POSIX格式顯示,參考示例6。 
-t:--type=TYPE,只顯示指定型別的檔案系統,參考示例7。 
-T:--print-type,顯示檔案系統型別,參考示例8。 
-x:--exclude-type=TYPE,不顯示指定型別的檔案系統。 
--help:顯示幫助資訊。 
--version:顯示版本資訊。

案例1:檢視檔案或目錄所在的檔案系統

[[email protected] ~]# df /bin /home/michael/test/a.txt
Filesystem                   1K-blocks    Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  18134344 4699356  12513800  28% /
/dev/mapper/VolGroup-lv_root  18134344 4699356  12513800  28% /

輸出結果列說明:

Filesystem:代表該檔案系統是哪個分割槽,所以列出的是裝置名稱。
1K-blocks:說明下面的數字單位是1KB,可利用-h或-m來改變單位大小,也可以用-B來設定。
Used:已使用空間大小。
Available:剩餘空間大小。
Use%:磁碟使用率。如果使用率在90%以上時,就需要注意了,避免磁碟容量不足出現系統問題,尤其是對於檔案內容增加較快的情況(如/home、/var/spool/mail等)。
Mounted on:磁碟掛載的目錄,即該磁碟掛載到了哪個目錄下面。

案例2:檢視所有檔案系統

[[email protected] mm]# df -a              #包含了VFS
Filesystem                   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  18134344   4699376  12513780  28% /
proc                                 0         0         0    - /proc
sysfs                                0         0         0    - /sys
devpts                               0         0         0    - /dev/pts
tmpfs                           502204       224    501980   1% /dev/shm
/dev/sda1                       495844     34917    435327   8% /boot
none                                 0         0         0    - /proc/sys/fs/binfmt_misc
.host:/                      420218876 122634068 297584808  30% /mnt/hgfs
vmware-vmblock                       0         0         0    - /var/run/vmblock-fuse
gvfs-fuse-daemon                     0         0         0    - /root/.gvfs
[[email protected] mm]# df                 #預設模式
Filesystem                   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root  18134344   4699376  12513780  28% /
tmpfs                           502204       224    501980   1% /dev/shm
/dev/sda1                       495844     34917    435327   8% /boot
.host:/                      420218876 122634068 297584808  30% /mnt/hgfs

小貼士:系統裡面存在很多特殊的檔案系統,這些檔案系統都是在記憶體當中,(如/proc掛載點),不會佔據硬碟空間。

案例3:指定單位來檢視檔案系統

[[email protected] mm]# df -B 1M               #指定單位為1M
Filesystem                   1M-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root     17710   4590     12221  28% /
tmpfs                              491      1       491   1% /dev/shm
/dev/sda1                          485     35       426   8% /boot
.host:/                         410370 119760    290611  30% /mnt/hgfs
[[email protected] mm]# df --block-size 1M     #指定單位為1M
Filesystem                   1M-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root     17710   4590     12221  28% /
tmpfs                              491      1       491   1% /dev/shm
/dev/sda1                          485     35       426   8% /boot
.host:/                         410370 119760    290611  30% /mnt/hgfs

案例4:以容易理解的方式檢視檔案系統

[[email protected] mm]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   18G  4.5G   12G  28% /
tmpfs                         491M  224K  491M   1% /dev/shm
/dev/sda1                     485M   35M  426M   8% /boot
.host:/                       401G  117G  284G  30% /mnt/hgfs

案例5:以inode數量的方式檢視檔案系統

[[email protected] mm]# df -i
Filesystem                    Inodes  IUsed   IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root 1152816 110838 1041978   10% /
tmpfs                         125551      5  125546    1% /dev/shm
/dev/sda1                     128016     38  127978    1% /boot
.host:/                            0      0       0     - /mnt/hgfs

案例6:以檔案系統型別方式來查詢檔案系統

[[email protected] mm]# df -T
Filesystem                   Type   1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root ext4    18134344   4699412  12513744  28% /
tmpfs                        tmpfs     502204       224    501980   1% /dev/shm
/dev/sda1                    ext4      495844     34917    435327   8% /boot
.host:/                      vmhgfs 420218876 122634068 297584808  30% /mnt/hgfs

----------------------------------------------------------------------------未完待續,敬請留意--------------------------------------------------------------------------------