duコマンドの使い方です。
duコマンドをうまく使うと、現在 Linux マシンのどのディレクトリが一番ディスク容量を使っているのかを集計し、分かりやすく表示させることができます。
du コマンドはディスク使用量をディレクトリごとに集計するコマンド
単純に「du」だけでもコマンドは実行されますが、分かりにくいです。
[root@SAKURA_VPS /]# du ← / ディレクトリから「du」コマンドを実施しています。
4 ./boot/grub ← 4KB
2404 ./boot/grub2/i386-pc ← 2404KB、約2.4MBあります。
3296 ./boot/grub2/locale
2504 ./boot/grub2/fonts
8244 ./boot/grub2
0 ./boot/efi/EFI/centos
0 ./boot/efi/EFI
0 ./boot/efi
283104 ./boot
0 ./dev/vfio
0 ./dev/snd
0 ./dev/mqueue
0 ./dev/hugepages/libvirt/qemu
0 ./dev/hugepages/libvirt
0 ./dev/hugepages
0 ./dev/disk/by-id
0 ./dev/disk/by-uuid
0 ./dev/disk/by-partuuid
0 ./dev/disk/by-partlabel
0 ./dev/disk/by-path
|
duコマンドの単位は「1024バイト」
duのマニュアルを読むと、デフォルトでは「1024バイト単位(つまり1KB)」で表示されます。
‘du’ reports the amount of disk space used by the specified files and
for each subdirectory (of directory arguments). Synopsis:
du [OPTION]… [FILE]…
With no arguments, ‘du’ reports the disk space for the current
directory. Normally the disk space is printed in units of 1024 bytes,
but this can be overridden (*note Block size::). Non-integer quantities
are rounded up to the next higher unit.
|
ディレクトリの深さ(深度)を指定してサイズの表示単位を変更すると見やすくなる
ルートディレクトリからディレクトリの深さとサイズの表示単位を変更すると見やすくなります。
【オプション】
- -d ← ディレクトリの深度を指定します。「-d 1」で深さは1つのみに指定できます。
- -h ← 人が読みやすい形式で表示します。(例:10K、100M、2G など)
[root@SAKURA_VPS /]# pwd
/
[root@SAKURA_VPS /]# du -d 1 -h
277M ./boot
0 ./dev
du: `./proc/6669/task/6669/fd/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/6669/task/6669/fdinfo/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/6669/fd/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/6669/fdinfo/4′ にアクセスできません: そのようなファイルやディレクトリはありません
0 ./proc
29M ./run
0 ./sys
43M ./etc
1.4G ./root
108K ./tmp
779M ./var
6.9G ./usr
3.8G ./home
0 ./media
0 ./mnt
0 ./opt
0 ./srv
14G .
[root@SAKURA_VPS /]#
|
上のコマンドの結果より「/root」と「/home」ディレクトリでギガ単位でディスク容量を使用していることが分かります。
ログなど保存している「/var」ディレクトリはさほどディスク容量を使用していません。
–max-depth=X オプションの場合
「–max-depth=X」オプションもありますが、「-d X」オプションと同様です。
X にディレクトリの深さを指定します。
[root@SAKURA_VPS /]# du -h –max-depth=1
277M ./boot
0 ./dev
0 ./proc
29M ./run
0 ./sys
43M ./etc
1.4G ./root
260K ./tmp
6.3G ./var
6.9G ./usr
933M ./home
0 ./media
0 ./mnt
0 ./opt
0 ./srv
16G .
[root@SAKURA_VPS /]#
|
ディレクトリを絞り、結果をソートすると更に見やすくなる
du コマンドでディレクトリを絞り、更に結果を「sort」コマンドでソートすると結果が見やすくなります。
まずは単純に「sort」コマンドだけを入れた場合です。(ディレクトリの深さは「2」にしています)
[root@SAKURA_VPS /]# du -d 2 -h | sort
0 ./boot/efi
0 ./dev
0 ./dev/block
0 ./dev/bsg
0 ./dev/bus
0 ./dev/char
0 ./dev/cpu
0 ./dev/disk
0 ./dev/dri
0 ./dev/hugepages
~ 省略 ~
1.3G ./usr/lib ← 1.3G が上に来ています。
1.4G ./root
1.4M ./root/.local ← 1.4M が 1.3G より数値が大きいことになっています。
1.5G ./usr/share
1.5M ./etc/pki
100K ./etc/rpm
104K ./etc/profile.d
105M ./var/www
108K ./tmp
120K ./etc/letsencrypt |
単純に「sort」コマンドを入れただけだと「昇順(0→1→2→3→4→5)」で表示されます。
そのため「sort -r」コマンドで「降順(5→4→3→2→1→0)」で表示されるようにします。
更に「単位」が合っていなくてソートがうまく出来ていないため、「単位」を合わせます。
[root@SAKURA_VPS /]# du -d 2 -m | sort -r
du: `./proc/9154/task/9154/fd/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9154/task/9154/fdinfo/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9154/fd/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9154/fdinfo/4′ にアクセスできません: そのようなファイルやディレクトリはありません
919 ./home/test
9 ./boot/grub2 ← 「数値」としてソートではなく「辞書順」でソートされてしまいます。
8 ./etc/udev
779 ./var
756 ./root/.pyenv
7 ./root/.npm
6997 ./usr
64 ./usr/sbin
6 ./root/pyparsing-2.0.3
54 ./usr/include
532 ./root/.cache
50 ./var/spool
5 ./var/cache
|
「11111」より「9」の方が上に来ます。
sortコマンドはデフォルトで「辞書順」に表示されるので(これはこれで非常に便利です)、「数値」でソートされるようにします。
[root@SAKURA_VPS /]# du -d 2 -m | sort -r -n
du: `./proc/9436/task/9436/fd/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9436/task/9436/fdinfo/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9436/fd/4′ にアクセスできません: そのようなファイルやディレクトリはありません
du: `./proc/9436/fdinfo/4′ にアクセスできません: そのようなファイルやディレクトリはありません
13373 .
6997 ./usr
3834 ./home
3148 ./usr/lib64
1519 ./usr/share
1416 ./root
1264 ./usr/lib
919 ./home/test
779 ./var
756 ./root/.pyenv
532 ./root/.cache
|
これでようやくやりたいことはできるようになったと思います。
他に「du」コマンドのオプションとしては「–exclude=<パターン>」があります。
これはパターンに合ったディレクトリやファイル名を除外するというオプションです。
[root@SAKURA_VPS /]# du -d 2 -m –exclude=’proc’ | sort -r -n
13373 .
6997 ./usr
3834 ./home
3148 ./usr/lib64
1519 ./usr/share
1416 ./root
1264 ./usr/lib
919 ./home/test
779 ./var
756 ./root/.pyenv
532 ./root/.cache
|
■「–exclude」オプションの詳細
日本語
–exclude=PATTERN
PATTERN に一致するファイルを含めない ‘-X FILE’
英語
‘–exclude-from=FILE’
Like ‘–exclude’, except take the patterns to exclude from FILE,
one per line. If FILE is ‘-‘, take the patterns from standard
input.
→’–exclude’ オプションのように、FILEから除外するパターンを1行に1つずつ取ります。
FILEが ‘ – ‘の場合、標準入力からパターンを取り出します。
‘–exclude=PATTERN’
When recursing, skip subdirectories or files matching PATTERN. For
example, ‘du –exclude=’*.o” excludes files whose names end in
‘.o’.
→再帰するときは、PATTERNに一致するサブディレクトリまたはファイルをスキップします。
たとえば、 ‘du –exclude =’*.o’ は名前が ‘.o’ で終わるファイルを除外します。
|
つまり「–exclude=’proc’」の場合は「proc」ディレクトリをスキップしますが、ファイル名で「proc」があった場合もスキップされてしまうので注意です。
その仕様が分かっていれば、「–exclude=PATTERN」を使っても特に問題は生じないと思います。
du コマンドで巨大なファイルを見つけた時の対処方法
du コマンドを利用して巨大なファイルを見つけた場合の対処方法として以下が考えられます。
- ログローテートする(ログファイルが巨大な場合)
- 緊急対処として、ファイルの中身を空にする
ファイルの中身を空にするコマンド
以下の巨大なファイルが見つかりました。
[root@SAKURA_VPS python]# ls -lh
合計 5.4G
-rw-rw-r– 1 test test 5.4G 6月 8 00:00 app.log ← 5.4GB あります。
[root@SAKURA_VPS python]#
|
本当はログのローテートをするべきですが、ここでは「ファイルの中身を空にするコマンド」を試します。
コマンドでファイルの中身を空にするには「cp /dev/null <空にするファイル>」コマンドを使用します。
[root@SAKURA_VPS python]# cp /dev/null app.log
cp: `app.log’ を上書きしますか? yes
[root@SAKURA_VPS python]# ls -lh
合計 0
-rw-rw-r– 1 test test 0 6月 10 10:17 app.log ← ファイルの中身が空になっています。
[root@SAKURA_VPS python]# cat app.log
[root@SAKURA_VPS python]#
|
コメント