よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

du と ls ファイルサイズの違い

大した事では無いが、純粋に知らなかったシリーズ。

目次

気づき

この間ログのファイルサイズ調べていたんですよ。
で、普段何も考えずにduかlsなりでファイルサイズ調べてたんですが、コマンドの結果ある違いが。

# du -sh *
60K     access_log
3.6M    access_log-20181220
144K    access_log-20190108
4.0K    error_log
200K    error_log-20181221
28K     error_log-20190108

# ls -lh
total 14M
-rw------- 1 59K Jan  8 16:23 access_log
-rw-r--r-- 1  3.6M Jan  7 15:53 access_log-20181220
-rw------- 1 137K Jan  8 03:15 access_log-20190108
-rw------- 1 2.2K Jan  8 16:03 error_log
-rw-r--r-- 1 194K Jan  7 12:43 error_log-20181221
-rw------- 1 25K Jan  8 02:27 error_log-20190108

…ん?微妙にサイズ違くないですか??少しだけduで調べたファイルサイズのほうが大きいですね。

du と lsのファイルサイズの違い

いきなり結論から言ってしまうと、duはブロックサイズを表示しており、lsはバイト単位でファイル容量を表示しているので、微妙な誤差が出ているだけです。

なんか知ったように言っていますが、全然知らなかったので少し調べました。

ブロックサイズとは?

ファイルシステムはデータを保存する際に1ビットずつディスクを管理しているのではなく、効率化の為にまとまった単位で管理をしています。この単位がブロックサイズです。私の環境ですと、rootのファイルシステムはext4で、こちらのブロックサイズを確認してみます。

# /sbin/tune2fs -l /dev/vda2 | grep "Block size"
Block size:               4096

Block sizeは4096で4KByteになります。先に記述した通り、ファイルシステムはブロックサイズ単位で管理する為、たとえば1〜2Byteのファイルを作成しても、4KByte分領域を確保します。

# echo "a" > test.txt
# ls -lh test.txt
-rw-r--r-- 1 root root 2 Jan  8 17:03 test.txt

aだけが記述されたファイルを作成し、ls で確認したところ2Byteファイル領域を使用しているのがわかります。但し、こちらを、duで確認してみると…

# du -h test.txt
4.0K    test.txt

と上記のようにブロックサイズとしては4KByte利用しているのが確認できます。実際に利用していなくても、ブロックサイズとしては確保しているんですね。へぇ…

冒頭のdu ls のファイルサイズの違いに話を戻すと、lsはバイト単位での使用量、duではブロックサイズでの使用量を表示している為、微妙にduの方がファイルサイズ大きくなりますね。
※本当にあっているか不安なので、間違いあればご指摘下さい。

ここまで書いて思ったのが、結局ファイルサイズを聞かれた場合、どちらを伝えるのが正しいんですかね?ううむ…