如何修改linux内核以便在引导时装载vhd文件并从中加载系统?

如何修改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文

我想修改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来安装它


NTFS和VHD装载程序必须进入initrd内部。然后initrd可以从VHD挂载根分区并进入正常的Linux用户空间。

如果您试图启动Ubuntu Linux,下面是我所做的:

  • 在windows或google中下载安装grub2解决方案
  • 安装Virtualbox
  • 使用Virtualbox安装Ubuntu,选择硬盘的vhd类型
  • 在Ubuntu中安装virtualbox fuse
  • 在ubuntu中,将以下文件添加到文件系统:
  • /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
    
     #!/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是一个商业产品,,,并且已经有一段时间没有添加,而且对于当前的内核版本来说,它可能已经过时了。