Перетворіть каталог у зображення віртуального диска QEMU / KVM


10

У мене є каталог, наповнений даними, /var/backups/disk1який я хочу перетворити у віртуальний образ диска, який потім зможу завантажуватися за допомогою QEMU або KVM (каталог містить файлову систему для віртуальної машини, скопійовану через rsync).

Незважаючи на те, що існує велика кількість інструкцій для перетворення повного фізичного диска на віртуальний диск, упаковка лише вмісту одного каталогу у зображення віртуального диска виявляється набагато складніше, ніж я очікував. Будь-які ідеї?

До речі, я знаю, що можу використати qemu-imgдля перетворення блокового пристрою у віртуальний диск (наприклад, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), тож якби тільки я міг змусити каталог /var/backups/disk1виглядати як блоковий пристрій, то теоретично я мав би змогу досягти своєї мети за допомогою qemu-img. Я думав про творчі способи розкрити каталог як блоковий пристрій за допомогою NBD або пристрою з зворотним зв'язком, але не мав успіху.

Відповіді:


17

Спочатку створіть необроблене зображення потрібного розміру. Я припускаю, що 10G достатньо. Використання пошуку створює розріджений файл , що економить простір.

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

Далі створіть на ній файлову систему.

mkfs.ext4 -F example.img

(Зверніть увагу, що вам потрібна -Fопція для mkfs.ext4роботи з файлом на відміну від дискового розділу)

Потім, змонтуйте його.

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

Тепер ви можете скопіювати свої файли в / mnt / example. Після цього відключіть його, і ви можете використовувати example.img як привід у віртуальній машині. Якщо ви хочете, ви можете перетворити його з необробленого зображення в інший формат, наприклад qcow2e, використовуючи qemu-img, але це не потрібно.


1
qemu-imgі fallocateтрохи зручніше, ніж dd.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Як розрахувати мінімальний необхідний розмір: unix.stackexchange.com/questions/353156/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功


4

virt-make-fsз qcow2прикладу libguestfs

https://serverfault.com/a/332114/163884 згадав про це, але ось повний приклад:

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 

Зверніть увагу, як sudoце не потрібно, за винятком встановлення та усунення помилок Ubuntu.

Потім я переконався, що QEMU насправді може прочитати його за допомогою:

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

Тоді я можу змонтувати зображення всередині QEMU Linux і прочитати файл.

virt-make-fs наприклад

Цей дивовижний інструмент також може створювати необроблені файлові системи ext, наприклад:

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

що ми можемо підтвердити безпосередньо на хості за допомогою:

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

Мінімізація розміру зображення

Дійсно хорошою особливістю virt-make-fsє те, що вона автоматично намагається мінімізувати розмір зображення, якщо це те, що ми хочемо:

Virt-make-fs за замовчуванням мінімізує додатковий простір, але ви можете використовувати прапор --size, щоб залишити простір у файловій системі, якщо цього хочете.

тому:

df -h

говорить мені, що зображення заповнене на 82%:

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

Ми можемо легко додати трохи додаткового місця поверх мінімального за допомогою --size-=+:

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

журнал накладних журналів ext4

У посібнику також зазначено, що:

Зауважте, що файлові системи ext3 містять журнал, зазвичай розміром 1-32 Мб. Якщо ви не збираєтеся використовувати файлову систему таким чином, що вимагає журналу, то це просто витрачається накладні витрати.

і цікаво перевірити це за допомогою:

du -bs *

яка виробляє:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

тому ми бачимо, що ext4 вийшов значно більшим.

помилки Ubuntu libguestfs

Тепер про мінус: начебто не існує технічного обслуговування Ubuntu, а бібліотека, як правило, багата на Ubuntu.

sudoтеоретично не потрібно, але він необхідний через помилку упаковки Ubuntu, якщо ми не вирішимо: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt make-fs-without-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.

Після цього без нашого вирішення проблеми 18.04 (але не 16.04) не вдається: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

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

через помилку, яка вже була виправлена ​​за течією.

Тестовано в Ubuntu 18.04, libguestfs-інструменти 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3.


1

Використання стратегії Майкласа у Fedora 23:

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

Це створює файлову систему ext2, яку ви можете встановити в деякий каталог:

# mount file.fs /mnt 

Тепер / mnt містить усі ваші файли


Якщо file.fsце файл, чи не повинна бути mountкоманда mount -o loop file.fs /mnt:?
kasperd

0

Що з доступом до каталогу як мережевої спільної мережі з VM, яка також змонтована до вашого цільового образу віртуального диска? Ви, ніж просто, виконаєте просту копію з папки на змонтований образ диска.


Це повинно працювати, і це схоже на мою нинішню стратегію, яка полягає у створенні VM та rsync даних. Було б чудово, якби було швидше та більш чітке рішення. Копіювання даних на нову машину стає досить безладним, оскільки вам потрібно потурбуватися про те, щоб виключити певні файли, які не слід копіювати, як, наприклад, fstab та більшість речей у / boot
Кріс,

"виключити певні файли, які не слід копіювати, як-от fstab та більшість речей у / boot" - це може бути не так вже й великою проблемою, коли ціль VM є додатковим томом.
user48838

0

Я віддаю перевагу (і використовую) відповідь Ciro Santilli, але ось щось, що працює з guestfishоболонкою:

# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.