การจดจำตารางพาร์ติชัน GPT ที่สร้างขึ้นด้วยขนาดเซกเตอร์ตรรกะที่แตกต่างกัน


9

ฉันมีไดรฟ์ 3TB ซึ่งฉันได้แบ่งพาร์ติชันโดยใช้ GPT:

$ sudo sgdisk -p /dev/sdg
Disk /dev/sdg: 5860533168 sectors, 2.7 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2BC92531-AFE3-407F-AC81-ACB0CDF41295
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5860533134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2932 sectors (1.4 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048           10239   4.0 MiB     8300
   2           10240      5860532216   2.7 TiB     8300

อย่างไรก็ตามเมื่อฉันเชื่อมต่อผ่านอะแดปเตอร์ USB จะรายงานขนาดเซกเตอร์ตรรกะ 4096 และเคอร์เนลไม่รู้จักตารางพาร์ติชันอีกต่อไป (เนื่องจากกำลังมองหา GPT ที่เซกเตอร์ 1 ซึ่งตอนนี้ออฟเซ็ต 4096 แทน 512):

$ sudo sgdisk -p /dev/sdg
Creating new GPT entries.
Disk /dev/sdg: 732566646 sectors, 2.7 TiB
Logical sector size: 4096 bytes
Disk identifier (GUID): 2DE535B3-96B0-4BE0-879C-F0E353341DF7
Partition table holds up to 128 entries
First usable sector is 6, last usable sector is 732566640
Partitions will be aligned on 256-sector boundaries
Total free space is 732566635 sectors (2.7 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name

มีวิธีใดที่จะบังคับให้ Linux รู้จัก GPT ที่ offset 512 หรือไม่? อีกวิธีหนึ่งมีวิธีในการสร้างสองส่วนหัว GPT หนึ่งที่ 512 และหนึ่งที่ 4096 หรือพวกเขาจะทับซ้อนกัน?

แก้ไข: ฉันพบวิธีแก้ไขปัญหาเล็กน้อยซึ่งไม่ดีมาก:

  1. ฉันสามารถใช้อุปกรณ์ย้อนกลับเพื่อแบ่งพาร์ติชันดิสก์:

    $ losetup /dev/loop0 /dev/sdg
    

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

    $ losetup /dev/loop1 /dev/sdg -o $((10240*512)) --sizelimit $(((5860532216-10240)*512))
    

    ฉันสามารถเขียนสคริปต์เพื่อทำสิ่งนี้โดยอัตโนมัติ แต่มันก็ดีที่จะทำมันโดยอัตโนมัติ

  2. ฉันสามารถเรียกใช้ nbd-server และ nbd-client; อุปกรณ์ NBD มีเซกเตอร์ 512 ไบต์ตามค่าเริ่มต้นและอุปกรณ์ NBD สามารถแบ่งพาร์ติชันได้ อย่างไรก็ตามเอกสาร NBD เตือนไม่ให้เรียกใช้เซิร์ฟเวอร์ nbd และไคลเอนต์ในระบบเดียวกัน เมื่อทำการทดสอบไคลเอนต์ในเคอร์เนล nbd จะหยุดทำงานและฉันต้องฆ่าเซิร์ฟเวอร์

  3. ฉันสามารถเรียกใช้ istgt (เป้าหมายพื้นที่ผู้ใช้ iSCSI) โดยใช้การตั้งค่าเดียวกัน สิ่งนี้นำเสนออุปกรณ์ SCSI อื่นให้กับระบบที่มีเซ็กเตอร์ขนาด 512 ไบต์ อย่างไรก็ตามเมื่อทำการทดสอบสิ่งนี้ล้มเหลวและทำให้เคอร์เนล NULL เป็นตัวชี้การอ้างอิงในรหัส ext4

  4. ฉันยังไม่ได้ตรวจสอบ devmapper แต่อาจใช้งานได้


1
ดูโพสต์บล็อกนี้: goughlui.com/2013/10/02/…
fpmurphy

คำตอบ:


3

ฉันพบวิธีแก้ปัญหา: โปรแกรมที่ชื่อว่า kpartx ซึ่งเป็นโปรแกรม userspace ที่ใช้ devmapper เพื่อสร้างพาร์ติชั่นจากอุปกรณ์ลูปแบ็คซึ่งใช้งานได้ดี:

$ loop_device=`losetup --show -f /dev/sdg`
$ kpartx -a $loop_device
$ ls /dev/mapper
total 0
crw------- 1 root root  10, 236 Mar  2 17:59 control
brw-rw---- 1 root disk 252,   0 Mar  2 18:30 loop0p1
brw-rw---- 1 root disk 252,   1 Mar  2 18:30 loop0p2
$
$ # delete device
$ kpartx -d $loop_device
$ losetup -d $loop_device

นี่เป็นสิ่งที่ฉันวางแผนไว้ว่าจะทำในตัวเลือกที่ 1 แต่ก็สะอาดกว่า


2

บน Linux อุปกรณ์ลูปสามารถแบ่งพาร์ติชันได้หากตั้งmax_partค่าพารามิเตอร์ของloopโมดูลเคอร์เนล หากloopเป็นบิวด์อิน (ไม่ใช่โมดูล) คุณสามารถส่งloop.max_part=31พารามิเตอร์บรรทัดคำสั่งเคอร์เนลแทนได้

ดังนั้นหลังจากที่คุณกำหนดค่าloopไดรเวอร์ให้รับอุปกรณ์บล็อกพาร์ติชันแล้วมันก็ควรจะทำ:

losetup --show -f /dev/sda

เพื่อให้ได้บาง/dev/loopXp1, /dev/loopXp2... อุปกรณ์สำหรับแต่ละพาร์ทิชัน

หมายเหตุเล็ก ๆ น้อย ๆ เนื่องจากสิ่งต่าง ๆ มีการพัฒนาที่ด้านหน้าในเคอร์เนลตั้งแต่คุณโพสต์คำถามของคุณ:

  • ตั้งแต่ 4.14 อาจเป็นไปได้ที่จะระบุขนาดบล็อกแบบลอจิคัลที่ไม่ใช่ 512 สำหรับอุปกรณ์ลูป ( losetup -b 4096เช่น) นอกจากนี้ยังเป็นไปได้ที่จะเปลี่ยนขนาดบล็อกของอุปกรณ์ลูปหลังจากที่มันถูกสร้างขึ้น

  • ตั้งแต่ 4.11 ขนาดบล็อกโลจิคัลของอุปกรณ์ nbd ถูกตั้งค่าเป็นขนาดบล็อกที่ส่งไปยัง nbd-client ( -bตัวเลือก) เนื่องจากขนาดบล็อกเริ่มต้นคือ (และเคยเป็น) 1024 ซึ่งหมายความว่าอุปกรณ์ nbd ได้รับขนาดเซกเตอร์ตรรกะเริ่มต้นที่ 1024 แทน 512 ก่อนหน้านี้ (ค่อนข้างแย่จากมุมมองความเข้ากันได้แบบย้อนหลัง)

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