

Linuxで下記のような事象に遭遇しました。ご存じの方は教えて欲しいです。

### 事象

`df -h` コマンドでマウントしているボリュームが50GBのサイズを有している

`du -h` コマンドでマウントしているディレクトリの総サイズを調べてみたら、59GBでした。

### 質問1

何故duで計算した結果はボリュームのサイズを超えたか？

### 質問2

この二つのコマンドの計算が違うか？

### 試したこと

  * duのハードリンク、シンボルリンクと辿らないようなオプションを付ける
  * findコマンドでtypeがfの全部を探して、duで個々のサイズを計算し、総量を出す

### 想像した原因

  1. ハードリンク、シンボルリンクが数回duによって計算された  
→ findでファイルだけ出して計算しても同じなので、関係なさそう

  2. 該当ディレクトリのしたにまたは別のボリュームがマウントしている  
→ なかった

  3. Windowsのような、ファイルを圧縮して保存という機能が有効  
→ 不明


CC BY-SA 4.0
2021-06-21T02:52:30.057
77672
2021-06-24T07:01:09.160
2021-06-21T05:57:43.540
3060
46960
question
linux filesystems
dfコマンドで出力したサイズを超えたduの計算結果の原因を求める


ボリュームのマウントポイント(=計測ポイント)のディレクトリのサブディレクトリに別のボリュームをマウントしている場合、「`du`」の結果が「`df`」の結果を超える(ボリュームサイズを超える)ことがあると思います。

例えば、次のような場合、`du`の結果が`df`の結果を超えます。

[code]

    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda3             50G   40G   10G  80% /var
    /dev/sda4             20G   18G    2G  90% /var/log
    
[/code]

  * `df -h /var`は`50G`となる。(50GBのSize)
  * `du -sh /var`は`58G`となる。(Usedの`40G`と`18G`の合計値)


CC BY-SA 4.0
2021-06-23T10:35:02.697
77740
2021-06-23T10:35:02.697
20098
77672
answer


思いつくのはこれくらいですね。

  1. オープンしたまま削除されたファイルが存在している。  
`lsof /path/to/mount/point |grep '(deleted)$`

  2. 拡張属性 (SELinux ラベルも含む) が大量に付与されているファイルが多数存在する。

`getfattr --recursive --no-dereference --dump /path/to/mount/point`

  3. ACL が大量に付与されているファイルが多数存在する。

`getfacl --recursive /path/to/mount/point`

  4. ファイルシステムが壊れている。

多くの場合は 1、稀に 4 はあるかと思いますが、2 と 3 は見たことありません。  
ちなみに拡張属性と ACL は、少ない数とサイズであれば、inode 内に保存されます。(ファイルシステムの種類と inode サイズに依る。Linux
なら XFS や ext4)


CC BY-SA 4.0
2021-06-24T07:01:09.160
77755
2021-06-24T07:01:09.160
3061
77672
answer