この投稿の目的は、システム構成ファイル内の「ソースの検索」に関連する 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つのオプションがあります。
- 魔法のアーティファクト (誰かが置いたのに忘れられた)
- パッケージからの設定
- システム パッケージの一部のスクリプトによって生成された構成
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 パッケージが記載されています。
その中に、私たちの質問に対する答えが簡単に見つかります。
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 に作成されます。 私たちはよく知られていますが、人工物について話しています。 システム内の既存のパッケージには、このファイルを変更できるものはありません。
要約
- dpkg と debconf は、ファイル プロバイダーを見つけるための主な方法です。
- /var/lib/dpkg/info を検索すると、インストール段階でのファイルの操作を確認できます。
- インストーラーは、(ユーザーを除く) 誰も変更することのないアーティファクト ファイルを作成できます。これは、インストーラー コードで確認できます。
出所: habr.com