使用 grub 调试 dpkg 配置失败

使用 grub 调试 dpkg 配置失败

在我的一台机器上 dpkg 无法完成 grub 的安装/配置,仅给出错误消息:

子进程安装的安装后脚本返回错误退出状态 255

完整输出:

# dpkg --configure grub-pc
Setting up grub-pc (1.99-27+deb7u3) ...
device node not found
device node not found
device node not found
device node not found
Installation finished. No error reported.
Installation finished. No error reported.
dpkg: error processing grub-pc (--configure):
 subprocess installed post-installation script returned error exit status 255
Errors were encountered while processing:
 grub-pc

日志文件中没有任何内容可以提供更多线索。

使用一些调试选项运行 dpkg 可以揭示更多信息:

# dpkg -D10113 --configure grub-pc
Setting up grub-pc (1.99-27+deb7u3) ...
D000002: fork/exec /var/lib/dpkg/info/grub-pc.postinst ( configure  )
device node not found
device node not found
device node not found
device node not found
Installation finished. No error reported.
Installation finished. No error reported.
dpkg: error processing grub-pc (--configure):
 subprocess installed post-installation script returned error exit status 255
D010000: trigproc_run_deferred
Errors were encountered while processing:
 grub-pc

现在我知道问题出在 中的某个地方/var/lib/dpkg/info/grub-pc.postinst configure,但该脚本似乎没有任何冗长或调试选项,而且代码太大,难以阅读,有近 700 行。该脚本也没有任何exit 255调用,所以我倾向于相信问题甚至不在那里,而是在调用的其他脚本中。

内核进程的配置任务也失败:

# dpkg --configure linux-image-3.16.0-0.bpo.4-amd64
Setting up linux-image-3.16.0-0.bpo.4-amd64 (3.16.39-1+deb8u1~bpo70+1) ...
vmlinuz(/boot/vmlinuz-3.16.0-0.bpo.4-amd64
) points to /boot/vmlinuz-3.16.0-0.bpo.4-amd64
 (/boot/vmlinuz-3.16.0-0.bpo.4-amd64) -- doing nothing at /var/lib/dpkg/info/linux-image-3.16.0-0.bpo.4-amd64.postinst line 263.
initrd.img(/boot/initrd.img-3.16.0-0.bpo.4-amd64
) points to /boot/initrd.img-3.16.0-0.bpo.4-amd64
 (/boot/initrd.img-3.16.0-0.bpo.4-amd64) -- doing nothing at /var/lib/dpkg/info/linux-image-3.16.0-0.bpo.4-amd64.postinst line 263.
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-3.16.0-0.bpo.4-amd64
run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 255
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-3.16.0-0.bpo.4-amd64.postinst line 634.
dpkg: error processing linux-image-3.16.0-0.bpo.4-amd64 (--configure):
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 linux-image-3.16.0-0.bpo.4-amd64

634输入/var/lib/dpkg/info/linux-image-3.16.0-0.bpo.4-amd64.postinst归结为以下命令:

run-parts --report --exit-on-error --arg=3.16.0-0.bpo.4-amd64 --arg=/boot/vmlinuz-3.16.0-0.bpo.4-amd64 /etc/kernel/postinst.d

手动运行此命令会导致:

run-parts: /etc/kernel/postinst.d/zz-update-grub exited with return code 255

据我所知,这个脚本只是一个执行检查然后调用的包装器update-grub,它的工作没有错误。

update-grub只是运行grub-mkconfig,所以我运行这个命令并检查返回值:

# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.16.0-0.bpo.4-amd64
Found initrd image: /boot/initrd.img-3.16.0-0.bpo.4-amd64
Found linux image: /boot/vmlinuz-3.2.0-4-amd64
Found initrd image: /boot/initrd.img-3.2.0-4-amd64
# echo $?
255

这似乎就是罪魁祸首。该脚本工作,找到所有内核,生成有效的 grub 配置(保存它/boot/grub/grub.cfg.new),然后退出并返回代码 255。当然它没有任何调试选项。

我怎样才能继续调试问题?

可能有帮助也可能没有帮助的其他信息:

  • 系统正在运行 debian wheezy
  • GRUB 版本为 1.99-27+deb7u3
  • 该系统有一个 mdraid
  • 该系统已经运行多年,不是新安装的。该错误最近才出现
  • 不太确定,但我相信更换有故障的硬盘后该错误开始出现
  • 仅 grub 和内核包的配置任务失败。所有其他软件包都可以安装,不会出现错误

稍后出现的问题提供更多信息

zulu668:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda4[2] sdb4[1]
      1456504640 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sda3[2] sdb3[1]
      7996352 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sda2[2] sdb2[1]
      499392 blocks super 1.2 [2/2] [UU]

unused devices: <none>
zulu668:~# sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Wed Oct 29 12:40:33 2014
     Raid Level : raid1
     Array Size : 499392 (487.77 MiB 511.38 MB)
  Used Dev Size : 499392 (487.77 MiB 511.38 MB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Wed Mar 15 14:51:01 2017
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : zulu668:0  (local to host zulu668)
           UUID : 22e14818:7754cf01:67287402:c31a3328
         Events : 217

    Number   Major   Minor   RaidDevice State
       2       8        2        0      active sync   /dev/sda2
       1       8       18        1      active sync   /dev/sdb2

答案1

因此,在撰写本文时,您巧妙地将问题范围缩小到grub-mkconfig并想知道如何调试它。

grub-mkconfig是一个 shell 脚本,它基本上grub.cfg通过执行/etc/grub.d.set -e开头有一个命令grub-mkconfig,意思是“在遇到第一个非托管错误时停止”。您的问题很可能是由于 grub.d 脚本之一失败造成的。

首先,让我们找出罪魁祸首。跑步:

dash -vx grub-mkconfig -o /boot/grub/grub.cfg

dash,最有可能绑定到 的 Bourne Shell 解释器/bin/sh将输出它执行的每一行。由于脚本可能因命令而失败set -e,因此最后一行很可能是失败的 grub.d 子脚本。我想你会得到类似的东西:

+ echo ### BEGIN /etc/grub.d/99_buggy_script ###
+ /etc/grub.d/99_buggy_script

脚本名称本身可能无法为您提供足够的证据来说明正在发生的事情。由于它也是一个 Bourne shell 脚本,因此您可以以相同的方式对其进行调试。更改 grub.d 脚本的第一行

#!/bin/sh

到:

#!/bin/sh -vx

并运行grub-mkconfig -o /boot/grub/grub.cfgdash -vx不再需要)。您将获得的跟踪来自 grub.d 脚本。

希望问题现在就显而易见了。修复该问题后,请不要忘记删除-vxgrub.d 子脚本开头的标志。

答案2

我读到你应该grub在属于一个 raid 的所有硬盘上安装。由于您更换了有故障的硬盘,您可以通过运行以下命令来检查:

dpkg-reconfigure grub-pc

当进入该GRUB install devices部分时,您可能会看到哪些设备标有星号*,哪些设备没有,您可以使用光标和空格键来标记它们。 (所有主要设备/dev/sda/dev/sdb/dev/sdc均应标记)

完成此步骤后应重新安装 grub 并使一切恢复正常。

相关内容