答案1
一种方法是使用存储盘。您可以使用dd
或类似的东西轻松地从现有系统创建原始图像。您还可以使用libvirt
/virt-manager
或virtualbox
等轻松创建虚拟机。例如,使用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,因此它与原生启动的意图不同。