Converte o diretório para a imagem de disco virtual do QEMU / KVM

8

Eu tenho um diretório cheio de dados em / var / backups / disk1 que eu quero converter em uma imagem de disco virtual que eu então possa inicializar usando QEMU ou KVM (o diretório contém o sistema de arquivos para um virtual máquina copiada via rsync).

Embora existam muitas instruções 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 idéia?

A propósito, eu sei que posso usar o qemu-img para converter um dispositivo de bloco em um disco virtual (por exemplo, "qemu-img convert-f / dev / sdc -O qcow2 disk.qcow2"), portanto, Eu poderia fazer o diretório / var / backups / disk1 parecer um dispositivo de bloco, então, teoricamente, eu deveria ser capaz de realizar meu objetivo usando o qemu-img. Pensei em maneiras criativas de expor o diretório como um dispositivo de bloco usando o NBD ou um dispositivo de loopback, no entanto, e não obtive sucesso.

    
por Chris 13.03.2011 / 12:38

5 respostas

15

Primeiro, crie uma imagem bruta do tamanho desejado. Eu vou assumir 10G é o suficiente. Usar 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 opção -F para mkfs.ext4 operar em um arquivo em oposição a uma partição de disco)

Depois, 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 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 o qemu-img, mas isso não é necessário.

    
por 16.03.2011 / 04:43
4

Parece que a libguestfs pode fazer isso, veja virt-make-fs (1) e talvez < a virt-copy-in (1) .

    
por 17.11.2011 / 21:15
1

Usando a estratégia do Michaels no Fedora 23:

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

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

# mount file.fs /mnt 

Agora / mnt contém todos os seus arquivos

    
por 09.11.2015 / 14:56
0

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

    
por 13.03.2011 / 19:17
0

virt-make-fs de libguestfs qcow2 example

O

link 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 sudo não é necessário, exceto para instalação e soluções alternativas de bugs do Ubuntu.

Eu, então, verifiquei que o QEMU pode realmente lê-lo com:

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

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

virt-make-fs ext exemplo

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

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

que podemos verificar diretamente no host com:

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

Um recurso muito bom de virt-make-fs é que ele tenta minimizar automaticamente o tamanho da imagem, se é isso que queremos:

Virt-make-fs defaults to minimizing the extra space, but you can use the --size flag to leave space in the filesystem if you want it.

então:

df -h

informa que a imagem está com 82% de preenchimento:

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

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

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

sobrecarga do diário ext4

O manual também menciona que:

Note that ext3 filesystems contain a journal, typically 1-32 MB in size. If you are not going to use the filesystem in a way that requires the journal, then this is just wasted overhead.

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 erros do Ubuntu

Agora, para o lado negativo: parece que há nenhum mantenedor do Ubuntu atualmente e a biblioteca é geralmente com bugs no Ubuntu.

sudo não é, em teoria, necessário, mas é necessário devido a um bug de empacotamento do Ubuntu, a menos que nós façamos uma solução alternativa: link

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 as nossas soluções alternativas, 18.04 (mas não 16.04) falha com: link

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

devido a um bug que já foi corrigido pelo autor.

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

    
por 14.06.2018 / 17:32