異なる論理セクターサイズで作成されたGPTパーティションテーブルを認識する


9

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が報告され、カーネルはパーティションテーブルを認識しなくなります(セクター1でGPTを探しているため、512ではなくオフセット4096になっています)。

$ 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の2つのGPTヘッダーを作成する方法はありますか、それとも重複しますか?

編集:私はいくつかの回避策を見つけましたが、どれも非常に良いものではありません:

  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ターゲット)を実行できます。これにより、512バイトのセクターを持つ別のSCSIデバイスがシステムに提示されます。ただし、テスト時には失敗し、ext4コードでカーネルNULLポインター逆参照が発生しました。

  4. 私はまだdevmapperを調査していませんが、うまくいくかもしれません。


1
:このブログ記事を参照してくださいgoughlui.com/2013/10/02/...
fpmurphy

回答:


3

私は解決策を見つけました: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パーティションごとに...デバイスを。

質問を投稿してから、カーネルのその前線で状況が変化したため、いくつかの注意事項があります。

  • 4.14以降、ループデバイス(losetup -b 4096たとえば)に512以外の論理ブロックサイズを指定することもできます。作成されたループデバイスのブロックサイズを変更することもできます。

  • 4.11以降、nbdデバイスの論理ブロックサイズは、nbd-client(-bオプション)に渡されるブロックサイズに設定されます。デフォルトのブロックサイズは1024だったので、これはnbdデバイスが512の代わりにデフォルトの論理セクターサイズ1024を取得することを意味します(下位互換性の観点からかなり悪い)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.