如何修改 linux 内核以在启动时挂载 vhd 文件并从中加载系统?
Posted
技术标签:
【中文标题】如何修改 linux 内核以在启动时挂载 vhd 文件并从中加载系统?【英文标题】:How to modify linux kernel for mounting a vhd file at boot time and load the system from it? 【发布时间】:2012-08-24 14:22:07 【问题描述】:我想修改linux内核,让它可以挂载vhd文件并从它开始...请给我一些想法!!!正如我们所知,linux内核在加载initrd.gz后会挂载硬盘分区......我希望它应该挂载一个vhd文件,而不是挂载linux分区,它应该挂载一个位于硬盘中某个位置的vhd文件,其中包含安装的ubuntu并从中启动系统. Windows 7 支持从 vhd 启动的这一功能,但 ubuntu 不支持..所以你问我们如何为此目的修改内核。谢谢你
【问题讨论】:
你可能应该修改引导加载程序来实现这一点,而不是内核。 【参考方案1】:这根本不容易。
要开始加载 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 用户空间。
【讨论】:
此外,至少目录树的一部分(很可能是/tmp
和/home
,也可能是/var/tmp
)必须驻留在除NTFS 之外的其他文件系统上。上次我检查时,NTFS did not support UNIX Domain sockets。
谢谢 Zan Lynx 从你的回答中我得到了一个更好的主意,通过插入一个将挂载 vhd 的程序来修改 initrd。
你在这个@Adi_CS 上成功了吗,可以分享一下吗?
嗨 Adi_CS...您的方法成功了吗...您可以分享详细信息吗?【参考方案2】:
如果您正在尝试启动 Ubuntu Linux,这就是我所做的:
-
下载vboot-v1在windows中安装,或google 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
【讨论】:
vboot 是一个商业产品,已经有一段时间无人维护了,,对于当前的内核版本来说,它可能已经过时了。以上是关于如何修改 linux 内核以在启动时挂载 vhd 文件并从中加载系统?的主要内容,如果未能解决你的问题,请参考以下文章