Исходные данные: в пуле с дисками 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.