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입니까?
편집 : 몇 가지 해결 방법을 찾았습니다.
-
루프백 장치를 사용하여 디스크를 분할 할 수 있습니다.
$ 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를 조사하지 않았지만 작동 할 수 있습니다.
답변
해결책을 찾았습니다 : 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에서 할 계획이지만 훨씬 더 깨끗합니다.
답변
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를 얻습니다 (이전 버전과의 호환성 측면에서 상당히 나쁨).