mkinitramfs 이후 Debian KVM 게스트가 부팅되지 않습니다. - /root에 /dev/vda1을 설치하지 못했습니다.

mkinitramfs 이후 Debian KVM 게스트가 부팅되지 않습니다. - /root에 /dev/vda1을 설치하지 못했습니다.

2020년 7월 7일에 편집됨: 문제 범위에 대한 정보가 추가되었습니다.

2020년 6월 25일 편집: 몇 가지 추가 진단 정보를 추가했습니다.

질문이 있어요더반빌드를 사용하는 KVM 게스트는 실행(커널 업그레이드, Grub cfg 변경 등) virt-resize전까지 완벽하게 실행되며 mkinitramfs그 후에는 시스템이 부팅되지 않습니다.

  • 그럽 메뉴가 나타납니다
  • 메뉴에서 선택한 옵션을 사용하면 시스템이 다음 오류와 함께 initramfs Busybox 셸에 액세스할 수 없게 됩니다.

mount: mounting /dev/vda1 on /root failed: No such device

이런 일이 발생하기 전에 나는 게스트와 기사의 사본을 가져와 break=premount커널 옵션을 전달하여 각각 부팅하여 모두 initramfs 디버그 셸에 강제로 넣었습니다. 거기에서 나는 차이점을 비교하려고 노력합니다. 가장 눈에 띄는 것은 출력이다 dmesg. 기본적으로는 끝까지 똑같습니다. 잘못된 호스트에서:

호스트 손상

[    0.743940] Run /init as init process
[    0.801833] lpc_ich 0000:00:1f.0: I/O space for GPIO uninitialized
[    0.814263] cryptd: max_cpu_qlen set to 1000
[    0.817594] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
[    0.817785] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input2
[    0.820087] PCI Interrupt Link [GSIA] enabled at IRQ 16
[    0.820187] i801_smbus 0000:00:1f.3: SMBus using PCI interrupt
[    0.829008] AVX2 version of gcm_enc/dec engaged.
[    0.829008] AES CTR mode by8 optimization enabled
[    0.839844] virtio_blk virtio2: [vda] 41943040 512-byte logical blocks (21.5 GB/20.0 GiB)
[    0.843734]  vda: vda1 vda2
[    0.846319] virtio_net virtio0 enp1s0: renamed from eth0

직장 호스트

[    0.736291] Run /init as init process
[    0.795060] lpc_ich 0000:00:1f.0: I/O space for GPIO uninitialized
[    0.800259] PCI Interrupt Link [GSIA] enabled at IRQ 16
[    0.800363] i801_smbus 0000:00:1f.3: SMBus using PCI interrupt
[    0.811428] cryptd: max_cpu_qlen set to 1000
[    0.821407] AVX2 version of gcm_enc/dec engaged.
[    0.821407] AES CTR mode by8 optimization enabled
[    0.823702] ACPI: bus type USB registered
[    0.823712] usbcore: registered new interface driver usbfs
[    0.823717] usbcore: registered new interface driver hub
[    0.823726] usbcore: registered new device driver usb
[    0.829766] SCSI subsystem initialized
[    0.830240] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
[    0.830430] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input2
[    0.844882] virtio_blk virtio2: [vda] 41943040 512-byte logical blocks (21.5 GB/20.0 GiB)
[    0.854231]  vda: vda1 vda2
[    0.857633] xhci_hcd 0000:02:00.0: xHCI Host Controller
[    0.857638] xhci_hcd 0000:02:00.0: new USB bus registered, assigned bus number 1
[    0.857900] xhci_hcd 0000:02:00.0: hcc params 0x00087001 hci version 0x100 quirks 0x0000000000000010
[    0.859088] virtio_net virtio0 enp1s0: renamed from eth0
[    0.860055] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19
[    0.860056] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    0.860056] usb usb1: Product: xHCI Host Controller
[    0.860057] usb usb1: Manufacturer: Linux 4.19.0-9-amd64 xhci-hcd
[    0.860057] usb usb1: SerialNumber: 0000:02:00.0
...

예상대로 계속해서 IO를 로드하고 초기화하는 반면, 손상된 호스트는 그렇지 않기 때문에 후자를 약간 다듬었습니다.

lsmod손상된 호스트에서 SCSI 모듈이 로드되지 않았는지 확인하십시오. modprobe -v scsi_mod모듈을 직접 또는 dmesg.

문제 범위

테스트를 통해 Debian 게스트만 영향을 받고 사용량만 영향을 받는 것으로 범위를 좁혔습니다 virt-resize.

기본 LVM 볼륨만 복제하면 Debian 호스트에는 아무런 문제가 없지만 virt-resize기본 LVM 볼륨의 내용을 다른(더 큰) 볼륨에 복사하는 경우(빌드 스크립트에서 수행하는 작업) 이 문제가 발생합니다. 데비안에는 mkinitramfs 주위에 update-initramfs라는 래퍼 스크립트가 있습니다.

빌드 방법에 관계없이 CentOS 호스트에는 문제가 없습니다.

무엇을 해야할지 잘 모르겠습니다. initramfs에서 뭔가 다르거나 손상된 것 같습니다.

======== 방문객 시공방법 ========

전제 조건: 매우 작은 LVM 지원 3G 디스크(파티션 2개 = / & 스왑)를 사용하여 기본 Debian 게스트를 수동으로 설치합니다. 이는 매우 기본적인 구성(Ansible 사용자 생성, 일부 주요 패키지 설치, IPV6 비활성화 등)을 적용합니다.

그런 다음 스크립트가 실행될 때:

  • LVM 스냅샷은 기본 이미지를 지원하는 볼륨에서 생성됩니다.
  • kpartx -a /path/to/snapshot파티션에 액세스하려면 실행하세요.
  • 추출된 루트 파티션의 2개 파일을 편집하여 네트워크 매개변수 설정
  • kpartx -d /path/to/snapshot
  • 최종 클라이언트의 크기(예: 20G)와 일치하는 새 LVM 볼륨을 생성합니다.
  • virt-resize스냅샷을 소스로 사용하고 새 볼륨을 대상으로 사용하여 실행합니다. 포함된 스왑 파티션의 크기를 고정된 크기로 조정하려면 이 옵션을 사용하고, --resize나머지 공간을 채우기 위해 루트 파티션을 늘리려면 이 옵션을 사용합니다 --expand.
  • kpartx -amkswap새로운 크기의 스왑 파티션에서 실행한 다음 kpartx -d정리할 수 있도록 새 볼륨에서 파티션을 추출하는 데 다시 사용됩니다.
  • 새 볼륨을 디스크로 사용하여 새 게스트에 대한 KVM에 적절한 구성을 추가합니다.

이것은 모두 좋습니다. 게스트는 게스트에서 처음 mkinitramfs실행될 때까지 잘 작동합니다.

무슨 일이 일어나고 있는지, 그리고 해결 방법에 대해 생각이나 아이디어가 있는 사람이 있나요?

답변1

USB 드라이버가 로드되지 않는 것 같습니다. 이로 인해 가상 드라이브에 문제가 발생하는 이유는 확실하지 않지만(VirtIO 드라이버가 여전히 있는 것 같습니다) 이것이 두 dmesg 명령의 주요 차이점입니다.

또 다른 차이점은 SCSI 하위 시스템이 손상된 가상 머신에 로드되지 않는다는 것입니다. 기본 이미지에서 mkinitramfs를 실행할 때는 이 문제가 발생하지 않지만 스크립트가 실행된 후에는 모든 것이 중단된다고 말씀하셨습니다. 어쩌면 LVM 사용과 관련이 있습니까? 한 번에 한 줄씩 스크립트를 수동으로 실행하고 mkinitramfs를 실행한 다음 재부팅해 보십시오. 이는 문제를 정확히 파악하는 데 도움이 됩니다.

짧고 그다지 도움이 되지 않는 답변에 대해 죄송합니다. 저는 VirtIO 드라이버 설치 등에 관한 많은 질문에 답했고 dmesg 덤프 중 하나에서 한 줄을 놓쳐 전체 솔루션을 완전히 망쳤다는 것을 깨달았습니다. 그런 다음 제거할 수 없다는 것을 발견했습니다. Stack Exchange의 답변이 있어서 뭔가를 보관해야 했고, 오해의 소지가 있는(완전히 쓸모없는) 답변을 남기고 싶지 않았습니다.

도움이 되었기를 바랍니다!

관련 정보