Сжатие Raspberry Pi SD .img через сервер Ubuntu (cli)

Если мы удалим требование использовать команду seq и предположим, что доступна команда ipcalc, а Ubuntu prips нет, то prips можно реализовать как функцию оболочки Bash:

prips() {
  cidr=$1

  # range is bounded by network (-n) & broadcast (-b) addresses.
  lo=$(ipcalc -n $cidr |cut -f2 -d=)
  hi=$(ipcalc -b $cidr |cut -f2 -d=)

  read a b c d <<< $(echo $lo |tr . ' ')
  read e f g h <<< $(echo $hi |tr . ' ')

  eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}"
}

Обратите внимание, что это будет включать сетевой адрес и широковещательный адрес в диапазоне; если это проблема, удалите первый и последний адрес из результата.

1
20.05.2017, 07:27
2 ответа

Я могу подтвердить, что вы на правильном пути, сокращая файловую систему; Далее следует fdisk / parted. Сложность заключается в том, чтобы сопоставить размер новой файловой системы с размером новой файловой системы, провести математические расчеты или на всякий случай просочиться на сотню килобайт больше. При необходимости вы можете настроить его позже на новой карте.

Обычно порядок следующий: umount, resize, fdisk / parted, partprobe, fsck, и mount, чтобы проверить, все ли в порядке. Поскольку размер изменяемого раздела меньше 2T, вы можете использовать либо fdisk , либо parted .

Процесс изменения размера должен быть первым, так как вы не сможете надежно сжать раздел, пока файловая система все еще требует пространство, которое вам нужно освободить. После того, как вам нужно снова сжать раздел для единообразия, и чтобы не было оставшегося места, вы хотите избавиться от «зарезервированного» для использования. Файловая система должна быть последней, чтобы структура файловой системы соответствовала новому размеру.

Я оставлю эти статьи о RH. Отсутствует partprobe , поскольку новый размер раздела не всегда распознается сразу или старыми ядрами.

Как сжать файловую систему ext2 / 3/4 с помощью resize2fs

Как изменить размер раздела с помощью fdisk

Вам не хватает следующих шагов:

sudo fdisk /dev/loop
p     - to check for partition number (probably 2)
d     - to delete
2     - partition 2
n     - new partition
p     - primary
ENTER - default beginning
+new size -  smaller card size
w      - write it

sudo partprobe /dev/loop

Чтобы завершить это, вы размонтируете файл образа; поскольку дополнительный размер больше не помечается как используемый файловой системой и размером раздела в образе файла, операционная система не будет пытаться использовать это пространство. Так что его можно безопасно обрезать до намеченного размера:

truncate -s 8GB fileName

Чтобы использовать соответствующие размеры, поскольку я ленив, я бы сократил файловую систему до чего-то меньшего, чем мне нужно (например, размер нового раздела - 400 КБ, а затем расширил его снова после того, как я уменьшу раздел) и создаст раздел с необходимым размером (8 ГБ-2048 (2 КБ) для возможного заполнения 1-го раздела - минус размер 1-го раздела). Не много математики.

Для правильного расчета, пожалуйста, посмотрите:

Как изменить размер разделов ext3 без потери данных

0
28.01.2020, 01:20

Как насчет использования Automatic RPi Image Downsizer?

Вы также можете взглянуть на код, чтобы понять, что происходит.

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 } '`
minsize=`echo $minsize+1000 | 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
0
28.01.2020, 01:20

Теги

Похожие вопросы