成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

系統 Linux
有時會出現這樣的情況,磁盤空間顯示已經被占滿,但是在查看磁盤的具體文件占用情況時,發現磁盤仍然有很大的空余空間。

 

背景

有時會出現這樣的情況,磁盤空間顯示已經被占滿,但是在查看磁盤的具體文件占用情況時,發現磁盤仍然有很大的空余空間。

1.執行df命令查看磁盤使用情況,發現磁盤已經滿了。 

  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.執行 du 命令查看各個目錄的磁盤占用情況,把各個目錄文件的大小相加,發現并沒有占滿磁盤,有10多G空間莫名失蹤。 

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

3.為何會出現這樣的情況呢?

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

  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 的文件系統,到底為什么這么設計呢?要了解這些,就要先弄清楚并不容易,下面將從一些基本概念入手,一步步將這些梳理清楚:

  •  什么是虛擬文件系統(VFS:virtual filesystem)?
  •  什么是通用文件模型?
    •  超級塊對象(superblock object)
    •  索引節點對象(inode object)
    •  文件對象(file object)
    •  目錄項對象(dentry object)
    •  文件的概念
  •  文件的表達
    •  內存表達
    •  磁盤表達
  •  目錄樹的構建
    •  軟鏈接 vs 硬鏈接
  •  文件 & 磁盤管理
    •  索引節點狀態
  •  文件 & 進程管理
    •  操作:

        打開&刪除

虛擬文件系統(virtual filesystem)

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

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

通用文件模型

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

超級塊對象(superblock object)

內存:文件系統安裝時創建,存放文件系統的有關信息

磁盤:對應于存放在磁盤上的文件系統控制塊(filesystem control block)

索引節點對象(inode object)

內存:訪問時創建,存放關于具體文件的一般信息(inode 結構)

磁盤:對應于存放在磁盤上的文件控制塊(file control block)

每個索引節點對象都有一個索引節點號,唯一地標識文件系統的文件

文件對象(file object)

內存:打開文件時創建,存放 打開文件 與進程之間進行交互的有關信息(file 結構)

打開文件信息,僅當進程訪問文件期間存在于內核內存中。

目錄項對象(dentry object)

內存:目錄項一旦被讀入內存,VFS就會將其轉換成dentry 結構的目錄項對象

磁盤:特定文件系統以特定的方式存儲在磁盤上

存放目錄項(即,文件名稱)與對應文件進行鏈接的有關信息

目錄樹

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

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

就單個文件系統而言,在文件系統安裝時,創建超級塊對象;沿樹查找文件時,總是首先從初識目錄的中查找匹配的目錄項,以便獲取相應的索引節點,然后讀取索引節點的目錄文件,轉化為dentry對象,再檢查匹配的目錄項,反復執行以上過程,直至找到對應的文件的索引節點,并創建索引節點對象。

軟鏈接 vs 硬鏈接

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

文件 & 進程管理

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

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

  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 

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

文件 & 磁盤管理

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

  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 

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

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

  2.  通過 iget 增加 目錄文件的索引節點對象計數

  3.  讀取目錄文件數據

  •  將目錄文件數據轉化為目錄項對象
  •  由于目錄項包含文件的索引節點,類似的,需要通過 iget 增加文件的索引節點對象計數

  4.  刪除目錄的目錄項

  5.  減少文件索引節點對象的硬鏈接計數i_nlink

  6.  通過 iput 結束對文件索引節點對象的操作,使用計數 i_count 減一

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

  7.  通過 iput 結束對目錄索引節點對象的操作。

總結

回頭來看遇到的問題,其實可以從兩個角度來理解:

索引與數據

文件系統與文件、磁盤管理與文件、進程管理與文件,最核心的都是文件的索引,而不是文件的數據。把數據和索引分開是理解文件系統的關鍵。

緩存策略

由于操作系統使用 Write back 的策略,意味著只有先釋放內存,才有可能釋放磁盤。

Why lsof ?

從上面的模型可以很清楚的理解,因為目錄已經沒有索引到文件了,但是打開文件還有索引到文件,所以不能立刻釋放磁盤空間。

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

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

 

責任編輯:龐桂玉 來源: 運維派
相關推薦

2022-04-21 14:09:17

lsofLinux虛擬文件

2023-12-06 09:32:35

Linux系統

2020-07-22 14:53:06

Linux系統虛擬文件

2021-05-31 07:50:59

Linux文件系統

2018-09-12 15:48:35

ext4Linux文件系統

2019-05-29 16:33:32

Linux虛擬系統

2019-09-20 10:04:45

Linux系統虛擬文件

2018-08-24 10:10:25

Linux文件系統技術

2019-05-22 09:00:16

Linux虛擬文件系統

2019-06-14 14:58:58

虛擬文件系統Linux

2009-07-21 10:49:26

ASP.NET虛擬文件

2024-02-02 10:38:06

虛擬文件系統VFS

2023-02-10 08:11:43

Linux系統調用

2025-03-28 09:19:11

2010-03-02 14:21:30

Linux操作系統

2022-08-21 16:52:27

Linux虛擬內存

2021-05-27 07:12:20

Ext2路徑Linux

2022-11-09 08:12:07

2011-04-11 16:48:12

Solaris權限

2022-09-01 08:08:35

Android移動操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品二区 | 一区二区三区视频免费观看 | 欧美专区在线 | 免费一区二区三区 | 久久久美女 | 亚洲高清在线 | 亚洲视频在线看 | 一区中文字幕 | 成人免费视频 | 免费毛片网 | 91 在线 | 久久久久国产精品www | 91影院| a爱视频| 久久久美女 | 午夜欧美a级理论片915影院 | 精品日韩在线 | 综合久久av| 国产97在线看 | 国产伦一区二区三区四区 | 精品视频一区二区三区在线观看 | 国产成人a亚洲精品 | 国产精品久久久久久久久大全 | 久久精品国产一区二区电影 | 日韩精品一区二区三区在线观看 | 国产乱码精品一品二品 | 一区二区福利视频 | 久久综合一区 | 91国内外精品自在线播放 | 国产精品美女一区二区 | 美女久久 | 国产精品久久久久久久久久久久午夜片 | 成人性生交大片免费看中文带字幕 | 国产成在线观看免费视频 | 欧美专区在线 | 91av导航 | 久久久久久精 | 精品久久国产 | 精品在线观看一区 | 精品亚洲一区二区三区 | 成年女人免费v片 |