วิธีการปรับขนาดไฟล์ภาพก่อนที่จะเขียนไปยังการ์ด SD?


13

ฉันพยายามสร้างภาพ Raspbian ใหม่ด้วยเคอร์เนลที่แตกต่างกัน (พร้อมรองรับ CAN) และติดตั้ง Python 3.3 แทนที่จะทำทั้งหมดนี้ใน Raspberry Pi ฉันคิดว่ามันน่าสนใจที่จะทำบนคอมพิวเตอร์แทน (ทำตามคำแนะนำเหล่านี้ ) อย่างไรก็ตามเมื่อฉันติดตั้งอิมเมจและพร้อมใช้งานฉันก็หมดพื้นที่ในดิสก์อย่างรวดเร็ว ฉันคิดว่านี่เป็นเพราะภาพมีขนาดใหญ่พอเพียงกับความคาดหวังว่าผู้ใช้จะปรับขนาดระบบไฟล์เมื่อมีการเขียนลง SD การ์ด

เป็นไปได้หรือไม่ที่จะปรับขนาดภาพและระบบไฟล์ก่อนที่จะเขียนลงในการ์ด SD เพื่อให้ฉันสามารถปรับแต่งเพิ่มเติมได้โดยไม่ต้องเหลือพื้นที่ว่าง?


คำถามนี้อาจช่วยคุณได้
Jivings

1
@Jivings: คำตอบทั้งหมดเหล่านี้อธิบายถึงวิธีการปรับขนาดภาพหลังจากที่มันถูกเขียนไปยังการ์ด SD ฉันรู้วิธีที่จะทำ; ฉันสนใจที่จะปรับขนาดภาพก่อนที่จะเขียนลงในการ์ด SD
DrAl

คำตอบ:


8

นี่คือวิธีการปรับขนาดไฟล์ภาพดิบ ฉันรู้ว่ามันฟังดูง่าย แต่ก็ใช้งานได้

สร้างภาพเปล่าขนาดที่คุณต้องการขยายต้นฉบับ (ในตัวอย่างของฉันฉันใช้ 5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

ผนวกสิ่งนี้กับภาพต้นฉบับ:

cat /path/to/temp_image >> /path/to/rasperrypi.img

ปรับขนาดระบบไฟล์ที่อยู่ท้ายดิสก์ (โดยปกตินี่คือระบบที่คุณต้องการใหญ่กว่า):

resize2fs -f /path/to/rasperrypi.img

ทำ! ตอนนี้ดิสก์ของคุณควรใหญ่กว่า 5GB!


ฟังดูดีมากขอบคุณ: ฉันจะทดสอบคืนนี้
DrAl

5
ฉันเพิ่งลองทำสิ่งนี้และเมื่อฉันไปถึงขั้นตอน resize2fs (หลังจากเพิ่ม 1GB ลงในไฟล์) ฉันจะได้รับ "หมายเลขเวทย์มนตร์ที่ไม่ดีในซูเปอร์บล็อกขณะที่พยายามเปิด 2012-12-16-wheezy-raspbian.img Couldn ' ไม่พบระบบไฟล์ superblock ที่ถูกต้อง " ข้อเสนอแนะใด ๆ เกี่ยวกับสิ่งที่ฉันทำผิด?
DrAl

ดูเหมือนว่าฉันจะมีปัญหากับความจริงที่ฉันพยายามปรับขนาด 2fs ภาพทั้งหมด (เทียบเท่า / dev / sda) แทนพาร์ติชัน (เทียบเท่า / dev / sda2) อย่างไรก็ตามฉันอาจจะผิดและฉันพยายามทำสิ่งอื่น ๆ โดยไม่ประสบความสำเร็จ (เช่นการปรับขนาดพาร์ติชันด้วย fdisk ซึ่งดูเหมือนจะใช้งานได้ แต่ไม่ได้ช่วยปรับขนาดระบบไฟล์)
DrAl

3
ตกลงฉันพบคำตอบสำหรับบิตสุดท้ายด้วย googling เล็กน้อย: ฉันต้องการสร้างอุปกรณ์วนรอบที่ชี้ไปยังพาร์ติชันในรูปภาพ ฉันไม่นี้โดยได้รับภาคการเริ่มต้นของพาร์ทิชันที่สองจากfdisk -l file.img(มันเป็น 122880) losetup --offset $((122880 * 512)) /dev/loop0 file.imgแล้ว จากนั้นผมก็สามารถใช้resize2fsบนและเป็นระเบียบเรียบร้อยขึ้นด้วย/dev/loop0 losetup -d /dev/loop0หากคุณอัปเดตคำตอบเพื่อรวมสิ่งนี้ฉันจะทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้ ขอบคุณที่ชี้นำฉันในทิศทางที่ถูกต้อง
DrAl

1
@DrAl เฮ้ฉันพยายามแก้ปัญหาของคุณโดยใช้resize2fsบน/dev/loop0แต่ได้ฉันจะได้รับความตื่นตระหนกที่บูตเคอร์เนลบอกขนาดซุปเปอร์บล๊อกและขนาดพาร์ทิชันไม่ตรงกัน: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksมีคุณเจออะไรเช่นนี้?
GuySoft

4

นี่คือการสังเคราะห์คำตอบด้านบนและที่อื่น ๆ ที่เหมาะกับฉัน - สำรองรูปภาพของคุณในกรณีที่คุณทำผิดพลาด:

ขั้นแรกทำให้ไฟล์รูปภาพใหญ่ขึ้น (ที่นี่เราเพิ่ม 1GB ไปจนสิ้นสุด):

truncate -s +1G ./image.img

ถัดไปแมปภาพทั้งหมดเป็นอุปกรณ์วนรอบเพื่อให้เราสามารถกระตุ้นที่ตารางพาร์ติชัน

sudo losetup /dev/loop0 ./image.img

สำหรับการอ้างอิงในอนาคตให้ทิ้งไว้:

sudo fdisk -l /dev/loop0

ผลลัพธ์ดูเหมือนว่า:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

ตอนนี้เราจะสร้างพาร์ติชันใหม่ล่าสุดโดยการลบพาร์ติชันนั้นจากนั้นสร้างพาร์ติชันใหม่ที่ตำแหน่งเริ่มต้นเดียวกันประเภทเดียวกัน แต่ตำแหน่งสิ้นสุดที่แตกต่างกัน ดังนั้นจดบันทึกคอลัมน์ "เริ่มต้น" สำหรับ loop0p2 (พาร์ติชัน 2 - พาร์ติชัน Linux) - เราจะใช้ในภายหลัง - 122880 ที่นี่

sudo fdisk /dev/loop0

ป้อนสิ่งต่อไปนี้ - ปลอดภัยสำหรับการป้อน - ไม่มีสิ่งใดเกิดขึ้นอย่างถาวรจนกว่าคุณจะได้อ่านคำอธิบายของฉันที่ตามมา:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. เพียงกด Enter เพื่อยอมรับค่าเริ่มต้น
  9. p

ขั้นตอนที่ 1 - พิมพ์ตารางปัจจุบัน ขั้นตอนที่ 2-3 - ลบพาร์ติชัน 2 ขั้นตอนที่ 4-8 - สร้างพาร์ติชัน 2 ใหม่ด้วยจุดสิ้นสุดใหม่ (ค่าเริ่มต้นคือจุดสิ้นสุดของภาพ) ขั้นตอนที่ 9 - พิมพ์ตารางใหม่

สมมติว่าตารางที่พิมพ์ใหม่ของคุณเหมือนกับตารางต้นฉบับยกเว้นค่า End และค่า Blocks (เช่นขนาดที่เปลี่ยนแปลง) คุณพร้อมที่จะส่งมอบ

ป้อนwเพื่อยืนยันการเปลี่ยนแปลงของคุณจากนั้นป้อนqเพื่อออก

คุณสามารถลบอุปกรณ์ลูปแบ็คนั้นเราจะสร้างอุปกรณ์อื่นสำหรับพาร์ติชันที่สอง จำจุดเริ่มต้นที่คุณจดบันทึกและใช้งานด้านบน - เราจะใช้อีกครั้ง:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

ที่จะสร้างการแมปใหม่ในการ/dev/loop0ชี้ไปที่พาร์ติชัน 2 - สำหรับการอ้างอิง 512 คือขนาดเซกเตอร์ที่คุณเห็นในfdiskเอาต์พุตแรก

ตอนนี้ปรับขนาดพาร์ติชันเพื่อเติมพื้นที่ว่าง:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

เสร็จสิ้น - ล้างข้อมูลตอนนี้:

sudo losetup -d /dev/loop0

ขอบคุณ ... คำแนะนำข้างต้นไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ทำได้ ฉันได้รับคำเตือนบางอย่างเมื่อเขียนตารางพาร์ทิชัน: `` `Command (m เพื่อขอความช่วยเหลือ): w ตารางพาร์ติชั่นได้รับการแก้ไข การเรียก ioctl () เพื่ออ่านตารางพาร์ติชันอีกครั้ง การอ่านตารางพาร์ติชันใหม่ล้มเหลว: อาร์กิวเมนต์ไม่ถูกต้องเคอร์เนลยังคงใช้ตารางเก่า ตารางใหม่จะถูกใช้ในการรีบูตครั้งถัดไปหรือหลังจากที่คุณรัน partprobe (8) หรือ kpartx (8) `` `ฉันแค่เพิกเฉยมันก็ไม่เป็นไร
StFS

ยอดเยี่ยม คุณเป็นคนเดียวที่ทำคำตอบที่ถูกต้อง! ขอบคุณ
yushulx

3

สำหรับคนที่ใช้ Oracle VM VirtualBox มันค่อนข้างง่าย

บนเครื่อง Windows สิ่งต่าง ๆ จะเป็นดังนี้:

input.imgนี่คือภาพที่ควรลดขนาดและoutput.imgเป็นภาพสุดท้าย - ในตัวอย่างนี้กำหนดให้มีขนาดใหญ่ 7000 MB

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

หวังว่านี่จะช่วยได้เล็กน้อย


ขอบคุณสำหรับการแก้ปัญหานี้เจ้าเล่ห์มาก มันเป็นเกมเดียวที่ฉันสามารถค้นหาได้ฟรีและทำงานได้อย่างสมบูรณ์บน Windows ฉันมีปัญหากับการ์ด 16GB ที่มีขนาดไม่เท่ากันและจำเป็นต้องปรับขนาดภาพของฉัน
Josh

ฉันพบข้อผิดพลาดเคอร์เนล Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

โปรดทราบว่านี่เป็นการตัดภาพ - คุณจะสูญเสียข้อมูลหากมีเครื่องหมาย 7000MB ผ่านมา - คำสั่งจะไม่เตือนหรือบ่น
Mike Redrobe

2

นี่คือวิธีการปรับขนาดไฟล์ภาพดิบ ฉันรู้ว่ามันฟังดูง่าย แต่ก็ใช้งานได้

สร้างภาพเปล่าขนาดที่คุณต้องการขยายต้นฉบับ (ในตัวอย่างของฉันฉันใช้ 5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

ผนวกสิ่งนี้กับภาพต้นฉบับ:

cat /path/to/temp_image >> /path/to/rpi.img

ถัดไปคือการปรับขนาดพาร์ติชันและระบบไฟล์ ขั้นแรกรับออฟเซ็ตของพาร์ติชัน

fdisk -l /path/to/rpi.img

ผลลัพธ์ในตารางดังนี้:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

หมายเหตุออฟเซ็ตเริ่มต้นของพาร์ติชันที่สอง

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

สุดท้าย unmount / dev / loop

losetup -d /dev/loop0

ทำ! ตอนนี้ดิสก์ของคุณควรใหญ่กว่า 5GB!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.