รูปภาพของการ์ด 16Gb ที่มีพื้นที่ว่างแบบไม่แยกส่วนท้าย: สามารถตัดทอนได้หรือไม่


18

ฉันต้องการเตรียม distro สำหรับเพื่อนบางคน
เนื่องจากฉันไม่มีอะไรนอนอยู่รอบ ๆ ฉันจึงใช้การ์ด SD ขนาด 16Gb

ฉันเริ่มต้นด้วยภาพ Debian Weezy 2Gb ที่เป็นค่าเริ่มต้นและไม่ได้ทำการปรับขนาดใด ๆ
ตอนนี้ที่ฉันทำฉันต้องการสร้างภาพของสิ่งที่ฉันทำ แต่ฉันได้รับไฟล์ 16Gb ที่มี 14Gb ของพื้นที่(ไม่แบ่งพาร์ติชันและฟรี) ไม่แบ่งพาร์ติชัน ในตอนท้าย

[ฉันใช้ Windows // Win32DiskImager เพราะฉันไม่มีอะไรติดอยู่กับ rPI ในตอนนี้]

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


2
หากคุณมีการเข้าถึงเครื่องคอมพิวเตอร์ลินุกซ์เรียกใช้แล้วติดตั้งและเรียกใช้dd if=/dev/path/to/SD/card of=~/SpecialImage.img GParted gparted ~/SpecialImage.imgเมื่อ GParted เปิด.imgไฟล์ของคุณให้ปรับขนาดพาร์ติชั่นตามที่คุณต้องการ! (คำสั่งทั้งสองจะต้องเรียกใช้ในฐานะรูทsudo suคุณควรได้รับสิ่งที่คุณต้องการเมื่อ$สวิตช์ไปที่#คุณเป็นรูทระวังนี่คือลินุกซ์ที่เทียบเท่ากับพระเจ้า) GParted นั้นเป็นส่วนหน้า GUI สำหรับการจัดการชิ้นส่วนอาร์เคน เครื่องมือที่คุณต้องการ การใช้ GParted ทำให้ทุกอย่างง่ายขึ้นและน่าพอใจขึ้นมาก
JamesTheAwesomeDude

โปรดอ่านคำถามของฉันอย่างระมัดระวัง
Nippey

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

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

โอ้ฉันเข้าใจแล้วว่าคุณกำลังพูดอะไร หากคุณกังวลเกี่ยวกับพื้นที่ว่างต่อท้ายที่เสียหายให้รัน GParted บนภาพหลังจากตัดทอนมัน มันอาจจะแสดงรายการพื้นที่สุดท้ายว่าเป็น "ไม่ได้ปันส่วน" หรือ "เสียหาย" - สร้างพาร์ติชั่นใหม่ "ที่ไม่ฟอร์แมต" ในพื้นที่นั้น จากนั้นคุณจะไม่มีปัญหาใด ๆ :)
JamesTheAwesomeDude

คำตอบ:


33

ในที่สุดฉันก็พบแหล่งข้อมูลที่อธิบายคำถามของฉัน

http://softwarebakery.com/shrinking-images-on-linux

สั้น:

ใช่การตัดทอนเป็นไปได้!

สรุปกระบวนการ:

แตกข้อมูลพาร์ติชั่นจากอิมเมจโดยใช้fdisk:

$ fdisk -lu image.img
Disk image.img: 4096 MB, 4096000000 bytes, 8000000 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: 0x000a1bc7

      Device Boot      Start         End      Blocks   Id  System
image.img1              2048     5872026     5869978    b  W95 FAT32

เรามาดูกันว่าพาร์ทิชันที่มีขนาดประมาณ 2,8Gb (5872026 * 512) ส่วนที่เหลือเป็นunpartitioned

ดังนั้นทุกอย่างหลังจากสิ้นสุดพาร์ติชันสามารถลบออกได้ นี้จะทำได้ด้วยเครื่องมือ
truncateอย่าลืมเพิ่ม 1 ลงในจำนวนเซ็กเตอร์เนื่องจากหมายเลขบล็อกเริ่มต้นที่ 0

$ truncate --size=$[(5872026+1)*512] image.img


แก้ไข:

สำหรับผู้ที่ขี้เกียจเกินไปที่จะเปลี่ยนไปใช้ลินุกซ์:
ยังทำงานบน Windows ด้วยCygwin 's fdisk.exeและtruncate.exe!

Cygwin คืออะไร

ฉันอาจอ้างถึง: "Cygwin: เข้าใจ Linux บน Windows" ( https://www.cygwin.com/ )
เป็นชุดของไฟล์เรียกทำงานที่สามารถทำงานภายใต้ Windows ได้ แต่มีโปรแกรมบรรทัดคำสั่งทั้งหมดที่คุณมักรู้จักจาก Linux Cygwin อาจใช้เวลานานในการติดตั้งหากคุณเลือกทุกแพ็คเกจในระหว่างการติดตั้ง แต่เพื่อทำตามตัวอย่างนี้ให้แน่ใจว่านอกเหนือจากการกำหนดค่าเริ่มต้นแล้วยังเลือกแพ็คเกจutil-linux(fdisk) และcoreutils(ตัด) ด้วย
ทั้งนี้ขึ้นอยู่กับสภาพแวดล้อมของคุณคุณคนจำเป็นต้องเพิ่ม/usr/binและที่คุณ/usr/sbin$PATH


1
แพคเกจสิ่งที่ฉันจำเป็นต้องติดตั้งที่จะได้รับfdisk.exeและtruncate.exe?
PythonNut

1
สวัสดี @PythonNut ฉันได้อัปเดตคำตอบของฉันด้านบนและเพิ่มแพ็คเกจที่ต้องการ: o)
Nippey

จะทำอย่างไรถ้าพาร์ติชันมีขนาดของดิสก์แม้ว่าจะใช้น้อย
piegames

5

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันต้องการที่จะแสดงวิธีการทำกระบวนการนี้บน Mac เพราะมันไม่ง่าย: fdiskไม่มี-lตัวเลือกและtruncateไม่มีการติดตั้งตามค่าเริ่มต้น:

1. ขั้นตอนที่ 1: ติดตั้งtruncateบน Mac OS X:

คุณต้องมี MacPorts หรือ Homebrew สำหรับสิ่งนี้ ฉันใช้ MacPorts หากคุณไม่มีสิ่งใดสิ่งหนึ่งเหล่านี้ไปข้างหน้าและติดตั้งก่อน ลิงก์ไปยัง MacPorts

ตอนนี้เราสามารถติดตั้งตัด เปิด Terminal ของคุณแล้วพิมพ์:

sudo port install truncate

สำหรับการติดตั้ง Brew:

brew install truncate

สิ่งนี้ควรทำ

2. ใช้ดิสก์ยูทิลิตี้ที่จะติด IMG ของเราเพื่อที่จะมองเห็นได้ด้วยdiskutilคำสั่งมินัล

คุณจะเห็นในช่วงเวลาที่เราต้องการขั้นตอนนี้ เปิดแอพ Disk Utility คลิกที่ไฟล์ (บนแถบด้านบน) -> เปิดภาพดิสก์แล้วเลือกไฟล์ IMG ของคุณ

3. ตรวจสอบขนาดพาร์ติชันของ IMG และตำแหน่งที่ติดตั้ง

บนเทอร์มินัลพิมพ์:

diskutil list

และควรแสดงอะไรเช่นนี้ที่ใดที่หนึ่งในท้ายที่สุด:

/dev/disk3 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        +16.0 GB    disk3
   1:             Windows_FAT_32 boot                    62.9 MB    disk3s1
   2:                      Linux                         3.9 GB     disk3s2

ดังนั้นเราจะเห็นว่าประมาณ 12GB ไม่มีการแบ่งส่วน เราจำเป็นต้องตัดทอนเหล่านั้น

เหตุผลที่เราต้องการคำสั่งนี้คือการตรวจสอบที่ติดตั้งอิมเมจดิสก์ ในกรณีของฉันมันอยู่ภายใต้: / dev / disk3

4. ค้นหาขนาดพาร์ติชันที่แท้จริง

3.9 GB และ 62.9 MB เป็นค่าที่ใช้ไม่ได้กับการตัดปลาย เราจำเป็นต้องค้นหาขนาดพาร์ติชันเป็นไบต์

5. เรียกใช้fdisk

ในเทอร์มินัลของคุณเรียกใช้คำสั่งนี้:

   fdisk /dev/diskX

โดยที่Xคือหมายเลขที่คุณค้นพบในขั้นตอนก่อนหน้า สิ่งนี้จะส่งผลดังนี้:

         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0C    0 130   3 -    8  40  32 [      8192 -     122880] Win95 FAT32L
 2: 83    8  40  33 -  478  79  49 [    131072 -    7553024] Linux files*
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      

6. เวลาตัดทอน !

ใน terminal ของคุณcdไปยังไดเรกทอรีว่าภาพของคุณ จากนั้นเขียน:

truncate FILE SIZE

FILE เป็นไฟล์ของคุณแน่นอน

SIZE คือขนาดเป็นไบต์ สิ่งที่ฉันทำคือการเพิ่มคอลัมน์ขนาดของfdiskคำสั่งคอลัมน์เริ่มต้นและคูณด้วย 512 ดังนั้นในกรณีของฉัน SIZE จะเป็น: 512 * (7553024 + 131072) = 3934257152ซึ่งมีประมาณ 3.9 GB

คุณจะต้องเริ่มต้นและขนาดของพาร์ทิชันที่ผ่านมาfdiskที่มีการแสดงโดย (ไม่จำเป็นต้องใหญ่ที่สุด แต่เป็นไฟล์ที่อยู่ท้ายไฟล์ IMG)

ฉันทดลองเล็กน้อยและเมื่อใดก็ตามที่ฉันป้อน 7553024 * 512 หรือ (7553024 + 1) * 512 ไบต์ไฟล์ IMG นั้นเสียหาย ดังนั้นเพื่อให้แน่ใจว่าทำตามที่ฉันระบุข้างต้น อาจเพิ่มมากกว่าที่จำเป็นจริง แต่เป็นตัวเลือกที่ปลอดภัย

7. (ไม่บังคับ) ทดสอบว่า IMG ไม่เสียหายหรือไม่

ลองอีกครั้งใน Disk Utility แล้วลองเปิดไฟล์ IMG ใหม่เหมือนเดิม ถ้ามันเมาท์, คุณยังสามารถดูใหม่(ขนาดเล็ก)ขนาด ถ้ามันไม่ติดก็มีบางอย่างผิดปกติ (อาจลองเพิ่มขนาดtruncateคำสั่ง)

นี่ไม่ใช่การทดสอบที่ดีที่สุด แต่เป็นวิธีที่แน่นอนในการตรวจสอบว่า IMG ใหม่นั้นเสียหายหรือไม่ ดังนั้นอย่าเชื่อในสิ่งนี้ แต่ควรลอง ...

ฉันหวังว่าบางคนพบว่ามีประโยชน์นี้!


1
ทำได้ดีนี่! ขอบคุณสำหรับการขยายความรู้ :) ดีที่คุณชี้ให้เห็นว่า512*(Size+1)มันไม่ทำงาน อย่างที่คุณเห็นฉันใช้Endและไม่Sizeเหมือนที่คุณต้องเก็บทั้งสองพาร์ติชันหากมีมากกว่าหนึ่ง ดังนั้นการใช้7553024 + 131072( +1) ถูกต้อง 100%!
Nippey

1

Win32DiskImager ล่าสุดมีตัวเลือกให้รวมพาร์ติชั่นที่จัดสรรไว้ในดิสก์อิมเมจเท่านั้น วิธีนี้จะทำการตัดแต่งในคลิกเดียว

ป้อนคำอธิบายรูปภาพที่นี่


ยอดเยี่ยมทำให้ง่ายขึ้นมากใน Windows!
Nippey

0

สิ่งที่ฉันเพิ่งสังเกตเห็นเมื่อฉันทำการ Win32diskimg นี้จำนวนมากสำหรับการสำรองรูปภาพ RPI ของฉันสำหรับการปรับใช้ ฉันเพิ่งเริ่มทดสอบ fstrim "ตัดแต่ง" SD เพื่อล้างส่วนต่างๆของการ์ด SD ที่ไม่ได้ใช้สำหรับการปรับระดับการสึกหรอตามทฤษฎี ไม่แน่ใจเกี่ยวกับผลกระทบที่จะเกิดขึ้น แต่มีผลข้างเคียงอย่างหนึ่งคือเมื่อฉันถ่ายภาพพาร์ติชัน 16GB SD แล้วใช้ 7zip เพื่อบีบอัด ฉันเปลี่ยนจาก 16GB เป็น 9.5GB เป็นตอนนี้เป็นไฟล์ 2.5GB ฉันกำลังทดสอบเพื่อให้แน่ใจว่าไม่มีอะไรผิดปกติ แต่ปรากฏว่าการใช้ TRIM เพื่อทำเครื่องหมายพื้นที่ที่ไม่ได้ใช้เนื่องจาก 0 ทำให้การบีบอัดภาพมีประสิทธิภาพมากขึ้น (ซึ่งดูสมเหตุสมผล) แค่ต้องการรายงานว่านี่เป็นเรื่องที่ทำได้ง่ายและไม่มีขั้นตอนมากมาย


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