Nhận biết bảng phân vùng GPT được tạo với kích thước khu vực logic khác nhau


9

Tôi có ổ đĩa 3TB mà tôi đã phân vùng bằng GPT:

$ 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

Tuy nhiên, khi tôi kết nối nó qua bộ điều hợp USB, nó báo cáo kích thước khu vực logic là 4096 và hạt nhân không còn nhận ra bảng phân vùng (vì nó đang tìm GPT ở khu vực 1, hiện tại đã được bù 4096 thay vì 512):

$ 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

Có cách nào để buộc Linux nhận ra GPT ở offset 512 không? Ngoài ra, có cách nào để tạo hai tiêu đề GPT, một tại 512 và một tại 4096, hoặc chúng sẽ chồng lấp?

EDIT: Tôi đã tìm thấy một vài cách giải quyết, không có cách nào tốt cả:

  1. Tôi có thể sử dụng một thiết bị loopback để phân vùng đĩa:

    $ losetup /dev/loop0 /dev/sdg
    

    Các thiết bị loopback luôn có kích thước cung từ 512, vì vậy điều này cho phép tôi phân vùng thiết bị theo cách tôi muốn. Tuy nhiên, kernel không nhận ra các bảng phân vùng trên các thiết bị loopback, vì vậy tôi phải tạo một thiết bị loopback khác và chỉ định thủ công kích thước phân vùng và offset:

    $ losetup /dev/loop1 /dev/sdg -o $((10240*512)) --sizelimit $(((5860532216-10240)*512))
    

    Tôi có thể viết một kịch bản để tự động hóa điều này, nhưng thật tuyệt khi có thể tự động làm nó.

  2. Tôi có thể chạy nbd-server và nbd-client; Các thiết bị NBD có các cung 512 byte theo mặc định và các thiết bị NBD có thể phân vùng được. Tuy nhiên, tài liệu NBD cảnh báo không chạy máy chủ nbd và máy khách trên cùng một hệ thống; Khi kiểm tra, máy khách nbd trong kernel bị treo và tôi phải giết máy chủ.

  3. Tôi có thể chạy istgt (mục tiêu iSCSI không gian người dùng), sử dụng cùng một thiết lập. Điều này trình bày một thiết bị SCSI khác cho hệ thống với các cung từ 512 byte. Tuy nhiên, khi kiểm tra, điều này đã thất bại và gây ra sự thiếu sót của con trỏ NULL trong mã ext4.

  4. Tôi chưa điều tra devmapper, nhưng nó có thể hoạt động.


1
Xem bài đăng trên blog này: goughlui.com/2013/10/02/ Lời
fpmurphy

Câu trả lời:


3

Tôi đã tìm thấy một giải pháp: Một chương trình có tên kpartx, là chương trình không gian người dùng sử dụng devmapper để tạo phân vùng từ các thiết bị loopback, hoạt động rất tốt:

$ 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

Điều này về cơ bản thực hiện những gì tôi đã dự định làm trong tùy chọn 1, nhưng sạch sẽ hơn nhiều.


2

Trên Linux, các thiết bị lặp có thể phân vùng được nếu max_parttham số của loopmô-đun hạt nhân được đặt. Nếu loopđược tích hợp sẵn (không phải mô-đun), bạn có thể truyền loop.max_part=31tham số dòng lệnh kernel.

Vì vậy, sau khi bạn đã cấu hình looptrình điều khiển để có được các thiết bị khối có thể phân vùng, việc này chỉ là vấn đề:

losetup --show -f /dev/sda

Để có được một số /dev/loopXp1, /dev/loopXp2... thiết bị cho mỗi phân vùng.

Một vài lưu ý khi mọi thứ đã phát triển ở mặt trước đó trong kernel kể từ khi bạn đăng câu hỏi của mình:

  • kể từ 4.14, cũng có thể chỉ định kích thước khối logic khác với 512 cho các thiết bị lặp ( losetup -b 4096ví dụ). Cũng có thể thay đổi kích thước khối của thiết bị lặp sau khi thiết bị được tạo.

  • kể từ 4.11, kích thước khối logic của các thiết bị nbd được đặt thành kích thước khối được truyền cho nbd-client ( -btùy chọn). Vì kích thước khối mặc định là (và là) 1024, điều đó có nghĩa là các thiết bị nbd hiện có kích thước khu vực logic mặc định là 1024 thay vì 512 trước đây (khá tệ từ quan điểm tương thích ngược).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.