GPTを使用してパーティションを分割した3TBドライブがあります。
$ 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として報告され、カーネルはパーティションテーブルを認識しなくなります(512ではなくオフセット4096のセクタ1でGPTを探しているため)。 :
$ 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がオフセット512でGPTを認識するように強制する方法はありますか?あるいは、512と4096に1つずつ2つのGPTヘッダを生成する方法はありますか、それとも互いに重複していますか?
編集:いくつかの解決策を見つけましたが、それらのどれもそれほど良くありません。
ループバックデバイスを使用してディスクを分割できます。
$ losetup /dev/loop0 /dev/sdg
ループバックデバイスのセクタサイズは常に512なので、必要に応じてデバイスを分割できます。ただし、カーネルはループバックデバイスのパーティションテーブルを認識しないため、別のループバックデバイスを作成し、パーティションサイズとオフセットを手動で指定する必要があります。
$ losetup /dev/loop1 /dev/sdg -o $((10240*512)) --sizelimit $(((5860532216-10240)*512))
これを自動化するスクリプトを書くこともできますが、自動化できればいいと思います。
nbd-server と nbd-client を実行できます。 NBDデバイスにはデフォルトで512バイトのセクタがあり、NBDデバイスは分割可能です。ただし、NBD文書では、同じマシン上でnbdサーバーとクライアントを実行しないように警告します。テスト時に、nbdクライアントはカーネルにハングしてサーバーをシャットダウンする必要がありました。
同じ設定でistgt(ユーザースペースiSCSIターゲット)を実行できます。これにより、システムに512バイトのセクタを持つ別のSCSIデバイスが提供されます。しかし、テストしたとき、これは失敗し、ext4コードでカーネルNULLポインタの逆参照が発生しました。
まだdevmapperを見ていませんが、役に立つかもしれません。
答え1
解決策が見つかりました。 kpartx というプログラムは、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
質問を投稿した後、カーネルでこれが進むにつれて、いくつかのコメントがあります。
losetup -b 4096
4.14以降、ループデバイスには512以外の論理ブロックサイズを指定できます。ループデバイスが作成されたら、ループデバイスのブロックサイズを変更することもできます。4.11以降、nbdデバイスの論理ブロックサイズは
-b
nbd-client(オプション)に渡されるブロックサイズに設定されます。デフォルトのブロックサイズが1024だったので、これはnbdデバイスが以前の512ではなく1024のデフォルトの論理セクタサイズを持っていることを意味します(下位互換性の観点から非常に悪い)。