บทนำ
สำหรับไดรฟ์ที่มีพาร์ติชัน PC (ซึ่งเป็นสิ่งที่คุณจะพบได้ใน USB sticks) bootloader ประกอบด้วยส่วนเล็ก ๆ ที่จุดเริ่มต้นของไดรฟ์ (ระยะที่ 1 bootloader ในบูตเซกเตอร์ของไดรฟ์) และ ส่วนที่ใหญ่กว่าที่อื่น (bootloader ขั้นที่ 2 ในไฟล์) ข้อมูลสเตจ 1 ประกอบด้วยตำแหน่งทางกายภาพของสเตจ 2 หากคุณคัดลอกอุปกรณ์ทั้งหมด (สิ่งที่คุณลองด้วยdd
) ส่วนที่ 1 สเตจจะอยู่ในตำแหน่งทางกายภาพเดียวกันและใช้งานได้ แต่แท่งใหม่ต้องมีอย่างน้อย ใหญ่เหมือนต้นฉบับ หากคุณสร้างพาร์ติชันขึ้นมาใหม่และคัดลอกไฟล์แสดงว่าคุณไม่มีขั้นตอนที่ 1 เนื่องจากไม่ใช่ไฟล์
ฉันคิดว่า (แต่ฉันยังไม่ได้ตรวจสอบ) ว่าสเตจ 2 อยู่ในพาร์ติชันแรก (FAT32) ถ้าเป็นเช่นนั้นคุณสามารถคัดลอกพาร์ติชั่นขายส่งและคัดลอกบูตเซกเตอร์ได้เช่นกันจากนั้นแก้ไขตารางพาร์ติชั่นเพื่อให้พาร์ติชันที่สองใช้พื้นที่ที่เหลืออย่างแน่นอนและคัดลอกไฟล์บนพาร์ติชันที่สอง คุณอาจเก็บภาพดิบของบูตเซกเตอร์และพาร์ติชั่นแรกไว้ในไฟล์บนฮาร์ดดิสก์ (แต่คุณสามารถโคลนมันจากแท่ง USB ได้)
ทำให้โคลนมีขนาดแตกต่างกัน
ด้านล่างนี้ผมจะโทรหาอุปกรณ์ที่มีติดเดิม/dev/sdb
และอุปกรณ์ที่มีโคลน/dev/sdc
; ใช้ชื่อแทนได้ตามต้องการ สร้างจุดเชื่อมต่อหากจำเป็น ฉันคิดว่าพาร์ติชัน FAT32 (ที่จุดเริ่มต้นของดิสก์) นั้นมีหมายเลข 1 และพาร์ติชัน ext3 นั้นมีหมายเลข 2 แทนที่ตัวเลขอื่นหากจำเป็น
ส่วนแรกถ้าโคลนจากไม้:
head -c 512 </dev/sdb >/dev/sdc
partprobe /dev/sdc
cat </dev/sdb1 >/dev/sdc1
ส่วนแรกหากการโคลนจากไฟล์ภาพ:
cat boot_sector.img >/dev/sdc
partprobe /dev/sdc
cat first_partition.img >/dev/sdc1
partprobe
จำเป็นต้องเรียกใช้เพื่อให้เคอร์เนลโหลดตารางพาร์ติชันจากดิสก์ (อยู่ในเซกเตอร์สำหรับเริ่มระบบและคำสั่งแรกในสถานการณ์ใดสถานการณ์หนึ่งข้างต้นปรับเปลี่ยนเซกเตอร์สำหรับเริ่มระบบ) หากคุณไม่ใช้งานคุณจะได้รับข้อผิดพลาดไม่เช่นนั้นเคอร์เนลจะเขียนข้อมูลขยะลงบนแท่ง
วิธีสร้างไฟล์ภาพ:
head -c 512 </dev/sdb >boot_sector.img
cat /dev/sdb1 >first_partition.img
หลังจากที่คุณมีบูตเซกเตอร์และพาร์ติชันแรกแล้วคุณต้องแก้ไขตารางพาร์ติชันอีกครั้งเพื่อปรับขนาดพาร์ติชันที่สอง fdisk
คุณสามารถทำได้โดยอัตโนมัติด้วยการกินการป้อนข้อมูลที่เหมาะสมที่จะ คำเตือนนี่เป็นข้อผิดพลาดอย่างมากและฉันยังไม่ได้ทดสอบ หากคุณรู้สึกไม่สะดวกสบายกับส่วนนี้ให้ทำด้วยมือ
sed -e 's/ *#.*//' <<EOF | tr -s ' ' '\n' | tr -d _ | fdisk /dev/sdc
d 2 # delete partition 2
n p 2 # new primary partition 2...
_ _ # ... using all available space
w q # write and quit
EOF
ในที่สุดก็โหลดตารางพาร์ติชันอีกครั้งสร้างระบบไฟล์ ext3 และคัดลอกไฟล์ที่นั่น
partprobe /dev/sdc
mke2fs -j /dev/sdc2
mount /dev/sdc2 /media/sdc2
cp -a /media/sdb2/ /media/sdc2/
umount /media/sdc2
วิธีการอย่างง่ายเพื่อสร้างโคลนที่ใหญ่กว่า
หากคุณต้องการคุณสามารถเก็บภาพแท่งทั้งหมดได้ คุณจะสามารถใช้ภาพนั้นโดยตรงบนแท่งที่มีขนาดใหญ่อย่างน้อยเพียงคัดลอกภาพนั้นไปยังแท่งใหม่ด้วยcat <whole.img >/dev/sdc
แล้วเรียกใช้partprobe /dev/sdc
(หรือถอดปลั๊กแท่งแล้วนำกลับมาใหม่) เพื่ออ่านตารางพาร์ติชันอีกครั้ง
จากนั้นหากต้องการคุณสามารถขยายขนาดโคลนได้ ในคำสั่งนี้:
- ขยายพาร์ติชัน น่าเสียดายที่ฉันไม่รู้วิธีการใช้วิธีง่ายๆ
parted
สามารถทำได้ด้วยmove
คำสั่ง (ไม่resize
ซึ่งปรับขนาดระบบไฟล์) แต่คุณต้องคิดออกอาร์กิวเมนต์ที่ถูกต้อง - สลับไปยังภาค ( unit s
) เพื่อหลีกเลี่ยงข้อผิดพลาดในการปัดเศษ
- ขยายระบบไฟล์ ส่วนนั้นเป็นเรื่องง่ายเพียงแค่เรียกใช้
resize2fs /dev/sdc2
เพื่อให้ระบบไฟล์ใช้ขนาดพาร์ติชันทั้งหมด
หากคุณเริ่มจากก้านขนาดใหญ่กว่าจำเป็นคุณสามารถหดได้โดยทำตามขั้นตอนข้างต้นในลำดับที่กลับ (ตอนแรกหดระบบแฟ้มที่มีresize2fs
แล้วหดพาร์ทิชันที่มีparted
)
หรืออีกวิธีหนึ่งคุณสามารถคัดลอกไม้เท้าไปยังไฟล์ภาพจากนั้นทำงานกับไฟล์ภาพนั้น ในการเข้าถึงพาร์ทิชันที่ใช้อุปกรณ์ห่วงโดยเฉพาะการเชื่อมโยงในส่วนของไฟล์ไปยังดิสก์ นี่คือภาพร่างของขั้นตอนต่างๆหากคุณต้องการย่อขนาดรูปภาพ (คำเตือน, ยังไม่ทดลอง, ดำเนินการอย่างระมัดระวังและตรวจสอบคณิตศาสตร์อีกครั้ง)
fdisk -lu whole.img # note starting sector of partition 2: $S
losetup -fs -o $(($S * 512)) whole.img
# Let $D be the desired size of partition 2, in kB
resize2fs /dev/loop0 $ # replace /dev/loop0 by whatever losetup prints
losetup -d /dev/loop0
parted whole.img
# Use parted to resize the second partition
dd if=/dev/null of=/file/to/truncate seek=1 bs=$(($S/2+$D+1))k