Se eu estivesse fazendo isso, construiria a coisa toda em um ISO, então, quando estiver funcionando, você estará pronto. Para fazer isso, você precisará criar um ISO vazio para começar com
truncate -s 100M image.iso
Em seguida, verifique se há uma tabela de partições em uma tabela de partições (geralmente ela tem uma automagicamente)
# fdisk -l image.iso
Disk image.iso: 100 MiB, 104857600 bytes, 204800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x602a438a
Device Boot Start End Sectors Size Id Type
image.iso1 2048 204799 202752 99M 83 Linux
A próxima coisa que você quer fazer é criar seu sistema de arquivos no .iso, mas desde que você o queira na partição e não no dispositivo bruto, você precisará criar um dispositivo de loop de deslocamento para referenciar a partição. Observe a saída anterior de que um setor tem 512 bytes e a partição começa no setor 2048. Para calcular o deslocamento, na próxima etapa, você precisará de 512 * 2048 = 1048576 bytes. Em seguida, crie o dispositivo de loop de deslocamento.
losetup --offset 1048576 /dev/loop2 image.iso
Agora você está pronto para criar o sistema de arquivos e montá-lo.
mkfs.ext4 -O dir_index /dev/loop2
mount /dev/loop2 /mnt/temp
O passo final é instalar o grub no iso bruto para que ele possa inicializar.
grub-install image.iso
Construa seu sistema em /mnt/temp
e quando você estiver pronto para testá-lo, basta umount /mnt/temp
e fazer um vm que inicialize a partir de sua iso. Uma nota de cautela, se você inicializar o iso enquanto ele ainda estiver montado, você quase certamente irá corromper seu sistema de arquivos e terá que começar tudo de novo. Além disso, funciona muito bem.