この設定はどこから来たのでしょうか? [Debian/Ubuntu]

この投稿の目的は、システム構成ファイル内の「ソースの検索」に関連する debian/ubuntu でのデバッグ手法を示すことです。

テスト例: インストールされている OS の tar.gz コピーを何度も嘲笑した後、それを復元してアップデートをインストールすると、次のメッセージが表示されます。

update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Set the RESUME variable to override this.

目標: この値 (U1563304817I0) の出所と、それを正しく変更する方法を理解します。 これは最初に見つかった例で、それ自体は特に興味深いものではありませんが、Linux を操作する実践的な方法を示すのに便利です。.

ステップ 1: RESUME はどこから来たのか?

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

再帰的に (-r) /etc ディレクトリ (ほとんどの設定が存在する場所) でこの変数に関する記述を探します。 conf.d スニペットが見つかります。これは明らかに initramfs-tools パッケージで使用されています。

この断片はどこから来たのでしょうか?

次のXNUMXつのオプションがあります。

  1. 魔法のアーティファクト (誰かが置いたのに忘れられた)
  2. パッケージからの設定
  3. システム パッケージの一部のスクリプトによって生成された構成

2 番 (最も単純な) を確認してみましょう。

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

dpkg -S インストールされたファイルのデータベースを検索し、そのファイルがどのパッケージに属しているかを見つけることができます。 成功した検索の例を次に示します。

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

タスク「ファイル」に戻りましょう。 initramfs-tools/conf.d/resume パッケージからシステムにインストールされていません。 おそらくパッケージの postinst/preinst スクリプトで生成されるのでしょうか? バージョン番号 3 を確認してみましょう。

# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm:    rm -f /etc/initramfs-tools/conf.d/resume

カタログで /var/lib/dpkg/info/ パッケージのすべての「メタファイル」(インストール/削除スクリプト、パッケージの説明など)には、解凍されたバージョンがあります。 驚くべきことに、このファイルは initramfs-tools-core パッケージの postrm (アンインストール時) で削除されます。 postinst の内容を見てみましょう... conf.d ディレクトリとは何も関係ありません。

パッケージに含まれるファイルを見てみましょう initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

チーム dpkg -L 指定したパッケージからシステム上にあるすべてのファイルを表示できます。 研究にとって興味深いファイルをハイライトしました。 ファイルを調べると、この変数がどのように使用されているかがわかりますが、その変数の出所はわかりません。

debconf

これは誰かの遺物であることが判明しました。 だれの? インストーラーの説明に入る前に、もう XNUMX つの重要な Debian インフラストラクチャ、つまり質問への回答を見てみましょう。 パッケージが質問をするたびに、また多くの場合、質問をせずにデフォルトのオプションを使用する場合、質問と回答の両方が debconf と呼ばれる Debian の特別なデータベースに記録されます。 回答のデータベースを参照することもできます (パッケージ自体をインストールする前に回答を設定することもできます)。 debconf-set-selections)、このためにはユーティリティが必要です debconf-get-selections 構成から debconf-utils。 残念ながら、興味深いものは何も見つかりませんでした:(debconf-get-selections |grep -i resume 空で返されました)。

debian インストーラー

インストーラは、質問に対する回答を集めた独自のデータベースを持っています。 /var/log/installer/cdebconf/questions.dat。 残念ながら、履歴書についても一言も記載がありません。
しかし、近くに丸太があります。 syslog: インストール ログ全体が書き込まれます。 そこには、base-installer パッケージが記載されています。 ページ raw へのリンクが表示されます。

その中に、私たちの質問に対する答えが簡単に見つかります。

  resume="$(mapdevfs "$resume_devfs")"; then
...
    if [ "$do_initrd" = yes ]; then
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs は明確な目的を持つユーティリティであり、私たちが興味を持っている機能は次のとおりです。 get_resume_partition、 /proc/swaps を読み取り、そこにある最大のものを選択します。 スワップはパートマンから来ます。

テスト タスクの答え: ファイルは、インストール時にインストーラーによって /target に作成されます。 私たちはよく知られていますが、人工物について話しています。 システム内の既存のパッケージには、このファイルを変更できるものはありません。

要約

  1. dpkg と debconf は、ファイル プロバイダーを見つけるための主な方法です。
  2. /var/lib/dpkg/info を検索すると、インストール段階でのファイルの操作を確認できます。
  3. インストーラーは、(ユーザーを除く) 誰も変更することのないアーティファクト ファイルを作成できます。これは、インストーラー コードで確認できます。

出所: habr.com

コメントを追加します