日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

硬連接和軟連接的原理-《別怕Linux編程》之七

 rookie 2013-01-19

引子

目前,UNIX的文件系統(tǒng)有很多種實現(xiàn),例如UFS(基于BSD的UNIX文件系統(tǒng))、ext3、ext4、ZFS和Reiserfs等等。

不論哪一種文件系統(tǒng),總是需要存儲數(shù)據(jù)。硬盤的最小存儲單位是扇區(qū),數(shù)據(jù)所存儲的最小單位則不是扇區(qū),因為用扇區(qū)來存儲效率就太低了。一個扇區(qū)只有512字節(jié),而磁頭是一個扇區(qū)一個扇區(qū)地讀取,也就是說,如果文件是10MB,那么為了讀這個文件,磁頭必須要進行讀取20480次。這樣效率是極其低下的。

邏輯塊

為了提高效率,就有了邏輯塊(Block)的概念,也可以叫做數(shù)據(jù)塊。邏輯塊是在分區(qū)進行文件系統(tǒng)的格式化時所指定的“最小存儲單位”,這個最小存儲單位是以扇區(qū)為基礎(chǔ)的,所以邏輯塊的大小總是扇區(qū)的2的n次方倍。此時,磁頭可以一次讀取一個塊,這樣效率可就高了!

邏輯塊的規(guī)劃是很有學(xué)問的,并不是越大越好,因為一個邏輯塊最多也只能容納一個文件(在Linux的ext2中),所以如果邏輯塊被規(guī)劃的太大,那么會很浪費磁盤空間。舉個例子,如果一個邏輯塊為4KB,而有一個文件只有0.1KB大小,而這個小文件仍然要占用一個邏輯塊,因此就會浪費3.9KB的空間。

所以,在規(guī)劃磁盤時,需要考慮到主機的用途。比如BBS主機,由于文章短小,文件較小,那么邏輯塊分配的小一點好。如果主機主要用在存儲大容量的文件,那么考慮到使用效率,還是邏輯塊大一點好!

磁盤的組成

我們可以把一個磁盤分成一個或多個分區(qū)。每個分區(qū)可以包含一個文件系統(tǒng)。

我們下面要描述一個分層細化的過程,請您集中精力來隨我思考:

1 磁盤是由一個一個分區(qū)組成的,即磁盤=分區(qū)+分區(qū)+分區(qū)…

2 每一個分區(qū)內(nèi)都有一個文件系統(tǒng),且一個分區(qū)內(nèi)有且僅有一個文件系統(tǒng)。

3 每個分區(qū)內(nèi)都依次包含這些內(nèi)容:自舉塊(也叫引導(dǎo)塊),超級塊,柱面組0,柱面組1,…柱面組n。即分區(qū)=自舉塊+超級塊+柱面組(若干)

4 每個柱面組又包括了這些內(nèi)容:超級塊副本,配置信息,i節(jié)點圖(記錄哪些i節(jié)點可用),塊位圖(記錄哪些塊是否可用),i節(jié)點(許多),數(shù)據(jù)塊(也叫邏輯塊)

好了,你應(yīng)該可以根據(jù)1,2,3,4在腦海里構(gòu)造出一張分層圖了,如果你把它畫出來,對你記憶i節(jié)點的概念會更有好處。

超級塊

超級塊(superblock)的作用是存儲文件系統(tǒng)的大小、空的和填滿的塊,以及它們各自的總數(shù)和其他諸如此類的信息。要使用一個分區(qū)來進行數(shù)據(jù)訪問,那么第一個要訪問的就是超級塊。所以,如果超級塊壞了,那磁盤也就基本沒救了。

i節(jié)點

下面要講到i節(jié)點,就不能不提提Linux的安全性。由于Linux操作系統(tǒng)是一個多用戶、多任務(wù)的環(huán)境,為了保護每個用戶所擁有數(shù)據(jù)的隱密性,就將每個文件分成了兩個部分來存儲:一個是文件的屬性,另一個則是文件的內(nèi)容。

i節(jié)點(iinode)就是用來存儲文件的屬性的;而數(shù)據(jù)塊(邏輯塊)是用來存儲文件的內(nèi)容的!

如果要格式化一個分區(qū),就要指定inode的大小和塊的大小才行!更通俗的說,一個ext2文件系統(tǒng)是一定要包括inode表與塊區(qū)域這兩個部分的!

至于塊,我在前面提到過,它也叫邏輯塊,還叫數(shù)據(jù)塊,它是數(shù)據(jù)存儲的最小單位。

而inode“記錄文件屬性以及文件內(nèi)容放置在哪一個塊內(nèi)”的信息,更通俗的說,inode除了包含文件的屬性之外,還包括一個指針,這個指針就指向文件內(nèi)容放置的數(shù)據(jù)塊的位置,好讓操作系統(tǒng)可以方便的去讀取文件內(nèi)容。

在inode中一般包括了這樣一些文件屬性信息:

  • 文件的擁有者和所屬用戶組;
  • 文件的訪問權(quán)限設(shè)定;
  • 文件的類型;
  • 文件的訪問、修改等時間
  • 文件的大小;
  • 文件的各種標(biāo)志,如SUID和SGID等;
  • 指向文件內(nèi)容數(shù)據(jù)塊的指針。

一個inode的大小通常為128字節(jié)。(在ext4中這個知識將被顛覆,ext4中的inode大小將擴展到256字節(jié))

好,下面就來看看到底我們怎么利用inode來管理文件呢?

目錄

先來看看有關(guān)目錄操作的細節(jié):

如果我們建立了一個目錄,那么系統(tǒng)會分配給該目錄一個inode和至少一個塊。這個inode就記錄該目錄的相關(guān)屬性,并將其中的指針指向分配的那個數(shù)據(jù)塊。而所分配的塊內(nèi)則記錄了這個目錄下的相關(guān)文件(和子目錄)的關(guān)聯(lián)性,更通俗的說,目錄塊中存儲了一個包括三列的表,三列分別為:inode,文件名或目錄名,指向數(shù)據(jù)塊的指針。

我們用vi命令來查看一下一個目錄的內(nèi)容到底是什么:(當(dāng)然這只是用戶看到的,和文件系統(tǒng)的底層實現(xiàn)是不同的。)

" ============================================================================
" Netrw Directory Listing                                        (netrw v109)
"   /rocrocket/PSB/home/git27
"   Sorted by      name
"   Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj$,\.bak$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec
" ============================================================================
../
./
.git/
roc.c

雙引號開頭的是注釋部分,而后緊跟著四個項,前兩個是任何目錄都固有的“上級目錄”和“當(dāng)前目錄”,而后是一個隱藏目錄.git,最后是一個當(dāng)前目錄下的文件roc.c??梢姡粋€目錄其實也是一個文件,只不過它其中不存儲用戶數(shù)據(jù),而是存儲目錄下的文件和子目錄列表。

如果在Linux中新建一個普通文件,則系統(tǒng)會為該文件分配至少一個inode與相對于該文件大小的塊數(shù)量。例如,假設(shè)一個塊為4KB,要建一個100KB的文件,則Linux將分配一個inode與25個塊來存儲該文件。

有一點要特別!特別!特別!提醒的是:inode本身并不記錄文件名,而是記錄文件的相關(guān)的屬性(在上文提到過的那些屬性),文件名則記錄在目錄所屬的塊區(qū)域。正因為這個原因,使得如果Linux讀取一個文件的內(nèi)容,就要先由根目錄/獲取該文件的上層目錄所在的inode,再由該目錄所記錄的的文件關(guān)聯(lián)性獲取該文件的inode,最后通過inode內(nèi)提供的塊指針來獲取最終的文件內(nèi)容。

鏈接計數(shù)

而當(dāng)談到鏈接數(shù)的時候,這里我還要提出一些概念和幾個規(guī)律性的結(jié)論:

每個i節(jié)點中都存有一個鏈接計數(shù),其值是指向該i節(jié)點的目錄項數(shù)。

只有當(dāng)鏈接技術(shù)減少到0時,才可刪除該文件(也就是釋放該文件占有的數(shù)據(jù)塊)

能夠增加鏈接數(shù)的鏈接為硬鏈接。

軟鏈接也叫符號鏈接,它的inode的文件類型是S_IFLNK。它只是存儲了另一個文件的路徑和名稱而已。

任何一個葉目錄(不包含任何其他目錄的目錄)的鏈接計數(shù)總是2,數(shù)值2來自于命名該目錄的目錄項以及在該目錄中的.項。

父目錄中的每一個子目錄都會使該父目錄的鏈接計數(shù)增1。

精彩引文

最后給出csdn網(wǎng)上qxp網(wǎng)友的一段關(guān)于軟鏈接和硬鏈接的評論,很不錯:

我們知道unix文件大致可以分為這樣三部分:目錄(文件名),inode   和數(shù)據(jù)區(qū)。

對于復(fù)制來說,不僅僅創(chuàng)建了新的目錄項(文件名),新的inode,還復(fù)制了該文件的所有數(shù)據(jù);

而硬連結(jié)則僅僅創(chuàng)建了新的目錄項,并且在目錄項中相應(yīng)的inode編號被連結(jié)到相應(yīng)的文件的inode編號,同時,該文件的inode引用計數(shù)加1;

這樣,你刪除原來的文件時候,文件數(shù)據(jù)并不會被刪除,因為inode結(jié)點引用計數(shù)>0,所以,通過硬連結(jié)還能繼續(xù)訪問。

換句話說,硬連接使得該文件存在另外一個別名,也就是另外一個入口。

順便說一下軟連結(jié),就是符號連結(jié),其實就相當(dāng)于是windows下的快捷方式。

創(chuàng)建了一個新的目錄項,一個新的inode,只不過數(shù)據(jù)區(qū)里放的是被引用的文件路徑和名稱。

結(jié)尾PS

ps:其實寫這篇文章的目的,是為了在另一篇文章中更好的講解ln命令,到時會給出大家那篇文章的一個鏈接。

ps2:關(guān)于inode和目錄的一點優(yōu)秀評論:一個文件系統(tǒng)維護了一個索引節(jié)點的數(shù)組,每個文件或目錄都與索引節(jié)點數(shù)組中的唯一的元素對應(yīng)。每個索引節(jié)點在數(shù)組中的索引號,稱為索引節(jié)點號。linux文件系統(tǒng)將文件索引節(jié)點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節(jié)點號結(jié)合在一起的一張表,目錄中每一對文件名稱和索引節(jié)點號稱為一個連接。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多