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