Шпаргалка з роботи з образами дисків у CLI (Linux / Arch Linux)

Цей посібник містить набір перевірених CLI-команд для повного життєвого циклу роботи з образами дисків (.img): створення, стиснення, відновлення та зміна розмірів розділів.


1. Створення образу диска за допомогою dd

Створення побітової копії всього фізичного накопичувача (наприклад, SD-карти /dev/sdb) у файл.

[!WARNING] Переконайтеся, що ви правильно вказали вхідний пристрій (if). Помилка може призвести до повної втрати даних на системному диску!

Класичний спосіб (без стиснення)

sudo dd if=/dev/sdb of=orangepi_zero3_erldev.img bs=4M status=progress conv=fsync

Створення образу зі стисненням «на льоту»

Заощаджує дисковий простір та зменшує знос SSD/HDD під час копіювання:

  • З використанням gzip (швидко):
    sudo dd if=/dev/sdb bs=4M status=progress | gzip -9 > orangepi_zero3_erldev.img.gz
  • З використанням xz (максимальне стиснення, багатопотоковість):
    sudo dd if=/dev/sdb bs=4M status=progress | xz -9 -T0 > orangepi_zero3_erldev.img.xz

Оптимізація: заповнення порожнього простору нулями перед зняттям образу

Щоб архіватор стиснув порожнє місце майже до нуля, виконайте на системі перед вимкненням:

dd if=/dev/zero of=/zero.txt bs=1M status=progress
rm /zero.txt

2. Зменшення розміру образу (Shrinking)

Коли в образі диска багато вільного простору, його розмір можна мінімізувати.

Метод А. Автоматизований (через PiShrink)

Найкращий та найбезпечніший інструмент для ARM-систем (Orange Pi, Raspberry Pi):

# Завантаження скрипта
wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh

# Зменшення образу та автоматичне пакування в .xz
sudo ./pishrink.sh -Z orangepi_zero3_erldev.img

Метод Б. Ручний (стандартні утиліти)

  1. Підключення образу як loop-пристрою:
    sudo losetup -P -f --show orangepi_zero3_erldev.img
    # Команда виведе пристрій, наприклад: /dev/loop0
  2. Перевірка та стиснення файлової системи (ext4 на другому розділі):
    sudo e2fsck -f /dev/loop0p2
    sudo resize2fs -M /dev/loop0p2
    # Зверніть увагу на виведену кількість блоків (наприклад, 1270272 блоків по 4k)
    # Розрахунок мінімального розміру: 1270272 * 4096 = 5203034112 байт
  3. Зміна розміру розділу в таблиці розділів (parted):
    sudo parted /dev/loop0
    (parted) unit B
    (parted) print
    # Визначаємо початок (Start) другого розділу.
    # Новий End = Start + Розмір ФС + 100MB (запас)
    # Приклад: resizepart 2 5526392832B
    (parted) resizepart 2 <розрахований_End>B
    (parted) quit
  4. Обрізання файлу образу: Дізнайтеся точний кінець другого розділу (End) через parted orangepi_zero3_erldev.img unit B print.
    sudo losetup -d /dev/loop0
    truncate -s <точний_End_в_байтах> orangepi_zero3_erldev.img

3. Відновлення образу на новий диск (наприклад, /dev/sda)

Розпакування та запис стисненого архіву безпосередньо на цільовий носій:

xzcat orangepi_zero3_erldev.img.xz | sudo dd of=/dev/sda bs=4M status=progress conv=fsync
sudo partprobe /dev/sda

4. Розширення розділів на всю ємність диска

Після відновлення образу на більший накопичувач, необхідно розширити розділ та файлову систему, щоб задіяти весь обсяг диска.

Крок 1. Виправлення таблиці розділів GPT (якщо потрібно)

sudo parted /dev/sda print
# Якщо запитає виправити помилку розташування резервної копії GPT, введіть "Fix"

Крок 2. Зміна розміру розділу на 100% диска

sudo parted /dev/sda resizepart 2 100%
sudo partprobe /dev/sda

Крок 3. Збільшення розміру файлової системи (ext4)

sudo e2fsck -f /dev/sda2
sudo resize2fs /dev/sda2

Корисні діагностичні команди

  • lsblk -f — перегляд підключених блочних пристроїв та їхніх файлових систем.
  • fdisk -l — детальна інформація про структуру розділів дисків.
  • df -h — перегляд вільного місця на змонтованих файлових системах.

5. Просунуті сценарії: Зменшення образу без розпакування (Sparse Files) та перенесення на менший диск

Дуже часто виникають дві проблеми:

  • Немає вільного місця на комп'ютері, щоб повністю розпакувати образ розміром 32 GB.
  • Потрібно записати систему з великого образу (наприклад, 32 GB) на меншу фізичну SD-картку (наприклад, 16 GB), знаючи, що реальних даних там лише 5 GB.

Концепція розріджених файлів (Sparse Files)

Пряма зміна розмірів розділів усередині архіву .xz неможлива. Проте за допомогою Sparse Files можна розпакувати образ так, що порожні блоки (нулі) не займатимуть фізичного місця на вашому SSD/HDD. Віртуально файл матиме розмір 32 GB, але реально на диску — лише обсяг фактичних даних (близько 5-6 GB).

Крок 1. Розпакування образу як розрідженого файлу Використовуємо dd з прапорцем conv=sparse:

    xzcat orangepi_zero3_erldev_20260705.img.xz | dd of=temp_sparse.img conv=sparse bs=4M status=progress        

Для перевірки реального місця, яке файл займає на диску, виконайте du -sh temp_sparse.img . Він покаже фактичний розмір (наприклад, 5.5G), тоді як ls -lh temp_sparse.img покаже віртуальний розмір 32G.

Крок 2. Автоматичне зменшення розрідженого файлу через PiShrink

Оскільки файл тепер сумісний з утилітами довільного доступу, ми можемо миттєво зменшити його за допомогою pishrink :

    sudo ./pishrink.sh temp_sparse.img

Після цього віртуальний і реальний розміри файлу зрівняються на мінімально можливій позначці (наприклад, 6 GB), що гарантовано менше за обсяг вашої нової 16 GB SD-картки.

Крок 3. Безпечний запис зменшеного образу на меншу SD-карту ( /dev/sda )

    sudo dd if=temp_sparse.img of=/dev/sda bs=4M status=progress conv=fsync

Крок 4. Розширення файлової системи на всю ємність нової картки

Тепер, коли образ успішно записано на 16 GB картку, розширимо розділ та файлову систему до фактичного максимуму:

    # Розширюємо розділ до 100% об'єму картки
    sudo parted /dev/sda resizepart 2 100%
    sudo partprobe /dev/sda

    # Перевіряємо та розширюємо файлову систему ext4
    sudo e2fsck -f /dev/sda2
    sudo resize2fs /dev/sda2

Цей метод є на 100% безпечним, запобігає пошкодженню файлової системи та не потребує наявності великої
кількості вільного місця на вашому робочому комп'ютері.