다른 논리 섹터 크기로 작성된 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

오프셋 512에서 Linux가 GPT를 인식하도록 할 수있는 방법이 있습니까? 또는 두 개의 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 대상)를 실행할 수 있습니다. 이것은 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.