Система будет работать лучше, и карта будет работать дольше с большим количеством свободного места в основном разделе, поэтому не уменьшайте ее слишком сильно - увеличьте ее использование по крайней мере вдвое (например, если ваша система занимает 2-3 ГБ, используйте 8 ГБ, и увеличьте раздел, чтобы заполнить все доступное пространство). Обратите внимание, что если вы не увеличивали раздел с самого начала, он не будет иметь 32 ГБ, поэтому вам, возможно, не придется сокращать его.
Златовласка
Спасибо за указание на это, но мой Raspberry в настоящее время использует всего 1,8 ГБ, потому что это действительно базовая установка. Поэтому я думаю, 4 ГБ должно быть достаточно.
Mwld
Я думаю, я вырос до полного размера, когда впервые установил Debian Wheezy. Теперь я сократил его до 2,5 ГБ, но все равно безуспешно. Смотрите мои комментарии ниже.
Если один из ответов ниже удовлетворяет ваш вопрос, пожалуйста, проверьте ответ.
Уэс
Ответы:
12
В этом ответе я покажу, что нужно делать шаг за шагом, чтобы люди могли понять логику решения и уметь применять шаги в других своих проблемах.
Но, во-первых, следует отметить, что это общая проблема (не специфическая для распи) при переносе файловых систем с SD-карты на меньшую (но достаточно большую для данных) SD-карту.
Требования
Ноутбук с устройством чтения карт Micro SD и Linux (я предпочитаю Ubuntu) работает на нем.
Сокращения
PIBOX : Raspberry Pi which is used
SD_CARD_A : 8GB micro SD card which is used on PIBOX and on which Raspbian-lite (the OS) is installed
SD_CARD_B : 2GB micro SD card which will be used on PIBOX and on which Raspbian-lite (the OS) will be installed
Разделы SD_CARD_A
Пока PIBOX работает, мы перечисляем разделы (ненужные системные разделы здесь не отображаются).
root@pibox:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 7.3G 1.1G 5.9G 16% /
/dev/mmcblk0p1 vfat 63M 21M 43M 33% /boot
На SD_CARD_A есть 2 раздела как /и /boot. Даже 2 ГБ не используется в общей сложности.
Резервная копия SD_CARD_A
После того, как мы завершим работу и остановим PIBOX, мы вытащим SD_CARD_A из платы PIBOX и поместим его в кард-ридер нашего ноутбука.
Разделы SD_CARD_A автоматически монтируются в нашу систему как /dev/sdc1и /dev/sdc2.
Мы подробно отображаем информацию об устройстве обратной связи, чтобы сравнить ее с SD_CARD_A.
root@mylaptop:~# fdisk -l /dev/loop0
Disk /dev/loop0: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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: 0x2019f6d8
Device Boot Start End Blocks Id System
/dev/loop0p1 8192 137215 64512 c W95 FAT32 (LBA)
/dev/loop0p2 137216 15564799 7713792 83 Linux
Выше вы можете видеть, что размер устройства обратной петли (= 7969177600 байт) и разделы совпадают с SD_CARD_A.
Основы математики
Отныне мы будем ориентироваться на раздел /dev/loop0p2. Давайте назовем это THE_PARTITION .
Размер блока составляет 512 байт (как показано в строке, начинающейся с Units = секторы .....)
THE_PARTITION начинается с блока 137216 и заканчивается на блоке 15564799, что означает, что он имеет размер 15427584 blocks(= 15564799 - 137216 + 1).
Итак, размер THE_PARTITION в байтах равен 7898923008 bytes(= 512 * 15427584).
Чтобы соответствовать THE_PARTITION в SD_CARD_B, мы хотим, чтобы он имел новый размер3710940 blocks или другими словами 1900001280 bytes(= 512 * 3710940).
Таким образом, новый номер конечного блока 3848155вычисляется как start block number(= 137216) + size in blocks(= 3710940) - 1.
Файловая система против раздела
Есть 2 операции, которые не следует путать друг с другом.
Изменение размера файловой системы. Мы уменьшим файловую систему в THE_PARTITION, установив ее размер в 3710940 blocks.
Изменение размера раздела. Мы уменьшим THE_PARTITION, установив номер его конечного блока в 3848155.
Сжатие файловой системы
Перед сжатием файловой системы она должна быть помечена как чистая e2fsck.
root@mylaptop:~# resize2fs /dev/loop0p2 3710940s
resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/loop0p2 to 463867 (4k) blocks.
The filesystem on /dev/loop0p2 is now 463867 blocks long.
Усадочная перегородка
Мы узнаем, что такое номер THE_PARTITION parted.
root@mylaptop:~# parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Loopback device (loop)
Disk /dev/loop0: 7969MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 4194kB 70.3MB 66.1MB primary fat16 lba
2 70.3MB 7969MB 7899MB primary ext4
(parted) quit
Мы уменьшаем THE_PARTITION с parted.
root@mylaptop:~# parted /dev/loop0 unit s resizepart 2 3848155
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes
Мы закончили с петлевым устройством. Мы отделяем это.
root@mylaptop:~# losetup -d /dev/loop0
Усечение файла изображения
Мы проверяем новую таблицу разделов.
root@mylaptop:~# fdisk -l pibox.img
Disk pibox.img: 7969 MB, 7969177600 bytes
255 heads, 63 sectors/track, 968 cylinders, total 15564800 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: 0x2019f6d8
Device Boot Start End Blocks Id System
pibox.img1 8192 137215 64512 c W95 FAT32 (LBA)
pibox.img2 137216 3848155 1855470 83 Linux
На выходе ясно видно, что номер конечного блока THE_PARTITION уменьшается from 15564799 to 3848155.
Последний блок, который мы используем 3848155. Нумерация блоков начинается с 0. Итак, у нас всего 3848155 + 1 блок, и новый размер файла pibox.img должен быть 1970255872 bytes (= (3848155 + 1) * 512).
Хороший. Я думаю, что некоторые из ваших вещей с настройкой обратной петли могут быть излишними и ненужными, вы можете проверить это. Что-то очень похожее на очень похожий вопрос: raspberrypi.stackexchange.com/a/29952/5538
Златовласка
@goldilocks, не проверено, но я думаю, что использование loopback необходимо. Насколько я знаю, parted не может работать с файлом образа напрямую, ему нужен интерфейс устройства для своих операций.
ваха
Да, но я думаю, что вы найдете, что вам не нужно беспокоиться losetupили даже -o loop=whatever. Что касается другого поста, который я просто использую, mount -o offset=123 /imagefilepath /mntpointи использование loopback неявно. Я полагаю, что это в целом верно для Linux - попробуйте и посмотрите. Затем вы могли бы сократить это до того, чтобы просто сказать, что разделы монтируются через виртуальное «устройство обратной связи».
Златовласка
5
Когда вы используете dd if=/dev/sdx of=/path/to/image bs=1M, /dev/sdxотносится ко всему «диску», поэтому изображение всегда будет размером всей карты.
Вместо этого вам нужно использовать dd if=/dev/sdxn ...где nномер раздела.
Вам, вероятно, придется сделать это дважды - один раз для /bootраздела и один раз для /раздела.
Затем вам нужно будет создать разделы на новой карте, которые будут по крайней мере такими же большими, как эти два оригинальных, чтобы вернуть содержимое обратно.
Используйте что-то вроде parted (редактор разделов), чтобы уменьшить основной раздел до меньшего размера, а затем используйте инструмент, такой как Clonezilla, чтобы скопировать с теперь меньшего раздела на вашу новую карту. Вам, вероятно, придется сделать это на другом компьютере.
К сожалению, это не сработало. Я сократил раздел до 2,5 ГБ с помощью GParted. Но когда я попытался создать образ с него на USB-накопитель, он стал намного больше (4,3 ГБ - но я думаю, что он хотел скопировать все 32 ГБ и просто остановился на 4,3 ГБ из-за ограничения размера файла FAT).
Mwld
2
Я использовал команду dd if=/dev/sdx of=/path/to/image bs=1Mиз этой
темы
Есть ли у вас какие-либо идеи о том, как я могу просто скопировать основной раздел с 2,5 ГБ в образ и все же создать SD-карту с загрузочным Raspbian из него?
Mwld
Извините за поздний ответ. Я начал с SD-карты емкостью 4 ГБ, создал изображение, а затем записал это изображение на карты емкостью 8 ГБ и более. Мне еще не нужно было использовать больший раздел для всего, над чем я работал. Я не знаю инструмента, который позволил бы вам создать образ отдельного раздела на SD-карте.
Я столкнулся с этой страницей, поскольку я пытаюсь достичь той же цели, чтобы создать резервную копию моего распбианого образа, однако я не хочу, чтобы на карте были только ТОЛЬКО соответствующие данные. Согласно предложению выше, я искал скрипт здесь sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer, но не смог найти его. может ли кто-нибудь обновить эту ссылку, если она где-то доступна?
Шалливерма
Я все еще могу получить доступ к ссылке, а само сообщение представляет собой скрипт. Скопируйте скрипт в файл и назовите его. script.shСделайте файл исполняемым и используйте chmodего.
Михир
1
Я уже давно rsyncкопирую файловые системы с одного диска на другой, без сбоев. Преимущество использования rsync заключается в том, что он копирует содержимое файловой системы, а не копирует устройство на уровне блоков; в результате, на самом деле все равно, какой размер имеют целевой и исходный диски, если на целевом диске достаточно места для хранения данных.
Вот как я бы это сделал:
Создайте новую raspbian инсталляцию на желаемой новой карте SD меньшего размера.
Загрузитесь в новую установку и разверните файловую систему, чтобы заполнить весь диск. Отключи пи.
Теперь смонтируйте новую и старую карты и используйте rsync -avx oldFilesystem newFilesystemдля копирования / перезаписи файловой системы на новой карте с файловой системой от старой карты.
Наконец, загрузитесь в вашу новую систему и запустите, rpi-updateчтобы убедиться, что ваша прошивка соответствует и обновлена.
После этого на вашей новой карте должна быть установлена полностью функциональная система Raspbian.
Таким образом, для этого метода (шаг 3) мне нужно 2 устройства чтения карт SD?
Виктор Ван Хи
Либо два устройства чтения карт SD, либо промежуточное устройство. Вы можете rsync старой файловой системы в папку на жестком диске, а затем rsync эту папку на вторую SD-карту, если вы не хотите, чтобы забрать устройство для чтения.
sdenton4
1
Я создал сценарий оболочки для резервного копирования и восстановления всех данных на SD-карте. Сначала он удаляет некоторые данные (соответствующие моему проекту) и сжимает раздел до минимального размера, чтобы изображение было таким же большим, как данные на SD-карте. В дополнение, скрипт создает * .zip файл изображения. После восстановления созданного изображения на другую SD-карту раздел будет увеличен до максимального размера. Скрипт использует команды, упомянутые в других ответах. Поскольку это мой скрипт оболочки первого размера с таким размером, мне понадобилось несколько часов, чтобы создать его, и это не идеальный самолет. Особенно я не знаю, как обрабатывать возвращаемые значения resize2fs и fdisk, поэтому пользователь должен ввести нужные мне значения. Есть какие-нибудь идеи, чтобы это исправить? Я надеюсь, что этот скрипт поможет кому-то еще. Не стесняйтесь редактировать и улучшать его.
"Usage:
<skriptname> -b <path> create backup of SC Card (dev/mmcblk0) to file <path>/JJJJ-MM-DD_HHMM.img
<skriptname> -r <path>/FILENAME.img restore an exitsting image (<path>/FILENAME.img) to the SD Card (dev/mmcblk0)
<skriptname> -r <path>/FILENAME.zip unzip and restore an exitsting image (<path>/FILENAME.zip) to the SD Card (dev/mmcblk0)
<skriptname> -h show this hlep
вот:
#!/bin/bash
# check if the user is root
if (( $EUID != 0 )); then
echo "This script requires root privileges please run as root"
exit
fi
while getopts ":b:r:h" opt; do
case $opt in
b)
mode="backup"
OUTPATH=$OPTARG
;;
r)
mode="restore"
DIRFILENAME=$OPTARG
;;
h)
mode="help"
;;
\?)
echo "Invalid option: -$OPTARG. Use -h for help" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument. Use -h for help" >&2
exit 1
;;
esac
done
# no option
if [ $OPTIND == 1 ]
then
echo "$(basename "$0") needs an option! Use -h for help"
exit 1
fi
myMount(){
# create mountpoint if not existing
if [ ! -d /tmp/sd2/ ] ; then
mkdir /tmp/sd2
fi
# mount partition
mount -v -t ext4 /dev/mmcblk0p2 /tmp/sd2
err=$?
if [ $err != 0 ]; then
echo "mount failed error: $err"
exit 1
fi
}
myUmount(){
cd /home/ # otherwise umount will fail
# fuser -vm /tmp/sd2/
# umount partition
umount -v /tmp/sd2
err=$?
if [ $err != 0 ]; then
echo "umount failed error: $err"
exit 1
fi
}
myEnlarge(){
echo "enlarge partition..."
# enlarge partition is not posible with fdisk -> delete and recreate it
(
echo d # delete partition
echo 2 # patition number
echo n # add a new partition
echo p # primary partition
echo 2 # partition number
echo # first sector (accept default: varies)
echo # last sector (accept default: varies)
echo w # write changes
) | fdisk /dev/mmcblk0
echo "\n check filesystem... "
e2fsck -f -v -C 0 /dev/mmcblk0p2
# enlarge filesystem to maxsize
resize2fs -p /dev/mmcblk0p2
}
case "$mode" in
"help")
echo "Usage:
$(basename "$0") -b <path> create backup of SC Card (dev/mmcblk0) to file <path>/JJJJ-MM-DD_HHMM.img
$(basename "$0") -r <path>/FILENAME.img restore an exitsting image (<path>/FILENAME.img) to the SD Card (dev/mmcblk0)
$(basename "$0") -r <path>/FILENAME.zip unzip and restore an exitsting image (<path>/FILENAME.zip) to the SD Card (dev/mmcblk0)
$(basename "$0") -h show this hlep
--------------------------------
Adrian Zeitler, Germany 2017"
;;
"backup") ####################################### backup #######################################
echo "an image of the SD Card (/dev/mmcblk0) whitch is as smal as possible will be created to $OUTPATH."
# ------------------ delete some data --------------------
echo "Do you want to delete tempfiles? [y/n]"
read delfiles
if [ "$delfiles" = "y" ]
then
echo "Delete tempfiles..."
myMount
# remove some data
cd /tmp/sd2/home/alarm/
rm -v -f hagelbeere.db
rm -v -f HAILcam.log
rm -v -f HAILcam.log.1
rm -v -f test.jpg
myUmount
elif [ "$delfiles" = "n" ]
then
echo "I don't delete anything."
else
echo "Sorry, I didn't understand."
exit 1
fi
# --------------------------------------------------------------
# shrink partition 2 to minimum size
echo "check file system... "
e2fsck -f -v -C 0 /dev/mmcblk0p2
err=$?
if [ $err != 0 ]; then
echo "file system check failed, error: $err"
exit 1
fi
echo "shrink filesystem of partition 2 to minimum size..."
resize2fs -p -M /dev/mmcblk0p2
err=$?
if [ $err != 0 ]; then
echo "resize2fs failed, error: $err"
exit 1
fi
# --> Das Dateisystem auf /dev/mmcblk0p2 ist nun 692365 Blöcke groß.
echo "Please tell me the new filesystem size displayed above:"
read size
# from resize2fs blocksize, fdisk wants sector: sector = block * 8
size=$(( $size*8 ))
# shrink partition is not posible with fdisk -> delete and recreate it
(
echo d # delete partition
echo 2 # patition number
echo n # add a new partition
echo p # primary partition
echo 2 # partition number
echo # first sector (accept default: varies)
echo +$size # last sector
echo w # write changes
) | fdisk /dev/mmcblk0
err=$?
if [ $err != 0 ]; then
echo "fdisk failed, error: $err"
exit 1
fi
# --------------------------------------------------------------
# fill unused space with zeros
echo "Do you want to fill unused space with zeros? [y/n]"
read fillzeros
if [ "$fillzeros" = "y" ]
then
echo "Copy zeros. This will end up with an error. But this is ok."
myMount
dd if=/dev/zero | pv | dd of=/tmp/sd2/nullen.datei conv=noerror,notrunc,sync bs=10240
# exits with error -> this is normal
# dlelete zeros
rm -v -f /tmp/sd2/nullen.datei
sync
myUmount
elif [ "$fillzeros" = "n" ]
then
echo "I don't delete anything."
else
echo "Sorry, I didn't understand."
exit 1
fi
# --------------------------------------------------------------
# find out end of partition
fdisk -l /dev/mmcblk0
echo "Please tell me the end of mmcblk0p2 displayed above."
read count
DATE=$(date +"%Y-%m-%d_%H%M")
IMGFILENAME=$DATE.img
echo "Do you want to create image with filename $OUTPATH$IMGFILENAME? [y/n]"
read answer
if [ "$answer" = "y" ]
then
echo "Do you want to create a *.zip file of the created image? [y/n]"
read zip
echo "Do you want to enlarge partition 2 to maxsize after image creation? [y/n]"
read enlarge
echo "create image..."
cd $OUTPATH
# create image with dd, stop at and of partition
# count=N copy only N input blocks
# bs=BYTES read and write up to BYTES bytes at a time = block size
# pv show status
dd if=/dev/mmcblk0 | pv -s $(( $count*512 )) | dd of=$IMGFILENAME bs=512 count=$count
err=$?
if [ $err != 0 ]; then
echo "dd failed error: $err"
exit 1
fi
# --------------------------------------------------------------
# create zip file
# or like this:
# sudo dd if=/dev/sdX | pv |gzip > /pfad/zur/datei.img.gz
if [ "$zip" = "y" ]
then
echo "create zip file..."
zip $DATE.zip $IMGFILENAME
fi
# --------------------------------------------------------------
fi
# --------------------------------------------------------------
# enlarge partition 2
if [ "$enlarge" = "y" ]
then
myEnlarge
fi
;; #end case mode backup
"restore") ####################################### restore #######################################
#chek if image exists
if [[ -s "$DIRFILENAME" ]]
then
# check if file is an image or zip file
if [[ $DIRFILENAME =~ \.img$ ]]
then
IMGFILENAME=$(basename "$DIRFILENAME")
elif [[ $DIRFILENAME =~ \.zip$ ]]
then
ZIPFILENAME=$(basename "$DIRFILENAME")
else
echo "Not the right file format. I accept *.img and *.zip"
exit 1
fi
else
echo "Image file does not exist."
exit 1
fi
echo "the file $DIRFILENAME will be restored to the SD Card /dev/mmcblk0"
#change to the path of the imagefile
SOURCEPATH=$(dirname "$DIRFILENAME")
cd $SOURCEPATH
if [ "$ZIPFILENAME" != "" ]
then
echo "unzip file"
# change file extention form zip zu img
l=$(( ${#ZIPFILENAME}-3 ))
IMGFILENAME="${ZIPFILENAME:0:l}img"
unzip $ZIPFILENAME
fi
echo "Do you realy want to restore $SOURCEPATH/$IMGFILENAME to the SD card /dev/mmcblk0?
Warning: all data on the device /dev/mmcblk0 will be lost! [y/n]"
read answer
if [ "$answer" = "y" ]
then
echo "Do you want to enlarge partition 2 to maxsize after restoring? [y/n]"
read enlarge
echo "restore image..."
filesize=$(wc -c <"$IMGFILENAME")
echo "Filesize = $filesize Byte"
dd if=$IMGFILENAME | pv -s $filesize | dd of=/dev/mmcblk0 bs=512
err=$?
if [ $err != 0 ]; then
echo "dd failed error: $err"
exit 1
fi
fi
# --------------------------------------------------------------
# enlarge partition 2
if [ "$enlarge" = "y" ]
then
myEnlarge
fi
;; #end case mode restore
esac
Самым простым решением, которое я нашел, было сделать резервную копию исходной карты большего размера, используя команды dd, описанные выше, а затем восстановить образ на карту меньшего размера, используя что-то вроде piwriter. ДД может работать так же ... не уверен. PiWriter вернул ошибку, так как ему не хватило места, но поскольку изображение не содержало реальных данных, превышающих размер карты меньшего размера, оно просто обрезало пустые сектора. Я не уверен, что это может означать ... раздел может нуждаться в проверке или ремонте, но я могу убедиться, что он работает, когда я помещаю его в Pi.
это очень опасный совет, вы никогда не узнаете, были ли какие-либо данные сверх размера. Мы ищем более надежные и проверенные для работы решения.
леник
Я живу опасно, что я могу сказать;) На полном серьезе, хотя у меня нет большого опыта работы с картами dd или разделов, поэтому я нахожусь на неизведанной территории. Мне, вероятно, повезло, так как у меня было только около 800 МБ данных, идущих с карты 16 ГБ на карту 8 ГБ. Однако, из любопытства, есть ли какой-нибудь способ, возможно, сначала выполнить дефрагментацию данных, чтобы убедиться, что все они сгруппированы в начале раздела? Кажется, хак, но может быть?
Пес
я не знаю насчет дефрагментации, но вы определенно можете изменить размеры своих разделов и переместить их в начало SD-карты, чтобы они занимали только начало. занимает немного больше времени, чем простой дд, но результаты гораздо надежнее.
lenik
0
Я использую старую версию win32diskimager-RELEASE-0.1-r15-win32для чтения изображения, оно создает изображение 4 ГБ даже с SD-карты 8 ГБ, а затем записывает изображение с последней версией win32diskimager.
Я использую старую версию, потому что старая пропустит каждую ошибку.
Нет ли опции в новой версии 0.95, которая позволяет вам делать то же самое, то есть пропускать каждую ошибку? К сожалению, страница sourceforge не отображает список доступных опций. Это просто кажется слегка рискованным с использованием пре-бета-версии программного обеспечения
Greenonline
Я не получаю никаких раздумий от использования программы, которая пропустит каждую ошибку.
Ответы:
В этом ответе я покажу, что нужно делать шаг за шагом, чтобы люди могли понять логику решения и уметь применять шаги в других своих проблемах.
Но, во-первых, следует отметить, что это общая проблема (не специфическая для распи) при переносе файловых систем с SD-карты на меньшую (но достаточно большую для данных) SD-карту.
Требования
Ноутбук с устройством чтения карт Micro SD и Linux (я предпочитаю Ubuntu) работает на нем.
Сокращения
Разделы SD_CARD_A
Пока PIBOX работает, мы перечисляем разделы (ненужные системные разделы здесь не отображаются).
На SD_CARD_A есть 2 раздела как
/
и/boot
. Даже 2 ГБ не используется в общей сложности.Резервная копия SD_CARD_A
После того, как мы завершим работу и остановим PIBOX, мы вытащим SD_CARD_A из платы PIBOX и поместим его в кард-ридер нашего ноутбука.
Разделы SD_CARD_A автоматически монтируются в нашу систему как
/dev/sdc1
и/dev/sdc2
.Мы размонтируем эти разделы из нашей системы, чтобы успешно на них работать.
Мы отображаем информацию об устройстве SD_CARD_A в деталях для подтверждения в следующих шагах.
Выше вы можете видеть, что SD_CARD_A имеет емкость 8 ГБ.
Мы клонируем SD_CARD_A в файл pibox.img.
Проверьте размер скопированных байтов, он равен значению, которое мы получили
fdisk -l /dev/sdc
командой.Linux loopback module
В Linux есть модуль loopback, который позволяет нам обрабатывать файл как блочное устройство.
Загружаем петлевой модуль.
Мы находим неиспользуемый путь петлевого устройства.
Теперь мы создаем петлевое устройство для файла pibox.img.
Мы запускаем ядро об изменениях раздела.
Мы подтверждаем, если предыдущие операции были успешными.
Мы подробно отображаем информацию об устройстве обратной связи, чтобы сравнить ее с SD_CARD_A.
Выше вы можете видеть, что размер устройства обратной петли (= 7969177600 байт) и разделы совпадают с SD_CARD_A.
Основы математики
Отныне мы будем ориентироваться на раздел
/dev/loop0p2
. Давайте назовем это THE_PARTITION .Размер блока составляет 512 байт (как показано в строке, начинающейся с Units = секторы .....)
THE_PARTITION начинается с блока 137216 и заканчивается на блоке 15564799, что означает, что он имеет размер
15427584 blocks
(= 15564799 - 137216 + 1).Итак, размер THE_PARTITION в байтах равен
7898923008 bytes
(= 512 * 15427584).Чтобы соответствовать THE_PARTITION в SD_CARD_B, мы хотим, чтобы он имел новый размер
3710940 blocks
или другими словами1900001280 bytes
(= 512 * 3710940).Таким образом, новый номер конечного блока
3848155
вычисляется какstart block number
(= 137216) +size in blocks
(= 3710940) -1
.Файловая система против раздела
Есть 2 операции, которые не следует путать друг с другом.
3710940 blocks
.3848155
.Сжатие файловой системы
Перед сжатием файловой системы она должна быть помечена как чистая
e2fsck
.Мы сжимаем файловую систему с
resize2fs
.Усадочная перегородка
Мы узнаем, что такое номер THE_PARTITION
parted
.Мы уменьшаем THE_PARTITION с
parted
.Мы закончили с петлевым устройством. Мы отделяем это.
Усечение файла изображения
Мы проверяем новую таблицу разделов.
На выходе ясно видно, что номер конечного блока THE_PARTITION уменьшается
from 15564799 to 3848155
.Последний блок, который мы используем
3848155
. Нумерация блоков начинается с 0. Итак, у нас всего 3848155 + 1 блок, и новый размер файла pibox.img должен быть1970255872 bytes
(= (3848155 + 1) * 512).Усекаем файл pibox.img.
Мы проверяем новый размер файла pibox.img.
Создание SD_CARD_B
Мы поместили SD_CARD_B в картридер нашего ноутбука. Разделы SD_CARD_B автоматически монтируются в нашу систему как
/dev/sdc1
и/dev/sdc2
.Выше вы можете видеть, что SD_CARD_B имеет емкость 2 ГБ.
Мы размонтируем эти разделы из нашей системы для успешной работы на SD_CARD_B.
Мы клонируем файл pibox.img в SD_CARD_B.
Проверьте размер скопированных байтов, он равен значению, которое мы получили
ls -l pibox.img
командой.Загрузка PIBOX
После того, как мы извлечем SD_CARD_B из нашего ноутбука и вставим его в плату PIBOX, мы загрузим систему и войдем в консоль PIBOX.
Мы перечисляем разделы (некоторые другие ненужные системные разделы здесь не отображаются).
источник
losetup
или даже-o loop=whatever
. Что касается другого поста, который я просто использую,mount -o offset=123 /imagefilepath /mntpoint
и использование loopback неявно. Я полагаю, что это в целом верно для Linux - попробуйте и посмотрите. Затем вы могли бы сократить это до того, чтобы просто сказать, что разделы монтируются через виртуальное «устройство обратной связи».Когда вы используете
dd if=/dev/sdx of=/path/to/image bs=1M
,/dev/sdx
относится ко всему «диску», поэтому изображение всегда будет размером всей карты.Вместо этого вам нужно использовать
dd if=/dev/sdxn ...
гдеn
номер раздела.Вам, вероятно, придется сделать это дважды - один раз для
/boot
раздела и один раз для/
раздела.Затем вам нужно будет создать разделы на новой карте, которые будут по крайней мере такими же большими, как эти два оригинальных, чтобы вернуть содержимое обратно.
источник
Используйте что-то вроде parted (редактор разделов), чтобы уменьшить основной раздел до меньшего размера, а затем используйте инструмент, такой как Clonezilla, чтобы скопировать с теперь меньшего раздела на вашу новую карту. Вам, вероятно, придется сделать это на другом компьютере.
источник
dd if=/dev/sdx of=/path/to/image bs=1M
из этойСоздайте образ карты, используя один из уже упомянутых способов - Как сделать резервную копию моего Raspberry Pi?
Используйте скрипт на http://sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/, чтобы уменьшить изображение
Восстановите уменьшенное изображение на новой карте меньшего размера
источник
script.sh
Сделайте файл исполняемым и используйтеchmod
его.Я уже давно
rsync
копирую файловые системы с одного диска на другой, без сбоев. Преимущество использования rsync заключается в том, что он копирует содержимое файловой системы, а не копирует устройство на уровне блоков; в результате, на самом деле все равно, какой размер имеют целевой и исходный диски, если на целевом диске достаточно места для хранения данных.Вот как я бы это сделал:
rsync -avx oldFilesystem newFilesystem
для копирования / перезаписи файловой системы на новой карте с файловой системой от старой карты.rpi-update
чтобы убедиться, что ваша прошивка соответствует и обновлена.После этого на вашей новой карте должна быть установлена полностью функциональная система Raspbian.
источник
Я создал сценарий оболочки для резервного копирования и восстановления всех данных на SD-карте. Сначала он удаляет некоторые данные (соответствующие моему проекту) и сжимает раздел до минимального размера, чтобы изображение было таким же большим, как данные на SD-карте. В дополнение, скрипт создает * .zip файл изображения. После восстановления созданного изображения на другую SD-карту раздел будет увеличен до максимального размера. Скрипт использует команды, упомянутые в других ответах. Поскольку это мой скрипт оболочки первого размера с таким размером, мне понадобилось несколько часов, чтобы создать его, и это не идеальный самолет. Особенно я не знаю, как обрабатывать возвращаемые значения resize2fs и fdisk, поэтому пользователь должен ввести нужные мне значения. Есть какие-нибудь идеи, чтобы это исправить? Я надеюсь, что этот скрипт поможет кому-то еще. Не стесняйтесь редактировать и улучшать его.
вот:
источник
Самым простым решением, которое я нашел, было сделать резервную копию исходной карты большего размера, используя команды dd, описанные выше, а затем восстановить образ на карту меньшего размера, используя что-то вроде piwriter. ДД может работать так же ... не уверен. PiWriter вернул ошибку, так как ему не хватило места, но поскольку изображение не содержало реальных данных, превышающих размер карты меньшего размера, оно просто обрезало пустые сектора. Я не уверен, что это может означать ... раздел может нуждаться в проверке или ремонте, но я могу убедиться, что он работает, когда я помещаю его в Pi.
источник
Я использую старую версию
win32diskimager-RELEASE-0.1-r15-win32
для чтения изображения, оно создает изображение 4 ГБ даже с SD-карты 8 ГБ, а затем записывает изображение с последней версией win32diskimager.Я использую старую версию, потому что старая пропустит каждую ошибку.
источник