我想修改 linux 内核,以便它可以挂载 vhd 文件并从它开始......请给我一些想法!正如我们所知,linux内核在加载initrd.gz后会挂载硬盘分区......我希望它应该挂载一个vhd文件,而不是挂载linux分区,它应该挂载一个位于硬盘中某个位置的vhd文件,其中包含安装的ubuntu并从中启动系统. Windows 7 支持从 vhd 启动的这一功能,但 ubuntu 不支持..所以 yi 询问我们如何为此目的修改内核。谢谢你
2 回答
这一点都不容易。
要开始加载 Linux,需要使用引导加载程序。该程序定位 vmlinux 或 vmlinuz 文件和 initrd 文件并将它们加载到 RAM 中。
我假设您的 VHD 文件存储在 NTFS 文件系统上。VHD 文件中包含 vmlinuz 和 initrd 文件。
所以首先,引导加载程序需要了解 NTFS。接下来,引导加载程序需要了解 VHD。
只有在那之后,Linux 才能开始加载。
到那时,事情就变得容易了,因为 Linux 有您可以使用的 NTFS 文件系统驱动程序。可能是 NTFS-3G 用户空间驱动程序与 FUSE 相结合。我不确定 VHD 格式,但您可以使用 VirtualBox 中的 vdfuse 来安装它。
NTFS 和 VHD 挂载程序必须进入 initrd。然后 initrd 可以从 VHD 挂载根分区并进入正常的 Linux 用户空间。
如果您正在尝试启动 Ubuntu Linux,这就是我所做的:
- 在windows中下载vboot-v1 install,或者google for grub2解决方案
- 安装 Virtualbox
- 使用 Virtualbox 安装 Ubuntu,选择 vhd 类型的磁盘
- 在 Ubuntu 中安装 virtualbox-fuse
- 在 ubuntu 中,将此文件添加到文件系统:
/etc/initramfs-tools/hooks/vdfuse
#!/bin/sh
set -e
PREREQ=""
prereqs()
{
echo "${PREREQ}"
}
case "${1}" in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
if [ -x /usr/ ]
then
copy_exec /usr/bin/vdfuse /bin
fi
/etc/initramfs-tools/sc~ts/init-bottom/vhdhost
#!/bin/sh
PREREQ=""
# Output pre-requisites
prereqs()
{
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
mount -n -o move /vhdhost ${rootmnt}/vhdhost
exit 0
/etc/initramfs-tools/scripts/init-top/vdfuse
#!/bin/sh
PREREQS=""
prereqs()
{
echo $PREREQS
}
case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac
mkdir /vhdhost
mount /dev/sda2 /vhdhost/ -t ntfs-3g
mkdir /dev/vhdhost
vdfuse -f /vhdhost/$vloop /dev/vhdhost
exit 0
跑update-initramfs -k all -c
现在,您只需修改引导加载程序以加载您的 vhd 文件,例如,将其添加到grub.cfg:
menuentry "VHD Ubuntu 12.10 64-bit" {
insmod vhd
vhd vhd0 (hd0,2)/vhd/Ubuntu.vhd --partitions
linux (vhd0,1)/boot/vmlinuz-3.5.0-23-generic root=/dev/vhdhost/Partition1 vloop=/vhd/Ubuntu.vhd quiet splash
initrd (vhd0,1)/boot/initrd.img-3.5.0-23-generic
}