notes/Уменьшение размера образа i...

79 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### Уменьшение размера образа .img
При создании образа SD-карты с помощью стандартной утилиты Диски в Linux Mint, образ получается размером равным размеру SD-карты вне зависимости от занятого места на ней. Таким образом, восстановить этот образ на диск меньшего размера не получится. Необходимо привести размер образа максимально к приближенному значению занятого в нем места.
*это перевод англоязычной инструкции. Работоспособность метода проверена на себе.*
*Используемая ОС - Debian based*
1. Создать loopback device (как это корректно перевести не понял - устройство петли?)
Включим создание петли
```bash
sudo modprobe loop
```
Создадим новый (пустой) `loopback device`
```bash
sudo losetup -f
```
команда вернет путь к устройству
```bash
/dev/loop0
```
Подключаем наш образ к созданному устройству
```bash
sudo losetup /dev/loop0 myimage.img
```
Чтобы получить доступ к разделам, которые есть в образе, нужно сказать ядру ​​загрузить и их
```bash
sudo partprobe /dev/loop0
```
2. Уменьшение размера раздела в образе
После создания `loopback device` в стандартном приложении Диски (Linux Mint) появится новый диск.
Чтобы изменить размер раздела в образе нужно: выбрать нужный раздел -> нажать шестеренку ниже -> в выпадающем меню выбрать пункт *Изменить размер*
Эту же процедуру можно выполнить с помощью **Gparted**, но при запуске приложения `loopback device` будет отсутствовать в списке доступных дисков. Gparted нужно запускать явно указав на устройство
```bash
sudo gparted /dev/loop0
```
После изменения размера образа loopback-устройство нам больше не нужно, отключим его
```bash
sudo losetup -d /dev/loop0
```
3. Уменьшение размера образа
*уменьшение раздела никак не повлияло на размер самого образа, в нем появилось свободное место*
Теперь нужно удалить ненужное свободное место в образе.
*узнаем где оно начинается*
```bash
fdisk -l myimage.img
```
*увидим нечто подобное*
```bash
Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 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
Disk identifier: 0x000ea37d
Device Boot Start End Blocks Id System
myimage.img1 2048 9181183 4589568 b W95 FAT32
```
_Обратите внимание на две вещи в выводе:
Раздел заканчивается на блоке 9181183 (End).
Размер блока составляет 512 байт (Units = sectors of 1 * 512 = 512 bytes)._
Теперь уменьшаем файл образа до размера, содержащего данные. С помощью команды *truncate* необходимо указать размер файла в байтах. Последний блок был *9181183*, а номера блоков начинались с *0*. Это означает, что нам нужно **(9181183 + 1) * 512** байт. **Это важно, иначе раздел не поместится в образ.**
```bash
truncate --size=$[(9181183+1)*512] myimage.img
```
Если *truncate* по какой-то причине не доступна, можно с помощью *dd* создать новый образ на основе нашего, скопировав в него только необходимые нам сектора (мы их вычислили)
`(9181183+1)*512 (размер сектора) = 4700766208 байт`
`4700766208 / 1024 / 1024 = 4483 Мб` (обязательно округляем в большую сторону)
*образ можно сразу сжать при создании*
```bash
sudo dd if=myimage.img bs=1M count=2578 conv=noerror,sync | gzip -c > /$HOME/Backup/image.img.gz
```
4. Восстановление образа
если образ создавали без сжатия
```bash
sudo dd if=$HOME/Backup/image.img of=/dev/sdb bs=1M conv=noerror,sync status=progress
```
если создавали со сжатием
```bash
gunzip -c $HOME/Backup/image.img.gz | sudo dd of=/dev/sdb conv=noerror,sync status=progress
```