《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
----------------------------------------------------------------------------未完待續,敬請留意--------------------------------------------------------------------------------