如何在启动时修改linux内核以挂载vhd文件并从中加载系统?

时间:2012-08-24 14:22:08

标签: linux kernel boot vhd

我想修改linux内核,以便它可以挂载vhd文件并从中启动...请给我一些建议!!!我们知道在加载initrd.gz之后linux内核挂载硬盘分区...我想要而不是挂载linux partiton它应该挂载一个vhd文件位于硬盘中包含安装的ubuntu并从中启动系统。 Windows 7支持从vhd启动的这个功能,但ubuntu没有..所以我问我们如何为此目的修改内核。谢谢

2 个答案:

答案 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,我就是这样做的:

  1. 在Windows中下载vboot-v1,或在google上下载grub2解决方案
  2. 安装Virtualbox
  3. 使用Virtualbox安装Ubuntu,选择vhd类型的磁盘
  4. 在Ubuntu中安装virtualbox-fuse
  5. 在ubuntu中,将此文件添加到filesystem:
  6. <强>的/ 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
     }