工作多年,Linux文件系統還不太了解?
本文轉載自微信公眾號「架構精進之路」,作者架構精進之路。轉載本文請聯系架構精進之路公眾號。
我們作為“碼農”,每天都在接觸編程,接觸linux系統,那么常見的Linux目錄和文件都有哪些,它們又有什么作用呢?
想必大家經常會忽略這點,作為工作多年的你而言也不例外,今天就帶大家來一起了解一下吧~
1 初識目錄結構
2 初識文件
2.1 文件類型
2.1.1 文件
第一個屬性為 [-]。最常用的類型,包括:
純文本文件(ASCII);
二進制文件(binary);
數據格式的文件(data);
各種壓縮文件。
2.1.2 目錄
第一個屬性為 [d]
2.1.3 鏈接文件
第一個屬性為 [l]
2.1.4 管道
第一個屬性為 [p]
2.1.5 塊設備
第一個屬性為 [b] 。儲數據以供系統存取的接口設備,簡單而言就是硬盤。
- ll /dev/vda1
- brw-rw---- 1 root disk 253, 1 11月 28 19:17 /dev/vda1
2.1.6 字符設備文件
第一個屬性為 [c] 。即串行端口的接口設備,例如鍵盤、鼠標等等。
2.1.7 套接字
第一個屬性為 [s]。最常在 /var/run目錄中看到這種文件類型。
查看文件類型的方法:
- #file, stat, ls
講到這里,可以有些疑問,到底文件是個什么東東?
2.2 文件是什么?
如上圖所示,一般文件包括兩部分:元數據和用戶數據
- 元數據:文件的附屬信息:文件大小,文件創建時間,文件擁有者,Inode編號(文件的唯一標識)
- 用戶數據:記錄文件真實內容的地方。
為了有效管理文件,引入了文件系統。
2.3 文件系統
文件系統,本身是對存儲設備上的文件,進行組織管理的機制。所以根據組織機制的不同,可以分為不同的文件系統。
文件系統系統包括4大要素:索引節點,目錄項,邏輯塊,超級塊。
2.3.1 索引節點
同上面講的元數據部分,索引節點和文件是一一對應的,它和文件內容一樣,是存儲在磁盤中的。所以索引節點是占用磁盤空間的。所以它不會隨著進程的消亡而消失。
2.3.2 目錄項
簡稱dentry,用來記錄文件的名稱,索引節點指針以及目錄項之間的關聯關系,會形成一棵樹狀結構。多個關聯的目錄項,就形成了目錄結構。
它是由內存維護的一個內存數據結構,所以通常被稱作“目錄項緩沖”。
2.3.3 邏輯塊
索引節點和目錄項記錄了文件的元數據,那么文件內容是怎么存儲的?
實際上,磁盤上最小的讀寫單位是“扇區”,只有512B大小,也就是0.5K,為了讀寫效率,系統會將連續的扇區組合一個”塊“,一般一個“塊”是8個扇區,也就是4K,4096B。
從磁盤中讀取內容是特別慢的,所以系統會將讀取的內容存到“頁緩沖”中。
2.3.4 超級塊
一個超級塊對應一個文件系統。超級塊會保存文件系統的大小和狀態、塊設備的引用和元數據信息(比如空閑列表等等)
文件系統有多種,比如Ext4, NFS等,根據存儲位置不一樣,可以分為三類。
- 基于磁盤的文件系統:也就是數據直接存儲在計算機本地掛載的磁盤中。常見的Ext4, Ext3,XFS。
- 基于內存的文件系統:也就是虛擬文件系統。這類文件系統,不需要任何磁盤分配存儲空間,但會占用內存。比如/proc文件系統,/sys文件系統。
- 網絡文件系統:用來訪問其他計算機數據的文件系統,比如NFS,SMB。
每個文件系統是獨立的,有自己的組織方法,操作方法。那么對于用戶來說,不可能所有的文件系統都了解,那么怎么做到讓用戶透明的去處理文件呢?
2.4 VFS虛擬文件系統
虛擬文件系統定義了一組所有文件系統都支持的數據結構和標準接口。用戶進程和內核中的其他子系統,只需要跟VFS提供的統一接口交互就OK,不需要關心底層文件系統實現細節。
磁盤的操作是非常慢的,所以為了協調磁盤的訪問速度,內核提供了“索引節點緩存”,“目錄項緩存”,“頁緩沖”。
2.5 文件系統I/O
根據文件讀寫方式的各種差異,導致I/O的分類多種多種。最常見的為以下4類:
2.5.1 緩沖IO和非緩沖IO
第一種,根據是否利用標準庫緩存,分為:
緩沖IO:只利用標準庫的緩沖來加速文件的訪問。標準庫內部會通過系統調用來訪問文件。
非緩沖IO:直接系統調用。
需要說明的是:“緩沖”指的是標準庫的緩沖,而不是內核提供的高速緩沖區(也就是頁緩沖)
無緩存IO操作數據流向路徑:數據——內核緩存區——磁盤
標準IO操作數據流向路徑:數據——流緩存區——內核緩存區——磁盤
2.5.2 直接IO和非直接IO
是否跳過頁緩沖。
要想實現直接IO,可以在系統調用的時候,指定O_DIRECT標志。
直接IO和非直接IO,本質上還是和文件系統打交道,如果跳過文件系統直接讀寫磁盤,就是我們通常說的裸IO。
2.5.3 阻塞和非阻塞IO
設置O_NONBLOCK
阻塞IO:是指應用程序執行IO操作,如果沒有獲得響應,則會阻塞當前線程,不會做其他任務。
非阻塞IO:是指應用程序執行IO操作,不阻塞當前線程,可以繼續執行其他任務,隨后會輪詢或者事件通知的形式,獲取調用結果。
2.5.4 同步和非同步IO
設置O_SYNC或者O_DSYNC標志,就代表同步IO。設置O_DSYNC,會等待數據寫入磁盤才返回;設置O_SYNC,則是在O_DSYNC的基礎上,要求文件元數據也要返回磁盤后,才返回。
同步IO:是指應用程序執行IO操作后,要一直等待IO完成后,才能獲得IO響應。
異步IO:是指用用程序執行IO操作后,不用等待完成或完成后的響應,而是繼續執行就可以。等待IO完成,響應會用事件通知的形式,告訴應用程序。