大した事では無いが、純粋に知らなかったシリーズ。
目次
気づき
この間ログのファイルサイズ調べていたんですよ。
で、普段何も考えずに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の方がファイルサイズ大きくなりますね。
※本当にあっているか不安なので、間違いあればご指摘下さい。
ここまで書いて思ったのが、結局ファイルサイズを聞かれた場合、どちらを伝えるのが正しいんですかね?ううむ…