这个配置来自哪里? [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命令允许您从指定的软件包查看系统上的所有文件。 我突出显示了一个有趣的文件以供研究。 检查文件显示了如何使用此变量,但没有回答它的来源。


debconf


原来,这是某人的产物。 谁啊 在进入安装程序之前,让我们看一下另一个重要的Debian基础设施-问题的答案。 每次软件包问一个问题时,在很多情况下,当它不问问题但使用默认选项时,问题和答案都会在Debian的特殊数据库debconf中修复。 我们可以查看答案数据库(甚至在安装软件包本身之前设置它们debconf-set-selections ),为此,我们需要debconf-utilsdebconf-get-selections实用程序。 不幸的是,没有发现任何有趣的东西:( 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 / get_resume_partition并在其中选择最大的一个。 交换来自partman。


我们测试任务的答案:文件是由安装程序在安装时在/ target中创建的,即 我们正在谈论的是众所周知的但是人工制品。 系统中现有的软件包中没有任何人可以更改此文件。


总结一下


  1. dpkg和debconf是查找文件提供程序的主要方法。
  2. 在/ var / lib / dpkg / info中进行搜索可以使您在安装阶段查看文件操作。
  3. 安装程序可以创建任何人(用户除外)都不会更改的工件文件,这可以在安装程序代码中看到。

Source: https://habr.com/ru/post/zh-CN461033/


All Articles