inode
磁盤存儲的最小單位是扇區(sector),8個sector組成一個block,每個block大小爲4k 操作系統讀取磁盤時,以block爲單位。
系統存儲文件的數據,分爲兩種。元數據和數據塊。同樣,硬盤存儲也在系統格式化的時候被分爲兩部分。分別存儲元數據和數據塊。
元數據:
元數據是存儲文件元信息的地方。這些元信息包括:文件創建者,文件所屬組,文件權限信息,文件時間信息,文件類型(regular file,character special file,block special file,symbolic link 等等),文件大小,文件鏈接數,文件數據block的位置等等。除了文件名之外的所有信息都存儲在這個元數據裏面。
這些元數據可以通過命令stat查看。
爲什麼沒有文件名呢?
操作系統並不使用文件名,而是通過inode來是被不同的文件。當讀取文件時,系統通過文件名能夠查找到該文件的inode,當文件被打開後,系統對文件的操作都是通過inode了,不再需要文件名了。所以元數據中不需要文件名。文件的文件名,就好像是操作系統之間的橋樑。
查看某個文件對應的inode:
可得,該系統的inode大小爲4k
那麼這個文件名和inode直接的對應關係,是在哪裏查找的呢?
文件夾的表結構信息。 目錄也是一種文件,這個文件保存了很多的目錄項(dirent),這些目錄項裏面存儲有文件名和inode的對應關係。
不同的權限對目錄的效果?
如果只有只讀權限,只能反問目錄的目錄項,獲得文件的inode,並不能訪問inode的所有相關信息。 如果有了執行權限,就可以獲取inode的相關信息了。
inode的大小
查看inode的字節數
inode的結構
元數據存儲在inode table中,每個文件的元數據條目,成爲inode entry 不同的文件系統中,inode結構不同。以前曾經有過13指針的結構,現在常用在ext4文件系統中的是15指針的結構:
12個直接指針:每個指針指向4096k(1個block大小)的數據塊,所指向內容大小:4k*12=48k
1個間接指針:該指針指向一個4096k大小的數據塊,該數據塊存儲着指向內容數據塊的指針,一共4k1024個(每個指針32位,所以每個指針佔4個字節),共10244k=4M
1個2重間接指針:所指向內容大小:1024*4M=4G
1個三重間接指針:所指向內容大小:1024*4G=4T
數據塊:
數據塊是存儲具體文件內容的地方。數據塊的訪問是通過inode中的數據塊指針訪問的。
軟鏈接和硬鏈接的inode
軟鏈接的inode和源文件是不同的。但是軟鏈接的文件名指向源文件的文件名,軟鏈接文件通過源文件來獲取inode,然後訪問文件的具體內容。軟鏈接相當於新建了一個文件,所以他們的inode是不同的。
軟鏈接可以不在同一分區。
硬鏈接相當於文件的“別名”,硬鏈接與源文件在目錄的目錄項中存有相同的inode。指向某個inode的文件名數,就是硬鏈接數,每增加一個,會在ll時顯示出來。 硬鏈接必須在同一個分區中,不能跨文件系統。
文件的刪除,只是刪除了目錄項中,文件名、inode與存儲塊之間的關係,並不會直接清除掉存儲塊處的數據,所以數據刪除後,是可能恢復的。如果想要刪除掉存儲塊處的數據,只需要做一次大量的拷貝或者格式化該分區。
對於文件夾,可以創建軟鏈接,但是不能夠創建硬鏈接。
圖中,/root/Downloads文件夾不能夠建立硬鏈接,卻有2個別稱,這是因爲/root/Downloads目錄下面/root/Downloads/. 這個鏈接的存在。 而/root文件夾有27個別稱,這是因爲/root下面的每個文件夾中,都有一個指向/root的別稱/root/A/..
文件新建時,系統會自動給文件一個inode,來標識這個文件。 當文件讀取時,會產生一個文件描述符:fd(file description)。
inode空間和硬盤空間
others: 超級塊(superblock),佔據1號物理塊,作用於文件系統上,是文件系統的控制塊。如果訪問一個分區,首先要訪問的是該分區的超級塊。超級塊的數據損毀後,整個磁盤都有可能壞,所以需要經常備份超級塊。 `