Eu tenho jogado essa ideia nos últimos dias e finalmente consegui que funcionasse.
Primeiro você precisa compilar um binário que irá montar arquivos VHD. Mas também pode montar VMDK, VDI e imagens de disco bruto. Você pode obter a fonte para compilar este programa a partir daqui.
link
Mas antes de compilar vdfuse você precisa executar este comando.
sudo apt install libfuse-dev virtualbox pkg-config
libfuse-dev tem os arquivos de cabeçalho necessários para o vdfuse compilar.
virtualbox possui drivers pré-compilados necessários para montar imagens de disco.
pkg-config é usado por um script ao compilar o vdfuse.
Agora, com todos os arquivos e binários necessários, vamos compilar o vdfuse.
Assim, os comandos que você precisa executar para compilar vdfuse são os seguintes:
./autogen.sh
./configure
make
sudo make install
Em seguida, precisamos adicionar alguns scripts para executar antes do init dentro do intird.img.
Crie estes arquivos da seguinte forma:
/ usr / share / initramfs-tools / hooks / vdfuse
#!/bin/sh -e
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/local/bin/vdfuse /sbin
/ usr / share / initramfs-tools / scripts / init / top / vdfuse
#!/bin/sh -e
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
if [ ! -z $vdisk ]; then
mkdir /vdhost
mkdir /dev/vdhost
mount -t ntfs $host /vdhost/
vdfuse -t VHD -f /vdhost$vdisk /dev/vdhost
mount -t ext4 $ROOT /root
fi
/ usr / share / initramfs-tools / scripts / init-bottom / vdhost
#!/bin/sh -e
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
if [ -d ${rootmnt}/vdhost ]; then
mount -n -o move /vdhost ${rootmnt}/vdhost
fi
Em seguida, você precisa tornar esses arquivos executáveis executando o seguinte:
sudo chmod +x /usr/share/initramfs-tools/hooks/vdfuse
sudo chmod +x /usr/share/initramfs-tools/scripts/init-top/vdfuse
sudo chmod +x /usr/share/initramfs-tools/scripts/init-bottom/vdhost
Agora precisamos criar um novo kernel usando este comando: sudo update-initramfs -k all -c
Isso é tudo que você precisa fazer dentro do Linux. A última coisa é configurar o grub para inicializar a imagem do disco virtual.
Aqui estão os comandos que precisam ser adicionados ao arquivo grub.cfg.
set vhd=/vhd/Ubuntu.vhd
set vdhost
search --no-floppy -s root -f $vhd
loopback lp0 $vhd tdisk=VHD
linux (lp0,1)/vmlinuz root=/dev/vdhost/Partition1 vdisk=$vhd host=/dev/sda1 quiet splash
initrd (lp0,1)/initrd.img
Mude / dev / sda1 para qualquer dispositivo em que o VHD esteja localizado.