真正理解linux的inode?

来源:https://www.cnblogs.com/fqnb001/archive/2018/04/10/8778871.html
-Advertisement-
Play Games

linux 在整個架構上可以看作是三層: 1.底層代碼, (引導層strip) 跟硬體溝通的那一層的代碼(可能是彙編+c), 驅動底層的; strain: n./v. 拉緊, 張力, 氣質, 風格, 樂曲(這個詞的意思很多): 中間層代碼, OS層,用來管理文件系統,記憶體,作業調度等. 裡面的實現包 ...


linux 在整個架構上可以看作是三層: 1.底層代碼, (引導層strip) 跟硬體溝通的那一層的代碼(可能是彙編+c), 驅動底層的; strain: n./v. 拉緊, 張力, 氣質, 風格, 樂曲(這個詞的意思很多): 

  1. 中間層代碼, OS層,用來管理文件系統,記憶體,作業調度等. 裡面的實現包括很多文件,或 各種各樣的數據結構, 資料庫等等, (資料庫也是由分散的文件構成的吧), 其中inode等等就是在這裡支撐用戶接觸層的東東

  2. 表現層代碼, 就是我們所看到的, 我們所接觸的那些東西, 包括目錄結構, 文件等等.


linux內核用 數字 管理文件系統, 記憶體, 進程等等, 是為了 方便, 簡潔. 因為文件名稱, 進程名稱是很長很多 很占位元組的東西, 讓內核 去接觸這些東西, 很累! 通過這些 實體的編號, id來管理它們就 撇脫 多了.

進程 通過 pid 來管理, 進程名稱是pid的別名; 文件 通過 inode來管理, 文件名稱是inode的別名;


inode的讀法: i-node : [ai ' n2ud]: i: 可以認為是id, identifier , 所以讀成: [ai] , node是節點, 代表著對應文件的實體.


參考這篇關於inode的文章

linux上的inode編號是索引節點的編號。理解inode,要從文件儲存說起。

  文件儲存在硬碟上,硬碟的最小存儲單位叫做"扇區"(Sector)。每個扇區儲存512位元組(相當於0.5KB)。 ** (如果把硬碟當作 一把稱, 就是說, 它的最小刻度, 最小能夠稱出的重量 , 最大精度, 最多能夠稱出的, "只能打得起...多重?")

 這種由多個扇區組成的"塊",是文件存取的最小單位。所以 即使文件內容只有1個byte

操作系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是文件存取的最小單位。"塊"的大小,(需要折中, 在效率和磁碟利用率的矛盾上折中!) 最常見的是4KB,即連續八個 sector組成一個 block。

  文件數據都儲存在"塊"中,那麼很顯然,還必須找到一個地方儲存文件的元信息(metadata, 就是文件的"屬性, 描述信息"!) ,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。

每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。(區域叫inode, 區域的編號叫inode 編號, inode號碼)!

這裡值得重覆一遍,Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。 對於系統來說,文件名只是inode號碼便於識別的別稱或者綽號。錶面上,用戶通過文件名,打開文件。實際上,系統內部這個過程分成三步:

首先,系統找到這個文件名對應的inode號碼;(對應的文件或資料庫表: 比如叫做: "文件名-inode表") 其次,通過inode號碼,獲取inode信息; 最後,根據inode信息,找到文件數據所在的block,讀出數據。

文件數據都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。

二、inode的內容 inode包含文件的元信息,具體來說有以下內容:   * 文件的位元組數   * 文件擁有者的User ID   * 文件的Group ID   * 文件的讀、寫、執行許可權   * 文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。   * 鏈接數,即有多少文件名指向這個inode   * 文件數據block的位置

可以用stat命令,查看某個文件的inode信息: stat example.txt

三、inode的大小

  inode也會消耗硬碟空間,所以硬碟格式化的時候,操作系統自動將硬碟分成兩個區域。一個是數據區,存放文件數據;另一個是inode區(inode table),存放inode所包含的信息。

  每個inode節點的大小,一般是128位元組或256位元組。inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設置一個inode。假定在一塊1GB的硬碟中,每個inode節點的大小為128位元組,每1KB就設置一個inode,那麼inode table的大小就會達到128MB,占整塊硬碟的12.8%。

  查看每個硬碟分區的inode總數和已經使用的數量,可以使用df命令。

  代碼如下:

  df -i

  查看每個inode節點的大小,可以用如下命令:

  代碼如下:

  sudo dumpe2fs -h /dev/hda | grep “Inode size”

  由於每個文件都必須有一個inode,因此有可能發生inode已經用光,但是硬碟還未存滿的情況。這時,就無法在硬碟上創建新文件。

使用ls -i命令,可以看到文件名對應的inode號碼: ls -i example.txt

----------------------------------------- 什麼叫dirent? LINUX系統下的一個頭文件,在這個目錄下/usr/include 為了獲取某文件夾目錄內容,所使用的結構體。 引用頭文件#include結構體說明 編輯 struct dirent { long d_ino; /* inode number 索引節點號 / inode: 表示區域, inode number才是節點號. off_t d_off; / offset to this dirent 在目錄文件中的偏移 / unsigned short d_reclen; / length of this d_name 文件名長 / unsigned char d_type; / the type of d_name 文件類型 / char d_name [NAME_MAX+1]; / file name (null-terminated) 文件名,最長256字元 */ }

五、目錄文件

  Unix/Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件。

  目錄文件的結構非常簡單,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號碼。

  ls命令只列出目錄文件中的所有文件名:

  代碼如下:

  ls /etc

  ls -i命令列出整個目錄文件,即文件名和inode號碼:

  代碼如下:

  ls -i /etc

  如果要查看文件的詳細信息,就必鬚根據inode號碼,訪問inode節點,讀取信息。ls -l命令列出文件的詳細信息。

  代碼如下:

  ls -l /etc

----------------------------------- 軟鏈接和硬鏈接? 目的: 都是為了使用的方便. (如同一個人, 可以有多個名字, 父母叫的乳名, 長輩叫的小名, 同事叫的書名, 下屬叫的尊稱等等)

表現: 都是多個名字對應著同一個inode. inode: 文件名 = 1:N 是1對多的關係!

語法: ln 源文件 目標文件. ln -s 源文件或目錄名 目標文件或目錄

    << 根據 源和目標, 就可以確定 哪個是依賴, 那個是被依賴..  "源文件" 是最開始最根本被依賴的東西!)
        源文件就是 原始 文件>>

區別: 硬鏈接, 各個文件的內容都相同! 都是真正的file data! 彼此之間的地位是相同的, 沒有依賴性, 刪除一個, 不影響另一個! 硬鏈接的主要目的是: 為了防止對重要文件的"誤刪". 有些 : "類似" 複製備份, 但是不是複製 備份! 硬鏈接的限制: 只能對文件, 不能對目錄 ! 創建硬鏈接; 只能在同一分區內創建...

    軟鏈接,  兩個文件的內容不同.  ln -s  A  B,  就是 A文件是源文件, B依賴A,  A是源, B是目標文件, 
            A是包含真正的內容, B的內容是A的路徑,  對B的訪問將跳轉到對A的訪問.    
            
            也叫軟連接。軟鏈接文件有類似於Windows的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。      這就允許符號鏈接(經常簡寫為symlinks)指向位於其他分區、甚至是其他網路硬碟上的某個文件

----------------------------------------------------------軟鏈接和硬鏈接? (完)

八、inode的特殊作用

  由於inode號碼與文件名分離,這種機制導致了一些Unix/Linux系統特有的現象。

  1. 有時,文件名包含特殊字元,無法正常刪除。這時,直接刪除inode節點,就能起到刪除文件的作用。

  2. 移動文件或重命名文件,只是改變文件名,不影響inode號碼。

  3. 打開一個文件以後,系統就以inode號碼來識別這個文件,不再考慮文件名。因此,通常來說,系統無法從inode號碼得知文件名。

  第3點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重啟。因為系統通過inode號碼,識別運行中的文件,不通過文件名。更新的時候,新版文件以同樣的文件名,生成一個新的inode,不會影響到運行中的文件。等到下一次運行這個軟體的時候,文件名就自動指向新版文件,舊版文件的inode則被回收。

  九、實際問題

  在一臺配置較低的Linux伺服器(記憶體、硬碟比較小)的/data分區內創建文件時,系統提示磁碟空間不足,用df -h命令查看了一下磁碟使用情況,發現/data分區只使用了66%,還有12G的剩餘空間,按理說不會出現這種問題。 後來用df -i查看了一下/data分區的索引節點(inode),發現已經用滿(IUsed=100%),導致系統無法創建新目錄和文件。

  查找原因:

  /data/cache目錄中存在數量非常多的小位元組緩存文件,占用的Block不多,但是占用了大量的inode。

  解決方案:

  1、刪除/data/cache目錄中的部分文件,釋放出/data分區的一部分inode。

  2、用軟連接將空閑分區/opt中的newcache目錄連接到/data/cache,使用/opt分區的inode來緩解/data分區inode不足的問題:

  ln -s /opt/newcache /data/cache

,任何一個目錄的"硬鏈接"總數,總是等於2加上它的子目錄總數(含隱藏目錄),這裡的2是父目錄對其的“硬鏈接”和當前目錄下的".硬鏈接“。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近期,通過實現shell瞭解了輸入重定向,輸出重定向,管道- 用自己的話總結定義: 輸入重定向:把<右邊的文件的內容輸入到<左邊的命令中。 輸出重定向:把運行>左邊命令得出的結果輸入到>右邊的文件中。 (若以>輸出到一個已經存在的文件中,那麼文件就會被覆蓋掉,如果想追加內容而不想刪除原來文件的內容則 ...
  • 註:這是一個沒什麼鳥用的功能。不過也算是一種拓展。 通常在那些"一鍵化部署"的shell腳本中,可能需要使用ssh執行遠程命令來實現一些簡單的自動化,這些遠程命令可能需要執行一段時間才能結束(如yum命令)。例如,遠程ssh配置yum源,遠程ssh安裝軟體包。 為了讓腳本實現"並行"執行,這個遠程s ...
  • Installing tmux 2.3 on CentOS Prerequites libevent libevent devel libevent headers curl Installing tmux ...
  • 筆者使用的是華碩FX50J裝的雙系統,之前使用過Dell的游閘安裝過,但是沒有碰到那麼多問題。所以覺得有必要記錄下。安裝雙系統之前,電腦先安裝了win10(win10也崩過幾次)。下麵開始安裝雙系統步驟。 1.UltraISO安裝系統U盤 這一步應該不用過多講述,無論是安裝windows還是ubun ...
  • 添加-m參數 ...
  • 學習Linux 目錄操作 1、pwd 可以看當前目錄路徑 2、cd change directory 改變目錄,切換目錄 cd / 進入跟目錄 cd ..返回上級目錄 cd 進入用戶主目錄 cd ../.. 返回上兩級目錄 可以使用TAB鍵來快速輸入 3、ls 顯示所有目錄,ls 文件夾,為看此目錄 ...
  • 1.安裝jdk,配置jdk環境(此步驟略過) 2.下載安裝tomcat 百度網盤鏈接: https://pan.baidu.com/s/1Ieejo7TQyzRAVPhQft8Phw 密碼: dg2v 下載之後對tomcat壓縮包進行解壓 # tar xzf apache-tomcat-7.0.85 ...
  • 1. 右鍵點擊任務管理器 2.打開資源監視器 3.搜索任務,結束任務(可能會死機) ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...