如何在 VMware 上通过 P2V 启动旧版 Linux

如何在 VMware 上通过 P2V 启动旧版 Linux

客户拥有一些旧的 Linux 系统,这些系统可以追溯到五到十五年前,仍在原始硬件上运行。由于担心磁盘的年限等问题,他们希望将它们全部虚拟化到 VMware vHost 上。

我能够通过 VMware 的独立转换器虚拟化几乎任何 21 世纪的 Windows 机器,到目前为止成功率是 100%。但是,尝试对 Linux 机器执行相同操作总是会导致失败,并且虚拟机无法启动,通常会给出类似“内核崩溃,无法启动 /init”的错误。

我发现如果我安装救援 CD 的 ISO 并从中启动,然后选择“从硬盘启动 Linux”,系统将会启动并且我可以登录,但是这会导致它们运行救援 CD 的内核而不是板载内核,这会导致在尝试重新添加 radius 服务器上的虚拟接口时失败 - 尝试运行“modprobe dummy”时,该过程会失败:

FATAL: Could not load /lib/modules/3.14.50-std460-amd64/modules.dep: No such file or directory

检查 /lib/modules 目录后发现存在的文件是:

/lib/modules/2.6.27.7-9-pae/modules.dep

这与原始物理机上的 uname -r 返回的内容相匹配:

uname -r
2.6.27.7-9-pae

在从救援 CD 启动的 P2V VM 上,它提供

uname -r
3.14.50-std460-amd64

在物理机上,init 位于 /sbin/init,根文件系统位于 /dev/sda2:

rad02:~ # which init
/sbin/init
rad02:~ # df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              20G  3.2G   16G  17% /
udev                  243M  7.6M  236M   4% /dev
/dev/sda3              52G   15G   35G  30% /home
/dev/sdb1              74G  7.1G   63G  11% /var/log

在虚拟机上,我尝试从硬盘启动并root=/dev/sda2 init=/sbin/init在引导加载程序时添加,并且我看到机器似乎尝试启动 /init 和 /sbin/init - 但仍然失败并出现“内核崩溃,无法启动 init”错误。

这台特定的原始机器正在运行openSUSE 11.1 (i586),但我希望得到一个通用的答案,因为我想为这个客户虚拟化各种 RedHat、SuSE 和 openSUSE 系统。

我需要做什么才能使 P2V 虚拟机启动并成功引导?

编辑:好的,感谢那些评论的人,我现在更好地理解了问题 - Grub 可以正常看到磁盘,但实际的内核系统不能,这很可能是由于 /etc/sysconfig/kernel 文件的 initrd_modules 行中缺少控制器驱动程序。

原始物理主机上的内容如下:

INITRD_MODULES="processor thermal ata_piix ata_generic piix ide_pci_generic fan jbd ext3 edd"

以下是 P2V 转换在 VM 文件中的内容:

INITRD_MODULES="mptscsih mptspi mptsas scsi_transport_spi scsi_transport_sas BusLogic ahci pcnet32 processor thermal ata_piix ata_generic piix ide_pci_generic fan jbd ext3"

下载 openSUSE 11.1 安装 DVD 并运行“修复已安装的系统”选项后,情况发生了变化:

INITRD_MODULES="ahci mptsas ata_piix ata_generic piix ide_pci_generic jbd ext3"

从早期的救援 CD 启动时,我对列出的所有模块进行了定位,并且除 ide_pci_generic 驱动程序之外的所有内容都存在 - 鉴于 VMware 将 SATA Lsi Logic 作为标准磁盘类型,我假设它不会使用 IDE 驱动程序?

我有另一台运行 openSUSE 10 的 P2V VM,它最初也有同样的拒绝启动问题,但是,在关闭电源几个月后,令人惊讶的是它启动正确了(并且已重新启动多次,每次都成功),查看该 VM 的 /etc/sysconfig/kernel 时我得到:

INITRD_MODULES="mptscsih mptspi scsi_transport_spi BusLogic pcnet32 piix ata_piix processor thermal fan jbd ext3"

那么我接下来该去哪里呢?

编辑2:

下面 AB 打勾的答案解决了这个问题。

按照给出的说明,使用一台备用虚拟机(该虚拟机使用与我们要进行 p2v 的机器相同的 Linux 版本全新安装),我在 /tmp 下创建了三个目录:物理、虚拟和组合。按照说明,我从物理机器中拉取了 initrd 和 System.map 文件,并将它们解压到 /tmp/physical 下,然后从我所在的虚拟机(即,相同操作系统的正常工作的虚拟机)中拉取了相同的文件,并将它们解压到 /tmp/virtual 中。

出于好奇,我对每个目录的 du 输出进行了比较,因此:

cd /tmp/physical
du > /tmp/ph.txt
cd /tmp/virtual
du > /tmp/vi.txt
cd /tmp
cat ph.txt |cut -d'.' -f2,3,4,5,6 |sort > ph-sorted.txt 
cat vi.txt |cut -d'.' -f2,3,4,5,6 |sort > vi-sorted.txt
diff ph-sorted.txt vi-sorted.txt

产生了这个输出 - 差别很小,但有几个文件:

21,22d20
< /lib/modules/2.6.27.7-9-pae/kernel/drivers/hid
< /lib/modules/2.6.27.7-9-pae/kernel/drivers/hid/usbhid
26c24,25
< /lib/modules/2.6.27.7-9-pae/kernel/drivers/input
---
> /lib/modules/2.6.27.7-9-pae/kernel/drivers/message
> /lib/modules/2.6.27.7-9-pae/kernel/drivers/message/fusion
29,31d27
< /lib/modules/2.6.27.7-9-pae/kernel/drivers/usb
< /lib/modules/2.6.27.7-9-pae/kernel/drivers/usb/core
< /lib/modules/2.6.27.7-9-pae/kernel/drivers/usb/host

然后,我将 /tmp/physical 和 /tmp/virtual 的完整内容复制到 /tmp/combo 中(虚拟内容排在第二位,因此会覆盖任何冲突)。

然后我按照下面的答案做了

depmod -b /tmp/combo -F /tmp/combo/System.map-2.6.27.7-9-pae -v 2.6.27.7-9-pae

它抛出了一堆依赖性错误,但其他方面运行正常,然后

cd /tmp/combo
find . -print0 | cpio -o -0 -H newc |gzip -9 > /tmp/initrd-2.6.27.7-9-pae

我从救援 CD 启动了失败的 p2v,并将其放在网络上,复制 initrd-2.6.27.7-9-pae到 /boot,分离救援 CD ISO 并重新启动 - 成功了!openSUSE 11.1 在 p2v VM 上顺利运行,服务似乎正常运行 - 成功!

答案1

我碰巧遇到了类似的问题(缺少驱动程序,但这里可能更多是由于从 IDE/ATA 到 SCSI 的变化引起的),因此从记忆中:

  • 检索/boot/initrd.img-2.6.27.7-9-pae文件(从物理服务器或使用虚拟机的救援磁盘)以及/boot/System.map-2.6.27.7-9-pae
  • 将它们放在任何 Linux 计算机上的 /tmp 中,使用 gzip、cpio 和 depmod 命令(以及 fakeroot 或 root 访问权限)
  • 成为 root 或使用 fakeroot 来模拟它(这是为以后的 cpio 准备的)

    $ fakeroot
    # mkdir /tmp/cpio
    # cd /tmp/cpio
    # gunzip < /tmp/initrd.img-2.6.27.7-9-pae | cpio -i -m
    
  • 棘手的部分:找出 中可能缺少的驱动程序/tmp/cpio/lib/modules/2.6.27.7-9-pae/。您似乎有一个候选列表。一些问题需要预见(并尝试纠正):您的物理服务器似乎使用的是 ATA/IDE 而不是 SCSI。如果您从 ATA 转到 SCSI,您的驱动器将从 /dev/hda /dev/hdb ... 更改为 /dev/sda /dev/sdb ... 并且您将再次遇到启动问题(仍然找不到磁盘)。我认为这就是您遇到的情况。

    • 任何一个更改模拟硬件以匹配以前的硬件:使用 IDE/ATA,而不是 SCSI(Buslogic)。我会这么做。也许 Suse 11 救援 DVD 就足够了。
    • 或者准备编辑(在使用救援 CD 启动的 VM 中,但也可能在其他地方的 initrd 中!)/etc/fstab 以通过将 /dev/hdX 更改为 /dev/sdX 来应对所有这些问题。由于您的安装较旧,我不会依赖现代 UUID= 设置来解决这个问题。除非我知道 fstab 之外的每个编辑位置,否则我会避免使用这种解决方案

    如果缺少某个驱动程序,则要么是真的缺少,要么是内置的(请参阅后面的 depmod)。从物理服务器、使用救援 CD 启动的 VM 或甚至从某些 Suse 存储库(如果您确定它是同一版本)复制您必须添加的模块/tmp/cpio/lib/modules/2.6.27.7-9-pae/。请注意,某些模块具有依赖关系,如有疑问,请添加超过所需的内容(只要 VM 的 /boot 中有空间...)

  • 然后重建模块依赖列表

    # depmod -b /tmp/cpio -F /tmp/System.map-2.6.27.7-9-pae -v 2.6.27.7-9-pae
    

    您可以检查/tmp/cpio/lib/modules/2.6.27.7-9-pae/modules.builtin是否存在缺失的模块(直接在内核中)

  • 重新打包树(并覆盖先前的 initrd 文件)

    # cd /tmp/cpio
    # find . -print0 | cpio -o -0 -H newc |gzip -9 > /tmp/initrd.img-2.6.27.7-9-pae
    

将此文件放回虚拟机的 /boot 中。虚拟机现在应该可以正常启动了

相关内容