Skip to main content

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:~#