79 lines
5.2 KiB
Markdown
79 lines
5.2 KiB
Markdown
### Уменьшение размера образа .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
|
||
``` |