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 -a
mkswap
새로운 크기의 스왑 파티션에서 실행한 다음kpartx -d
정리할 수 있도록 새 볼륨에서 파티션을 추출하는 데 다시 사용됩니다.- 새 볼륨을 디스크로 사용하여 새 게스트에 대한 KVM에 적절한 구성을 추가합니다.
이것은 모두 좋습니다. 게스트는 게스트에서 처음 mkinitramfs
실행될 때까지 잘 작동합니다.
무슨 일이 일어나고 있는지, 그리고 해결 방법에 대해 생각이나 아이디어가 있는 사람이 있나요?
답변1
USB 드라이버가 로드되지 않는 것 같습니다. 이로 인해 가상 드라이브에 문제가 발생하는 이유는 확실하지 않지만(VirtIO 드라이버가 여전히 있는 것 같습니다) 이것이 두 dmesg 명령의 주요 차이점입니다.
또 다른 차이점은 SCSI 하위 시스템이 손상된 가상 머신에 로드되지 않는다는 것입니다. 기본 이미지에서 mkinitramfs를 실행할 때는 이 문제가 발생하지 않지만 스크립트가 실행된 후에는 모든 것이 중단된다고 말씀하셨습니다. 어쩌면 LVM 사용과 관련이 있습니까? 한 번에 한 줄씩 스크립트를 수동으로 실행하고 mkinitramfs를 실행한 다음 재부팅해 보십시오. 이는 문제를 정확히 파악하는 데 도움이 됩니다.
짧고 그다지 도움이 되지 않는 답변에 대해 죄송합니다. 저는 VirtIO 드라이버 설치 등에 관한 많은 질문에 답했고 dmesg 덤프 중 하나에서 한 줄을 놓쳐 전체 솔루션을 완전히 망쳤다는 것을 깨달았습니다. 그런 다음 제거할 수 없다는 것을 발견했습니다. Stack Exchange의 답변이 있어서 뭔가를 보관해야 했고, 오해의 소지가 있는(완전히 쓸모없는) 답변을 남기고 싶지 않았습니다.
도움이 되었기를 바랍니다!