Linuxオペレーティングシステムは、その強力なコマンドライン機能でよく知られています。システム管理者として、私は数百台のLinuxサーバーを運用していますが、そのほとんどはKDEやGnomeのようなグラフィカルユーザーインターフェース(GUI)さえも利用していません。サーバーのメンテナンスには、様々な便利で複雑なコマンドに関する幅広い知識が必要です。
大量のデータ(有用なものもあればそうでないものもあります)を保存・書き込むシステムでは、ディスク容量がしばしば頭痛の種となります。QDirStat、GdMap、xdiskusage、そしてGnomeのDisk Usage Analyzerは、いずれもディスク容量の使用量を測定できるグラフィックベースのユーティリティとして便利ですが、私はコマンドラインから使用する独自のコマンドツールキットを持っており、それらは私にとってなくてはならないものと言っても過言ではありません。以下に、私のお気に入りの例をいくつか紹介します。
これらの例は Red Hat Linux システムで実行されています (ただし、別のディストリビューションを使用している場合でも問題ありません)。また、最大限の効率を得るには、これらを root として実行するための sudo アクセス権が必要です。
空き容量を確認しています
1.df
これは最も基本的なコマンドです。df はディスクの空き容量を表示できます。実行すると、以下の結果が返されます。
[root@smatteso-vm1 ~]# df
ファイルシステム 1Kブロック 使用済み 使用可能 使用率 マウント先
/dev/vda2 75987032 25075944 47044888 35% /
tmpfs 8162268 92 8162176 1% /dev/shm
/dev/vda1 245679 69859 162713 31% /ブート
devnfs:/tools 611916000 162727328 418098496 29% /tools
これはディスク使用量に関する生の統計をバイト単位で表示しますが、より「人間が読みやすい」ものにするには、-h スイッチを付けて df を実行します。
2.df -h
[root@smatteso-vm1 ~]# df -h
ファイルシステムサイズ 使用済み 使用可能使用率 マウント先
/dev/vda2 73G 24G 45G 35% /
tmpfs 7.8G 92K 7.8G 1% /dev/shm
/dev/vda1 240M 69M 159M 31% /ブート
devnfs:/tools 584G 156G 399G 28% /tools
少し見やすくなりましたね。ルートボリュームは73GBで、空き容量は45GBです。
3.df -Th
ディスク容量の問題を把握する際には、どのような種類のファイルシステムを扱っているかを把握し、それに応じた計画を立てることが重要です。例えば、Linuxのext4ファイルシステムは最大16TBのファイルシステムサイズを持ち、最大2TBのファイルをサポートできます。
「df -Th」コマンドは、前のコマンドと同じ出力を表示しますが、ファイルシステムの種類も含まれます。
[root@smatteso-vm1 usr]# df -T -h
ファイルシステム タイプ サイズ 使用済み 空き容量 使用率 マウント先
/dev/vda2 ext4 73G 24G 45G 35% /
tmpfs tmpfs 7.8G 92K 7.8G 1% /dev/shm
/dev/vda1 ext4 240M 69M 159M 31% /boot
devnfs:/tools nfs 584G 156G 399G 29% /tools
データサイズを見つける
空き領域を確認する方法がわかったので、実際に領域を使用しているものを確認するにはどうすればよいでしょうか。
4.du -sh *
duコマンドは「ディスク使用量」の略です。最も基本的な使い方としては、ルートボリュームで「du」を実行するだけで、システム上のすべてのディレクトリのサイズが表示されます。ただし、大量の情報が出力され、解析が困難になる場合があります。
スイッチ -sh (「s」は「要約」を意味し、「h」は「人間が読める形式」を意味します) を追加してルート ボリュームで du – sh * を実行すると、よりきれいな出力が生成されます。
[root@smatteso-vm1 /]# du -sh *
0 ベバップ
12Mビン
67Mブート
0 CTF
16M db2dump
304K 開発
65Mなど
0 FEVAP
0 HHFE
2.1Gホーム
0 LDW
329M ライブラリ
30M lib64
16K 遺失物
4.0K メディア
0 その他
4.0K分
0 ネット
2.8Gオプション
0 プロセス
0 公開認証
130万ルート
20K RTVIEW
16M sbin
4.0K 壊血病
4.0K セリナックス
4.0K サービス
0 システム
430万tmp
7.1Gツール
15G ユーザー
3.9G 可変
どのディレクトリに最も多くのデータが含まれているかは簡単にわかります。usrディレクトリは15GB、toolsディレクトリは7.1GB、varディレクトリは3.9GBです。/varディレクトリに注目してみましょう。
/var に移動して du –sh * を再実行し、その下のディレクトリのサイズを確認することもできますが、サイズの異なるサブディレクトリが多数存在するため、同じコマンドを何度も実行しなければならず、あまり役に立たないかもしれません。代わりに、次のコマンドを実行できます。
5.du -a /var |並べ替え -nr |頭 -n 10
このコマンド文字列を解析してみましょう。
もちろん、du はディスク使用量コマンドです。
-a はすべての項目を表示する「all」スイッチです。
/var は、du に /var ディレクトリをスキャンするように指示します。
パイプ (「|」) 文字は結果を sort コマンドにパイプします。
sort -nr は、リストの先頭に最大のディレクトリを表示します。
パイプ (「|」) 文字は結果を head コマンドにパイプします。
head -n 10 は、結果の数を上位 10 個の最大のディレクトリに制限します。
これを自分のシステムで実行すると、次の出力が得られます。
[root@smatteso-vm1 var]# du -a /var |並べ替え -nr |頭 -n 10
4042044 /var
3473128 /var/キャッシュ
3470188 /var/cache/yum
572308 /var/cache/yum/x86_64
572304 /var/cache/yum/x86_64/6Server
375388 /var/log
373056 /var/cache/yum/rhel6-auto-20170111
370676 /var/cache/yum/rhel6-auto-20161228
370496 /var/cache/yum/rhel6-auto-20161214
370308 /var/cache/yum/rhel6-auto-20161130
これを見ると、最大の項目は (当然ですが) /var ディレクトリ自体であり、次に /var/cache と /var/cache/yum が続いていることがわかります。
リストの下部にある4つのディレクトリは、2週間ごとにロールアウトされるパッチセットを表しています。それより前のディレクトリは削除しても問題ないので、rm -rf /var/cache/yum/rhel6-auto-2016* コマンドを実行すると、古いパッチセットディレクトリから1GB以上の空き容量を確保できます。
注: これをファイルシステム全体に対して実行するには、次のように変更します。
du -a /var |並べ替え -nr | head -n 10
から
du -a / |並べ替え -nr |頭 -n 10
正規表現と呼ばれるものを使って、より技術的に、より明確に結果をフィルタリングすることも可能です。それでは、ファイルシステム全体を詳しく見ていきましょう。
6.du -xh / |grep '^\S*[0-9\.]\+G'|sort -rn
非常に複雑に見えますが、分解するのは簡単です。
duはディスク使用量のコマンドです
-x は、du にこのファイル システムのみをチェックするように指示し (コマンドの実行速度が速くなります)、その後の h は結果を人間が読める形式で表示するように指示します。
パイプ (「|」) 文字は結果を grep コマンドにパイプします。
grep は、'^\s*[0-9\.]\+G' 正規表現を使用して結果を検索します – [0-9\.] は、(^\S) で始まるすべてのディレクトリとサブディレクトリをリストします (タブ、キャリッジ リターンなど) – 英字のみを表示する必要があります (数字は表示されません)。また、+G は 1 Gb 以上のサイズのディレクトリを表示します。
パイプ (「|」) 文字は結果を sort コマンドにパイプします。
sort -rn は、リストの先頭に最大のディレクトリを表示します。
これを自分のシステムで実行すると、次の出力が得られます。
[root@smatteso-vm1 var]# du -xh / |grep '^\S*[0-9\.]\+G'|sort -rn
24G /
15G /usr
12G /usr/local
5.7G /usr/local/litle-db/phxinst1
5.7G /usr/local/litle-db
3.9G /可変
3.4G /var/cache/yum
3.4G /var/キャッシュ
3.2G /usr/local/litle-build
2.8G /オプション
2.7G /usr/local/litle-tools
2.1G /home/smatteso/bin
2.1G /ホーム/スマテソ
2.1G /自宅
1.7G /usr/share
1.6G /usr/local/litle-db/phxinst1/FEVAP
1.6G /usr/local/litle-db/phxinst1/BEVAP
1.5G /usr/local/litle-build/LETS
1.1G /opt/ibm/db2/V9.7
1.1G /opt/ibm/db2
1.1G /opt/ibm
これにより、2.1 Gb を使用しているため、ホーム ディレクトリの下にいくらかのスペースが解放される可能性があることがわかります。
ディレクトリをクリーンアップすることはスペースを節約する方法の一つですが、大きなファイルを見つけるためにあちこち探し回るのは面倒です。「find」コマンドを使えば、どのファイルがスペースを占有しているのかを正確に特定できます。
7.find / -printf '%s %p\n'| ソート -nr | ヘッド -10
上記は私のお気に入りのコマンドの一つで、システム上のファイルサイズが最も大きい10個を表示してくれます。前回と同様に、詳しく見ていきましょう。
find は、当然ですが、ファイルを検索するための find コマンドです。
/ はルートボリュームです
-printf '%s %p\n' は、ファイル サイズ (バイト単位) (%s) とファイル名 (%p) を表示して、結果を適切にフォーマットします。
パイプ (「|」) 文字は結果を sort コマンドにパイプします。
sort -nrはリストの先頭に最大のディレクトリを表示します。
パイプ (「|」) 文字は結果を head コマンドにパイプします。
head -n 10 は、結果の数を上位 10 個の最大のディレクトリに制限します。
これを私のシステムで実行すると、次のようになります。
[root@smatteso-vm1 var]# find / -printf '%s %p\n'|並べ替え -nr |頭-10
582359040 /tools/infra/DWI_Bundles/3.0/LETS/LETS.tar
582359040 /tools/infra/DWI_Bundles/2.0/LETS/LETS.tar
582348800 /usr/local/litle-build/LETS/LETS-1.3.2-RC1.tar
572129280 /tools/infra/DWI_Bundles/4.0/eclipse/eclipse.tar
572129280 /tools/infra/DWI_Bundles/3.0/eclipse/eclipse.tar
571985920 /tools/infra/DWI_Bundles/1.0/LETS/LETS.tar
491255472 /usr/local/litle-build/LETS/eclipse-lets-mars-2-linux.gtk.x86_64.tar.gz
489757504 /usr/local/litle-build/LETS/eclipse-lets-mars-2-linux.gtk.x86_64.rc1.tar.gz
407285760 /tools/infra/DWI_Bundles/4.0/accurev/accurev.tar
407285760 /tools/infra/DWI_Bundles/3.0/accurev/accurev.tar
古い「DWI_Bundles」ディレクトリには何も必要ないので、これらは削除するのに適したターゲットです。
最後の例はさらに細かくなります。
8.find / -xdev -type f -size +100M -exec ls -la {} \; | sort -nk 5
find は、当然ですが、ファイルを検索するための find コマンドです。
/ はルートボリュームです。
-xdev – このファイル システムのみを検索します。
-type f – ファイルを検索します。
-size +100M – サイズが 100 MB を超えるファイルのみを表示します。
-exec ls -la {} \; – ls コマンドを実行して、すべてのファイルを長いリスト形式で表示します。
パイプ (「|」) 文字は結果を sort コマンドにパイプします。
sort -nk 5 は、リストの一番下に最大のファイルを表示します。
これを私のシステムで実行すると、次の結果が生成されます。
[root@smatteso-vm1 var]# find / -xdev -type f -size +100M -exec ls -la {} \; | sort -nk 5
-rwxr-x— 1 dev dev 113187613 2015 年 2 月 27 日 /usr/local/litle-tools/forgerock/OpenAM-12.0.0.war
-rwxr-x— 1 dev dev 113231850 2015 年 8 月 12 日 /usr/local/litle-tools/forgerock/OpenAM-12.0.1.war
-rw——- 1 スカイボット スカイボット 131764520 10月27日 15:11 /opt/skybot/server/webapps/skybot-scheduler/download/setupSkybotSchedulerAgent.exe
-rw-r–r–. 1 ルート ルート 142451712 10月26日 21:26 /var/cache/yum/x86_64/6Server/mrepo-frozen/d0af4ba21f53f3b5446243c02ee431ca-primary.sqlite
-rw-r–r– 1 ルート ルート 159047680 1月24日 18:03 /var/cache/yum/mrepo-frozen/674a5eb91f391a4beeeae99c41673b01-primary.sqlite
-rw-r–r–. 1 ルート ルート 159047680 10月26日 21:18 /var/cache/yum/DWI-Frozen/674a5eb91f391a4beeeae99c41673b01-primary.sqlite
-rw-r–r– 1 ルート ルート 182671360 10月27日 17:59 /var/cache/yum/x86_64/6Server/mrepo-frozen/b41a2f136ca45aa8150ec03f6f54dd0f-filelists.sqlite
-rw-r–r–. 1 ルート ルート 195055616 10月26日 21:19 /var/cache/yum/DWI-Frozen/0757540d1eef7635c93e9295f1e31694-filelists.sqlite
-rw-r–r– 1 ルート ルート 332309504 11月20日 17:44 /var/cache/yum/rhel6-p202.1-20161027/primary.xml.gz.sqlite
-rw-r–r– 1 ルート ルート 336006144 12月4日 16:52 /var/cache/yum/rhel6-auto-20161116/primary.xml.gz.sqlite
-rw-r–r– 1 ルート ルート 339330048 12月17日 19:46 /var/cache/yum/rhel6-auto-20161130/primary.xml.gz.sqlite
-rw-r–r– 1 ルート ルート 339509248 1月1日 18:05 /var/cache/yum/rhel6-auto-20161214/primary.xml.gz.sqlite
-rw-r–r– 1 ルート ルート 339685376 1月14日 21:24 /var/cache/yum/rhel6-auto-20161228/primary.xml.gz.sqlite
-rw-r–r– 1 ルート ルート 339730432 1月24日 18:04 /var/cache/yum/rhel6-auto-20170111/primary.xml.gz.sqlite
-rw-r–r– 1 dev dev 489757504 11月8日 14:40 /usr/local/litle-build/LETS/eclipse-lets-mars-2-linux.gtk.x86_64.rc1.tar.gz
-rw-r–r– 1 dev dev 491255472 11月16日 14:43 /usr/local/litle-build/LETS/eclipse-lets-mars-2-linux.gtk.x86_64.tar.gz
-rw-rw-r– 1 dev dev 582348800 11月22日 11:24 /usr/local/litle-build/LETS/LETS-1.3.2-RC1.tar
おい、Windows 実行ファイル setupSkybotSchedulerAgent.exe って Linux ファイルシステムに何があるんだ? 1.3 GB も削除できるんだぞ!
何を掃除するかを決める
ファイルシステムの容量を占有しているものを見つけるのは簡単です。しかし、削除できるものを見つけるのは容易ではありません。上記では、古いパッチセットディレクトリやWindows実行ファイルの削除といった簡単な例を挙げました。しかし、ファイルを盲目的に削除することは、明らかに非常にリスクの高い危険な手順です。大きなデータベースファイルを見つけて削除してしまうと、壊滅的な結果を招く可能性があります。
ファイルシステムとその内容はそれぞれ異なるため、.log(削除しても比較的無害なログファイル)、.rpm ファイル(Red Hat パッケージファイル)、.tar または .tar.gz ファイル(ファイルアーカイブ)、.iso ファイル(ディスクイメージ)、ドキュメント、マルチメディアファイルなどが見つかる可能性があります。ファイルの所有権を確認し、削除する前に管理者に相談してください。また、削除したファイルを元に戻す必要がある場合に備えて、有効なバックアップを用意しておいてください。
結論
これらは、Linuxで実行できる数多くの強力なコマンド(および付随するコマンドスイッチ)のほんの一部です。ぜひ試してみて、df、du、findのマニュアルページを読み、同様の、あるいはさらに強力なオプションを探してみてください。
こちらもご覧ください:
Linux マシンに関する必要な情報をすべて 1 つのコマンドで取得する方法
IT 問題のトラブルシューティングで避けるべき 10 の間違い
データセンター対応の Linux ディストリビューション 5 つ
パワーチェックリスト: Linux ユーザーアカウントの管理とトラブルシューティング (Tech Pro Research)