mkinitramfs 后 Debian KVM 客户机无法启动 - 在 /root 上安装 /dev/vda1 失败

mkinitramfs 后 Debian KVM 客户机无法启动 - 在 /root 上安装 /dev/vda1 失败

2020 年 7 月 7 日编辑:添加有关问题范围的信息

2020 年 6 月 25 日编辑:添加了一些额外的诊断信息

我有一个问题德班使用构建的 KVM 来宾virt-resize将完美运行直到mkinitramfs运行(内核升级、Grub cfg 更改等),之后系统将无法启动。

  • 出现 Grub 菜单
  • 从菜单中选择的任何选项都会导致系统无法访问 initramfs Busybox shell,并出现错误:

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

在出现这种情况之前,我已经获取了来宾的副本和一篇文​​章,然后引导每个传递break=premount内核选项以强制它们都进入 initramfs 调试 shell。从那里我尝试比较不同之处。最值得注意的是 的输出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 卷的内容复制到另一个(更大的)卷(这就是我在构建脚本中所做的操作),则会触发此问题。 Debian 有一个围绕 mkinitramfs 的包装脚本,称为 update-initramfs。

无论构建方法如何,CentOS 主机都没有问题。

不太确定该怎么做。 initramfs 中似乎有些东西不同/损坏了。

======== 访客构建方法========

先决条件:使用非常小的 LVM 支持的 3G 磁盘(2 个分区 = / & 交换)手动安装基本 Debian 来宾。这应用了一堆非常基本的配置(创建 Ansible 用户、安装一些关键软件包、禁用 IPV6 等)。

然后当脚本运行时:

  • LVM 快照是从支持基础映像的卷中获取的
  • kpartx -a /path/to/snapshot运行以获取分区的访问权限
  • 在提取的根分区上编辑 2 个文件以设置网络参数
  • kpartx -d /path/to/snapshot
  • 创建一个新的 LVM 卷,其大小符合最终客户机应有的大小(例如 20G)
  • virt-resize使用快照作为源、新卷作为目标来运行。使用该选项将包含的交换分区调整为固定大小,--resize并且使用该选项增大根分区以填充剩余空间--expand
  • kpartx -a再次用于从新卷中提取分区,以便mkswap可以在新大小的交换分区上运行,然后kpartx -d进行清理
  • 为新来宾添加合适的配置到 KVM,并以新卷作为其磁盘

这一切都很好。来宾工作正常,直到第一次mkinitramfs在来宾上运行。

有人对可能发生的事情以及如何解决有任何想法/想法吗?

答案1

您的 USB 驱动程序似乎未加载。不确定为什么这会导致虚拟驱动器出现问题(VirtIO 驱动程序似乎仍然存在),但这是两个 dmesg 命令之间的主要区别。

另一个区别是 SCSI 子系统不会加载到损坏的虚拟机中。您说,当您仅在基本映像上运行 mkinitramfs 时,不会发生此问题,但它确实会在脚本运行后破坏所有内容。可能和你使用LVM有关系?尝试一次手动执行一行脚本,运行 mkinitramfs,然后重新启动。这应该可以帮助您查明问题。

很抱歉这个简短且可能不是很有帮助的答案 - 我对 VirtIO 驱动程序安装等问题做了一个大量的回答,意识到我在你的一个 dmesg 转储中错过了一行,这完全破坏了我的整个解决方案,然后发现你不能从 Stack Exchange 中删除答案,所以我必须保留一些东西,并且我不想留下误导性(并且完全无用)的答案。

希望这可以帮助!

相关内容