這個配置從哪裡來? [Debian/Ubuntu]

這篇文章的目的是展示 debian/ubuntu 中與系統設定檔中「尋找來源」相關的調試技術。

測試範例:在對已安裝作業系統的 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 套件使用的。

這個片段來自哪裡?

共有三個選項:

  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 允許您查看系統上指定套件中的所有檔案。 我突出顯示了一個值得研究的文件。 檢查該文件會顯示如何使用該變量,但不會說明它來自何處。

配置文件

原來,這是某人的神器。 誰的? 在深入了解安裝程序之前,讓我們先看看另一個重要的 Debian 基礎設施 - 問題的答案。 每當一個套件提出問題時,並且在許多情況下,當它不提出問題而是使用預設選項時,問題和答案都會記錄在 Debian 中名為 debconf 的特殊資料庫中。 我們可以查看答案資料庫(甚至可以在安裝包本身之前設定它們 - debconf-set-selections),為此我們需要一個實用程序 debconf-get-selections 從組成 debconf-utils。 不幸的是,沒有發現任何有趣的東西:(debconf-get-selections |grep -i resume 返回空)。

debian安裝程序

安裝人員有自己的問題答案資料庫: /var/log/installer/cdebconf/questions.dat。 不幸的是,我們的履歷也沒有任何字跡。
但附近有原木,包括。 syslog,整個安裝日誌都會寫入其中。 那裡提到了基本安裝程式包,並且在上面 我們可以看到原始資料的連結。

在它們裡面我們可以很容易地找到問題的答案:

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

mapdevfs 是一個目的明確的實用程序,我們感興趣的函數是 get_resume_partition,它讀取 /proc/swaps 並選擇其中最大的一個。 交換來自partman。

我們測試任務的答案:該檔案是安裝程式在安裝時在 /target 中建立的,即我們談論的是眾所周知的,但是一個神器。 系統中現有的軟體包中沒有任何人或任何東西可以更改此文件。

總結

  1. dpkg 和 debconf 是尋找檔案提供者的主要方法。
  2. 在 /var/lib/dpkg/info 中搜尋可以讓您查看安裝階段對檔案的操作。
  3. 安裝程式可以建立任何人(使用者除外)都不會更改的工件文件,這可以在安裝程式程式碼中看到。

來源: www.habr.com

添加評論