Ну что же, начнем. Подох зараза, один винт в зеркале на 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. И все это было не зря