1. 程式人生 > >從零開始的linux 第二十章(Inode以及Block詳解其一)

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

inode以及block詳解(其一)

從零開始的linux 第二十章


hello~~又是一周來臨惹~~,小編即使再忙,也要抽出時間給同學們講課~而且...還沒有工錢...

技術分享圖片

你們再也找不到怎麽敬業並且愛著你們的小編惹~~是不是呀~路人甲~~

技術分享圖片

(↑害羞的路人甲)

路人乙:“小編!!你又逗路人甲!!”

怎麽?難道小編哪一周不再更新了,路人乙不想小編麽??(可憐的表情)

(臉紅的傲嬌)路人乙:“我....才不可能會”

2333好啦~~開玩笑的,那麽,為了節省同學們的時間以及小編的時間,小編就不再廢話啦~開始這一章的主題~~


上一章,小編給同學們詳細介紹了 mv 移動文件的命令,嗯....有同學說小編那並不是詳解,小編很委屈的說~~小編有句話不知道要不要講

...不...小編有句話一定要講,實際上,mv命令對我們來講,其兩個選項就已經夠用了,並且小編在上一章中提到有些專業術語,在第...嗯..第十八章中詳細介紹的cp復制文件的命令中都有解釋的~~每個命令同學們不用過深的研究它的各個選項的用法,Linux中的命令辣麽多,怎麽可能全部記得住呢~~所以,在一些不知道命令如何使用的情況下,小編在很早的時候就給同學們講過如何查看命令的使用幫助~同學們只需要查看幫助,就能很快的知道如何使用啦~~


小編在上一章結束的時候,有告訴過同學們這一章小編要給同學們介紹什麽是inode以及block,不知道同學們在下面有沒有復習呢~~嘛~無所謂啦~反正有小編在嘛~不過,也不能太依賴小編講的課,同學們還是要靠自己理解的~~


什麽是文件的Inode和Block呢?

Block:

Block就是存儲數據的數據塊,在計算機的物理設備中,磁盤也成為硬盤,用來存儲數據。而這些數據又有元數據和數據兩種,元數據就是文件的屬性,小編之前給同學們講過,這裏就不多說啦,而Block存放的是真實的數據。


當我們向文件中寫入內容時,系統會給我們分配Block塊來存儲這些數據,一個block的大小通常在格式化文件系統的時候就被指定,一般為1KB,2KB,4KB;額...格式化文件系統小編還沒有講到,同學們先有這個概念,以後小編講磁盤管理時候會講到的~~那麽回歸主題~顯然,一個block對於一些數據量較大的話,一個block是無法存下的,此時系統會再給該文件分配block,直到能夠存下該數據為止。


那麽,系統中的block並不是無限的,(小編這裏說"系統中的block"可能會不準確,但是也是沒有太大問題的~)block的多少,取決於物理磁盤(硬盤)的大小,磁盤越大,能夠被分配的block就越多;因為磁盤越大,分區能夠分的空間就越多,格式化文件系統時的block就越多,它們是成正比的;但是,雖然block的多少由磁盤大小決定,但這是總個數,小編在第一章給同學們介紹了安裝虛擬機,在此期間簡單的說明了給磁盤分區,那麽,為什麽要給磁盤分區呢?


分區並不是把數據分開存放,在物理上,這些不同分區下的數據還是存放在了同一個地方,即都存放在物理硬盤上。我們對一個硬盤進行分區,並給該分區一個文件系統,只是在邏輯層把他們分開(註意哦~是邏輯層),這樣若其中一個分區出了問題,並不會影響其他分區,在邏輯上把他們分開,但實際上,存在硬盤上的數據依然是無序存放的(沒有順序存放的)。

既然是在邏輯層的劃分,那麽block也應該會被劃分開,所以,每個分區中的存儲大小實際上就是劃分的block的多少,分區的存儲量大的,block自然就分的多。


小編上面也說過,雖然在邏輯層對磁盤進行了分區,每個分區都有一個文件系統,數據存在不同的分區下,但實際上,這些數據在磁盤上,依然是無序存放的,既然是無序存放,那我們是如何來找到相對應的數據的呢?


Inode:

為了找到磁盤上這些無序的數據,我們需要一個"指針",帶著我們找到這個數據。就像賓館中有那麽多房間,要如何精確的表示一個房間呢?它們都會用一個 樓層號+房間號 來精確的表示單個房間,如:0405號表示四樓的第五號房間。嗯..小編覺得已經描述清楚了,所以,這裏的"指針"也是相同的意思,而這個帶著我們找到數據的"指針",我們稱它為:文件的Inode號.但,僅因為這個稱為文件的Inode或許不準確,因為他還包括其文件的其他信息。


既然是文件的Inode,說明每個文件,包括目錄都有對應的Inode。block中存放的是數據,那麽元數據呢?沒錯,Inode號就包含了文件的元數據:權限(mode)、文件的所屬人和所屬組信息、文件的大小、時間戳、指針。當我們在分區下創建一個文件或目錄時,會給該文件分配一個Inode號,Inode中包含了文件的所有元數據,那麽為什麽沒有文件名呢?實際上,文件的名稱僅僅是用來給用戶來看的,實際上,每個文件在文件系統中是以Inode號來標識該文件的,這個Inode號的指針負責指向其數據塊(Block),所以,Inode號在相同分區下應該是一個唯一的值,在小編還沒有給同學們講硬鏈接的時候,同學們可以這麽理解。


為什麽說它在相同分區下是唯一的呢?同學們可以試想一下,小編還用賓館的房間號為例,其中一家賓館中有0201這個房間號,難道別的賓館就不能有0201這個房間號呢麽?答案肯定是否定的。這不同的賓館就相當於不同的分區。同學們可以再試想一下,兩個賓館都有0201這個房間,但房間裏面的設施以及裝修的樣式都不會相同對不對~這裏依然是一樣的,不同的分區下會有相同的Inode號,但其指向的數據是不相同的,因此,Inode號也不能跨分區,因為在別的分區中也有與之相同的Inode


同學們可以再試想一下,其賓館中的房間是有限的,所以每個房間的房間號也是有限的,賓館的規模越大,建的房間就越多,房間號也就越多。這裏亦是如此,一個分區下,文件的Inode號是有限的,分區的大小越大,Inode號就越多。這也就意味著,分區下文件的數量就也就有限的,即使存儲的空間大小還有很多,一旦沒有了Inode號,是否就無法再創建文件了呢?


那麽,小編就帶大家來實驗一下~~(註意哦,小編會用到一些沒有講到的命令,先給同學們簡單提一下~)

在Linux中,我們可以先用 df 命令來查看分區的掛載及空間使用情況,註意,以/dev/開頭的才是磁盤的分區:

技術分享圖片

其中,blocks總空間大小單位是KUsed是已經使用的空間大小Use%已經使用的空間大小占總大小的百分比

我們可以通過 df -i 來查看分區Inode號使用情況:

技術分享圖片

↑其中,Inodes是該分區下的Inode號的數量IUsed是已經使用的Inode號的數量IFree是空閑的Inode號數量IUse%是已經使用的Inode數量占總數量的百分比

那麽,我們測試還在/app/目錄下測試,小編剛才說過,每創建一個文件就會分配一個Inode號

技術分享圖片

而小編創建一個空文件,用 ls -l命令查看文件的詳細信息,被小編高亮顯示的部分表示的是普通文件的大小,可以看到,空文件大小是0,也就是說,無論小編創建多少個空文件,它的大小也不會把/app/分區的空間用滿,小編就在這個目錄下創建出24413689個文件:

技術分享圖片

嗯...這個操作小編還沒有跟同學們講,下一章就講咯~~因為文件過多,所以創建時候會很慢,這裏小編故意多創建一個文件

....五分鐘後...

哇~~太慢了,不實驗啦不實驗啦~~

技術分享圖片

現在Inode到了10萬,還需要好多,嘛~~小編就不演示啦~~同學們只需要知道,當分區下的Inode用完之後,無論空間還有多少的剩余,都將無法再創建文件。


路人甲:“小編大人~我有個問題想問~”

等等,小編知道你想問什麽,你是想問,文件的文件名稱是給用戶看的,linux中是用Inode來區分文件的,你是想問為什麽文件名相同的時候會發生沖突的對不對??

路人甲:“是的,沒錯”

嗯...路人甲這個問題問的好~

Linux中確實用Inode號來標識一個文件的,而當我們呢創建一個文件並對文件命名時,會分配給該文件一個Inode號,而block是寫入數據的時候才會分配的。

小編此前給同學們講 ls 命令的時候講到過,用 ls -i 來查看一個文件的Inode號

技術分享圖片

可以看到,該文件的Inode號是67,小編再在該目錄下創建一個目錄,並查看其Inode號

技術分享圖片

這個目錄的Inode號是68,那麽,小編用 ls -l 來查看他們兩個的文件大小

技術分享圖片

可以看到,該普通文件的大小是 0,而目錄中沒有任何文件,但其大小是6,小編現在從別的目錄中找一個有數據的文件並將其復制到/app/zxc/目錄下

技術分享圖片

技術分享圖片

可以看到,原本的passwd文件的大小是2321字節,但復制到/app/zxc/目錄下之後,原本6字節的目錄,現在卻只有20字節,但是passwd這個文件本身的大小復制到該目錄下後並沒有發生改變,這究竟是為什麽呢?


實際上,當我們用 ls -l 來查看目錄的詳細信息時,顯示目錄大小的地方僅僅顯示的是目錄本身的大小,而不是目錄以及該目錄下面所有文件的總大小,這一點與我們平時用的windows是不相同的。


所以,原本目錄自身的大小是6字節,為什麽復制進去一個2321字節的文件後,目錄自身的大小卻變成了20字節呢?而這多出來的14字節究竟存放的是什麽?


在linux中,目錄存放的不是文件的數據,小編上面講過,數據在磁盤中無序存放,文件上的Inode中的指針幫我們指向了其數據塊(block)的位置,而目錄中所存放的,不是一個一個的文件,而是該目錄下文件的名稱以及文件名稱對應的Inode號,所以在文件的父目錄上有文件名對應的Inode的記錄,因此我們在相同目錄下創建兩個相同名稱的文件為什麽會沖突,這個問題也就解開了~~



那麽我們平時在復制文件、移動文件以及刪除文件的時候,底層都是做了哪些操作呢?Inode中的指針除了指向數據庫(Block)還可以指向什麽呢??



小編就帶給同學們這麽一個問題,抱著好奇的心理來期待小編的下一章吧~~~


唉??不知不覺就已經這麽晚惹~~同學們早點休息哦~~




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