Ubuntuがインストールされたマシンで障害が発生したときどうしますでしょうか。本連載の読者ならまず自力での解決を試みるでしょう。もしかしたら諦めて
ほかにも、解決できないなら
今回はsos
コマンド」
sosとsosreport
sosはさまざまなLinuxディストリビューションで動作する
Ubuntuには昔から
- 「
/sys
」や 「 /proc
」、「 /run
」以下に保存されているシステムの状態 - 「
/etc
」や 「 /usr/
」lib 以下の各種設定ファイル - 「
/var
」以下の動的に生成されたログやキャッシュファイル ps
、df
、ip
等様々なシステム情報取得コマンドの実行結果- プラグイン機能により、さまざまなシステム向けの情報収集機能をカスタマイズ可能
- インストールされているパッケージに合わせて動的にプラグインを有効化できる
最後についてはたとえばDockerやOpenStackがインストールされていたら、それに合わせてコンテナや仮想マシンインスタンスの情報なども一緒に収集することを意図しています。システムの実情をユーザーが詳しく知らなくても、なるべく必要な情報を集めるような仕組みになっています。
これらの情報により、障害に遭遇したユーザーが気づかないような問題の兆候を見つけることが目的です。特にユーザーがLinuxに詳しくない場合、サポート側からsudo sos report
を実行して取得したアーカイブを提供してください」
ただし単にシステムの情報をすべて取得しまうと、機密情報までアーカイブしてしまいかねません。これを完全に防ぐのは難しいのですが、sosでは次のような仕組みを用意することである程度緩和できるようにしています。
/etc/
やpasswd /etc/
などは収集しないshadow sos clean
コマンドで、システムのIPアドレスなどを別の文字列に置き換えられる- ユーザーは
sos clean
の置換ルールを追加可能
sosは商用サポートにおける情報収集を想定して作られていますが、これはそれ以外の用途でも十分有用です。たとえば定期的に実行し、バックアップをとっておくことで、問題発生前のログとして活用することなどが考えられます。他にも今ならsosで収集した情報をAIに渡して何か気になるところをあげてもらうという手段もあるでしょう。
ただし
ちなみに、sosは4.sos サブコマンド
」sosreport
」sos report
」sosreport
コマンド自体が廃止されています。
- sos 3.
9以前 (Ubuntu 20. 04 LTS、RHEL 7以前): sosreport
コマンドのみ - 現在:
sosreport
とsos report
のどちらも利用可能 - sos 4.
9.0以降 (Ubuntu 25. 04以降): sosreport
削除、sos report
のみ利用可能
使用する環境・
sosの基本的な使い方
Ubuntuサーバーやクラウドイメージであれば、sosは最初からインストールされています。Ubuntuデスクトップで使いたい場合は次のようにインストールしてください。
$ sudo apt install sosreport
ちなみに前述のsosreport
コマンドの廃止に合わせて、Ubuntu 25.sudo apt install sos
」
また、snapパッケージもあるため、サブコマンド形式に対応していない古いUbuntuで手順を統一したい場合や、より新しい機能が必要な場合はそちらを使うと良いでしょう。
$ sudo snap install sosreport --classic
詳細なオプションはsos help
」sos サブコマンド -h
」
$ sos help Detailed help for sos help The 'help' sub-command is used to provide more detailed information on different sub-commands available to sos as well as different components at play within those sub-commands. (中略) Available Help Sections The following help sections are available. Additional help topics and subtopics may be displayed within their respective help section. report Detailed help on the report command report.plugins Information on the plugin design of sos report.plugins.$plugin Information on a specific $plugin clean Detailed help on the clean command collect Detailed help on the collect command policies How sos operates on different distributions
reportを含むいくつかのサブコマンドが用意されています。ちなみにsos 4.
「sos report -h
」
$ sos report -h usage: sos report [options] options: -h, --help show this help message and exit Global Options: --batch Do not prompt interactively (中略) Report Options: These options control how report collects data (中略) -e ENABLE_PLUGINS, --enable-plugins ENABLE_PLUGINS enable these plugins (中略) -l, --list-plugins list plugins and available plugin options (中略) -n SKIP_PLUGINS, --skip-plugins SKIP_PLUGINS disable these plugins (中略) -o ONLY_PLUGINS, --only-plugins ONLY_PLUGINS enable these plugins only (中略) --allow-system-changes Run commands even if they can change the system (e.g. load kernel modules)
--batch
オプションは、実行時のユーザーによるサポート用のケースIDなどの入力を省略するモードです。定期的・
-l
オプションで使用可能なプラグインのリストが表示されますし、-e
や-n
、-o
でそのオン・
--allow-system-changes
は、たとえば情報収集のためにカーネルモジュールのロードが必要な場合にそれを実行するかを指定するオプションです。指定しなければシステムの変更はなるべく行わないように実行します。結果的にカーネルモジュールのロードが必要な情報収集はスキップされます。
何が収集されなかったかは実行時のログにも記載されますので、まずはオプション指定せずに実行してから必要に応じて検討すれば良いでしょう。また、これらのオプションは/etc/
」
まずは情報を収集してみましょう。収集する際は管理者権限が必要です。
$ sudo sos report sos report (version 4.8.2) (中略) Press ENTER to continue, or CTRL-C to quit. (ここで一度Enterを入力) Optionally, please enter the case id that you are generating this report for []: (何も入力せずにEnterでOK) Setting up archive ... Setting up plugins ... [plugin:firewall_tables] skipped command 'nft -a list ruleset': required kmods missing: nf_tables. Use '--allow-system-changes' to enable collection. (中略) Running plugins. Please wait ... Finishing plugins [Running: ebpf] Finished running plugins Creating compressed archive... Your sos report has been generated and saved in: /tmp/sosreport-sos1-2025-07-27-ahxdocs.tar.xz Size 3.62MiB Owner root sha256 dc0bfe017ff6dad9bc4cfe7960443420405577d9a295ac2dd234fccd3c3d8b53 Please send this file to your support representative.
--batch
を指定しない場合は、2回ぐらいユーザーの入力待ちとなります。
- 1回目:実際に収集するかの確認。収集するならEnter、しないならCtrl-Cを入力
- 2回目:アーカイブに含める文字列を指定。主にサポートのケースID等を入力。空のままEnterでも問題ない
その後、さまざまなプラグインが実行され、場合によってはプラグインからのエラーや警告メッセージが表示されます。今回の例だと、nf_
モジュールがロードされていないため、nft
コマンドなどを実行していない旨のメッセージがそれです。--allow-system-changes
オプションを指定すると、必要なカーネルモジュールをロードして情報を収集します。本当にロードして良いかは環境によって異なるため、--allow-system-changes
オプションの指定は慎重に検討してください。
一通り収集が完了したら/tmp/
」
収集された情報を確認する
情報を収集し、作成されたアーカイブの中身を確認してみましょう。このファイルを閲覧するには管理者権限が必要です。ここでは一旦、管理者になって操作することにします。
$ sudo -i # cd /tmp # tar xf sosreport-sos1-2025-07-27-ahxdocs.tar.xz # cd sosreport-sos1-2025-07-27-ahxdocs # ls -l total 52 drwxr-xr-x 4 root root 4096 Jul 27 15:11 boot lrwxrwxrwx 1 root root 32 Jul 27 15:24 date -> sos_commands/systemd/timedatectl lrwxrwxrwx 1 root root 37 Jul 27 15:24 df -> sos_commands/filesys/df_-al_-x_autofs lrwxrwxrwx 1 root root 31 Jul 27 15:24 dmidecode -> sos_commands/hardware/dmidecode -rw-r--r-- 1 root root 125 Jul 27 15:24 environment drwxr-xr-x 52 root root 4096 Jul 27 15:11 etc lrwxrwxrwx 1 root root 24 Jul 27 15:24 free -> sos_commands/memory/free lrwxrwxrwx 1 root root 26 Jul 27 15:24 hostname -> sos_commands/host/hostname lrwxrwxrwx 1 root root 25 Jul 27 15:24 installed-debs -> sos_commands/dpkg/dpkg_-l lrwxrwxrwx 1 root root 33 Jul 27 15:24 installed-snaps -> sos_commands/snap/snap_list_--all lrwxrwxrwx 1 root root 34 Jul 27 15:24 ip_addr -> sos_commands/networking/ip_-o_addr lrwxrwxrwx 1 root root 47 Jul 27 15:24 ip_route -> sos_commands/networking/ip_route_show_table_all lrwxrwxrwx 1 root root 26 Jul 27 15:24 last -> sos_commands/login/last_-F lrwxrwxrwx 1 root root 7 Jul 27 15:11 lib -> usr/lib lrwxrwxrwx 1 root root 32 Jul 27 15:24 lsb-release -> sos_commands/release/lsb_release lrwxrwxrwx 1 root root 25 Jul 27 15:24 lsmod -> sos_commands/kernel/lsmod lrwxrwxrwx 1 root root 36 Jul 27 15:24 lsof -> sos_commands/process/lsof_M_-n_-l_-c lrwxrwxrwx 1 root root 28 Jul 27 15:24 lspci -> sos_commands/pci/lspci_-nnvv lrwxrwxrwx 1 root root 29 Jul 27 15:24 mount -> sos_commands/filesys/mount_-l dr-xr-xr-x 127 root root 4096 Jul 27 15:13 proc lrwxrwxrwx 1 root root 31 Jul 27 15:24 ps -> sos_commands/process/ps_auxwwwm lrwxrwxrwx 1 root root 31 Jul 27 15:24 pstree -> sos_commands/process/pstree_-lp lrwxrwxrwx 1 root root 48 Jul 27 15:24 root-symlinks -> sos_commands/host/find_._-maxdepth_2_-type_l_-ls drwxr-xr-x 7 root root 4096 Jul 27 15:24 run drwxr-xr-x 58 root root 4096 Jul 27 15:24 sos_commands drwxr-xr-x 2 root root 4096 Jul 27 15:24 sos_logs drwxr-xr-x 2 root root 4096 Jul 27 15:24 sos_reports dr-xr-xr-x 10 root root 4096 Jul 27 15:24 sys lrwxrwxrwx 1 root root 28 Jul 27 15:24 uname -> sos_commands/kernel/uname_-a lrwxrwxrwx 1 root root 24 Jul 27 15:24 uptime -> sos_commands/host/uptime drwxr-xr-x 4 root root 4096 Jul 4 12:52 usr drwxr-xr-x 6 root root 4096 Jul 27 15:09 var -rw-r--r-- 1 root root 17 Jul 27 15:24 version.txt lrwxrwxrwx 1 root root 90 Jul 27 15:24 vgdisplay -> sos_commands/lvm2/vgdisplay_-vv_--config_global_metadata_read_only_1_--nolocking_--foreign
たくさんのファイルがあってわかりにくいですが、おおよそ次のように分類されます。
- 設定ファイルやログ等が含まれているディレクトリのコピー:
boot/
、etc/
、proc/
、run/
、sys/
、usr/
、var/
- 各種コマンドの実行結果が保存されているディレクトリ:
sos_
commands/ sos
コマンド実行時の端末ログ:sos_
logs/ - sosの報告書:
sos_
reports/ - その他:バージョン情報、コマンド実行結果へのシンボリックリンクファイル等
あとはここから必要な情報を探していくだけです。
特にsos_
が各種ログのリストが表示され、それぞれがログへのリンクになっているHTMLです。レポートの中身を管理者権限がなくても見られるようにする必要はあるものの、ブラウザからクリックしながら確認したい場合に便利なファイルでしょう。
センシティブな情報をマスクする
最初に説明したように、sosで収集したデータには、機密情報はできるだけ取り込まないようになっています。
# less etc/passwd etc/passwd: No such file or directory # less etc/shadow etc/shadow: No such file or directory
しかしながらIPアドレスやMACアドレスの扱いも注意が必要なので、できればマスクしたいケースもあるでしょう。そこで使えるのがsos clean
」
まずは試してみましょう。アーカイブには次のようにローカルのMACアドレス00:16:3e:05:eb:80
)
# grep -rI 00:16:3e:05:eb:80 var/log/cloud-init-output.log:ci-info: | enp5s0 | True | 10.56.73.75 | 255.255.255.0 | global | 00:16:3e:05:eb:80 | var/log/cloud-init-output.log:ci-info: | enp5s0 | True | fe80::216:3eff:fe05:eb80/64 | . | link | 00:16:3e:05:eb:80 | (後略) # grep -rI 53:4f:53:e4:ef:a6 (何も表示されない #
それに対して53:4f:53:e4:ef:a6
」
このアーカイブに対してcleanコマンドを実行してみましょう。
$ sudo sos clean /tmp/sosreport-sos1-2025-07-27-ahxdocs.tar.xz sos clean (version 4.8.2) (中略) Found 1 total reports to obfuscate, processing up to 4 concurrently sosreport-sos1-2025-07-27-ahxdocs : Extracting... sosreport-sos1-2025-07-27-ahxdocs : Beginning obfuscation... sosreport-sos1-2025-07-27-ahxdocs : Re-compressing... sosreport-sos1-2025-07-27-ahxdocs : Obfuscation completed [removed 47 unprocessable files] Successfully obfuscated 1 report(s) A mapping of obfuscated elements is available at /tmp/sosreport-host0-2025-07-27-ahxdocs-private_map The obfuscated archive is available at /tmp/sosreport-host0-2025-07-27-ahxdocs-obfuscated.tar.xz Size 3.56MiB Owner root Please send the obfuscated archive to your support representative and keep the mapping file private
元のファイル名を元に、/tmp/
」
# grep -rI 00:16:3e:05:eb:80 (何も表示されない # # grep -rI 53:4f:53:e4:ef:a6 var/log/cloud-init-output.log:ci-info: | enp5s0 | True | 100.0.0.1 | 255.255.255.0 | global | 53:4f:53:e4:ef:a6 | var/log/cloud-init-output.log:ci-info: | enp5s0 | True | fe80::596b:55c2:9ba6:2010/64 | . | link | 53:4f:53:e4:ef:a6 | (後略)
本来、ローカルのMACアドレスが表示されていたところに別のMACアドレスが記録されています。さらによく見るとIPアドレスも変わっていることがわかります。
これがcleanコマンドの仕組みです。実は何をどう置き換えるのかは、/etc/
」
{
"hostname_map": {
"sos1": "host0"
},
"ip_map": {
"10.56.73.0/24": "100.0.0.0/24",
"10.56.73.75/24": "100.0.0.1/24",
(中略)
"mac_map": {
"00:16:3e:05:eb:80": "53:4f:53:e4:ef:a6",
(中略)
},
"keyword_map": {},
"username_map": {}
}
ホスト名、IPアドレス、MACアドレスを置き換えていることがわかりますね。他にもユーザーが任意の文字列をこのファイルで指定し、置き換えることも可能になっています。おそらくユーザー名の置き換えなどは、環境によってはよく使うことになるでしょう。
ちなみにこのclean処理は、sos report
コマンド実行時に--clean
」
自作のプラグインを追加する
最後に自作のプラグインを追加して、一緒に独自の情報を収集してみましょう。sosのプラグインはPythonスクリプトとして実装します。スクリプトは/usr/
」
このディレクトリに次のようなPythonスクリプトをtest.
」
from sos.report.plugins import Plugin, IndependentPlugin
class Test(Plugin, IndependentPlugin):
short_desc = 'My Test Plugin'
files = ('/home/ubuntu/sample',)
packages = ('procps',)
def setup(self):
self.add_copy_spec([
"/home/ubuntu/sample",
])
self.add_cmd_output('ls -l /home/')
これがプラグインの雛形になります。
short_
にプラグインのかんたんな概要を記述するdesc files
とpackages
にこのプラグインを実行する前提条件を書くsetup()
に実際に実行されるものを書く
filesとpackagesはPythonのtupleで指定したもののうち、いずれかに一致した場合にこのプラグインが有効化されます。つまり今回の例だと/home/
」
ANDで判定させたい場合は、プラグインドキュメントの
self.
は、ファイルのコピーを意味します。またself.
は指定したコマンドを実行して保存します。
プラグインができたら、認識されているか確認しましょう。これはプラグインの一覧オプションで確認できます。
$ sudo sos report -l sos report (version 4.8.2) The following plugins are currently enabled: test My Test Plugin (後略)
「currently enabled」
実際にsos report
を実行すると次のような結果になります。
$ sudo sos report --batch (中略) Starting 62/69 test [Running: ebpf snap systemd test]
--batch
オプション付きで実行すると、プラグインの実行ログが表示されます。上記のように
収集されたデータを見ると次のように記録されています。
# ls home/ubuntu/sample home/ubuntu/sample # cat sos_commands/test/ls_-l_.home total 4 drwxr-x--- 5 ubuntu ubuntu 4096 Jul 28 11:34 ubuntu
このようにsos
コマンドはただ情報を収集するだけでなく、プラグインを書くことでシステムに応じた収集条件も追加できます。数多くのシステムを管理し、その一部で問題が起きたとき、常日頃からこのような情報を集めておくと解決の一助となるはずです。
また、自分では解決できないけれども詳しい人に見てもらいたい場合に、自分から情報を提示する際にも役に立ちます。もちろんその際は