SD 이미지가 SD 카드에 맞지 않습니다


13

나는 한 파이를 설정하고 잠시 동안 잘 운영했습니다 (RPi-1). RPi-1의 이미지를 만들어서 두 번째 pi (RPi-2)에 정확한 사본을로드 할 수있었습니다. RPi-1의 SD 카드는 4GB이며 (실제로 절반 만 사용됨) RPi-2의 SD 카드도 4GB입니다. Win32 디스크 이미 저를 사용하여 RPi-1의 복사본을 성공적으로 만듭니다. 그런 다음 SD Formatter 4.0 (Windows 7)을 사용하여 RPi-2 용 SD 카드를 포맷했습니다. 그러나 Win32 디스크 이미 저를 사용하여 RPi-1 이미지를 RPi-2의 SD 카드에 쓰면 "디스크 공간이 부족합니다. 크기 : 7744512 사용 가능 : 7626752 섹터 섹터 크기 : 512"

RPi-1의 SD 카드를 포맷하고 아무런 문제없이 이미지를 다시 쓸 수 있기 때문에 나쁜 이미지는 아닙니다.

내가 여기서 무엇을 놓치고 있습니까? 모든 4GB SD 카드의 크기가 같지 않거나 약간 다릅니 까? 내가 놓친 새로운 SD 카드에 대해해야 할 일이 있습니까?

(RPi-1 SD 카드 = Sandisk 4GB // RPi-2 SD 카드 = Kingston 4GB)


2
동일한 제조업체, 동일한 브랜드 및 동일한 프로덕션 배치에서 제공되지 않는 한 동일한 크기의 SD 카드는 두 개가 없습니다. 백업 목적으로 SD 카드 이미지를 사용하지 말고 대신 파일 을 복사 하십시오 .
lenik

빈 카드에 컴퓨터의 공간이 얼마나됩니까?
Beta Decay

답변:


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

2

나는 이것이 오래된 기사라는 것을 알고 있지만, 나는 방금 같은 문제가 있었고 여기에 설명 된 방법을 사용하여 그것을 해결했다 .


1

전체 디스크 이미지를 만들 때 삭제 된 데이터도 복사하기 때문에 파일 시스템의 타르볼을 만드는 것이 좋습니다. 파일을 삭제하면 inode는 연결 해제되지만 실제 데이터는 여전히 디스크에 있습니다. 전체 디스크 이미지를 사용 dd하면 이전 데이터를 처음으로 덮어 쓰는 경우 (시간이 오래 /dev/zero걸리는 경우 제외 )를 사용하지만 백업을 사용 tar하면 현재 데이터 만 복사됩니다.

또는 ... 많은 배포판처럼 할 수 있습니다. 이미지를 만들기 전에 파일 시스템 크기를 1.9 GiB와 같은 안전한 크기로 줄이고 백업을 복원 한 후 디스크를 채우도록 크기를 조정하십시오.

주의 사항 : 저는 Windows 이미징 도구에 익숙하지 않으며 Linux 사용자입니다.


1

리눅스를 사용한다면 여기에 약간의 스크립트가 있습니다 :

#!/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 (soooo 죄송합니다!)


4
이 스크립트가 무엇을해야하는지 설명해 주시겠습니까? 텔레파시로 필요한 이미지 크기를 어떻게 지정할 수 있습니까?
lenik

스크립트는 img 크기를 줄이고, 사용 된 크기를 취하고, 200000을 추가하여 (로그 등을 위해),이 img로 부팅 한 후 새 SD 카드의 크기에 맞게 확대해야합니다.
Gilles Grandguillaume

안녕하세요, 저는이 스크립트를 작성 했으므로 블로그에서 질문을 보내 주시기 바랍니다 : sirlagz.net- 이 스크립트는 Linux에서 실행해야합니다. 스크립트는 이미지를 가능한 최소 크기와 약간의 여유 공간으로 축소합니다. 이를 통해 1GB 카드에 8GB 이미지 (1GB 만 사용됨)를 넣을 수 있습니다.
Lawrence

"partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '"를 사용 하여 partstart에서 B를 제거 해야합니다 .
netawater

@netawater kubuntu / debian에서이 명령에 대해 다른 결과를 얻었습니다 . sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/… ...이 스크립트를 "-1"없이 성공적으로 사용합니다 ! 이해가 안 돼요
Gilles Grandguillaume
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.