SD映像不适用于SD卡


13

我已经设置了一个pi,并且运行了一段时间(RPi-1)。我想创建一个RPi-1的映像,以便可以将一个精确的副本加载到第二个pi(RPi-2)上。RPi-1中的SD卡为4GB(实际只使用了大约一半),RPi-2中的SD卡也为4GB。我使用Win32 Disk Imager成功创建了RPi-1的副本。然后,我使用SD Formatter 4.0(在Windows 7上)为RPi-2格式化了SD卡。但是,当我使用Win32 Disk Imager将RPi-1映像写入RPi-2的SD卡时,我得到:“磁盘上没有足够的空间:大小7744512可用:7626752扇区扇区大小:512”

我知道它的图像还不错,因为我可以格式化RPi-1的SD卡并将图像写回到它没有问题。

我在这里想念什么?并非所有4GB SD卡都相同大小还是略有不同?对于我错过的全新SD卡,您需要做些什么吗?

(RPi-1 SD卡= Sandisk 4GB // RPi-2 SD卡=金士顿4GB)


2
没有两个相同大小的SD卡,除非它们来自同一制造商,同一品牌和同一生产批次。您不应将SD卡映像用于备份,而应复制文件
lenik 2014年

您的计算机说空卡上有多少空间?
Beta Decay

Answers:


6

实际上,并非所有SD卡都具有相同的确切大小。您必须缩小分区以使其适合较小的SD。我自己也有类似的问题。我所做的是使用Raspbian(在我的情况下)有一个单独的SD。然后使用USB读卡器插入了要调整大小的SD卡。

在安全收缩分区之前,需要确保要删除的末尾没有数据。可以使用以下方法resize2fs -M -p /dev/sda2(您必须用/ dev / sda2替换为要调整大小的USB卡读卡器和linux分区的正确路径)。这会将文件系统的大小调整为可能的最小大小。您实际上可以指定所需的确切大小,但是它涉及一些数学运算,并将大小转换为块大小和扇区,而不是实际大小。更安全,更容易做到这一点。

之后,您可以缩小分区。我想我曾经fdisk为此。获取分区的确切起始位置,将其删除,然后使用相同的起始位置重新创建,但尺寸较小。

最后,您需要使用以下命令再次扩大文件系统以占据整个分区: resize2fs -p /dev/sda2


我只是想澄清一下这个答案,因为我发现它有点难以理解。我首先卸载了SD卡上的分区。然后,我必须运行e2fsck -f /dev/mmcblk0p2(我缩小了mmcblk0的第二个分区)以检查一致性。然后,我被允许resize2fs -M -p /dev/mmcblk0p2按照建议的方式跑步。
audiFanatic 2015年


1

最好做一个文件系统的压缩文件,因为当您制作一个完整的磁盘映像时,您还会复制已删除的数据。删除文件时,索引节点将取消链接,但实际数据仍在磁盘上。使用的完整磁盘映像dd会复制该旧数据(除非您首先使用进行覆盖/dev/zero,这需要一些时间),但是使用的备份tar只会复制当前数据。

或者...您可以像许多发行版一样做:制作映像之前将文件系统大小减小到1.9 GiB之类的安全水平,并在还原备份后调整大小以填充磁盘。

警告:我不熟悉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 2014年

该脚本会缩小img的大小,并采用所用的大小,然后在末尾添加200000(用于日志等),使用此img启动后,您需要放大以适应新SD卡的大小...
Gilles Grandguillaume 2014年

嗨,我编写了此脚本,因此随时可以在我的博客上向我提问:sirlagz.net-此脚本需要在Linux上运行。该脚本会将图像缩小到最小尺寸,再加上一点松弛空间。这样一来,您就可以将一张8 gb的图像(仅使用1 gb的图像)放到1 gb的卡上。
劳伦斯

它应该使用“ partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '”来摆脱partstart中的B。
netawater 2015年

@netawater对于带有kubuntu / debian的此命令,我有不同的结果:sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer / ... ...我成功使用此脚本而未使用“ -1” !我不明白。
Gilles Grandguillaume 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.