Mengenali tabel partisi GPT yang dibuat dengan ukuran sektor logis yang berbeda


9

Saya memiliki drive 3TB yang telah saya partisi menggunakan 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

Namun, ketika saya menghubungkannya melalui adaptor USB, ia melaporkan ukuran sektor logis 4096 dan kernel tidak lagi mengenali tabel partisi (karena mencari GPT di sektor 1, yang sekarang di offset 4096 bukannya 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

Apakah ada cara untuk memaksa Linux untuk mengenali GPT pada offset 512? Atau, apakah ada cara untuk membuat dua header GPT, satu di 512 dan satu di 4096, atau akankah mereka tumpang tindih?

EDIT: Saya telah menemukan beberapa solusi, tidak ada yang sangat baik:

  1. Saya bisa menggunakan perangkat loopback untuk mempartisi disk:

    $ losetup /dev/loop0 /dev/sdg
    

    Perangkat Loopback selalu memiliki ukuran sektor 512, jadi ini memungkinkan saya untuk mempartisi perangkat seperti yang saya inginkan. Namun, kernel tidak mengenali tabel partisi pada perangkat loopback, jadi saya harus membuat perangkat loopback lain dan secara manual menentukan ukuran partisi dan mengimbangi:

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

    Saya dapat menulis skrip untuk mengotomatiskan ini, tetapi alangkah baiknya untuk dapat melakukannya secara otomatis.

  2. Saya dapat menjalankan nbd-server dan nbd-client; Perangkat NBD memiliki sektor 512-byte secara default, dan perangkat NBD dapat dipartisi. Namun, dokumentasi NBD memperingatkan agar tidak menjalankan server nbd dan klien pada sistem yang sama; Saat pengujian, klien nbd di-kernel digantung dan saya harus membunuh server.

  3. Saya dapat menjalankan istgt (ruang pengguna target iSCSI), menggunakan pengaturan yang sama. Ini menyajikan perangkat SCSI lain ke sistem dengan sektor 512-byte. Namun, ketika pengujian, ini gagal dan menyebabkan dereference pointer NULL kernel dalam kode ext4.

  4. Saya belum menyelidiki devmapper, tetapi mungkin berhasil.


1
Lihat posting blog ini: goughlui.com/2013/10/02/…
fpmurphy

Jawaban:


3

Saya menemukan solusinya: Sebuah program bernama kpartx, yang merupakan program userspace yang menggunakan devmapper untuk membuat partisi dari perangkat loopback, yang bekerja sangat baik:

$ 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

Ini pada dasarnya melakukan apa yang saya rencanakan untuk dilakukan pada opsi 1, tetapi jauh lebih bersih.


2

Di Linux, perangkat loop dipartisi jika max_partparameter loopmodul kernel diatur. Jika loopbuilt-in (bukan modul), Anda dapat melewatkan loop.max_part=31parameter baris perintah kernel sebagai gantinya.

Jadi setelah Anda mengkonfigurasi loopdriver untuk mendapatkan perangkat blok yang dapat dipartisi, seharusnya hanya masalah melakukan:

losetup --show -f /dev/sda

Untuk mendapatkan beberapa /dev/loopXp1, /dev/loopXp2... perangkat untuk setiap partisi.

Beberapa catatan telah berkembang di bagian depan kernel sejak Anda memposting pertanyaan Anda:

  • sejak 4.14, dimungkinkan juga untuk menentukan ukuran blok logis selain 512 untuk perangkat loop ( losetup -b 4096misalnya). Dimungkinkan juga untuk mengubah ukuran blok perangkat loop setelah perangkat dibuat.

  • sejak 4.11, ukuran blok logis perangkat nbd diatur ke ukuran blok yang diteruskan ke nbd-klien ( -bopsi). Karena ukuran blok default adalah (dan dulu) 1024, itu berarti perangkat nbd sekarang mendapatkan ukuran sektor logis default 1024, bukan 512 sebelumnya (cukup buruk dari sudut pandang kompatibilitas mundur).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.