วิธีการสร้างภาพ (.img) จากสิ่งที่อยู่ในการ์ด SD (แต่กะทัดรัดเหมือนต้นฉบับ)


20

ฉันเหนื่อย:

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz

มันสร้างไฟล์. img ขนาด 7.6 GB (ขนาดการ์ด แต่สิ่งที่อยู่ในการ์ดมีขนาด 700 MB)

และ:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz

สร้างไฟล์. gz ขนาด 2.7 GB

Raspbian ดั้งเดิม ( Debian 7 (Wheezy)) จากhttp://www.raspberrypi.org/downloadsมี 494.44 MiB

จากสิ่งที่อยู่ในการ์ด SD ฉันจะทำให้รูปภาพมีขนาดใกล้เคียงกันได้อย่างไร

(ฉันใช้ Ubuntu)


raspberrypi.stackexchange.com/questions/311/… สิ่งนี้ไม่ได้ช่วย
mf_

คำตอบ:


18

คุณพูดถึงความคิดเห็นต่อ RooTer ว่า A) คุณได้ลดขนาดพาร์ติชั่นเริ่มต้นด้วยgpartedแต่ddยังคงคัดลอกการ์ดทั้งหมดและ B) ที่คุณต้องการรวมพาร์ติชันทั้งสองไว้ในภาพ

ปัญหา "A" นั้นง่ายต่อการอธิบาย: คุณยังคงคัดลอกการ์ดทั้งหมดเพราะนั่นคือสิ่งที่/dev/mmcblk0อ้างถึง แต่ละพาร์ทิชันของหลักสูตรและ/dev/mmcblk0p1 /dev/mmcblk0p2นี่คือความยุ่งยากในการออก "B" แต่คุณไม่สามารถddแยกแต่ละพาร์ติชั่นและต่อไฟล์สองไฟล์เข้าด้วยกันได้เนื่องจากตารางพาร์ติชั่นที่จุดเริ่มต้น/dev/mmcblk0 ซึ่งดัชนีเริ่มต้นและความยาวของแต่ละพาร์ติชัน หากไม่มีภาพจะไม่สามารถใช้งานได้

แต่คุณจะได้รับความยาวของแต่ละพาร์ทิชันจากและใช้ในการกำหนดค่าพารามิเตอร์บางอย่างสำหรับfdisk -l ddตัวอย่างเช่น:

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux

หน่วย "เริ่มต้น" และ "สิ้นสุด" เป็นเซ็กเตอร์และสังเกตเห็นว่ามีการกำหนดขนาดเซกเตอร์ 512 ไบต์ สำหรับ/dev/mmcblk0p226746879 (ภาคสุดท้าย) - 122880 (ภาคแรก) = 26623999/2 (สำหรับ 2 ส่วนต่อ kB) / 1024 (kB ต่อ MB) / 1024 (MB ต่อ GB) = 12.69 ซึ่งฉันขยายพาร์ติชันโดยใช้ gparted ถึง 12 GB ดังนั้นสิ่งนี้ดูถูกต้อง (จริง ๆ แล้วฉันควรใช้ 1,000 และไม่ 1024 เป็นตัวหารที่มีหน่วยความจำซึ่งใช้งานได้ถึง 13.31 GB แต่ฉันสงสัยว่า gparted และเครื่องมืออื่น ๆ ใช้ 1024)

ดังนั้นสิ่งแรกที่คุณต้องการตรวจสอบคือพาร์ติชั่นที่สองของคุณมีขนาดเล็กกว่าที่คุณตั้งไว้ ถัดไปเพียงใช้ตัวเลขเหล่านั้นด้วยdd; สำหรับฉันมันจะเป็น:

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880

ฉันมีส่วนเสริมที่นั่นเพื่อหลีกเลี่ยงการปิดโดยความเข้าใจผิด ๆ ของวิธีการddทำงาน มีวิธีง่าย ๆ ในการตรวจสอบว่าการทำงาน:

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux

ขอให้สังเกตว่ามีความแตกต่างเล็กน้อยที่นี่: ภาค "เริ่ม" และ "สิ้นสุด" ตรงกับตารางพาร์ติชันดั้งเดิม แต่ขนาดโดยรวมในสถิติสูงสุดขึ้นไปเพียง 102 MB! นี่เป็นเพราะฉันใช้จริงcount=200000เป็นพารามิเตอร์เพื่อddเพราะฉันไม่ต้องการรำคาญกับสำเนา 12 GB (แจ้งให้ทราบด้วย "รวม 200000 ภาค") เหตุผลตารางที่ด้านล่างไม่สะท้อนเนื่องจาก fdisk ได้รับข้อมูลจากพาร์ทิชันข้อมูลคัดลอกคำต่อคำที่จุดเริ่มต้นของภาพจากจุดเริ่มต้นของการ์ด SD ซึ่งตามที่ฉันกล่าวถึงในวรรคสองมีความสำคัญ บำรุงรักษา. ถ้าฉันคัดลอกส่วนที่เหลือ (อย่างถูกต้อง) ตัวเลขจะเป็น copacetic และรูปภาพจะทำงานได้

ลองดูสิ :)


บน OSX fdisk ไม่ได้พิมพ์ขนาดเซกเตอร์อย่างชัดเจน มันเสนอแทน "รูปทรงเรขาคณิต: 966/255/63 [15523840 ภาค]" แทนกระบอก / หัว / ภาค ในกรณีนี้ควรใช้ค่า bs และจำนวนใด
Arthur Hebert

@AtheeHebert: จำนวนไบต์ทั้งหมด / ภาคส่วนทั้งหมด เช่นในกรณีแรกข้างต้นมันจะเป็น 16138633216/31520768 = 512 ใน 102400000/200000 = 512 ที่สอง
goldilocks

1
คุณสามารถใช้fdisk -l <device>และควรพิมพ์ตารางโดยไม่ต้องเข้าสู่โหมดโต้ตอบ
berto

5

ฉันเดาว่าปัญหาอยู่ในภาคที่ใช้ครั้งเดียวซึ่งยังมีสิ่งสกปรกอยู่ เมื่อลบไฟล์แล้วข้อมูลเมตาเท่านั้นที่จะถูกลบออกจากระบบไฟล์ไม่ใช่ตัวข้อมูลเองจึงปล่อยให้มีหนึ่งศูนย์สุ่มแทนการบีบอัดบล็อกศูนย์อย่างเดียวอย่างง่ายดาย

วิธีแก้ปัญหาที่ง่าย แต่ต้องเขียนใหม่พื้นที่ว่างทั้งหมดบนการ์ด โปรดจำไว้ว่าอายุการใช้งานการ์ด SD นั้น จำกัด ด้วยจำนวนการเขียนซ้ำดังนั้นนี่จึงไม่ใช่วิธีที่แนะนำ

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk

โซลูชันที่เกี่ยวข้องเพิ่มเติมเนื่องจากคุณต้องติดตั้งzerofreeบนคอมพิวเตอร์เครื่องอื่นซึ่งจะไม่ใช้การ์ด SD นั้นในเวลานั้น

zerofree /dev/mmcblk0p2

อ่านเพิ่มเติมได้ที่http://intgat.tigress.co.uk/rmy/uml/index.html

สิ่งที่คุณต้องจำคือการทำddของ / dev / mmcblk0 คุณคัดลอกอุปกรณ์ทั้งหมดแม้ว่าพาร์ทิชันจะมีขนาดเล็กลง หากคุณใช้raspi-configเพื่อขยายพาร์ติชันหลักก่อนที่จะทำวิธีใดวิธีหนึ่งข้างต้นคุณจะไม่เป็นไร

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


เป็นส่วนหนึ่งของการพยายามทำสิ่งนี้ให้สำเร็จฉันใช้ gparted เพื่อลด sdcard partition เพื่อรวมข้อมูลที่ฉันมีเท่านั้นจากนั้นฉันลองdd ing และผลลัพธ์เป็นไฟล์ 7.6GB เดียวกัน partimage ไม่สามารถบันทึก 2 พาร์ติชัน (/ boot + /) เป็น 1 ภาพ
mf_

บางทีฉันอาจจะไม่ชัดเจนพอ - ควรสร้างความแตกต่างเมื่อคุณบีบอัดมันอย่างที่คุณเคยลองกับ gzip มาก่อน
RooTer

การเติมการ์ดในลักษณะนี้จะทำให้เกิดวงจรการเขียนทั้งหมดและจะทำให้อายุการใช้งานของการ์ดสั้นลง ลองdd bs=4M if=/dev/zero of=/root/junk
nc4pk

@ เคาะออกมาแก้ไข;)
RooTer

4

คำตอบสั้น ๆ - ใช้การ์ด SD 2GB

คำตอบที่ยาวddไม่มีความคิดที่ว่าข้อมูลที่ "ดี" สิ้นสุดลงคุณต้องบอกว่าอย่างใด

มีสองวิธีที่ง่ายที่สุดคือการใช้การ์ด SD 2GB ซึ่งจะหยุดคัดลอกเกิน 2GB โดยอัตโนมัติและจะส่งผลให้ไฟล์บีบอัด 500MB ตามที่คุณต้องการ

อีกวิธีหนึ่งที่ซับซ้อนกว่านั้นคือการคำนวณขนาดข้อมูลที่ถูกต้องจากตารางพาร์ติชันของคุณและระบุขนาดที่ถูกต้องนี้เป็นพารามิเตอร์ที่จะใช้ในการddสั่งการ คุณสามารถใช้พารามิเตอร์bs=XXX(ขนาดบล็อก) และcount=XXX(จำนวนบล็อก) เพื่อวัตถุประสงค์นั้น ตัวอย่างเช่นคุณอาจระบุbs=10Mขนาดบล็อก 10MB (ซึ่งแน่นอนว่าจะทำการคัดลอกเร็วกว่าขนาดบล็อก 4k ที่คุณใช้ในคำสั่งของคุณ) และcount=200คัดลอก 10MB * 200 = 2000MB (2GB) คุณอาจจะต้องปรับขนาดบล็อกและบล็อกนับตามSD โครงการพาร์ทิชันบัตรของคุณ


1
การให้ddขนาดที่ระบุจะไม่เคยทำงาน ซึ่งสันนิษฐานว่าข้อมูลจริงทั้งหมดในระบบไฟล์จะถูกจัดเรียงอย่างเรียบร้อยที่จุดเริ่มต้นของอุปกรณ์ดังนั้นหากคุณมี 2GB บนพาร์ติชัน 8 GB คุณเพียงแค่ต้องการคัดลอก 2GB แรก นี่คือ FALSE ข้อมูล 2 GB เหล่านั้นจะกระจัดกระจายไปทั่วทั้งพื้นที่โดยเฉพาะอย่างยิ่งในการ์ด SD ที่ทันสมัยซึ่งไม่นำมาใช้ซ้ำสองครั้งจนกว่าบล็อกที่มีอยู่ทั้งหมดจะถูกใช้อย่างน้อยหนึ่งครั้ง (เรียกว่าระดับการสึกหรอและยืดอายุของการ์ด)
goldilocks

@ goldilocks จะเกิดอะไรขึ้นถ้าฉันปรับขนาด sdcard เพื่อลดขนาดพาร์ติชันทั้งหมดให้มีขนาดสูงสุดเท่าที่จะเป็นไปได้ (เฉพาะข้อมูลเท่านั้น) ??
mf_

@ goldilocks โปรดอ่านคำถามและคำตอบให้ละเอียดยิ่งขึ้นฉันกำลังพูดถึงพาร์ติชั่น 2GB บนการ์ด SD 8GB ไม่ได้เป็นข้อมูล 2GB บนพาร์ติชั่น 8GB เท่าที่จินตนาการของคุณบอกคุณ
lenik

1
lenik: ใช่ฉันตกใจนิดหน่อยฉันตีความคุณอย่างนั้นขอโทษทั้งหมด - น่าเสียดายที่ฉันไม่สามารถย้อนกลับ downvote ของฉันจนกว่าคุณจะแก้ไขโพสต์: / ถึงแม้ว่าฉันยังไม่คิดว่าคำตอบนี้มีประโยชน์โดยเฉพาะ (ไม่มีความผิด - - เพราะนี่ไม่ได้เป็นเพียงแค่พาร์ทิชันคำแนะนำเกี่ยวกับวิธีการทำเช่นนั้นอีกครั้งไม่มีประโยชน์) แต่ฉันจะทำเช่นนั้น @mf_ ใช่มันเป็นไปได้ (คุณอ่านคำตอบของฉันแล้วมันจะใช้งานได้ ... )
goldilocks

@goldilocks ฉันได้แก้ไขคำตอบแล้ว ไม่ทราบว่าเพราะเหตุใดจึงไม่มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อคุณให้คำตอบเดียวกันโดยมีรายละเอียดเพิ่มเติม
lenik

1

dd - copy and convertไม่ใช่เครื่องมือที่เหมาะสมในการทำงานที่คุณร้องขอ มันเป็นเครื่องมือระดับต่ำเซกเตอร์ตามเซกเตอร์คัดลอก (และแปลง) ซึ่งยอดเยี่ยมในการคัดลอกเซกเตอร์สำหรับเริ่มระบบอุปกรณ์ฟอร์แมตและงานระดับต่ำทุกประเภท เมื่อคุณใช้ddคุณกำลังคัดลอกเซกเตอร์ไปยังรูปภาพแม้ว่าจะไม่ได้รวมอยู่ในโครงสร้างระบบไฟล์

ภาพที่จัดทำโดยมูลนิธิ Raspberry Pi เป็นภาพที่รวบรวมเป็นพิเศษด้วยสคริปต์การติดตั้งการขยายไฟล์ไบนารีและการตั้งค่าเริ่มต้นหลังจากนั้นคุณต้องได้รับการอัปเดตจากอินเทอร์เน็ตอยู่ดี - เป็นงานที่ตั้งใจทั้งหมด

ทางออกหนึ่งที่ได้รับความนิยมเพื่อหลีกเลี่ยงการทำสำเนาเซกเตอร์ว่างคือการใช้ระบบคัดลอกระดับไฟล์ - และ CloneZilla นั้นเป็นแบบสแตนด์อโลนสามารถบูตได้จากซีดีคล้ายกับye olde Norton Ghostแต่ clonezilla รองรับระบบไฟล์ Linux (และอื่น ๆ ) ดังนั้นมันจะคัดลอกไฟล์ที่ใช้งานอยู่และสร้างคอนเทนเนอร์จากไฟล์เหล่านั้นเท่านั้น ลดขนาดลงอย่างมาก!


1

ฉันมีคำถามเดียวกันนี้และต้องการเครื่องมือที่ใช้งานง่าย หลังจากการค้นหาและไม่ได้หาหนึ่งที่ผมเขียนmkimg.sh ฉันร่างกระบวนการที่ฉันใช้ที่: /raspberrypi//a/37899/32585

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