在我的一台机器上 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.cfg
(dash -vx
不再需要)。您将获得的跟踪来自 grub.d 脚本。
希望问题现在就显而易见了。修复该问题后,请不要忘记删除-vx
grub.d 子脚本开头的标志。
答案2
我读到你应该grub
在属于一个 raid 的所有硬盘上安装。由于您更换了有故障的硬盘,您可以通过运行以下命令来检查:
dpkg-reconfigure grub-pc
当进入该GRUB install devices
部分时,您可能会看到哪些设备标有星号*
,哪些设备没有,您可以使用光标和空格键来标记它们。 (所有主要设备/dev/sda
、/dev/sdb
等/dev/sdc
均应标记)
完成此步骤后应重新安装 grub 并使一切恢复正常。