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-mkconfiggrub.cfg을 기본적으로 실행하는 쉘 스크립트입니다 /etc/grub.d. set -e처음에는 grub-mkconfig"관리되지 않는 첫 번째 오류 시 중지"를 의미하는 명령이 있습니다. 문제는 grub.d 스크립트 중 하나의 실패로 인해 발생할 가능성이 높습니다.

먼저 범인을 알아봅시다. 달리기:

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

dash/bin/sh, Bourne Shell 인터프리터는 실행하는 모든 행을 출력할 가능성이 높습니다 . 스크립트가 명령으로 실패할 수 있으므로 set -e마지막 줄은 실패한 grub.d 첨자일 가능성이 높습니다. 나는 당신이 다음과 같은 것을 얻을 것이라고 생각합니다 :

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

스크립트 이름 자체로는 무슨 일이 일어나고 있는지에 대한 충분한 증거를 제공하지 못할 수 있습니다. Bourne 쉘 스크립트이기도 하므로 동일한 방법으로 디버깅할 수 있습니다. grub.d 스크립트의 첫 번째 줄을 변경하세요.

#!/bin/sh

도착하다:

#!/bin/sh -vx

그리고 실행하세요 grub-mkconfig -o /boot/grub/grub.cfg( dash -vx더 이상 필요하지 않음). 얻을 수 있는 추적은 grub.d 스크립트에서 가져온 것입니다.

이제 문제가 분명해졌기를 바랍니다. 문제를 해결한 후에는 -vxgrub.d 첨자의 시작 부분에 있는 플래그를 제거하는 것을 잊지 마십시오 .

답변2

grubRAID에 속한 모든 하드 드라이브에 설치 해야 한다는 내용을 읽었습니다 . 결함이 있는 하드 드라이브를 교체했으므로 다음 명령을 실행하여 확인할 수 있습니다.

dpkg-reconfigure grub-pc

섹션 에 들어가면 GRUB install devices별표가 표시된 장치와 그렇지 않은 장치를 확인할 수 *있으며 커서와 스페이스바를 사용하여 표시할 수 있습니다. (주요 장비 등은 모두 /dev/sda표시 /dev/sdb해야 /dev/sdc함)

이 단계를 완료한 후에는 grub을 다시 설치하고 모든 것을 정상으로 되돌려야 합니다.

관련 정보