FreeBSD ZFS Увеличение размера зеркала ZFS mirror с системой в корне (zroot)

Ну что же, начнем. Подох зараза, один винт в зеркале на ZFS — ada1 — WD500….AAKS. Начал выплевывать ошибки

May  9 14:57:29 rudkovskij kernel: ahcich1: Timeout on slot 22 port 0
May  9 14:57:29 rudkovskij kernel: ahcich1: is 00000000 cs 00400000 ss 00000000 rs 00400000 tfd 58 serr 00000000 cmd 0004d617
May  9 14:57:29 rudkovskij kernel: ahcich1: Error while READ LOG EXT
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): READ_FPDMA_QUEUED. ACB: 60 57 78 4f be 40 06 00 00 00 00 00
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): CAM status: ATA Status Error
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): ATA status: 00 ()
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): RES: 00 00 00 00 00 00 00 00 00 00 00
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): Retrying command
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 07 26 c8 40 06 00 00 00 00 00
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): CAM status: ATA Status Error
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): ATA status: 00 ()
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): RES: 00 00 00 00 00 00 00 00 00 00 00
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): Retrying command
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): READ_FPDMA_QUEUED. ACB: 60 01 31 b7 83 40 02 00 00 00 00 00
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): CAM status: ATA Status Error
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): ATA status: 00 ()
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): RES: 00 00 00 00 00 00 00 00 00 00 00
May  9 14:57:29 rudkovskij kernel: (ada1:ahcich1:0:0:0): Retrying commandMay  9 14:57:29 rudkovskij kernel: ahcich1: Timeout on slot 22 port 0
May  9 14:57:29 rudkovskij kernel: ahcich1: is 00000000 cs 00400000 ss 00000000 rs 00400000 tfd 58 serr 00000000 cmd 0004d617

Насколько было обрыто инета, настолько стало ясно, что это не лечится и придется винт выводить из употребления, т.к. он тормозил дико систему своими затупами и постоянно приводил в разность контрольные суммы на зеркале. Естественно, стало ясно, что дальше так жить нельзя и спуся 3 месяца -:) наконец-то руки добрались и до него.
Не знаю как там у Вас, а у нас разднеца в покупке винта на тер и на полтера составляет ровно 200рэ. Поэтому было решено изучить вопрос миграции корня на зеркале ZFS (zfs root on ZFS mirror-0) c 500GB винтов на 1TB винты. Куплены были зеленые WD уже на плотных пластинах более новой модели, чем EARS, а конкретно WD10EZRX . Далее это счастие было приключено вот к этому серверу http://rudkovskij.com/articles/?p=610. И в итоге получилось вот так:

# camcontrol devlist
<WDC WD5000AAKS-00WWPA0 01.03B01>  at scbus0 target 0 lun 0 (ada0,pass0)
<WDC WD5000AAKS-00WWPA0 01.03B01>  at scbus1 target 0 lun 0 (ada1,pass1)
<WDC WD3200AAKS-00B3A0 01.03A01>   at scbus2 target 0 lun 0 (ada2,pass2)
<WDC WD10EZRX-00A8LB0 01.01A01>    at scbus3 target 0 lun 0 (ada3,pass3)
<WDC WD10EZRX-00A8LB0 01.01A01>    at scbus4 target 0 lun 0 (ada4,pass4)

Далее встал вопрос, как же без излишнего геморра перенесть корень со всем барахлом на эти новые винты. Порыв инет и почитав оракл доки по ZFS, оказалось, что это делается не так уж и сложно, а если точнее сказать, то совсем даже просто и быстро, если не считать время ресильвера кажного добавляемого винта в зеркальце.

Итак по порядку, что же нужно сделать для полного счастья, которое должно наступить неизбежно (Smolnyj).
1. Версия системы и zpool:

# uname -a
FreeBSD 9.2-STABLE FreeBSD 9.2-STABLE #3 r263932: Mon Mar 31 22:26:24 VLAT 2014     root@rudkovskij.com:/usr/obj/usr/src/sys/OPTIMIZED  amd64
# zpool upgrade -v
This system supports ZFS pool feature flags.
The following features are supported:
FEAT DESCRIPTION
-------------------------------------------------------------
async_destroy                         (read-only compatible)
Destroy filesystems asynchronously.
empty_bpobj                           (read-only compatible)
Snapshots use less space.
lz4_compress
LZ4 compression algorithm support.
multi_vdev_crash_dump
Crash dumps to multiple vdev pools.
spacemap_histogram                    (read-only compatible)
Spacemaps maintain space histograms.
enabled_txg                           (read-only compatible)
Record txg at which a feature is enabled
hole_birth
Retain hole birth txg for more precise zfs send
extensible_dataset
Enhanced dataset functionality, used by other features.
bookmarks                             (read-only compatible)
"zfs bookmark" command
The following legacy versions are also supported:
VER  DESCRIPTION
---  --------------------------------------------------------
1   Initial ZFS version
2   Ditto blocks (replicated metadata)
3   Hot spares and double parity RAID-Z
4   zpool history
5   Compression using the gzip algorithm
6   bootfs pool property
7   Separate intent log devices
8   Delegated administration
9   refquota and refreservation properties
10  Cache devices
11  Improved scrub performance
12  Snapshot properties
13  snapused property
14  passthrough-x aclinherit
15  user/group space accounting
16  stmf property support
17  Triple-parity RAID-Z
18  Snapshot user holds
19  Log device removal
20  Compression using zle (zero-length encoding)
21  Deduplication
22  Received properties
23  Slim ZIL
24  System attributes
25  Improved scrub stats
26  Improved snapshot deletion performance
27  Improved snapshot creation performance
28  Multiple vdev replacements
For more information on a particular version, including supported releases,
see the ZFS Administration Guide.

2. Выводим из работы ada1. Он прицеплен к зеркалу путем отвязки от настоящего имени ada1 лэйблом «disk1». Можно в принципе вообще прогнать его из пула командой «detach»

# zpool offline zroot /dev/gpt/disk1
# zpool status
pool: zroot
state: DEGRADED
............................
scan: scrub repaired 0 in 0h16m with 0 errors on Fri May 16 17:20:32 2014
config:

NAME            STATE     READ WRITE CKSUM
zroot           ONLINE       0     0     0
mirror-0      ONLINE       0     0     0
gpt/disk0  ONLINE       0     0     0
gpt/disk1  OFFLINE       0     0     0
errors: No known data errors
# zpool detach zroot /dev/gpt/disk1
# zpool status
pool: zroot
state: ONLINE
......................................
config:

NAME          STATE     READ WRITE CKSUM
zroot         ONLINE       0     0     0
gpt/disk0  ONLINE       0     0     0

3. Необходимо прояснить в каком состоянии находится опция «autoexpand» в нашем пуле, она должна быть установлена в «on» на время извращений с пулом на увеличение емкости. Включаем командой «zpool set autoexpand=on zroot»

# zpool get autoexpand
NAME   PROPERTY    VALUE   SOURCE
zroot  autoexpand  off      local
# zpool set autoexpand=on zroot

4. Готовим новые винты для добавления в зеркало-пул zroot. Создаем необходимую схему разметки, в нашем случае «GPT» и создаем необходимые разделы. Винты ada3 и ada4. При создании разделов крайне желательно для Advance Format (AF) винтов с 4к секторами начинать разметку кратно 4кB или 8 логическим секторам по 512B и размер блока ZFS ставить также 4k (опция ashift=12 это 4k, а ashift=9 это 512B). Кому неясно, как это сделать, крайне рекомендую изучить скрипт установки корня на ZFS http://rudkovskij.com/articles/?p=700:

# gpart show
=>       34  976773101  ada0  GPT  (465G)
34        222     1  freebsd-boot  (111k)
256  976772879     2  freebsd-zfs  (465G)

=>       34  976770988  ada1  GPT  (465G)
34        222     1  freebsd-boot  (111k)
256  976770766     2  freebsd-zfs  (465G)

=>        34  1953525101  ada3  GPT  (931G)
34           6        - free -  (3.0k)
40         512     1  freebsd-boot  (256k)
552  1953524576     2  freebsd-zfs  (931G)
1953525128           7        - free -  (3.5k)

=>        34  1953525101  ada4  GPT  (931G)
34           6        - free -  (3.0k)
40         512     1  freebsd-boot  (256k)
552  1953524576     2  freebsd-zfs  (931G)
1953525128           7        - free -  (3.5k)

5. Добавляем в пул zroot первый винт с именем ada3 и с отвязанным лэйблом /dev/gpt/disk10. Причем, в моем случае указание «/dev/gpt/disk0» нужно для того, чтобы zpool знал откуда ему тащить информацию для синхронизации данных (resilvering). Также при выполнении этой команды zpool вежливо напоминает, что необходимо не забыть втащить загрузчик в первый раздел нашего нового подопечного командой «gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3»

# zpool attach zroot /dev/gpt/disk0 /dev/gpt/disk10
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk '/dev/gpt/disk10'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

# zpool status
pool: zroot
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Fri May 16 23:15:03 2014
3,05M scanned out of 11,7G at 391K/s, 8h41m to go
2,93M resilvered, 0,03% done
config:

NAME            STATE     READ WRITE CKSUM
zroot           ONLINE       0     0     0
mirror-0      ONLINE       0     0     0
gpt/disk0  ONLINE       0     0     0
gpt/disk10  ONLINE       0     0     0  block size: 512B configured, 4096B native  (resilvering)

errors: No known data errors
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3

6. После ресильвера, второй винт ada4 (/dev/gpt/disk11) добавляем по той же схеме:

# zpool attach zroot /dev/gpt/disk0 /dev/gpt/disk11
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada4

7. В итоге должно выйти примерно так:

zpool status
pool: zroot
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Fri May 16 23:15:03 2014
3,05M scanned out of 11,7G at 391K/s, 8h41m to go
2,93M resilvered, 0,03% done
config:

NAME            STATE     READ WRITE CKSUM
zroot           ONLINE       0     0     0
mirror-0      ONLINE       0     0     0
gpt/disk0  ONLINE       0     0     0
gpt/disk10  ONLINE       0     0     0  block size: 512B configured, 4096B native
gpt/disk11  ONLINE       0     0     0  block size: 512B configured, 4096B native  (resilvering)

8. После ресильвера, можно вынимать ada0 (/dev/gpt/disk0) из употребления и останутся только замененные диски disk10 и disk11.

# zpool detach zroot /dev/gpt/disk0
# zpool status
..........
config:

NAME            STATE     READ WRITE CKSUM
zroot           ONLINE       0     0     0
mirror-0      ONLINE       0     0     0
gpt/disk10  ONLINE       0     0     0  block size: 512B configured, 4096B native
gpt/disk11  ONLINE       0     0     0  block size: 512B configured, 4096B native

9. После всех извратов лучшим контролем правильного выполнения задуманного будет перезагрузка машины. Итак

#shutdown -r now

9. Проверяем какой размер поднял zpool на zroot autoexpand’ом:

# zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zroot   928G  11,7G   916G     1%  1.00x  ONLINE  -

11. Как видим, прирост в полтера на зеркальце произошел. Можно теперь «autoexpand» вернуть на родину, т.е. в положение «off».

# zpool set autoexpand=off zroot
# zpool get autoexpand
NAME   PROPERTY    VALUE   SOURCE
zroot  autoexpand  off     default

12. Осталась, правда, проблема наследственная в виде 512B блока при родном в 4096B «block size: 512B configured, 4096B native», но вроде тормозов особых нет, все бегает довольно шустренько:

diskinfo -t /dev/ada3
/dev/ada3
512             # sectorsize
1000204886016   # mediasize in bytes (931G)
1953525168      # mediasize in sectors
4096            # stripesize
0               # stripeoffset
1938021         # Cylinders according to firmware.
16              # Heads according to firmware.
63              # Sectors according to firmware.
WD-WMC1U2721737 # Disk ident.

Seek times:
Full stroke:      250 iter in   7.360547 sec =   29.442 msec
Half stroke:      250 iter in   4.938607 sec =   19.754 msec
Quarter stroke:   500 iter in   7.914255 sec =   15.829 msec
Short forward:    400 iter in   0.979737 sec =    2.449 msec
Short backward:   400 iter in   3.535531 sec =    8.839 msec
Seq outer:       2048 iter in   0.398347 sec =    0.195 msec
Seq inner:       2048 iter in   0.151411 sec =    0.074 msec
Transfer rates:
outside:       102400 kbytes in   0.748073 sec =   136885 kbytes/sec
middle:        102400 kbytes in   0.860574 sec =   118990 kbytes/sec
inside:        102400 kbytes in   1.565869 sec =    65395 kbytes/sec

# dd if=/dev/zero of=/home/rudkovskij.pv/test.file bs=4k count=262144
262144+0 records in
262144+0 records out
1073741824 bytes transferred in 9.792849 secs (109645499 bytes/sec)

Вроде все. Надеюсь это поможет быстро и просто увеличить размер корневого зеркала на ZFS. И все это было не зря :-)

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

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

CAPTCHA изображение

*