自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從lsof開(kāi)始,深入理解Linux虛擬文件系統(tǒng)

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

 

背景

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

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

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

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

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

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

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

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

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

  •  什么是虛擬文件系統(tǒng)(VFS:virtual filesystem)?
  •  什么是通用文件模型?
    •  超級(jí)塊對(duì)象(superblock object)
    •  索引節(jié)點(diǎn)對(duì)象(inode object)
    •  文件對(duì)象(file object)
    •  目錄項(xiàng)對(duì)象(dentry object)
    •  文件的概念
  •  文件的表達(dá)
    •  內(nèi)存表達(dá)
    •  磁盤(pán)表達(dá)
  •  目錄樹(shù)的構(gòu)建
    •  軟鏈接 vs 硬鏈接
  •  文件 & 磁盤(pán)管理
    •  索引節(jié)點(diǎn)狀態(tài)
  •  文件 & 進(jìn)程管理
    •  操作:

        打開(kāi)&刪除

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

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

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

通用文件模型

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

超級(jí)塊對(duì)象(superblock object)

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

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

索引節(jié)點(diǎn)對(duì)象(inode object)

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

磁盤(pán):對(duì)應(yīng)于存放在磁盤(pán)上的文件控制塊(file control block)

每個(gè)索引節(jié)點(diǎn)對(duì)象都有一個(gè)索引節(jié)點(diǎn)號(hào),唯一地標(biāo)識(shí)文件系統(tǒng)的文件

文件對(duì)象(file object)

內(nèi)存:打開(kāi)文件時(shí)創(chuàng)建,存放 打開(kāi)文件 與進(jìn)程之間進(jìn)行交互的有關(guān)信息(file 結(jié)構(gòu))

打開(kāi)文件信息,僅當(dāng)進(jìn)程訪問(wèn)文件期間存在于內(nèi)核內(nèi)存中。

目錄項(xiàng)對(duì)象(dentry object)

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

磁盤(pán):特定文件系統(tǒng)以特定的方式存儲(chǔ)在磁盤(pán)上

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

目錄樹(shù)

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

  1. start_kernel   
  2.   vfs_caches_init   
  3.     mnt_init   
  4.       init_rootfs     // 注冊(cè)rootfs文件系統(tǒng)  
  5.       init_mount_tree // 掛載rootfs文件系統(tǒng)   
  6.   …   
  7.   rest_init   
  8.   kernel_thread(kernel_init, NULL, CLONE_FS); 

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

軟鏈接 vs 硬鏈接

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

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

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

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

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

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

文件 & 磁盤(pán)管理

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

  1. # dtruss rm tmp  
  2. ...  
  3. geteuid(0x0, 0x0, 0x0)       = 0 0  
  4. ioctl(0x0, 0x4004667A, 0x7FFEE06F09C4)       = 0 0  
  5. lstat64("tmp\0", 0x7FFEE06F0968, 0x0)        = 0 0  
  6. access("tmp\0", 0x2, 0x0)        = 0 0  
  7. unlink("tmp\0", 0x0, 0x0)        = 0 0 

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

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

  2.  通過(guò) iget 增加 目錄文件的索引節(jié)點(diǎn)對(duì)象計(jì)數(shù)

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

  •  將目錄文件數(shù)據(jù)轉(zhuǎn)化為目錄項(xiàng)對(duì)象
  •  由于目錄項(xiàng)包含文件的索引節(jié)點(diǎn),類(lèi)似的,需要通過(guò) iget 增加文件的索引節(jié)點(diǎn)對(duì)象計(jì)數(shù)

  4.  刪除目錄的目錄項(xiàng)

  5.  減少文件索引節(jié)點(diǎn)對(duì)象的硬鏈接計(jì)數(shù)i_nlink

  6.  通過(guò) iput 結(jié)束對(duì)文件索引節(jié)點(diǎn)對(duì)象的操作,使用計(jì)數(shù) i_count 減一

  •  判斷i_count是否為零,如果為零,則釋放內(nèi)存
  •  然后,判斷i_nlink是否為零,如果為零,則釋放磁盤(pán)空間

  7.  通過(guò) iput 結(jié)束對(duì)目錄索引節(jié)點(diǎn)對(duì)象的操作。

總結(jié)

回頭來(lái)看遇到的問(wèn)題,其實(shí)可以從兩個(gè)角度來(lái)理解:

索引與數(shù)據(jù)

文件系統(tǒng)與文件、磁盤(pán)管理與文件、進(jìn)程管理與文件,最核心的都是文件的索引,而不是文件的數(shù)據(jù)。把數(shù)據(jù)和索引分開(kāi)是理解文件系統(tǒng)的關(guān)鍵。

緩存策略

由于操作系統(tǒng)使用 Write back 的策略,意味著只有先釋放內(nèi)存,才有可能釋放磁盤(pán)。

Why lsof ?

從上面的模型可以很清楚的理解,因?yàn)槟夸浺呀?jīng)沒(méi)有索引到文件了,但是打開(kāi)文件還有索引到文件,所以不能立刻釋放磁盤(pán)空間。

為什么 lsof 可以找到已刪除未釋放的文件呢?

lsof,顧名思義:list open files,該命令的原理就是查找打開(kāi)文件的列表,因此可以找到已刪除未釋放的文件。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 運(yùn)維派
相關(guān)推薦

2022-04-21 14:09:17

lsofLinux虛擬文件

2023-12-06 09:32:35

Linux系統(tǒng)

2020-07-22 14:53:06

Linux系統(tǒng)虛擬文件

2021-05-31 07:50:59

Linux文件系統(tǒng)

2018-09-12 15:48:35

ext4Linux文件系統(tǒng)

2019-05-22 09:00:16

Linux虛擬文件系統(tǒng)

2019-05-29 16:33:32

Linux虛擬系統(tǒng)

2018-08-24 10:10:25

Linux文件系統(tǒng)技術(shù)

2019-09-20 10:04:45

Linux系統(tǒng)虛擬文件

2019-06-14 14:58:58

虛擬文件系統(tǒng)Linux

2009-07-21 10:49:26

ASP.NET虛擬文件

2024-02-02 10:38:06

虛擬文件系統(tǒng)VFS

2023-02-10 08:11:43

Linux系統(tǒng)調(diào)用

2025-03-28 09:19:11

2010-03-02 14:21:30

Linux操作系統(tǒng)

2022-08-21 16:52:27

Linux虛擬內(nèi)存

2021-05-27 07:12:20

Ext2路徑Linux

2022-11-09 08:12:07

2011-04-11 16:48:12

Solaris權(quán)限

2023-09-18 11:34:17

Linux系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)