Создать загрузочный диск из образа раздела ext4

Создать загрузочный диск из образа раздела ext4

Моя цель — создать загрузочную резервную копию моей системы без перезагрузки. Я буду использовать qemu-img для преобразования необработанного образа dd в vhdx и запуска его в Hyper-V.

Если я загружу с liveCD и выполню:

dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notrunc

Я могу без особых усилий преобразовать его в vhdx и запустить напрямую в Hyper-V.

Вывод fdisk -l:

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 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: gpt
Disk identifier: 7555D04B-D6DC-4ABB-8863-529E874BADAD

Device       Start       End   Sectors   Size Type
/dev/sda1     2048   2000895   1998848   976M EFI System
/dev/sda2  2000896 500117503 498116608 237.5G Linux filesystem

Однако эту команду нельзя использовать, пока система находится в сети, поэтому я использую драйвер dattobd для копирования всей файловой системы ext4 следующим образом:

dd if=/dev/datto0 of=/nfs/sda2.raw bs=1M

Это эффективно копирует все данные /dev/sda2правильно, я это проверил, потому что хэш тот же, если я использую liveCD и dd раздела /dev/sda2. Теперь я могу загрузиться в liveCD и скопировать /dev/sda1, это раздел EFI, поэтому он не меняется слишком часто, если я не обновляю grub или что-то, связанное с ядром Linux, я нормально перезагружаюсь, чтобы просто сделать резервную копию этого раздела время от времени, но если кто-то знает способ сделать это онлайн, пожалуйста, сообщите мне.

Теперь у меня есть /dev/sda1и /dev/sda2в двух отдельных файлах, мой вопрос в том, как мне собрать эти два в один файл, который по сути даст тот же вывод, что и запуск dd if=/dev/sda of=/nfs/sda.raw conv=noerror,sync,notruncна liveCD? Нужно ли вам просто идеально выровнять байты? Я искал это везде, но безуспешно. Любая помощь будет очень ценна!

решение1

Вы можете смонтировать образ всего диска с поддержкой разделов, а затем поместить в него ddобновленный образ:sda2

losetup -P /dev/loop0 /nfs/sda.raw  #this will create /dev/loop0p1 and loop0p2
dd if=/nfs/sda2.raw of=/dev/loop0p2
losetup -d /dev/loop0

В качестве альтернативы ваша таблица разделов указывает, что ваш первый раздел начинается с сектора № 2048, поэтому на вашем диске есть 2048 * 512 байт = 1 МиБ пространства перед первым разделом («голова») и 500118192 - 500117503 - 1 = 688 секторов (344 КБ) пространства в конце («хвост») за пределами любого раздела. (-1, потому что первый сектор имеет номер 0, а не номер 1)

Первый раздел заканчивается в секторе #2000895, а второй начинается в секторе #2000896, поэтому между ними нет неиспользуемого пространства.

Вы используете таблицу разделов GPT, которая включает резервную копию таблицы разделов в конце диска, поэтому часть "хвоста" также необходимо будет захватить. Она начинается с сектора #500117504 и продолжается до конца диска.

Таким образом, вы можете захватить содержимое частей «головы» и «хвоста» по отдельности, а затем объединить их:

dd if=/dev/sda of=/nfs/head.raw bs=512 count=2048
dd if=/dev/sda of=/nfs/tail.raw bs=512 skip=500117504
cat /nfs/head.raw /nfs/sda1.raw /nfs/sda2.raw /nfs/tail.raw > /nfs/sda.raw

Если вы не изменяете таблицу разделов, вам нужно будет захватить «головную» и «хвостовую» части только один раз: они не должны меняться во время обычного использования системы.

Связанный контент