Уменьшение размера образа для Raspberry Pi
Часто так случается, что при копировании образа одной SD-карты на другую появляется ошибка о нехватке места. Вроде бы образ снят с карты размером 8 Гб, и копируем на карту точно такого же размера, а места всё равно не хватает. В чём дело? Эта инструкция применима к любой плате Raspberry Pi.
Причина такой неприятности кроется в том, что размер, указанный на любом электронном носителе, является лишь ориентировочным. Практически всегда носители разных производителей и даже разных моделей одной марки имеют отличающийся размер. Эти отличия могут не превышать нескольких мегабайт, или даже сотен килобайт, но для копирования образа это становится критичным.
Чтобы решить проблему, нам нужно как-то укоротить исходный образ. Как правило, карта редко бывает забита под завязку, так что откусить лишние гигабайты образа будет вполне безобидным шагом. Этим мы и займёмся.
Шаг 1. Создание свежего образа SD-карты
Первое, что нам потребуется сделать, — это создать свежий образ SD-карты. Размер образа будет идентичен размеру карты, с которой он снят. Чтобы этот образ куда-то сохранить, нам потребуется носитель большего размера. Например, если образ будет иметь размер 8 Гб, для создания можно использовать обычную USB-флешку на 16 Гб или 32 Гб.
Шаг 2. Определение имени флешки
Втыкаем флешку в USB-порт и выясняем имя, выданное ей операционной системой. Делаем это с помощью утилиты fdisk:
sudo fdisk -l
Судя по увиденному, флешка получила имя /dev/sda1 и на ней файловая система NTFS. Также мы видим, что основная SD-карта разбита на два раздела: mmcblk0p1 и mmcblk0p2. Сделаем вывод, что сама карта называется /dev/mmcblk0, это нам пригодится.
Шаг 3. Монтирование флешки
Теперь монтируем флешку с помощью команды mount, предварительно создав для неё папку:
sudo mkdir /mnt/usbf
sudo mount /dev/sda1 /mnt/usbf
После выполнения этой команды в папке /mnt/usbf появится содержимое нашей флешки.
Шаг 4. Создание образа
Создаём образ SD-карты на флешке:
sudo dd bs=4M if=/dev/mmcblk0 of=/mnt/usbf/my_raspbian.img
В этой команде bs — размер блока. Чем он меньше, тем дольше будет длиться процесс создания. Обычно ставят 4M, а если что-то пойдёт не так — можно попробовать bs=1M.
Примечание
Для образа размером 16 Гб время процедуры может составить около часа.
Шаг 5. Удаление пустого пространства
После того как образ будет создан, приступим к удалению из него пустого пространства. Для этой операции используем bash-скрипт от sirlagz, немного модифицированный для урезания из образа только 90% пустого пространства.
#!/bin/bash
# Automatic Image file resizer
# Written by SirLagz
strImgFile=$1
if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi
if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh "
exit
fi
if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi
partinfo=`parted -m $1 unit B print`
partnumber=`echo "$partinfo" | grep ext4 | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep ext4 | awk -F: ' { print substr($2,0,length($2)-1) } '`
loopback=`losetup -f --show -o $partstart $1`
e2fsck -f $loopback
minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
# Modified minsize calc by Kevin Rattai
#
# original minsize produces 0bytes on partition, calculated as:
# minsize=`echo "$minsize+1000" | bc`
#
# New minsize calc produces 10% minsize as available space
minsize=`echo "($minsize+($minsize*0.1))/1" | bc`
resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback
partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`
part1=`parted $1 rm 2`
part2=`parted $1 unit B mkpart primary $partstart $newpartend`
endresult=`parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)-1) } '`
truncate -s $endresult $1
Создаём в домашней папке пустой файл и делаем его исполняемым:
cd /home/pi
touch cut_img.sh
chmod 755 cut_img.sh
Затем открываем в любом редакторе и копируем в него содержимое скрипта. Например, в редакторе nano:
nano cut_img.sh
Шаг 6. Установка пакета bc
Чтобы скрипт заработал, нам понадобится доустановить пакет bc:
sudo apt-get install bc
Говорим yes на все вопросы, которые задаст установщик.
Шаг 7. Запуск скрипта
Ну всё, теперь мы готовы к процедуре. Запускаем скрипт, указав в качестве параметра ранее созданный образ:
sudo ./cut_img.sh /mnt/usbf/my_raspbian.img
Ждём окончания его работы.
Совет
Вот и всё. После выполнения скрипта размер образа my_raspbian.img станет намного меньше исходного, и теперь его можно будет записать на любую карту подходящего размера.