怎么理解Linux虛擬文件系統(tǒng)

本篇內(nèi)容主要講解“怎么理解Linux虛擬文件系統(tǒng)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么理解Linux虛擬文件系統(tǒng)”吧!

宏偉ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

背景

有時會出現(xiàn)這樣的情況,磁盤空間顯示已經(jīng)被占滿,但是在查看磁盤的具體文件占用情況時,發(fā)現(xiàn)磁盤仍然有很大的空余空間。

1.執(zhí)行df命令查看磁盤使用情況,發(fā)現(xiàn)磁盤已經(jīng)滿了。

-bash-4.2$ df -Th  Filesystem     Type      Size  Used Avail Use% Mounted on  /dev/vda1      ext4       30G    30G 0      100% /  devtmpfs       devtmpfs  489M     0  489M   0% /dev  tmpfs          tmpfs     497M     0  497M   0% /dev/shm  tmpfs          tmpfs     497M   50M  447M  11% /run  tmpfs          tmpfs     497M     0  497M   0% /sys/fs/cgroup

2.執(zhí)行 du 命令查看各個目錄的磁盤占用情況,把各個目錄文件的大小相加,發(fā)現(xiàn)并沒有占滿磁盤,有10多G空間莫名失蹤。

-bash-4.2$ du -h --max-depth=1 /home16M /home/logs11G /home/serverdog11G /home

3.為何會出現(xiàn)這樣的情況呢?

因為雖然文件已被刪除,但是一些進(jìn)程仍然打開這些文件,因此其占用的磁盤空間并沒有被釋放。執(zhí)行l(wèi)sof 命令顯示打開已刪除的文件。將有問題的進(jìn)程重啟(或,清空),磁盤空間就會得到釋放。

-bash-4.2# lsof | grep deleteMySQLd     2470         mysql    4u      REG              253,1           0     523577 /var/tmp/ibfTeQFn (deleted)  mysqld     2470         mysql    5u      REG              253,1           0     523579 /var/tmp/ibaHcIdW (deleted)  mysqld     2470         mysql    6u      REG              253,1           0     523581 /var/tmp/ibLjiALu (deleted)  mysqld     2470         mysql    7u      REG              253,1           0     523585 /var/tmp/ibCFnzTB (deleted)  mysqld     2470         mysql   11u      REG              253,1

那么,Linux 的文件系統(tǒng),到底為什么這么設(shè)計呢?要了解這些,就要先弄清楚并不容易,下面將從一些基本概念入手,一步步將這些梳理清楚:

  •  什么是虛擬文件系統(tǒng)(VFS:virtual filesystem)?

  •  什么是通用文件模型?

  •  超級塊對象(superblock object)

  •  索引節(jié)點對象(inode object)

  •  文件對象(file object)

  •  目錄項對象(dentry object)

  •  文件的概念

  •  文件的表達(dá)

    •  內(nèi)存表達(dá)

    •  磁盤表達(dá)

  •  目錄樹的構(gòu)建

    •  軟鏈接 vs 硬鏈接

  •  文件 & 磁盤管理

    •  索引節(jié)點狀態(tài)

  •  文件 & 進(jìn)程管理

    •  操作:

    •  打開&刪除

虛擬文件系統(tǒng)(virtual filesystem)

下圖顯示了 Linux 操作系統(tǒng)中負(fù)責(zé)文件管理的基本組件。上半?yún)^(qū)域為用戶模式,下半?yún)^(qū)域為內(nèi)核模式。應(yīng)用程序使用標(biāo)準(zhǔn)庫libc來訪問文件,庫將請求映射到系統(tǒng)調(diào)用,以便進(jìn)入內(nèi)核模式。

怎么理解Linux虛擬文件系統(tǒng)

所有與文件相關(guān)的操作的入口都是虛擬文件系統(tǒng)(VFS),而非特定的額文件系統(tǒng)(如Ext3、ReiserFS和NFS)。VFS 提供了系統(tǒng)庫和特定文件系統(tǒng)之間的接口。因此,VFS 不僅充當(dāng)抽象層,而且實際上它提供了一個文件系統(tǒng)的基本實現(xiàn),可以由不同的實現(xiàn)來使用和擴(kuò)展。因此,要了解文件系統(tǒng)是如何工作的,就要先了解VFS 。

通用文件模型

VFS 的主要思想在于引入了一個通用文件模型(common file model)。通用文件模型由以下對象類型組成:

超級塊對象(superblock object)

  •  內(nèi)存:文件系統(tǒng)安裝時創(chuàng)建,存放文件系統(tǒng)的有關(guān)信息

  •  磁盤:對應(yīng)于存放在磁盤上的文件系統(tǒng)控制塊(filesystem control block)

索引節(jié)點對象(inode object)

  •  內(nèi)存:訪問時創(chuàng)建,存放關(guān)于具體文件的一般信息(inode 結(jié)構(gòu))

  •  磁盤:對應(yīng)于存放在磁盤上的文件控制塊(file control block)每個索引節(jié)點對象都有一個索引節(jié)點號,唯一地標(biāo)識文件系統(tǒng)的文件

文件對象(file object) -內(nèi)存:打開文件時創(chuàng)建,存放 打開文件 與進(jìn)程之間進(jìn)行交互的有關(guān)信息(file 結(jié)構(gòu)) 打開文件信息,僅當(dāng)進(jìn)程訪問文件期間存在于內(nèi)核內(nèi)存中。

目錄項對象(dentry object)

  • 內(nèi)存:目錄項一旦被讀入內(nèi)存,VFS就會將其轉(zhuǎn)換成dentry 結(jié)構(gòu)的目錄項對象

  •  磁盤:特定文件系統(tǒng)以特定的方式存儲在磁盤上

  •  存放目錄項(即,文件名稱)與對應(yīng)文件進(jìn)行鏈接的有關(guān)信息

目錄樹

綜合來說,Linux 的 根文件系統(tǒng)(system’s root filessystem) 是內(nèi)核啟動mount的第一個文件系統(tǒng)。內(nèi)核代碼映像文件保存在根文件系統(tǒng)中,而系統(tǒng)引導(dǎo)啟動程序會在根文件系統(tǒng)掛載之后,從中把一些基本的初始化腳本和服務(wù)等加載到內(nèi)存中去運行(文件系統(tǒng)和內(nèi)核是完全獨立的兩個部分)。其他文件系統(tǒng),則后續(xù)通過腳本或命令作為子文件系統(tǒng)安裝在已安裝文件系統(tǒng)的目錄上,最終形成整個目錄樹。

start_kernel     vfs_caches_init       mnt_init         init_rootfs     // 注冊rootfs文件系統(tǒng)        init_mount_tree // 掛載rootfs文件系統(tǒng)     …     rest_init     kernel_thread(kernel_init, NULL, CLONE_FS);

就單個文件系統(tǒng)而言,在文件系統(tǒng)安裝時,創(chuàng)建超級塊對象;沿樹查找文件時,總是首先從初識目錄的中查找匹配的目錄項,以便獲取相應(yīng)的索引節(jié)點,然后讀取索引節(jié)點的目錄文件,轉(zhuǎn)化為dentry對象,再檢查匹配的目錄項,反復(fù)執(zhí)行以上過程,直至找到對應(yīng)的文件的索引節(jié)點,并創(chuàng)建索引節(jié)點對象。

軟鏈接 vs 硬鏈接

軟鏈接是一個普通的文件,其中存放的是另外一個文件的路徑名。硬鏈接則指向同一個索引節(jié)點,硬鏈接數(shù)記錄在索引節(jié)點對象的 i_nlink 字段。當(dāng)i_nlink字段為零時,說明沒有硬鏈接指向該文件。

文件 & 進(jìn)程管理

下圖是一個簡單示例,說明進(jìn)程是怎樣與文件進(jìn)行交互。三個不同進(jìn)程打開同一個文件,每個進(jìn)程都有自己的文件對象,其中兩個進(jìn)程使用同一個硬鏈接(每個硬鏈接對應(yīng)一個目錄對象),兩個目錄項對象都指向同一個 索引節(jié)點對象。

怎么理解Linux虛擬文件系統(tǒng)

索引節(jié)點的數(shù)據(jù)又由兩部分組成:內(nèi)存數(shù)據(jù)和磁盤數(shù)據(jù)。Linux 使用 Write back 作為索引節(jié)點的數(shù)據(jù)一致性策略。對于索引節(jié)點的數(shù)據(jù),當(dāng)文件被打開時,才會加載索引節(jié)點到內(nèi)存;當(dāng)不再被進(jìn)程使用,則從內(nèi)存踢出;如果中間有更新,則需要把數(shù)據(jù)寫回磁盤。

*  "in_use" - valid inode, i_count > 0, i_nlink > 0  *  "dirty"  - as "in_use" but also dirty  *  "unused" - valid inode, i_count = 0

索引節(jié)點是否仍在使用,是通過 open() 和 close() 操作建立和銷毀文件對象,文件對象通過索引節(jié)點提供的 iget 和 iput 更新索引節(jié)點的i_count字段,以完成使用計數(shù)。open 操作使得 i_count 加一, close 操作使得 i_count 減一。在 close 操作時判斷索引節(jié)點是否釋放,如果 i_count = 0,則意味著不再有進(jìn)程引用,將會從內(nèi)存釋放。

文件 & 磁盤管理

文件與磁盤管理聯(lián)系最緊密的操作,莫過于touch和rm操作,而尤以后者最為關(guān)鍵。通過strace(或 dtruss),查看 rm 的實際的系統(tǒng)調(diào)用

# dtruss rm tmp  ...  geteuid(0x0, 0x0, 0x0)       = 0 0  ioctl(0x0, 0x4004667A, 0x7FFEE06F09C4)       = 0 0  lstat64("tmp\0", 0x7FFEE06F0968, 0x0)        = 0 0  access("tmp\0", 0x2, 0x0)        = 0 0  unlink("tmp\0", 0x0, 0x0)        = 0 0

可以發(fā)現(xiàn) rm 實際是通過 unlink 完成的。unlink代表刪除目錄項,以及減少其索引節(jié)點的計數(shù)。由通用文件模型可知,父目錄本身同樣是一個文件,也就意味著目錄項是其文件數(shù)據(jù)的一部分。刪除目錄項等價于從父目錄的文件中刪除數(shù)據(jù),也就意味著首先要打開父目錄的文件。那么,刪除操作即可理解為:

  •  刪除命令(一個進(jìn)程)使用 open 操作獲得父目錄文件對象

  •  通過 iget 增加 目錄文件的索引節(jié)點對象計數(shù)

  •  讀取目錄文件數(shù)據(jù)

    •  將目錄文件數(shù)據(jù)轉(zhuǎn)化為目錄項對象

    •  由于目錄項包含文件的索引節(jié)點,類似的,需要通過 iget 增加文件的索引節(jié)點對象計數(shù)

  •  刪除目錄的目錄項

  •  減少文件索引節(jié)點對象的硬鏈接計數(shù)i_nlink

  •  通過 iput 結(jié)束對文件索引節(jié)點對象的操作,使用計數(shù) i_count 減一

    •  判斷i_count是否為零,如果為零,則釋放內(nèi)存

    •  然后,判斷i_nlink是否為零,如果為零,則釋放磁盤空間

  •  通過 iput 結(jié)束對目錄索引節(jié)點對象的操作。

到此,相信大家對“怎么理解Linux虛擬文件系統(tǒng)”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享名稱:怎么理解Linux虛擬文件系統(tǒng)
文章地址:http://muchs.cn/article10/gephgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)搜索引擎優(yōu)化網(wǎng)站策劃、用戶體驗、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)