将 Linux 部署到 VHD 中并从 VHD 启动

将 Linux 部署到 VHD 中并从 VHD 启动

自从 Microsoft Windows 7 推出以来,Windows 平台就支持了一项非常牛逼的功能,称为 Native VHD Boot。这允许您将 Windows 安装到 VHDX 文件中,而不是直接将其安装到物理卷上。

使用此配置,Windows 安装完全在“裸机”上运行(不在虚拟机管理程序内)。

在此输入图像描述

我想对 Linux 做类似的事情,尽管我没有这样做的经验。我怎样才能做到这一点?

答案1

一种方法是使用存储盘。您可以使用dd或类似的东西轻松地从现有系统创建原始图像。您还可以使用libvirt/virt-managervirtualbox等轻松创建虚拟机。例如,使用virt-manager,您可以创建虚拟磁盘并使用 ISO 文件(以及其他方法)在其中安装操作系统。我不是 100% 确定 memdisk 支持哪些格式,所以我认为您最好使用raw预先分配固定大小的图像格式。

如果您的目标只是在一个物理分区上拥有多个可启动的 Linux 系统,那么 LVM 是一个更直接的选择。这涉及创建一个物理分区、一个逻辑卷组、多个逻辑卷(以及每个逻辑卷上的文件系统),以及将系统安装或复制到每个逻辑卷(在后一种情况下,您需要编辑 grub)。听起来步骤很多,但大多数 Linux 发行版安装程序都允许您轻松进行设置。

答案2

这几天我一直在思考这个想法,现在终于实现了。

首先,您需要编译一个用于挂载 VHD 文件的二进制文件。但它也可以挂载 VMDK、VDI 和原始磁盘映像。您可以从这里获取编译该程序的源代码。 https://github.com/SophosLabs-zz/vdfuse

但在编译之前电压保险丝你需要运行这个命令。

sudo apt install libfuse-dev virtualbox pkg-config

libfuse-dev具有 vdfuse 编译所需的头文件。
虚拟盒具有安装磁盘映像所需的预编译驱动程序。
pkg 配置编译 vdfuse 时由脚本使用。
现在有了所有必需的文件和二进制文件,让我们编译 vdfuse。

所以你需要运行编译命令电压保险丝如下面所述:

./autogen.sh
./configure
make
sudo make install

接下来,我们需要添加一些脚本,以便在 intird.img 中的 init 之前运行。

按如下方式创建这些文件:

/usr/share/initramfs-tools/hooks/vdfuse

#!/bin/sh -e
PREREQ=""
prereqs()
{
    echo "$PREREQ"
}

case "$1" in
    prereqs)
    prereqs
    exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /usr/local/bin/vdfuse /sbin

/usr/share/initramfs-tools/scripts/init-top/vdfuse

#!/bin/sh -e
PREREQ="udev"
prereqs()
{
    echo "$PREREQ"
}

case "$1" in
    prereqs)
    prereqs
    exit 0
    ;;
esac

if [ ! -z $vdisk ]; then
    mkdir /vdhost
    mkdir /dev/vdhost
    mount -t ntfs $host /vdhost/
    vdfuse -t VHD -f /vdhost$vdisk /dev/vdhost
    mount -t ext4 $ROOT /root
fi

/usr/share/initramfs-tools/scripts/init-bottom/vdhost

#!/bin/sh -e
PREREQ=""
prereqs()
{
    echo "$PREREQ"
}

case "$1" in
    prereqs)
    prereqs
    exit 0
    ;;
esac

if [ -d ${rootmnt}/vdhost ]; then
    mount -n -o move /vdhost ${rootmnt}/vdhost
fi

接下来,您需要通过运行以下命令使这些文件可执行:

sudo chmod +x /usr/share/initramfs-tools/hooks/vdfuse
sudo chmod +x /usr/share/initramfs-tools/scripts/init-top/vdfuse
sudo chmod +x /usr/share/initramfs-tools/scripts/init-bottom/vdhost

现在我们需要使用以下命令构建一个新内核:sudo update-initramfs -k all -c

这就是您在 Linux 中需要做的一切。最后一件事是设置 grub 来引导虚拟磁盘映像。

以下是需要添加到 grub.cfg 文件中的命令。

 set vhd=/vhd/Ubuntu.vhd
 set vdhost
 search --no-floppy -s root -f $vhd
 loopback lp0 $vhd tdisk=VHD
 linux   (lp0,1)/vmlinuz root=/dev/vdhost/Partition1 vdisk=$vhd host=/dev/sda1 quiet splash
 initrd  (lp0,1)/initrd.img

将 /dev/sda1 更改为 VHD 所在的设备。

答案3

我还想从 VHD 启动 Linux...并将 VHD 存储在 HD/USB/SD/等中...

基于 Debian 的将是我的第一选择...

GRUB4DOS 有一些有趣的实验
http://reboot.pro/topic/20603-linux-from-vhd-how-to/
使用名为“UBT-small.vhd”的预构建映像...

我认为它可以通过细微的调整适用于其他引导加载程序......

答案4

我认为Ubuntu的WUBI原则上是原生vdisk启动的Linux版本。虽然这个功能早已被 Ubuntu 官方终止,但还有一个持续的第三方版本 wubi uefi。 Wubi 的设计目的是让普通人运行 Ubuntu,因此它与原生启动的意图不同。

相关内容