從 lsof 開始,深入理解 Linux 虛擬文件系統

背景

有時會出現這樣的情況,磁盤空間顯示已經被占滿,但是在查看磁盤的具體文件占用情況時,發(fā)現磁盤仍然有很大的空余空間。
1.執(zhí)行df命令查看磁盤使用情況,發(fā)現磁盤已經滿了。
-bash-4.2$?df?-ThFilesystem?????Type??????Size??Used?Avail?Use%?Mounted?on/dev/vda1??????ext4???????30G????30G?0?????????100%?/devtmpfs???????devtmpfs??489M?????0??489M???0%?/devtmpfs??????????tmpfs?????497M?????0??497M???0%?/dev/shmtmpfs??????????tmpfs?????497M???50M??447M??11%?/runtmpfs??????????tmpfs?????497M?????0??497M???0%?/sys/fs/cgroup

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

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

3.為何會出現這樣的情況呢?
因為雖然文件已被刪除,但是一些進程仍然打開這些文件,因此其占用的磁盤空間并沒有被釋放。執(zhí)行lsof?命令顯示打開已刪除的文件。將有問題的進程重啟(或,清空),磁盤空間就會得到釋放。
-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???????????0?????523587?/var/tmp/ibCjuqva?(deleted)
那么,linux 的文件系統,到底為什么這么設計呢?要了解這些,就要先弄清楚并不容易,下面將從一些基本概念入手,一步步將這些梳理清楚:
  • 什么是虛擬文件系統(VFS:virtual filesystem)?

  • 什么是通用文件模型?

    • 超級塊對象(superblock object)

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

    • 文件對象(file object)

    • 目錄項對象(dentry object)

    • 文件的概念

  • 文件的表達

    • 內存表達

    • 磁盤表達

  • 目錄樹的構建

    • 軟鏈接 vs 硬鏈接

  • 文件 & 磁盤管理

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

  • 文件 & 進程管理

    • 操作:

      打開&刪除

虛擬文件系統(virtual filesystem)

下圖顯示了 Linux 操作系統中負責文件管理的基本組件。上半區(qū)域為用戶模式,下半區(qū)域為內核模式。應用程序使用標準庫libc來訪問文件,庫將請求映射到系統調用,以便進入內核模式。

從 lsof 開始,深入理解 Linux 虛擬文件系統

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

通用文件模型

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

超級塊對象(superblock object)

內存:文件系統安裝時創(chuàng)建,存放文件系統的有關信息
磁盤:對應于存放在磁盤上的文件系統控制塊(filesystem control block)

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

內存:訪問時創(chuàng)建,存放關于具體文件的一般信息(inode 結構)
磁盤:對應于存放在磁盤上的文件控制塊(file control block)
每個索引節(jié)點對象都有一個索引節(jié)點號,唯一地標識文件系統的文件

文件對象(file object)

內存:打開文件時創(chuàng)建,存放 打開文件 與進程之間進行交互的有關信息(file 結構)
打開文件信息,僅當進程訪問文件期間存在于內核內存中。

目錄項對象(dentry object)

內存:目錄項一旦被讀入內存,VFS就會將其轉換成dentry 結構的目錄項對象
磁盤:特定文件系統以特定的方式存儲在磁盤上
存放目錄項(即,文件名稱)與對應文件進行鏈接的有關信息

目錄樹

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

start_kernel?  vfs_caches_init?    mnt_init?      init_rootfs?????//?注冊rootfs文件系統      init_mount_tree?//?掛載rootfs文件系統?  …?  rest_init?  kernel_thread(kernel_init,?NULL,?CLONE_FS);
就單個文件系統而言,在文件系統安裝時,創(chuàng)建超級塊對象;沿樹查找文件時,總是首先從初識目錄的中查找匹配的目錄項,以便獲取相應的索引節(jié)點,然后讀取索引節(jié)點的目錄文件,轉化為dentry對象,再檢查匹配的目錄項,反復執(zhí)行以上過程,直至找到對應的文件的索引節(jié)點,并創(chuàng)建索引節(jié)點對象。

軟鏈接 vs 硬鏈接

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

文件 & 進程管理

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

從 lsof 開始,深入理解 Linux 虛擬文件系統

索引節(jié)點的數據又由兩部分組成:內存數據和磁盤數據。Linux 使用 Write back 作為索引節(jié)點的數據一致性策略。對于索引節(jié)點的數據,當文件被打開時,才會加載索引節(jié)點到內存;當不再被進程使用,則從內存踢出;如果中間有更新,則需要把數據寫回磁盤。
*??"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字段,以完成使用計數。open 操作使得 i_count 加一, close 操作使得 i_count 減一。在 close 操作時判斷索引節(jié)點是否釋放,如果 i_count = 0,則意味著不再有進程引用,將會從內存釋放。

文件 & 磁盤管理

文件與磁盤管理聯系最緊密的操作,莫過于touchrm操作,而尤以后者最為關鍵。通過strace(或 dtruss),查看 rm 的實際的系統調用

#?dtruss?rm?tmp...geteuid(0x0,?0x0,?0x0)?????????=?0?0ioctl(0x0,?0x4004667A,?0x7FFEE06F09C4)?????????=?0?0lstat64("tmp

国产精品久久影院|
久久久久亚洲AV成人网人人网站
|
久久久久亚洲爆乳少妇无|
日本久久久久久中文字幕|
久久国产成人亚洲精品影院|
人人狠狠综合久久88成人|
久久精品国产69国产精品亚洲|
亚洲国产精品热久久|
|
久久噜噜久久久精品66|
99久久这里只精品国产免费|
久久精品国产亚洲AV无码麻豆
|
久久www免费人成看国产片|
久久久久亚洲AV无码专区首JN
|
狠狠久久亚洲欧美专区|
精品伊人久久久|
国内精品久久久久久麻豆|
香蕉久久一区二区不卡无毒影院|
国产精品九九久久免费视频
|
av午夜福利一片免费看久久|
国内精品久久久久久久影视麻豆|
99久久夜色精品国产网站|
久久se精品一区二区|
亚洲精品无码久久久久久|
久久久久人妻精品一区三寸蜜桃
|
国产69精品久久久久9999|
久久婷婷五月综合国产尤物app
|
久久精品国产亚洲AV不卡|
一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区
|
久久成人国产精品一区二区|
久久91精品久久91综合|
久久精品国产亚洲av日韩|
久久精品综合网|
亚洲?V乱码久久精品蜜桃|
精品久久人人做人人爽综合|
99热热久久这里只有精品68|
久久精品国产99国产精品澳门|
国产精品18久久久久久vr|
欧美777精品久久久久网|
色综合久久综精品|
久久国产免费直播|