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

79 lines
5.2 KiB
Markdown
Raw Normal View History

2022-05-07 22:12:11 +03:00
### Уменьшение размера образа .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
```