使用 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
Line
634
in/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
因此,在撰寫本文時,您出色地將問題範圍縮小到
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 子腳本開頭的標誌。