1

我想修改 linux 内核,以便它可以挂载 vhd 文件并从它开始......请给我一些想法!正如我们所知,linux内核在加载initrd.gz后会挂载硬盘分区......我希望它应该挂载一个vhd文件,而不是挂载linux分区,它应该挂载一个位于硬盘中某个位置的vhd文件,其中包含安装的ubuntu并从中启动系统. Windows 7 支持从 vhd 启动的这一功能,但 ubuntu 不支持..所以 yi 询问我们如何为此目的修改内核。谢谢你

4

2 回答 2

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 用户空间。

于 2012-08-24T16:52:41.863 回答
0

如果您正在尝试启动 Ubuntu Linux,这就是我所做的:

  1. 在windows中下载vboot-v1 install,或者google for grub2解决方案
  2. 安装 Virtualbox
  3. 使用 Virtualbox 安装 Ubuntu,选择 vhd 类型的磁盘
  4. 在 Ubuntu 中安装 virtualbox-fuse
  5. 在 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
 }
于 2013-02-04T10:49:29.900 回答