真正理解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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...