这个配置从哪里来? [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. 安装程序可以创建任何人(用户除外)都不会更改的工件文件,这可以在安装程序代码中看到。

来源: habr.com

添加评论