รูปภาพ SD จะไม่พอดีกับการ์ด SD


13

ฉันมีการตั้งค่า Pi หนึ่งและทำงานได้ดีในขณะที่ (RPi - 1) ฉันต้องการสร้างภาพของ RPi - 1 ดังนั้นฉันสามารถโหลดสำเนาที่แน่นอนลงใน pi ที่ 2 ของฉัน (RPi - 2) การ์ด SD ใน RPi - 1 คือ 4GB (ใช้เพียงครึ่งเดียวจริง ๆ ) และการ์ด SD ใน RPi - 2 เป็น 4GB ฉันใช้ 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 และเขียนภาพกลับไปได้ไม่มีปัญหา

ฉันหายไปนี่อะไร ไม่ใช่การ์ด SD ขนาด 4GB ทั้งหมดที่มีขนาดเท่ากันหรือแตกต่างกันเล็กน้อย? มีสิ่งที่คุณต้องทำกับการ์ด SD ใหม่ที่ฉันพลาดหรือไม่?

(RPi - การ์ด SD 1 การ์ด = Sandisk 4GB // RPi - การ์ด SD 2 การ์ด = Kingston 4GB)


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


ฉันแค่ต้องการชี้แจงคำตอบนี้เล็กน้อยเพราะฉันพบว่ามันยากที่จะทำตาม ฉันยกเลิกการต่อเชื่อมพาร์ติชันบนการ์ด SD เป็นครั้งแรก จากนั้นฉันก็ต้องเรียกใช้e2fsck -f /dev/mmcblk0p2(ฉันกำลังลดขนาดพาร์ติชันที่สองของ mmcblk0) เพื่อตรวจสอบความสอดคล้อง จากนั้นฉันก็ได้รับอนุญาตให้ทำงานresize2fs -M -p /dev/mmcblk0p2ตามที่แนะนำ
audiFanatic


1

คุณน่าจะสร้าง tarball ของระบบไฟล์ได้ดีกว่าเพราะเมื่อคุณสร้างดิสก์อิมเมจเต็มรูปแบบคุณก็จะคัดลอกข้อมูลที่ถูกลบไปด้วย เมื่อคุณลบไฟล์ inode จะถูกยกเลิกการเชื่อมโยง แต่ข้อมูลที่แท้จริงยังคงอยู่ในดิสก์ ดิสก์อิมเมจเต็มรูปแบบที่ใช้ddจะคัดลอกข้อมูลเก่านั้น (ยกเว้นถ้าคุณเขียนทับด้วยครั้งแรก/dev/zeroซึ่งใช้เวลาสักครู่) แต่การสำรองข้อมูลโดยใช้tarจะคัดลอกข้อมูลปัจจุบันเท่านั้น

หรือ ... คุณสามารถทำได้เหมือนการกระจายหลายอย่าง: ลดขนาดระบบไฟล์ของคุณให้ปลอดภัยเช่น 1.9 GiB ก่อนที่คุณจะสร้างภาพและปรับขนาดเพื่อเติมดิสก์หลังจากที่คุณกู้คืนข้อมูลสำรอง

Caveat: ฉันไม่คุ้นเคยกับเครื่องมือถ่ายภาพของ 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 gb (ซึ่งมีการใช้เพียง 1GB) ลงในการ์ด 1GB
Lawrence

มันควรใช้ "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" เพื่อกำจัด B ใน partstart
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.