系統如何查找文件?inode號又是什么?

下面分別詳細解釋您提到的三個問題:
文件系統怎么定位文件”、“inode 是什么”、“為什么刪除后還可能被占用”。


一、文件系統怎么定位文件

1.1 目錄與文件名并不直接存儲文件數據

在常見的 Unix/Linux 文件系統(如 ext4、xfs)或類似的文件系統中,目錄(Directory) 只記錄文件名與一個索引指針(例如 inode 號)的對應關系。

  • 當你通過路徑(如 /home/user/test.txt)查找文件時,操作系統會先從根目錄開始,根據每一級文件名,讀取相應目錄文件里的條目,然后找到該文件對應的索引(如 inode號)。

  • 一旦獲得 inode,操作系統才能進一步定位到文件真正的數據塊。

1.2 inode 與數據塊

  • 每個文件都有一個 inode(在類 Unix 文件系統中),包含它的數據塊指針、文件大小、權限、所有者等元數據。

  • 文件系統通過 inode 查找到物理磁盤上的若干塊(blocks),其中存放著文件內容。

  • 所以從目錄 → inode → 數據塊就完成了文件的定位。

1.3 簡化步驟

  1. 用戶輸入文件路徑。

  2. 操作系統逐級進入目錄:

    • 從根目錄 inode(固定位置)開始,找到 /home 目錄;

    • 打開 /home 目錄文件,找到 user 子目錄;

    • 再打開 user 目錄文件,找到 test.txt 的目錄項;

    • 讀到一個 inode 號,例如 12345。

  3. 讀取 inode 號 12345,獲取對應的數據塊指針數組;

  4. 根據數據塊指針,到磁盤上把這些 block 一一讀出來,拼接成文件內容返回給應用程序。


二、inode 是什么?

2.1 inode 的定義

  • inode(索引節點) 是類 Unix 文件系統中的一種數據結構,用于存儲文件的元信息(metadata)。

  • 典型包含:

    1. 文件大小、訪問權限(rwx)、文件所有者(UID/GID)、時間戳(修改時間、訪問時間等);

    2. 數據塊指針(block pointers),告訴操作系統文件內容在哪些磁盤塊上。

2.2 inode 不存儲文件名

  • 在 Unix-like 文件系統中,inode 記錄文件名。文件名只保存在目錄里,用來映射 “文件名 → inode號”。

  • 一個 inode 可能對應多個文件名(硬鏈接),也可能當前沒有任何目錄項引用它(此時如果仍有進程打開它,就還在占用;如果無進程也無目錄項,就會被回收)。

2.3 inode 是如何組織數據塊的?

  • inode 內部會有一些“直接塊指針”、“間接塊指針”等結構:

    • 前若干個指針直接指向數據塊;

    • 當文件過大,直接塊不夠用,還會用“一級間接塊”、“二級間接塊”,間接塊里又存更多數據塊指針;

    • 這樣就能索引到更大范圍的磁盤空間。


三、為什么刪除后還可能被占用?

3.1 “刪除文件”在 Unix-like 的含義

  • 當你執行 rm file 或調用系統調用 unlink(file),系統會刪除目錄項(即“文件名 → inode 號”的映射)并將 inode 的鏈接數減1。

  • 如果鏈接數變為 0,說明沒有任何目錄項再指向這個 inode。

  • 但如果還有進程打開這個文件,內核會維持一個打開文件描述符的計數;只要描述符沒關閉,對應 inode 和數據塊不會釋放。

3.2 已刪除但仍被進程使用

  • 某些場景下,一個進程在打開文件后,你去刪除該文件的名字,該進程仍可以正常讀寫——因為它仍然有一個“打開文件句柄”指向這個 inode。

  • 文件系統不會真正回收 inode 和數據塊,直到最后一個進程關閉該文件描述符。

  • 這就是為什么“文件被刪”但磁盤空間依舊被占用,直到沒有任何進程再用它,就可見到空間被釋放。

3.3 常見案例

  • 日志文件:一個服務進程正在寫日志,管理員刪除了日志文件卻發現磁盤空間沒變小;實際上這時文件名沒了,但后臺進程還持有打開句柄,一直寫到已刪文件里。只有服務重啟或關閉文件后,空間才真正釋放。


四、總結

  1. 文件系統怎么定位文件?

    • 通過目錄文件找到對應的 inode 號,再由 inode 查到磁盤上真正的數據塊。

  2. inode 是什么?

    • 是存儲文件元數據和數據塊指針的結構體,不記錄文件名;名稱保存在目錄項里。

  3. 為什么刪除后可能還被占用?

    • 因為在 Unix-like 下,刪除操作主要是“移除文件名 → inode 映射”。只要進程還有文件描述符指向這個 inode,inode 就不會被釋放;文件的數據塊也不釋放,直到最后一個打開它的進程關閉該文件。

如此便能理解:文件系統刪除一個文件名,不見得立刻把磁盤空間歸還系統;只有當 inode 鏈接數和文件描述符都歸零時,才真正回收。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73759.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

05-SpringBoot3入門-整合SpringMVC(配置靜態資源、攔截器)

1、說明 在01-SpringBoot3入門-第一個項目-CSDN博客中,其實就已經整合了SpringMVC。下面講解怎么配置靜態資源和攔截器 2、配置靜態資源 命名:static(文件夾) 位置:src/main/resources 編寫一個html文件 訪問 http:/…

Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測

聚劃算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測 目錄 聚劃算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 聚劃算!Tran…

樹莓派瀏覽器配置全解析:從輕量系統到網頁應用平臺

樹莓派(Raspberry Pi)不僅是嵌入式開發的入門利器,也因其低成本和強大的社區支持而成為物聯網、數字標牌、教育培訓等領域的熱門平臺。在很多應用中,運行一個瀏覽器并作為 Web 前端展示、操作或交互的能力顯得尤為關鍵。 但在資源…

初識Qt(一)

本文部分ppt、視頻截圖原鏈接:萌馬工作室的個人空間-萌馬工作室個人主頁-嗶哩嗶哩視頻 1. Qt是什么? Qt是一個跨平臺的C應用程序開發框架,它既為圖形用戶界面(GUI)程序開發提供了強大支持,也能用于開發非GUI的控制臺程序、服務端…

六十天前端強化訓練之第三十二天之Babel 轉譯配置大師級深度講解

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎,謝謝大佬! 目錄 一、核心概念與知識體系詳解 1. Babel 工作原理全景解析 二、完整配置方案(帶詳細注釋) 1. 進階版 .babelrc 配置 2. Webpack 集成配置&#xff08…

智能提示詞生成器:助力測試工程師快速設計高質量測試用例

在軟件測試中,測試用例設計方法的選擇和實施是確保軟件質量的重要步驟。測試工程師經常需要根據不同的測試場景、參數維度和業務需求,設計出覆蓋率高且有效的測試用例。然而,設計測試用例并非易事,特別是在面對復雜的業務邏輯時。 為了幫助測試工程師高效生成測試用例提示…

beanie.exceptions.CollectionWasNotInitialized

遇到這樣的情況不要慌,不要慌 1:檢查模型是否已經初始化: class TaskModel(Document):"""定時任務模型"""task_id: str Field(default_factorylambda: str(uuid.uuid4()), # 新增默認值description"任…

【CVE-2025-30208】| Vite-漏洞分析與復現

漏洞簡介 CVE-2025-30208 是 Vite 開發服務器中的一個任意文件讀取漏洞。該漏洞允許攻擊者通過特定的 URL 參數繞過訪問控制,從而讀取服務器上的敏感文件(如 /etc/passwd 或 C:\windows\win.ini)。 該漏洞主要影響以下版本的 Vite&#xff…

將 Markdown 表格結構轉換為Excel 文件

在數據管理和文檔編寫過程中,我們經常使用 Markdown 來記錄表格數據。然而,Markdown 格式的表格在實際應用中不如 Excel 方便,特別是需要進一步處理數據時。因此,我們開發了一個使用 wxPython 的 GUI 工具,將 Markdown…

Golang使用 ip2region 查詢IP的地區信息

利用 ip2region 進行 IP 地址定位 import ("fmt""log""github.com/lionsoul2014/ip2region/binding/golang/xdb" )func main() {ip : "213.118.179.98"dbPath : ".\\cmd\\ip\\ip2region.xdb"// 1、初始化查詢器//searcher,…

對匿名認證的理解

概述:在 Spring Security 中,** 匿名認證(Anonymous Authentication)** 是一種特殊的認證機制,用于處理未提供有效憑證的請求。 匿名認證的本質 目的:允許未認證用戶訪問特定資源。原理: 當請求…

C++調用Python

Python安裝 地址: python官網 可以根據需要下載對應的版本。 調用python python測試腳本 # my_script.py import sys import jsondef calculate(a, b):return a * b 10 # 示例計算邏輯if __name__ "__main__":# 從命令行參數讀取 JSON 字符串try…

工程數字建造管理系統平臺有哪些?好的數字建造管理系統推薦

一、什么是工程數字建造管理系統平臺? 工程數字建造管理系統平臺是一種集成了先進信息技術(如云計算、大數據、物聯網等)的綜合性管理工具,它旨在通過數字化手段提升工程建造全過程的管理效率和決策水平。這一平臺不僅覆蓋了工程…

Android開發EmojiCompat 初始化

Android開發EmojiCompat 初始化 報錯信息: ensure spannable:java.lang.IllegalStateException: EmojiCompat is not initialized 在Application上寫上下面代碼即可: EmojiCompat.Config config new BundledEmojiCompatConfig(this);EmojiCompat.in…

【Go】數組

數組Array 重點: 數組是值類型 注意點: 1. 數組:是同一種數據類型的固定長度的序列。2. 數組定義:var a [len]int,比如:var a [5]int,數組長度必須是常量,且是類型的組成部分。一旦定義&…

CORDIC算法:三角函數的硬件加速革命——從數學原理到FPGA實現的超高效計算方案

計算機該如何求解三角函數?或許你的第一印象是采用泰勒展開,或者采用多項式進行逼近。對于前者,來回的迭代計算開銷成本很大;對于后者,多項式式逼近在較窄的范圍內比較接近,超過一定范圍后,就變…

【剪輯_BGM 整合】

【優質BGM?以剪映為基礎】 自定義 一、舒緩愜意 二、輕快 1,快樂騎行 2,醫療科普 3,宣傳片勵志搖滾熱血 Going back to Business 4,電子寵物(memories) 5,詩與遠方(熱播&…

linux 常見命令使用介紹

Linux 常見命令使用介紹 Linux 是一個功能強大的操作系統,其核心是命令行工具。掌握一些常用的 Linux 命令可以極大地提高工作效率。本文將詳細介紹一些常見的 Linux 命令及其用法。 1. 文件與目錄操作 ls - 列出文件和目錄 # 查看當前目錄下的所有文件和子目錄&…

Rust從入門到精通之精通篇:24.高級異步編程

高級異步編程 在 Rust 精通篇中,我們將深入探索 Rust 的高級異步編程技術。Rust 的異步編程模型基于 Future 特征和異步運行時,提供了高效的非阻塞 I/O 和并發處理能力。在本章中,我們將超越基礎知識,探索如何構建高性能異步系統…

(C語言)學生信息表(基于通訊錄改版)(測試版)(C語言項目)

1.首先是頭文件: //student.h //頭文件//防止頭文件被重復包含#pragma once//宏定義符號常量,方便維護和修改 #define ID_MAX 20 #define NAME_MAX 20 #define AGE_MAX 5 #define SEX_MAX 5 #define CLA_MAX 20 //定義初始最大容量 #define MAX 1//定義結…