我想修改linux内核,以便它可以挂载vhd文件并从中启动...请给我一些建议!!!我们知道在加载initrd.gz之后linux内核挂载硬盘分区...我想要而不是挂载linux partiton它应该挂载一个vhd文件位于硬盘中包含安装的ubuntu并从中启动系统。 Windows 7支持从vhd启动的这个功能,但ubuntu没有..所以我问我们如何为此目的修改内核。谢谢
答案 0 :(得分: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用户空间。
答案 1 :(得分:0)
如果你正在尝试启动Ubuntu Linux,我就是这样做的:
<强>的/ etc / initramfs的工具/钩/ 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的工具/ SC〜TS / INIT-底部/ 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的工具/脚本/ INIT-顶部/ 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
现在,您只需修改bootloader以加载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
}