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