探索文件系統:軟硬鏈接的奧秘

目錄

1.文件系統

1.1 磁盤物理存儲結構

1.2 磁盤邏輯存儲結構

1.3 inode編號

2. 軟硬鏈接

2.1 軟鏈接

2.2 硬鏈接

2.3 目錄文件的軟硬鏈接


1.文件系統

在一臺電腦中,大部分文件都不是被打開的,這些文件都在磁盤中進行保存。已經打開的文件需要管理,沒有被打開的文件同樣需要管理,所以需要文件系統

1.1 磁盤物理存儲結構

磁盤是一種用于存儲數據的硬件設備,通常分為機械硬盤(HDD)和固態硬盤(SSD)兩大類。機械硬盤通過旋轉的磁性盤片和磁頭讀寫數據,而固態硬盤則使用閃存芯片,沒有機械部件。因為大容量磁盤比較便宜,大型公司還是使用磁盤,我們這里講解一下磁盤的結構。

磁盤的主要組成部分:

  • 盤片(Platter):表面覆蓋磁性材料的圓形金屬片
  • 磁頭(Head):讀寫數據的電磁組件
  • 磁道(Track):盤片上的同心圓環
  • 扇區(Sector):磁道的最小存儲單元(通常512字節或4K)
  • 柱面(Cylinder):所有盤片同一磁道組成的立體結構

一個盤面可以有很多個同心磁道,一圈磁道可以有很多扇區,扇區是磁盤最小的存儲單元。

如果我們想向一個扇區寫入,我們尋址的過程是這樣的:

  1. 確定盤面
  2. 確定磁盤
  3. 確定扇區

1.2 磁盤邏輯存儲結構

我們把磁盤抽象成連續的線性空間。

那我們如何尋找一個扇區呢,我們可以給每個扇區編號,比如1~100000第一面,100001~200000第二面,對磁盤的管理就變成了對數組的管理。

操作系統中,可以按照扇區為單位進行存取,也可以基于文件系統,按照文件塊為單位進行存取。一個文件塊可以有多個扇區組成,這樣可以更好的應用空間局部性原理,就可以理解為什么說磁盤是塊設備了,即按照塊的大小從磁盤中讀取數據。

1.3 inode編號

文件系統時如何實現并找到我們的文件的呢?文件系統為每個文件分配一個inode編號,通過inode編號進行查找。

Linux ext2文件系統,上圖為磁盤文件系統圖(內核內存映像肯定有所不同),磁盤是典型的塊設備,硬盤分區被劃分為一個個的block。一個block的大小是由格式化的時候確定的,并且不可以更改。例如mke2fs的-b選項可以設定block大小為1024、2048或4096字節。而上圖中啟動塊(Boot Block)的大小是確定的,

  • Block Group:ext2文件系統會根據分區的大小劃分為數個Block Group。而每個Block Group都有著相同的結構組成。

  • Datablocks:數據區存放文件內容。
  • inode Table(inode表):struct inode inode_table[N]

inode Table中有很多inode結構體,一般情況下一個文件一個inode,且在整個分區具有唯一性。不同分區可以裝不同的操作系統。

struct inode
{大小,權限,擁有者,所屬組,修改時間,inode編號,引用計數;int blocks[N];
}

inode存放文件的屬性信息,Data blocks中存放文件的內容。其中inode編號不同表示不同文件,其中 block[N] 表示所用塊的下標,N一般不會太大,比如N是15時,0~10使用直接映射,11~12使用二級映射,13~14使用三級映射,可以跨組存儲。

  • inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。
  • 塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用。一個比特位表示一個塊。
  • GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息,有興趣的同學可以深入了解。
  • 超級塊(Super Block):存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block的信息被破壞,可以說整個文件系統結構就被破壞。超級塊不是每個塊組都有,一般只有3~4個塊組有。

用戶使用操作系統時使用的是文件名,而內核只使用inode編號,所有我們的目錄文件中存儲的就是該目錄下文件與inode編號的映射。

inode編號同一分區內唯一,不同分區inode編號可以相同,那么操作系統如何判斷相同inode編號的文件在那個分區的呢?

  • 訪問文件時都是需要知道該文件的目錄,不同目錄創建時會通過掛載知道屬于哪個分區。

2. 軟硬鏈接

通過 ln -s 指令可以為文件建立軟鏈接,不加 s 為文件建立硬鏈接。

ln -s 文件名 鏈接名

2.1 軟鏈接

為log建立軟連接,通過 ls -l -i? 可以看到文件第一個屬性是inode編號。

ln -s log log.soft.link

可以看到文件和其軟鏈接inode編號不同,可以判斷出這是兩個不同的文件,軟鏈接是一個獨立的文件。軟鏈接內容是指向目標文件的路徑,類似于windows的快捷方式。

軟鏈接的文件屬性是 l,說明是鏈接文件。

2.2 硬鏈接

為hello文件創立一個硬鏈接。

ln hello hello.hard.link

可以看到普通文件與其硬鏈接inode編號相同,硬鏈接不是一個獨立的文件,且文件屬性是 - ,普通文件。

那硬鏈接是什么呢?硬鏈接是在指定的的目錄內部添加一組映射關系(文件名<-> inode編號)。inode編號相同,訪問磁盤時也是訪問相同的inode。

第三個屬性就是該文件的硬鏈接數,當一個文件的硬鏈接數是0時,該文件才算是真正地被刪除。在文件系統層面,inode內部有引用計數,表明有幾個文件名與inode編號有映射關系

2.3 目錄文件的軟硬鏈接

創建一個新文件和一個新目錄

mkdir newdir
touch newfile

可以發現新普通文件的硬連接數時1,而新目錄的硬連接數是2。我們可以通過 ls -a,可以看到 . 和 .. 兩個隱藏目錄文件,. 代表當前目錄,.. 代表上一級目錄。本級的 newdir?和 newdir 中的 .?都指向該目錄,所以新建目錄的硬連接數是2,當 newdir 中每新建一個目錄,newdir 的硬鏈接數都會加1,因為在 newdir 中新建的目錄中都有 .. 指向 newdir 。

. 與 .. 都屬于目錄的硬鏈接,但是用戶是不能給目錄文件建立硬鏈接。因為在執行一些查找命令時會通過目錄查找,會陷入循環,且硬鏈接文件是普通文件,可能繞過權限檢查,當然還存在其他等等問題。

用戶是可以為目錄建立軟鏈接的,因為軟鏈接可以通過文件屬性 l 分辨出。

本篇結束!

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

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

相關文章

3x3矩陣教程

3x3矩陣教程 1. 簡介 三維矩陣是線性代數中的重要概念&#xff0c;用于表示三維空間中的線性變換。本教程將介紹如何使用C實現三維矩陣的基本運算和變換。 2. 代碼實現 2.1 頭文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度學習前置知識

文章目錄介紹數據操作張量張量的定義1. **張量的維度&#xff08;Rank&#xff09;**2. **張量的形狀&#xff08;Shape&#xff09;**簡單的數據預處理&#xff08;插值線性代數微積分概率論1. 基本概念(1) 隨機試驗與事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…

XSS學習總結

一.XSS概述 跨站腳本攻擊&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一種常見的網絡安全漏洞&#xff0c;攻擊者通過在網頁上注入惡意腳本代碼&#xff0c;從而在用戶的瀏覽器上執行惡意操作。這些腳本可以是 JavaScript、HTML 或其他網頁腳本語言。一旦用…

計算機網絡中:傳輸層和網絡層之間是如何配合的

可以把網絡層和傳輸層想成一個“快遞系統”&#xff1a; 網絡層&#xff08;IP 層&#xff09; 郵政系統&#xff1a;只負責把“包裹”&#xff08;IP 數據報&#xff09;從 A 地搬到 B 地&#xff0c;不保證順序、不保證不丟、不保證不重復。傳輸層&#xff08;TCP/UDP 層&am…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 用戶登錄實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解用戶登錄實現 視頻在線地址&#xff1a; …

Redis主從復制數據同步實現原理詳細介紹

文章目錄一、主從復制的概念二、全量復制&#xff08;完整重同步&#xff09;三、增量復制&#xff08;部分重同步&#xff09;1. 增量復制的核心思想2. 增量復制的實現3. 復制偏移量&#xff08;replicationoffset&#xff09;4. 復制積壓緩沖區&#xff08;replicationbacklo…

docker 軟件bug 誤導他人 筆記

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方隨便修改安裝命令&#xff0c;這個在4.4一下是無法使用的&#xff0c;存在誤導他人

Python 進階(六): Word 基本操作

目錄 1. 概述2. 寫入 2.1 標題2.2 段落2.3 表格2.4 圖片2.5 樣式 3. 讀取 1. 概述 Word 是一個十分常用的文字處理工具&#xff0c;通常我們都是手動來操作它&#xff0c;本節我們來看一下如何通過 Python 來操作。 Python 提供了 python-docx 庫&#xff0c;該庫就是為 Wo…

OpenLayers 入門指南【三】:API概要

目錄一、官方文檔二、核心類三、總結一、官方文檔 首頁右側有四個欄目分別是 Docs(文檔):也可以理解為使用指南&#xff0c;涵蓋一下四個模塊 Quick Start(快速入門)&#xff1a;介紹如何快速引入并使用OpenLayers快速構建一個地圖應用FAQ(問答)&#xff1a;介紹一些常見問題的…

JAVA面試寶典 -《Kafka 高吞吐量架構實戰:原理解析與性能優化全攻略》

&#x1f680; Kafka 高吞吐量架構實戰&#xff1a;原理解析與性能優化全攻略 隨著大數據技術在日志收集、埋點監控、訂單流處理等場景的普及&#xff0c;Kafka 已成為流處理架構中的核心組件。它之所以能在海量數據場景下保持高吞吐、低延遲&#xff0c;源于其在架構層面和底…

把sudo搞壞了怎么修復:報錯sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的時候一不小心給/etc目錄下所有的文件都所有者給改了&#xff0c;然后使用sudo的時候就出現了下面的問題&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端項目開發1.0.1版本

項目包含用戶權限管理、表單提交、數據上傳下載、儀表盤可視化等功能&#xff0c;非常適合新手從零開始學習Vue3前端開發&#xff0c;下述包含所有開發源代碼&#xff0c;敬請食用 廢話少說先上圖: 登陸界面: 儀表盤管理系統: 用戶管理: 對于普通用戶只有儀表盤和個人信息界…

低代碼平臺能否完全取代傳統前端開發

低代碼平臺不能完全取代傳統前端開發&#xff0c;主要原因包括靈活性有限、性能優化能力不足、復雜定制需求難以實現。 低代碼平臺盡管能快速開發出相對標準化的應用&#xff0c;但在處理復雜、個性化的業務需求時&#xff0c;明顯表現出不足。尤其在需要精細化控制UI界面、高性…

Git 中如何比較不同版本之間的差異?常用命令有哪些?

回答重點1&#xff09; git diff <commit1> <commit2> &#xff1a;比較兩個指定的提交之間的差異。2&#xff09; git diff <branch1> <branch2> &#xff1a;比較兩個分支之間的差異。3&#xff09; git diff <path> &#xff1a;比較工作目錄…

MySQL 8.0 OCP 1Z0-908 題目解析(32)

題目125 Choose three. Identify three functions of MySQL Enterprise Monitor. □ A) Analyze query performance. □ B) Start a logical backup. □ C) Determine the availability of monitored MySQL servers. □ D) Centrally manage users. □ E) Start a MySQL Enterp…

Spring處理器和Bean的生命周期

Spring處理器和Bean的生命周期Spring處理器是對Bean對象的的開發可以對BeanDifinition進行操作&#xff0c;例如動態添加、修改BeanDefinition、動態修改Bean。&#xff0c;也可以在Bean對象創建后對Bean對象進行代理增強。注意&#xff1a;對于處理器要又一個正確的認知&#…

Spring Framework源碼解析——BeanFactory

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl1. BeanFactory 概述 BeanFactory 是 Spring IoC 容器的最基礎接口&#xff0c;它定義了獲取、配置和管理 Bean 的核心方法。它是 Spring 框架中容器體系的頂層接口之一&#…

C# 計算梯形面積和周長的程序(Program to calculate area and perimeter of Trapezium)

梯形是至少有一對邊平行&#xff0c;其他兩條邊可以不平行的四邊形。平行邊稱為梯形的底&#xff0c;其他兩條邊稱為梯形的腿。平行邊之間的垂直距離稱為梯形的高。公式 &#xff1a; 梯形面積&#xff1a; 0.5 * (a b) * h梯形周長&#xff1a; a b c d例子&#xff1a; 輸…

【計算機考研(408)- 數據結構】數組和特殊矩陣

數組和特殊矩陣 數組 數組的定義 數組是由n(n>1)個相同類型的數據元素構成的有限序列。每個數據元素稱為一個數組元素&#xff0c;每個元素在n個線性關系中的序號稱之為該元素的下標&#xff0c;下標的取值范圍稱為數組的維界。 數組是[[線性表]]的推廣&#xff0c;一維數組…

Agent架構與工作原理:理解智能體的核心機制

Agent架構與工作原理&#xff1a;深入理解智能體的核心機制 AI Agent的核心組成部分 一個完整的AI Agent通常由以下幾個核心模塊組成&#xff1a; 1. 規劃模塊&#xff08;Planning Module&#xff09; 規劃模塊是Agent的"大腦"&#xff0c;負責制定行動策略。它接收…