schedule2019-03-11

Linuxで容量を圧迫しているディレクトリを見つける

Linuxの容量が気づかないうちに逼迫していることがあります。 下のようなMySQLのエラーが出て対処しようにも、どのディレクトリに大きなファイルがあるかCUIだと分りませんでした。

勉強も兼ねて、容量などを確認するコマンドを調べました。

Contents

環境

Paiza cloudでサーバを立てて確認しています。

  • Ubuntu
  • "18.04.1 LTS

サーバの容量を確認する df

dfコマンドでサーバのサイズを確認できます。 -hはサイズの単位を表示します。MMB(メガバイトの意味)。

~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
none            976M   73M  837M   8% /
tmpfs            64M     0   64M   0% /dev
tmpfs           997M  108K  997M   1% /run
/dev/vda2        50G   26G   22G  54% /bin/busybox
tmpfs           997M     0  997M   0% /run/lock
shm              64M  8.0K   64M   1% /dev/shm
tmpfs           997M     0  997M   0% /sys/fs/cgroup
tmpfs           997M     0  997M   0% /proc/acpi
tmpfs           997M     0  997M   0% /proc/scsi
tmpfs           997M     0  997M   0% /sys/firmware

ディスクの容量が50GBだとわかりました。 そのうち54%が使用済みです。

tmpfsは一時ディレクトリです。 物理メモリ上にキャッシュファイルや作業用ファイルを置いている。

duコマンドでディレクトリの使用量を確認する

使用量はduコマンドで確認できます。 /var/log/の中のファイルを確認してみます。

$ sudo du -h /var/log/
8.0K    /var/log/postgresql
8.0K    /var/log/apache2
17M     /var/log/journal/e0a80523b9ab48919913e00e5e2544dc
8.1M    /var/log/journal/fba829e3bd3d41cfa84bc5fa93da9059
25M     /var/log/journal
708K    /var/log/apt
4.0K    /var/log/mongodb
4.0K    /var/log/dbconfig-common
4.0K    /var/log/redis
4.0K    /var/log/sysstat
24K     /var/log/mysql
4.0K    /var/log/apparmor
4.0K    /var/log/unattended-upgrades
4.0K    /var/log/dist-upgrade
27M     /var/log/

ディレクトリの使用量を再帰的に読み込みます。 /var/log/journalが一番大きいディレクトなので、ここから整理すると良いことがわかりました。

オプションhはdfの時と同じく見やすい単位にしてくれます。 単位を揃えたいときは、b,k,m で変えられます。

オプション 意味
-h サイズに応じて読みやすい単位で表示する
-b サイズを B バイト単位で表示
-k サイズを kB キロバイト単位で表示
-m サイズを MB メガバイト単位で表示

サイズをメガバイト単位で表示する。

$ sudo du -m /var/log/
1       /var/log/postgresql
1       /var/log/apache2
17      /var/log/journal/e0a80523b9ab48919913e00e5e2544dc
9       /var/log/journal/fba829e3bd3d41cfa84bc5fa93da9059
25      /var/log/journal
1       /var/log/apt
1       /var/log/mongodb
1       /var/log/dbconfig-common
1       /var/log/redis
1       /var/log/sysstat
1       /var/log/mysql
1       /var/log/apparmor
1       /var/log/unattended-upgrades
1       /var/log/dist-upgrade
27      /var/log/

サイズが大きいディレクトリを探す

どのディレクトリが大きいか目星が無く、全て確認したいときもあるかと思います。 duでは全てのディレクトリを表示してしまうので、見づらくなります。

大きいサイズから10件取り出すコマンドの組み合わせが下記になります。

sudo du -m / | sort -n | tail -10
  1. du -m /: 全ディレクトリをMB単位でサイズを表示。
  2. sort -n: 昇順に並べる。
  3. tail -10: 後ろの10行を表示する。

以上をパイプラインで繋いでいます。

$ sudo du -m / | sort -n | tail -10
507     /var
529     /usr/local/rbenv/versions/2.5.3/lib/ruby/gems
529     /usr/local/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0
544     /usr/lib/ghc
544     /usr/local/rbenv/versions/2.5.3/lib/ruby
561     /usr/local/rbenv/versions/2.5.3/lib
621     /usr/bin
631     /usr/local/rbenv/versions
631     /usr/local/rbenv/versions/2.5.3
636     /usr/local/rbenv
655     /usr/lib/x86_64-linux-gnu
676     /usr/local/swift-4.2-RELEASE-ubuntu18.04
676     /usr/local/swift-4.2-RELEASE-ubuntu18.04/usr
693     /usr/local/lib/node_modules
968     /usr/share
1323    /usr/local/lib
3403    /usr/lib
3978    /usr/local
9077    /usr
10429   /

大きいサイズのディレクトリが分りました。 これをもとに整理していきます。

ディレクトリ毎の使用量を確認する

$ du -d 1で一階層だけ表示できる。 階層の深さを数値で指定できます。

$ sudo du -h -d 1 | sort -h
du: cannot access './proc/3752/task/3752/fd/4': No such file or directory
du: cannot access './proc/3752/task/3752/fdinfo/4': No such file or directory
du: cannot access './proc/3752/fd/3': No such file or directory
du: cannot access './proc/3752/fdinfo/3': No such file or directory
0       ./proc
4.0K    ./boot
4.0K    ./lib64
4.0K    ./media
4.0K    ./mnt
4.0K    ./srv
4.0K    ./sys
8.0K    ./dev
16K     ./lost+found
32K     ./paizacloud
44K     ./tmp
84K     ./home
108K    ./run
5.8M    ./lib32
8.7M    ./etc
8.8M    ./sbin
12M     ./bin
45M     ./lib
257M    ./root
496M    ./opt
529M    ./var
8.9G    ./usr
11G     .

参考