Ubuntu Weekly Recipe

第873回sosコマンドでUbuntuシステムの情報をあらいざらい収集しよう

Ubuntuがインストールされたマシンで障害が発生したときどうしますでしょうか。本連載の読者ならまず自力での解決を試みるでしょう。もしかしたら諦めて(もしくはそれを理由として)新しいマシンを調達して、クリーンで高性能な環境をもう一台用意するかもしれません。

ほかにも、解決できないなら「詳しい人」に相談するのもひとつの手です。

今回は「誰かに相談」するときに、過不足なく「こんな環境なんだけど」と伝えるのに役立つsosコマンド」を紹介しましょう。

sosとsosreport

sosはさまざまなLinuxディストリビューションで動作する「現在のシステムの状態」を収集し、アーカイブするツールです。主に商用サポートサービスなどで活用されています[1]

Ubuntuには昔から「Apport」と呼ばれる障害情報収集システムが存在します。こちらは主にアプリケーションがクラッシュした時に、Launchpad等のチケット管理システムに報告するツールです。よってコアファイルと関連するパッケージの情報しか収集されません。それに対してsosは、次のようなより広範囲の情報を収集します。

  • /sys/proc⁠、/run以下に保存されているシステムの状態
  • /etc/usr/lib以下の各種設定ファイル
  • /var以下の動的に生成されたログやキャッシュファイル
  • psdfip等様々なシステム情報取得コマンドの実行結果
  • プラグイン機能により、さまざまなシステム向けの情報収集機能をカスタマイズ可能
  • インストールされているパッケージに合わせて動的にプラグインを有効化できる

最後についてはたとえばDockerやOpenStackがインストールされていたら、それに合わせてコンテナや仮想マシンインスタンスの情報なども一緒に収集することを意図しています。システムの実情をユーザーが詳しく知らなくても、なるべく必要な情報を集めるような仕組みになっています。

これらの情報により、障害に遭遇したユーザーが気づかないような問題の兆候を見つけることが目的です。特にユーザーがLinuxに詳しくない場合、サポート側から「こういうコマンドを実行してください」などを個別に連絡しても適切に取得できない可能性があります。これを単にsudo sos reportを実行して取得したアーカイブを提供してください」と、一度の指示で済ませられるのがポイントとなります。

ただし単にシステムの情報をすべて取得しまうと、機密情報までアーカイブしてしまいかねません。これを完全に防ぐのは難しいのですが、sosでは次のような仕組みを用意することである程度緩和できるようにしています。

  • /etc/passwd/etc/shadowなどは収集しない
  • sos cleanコマンドで、システムのIPアドレスなどを別の文字列に置き換えられる
  • ユーザーはsos cleanの置換ルールを追加可能

sosは商用サポートにおける情報収集を想定して作られていますが、これはそれ以外の用途でも十分有用です。たとえば定期的に実行し、バックアップをとっておくことで、問題発生前のログとして活用することなどが考えられます。他にも今ならsosで収集した情報をAIに渡して何か気になるところをあげてもらうという手段もあるでしょう。

ただし「いろいろ収集する」ため、システムに負荷がかかる点は注意が必要です。クリーンなUbuntu環境でも数十秒はかかりますし、たくさんのサービスが動いているのであればそれ以上かかることもあるでしょう。運用中は頻繁に実行すべきものではないことも心にとどめておきましょう。

ちなみに、sosは4.0からsos サブコマンド形式が使えるように変更されました。それまでのsosreportコマンドは、sos reportに相当するスクリプトへと置き換わっています。さらにsos 4.9から(Ubuntuだと25.04から)sosreportコマンド自体が廃止されています。

  • sos 3.9以前(Ubuntu 20.04 LTS、RHEL 7以前⁠⁠:sosreportコマンドのみ
  • 現在:sosreportsos reportのどちらも利用可能
  • sos 4.9.0以降(Ubuntu 25.04以降⁠⁠:sosreport削除、sos reportのみ利用可能

使用する環境・ドキュメントによって使い方や機能が異なる点に注意してください。

sosの基本的な使い方

Ubuntuサーバーやクラウドイメージであれば、sosは最初からインストールされています。Ubuntuデスクトップで使いたい場合は次のようにインストールしてください。

$ sudo apt install sosreport

ちなみに前述のsosreportコマンドの廃止に合わせて、Ubuntu 25.04以降ではsudo apt install sosでインストールできるようになっています。一応、sosreportパッケージも移行用に当面は残るので、sosreportパッケージをインストールしても構いません[2]

また、snapパッケージもあるため、サブコマンド形式に対応していない古いUbuntuで手順を統一したい場合や、より新しい機能が必要な場合はそちらを使うと良いでしょう。

$ sudo snap install sosreport --classic

詳細なオプションはsos helpsos サブコマンド -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.9.0以降(Ubuntu 25.04以降)にはuploadサブコマンドが追加されました。これはsosで収集した情報を別のマシンから、Red HatやCanonicalなどの商用サポートを提供するベンダーのサーバーにアップロードする際などに使われます。また、任意のHTTPS/FTP/SFTP/S3サーバーも対応しています。

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/sos/sos.confでも設定可能です。

まずは情報を収集してみましょう。収集する際は管理者権限が必要です。

$ 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_tablesモジュールがロードされていないため、nftコマンドなどを実行していない旨のメッセージがそれです。--allow-system-changesオプションを指定すると、必要なカーネルモジュールをロードして情報を収集します。本当にロードして良いかは環境によって異なるため、--allow-system-changesオプションの指定は慎重に検討してください。

一通り収集が完了したら/tmp/sosreport-....tar.gzとして保存されます。

収集された情報を確認する

情報を収集し、作成されたアーカイブの中身を確認してみましょう。このファイルを閲覧するには管理者権限が必要です。ここでは一旦、管理者になって操作することにします。

$ 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_reports/sos.htmlが各種ログのリストが表示され、それぞれがログへのリンクになっている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コマンドです。これはアーカイブを渡すことで、中身にあるIPアドレスやMASCを無難なものに置き換えてくれます。

まずは試してみましょう。アーカイブには次のようにローカルの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なMACアドレスは記録されていませんでした。このMACアドレスが何者なのかは後述します。

このアーカイブに対して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/sosreport-...-obfuscated.tar.xzというファイルが作られています。これを展開してみると、次のように元のMACアドレスでは検索できなくなりました。

# 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/sos/cleaner/default_mappingで設定されています。

{
    "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/lib/python3/dist-packages/sos/report/plugins上に保存します[3]

このディレクトリに次のようなPythonスクリプトをtest.pyの名前で置いてみましょう。

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にプラグインのかんたんな概要を記述する
  • filespackagesにこのプラグインを実行する前提条件を書く
  • setup()に実際に実行されるものを書く

filesとpackagesはPythonのtupleで指定したもののうち、いずれかに一致した場合にこのプラグインが有効化されます。つまり今回の例だと/home/ubuntu/sampleが存在するかprocpsのパッケージが存在するかのいずれかです。filesやpackagesには複数の条件を書けますが、これもORで判定されます。ちなみに1個しかない場合は、上記のように末尾にカンマが必要です。

ANDで判定させたい場合は、プラグインドキュメントの「Dependencies」を参照してください。

self.add_copy_spec()は、ファイルのコピーを意味します。またself.add_cmd_output()は指定したコマンドを実行して保存します。

プラグインができたら、認識されているか確認しましょう。これはプラグインの一覧オプションで確認できます。

$ 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オプション付きで実行すると、プラグインの実行ログが表示されます。上記のように「test」と表示されたら成功です。

収集されたデータを見ると次のように記録されています。

# 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コマンドはただ情報を収集するだけでなく、プラグインを書くことでシステムに応じた収集条件も追加できます。数多くのシステムを管理し、その一部で問題が起きたとき、常日頃からこのような情報を集めておくと解決の一助となるはずです。

また、自分では解決できないけれども詳しい人に見てもらいたい場合に、自分から情報を提示する際にも役に立ちます。もちろんその際は「お心付け」もお忘れなく。

おすすめ記事

記事・ニュース一覧