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
|
|||
|
```
|