Как изменить ядро 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, вот что я сделал:
- Загрузите vboot-v1, установите в Windows, или Google для решения grub2
- Установите Virtualbox
- Установите Ubuntu с Virtualbox, выберите тип диска VHD
- Установите virtualbox-fuse в Ubuntu
- В 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
}