Linux檔案系統

2021-08-21 10:40:32 字數 2990 閱讀 4136

檔案描述符fd:

檔案描述符是乙個非負整數。當我們開啟乙個現有檔案或者建立乙個新檔案時,核心會想程序返回乙個檔案描述符。

當我們開啟檔案時,作業系統在記憶體中要建立相應的資料結構來描述目標檔案,即file結構體,來表示已經開啟的檔案。程序執行open系統呼叫時必須讓程序和檔案關聯起來。每個程序都有乙個*file指標,指向一張表files_struct,這張表包含乙個檔案指標陣列,每個元素都是乙個指向開啟檔案的指標。所以,

檔案描述符本質上是檔案指標陣列的下標。

只要拿著fd,就可以找到對應的檔案。

file結構體:

file 結構如下所示:

struct file f_u;

struct path f_path; 包含dentry和mnt兩個成員,用於確定檔案路徑

#define f_dentry f_path.dentry f_path的成員之一,當前檔案的dentry結構

#define f_vfsmnt f_path.mnt 表示當前檔案所在檔案系統的掛載根目錄

const struct file_operations *f_op; 與該檔案相關聯的操作函式

atomic_t f_count; 檔案的引用計數(有多少程序開啟該檔案)

unsigned int f_flags; 對應於open時指定的flag

mode_t f_mode; 讀寫模式:open的mod_t mode引數

off_t f_pos; 該檔案在當前程序中的檔案偏移量

struct fown_struct f_owner; 該結構的作用是通過訊號進行i/o時間通知的資料。

unsigned int f_uid, f_gid; 檔案所有者id,所有者組id

struct file_ra_state f_ra; 在linux/include/linux/fs.h中定義,檔案預讀相關

unsigned long f_version;

#ifdef config_security

void *f_security;

#endif

void *private_data;

#ifdef config_epoll

struct list_head f_ep_links;

spinlock_t f_ep_lock;

#endif };

大部分的linux檔案系統規定,乙個檔案是由目錄項,inode和資料塊組成。

inode

理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(sector),每個扇區儲存512位元組(相當於0.5kb)。

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

檔案都儲存在「塊」中,那麼,要找 乙個地方儲存的檔案的元資訊,包括檔案的創造者,檔案的創造日期,檔案的大小

inode包含檔案的元資訊,具體來說有以下內容:

可以用stat命令來檢視檔案的inode資訊。

請看檔案儲存結構示意圖:

inode號碼

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

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

表面上,使用者通過檔名,打

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

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

ls -i demo.txt

硬鏈結和軟鏈結

硬鏈結

一般情況下,檔名和inode號碼是"一一對應"關係,每個inode號碼對應乙個檔名。但是,linux系統允許,多個檔名指向同乙個inode號碼。這意味著,可以用不同的檔名訪問同樣的內容;對檔案內容進行修改,會影響到所有檔名;但是,刪除乙個檔名,不影響另乙個檔名的訪問。這種情況就被稱為"硬鏈結"(hard link)。

ln source_file target_file

執行上面這條命令以後,原始檔與目標檔案的inode號碼相同,都指向同乙個inode。inode資訊中有一項叫做"鏈結數",記錄指向該inode的檔名總數,這時就會增加1。反過來,刪除乙個檔名,就會使得inode節點中的"鏈結數"減1。當這個值減到0,表明沒有檔名指向這個inode,系統就會**這個inode號碼,以及其所對應block區域。

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

軟鏈結除了硬鏈結以外,還有一種特殊情況。檔案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 source_file target_file

linux 檔案系統 Linux 檔案系統結構介紹

ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...

Linux檔案系統

linux目錄結構 根目錄 bin 可執行檔案目錄 boot 核心引導檔案 vmlinuz,initrd.img等 dev 裝置檔案儲存目錄,應用程式對這些檔案讀寫和控制可訪問實際裝置 etc 系統配置和一些伺服器配置檔案的位置,如帳號及密碼配置檔案。home 普通使用者目錄 lib 庫檔案目錄 l...

Linux檔案系統

之前對磁碟分割槽已經有了詳細的描述,這篇主要介紹檔案系統 linux的檔案系統是出了名的 下面就 大概介紹下 可以把檔案系統大概分成 superblock inodeblock datablock 三部分 superblock superblock記錄檔案系統的基本資訊比如每塊資料塊的大小,空閒磁碟...