1. 程式人生 > >【Linux】硬連結、軟連結及inode詳解

【Linux】硬連結、軟連結及inode詳解

inode

  檔案儲存在硬碟上,硬碟的最小儲存單位叫做“扇區”(Sector)。每個扇區儲存512位元組(相當於0.5KB)。

  作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個”塊”(block)。這種由多個扇區組成的”塊”,是檔案存取的最小單位。”塊”的大小,最常見的是4KB,即連續八個 sector組成一個 block。

  檔案資料都儲存在”塊”中,那麼很顯然,我們還必須找到一個地方儲存檔案的元資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為”索引節點”。

  每一個檔案都有對應的inode,裡面包含了與該檔案有關的一些資訊。

inode包含了什麼?

  • 檔案的位元組數
  • 檔案擁有者的User ID
  • 檔案的Group ID
  • 檔案的讀、寫、執行許可權
  • 檔案的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔案內容上一次變動的時間,atime指檔案上一次開啟的時間
  • 連結數,即有多少檔名指向這個inode
  • 檔案資料block的位置

     可以用stat命令,檢視某個檔案的inode資訊:
     

stat test.c

這裡寫圖片描述
總之,除了檔名以外的所有檔案資訊,都存在inode之中。

inode的號碼

  每個inode都有一個號碼,作業系統用inode號碼來識別不同的檔案。

  這裡值得重複一遍,Unix/Linux系統內部不使用檔名,而使用inode號碼來識別檔案。對於系統來說,檔名只是inode號碼便於識別的別稱或者綽號。

  表面上,使用者通過檔名,開啟檔案。實際上,系統內部這個過程分成三步:
首先,系統找到這個檔名對應的inode號碼;
其次,通過inode號碼,獲取inode資訊;
最後,根據inode資訊,找到檔案資料所在的block,讀出資料。

  使用ls -i命令,可以看到檔名對應的inode號碼:

  ls -i example.c

目錄檔案

  Unix/Linux系統中,目錄(directory)也是一種檔案。開啟目錄,實際上就是開啟目錄檔案。

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

  ls命令只列出目錄檔案中的所有檔名:

 ls /etc

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

 ls -i /etc

如果要檢視檔案的詳細資訊,就必須根據inode號碼,訪問inode節點,讀取資訊。ls -l命令列出檔案的詳細資訊。

 ls -l /etc

  理解了上面這些知識,就能理解目錄的許可權。
  目錄檔案的讀許可權(r)和寫許可權(w),都是針對目錄檔案本身。由於目錄檔案內只有檔名和inode號碼,所以如果只有讀許可權,只能獲取檔名,無法獲取其他資訊,因為其他資訊都儲存在inode節點中,而讀取inode節點內的資訊需要目錄檔案的執行許可權(x)。

硬連結

  一般情況下,檔名和inode號碼是”一一對應”關係,每個inode號碼對應一個檔名。但是,Unix/Linux系統允許,多個檔名指向同一個inode號碼。

  這意味著,可以用不同的檔名訪問同樣的內容;對檔案內容進行修改,會影響到所有檔名;但是,刪除一個檔名,不影響另一個檔名的訪問。這種情況就被稱為”硬連結”(hard link)。

ln命令可以建立硬連結:

  ln 原始檔 目標檔案

這裡寫圖片描述

  執行上面這條命令以後,原始檔與目標檔案的inode號碼相同,都指向同一個inode。
  inode資訊中有一項叫做”連結數”,記錄指向該inode的檔名總數,這時就會增加1。

  反過來,刪除一個檔名,就會使得inode節點中的”連結數”減1。當這個值減到0,表明沒有檔名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。

  這裡順便說一下目錄檔案的”連結數”。
  建立目錄時,預設會生成兩個目錄項:”.”和”..”。
  前者的inode號碼就是當前目錄的inode號碼,等同於當前目錄的”硬連結”;,後者的inode號碼就是當前目錄的父目錄的inode號碼,等同於父目錄的”硬連結”。
  所以,任何一個目錄的”硬連結”總數,總是等於2加上它的子目錄總數(含隱藏目錄)。

  UNIX檔案系統提供了一種將不同檔案連結至同一個檔案的機制,我們稱這種機制為連結。
  它可以使得單個程式對同一檔案使用不同的名字。這樣的好處是檔案系統只存在一個檔案的副本。
  系統簡單地通過在目錄中建立一個新的登記項來實現這種連線。該登記項具有一個新的檔名和要連線檔案的inode號(inode與原檔案相同)。
  不論一個檔案有多少硬連結,在磁碟上只有一個描述它的inode,只要該檔案的連結數不為0,該檔案就保持存在。硬連結不能對目錄建立硬連結!

  硬連線是直接建立在節點表上的(inode),建立硬連線指向一個檔案的時候,會更新節點表上面的計數值
  舉個例子,一個檔案被連線了兩次(硬連線),這個檔案的計數值是3,而無論通過3個檔名中的任何一個訪問,效果都是完全一樣的,但是如果刪除其中任意一個,都只是把計數值減1,不會刪除實際的內容的,(任何存在的檔案本身就算是一個硬連線)只有計數值變成0也就是沒有任何硬連線指向的時候才會真實的刪除內容。

軟連結

除了硬連結以外,還有一種特殊情況。

  檔案A和檔案B的inode號碼雖然不一樣,但是檔案A的內容是檔案B的路徑。讀取檔案A時,系統會自動將訪問者導向檔案B。因此,無論開啟哪一個檔案,最終讀取的都是檔案B。這時,檔案A就稱為檔案B的”軟連結”(soft link)或者”符號連結(symbolic link)。

  這意味著,檔案A依賴於檔案B而存在,如果刪除了檔案B,開啟檔案A就會報錯:”No such file or directory”。
  這是軟連結與硬連結最大的不同:檔案A指向檔案B的檔名,而不是檔案B的inode號碼,檔案B的inode”連結數”不會因此發生變化。

ln -s命令可以建立軟連結。

  ln -s 源文檔案或目錄 目標檔案或目錄

  我們把符號連結稱為軟連結,它是指向另一個檔案的特殊檔案,這種檔案的資料部分僅包含它所要連結檔案的路徑名。
  軟連結是為了克服硬連結的不足而引入的,軟連結不直接使用inode號作為檔案指標,而是使用檔案路徑名作為指標(軟連結:檔名 + 資料部分–>目標檔案的路徑名)。

  軟體有自己的inode,並在磁碟上有一小片空間存放路徑名。因此,軟連結能夠跨檔案系統,也可以和目錄連結!其二,軟連結可以對一個不存在的檔名進行連結,但直到這個名字對應的檔案被建立後,才能開啟其連結。

inode的特殊作用

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

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

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

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

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

相關推薦

JQ-jPlayer視訊音樂播放器使用

下載官網:http://www.jplayer.org/ 當前版本:2.3.0 功能:視訊播放(可全屏)、音樂播放 全部原教程,說明並不詳細,要結合檢視其網頁原始碼來學習:http://www.jplayer.org/latest/demos/ 備註:資料夾裡blue.mo

Linux dd命令燒錄啟動U盤

dd命令做usb啟動盤十分方便,只須:sudo dd if=xxx.iso of=/dev/sdb bs=1M 用以上命令前必須解除安裝u盤,sdb是你的u盤,bs=1M是塊的大小,後面的數值大,寫的速度相對塊一點,但也不是無限的,我一般選2M,注意,執行命令後很塊完成,但u盤還在閃,等不閃了,安全移除。

Linux連結連結inode

inode   檔案儲存在硬碟上,硬碟的最小儲存單位叫做“扇區”(Sector)。每個扇區儲存512位元組(相當於0.5KB)。   作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個”塊”(block)

深入講解 linuxinode連結連結的原理

inode定義 inode 是 linux 系統中用作資料索引的識別符號。 簡單來說,inode 指示了一個檔案的基本資訊,如inode編號、修改時間、檔案的位置等,就如同一本書的目錄,會直接告訴你想看的章節是在第幾頁。不同的是,書是以頁為單位的,而 lin

(轉)Linux鏈接鏈接inode

water 數據區 9.png 驗證 不同 ima 需要 asm clas inode   文件儲存在硬盤上,硬盤的最小存儲單位叫做“扇區”(Sector)。每個扇區儲存512字節(相當於0.5KB)。   操作系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率太低,而是一

Linux磁碟分割槽掛載和查詢小結

一、Linux磁碟分割槽、掛載 1.基本介紹     ①:Linux來說無論有幾個分割槽,分給哪一個目錄使用,它歸根結底就只有一個根目錄,一個獨立且唯一的檔案結構,Linux中每個分割槽都是用來組成整個檔案系統的一部分。     ②:Linux採用

Linux時間日期搜尋查詢壓縮壓類常用指令小結

一、時間日期類 1.date指令(顯示當前日期)    用法:date:(完整的顯示當前時間)               date +%Y (顯示當前年份)     &nb

Linux使用readwritelseek函式實現檔案讀寫操作

本文章主要講述Linux環境下檔案的讀寫操作,使用到的函式有open、read、write、lseek。 open:用於開啟或者建立檔案。 read:從檔案中讀指定位元組的資料到記憶體中。 write:講記憶體中資料寫入到檔案中。 lseek:可以改變當前檔案偏移量。 #

Linux程序組作業回話守護程序的基本概念!!

程序組 每一個程序在建立的時候就有自己的程序ID,同時也有自己的ID(PGID)。一個程序組,可以含有一個或者多個程序,程序組也有自己的ID,通常是程序組裡面第一個程序的ID。 程序組的特點: 每一個程序組有一個組長程序,程序組長的ID等於程序組ID 程

Linux程序組作業會話以及終端的理解

一、程序組 (1)概念 我們知道每一個程序除了自己的程序 ID外,還擁有一個程序組ID。 多個程序組成的集合叫做程序組。他們彼此之間不是孤立的,存在父子、兄弟等關係,每個程序都有父程序(除了0號程序),而所有的程序的父程序都是以init程序為根,形成一

Linux文字處理關鍵字擷取

cut cut命令可以將一行文字按照指定字元切分成多段並取出某一段,或者直接指定要取出的字元位置。 格式: cut -d '指定字元' -f數字 //切分並取出指定列 cut -c 區間 //取出指定字元位置的字串,區間用-表示,如2-4,8

linux程序建立等待終止

建立程序—fork函式 函式原型:pid_t fork(void); 返回值:子程序返回0;父程序返回子程序pid,失敗返回-1(失敗的原因:1記憶體不夠;2系統程序數量太多); 注意:fork

LinuxCentOS 7.4 安裝 MySQL 8.0.12 壓版

style prope error shared false 添加 tab code plain 安裝環境/工具   1、Linux(CentOS 7.4版)   2、mysql-8.0.12-el7-x86_64.tar.gz 安裝步驟   參考:https://dev.

Linux---基本的使用者管理命令系統管理操作

---------常用的使用者管理命令 ********建立一個使用者的命令:  1.useradd    beat ********需要為其設定一個密碼: 2.passwd    beat 預設建立的使用者在root許可權下的

spring-boot實戰08:Spring Boot屬性配置文件

命令行 可見 str ear isp active 文件加載 junit4 實驗 相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spring

jQuery方法和選擇器的雙重使用

節點 使用詳解 選擇器 query 除了 nbsp clas pos ren 1.jQuery選擇直接子節點+除了某個元素   1》方法 $(".begon").children(".row:not(.moreDetail)")   2》選擇器 $(".begon

C#各個版本中的新增特性

members 托管 分隔符 main 數據 logs ttr dot 提高 轉自:http://www.cnblogs.com/knowledgesea/p/6694979.html 序言 自從2000年初期發布以來,c#編程語言不斷的得到改進,使我們能夠更加清晰的編

android開發學習 ------- android中的單例模式 (

lan post tail -- and 使用 href details android開發 https://blog.csdn.net/u011418943/article/details/60139644 這篇文章 前因後果 都說出來了 ,值得學習。 htt

python time模塊和datetime模塊

-a cond .com ima 封裝 基本 sta times %d 一、time模塊 time模塊中時間表現的格式主要有三種:   a、timestamp時間戳,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量   b、struct_time時間

JDK的Parser來解析Java原始碼

轉自:https://www.jb51.net/article/92989.htm 這篇文章主要介紹了JDK的Parser來解析Java原始碼的相關資料,需要的朋友可以參考下 在JDK中,自帶了一套相關的編譯API,可以在Java中發起編譯流程,解析Java原始檔然後獲取其語法樹,在JDK的