다양한 논리적 섹터 크기로 생성된 GPT 파티션 테이블 식별

다양한 논리적 섹터 크기로 생성된 GPT 파티션 테이블 식별

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에 하나씩 두 개의 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

해결책을 찾았습니다. 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경우 커널 명령줄 인수를 전달할 수 있습니다.looploop.max_part=31

따라서 loop파티션 가능한 블록 장치를 얻기 위해 드라이버를 구성한 후 다음을 수행하십시오.

losetup --show -f /dev/sda

/dev/loopXp1각 파티션에 대해 일부 ... 장치를 얻으려면 ./dev/loopXp2

질문을 게시한 이후 커널에서 이것이 발전함에 따라 몇 가지 의견이 있습니다.

  • losetup -b 40964.14부터는 루프 장치에 대해 512(예:) 이외의 논리 블록 크기를 지정할 수도 있습니다 . 루프 장치가 생성된 후 루프 장치의 블록 크기를 변경할 수도 있습니다.

  • 4.11부터 nbd 장치의 논리적 블록 크기는 -bnbd-client(옵션)에 전달된 블록 크기로 설정됩니다. 기본 블록 크기가 1024였기 때문에 이는 nbd 장치가 이제 이전 512 대신 1024의 기본 논리 섹터 크기를 가짐을 의미합니다(하위 호환성 관점에서 매우 나쁨).

관련 정보