從零開始的linux 第二十一章(Inode以及Block詳解其二與軟鏈接)

從零開始的linux 第二十一章


在緊張的學習中,又迎來了新的一週~~-17c23f93a77fdd80.jpg小編也在同學們的迫切要求下繼續來更新博客咯~~

同學們:“我們纔沒要求你!”

唉??同學們一點都不配合呢~~別不好意思嘛~~


好啦~不逗你們了,小編就節省大家的時間,趕快開始這章的課程吧~~


在上一章中,小編給同學們講了 Inode號Block,不過還沒有給同學們講完哦~所以上一章的題目是 其一 ,那麼毫無疑問這一章就是其二的內容咯~從上一章同學們已經瞭解了什麼是Inode和Block,以及Inode中包含哪些東西,忘記的同學可以再翻看上一章內容~~並且,當一個分區下的Inode號被用盡之後,即使空間剩餘再多也將無法創建新的文件,在上一章最後,同學們也瞭解到了linux中一個目錄中的Bolck真正存放的數據是什麼,並留下了一些問題,這一章,小編就來帶着同學們解決這個問題吧~~


我們知道,每個分區的文件系統上都有Inode號,以及Block,並且這個Inode在相同分區下是唯一的,用來標識一個文件,不同分區下,Inode號會有可能相同,但因爲是在不同分區,所以不會發生衝突,那麼我們在複製和移動,刪除文件的時候,操作系統究竟在做什麼呢?

實際上,在複製和移動文件的時候,分爲兩種情況:第一種是在同一個分區下;第二種是在不同的分區下。在這兩種情況下,又有兩種情況:目標存在目標不存在

小編就來介紹一下這幾種情況情況:

在相同分區下cp複製一個文件:(目標不存在的情況下)

當我們用cp複製一個文件時,目標若是與源在同一個目錄,同一個Inode號只能指向同一個Block,因爲若同一個Inode號指向了不同的Block,當系統用這個Inode號來獲取其指向的數據時,就會發生混亂。注意哦,這裏所說的同一個Block是同一個數據,比如說,小編現在要向一個文件寫入內容,一個Block存放的數據有限,而當寫入文件的內容過多,會用到多個Block,但是這多個Block都屬於同一種數據,屬於同一個文件的內容。所以,若一個Inode號指向了不同的Block,就說明一個Inode號指向了不同的文件,那麼當要用這個Inode查詢數據時,結果就可想而知了...所以,不難想象,當複製一個文件到同一個分區下,系統會給這個複製出來的目標文件分配一個Inode號,同樣會複製源文件的Block。


在相同分區下cp複製一個文件:(目標存在的情況下)

在cp複製文件的時,若目標存在,會提示我們是否覆蓋該文件,若我們選擇了覆蓋,就會覆蓋這個目標的原有的數據,但是,這個文件的Inode號會保留下來,但是會將這個文件的元數據給覆蓋掉


在不同分區下cp複製一個文件:(目標不存在的情況下)

既然在不同分區下,每個分區下都有各自Inode號,所以這點小編就不做過多解釋了,其會將源文件的數據(block)以及元數據一起復制,並在目標所在的目錄創建一個新文件分配一個新的Inode號。


在不同分區下cp複製一個文件:(目標存在的情況下)

與在同一個分區下的情況一樣,這裏小編也不做過多的介紹了~~



以上是cp複製文件的情況,下面,小編就來介紹一下移動文件:

在相同分區下mv移動一個文件:(目標不存在的情況下)

從上一章也瞭解到,目錄中存放的是該目錄下面所有文件的Inode號與文件名稱的對應關係,並且在同一分區下Inode號是唯一的,那麼移動文件時候,既然是移動,並且在同一個分區下,是否這個Inode號可以保持不變呢?同學們可以試想一下,小編在相同分區下移動文件,先假設這個文件的Inode號會發生變化,那麼也就意味着會先把這個文件移除再創建,並把這個目錄中的記錄的Inode號與文件名的對應關係也刪除,再分配一個新的Inode給目標。實際上,這個步驟是繁瑣的,其中間有些步驟完全可以省略,也就是說,在同一個分區下,既然要使用同一個分區的Inode,不如索性就直接保留原來文件的Inode號以及元數據,僅僅是刪除這個文件所在的目錄中記錄的該文件的Inode號與文件名的對應關係,並在移動的目標的目錄中添加這條記錄即可。因爲文件本身沒有發送遷移,所以即使要移動非常大的數據也能瞬間完成。


在相同分區下mv移動一個文件:(目標存在的情況下)

若目標存在,同樣會提示我們是否覆蓋該文件,這裏與cp命令不同,雖然是覆蓋文件,但是源文件同樣有一個Inode號,而源文件的Inode號會將目標的Inode號給覆蓋掉,完全使用源文件的Inode,同樣會在源文件所在的目錄中刪除其Inode號與文件名的記錄,並在目錄的目錄下刪除目標的記錄,將源文件的Inode與文件名記錄添加進去。


在不同分區下mv移動一個文件:(目標不存在的情況下)

若不在同一個分區,移動文件就相當於兩個命令的集合:cp複製和rm刪除。會將源文件的數據與元數據全部複製到目標,並將源文件刪除,在新的分區下給其分配一個新的Inode號


在不同分區下mv移動一個文件:(目標存在的情況下)

若在不同分區下,目標存在,同樣會提示我們是否覆蓋,但是這是在不同的分區下,既然要給這個源文件分配一個Inode,不如索性就是用目標的Inode,所以若不在同一個分區且目標存在,那麼會使用目標的Inode號,並覆蓋其元數據以及數據。



以上的mv移動文件時,Inode號與Block的變化情況,那麼,小編在講rm刪除文件時,先給同學們介紹一下,什麼是軟鏈接,什麼是硬鏈接:

軟鏈接/符號鏈接:

軟鏈接,又稱爲符號鏈接,相當於我們Windows中的"快捷方式",對一個文件創建軟鏈接,就相當於創建一個快捷方式,而這個快捷方式會很小,所以軟鏈接亦是如此。這個軟鏈接存儲的內容是源文件的路徑,所以其會很小,那麼創建一個快捷方式會生成一個文件,創建軟鏈接也會新生成一個文件,所以會給這個軟鏈接分配一個Inode號,對一個文件創建軟鏈接後,可以通過訪問軟鏈接來訪問源文件。無論在不在同一個分區,都會創建一個新的文件分配一個Inode,所以,軟鏈接是可以跨分區的。

ln -s:創建軟鏈接

QQ截圖20171209162556.png

小編給/app/目錄下的zzz/目錄在/tmp目錄下創建了一個軟鏈接,可以清楚的看到該鏈接指向的目錄時/app/zzz,現在,小編在/app/zzz目錄下創建一個文件,當小編訪問的時候訪問/tmp/zzz

QQ截圖20171209162952.png

可以看到,訪問的就是/app/zzz/目錄下的內容。軟鏈接不僅可以對目錄創建,對文件依然可以創建軟鏈接

QQ截圖20171209163413.png

此時訪問這個軟鏈接,訪問的就是指向的這個文件,通過這兩個文件,發現軟鏈接的大小各不相同,這是因爲軟鏈接文件的大小取決於源文件的路徑的長度,而這個路徑可以是相對路徑,也可以是絕對路徑,絕對路徑較簡單,只是用源文件的絕對路徑即可,那麼相對路徑的話,這個相對路徑,是相對於這個鏈接文件而言,而非當前所在的目錄而言,比如說,小編現在在/app/目錄下,要對zzz目錄在/tmp目錄下創建一個軟鏈接,小編使用一下相對路徑

QQ截圖20171209163935.png

小編現在在當前目錄下,使用相對路徑創建了一個軟鏈接,那麼,小編進入/tmp目錄看一下

QQ截圖20171209164102.png

唉??軟鏈接顯示紅色,而且指向的路徑不對呀~~那是因爲,站在這個軟鏈接的角度來考慮,它找不到相對於它所在路徑的相對路徑下的zzz目錄,小編用同樣的方法將軟鏈接創建到/app/目錄下

QQ截圖20171209164529.png

此時這個軟鏈接是可用的,因爲它可以找到它所指向的源文件。

將軟鏈接所鏈接到的源文件刪除後,軟鏈接將不可用,這個小編就不演示啦~~


所以,通過軟鏈接,我們又變相的引出了一個事實,一個文件的Inode中的指針,不僅僅指向的是Block,還有可能指向另一個指針,而另一個指針還可以再指向另一個指針,由其他指針來指向Blck


啊~~小編好累~~嗯...不如先就到這裏吧~~關於硬鏈接,以及刪除文件時候進行的操作,等下一章小編就給同學們補上~~

QQ截圖20170720162736.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章