如何修改 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 文件并从中加载系统?的主要内容,如果未能解决你的问题,请参考以下文章

如何从VHD启动WIN10

linux下挂载VHD等虚拟磁盘文件

如何在win7系统下硬盘中挂载虚拟硬盘?要求答案详细~

Win7系统怎么挂载vhd和关闭vhd文件技巧

如何修改 Linux 内核配置

挂载有问题,开机启动不了,进入单用户模式进入修改fstab挂载文件