SD-изображение не помещается на SD-карту

13

У меня был один пи, настроенный и работающий некоторое время (RPi - 1). Я хотел создать образ RPi - 1, чтобы я мог загрузить точную копию на свой второй пи (RPi - 2). SD-карта в RPi - 1 составляет 4 ГБ (фактически используется только половина), а SD-карта в RPi - 2 также составляет 4 ГБ. Я использую Win32 Disk Imager для успешного создания копии RPi - 1. Затем я отформатировал SD-карту для RPi - 2 с помощью SD Formatter 4.0 (в Windows 7). Однако, когда я использую Win32 Disk Imager для записи образа RPi - 1 на SD-карту RPi - 2, я получаю: «Недостаточно места на диске: Размер 7744512 Доступно: 7626752 сектора Размер сектора: 512»

Я знаю, что это не плохое изображение, потому что я могу отформатировать SD-карту для RPi - 1 и записать изображение обратно без проблем.

Что мне здесь не хватает? Разве не все 4 ГБ SD-карты имеют одинаковый размер или они немного отличаются? Что-то нужно сделать с новой SD-картой, которую я пропустил?

(RPi - 1 SD-карта = Sandisk 4 ГБ // RPi - 2 SD-карта = Kingston 4 ГБ)

Rob_IGS
источник
2
НЕТ двух карт SD одинакового размера, если только они не принадлежат одному и тому же производителю, одной марке и одной и той же партии. Вы не должны использовать образ SD-карты для резервного копирования, а вместо этого копировать файлы .
lenik
Сколько места говорит ваш компьютер на пустой карточке?
Beta Decay

Ответы:

6

Действительно, не все SD-карты имеют одинаковый точный размер. Вам придется уменьшить раздел, чтобы он поместился на меньшем SD. У меня была похожая проблема. То, что я сделал, было отдельной SD с (в моем случае) Raspbian. И я подключил свою SD-карту, которую я хотел изменить, используя устройство чтения карт USB.

Прежде чем вы сможете безопасно сжать свой раздел, вы должны убедиться, что в конце, который вы удаляете, нет данных. Вы можете сделать это с помощью resize2fs -M -p /dev/sda2(вам нужно заменить / dev / sda2 на правильный путь к устройству чтения USB-карт и разделу linux, размер которого вы хотите изменить). Это изменит размер файловой системы до минимально возможного. На самом деле вы можете указать точный размер, который вы хотите, но он включает в себя некоторую математику и преобразование размеров в размеры блоков и секторов, а что нет. Безопаснее и проще этого не делать.

После этого вы можете уменьшить часть. Я думаю, что я использовал fdiskдля этого. Получите точную начальную позицию раздела, удалите его и создайте заново, используя ту же начальную позицию, но с меньшим размером.

Наконец, вам нужно снова увеличить файловую систему, чтобы занять весь раздел, используя resize2fs -p /dev/sda2

Gerben
источник
Я просто хочу немного уточнить этот ответ, так как мне было немного трудно его понять. Сначала я размонтировал разделы на SD-карте. Затем мне пришлось запустить e2fsck -f /dev/mmcblk0p2(я сокращаю второй раздел mmcblk0), чтобы проверить согласованность. Тогда мне разрешили бежать resize2fs -M -p /dev/mmcblk0p2как предложено.
audiFanatic
1

Вам лучше создать архив файловой системы, потому что, когда вы создаете полный образ диска, вы также копируете удаленные данные. Когда вы удаляете файл, индекс не связывается, но фактические данные все еще находятся на диске. Полное использование образа диска ddбудет копировать эти старые данные (кроме случаев, когда вы сначала перезаписываете их /dev/zero, что занимает некоторое время), но использование резервной копии tarбудет копировать только текущие данные.

Или ... вы можете сделать, как это делают многие дистрибутивы: уменьшите размер вашей файловой системы до чего-то безопасного, например, 1,9 ГиБ, перед созданием образа и измените размер, чтобы заполнить диск после восстановления резервной копии.

Предостережение: я не знаком с инструментами обработки изображений Windows, я пользователь Linux.

Амеди Ван Гасс
источник
1

если вы используете Linux, здесь небольшой скрипт:

#!/bin/bash
# Automatic Image file resizer
# Written by SirLagz
strImgFile=$1

export PATH=$PATH:/sbin

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 <Image File>"
exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi

partinfo=`parted -ms $1 unit B p | awk '{if (NR!=2) {print}}'`  
fileSystemType=`echo "$partinfo" | grep -o 'ext4\|ext3'`
numberOfMatchPart=`echo "$fileSystemType" | wc -l`

if [[ $fileSystemType == "" || $numberOfMatchPart -eq 0 || $numberOfMatchPart -gt 1 ]] ; then
echo "Error : Your partition layout is not currently supported by this tool."
exit
fi

partnumber=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2)) } '`
loopback=`losetup -f --show -o $partstart $1`

e2fsck -f $loopback

minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+200000 | bc`

resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback

partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`

parted $1 rm $partnumber
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)) } '`
truncate -s $endresult $1

кредит: Sirlagz (тааак извините!)

Жиль Грангильом
источник
4
Не могли бы вы объяснить, что должен делать этот сценарий? как я могу указать необходимый размер изображения, используя телепатию?
lenik
скрипт уменьшит размер img, возьмет использованный размер, добавит 200000 в конец (для журнала и т. д.), после загрузки с этим img вам нужно увеличить размер до новой SD-карты ...
Gilles Grandguillaume
Привет, я написал этот скрипт, поэтому не стесняйтесь задавать мне любые вопросы в моем блоге: sirlagz.net - Этот скрипт должен быть запущен в Linux. Скрипт уменьшит размер изображения до минимально возможного, плюс немного свободного места. Это позволяет вам поместить изображение 8 ГБ (из которых используется только 1 ГБ) на карту 1 ГБ.
Лоуренс
он должен использовать "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '", чтобы избавиться от B в parttart.
netawater
@netawater У меня другой результат для этой команды с kubuntu / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/… ... я использую этот сценарий без "-1" с успехом ! я не понимаю
Жиль Грангильом