Как изменить ядро ​​Linux для монтирования VHD-файла во время загрузки и загрузки системы из него?

Я хочу изменить ядро ​​Linux, чтобы оно могло монтировать VHD-файлы и запускать с него... пожалуйста, дайте мне некоторое представление!!! Поскольку мы знаем, что ядро ​​linux монтирует разделы жесткого диска после загрузки initrd.gz... я хочу, чтобы вместо монтирования раздела linux он монтировал vhd-файл, расположенный где-то на жестком диске, который содержит установленную ubuntu, и запускал систему с него, Windows 7 поддерживает эту функцию загрузки с VHD, но Ubuntu этого не делает... так что я спрашивал, как мы можем модифицировать ядро ​​для этой цели. Благодарю вас

2 ответа

Решение

Это будет непросто.

Для начала загрузки Linux используется загрузчик. Эта программа находит файл vmlinux или vmlinuz и файл initrd и загружает их в оперативную память.

Я предполагаю, что ваш VHD-файл хранится в файловой системе NTFS. Внутри файла VHD находятся файлы vmlinuz и initrd.

Итак, во-первых, загрузчик должен понимать NTFS. Далее, загрузчик должен понимать VHD.

Только после этого Linux может начать загружаться.

В этот момент все становится проще, потому что в Linux есть драйверы файловой системы NTFS, которые вы можете использовать. Вероятно, драйвер пространства пользователя NTFS-3G в сочетании с FUSE. Я не уверен в форматах VHD, но вы можете использовать vdfuse из VirtualBox для его монтирования.

Программы монтирования NTFS и VHD должны находиться внутри initrd. Затем initrd может смонтировать корневой раздел с виртуального жесткого диска и перейти в обычное пользовательское пространство Linux.

Если вы пытаетесь загрузить Ubuntu Linux, вот что я сделал:

  1. Загрузите vboot-v1, установите в Windows, или Google для решения grub2
  2. Установите Virtualbox
  3. Установите Ubuntu с Virtualbox, выберите тип диска VHD
  4. Установите virtualbox-fuse в Ubuntu
  5. В Ubuntu добавьте эти файлы в файловую систему:

/ и т.д. / 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

/ и т.д. / 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

/ и т.д. / 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

Теперь вам просто нужно изменить загрузчик для загрузки вашего 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
 }
Другие вопросы по тегам