1. 存儲設備分區(qū)
一個磁盤可以劃分為很多個扇區(qū)套耕,每個扇區(qū)有512個字節(jié),扇區(qū)是磁盤的基本存儲單元惶凝。將每個扇區(qū)編號吼虎,這樣磁盤就變?yōu)榱艘幌盗芯幜颂柕膲K組合。一個磁盤主要包括引導塊苍鲜,超級塊思灰,i節(jié)點表,文件存儲區(qū)混滔,進程對換區(qū)等洒疚。
- 引導塊。引導塊占用第0號物理塊遍坟,不屬于文件系統(tǒng)管轄拳亿;如果系統(tǒng)中有多個文件系統(tǒng),只有跟文件系統(tǒng)才有引導程序放入引導塊中愿伴,其余文件系統(tǒng)都不使用引導塊肺魁。
- 超級塊。文件系統(tǒng)的第一個塊被稱為超級塊隔节,這個塊存放的是文件系統(tǒng)本身的結構信息鹅经;比如超級塊記錄了每個區(qū)域的大小寂呛,存放未使用磁盤的信息等。
- i節(jié)點表瘾晃。超級塊是下一個部分就是i節(jié)點表贷痪,每個文件對應一個i節(jié)點,每個文件都有一些屬性蹦误,如文件大小劫拢,所有者,創(chuàng)建時間等强胰。這些信息存放在對應的i節(jié)點的結構中舱沧,所有的文件都具有相同大小的i節(jié)點,這些i節(jié)點組成一個i節(jié)點表偶洋,文件系統(tǒng)創(chuàng)建后熟吏,i節(jié)點的數(shù)目是有限的。所以一個文件系統(tǒng)能夠創(chuàng)建的文件也是有限的玄窝。
- 文件存儲區(qū)牵寺。文件系統(tǒng)的第3個部分是文件存儲區(qū),文件的內(nèi)容保存在這里恩脂,磁盤所有的塊大小都是一樣帽氓,如果文件大小超過一個塊的大小,則文件會存放在多個次磁盤塊中东亦。
- 進程對換區(qū)杏节。磁盤上會開辟一塊區(qū)域, 為對換區(qū)典阵, 當內(nèi)存中的進程需要擴大占用的內(nèi)存空間奋渔, 而當前內(nèi)存空間不足時, 則把某些不常用的進程暫時替換到對換區(qū)中壮啊, 在適用的時候又把他們換進 內(nèi)存嫉鲸,解決內(nèi)存不足和進程之間對內(nèi)存的競爭問題。
2. 文件結構
大部分的Linux文件系統(tǒng)(如ext2歹啼、ext3)規(guī)定玄渗,一個文件由目錄項、inode和數(shù)據(jù)塊組成:目錄項記錄了文件的i節(jié)點號和文件名狸眼;i節(jié)點則包含了文件的基礎信息以及數(shù)據(jù)塊的指針藤树;數(shù)據(jù)塊則包含文件的具體內(nèi)容。
Linux系統(tǒng)中拓萌,目錄(directory)也是一種文件岁钓。打開目錄,實際上就是打開目錄文件。一個目錄文件的內(nèi)容為目錄下所有文件的目錄項的列表屡限,每個目錄項有i節(jié)點號和文件名組成品嚣。因此,通過目錄項即可知道文件的i節(jié)點钧大,進而對文件內(nèi)容進行訪問翰撑。
i節(jié)點中通常存放了一個文件的管理信息和一些基本的系統(tǒng)數(shù)據(jù)(如文件的長度、文件內(nèi)容存放在磁盤上的位置等)啊央。ls -i
可以查看當前目錄下所有文件的i節(jié)點號眶诈;stat filename
可以查看文件的系統(tǒng)信息,包括iNode瓜饥。其結構如下:
struct dinode
{
ushort di_mode; /*文件類型+用戶權限*/
short di_nlink; /*文件鏈接數(shù)*/
ushort di_uid; /*屬主用戶id*/
ushort di_gid; /*屬主用戶組id*/
off_t di_size; /*文件大小*/
char di_addr[40]; /*文件數(shù)據(jù)區(qū)起點地址*/
time_t di_atime; /*最后訪問時間*/
time_t di_mtime; /*最后修改時間*/
time_t di_ctime; /*創(chuàng)建時間*/
};
i節(jié)點數(shù)據(jù)結構里面沒有文件名册养,那文件系統(tǒng)是如何管理文件名,i節(jié)點和文件內(nèi)容之間的關系的呢压固?i節(jié)點號存儲在目錄入口的頭兩個字節(jié)中,是文件名字和其內(nèi)容之間的唯一聯(lián)系靠闭。因此目錄中的文件名被稱為鏈帐我,它把目錄層次結構中的名稱連接到它的i節(jié)點,同時也就鏈接到數(shù)據(jù)愧膀。同一個i節(jié)點號可以出現(xiàn)在多個目錄中拦键,rm命令并不是真正刪除i節(jié)點,它刪除的是目錄入口或鏈檩淋。只有當鏈接到文件的最后的鏈消失后芬为,系統(tǒng)才刪除i節(jié)點,也就是文件本身蟀悦。
在Linux中媚朦,我們通過解析路徑,根據(jù)沿途的目錄文件來找到某個文件日戈。目錄中的條目除了所包含的文件名询张,還有對應的inode編號。當我們輸入$cat /var/test.txt時浙炼,Linux將在根目錄文件中找到var這個目錄文件的inode編號份氧,然后根據(jù)inode合成var的數(shù)據(jù)。隨后弯屈,根據(jù)var中的記錄蜗帜,找到text.txt的inode編號,沿著inode中的指針资厉,收集數(shù)據(jù)塊厅缺,合成text.txt的數(shù)據(jù)。整個過程中,我們參考了三個inode:根目錄文件店归,var目錄文件阎抒,text.txt文件的inodes。
假設要創(chuàng)建一個新文件消痛。該新文件占3個磁盤存儲塊且叁。創(chuàng)建文件步驟如下:
- 內(nèi)核先找到一塊空閑的i節(jié)點,內(nèi)核找到空的i節(jié)點號為10秩伞,內(nèi)核把文件信息記錄到其中逞带,如文件大小,文件所有者纱新,創(chuàng)建時間等展氓。
- 存儲數(shù)據(jù),即文件的內(nèi)容存儲脸爱,由于該文件需要3個數(shù)據(jù)塊遇汞,內(nèi)核從空閑的數(shù)據(jù)塊中找到3個數(shù)據(jù)塊,200簿废,300空入,400。 將內(nèi)容復制到這些塊中族檬。
- 記錄分配情況歪赢,數(shù)據(jù)保存到3個數(shù)據(jù)塊中,必須記錄起來单料,以便下次查找埋凯。磁盤分配情況記錄在文件的i節(jié)點的磁盤序列列表中。
- 增加文件名和目錄扫尖。新文件的名字為hello.c白对,內(nèi)核將文件的入口添加到目錄文件中,文件名和i節(jié)點號之間的對應關系换怖,將文件名和文件屬性躏结,內(nèi)容聯(lián)系起來,找到文件名就找到文件的i節(jié)點號狰域,通過i節(jié)點號就能夠找到文件的屬性和內(nèi)容媳拴。
3. 硬鏈接與軟鏈接
一般情況下,文件名和inode號是"一一對應"關系兆览,每個inode號對應一個文件名屈溉。但是,Linux系統(tǒng)允許多個文件名指向同一個inode號抬探。這意味著子巾,可以用不同的文件名訪問同樣的內(nèi)容帆赢;對文件內(nèi)容進行修改,會影響到所有文件名线梗;但是椰于,刪除一個文件名,不影響另一個文件名的訪問仪搔。這種情況就被稱為"硬鏈接"(hard link)瘾婿。
ln命令可以創(chuàng)建硬鏈接,語法為:
ln source_file target_file
運行上面這條命令以后烤咧,源文件與目標文件的inode號相同偏陪,都指向同一個inode。inode信息中有一項叫做"鏈接數(shù)"煮嫌,記錄指向該inode的文件名總數(shù)笛谦,這時就會增加1。反過來昌阿,刪除一個文件名饥脑,就會使得inode節(jié)點中的"鏈接數(shù)"減1。當這個值減到0懦冰,表明沒有文件名指向這個inode好啰,系統(tǒng)就會回收這個inode號碼,以及其所對應block區(qū)域儿奶。
這里順便說一下目錄文件的"鏈接數(shù)"。創(chuàng)建目錄時鳄抒,默認會生成兩個目錄項:"."和".."闯捎。前者的inode號就是當前目錄的inode號,等同于當前目錄的"硬鏈接"许溅;后者的inode號就是當前目錄的父目錄的inode號瓤鼻,等同于父目錄的"硬鏈接"。所以贤重,任何一個目錄的"硬鏈接"總數(shù)茬祷,總是等于2加上它的子目錄總數(shù)(含隱藏目錄),這里的2是父目錄對其的“硬鏈接”和當前目錄下的".硬鏈接"。
除了硬鏈接以外并蝗,還有一種特殊情況祭犯。文件A和文件B的inode號雖然不一樣,但是文件A的內(nèi)容是文件B的路徑滚停。讀取文件A時沃粗,系統(tǒng)會自動將訪問者導向文件B。因此键畴,無論打開哪一個文件最盅,最終讀取的都是文件B。這時,文件A就稱為文件B的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)涡贱。l類似于windows系統(tǒng)中的快捷方式咏删。
這意味著,文件A依賴于文件B而存在问词,如果刪除了文件B督函,打開文件A就會報錯:"No such file or directory"。這是軟鏈接與硬鏈接最大的不同:文件A指向文件B的文件名戏售,而不是文件B的inode號碼侨核,文件B的inode"鏈接數(shù)"不會因此發(fā)生變化。
ln -s命令可以創(chuàng)建軟鏈接灌灾,語法為:
ln -s source_file target_file
4. 文件權限
每個文件具有3種權限信息搓译,讀、寫和執(zhí)行锋喜;此外些己,還可以為不同的訪問者賦予不同的權限,有文件所有者嘿般、同組用戶和其他人三種權限組段标。ls -l
可以在輸出其他信息的同時,也輸出權限信息炉奴。
例子:-rw-r--r--
-:文件類型(-:文件逼庞;d:目錄;l:軟鏈接文件)
文件只有三種權限:(r:讀瞻赶;w:寫赛糟;x:執(zhí)行)
rw-(u所有者);r--(g所屬組)砸逊;r--(o其他人)
chmod命令用于改變文件的權限璧南,權限可以用兩種方式表示:八進制數(shù)或符號。符號描述可以說明權限的相對改變师逸,但八進制數(shù)更加容易使用司倚。在八進制模式下通過給讀權限賦值4,給寫權限賦值2篓像,給執(zhí)行權限賦值1來改變權限动知。和ls中一樣,3個數(shù)字分別說明文件所有者员辩、組成員和其他成員的權限拍柒。
例子:
chmod 754 junk
給文件所有者賦予讀、寫和執(zhí)行的權限(4+2+1)屈暗,組成員讀和執(zhí)行權限(4+1)拆讯,其他成員讀權限(4)
除了超級用戶脂男,就只有文件所有者本人才可以改變一個文件的權限,而不考慮權限本身是什么种呐。
5. 目錄層次
因為linux是一個多用戶系統(tǒng)宰翅,制定一個固定的目錄規(guī)劃有助于對系統(tǒng)文件和不同的用戶文件進行統(tǒng)一管理。但就是這一點讓很多從windows轉到linux的初學者感到頭疼爽室。\
為根目錄汁讼,在根目錄有很多重要的目錄,其名稱和功能如下所示: