Замена диска в пуле, если пул на slice’е

Исходные данные: в пуле с дисками 500Gb построенном на slice’ах вылетел один из дисков. Новый диск — 2Tb. И так:

# zpool status rpool
  pool: rpool
 state: DEGRADED
status: One or more devices are unavailable in response to persistent errors.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or 'fmadm repaired', or replace the device
        with 'zpool replace'.
        Run 'zpool status -v' to see device specific details.
  scan: resilvered 2.20G in 4m56s with 0 errors on Fri Jan 18 07:07:30 2019

config:

        NAME          STATE      READ WRITE CKSUM
        rpool         DEGRADED      0     0     0
          mirror-0    DEGRADED      0     0     0
            c3t1d0s0  UNAVAIL       0     0     0
            c3t0d0s0  ONLINE        0     0     0

errors: No known data errors


Казалось бы, ничего сложного: создаём слайс, и добавляем. Но тут есть подвох. Во-первых, нужно делать метки в формате SMI (старый формат, времён 10-11.0), а во вторых, разделы format создаёт не все и нужно не просто создать вручную, но и вычислить его размер.

Приступаем:

# format -e c3t1d0
selecting c3t1d0 c3t1d0: configured with capacity of 1.82TB

[disk formatted]

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk 
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector 
        label      - write label to the disk   
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels  
        verify     - read and display labels   
        inquiry    - show disk ID
        scsi       - independent SCSI mode selects
        cache      - enable, disable or query SCSI disk cache
        volname    - set 8-character volume name
        !     - execute , then return
        quit
format> fdisk
No fdisk table exists. The default partition for the disk is:

  a 100% "SOLARIS System" partition

Type "y" to accept the default partition,  otherwise type "n" to edit the
 partition table.
y
format> la
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 0
Ready to label disk, continue? yes
format> quit

Пробуем добавить:

zpool replace rpool c3t1d0s0
Unable to build pool from specified devices: cannot open '/dev/dsk/c3t1d0s0': I/O error

Посмотрим что с разделами (slice’ами):

# format -e c3t1d0
selecting c3t1d0 
[disk formatted]

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        inquiry    - show disk ID
        scsi       - independent SCSI mode selects
        cache      - enable, disable or query SCSI disk cache
        volname    - set 8-character volume name
        !     - execute , then return
        quit
format> p

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        9      - change `9' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        ! - execute , then return
        quit
partition> p
Current partition table (original):
Total disk cylinders available: 60797 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0 unassigned    wm       0                0         (0/0/0)              0
  1 unassigned    wm       0                0         (0/0/0)              0
  2     backup    wu       0 - 60796        1.82TB    (60797/0/0) 3906815220
  3 unassigned    wm       0                0         (0/0/0)              0
  4 unassigned    wm       0                0         (0/0/0)              0
  5 unassigned    wm       0                0         (0/0/0)              0
  6 unassigned    wm       0                0         (0/0/0)              0
  7 unassigned    wm       0                0         (0/0/0)              0
  8       boot    wu       0 -     0       31.38MB    (1/0/0)          64260
  9 unassigned    wm       0                0         (0/0/0)              0

А теперь сравним этот же вывод с выводом рабочего диска c3t0d0:

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       1 - 30397      232.85GB    (30397/0/0) 488327805
  1 unassigned    wu       0                0         (0/0/0)             0
  2     backup    wu       0 - 30399      232.88GB    (30400/0/0) 488376000
  3 unassigned    wu       0                0         (0/0/0)             0
  4 unassigned    wu       0                0         (0/0/0)             0
  5 unassigned    wu       0                0         (0/0/0)             0
  6 unassigned    wu       0                0         (0/0/0)             0
  7 unassigned    wu       0                0         (0/0/0)             0
  8       boot    wu       0 -     0        7.84MB    (1/0/0)         16065
  9 unassigned    wu       0                0         (0/0/0)             0

То есть нам всего-то нужно отредактировать раздел «0«. Приступаем:

partition> p
Current partition table (original):
Total disk cylinders available: 60797 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0 unassigned    wm       0                0         (0/0/0)              0
  1 unassigned    wm       0                0         (0/0/0)              0
  2     backup    wu       0 - 60796        1.82TB    (60797/0/0) 3906815220
  3 unassigned    wm       0                0         (0/0/0)              0
  4 unassigned    wm       0                0         (0/0/0)              0
  5 unassigned    wm       0                0         (0/0/0)              0
  6 unassigned    wm       0                0         (0/0/0)              0
  7 unassigned    wm       0                0         (0/0/0)              0
  8       boot    wu       0 -     0       31.38MB    (1/0/0)          64260
  9 unassigned    wm       0                0         (0/0/0)              0

partition> 0
Part      Tag    Flag     Cylinders         Size            Blocks
  0 unassigned    wm       0                0         (0/0/0)              0

Enter partition id tag[unassigned]: root
Enter partition permission flags[wm]:
Enter new starting cyl[1]:
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb, 0.00tb]: 3906622440b
partition> p
Current partition table (unnamed):
Total disk cylinders available: 60797 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       1 - 60794        1.82TB    (60794/0/0) 3906622440
  1 unassigned    wm       0                0         (0/0/0)              0
  2     backup    wu       0 - 60796        1.82TB    (60797/0/0) 3906815220
  3 unassigned    wm       0                0         (0/0/0)              0
  4 unassigned    wm       0                0         (0/0/0)              0
  5 unassigned    wm       0                0         (0/0/0)              0
  6 unassigned    wm       0                0         (0/0/0)              0
  7 unassigned    wm       0                0         (0/0/0)              0
  8       boot    wu       0 -     0       31.38MB    (1/0/0)          64260
  9 unassigned    wm       0                0         (0/0/0)              0

Откуда мы взяли число 3906622440? Это разница между количеством блоков раздела 2 (3906815220) и утроенным размером раздела 8 (64260 * 3). Выходим и смотрим:

# prtvtoc /dev/rdsk/c3t1d0s0
* /dev/rdsk/c3t1d0s0 partition map
*
* Dimensions:
*     512 bytes/sector
*     252 sectors/track
*     255 tracks/cylinder
*   64260 sectors/cylinder
*   60799 cylinders
*   60797 accessible cylinders
*
* Flags:
*   1: unmountable
*  10: read-only
*
* Unallocated space:
*       First     Sector    Last
*       Sector     Count    Sector
*       64260 3906750960 3906815219
*
*                          First     Sector    Last
* Partition  Tag  Flags    Sector     Count    Sector  Mount Directory
       2      5    01          0 3906815220 3906815219
       8      1    01          0     64260     64259

А раздела-то 2! Хотя должно быть 3! Ну что ж, будем вручную делать 3-ий. Посмотрим, как выглядит структура на рабочем диске:

# prtvtoc /dev/rdsk/c3t0d0s0
* /dev/rdsk/c3t0d0s0 partition map
*
* Dimensions:
*     512 bytes/sector
*      63 sectors/track
*     255 tracks/cylinder
*   16065 sectors/cylinder
*   60800 cylinders
*   60798 accessible cylinders
*
* Flags:
*   1: unmountable
*  10: read-only
*
* Unallocated space:
*       First     Sector    Last
*       Sector     Count    Sector
*   488343870 488376000 976719869
*
*                          First     Sector    Last
* Partition  Tag  Flags    Sector     Count    Sector  Mount Directory
       0      2    00      16065 488327805 488343869
       2      5    01          0 488376000 488375999
       8      1    01          0     16065     16064

То есть, нам всего-то нужно подобрать блоки в первой строке для нового диска (так как Partition, Tag Flags ставим такие же как и в рабочем диске). «Не сложно заметить», что разница в колонке Last Sector между разделами 2 и 0 даёт удвоенный результат Sector Count в разделе 8. Вычисляем для нового диска:

3906815219-64260*2=3906686699

Так же «легко» заметить, что разница Sector Count между разделом 2 и 0 равна утроенному значению Sector Count раздела 8. Вычисляем и его:

3906815220-64260*3=3906622440

Итого, получаем следующую структуру для нового диска:

*                          First     Sector    Last
* Partition  Tag  Flags    Sector     Count    Sector  Mount Directory
       0      2    00      64260 3906622440 3906686699
       2      5    01          0 3906815220 3906815219
       8      1    01          0     64260     64259

Сохраняем в файл и пишем новую разметку на диск и выполняем замену:

# cat c3t1d0s0.txt | fmthard -s - /dev/rdsk/c3t1d0s2
# zpool replace rpool c3t1d0s0
Make sure to wait until resilver is done before rebooting.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *