Converter diretório em imagem de disco virtual QEMU / KVM

10

Eu tenho um diretório preenchido com dados e /var/backups/disk1desejo converter em uma imagem de disco virtual, que poderei inicializar usando QEMU ou KVM (o diretório contém o sistema de arquivos de uma máquina virtual, copiado via rsync).

Embora existam muitas instruções disponíveis para converter um disco físico completo em um disco virtual, empacotar apenas o conteúdo de um único diretório em uma imagem de disco virtual está se tornando muito mais difícil do que eu esperava. Alguma ideia?

A propósito, eu sei que posso usar qemu-imgpara converter um dispositivo de bloco em um disco virtual (por exemplo, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2); portanto, se eu conseguisse fazer com que o diretório /var/backups/disk1parecesse ser um dispositivo de bloco, teoricamente eu seria capaz de atingir meu objetivo usando qemu-img. No entanto, pensei em maneiras criativas de expor o diretório como um dispositivo de bloco usando o NBD ou um dispositivo de loopback e não obtive sucesso.

Chris
fonte

Respostas:

16

Primeiro, crie uma imagem não processada do tamanho necessário. Eu vou assumir que 10G é suficiente. O uso da busca cria um arquivo esparso , que economiza espaço.

dd if=/dev/null of=example.img bs=1M seek=10240

Em seguida, crie um sistema de arquivos nele.

mkfs.ext4 -F example.img

(Observe que você precisa da -Fopção para mkfs.ext4operar em um arquivo em oposição a uma partição de disco)

Em seguida, monte-o.

mkdir /mnt/example
mount -t ext4 -o loop example.img /mnt/example

Agora você pode copiar seus arquivos para / mnt / example. Feito isso, desmonte-o e você poderá usar o example.img como uma unidade em uma máquina virtual. Se você quiser, pode convertê-lo de uma imagem bruta para outro formato como qcow2e usando qemu-img, mas isso não é necessário.

sciurus
fonte
1
qemu-imge fallocatesão um pouco mais convenientes que dd.
Ciro Santilli publicou
Como calcular o tamanho mínimo exigido: unix.stackexchange.com/questions/353156/...
Ciro Santilli冠状病毒审查六四事件法轮功
4

virt-make-fsdo qcow2exemplo libguestfs

/server//a/332114/163884 mencionou, mas aqui está um exemplo completo:

sudo apt-get install libguestfs-tools

# Workarounds for Ubuntu 18.04 bugs. See section below.
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*

mkdir sysroot
# Just a test file.
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=qcow2 --type=ext2 sysroot sysroot.ext2.qcow2 

Observe como isso sudonão é necessário, exceto para soluções de solução de problemas de instalação e Ubuntu.

Verifiquei então que o QEMU pode realmente lê-lo com:

qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...

Sou capaz de montar a imagem dentro do QEMU Linux e ler o arquivo.

virt-make-fs exemplo ext

Essa ferramenta incrível também pode criar sistemas de arquivos ext brutos, por exemplo:

virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
virt-make-fs --format=raw --type=ext4 sysroot sysroot.ext4

com o qual podemos verificar diretamente no host:

mkdir -p mnt
dev="$(sudo losetup --show -f -P sysroot.ext4)"
sudo mount -o loop "$dev" mnt
cmp sysroot/myfile mnt/myfile

Minimização do tamanho da imagem

Uma característica realmente boa virt-make-fsdisso é que ele tenta minimizar automaticamente o tamanho da imagem, se é isso que queremos:

O virt-make-fs usa como padrão minimizar o espaço extra, mas você pode usar o sinalizador --size para deixar espaço no sistema de arquivos, se desejar.

tão:

df -h

me diz que a imagem está preenchida em 82%:

/dev/loop17    1.5M  1.1M  244K  82% /home/ciro/test/guestfs/mnt

Podemos facilmente adicionar algum espaço extra além do mínimo com --size-=+:

virt-make-fs --format=raw --size=+8M --type=ext2 sysroot sysroot.ext2

sobrecarga de diário ext4

O manual também menciona que:

Observe que os sistemas de arquivos ext3 contêm um diário, geralmente com tamanho de 1 a 32 MB. Se você não usar o sistema de arquivos de uma maneira que exija o diário, isso será desperdiçado.

e é interessante verificar isso com:

du -bs *

que produz:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

então vemos que o ext4 saiu significativamente maior.

libguestfs Ubuntu bugs

Agora, a desvantagem: parece não haver mantenedor do Ubuntu atualmente e a biblioteca geralmente está com bugs no Ubuntu.

sudonão é, em teoria, necessário, mas é necessário devido a um erro de empacotamento do Ubuntu, a menos que façamos uma solução alternativa: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt-make-fs-sem-sudo / 1046829 # 1046829

libguestfs: error: /usr/bin/supermin exited with error status 1.
To see full error messages you may need to enable debugging.
Do:
  export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
and run the command again.  For further information, read:
  http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
You can also run 'libguestfs-test-tool' and post the *complete* output
into a bug report or message to the libguestfs mailing list.
    libguestfs: error: /usr/bin/supermin exited with error status 1.

Depois disso, sem nossas soluções alternativas, 18.04 (mas não 16.04) falha com: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

libguestfs: error: tar_in: write error on directory: /: 

devido a um erro que já foi corrigido a montante.

Testado no Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3.

Ciro Santilli adicionou uma nova foto
fonte
1

Usando a estratégia Michaels no Fedora 23:

# dnf install -y libguestfs-tools-c
# virt-make-fs --format=raw --label mylabel the_directory myfs.raw

Isso cria o sistema de arquivos ext2, que você pode montar em algum diretório:

# mount file.fs /mnt 

Agora / mnt contém todos os seus arquivos

Jauzus
fonte
Se file.fsfor um arquivo, não deve o mountcomando ser: mount -o loop file.fs /mnt?
kasperd
0

Que tal acessar o diretório como um compartilhamento de rede de uma VM que também está montada na sua imagem de disco virtual de destino? Você do que apenas executar uma cópia simples do compartilhamento para a imagem de disco montada.

user48838
fonte
Isso deve funcionar e é semelhante à minha estratégia atual, que é criar uma VM e sincronizar os dados. Seria ótimo se houvesse uma solução mais rápida e limpa. Copiar os dados para uma nova máquina fica bastante complicado porque você tem que se preocupar com certificando-se de excluir certos arquivos que não devem ser copiados, como fstab e a maioria das coisas em / boot
Chris
"excluir determinados arquivos que não devem ser copiados, como fstab e a maioria das coisas em / boot" - pode não ser um problema tão grande quando o destino da VM é um volume adicional.
user48838
0

Prefiro (e uso) a resposta de Ciro Santilli, mas aqui está algo que funciona com um guestfishshell:

# assumes extant directory "rootfs"
tar -cf rootfs.tar -C rootfs .
guestfish <<EOF
disk-create rootfs.qcow2 qcow2 "$((2 * $(stat -c%s rootfs.tar)))"
add-drive rootfs.qcow2
run
part-disk /dev/sda gpt
mkfs ext4 /dev/sda
mount /dev/sda /
tar-in rootfs.tar /
umount-all
exit
EOF
rubicks
fonte