如何修改linux内核以便在引导时装载vhd文件并从中加载系统?
我想修改linux内核,以便它可以挂载vhd文件,并从它开始…请给我一些想法!!!正如我们所知,linux内核在加载initrd.gz之后会挂载硬盘分区……我希望它不挂载linux分区,而是挂载一个vhd文件,该文件位于安装了ubuntu的硬盘的某个位置,并从中启动系统。Windows 7支持从vhd引导的功能,但ubuntu不支持。所以我问我们如何修改内核以达到这个目的。谢谢这一点都不容易 要开始加载Linux,需要使用引导加载程序。该程序定位vmlinux或vmlinuz文件和initrd文件,并将它们加载到RAM中 我假设您的VHD文件存储在NTFS文件系统上。VHD文件中包含vmlinuz和initrd文件 因此,首先,引导加载程序需要理解NTFS。接下来,引导加载程序需要理解VHD 只有在这之后,Linux才能开始加载 在这一点上,事情变得容易了,因为Linux有可以使用的NTFS文件系统驱动程序。可能是NTFS-3G用户空间驱动程序与FUSE相结合。我不确定VHD格式,但您可以使用VirtualBox中的vdfuse来安装它如何修改linux内核以便在引导时装载vhd文件并从中加载系统?,linux,kernel,boot,vhd,Linux,Kernel,Boot,Vhd,我想修改linux内核,以便它可以挂载vhd文件,并从它开始…请给我一些想法!!!正如我们所知,linux内核在加载initrd.gz之后会挂载硬盘分区……我希望它不挂载linux分区,而是挂载一个vhd文件,该文件位于安装了ubuntu的硬盘的某个位置,并从中启动系统。Windows 7支持从vhd引导的功能,但ubuntu不支持。所以我问我们如何修改内核以达到这个目的。谢谢这一点都不容易 要开始加载Linux,需要使用引导加载程序。该程序定位vmlinux或vmlinuz文件和initrd文
NTFS和VHD装载程序必须进入initrd内部。然后initrd可以从VHD挂载根分区并进入正常的Linux用户空间。如果您试图启动Ubuntu Linux,下面是我所做的:
#!/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
#!/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
/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
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
#!/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
运行updateinitramfs-kall-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
}
您可能应该修改引导加载程序来实现这一点,而不是内核。此外,至少部分目录树(很可能是
/tmp
和/home
,可能是/var/tmp
)必须驻留在NTFS以外的其他文件系统上。上次我检查时,.谢谢你,Zan Lynx从你的回答中,我得到了一个更好的主意,通过插入一个将安装vhd的程序来修改initrd。你在这个@Adi_CS上成功了吗,你能分享一下吗?嗨,Adi_CS。。。你的方法成功了吗。。。您可以分享详细信息吗?vboot是一个商业产品,,,并且已经有一段时间没有添加,而且对于当前的内核版本来说,它可能已经过时了。