Создание загрузочного img файла

IMG файл - это побайтовый образ диска. Иногда, полезно создать загрузочного live img файл, чтобы протестировать его в qemu или перенести данный образ на несколько флешек.

Также:

Создание img файла

Создайте img файл размером больше на 2гб чем предполагаемые данные, но при этом размер должен быть меньше чем флешка, на которую будет записан этот образ.

dd if=/dev/zero of=/media/debian/usb.img bs=1M count=8192 conv=fsync status=progress

Синхронизируйте файлы

sync -f

Выполните команду создания GPT разметки для img файла

parted /media/debian/usb.img mklabel gpt

Запустите программу управления дисками

cfdisk /media/debian/usb.img

Создайте primary раздел на весь диск

  Size Type
1 100M EFI System
2 All space Linux root (x86-64)

 Выведите на экран результат

fdisk -lu /media/debian/usb.img

Должно вывести

Disk /media/debian/usb.img: 8 GiB, 8589934592 bytes, 16777216 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: EDFCC007-0E71-47D3-B6D7-031EF67843E9

Device                  Start      End  Sectors  Size Type
/media/debian/usb.img1   2048   206847   204800  100M EFI System
/media/debian/usb.img2 206848 16777182 16570335  7,9G Linux root (x86-64)

Создайте loop устройства

losetup -Pf /media/debian/usb.img

Проверьте к какому loop устройству они подключены

losetup -a

Создайте файловую систему

mkfs.vfat -F32 /dev/loop0p1
mkfs.ext4 -L live_usb /dev/loop0p2

Проверьте файловую систему

fsck -fv /dev/loop0p1
fsck -fv /dev/loop0p2

 Проверьте правильно ли создали разметку

parted /media/debian/usb.img print

У меня выдало следующее:

Model:  (file)
Disk /media/debian/usb.img: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  106MB   105MB   fat32              boot, esp
 2      106MB   8590MB  8484MB  ext4

Монтирование img файла образа

Создайте папку и смонтируйте root usb

mkdir -p /media/debian/root
mount /dev/loop0p2 /media/debian/root

Создайте папку для загрузчика

mkdir -p /media/debian/root/boot/efi
mount /dev/loop0p1 /media/debian/root/boot/efi

Смонтируйте системные папки

mkdir -p /media/debian/root/proc
mkdir -p /media/debian/root/sys
mkdir -p /media/debian/root/dev

mount -t proc proc /media/debian/root/proc
mount -t sysfs sys /media/debian/root/sys
mount -o bind /dev /media/debian/root/dev
mount -t devpts none /media/debian/root/dev/pts

Установка файлов через debootstrap

Установите файлы в образ по инструкции через debootstrap

Синхронизируйте данные

sync -f && fstrim -av

Cконфигурируйте fstab

Выполните комманду:

blkid

Она выдаст UUID дисков. Примерно следующее:

/dev/loop0: PTUUID="edfcc007-0e71-47d3-b6d7-031ef67843e9" PTTYPE="gpt"
/dev/loop0p1: UUID="2F0B-1F68" TYPE="vfat" PARTUUID="8ee0bffc-fe4b-2e42-b227-806120c9e91c"
/dev/loop0p2: LABEL="live_usb" UUID="d2767d43-e682-4a39-8dfa-a0a3c6ff7999" TYPE="ext4" PARTUUID="cb3d67ac-7005-d543-8ff8-35984978626a"

Откройте файл fstab для редактирования.

nano /media/debian/root/etc/fstab

ID дисков нужно прописать в fstab.

Обратите внимание! У вас может отличаться UUID!

Прописывайте свои UUID, которые выдала вам программа blkid

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=d2767d43-e682-4a39-8dfa-a0a3c6ff7999   /               ext4    errors=remount-ro  0  1
UUID=2F0B-1F68                              /boot/efi       vfat    umask=0077         0  1

Установка загрузчика GRUB на img образ

Установите загрузчик

grub-install --target=x86_64-efi --bootloader-id=liveusb \
	--boot-directory=/media/debian/root/boot \
	--removable --recheck --no-floppy /dev/loop0

Сделайте chroot

chroot /media/debian/root

Установите grub

update-initramfs -u
update-grub

Выйдите из chroot

exit

Отмонтируйте папки

umount /media/debian/root/proc
umount /media/debian/root/sys
umount /media/debian/root/dev/pts
umount /media/debian/root/dev
umount /media/debian/root/boot/efi
umount /media/debian/root

Отключите loop устройство

losetup -d /dev/loop0

IMG файл готов

Увеличение image файла

Если у вас, в процессе копирования, не хватило места в img файле, то его можно увеличить. Добавляем 1 гб к файлу.

truncate -s +1G /media/debian/usb.img

Проверьте новый размер

fdisk -l /media/debian/usb.img

Если у вас выдает ошибку

GPT PMBR size mismatch (16777215 != 62333951) will be corrected by w(rite).

То ее можно исправить запустив команду:

gdisk /media/debian/usb.img

Выполните последовательно команды x, e, v, w

x - extra functionality (experts only)
e - relocate backup data structures to the end of the disk
v - verify disk
w - write table to disk and exit

 Примерно должно получиться следующее:

$ gdisk /media/debian/usb.img
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): x

Expert command (? for help): e
Relocating backup data structures to the end of the disk

Expert command (? for help): v

No problems found. 45558750 free sectors (21.7 GiB) available in 2
segments, the largest of which is 45556736 (21.7 GiB) in size.

Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

После выполнения этих команд таблица должна быт исправлена. Проверьте ее командой

fdisk -l /media/debian/usb.img

Затем сделайте resize раздела 2 используя cfdisk

cfdisk /media/debian/usb.img

Смонтируйте файл

losetup -Pf /media/debian/usb.img

Сделайте resize ext4

e2fsck -y -f /dev/loop0p2
resize2fs /dev/loop0p2

 Также можно проверить целостность boot раздела

fsck -fvy /dev/loop0p1
fsck -fvy /dev/loop0p2

Отмонтируйте loop

losetup -d /dev/loop0

Проверка img файла через QEMU

Запустите qemu с параметрами

qemu-system-x86_64 -m 2G -cpu host -enable-kvm \
  -bios /usr/share/ovmf/OVMF.fd \
  -netdev user,id=net0 -device virtio-net-pci,netdev=net0 \
  -drive format=raw,file=/media/debian/usb.img

Проверка img файла через VirtualBox

IMG Файл можно конвертировать в файл Virtualbox и обратно.

Конвертация в диск для VirtualBox

VBoxManage convertfromraw --format VDI usb.img usb.vdi

Поменяйте владельца файла

chown user:user usb.vdi

Создайте виртуальную машину и подключите этот vdi диск и запустите виртуальную машину

Чтобы сконвертировать обратно диск VirtualBox в img выполните команду

VBoxManage internalcommands converttoraw usb.vdi usb.img

Перенос образа img на флешку используя команду dd

Подключите флешку. Узнайте на каком устройстве она смонтирована

fdisk -l

Предполагается что флешка смонтирована на устройство /dev/sdb. У вас может быть другое устройство.

Disk /dev/sdb: 29,7 GiB, 31914983424 bytes, 62333952 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: 783A4E57-3B40-4317-8A8C-BD074FCB0F0E

Скопируйте img образ на флешку.

Обратите внимание на какое устройство вы копируете!

Вместо /dev/sdb у вас может быть другое устройство!

dd bs=1M if=/media/debian/usb.img of=/dev/sdb conv=noerror,fsync status=progress

Выполните синхронизацию

sync -f && fstrim -av

Проверьте изменения

fdisk -l /dev/sdb

Должно вывести примерно следующее

GPT PMBR size mismatch (16777215 != 62333951) will be corrected by w(rite).
Disk /dev/sdb: 29,7 GiB, 31914983424 bytes, 62333952 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: EDFCC007-0E71-47D3-B6D7-031EF67843E9

Device      Start      End  Sectors  Size Type
/dev/sdb1    2048   206847   204800  100M EFI System
/dev/sdb2  206848 16777182 16570335  7,9G Linux root (x86-64)

Исправление ошибки GPT PMBR size mismatch

Если у вас при вызове команды fdisk -l Выдает ошибку

GPT PMBR size mismatch (16777215 != 62333951) will be corrected by w(rite).

То нужно исправить флешку через gdisk

gdisk /dev/sdb

Выполните последовательно команды x, e, v, w

x - extra functionality (experts only)
e - relocate backup data structures to the end of the disk
v - verify disk
w - write table to disk and exit

Примерно должно получиться следующее:

$ gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): x

Expert command (? for help): e
Relocating backup data structures to the end of the disk

Expert command (? for help): v

No problems found. 45558750 free sectors (21.7 GiB) available in 2
segments, the largest of which is 45556736 (21.7 GiB) in size.

Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

После выполнения этих команд таблица должна быт исправлена. Проверьте ее командой

fdisk -l /dev/sdb

ошибка исчезла:

Disk /dev/sdb: 29,7 GiB, 31914983424 bytes, 62333952 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: EDFCC007-0E71-47D3-B6D7-031EF67843E9

Device      Start      End  Sectors  Size Type
/dev/sdb1    2048   206847   204800  100M EFI System
/dev/sdb2  206848 16777182 16570335  7,9G Linux root (x86-64)

Так как img образ был значительно меньше размера флешки, то нужно увелить размер

cfdisk /dev/sdb

Выбирите пункт resize и установите новый размер. Запишите изменения на диск через пункт [Write]

Проверьте целостность файловой системы и увеличьте ее размер

e2fsck -y -f /dev/sdb2
resize2fs /dev/sdb2

Также можно проверить целостность boot раздела

fsck -fvy /dev/sdb1
fsck -fvy /dev/sdb2

Загрузочная флешка готова!

Проверка флешки через QEMU

 Запустите qemu с параметрами

qemu-system-x86_64 -m 2G -cpu host -enable-kvm \
  -bios /usr/share/ovmf/OVMF.fd \
  -netdev user,id=net0 -device virtio-net-pci,netdev=net0 \
  -drive format=raw,media=disk,file=/dev/sdb

Перенос образа img на флешку используя rsync

Если вам копирование через dd yне подходит, то можете использовать этот способ.

Сначала смонтируйте папки

losetup -Pf /media/debian/usb.img
mount /dev/loop0p2 /media/debian/root
mount /dev/loop0p1 /media/debian/root/boot/efi
mount /dev/sdb2 /mnt

Затем сделайте rsync

rsync -aSsuh --info=progress2 --numeric-ids --bwlimit=10240 --delete \
  --exclude 'boot/efi' --exclude 'dev' --exclude 'proc' --exclude 'sys' --exclude 'tmp' \
  /media/debian/root/ /mnt/

Сделайте unmount подключенных устройств

umount /media/debian/root/boot/efi
umount /media/debian/root
umount /mnt
losetup -d /dev/loop0

Установка загрузчика на флешку

Смонтируйте флешку

mount /dev/sdb2 /mnt
mount /dev/sdb1 /mnt/boot/efi
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev
mount -t devpts none /mnt/dev/pts

Сделайте chroot

chroot /mnt

Установите загрузчик

grub-install --target=x86_64-efi --bootloader-id=liveusb \
  --boot-directory=/boot --removable --recheck \
  --no-floppy /dev/sdb

update-initramfs -u
update-grub

Отмонтируте флешку

umount /mnt/proc
umount /mnt/sys
umount /mnt/dev/pts
umount /mnt/dev
umount /mnt/boot/efi
umount /mnt

Выполните синхронизацию

sync -f && fstrim -av

Загрузочная флешка готова!