这篇文章的目的是展示 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 包使用的。
这个片段来自哪里?
有三种选择:
- 神器(有人放了忘记了)
- 从包中配置
- 由系统包中的某些脚本生成的配置
我们来看看第 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 中创建的,即我们谈论的是众所周知的,但是一个神器。 系统中现有的软件包中没有任何人或任何东西可以更改此文件。
总结
- dpkg 和 debconf 是查找文件提供程序的主要方法。
- 在 /var/lib/dpkg/info 中搜索可以让您查看安装阶段对文件的操作。
- 安装程序可以创建任何人(用户除外)都不会更改的工件文件,这可以在安装程序代码中看到。
来源: habr.com