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 中删除答案,所以我必须保留一些东西,并且我不想留下误导性(并且完全无用)的答案。
希望这可以帮助!