Grub2

使用 grub 調試 dpkg 配置失敗

  • March 18, 2017

在我的一台機器上,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 634in/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 腳本。

希望問題現在很明顯。修復它後,不要忘記刪除-vxgrub.d 子腳本開頭的標誌。

引用自:https://unix.stackexchange.com/questions/348875