ZFS vol + volsize = большая проблема

…или занудный пост о пользе снэпшотов и вреде от упрощения администрирования…
Дано: Solaris 11, iSCSI target (которые новые уже, с sbd* и it*), том ZFS (создан давно, работает), роздан по iSCSI на Win 2003 (далее в примере – рабочая солярка 11.2 с последними патчами, без данных CU, для быстрой оценки перспектив восстановления, в процессе были получены совсем любопытные результаты).
root@snooky:~# zfs get volsize storarray/test_vol
NAME PROPERTY VALUE SOURCE
storarray/test_vol volsize 512M local
Надо увеличить размер тома. Совсем просто:
root@snooky:~# zfs set volsize=1024K storarray/test_vol
root@snooky:~# zfs get volsize storarray/test_vol
NAME PROPERTY VALUE SOURCE
storarray/test_vol volsize 1M local
Вместо 1024M поставили 1024K.
Тома с данными больше нет.
Возврат значений, прочие игрища ни к чему не приведут – том – потерян, данные подлежат восстановлению с бэкапа.
Есть, правда, один нюанс – мгновенные снимки перед началом проведения любой операции. Работают безотказно, проверено, но, увы, не всегда они есть…
Далее простыня с игрушками, картина с IT + win + NTFS еще более удручающая и намного менее наглядная:
root@snooky:~# zfs create -V 512M storarray/test_vol
root@snooky:~# zfs get volsize storarray/test_vol
NAME PROPERTY VALUE SOURCE
storarray/test_vol volsize 512M local
root@snooky:~# newfs /dev/zvol/rdsk/storarray/test_vol
newfs: construct a new file system /dev/zvol/rdsk/storarray/test_vol: (y/n)? y
Warning: 2082 sector(s) in last cylinder unallocated
/dev/zvol/rdsk/storarray/test_vol: 1048542 sectors in 171 cylinders of 48 tracks, 128 sectors
512.0MB in 13 cyl groups (14 c/g, 42.00MB/g, 20160 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 86176, 172320, 258464, 344608, 430752, 516896, 603040, 689184, 775328,
861472, 947616, 1033760
root@snooky:~# fsck /dev/zvol/rdsk/storarray/test_vol
** /dev/zvol/rdsk/storarray/test_vol
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3a - Check Connectivity
** Phase 3b - Verify Shadows/ACLs
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cylinder Groups
2 files, 9 used, 491277 free (21 frags, 61407 blocks, 0.0% fragmentation)
root@snooky:~# zfs snapshot storarray/test_vol@backup
root@snooky:~# zfs list -r -t volume,snapshot storarray/test_vol
NAME USED AVAIL REFER MOUNTPOINT
storarray/test_vol 562M 1.45T 33.7M -
storarray/test_vol@backup 0 - 33.7M -
root@snooky:~# zfs set volsize=1024K storarray/test_vol
root@snooky:~# zfs get volsize storarray/test_vol
NAME PROPERTY VALUE SOURCE
storarray/test_vol volsize 1M local
root@snooky:~# zfs list -r -t volume,snapshot storarray/test_vol
NAME USED AVAIL REFER MOUNTPOINT
storarray/test_vol 35.0M 1.45T 1.07M -
storarray/test_vol@backup 32.7M - 33.7M -
root@snooky:~# fsck -n /dev/zvol/rdsk/storarray/test_vol
** /dev/zvol/rdsk/storarray/test_vol (NO WRITE)
CANNOT READ: DISK BLOCK 1033760: I/O error
CONTINUE? no
Program terminated
root@snooky:~# zfs set volsize=512M storarray/test_vol
root@snooky:~# fsck -n /dev/zvol/rdsk/storarray/test_vol
** /dev/zvol/rdsk/storarray/test_vol (NO WRITE)
BAD SUPERBLOCK AT BLOCK 16: BAD VALUES IN SUPER BLOCK
LOOK FOR ALTERNATE SUPERBLOCKS WITH MKFS? no
LOOK FOR ALTERNATE SUPERBLOCKS WITH NEWFS? no
SEARCH FOR ALTERNATE SUPERBLOCKS FAILED.
USE GENERIC SUPERBLOCK FROM MKFS? no
USE GENERIC SUPERBLOCK FROM NEWFS? no
SEARCH FOR ALTERNATE SUPERBLOCKS FAILED. YOU MUST USE THE -o b OPTION
TO FSCK TO SPECIFY THE LOCATION OF A VALID ALTERNATE SUPERBLOCK TO
SUPPLY NEEDED INFORMATION; SEE fsck(1M).
root@snooky:~# zfs list -r -t volume,snapshot storarray/test_vol
NAME USED AVAIL REFER MOUNTPOINT
storarray/test_vol 562M 1.45T 1.07M -
storarray/test_vol@backup 32.7M - 33.7M -
root@snooky:~# zfs rollback storarray/test_vol@backup
root@snooky:~# fsck -y /dev/zvol/rdsk/storarray/test_vol
** /dev/zvol/rdsk/storarray/test_vol
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3a - Check Connectivity
** Phase 3b - Verify Shadows/ACLs
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cylinder Groups
2 files, 9 used, 491277 free (21 frags, 61407 blocks, 0.0% fragmentation)
root@snooky:~#
Далее – продолжаем с rpool/dump:
root@snooky:~# zfs get referenced,refreservation,used,volsize rpool/dump
NAME PROPERTY VALUE SOURCE
rpool/dump referenced 3.98G -
rpool/dump refreservation 4.11G local
rpool/dump used 4.11G -
rpool/dump volsize 3.98G local
root@snooky:~# zfs set volsize=512K rpool/dump
cannot set property for 'rpool/dump': 'volsize' must be a multiple of volume block size (1M)
root@snooky:~# zfs set volsize=1M rpool/dump
root@snooky:~# zfs get referenced,refreservation,used,volsize rpool/dump
NAME PROPERTY VALUE SOURCE
rpool/dump referenced 1.02M -
rpool/dump refreservation 1.25M local
rpool/dump used 1.25M -
rpool/dump volsize 1M local
root@snooky:~# savecore
savecore: bad magic number 6c064000
savecore: Failed to read valid dump header from dump file /dev/zvol/dsk/rpool/dump
root@snooky:~# savecore -L
dumping to /dev/zvol/dsk/rpool/dump, offset 65536, content: kernel sections: zfs
0:01 0% done (kernel)
0:01 0% done (zfs)
0% done: 0 (kernel) + 0 (zfs) pages dumped, dump failed: error 5
savecore: bad magic number 6d808000
savecore: Failed to read valid dump header from dump file /dev/zvol/dsk/rpool/dump
root@snooky:~# zfs set volsize=4G rpool/dump
cannot set property for 'rpool/dump': out of space
root@snooky:~# zpool list rpool
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 298G 49.3G 248G 16% 1.00x ONLINE -
root@snooky:~# zfs set volsize=200M rpool/dump
cannot set property for 'rpool/dump': out of space
root@snooky:~# zfs get referenced,refreservation,used,volsize rpool/dump
NAME PROPERTY VALUE SOURCE
rpool/dump referenced 1.02M -
rpool/dump refreservation 4.13G local
rpool/dump used 4.13G -
rpool/dump volsize 1M local
root@snooky:~#
out of space?! WTF?!
root@snooky:~# zfs destroy rpool/dump
cannot destroy 'rpool/dump': volume is busy
root@snooky:~# zfs create -V 4G rpool/dump1
root@snooky:~# dumpadm
Dump content : kernel with ZFS metadata
Dump device : /dev/zvol/dsk/rpool/dump (dedicated)
Savecore directory: /var/crash
Savecore enabled : yes
Save compressed : on
root@snooky:~# dumpadm -d /dev/zvol/dsk/rpool/dump1
Dump content : kernel with ZFS metadata
Dump device : /dev/zvol/dsk/rpool/dump1 (dedicated)
Savecore directory: /var/crash
Savecore enabled : yes
Save compressed : on
root@snooky:~# zfs set volsize=200M rpool/dump
root@snooky:~# zfs set volsize=4G rpool/dump
root@snooky:~#