Как я спасал систему, или переносим старую FreeBSD на zfs
Данный пост рассказывает о опыте миграции давно установленной FreeBSD на современные типы разметок. Так будет рассмотрена следующая цепочка:
1) Есть исходня система на gmirror
2) Уходим от gmirror на один диск
3) Переносим систему на zfs диск
4) Создаём массив и добавляем gpt диск
5) Заменяем диск из пункта 3 gpt диском
Дано:
Как говорится, пока петух не клюнет, ничего не произойдёт... Вот и у меня и смарт показывал всё хорошо, и gmirror на 2х дисках, и так далее... И вот однажды я заметил что у меня работает только оидн диск. Более того, при попытки ввести второй диск в массив - система зависала, а в логах была вот такая ошибка:
Поиск в инете быстро дал ответ на вопрос - такая проблема весьма часто встречается с винтами фирмы WD, который у меня и стоитApr 6 00:12:33 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:36 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:38 stat kernel: (ada0:ahcich0:0:0:0): Retrying command
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 20 5f 89 2a 40 01 00 00 00 00 00
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): RES: 41 40 5f 89 2a 40 01 00 00 00 00
Apr 6 00:12:40 stat kernel: (ada0:ahcich0:0:0:0): Error 5, Retries exhausted
Apr 6 00:12:40 stat kernel: GEOM_MIRROR: Request failed (error=5). ada0[READ(offset=10017226240, length=16384)]
Apr 6 00:12:40 stat kernel: g_vfs_done():mirror/gm0s1d[READ(offset=353517568, length=16384)]error = 5
Играния с биосом и прочими настройками не дали никаких положительных результатов. Акронисы, dd и прочие утилиты диск копировать не хотели. Развалить и заново собрать рейд тоже не помогло.<WDC WD5003ABYX-01WERA1 01.01S02> ATA-8 SATA 2.x device
Serial Number WD-WMAYP5387574
300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
Command Queueing enabled
476940MB (976773168 512 byte sectors: 16H 63S/T 16383C)
Итак вернулись к началу - система работает на одном винте.
Разваливаем gmirror
Если уж работать с одним жёским, то делать это проще без прослоек, то есть откатываемся в древнии времени - переходим на один диск. Сделать это не сложно - открываем статью по настройке gmirror, и делаем всё наоборот - выключаем подгрузку модуля ядра и в /etc/fstab прописываем загрузку с диска. Перезагружаемся.
Мигрируем на zfs
Итак, у меня есть система, которая работает, но которую я не могу никак скопировать, судя по всему из-за ошибок на диске (сувать в регенераторы я его боюсь, ибо инфы там куча и с нуля не настроить) - мне надо как-то обмануть систему, желательно теми средствами, о которых она и не подозревает. На ум приходит новомодная и нашумевшая zfs - в её сторону и начнём копать.
За основу взял вот эту статью http://www.lissyara.su/articles/freebsd ... fs_to_zfs/ в качестве подсказок пришлось пользоваться вот этим http://rtfm.co.ua/freebsd-gpart-primer- ... s-diskami/
Проясним:
1) FreeBSD stat.stniva.ru 9.2-STABLE FreeBSD 9.2-STABLE #8 r260583
2) /dev/ada0 - это наш винт, на котором работает фря
3) /dev/ada1 - это наш новый винт - он такого же размера, как и первый. Винты 500
4) rootFS - это наша "виртуальная" система - назвать можете как заходите
Поехали:
Как и написано в статье сначало добавляем в конфиги загрузку zfs
в файл /boot/loader.conf добавляем
Код: Выделить всё
zfs_load="YES"
vfs.root.mountfrom="zfs:rootFS"
и в файл /etc/rc.conf добавляем
Код: Выделить всё
zfs_enable="YES"
Теперь в статье советуют переделать загрузчик - я сделал, но кажется что он мне ничего не поменял (у меня модуль был уже загружен), но делается это быстро - так что лучше перестраховаться - добавляем в /etc/make.conf
Код: Выделить всё
LOADER_ZFS_SUPPORT=yes
Код: Выделить всё
cd /usr/src/sys/boot && make obj depend all install
Код: Выделить всё
zpool create rootFS /dev/ada1
Код: Выделить всё
zpool export rootFS
Код: Выделить всё
dd if=/boot/zfsboot of=/dev/ada1 bs=512 count=1
dd if=/boot/zfsboot of=/dev/ada1 bs=512 skip=1 seek=1024
Код: Выделить всё
zpool import rootFS
Код: Выделить всё
zfs set mountpoint=none rootFS
Код: Выделить всё
mount -t zfs rootFS /mnt/
Код: Выделить всё
#dump -0Lf - / | (cd /mnt/; restore -rf -)
#dump -0Lf - /usr | (cd /mnt/usr/; restore -rf -)
#dump -0Lf - /usr/home | (cd /mnt/usr/home/; restore -rf -)
#dump -0Lf - /var | (cd /mnt/var/; restore -rf -)
#dump -0Lf - /tmp | (cd /mnt/tmp/; restore -rf -)
После чего мы перегружаемся. Старый винт можно вытащить (он был в первом гнезде), новый переставить (из второго в первое гнездо) и загрузиться. Получается что мы загрузимся с нового винта, а старый целый пока что лежит с копией.
У меня загрузилось без проблем и я увидел вот такую картину:
Код: Выделить всё
stat# zpool status
pool: rootFS
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
ada0 ONLINE 0 0 0
errors: No known data errors
stat#
Разметка нового диска в GPT
Итак, в нулевом разъёме стоит винт с zfs а в первый (второй по счёту в сервере) вставлен новый винт. Посмотрим что на нём
Код: Выделить всё
stat# gpart show
=> 63 976773105 ada1 MBR (465G)
63 976751937 1 freebsd [active] (465G)
976752000 21168 - free - (10M)
=> 0 976751937 ada1s1 BSD (465G)
0 2097152 1 freebsd-ufs (1.0G)
2097152 16777216 2 freebsd-swap (8.0G)
18874368 419430400 4 freebsd-ufs (200G)
438304768 20971520 5 freebsd-ufs (10G)
459276288 419430400 6 freebsd-ufs (200G)
878706688 98045249 7 freebsd-ufs (46G)
Сначало надо удалить разделы, а потом очистить винт
Код: Выделить всё
stat# gpart delete -i 1 ada1
ada1s1 deleted
stat# gpart destroy ada1
ada1 destroyed
Код: Выделить всё
stat# gpart create -s gpt ada1
ada1 created
stat# gpart add -b 34 -s 64k -t freebsd-boot ada1
ada1p1 added
stat# gpart add -t freebsd-zfs -l disk0 ada1
ada1p2 added
Код: Выделить всё
stat# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
stat#
Теперь добавим наш второй винт в массив
Код: Выделить всё
stat# zpool attach rootFS /dev/ada0 /dev/gpt/disk0
Код: Выделить всё
stat# zpool status
pool: rootFS
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 Thu Apr 10 11:43:30 2014
103G scanned out of 357G at 65.8M/s, 1h5m to go
103G resilvered, 28.80% done
config:
NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0 (resilvering)
errors: No known data errors
stat#
Через время всё ставновится хорошо
Код: Выделить всё
stat# zpool status
pool: rootFS
state: ONLINE
scan: resilvered 357G in 1h52m with 0 errors on Thu Apr 10 13:35:35 2014
config:
NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
errors: No known data errors
stat#
Выводим обычный диск из работы
Сейчас у нас в массиве 2 диска, причём один обычный, а второй на gpt разделе. Хочется привести это как-то к общему знаменателю, и наверное предпостение отдадим более прогрессивным технологиям - то есть gpt оставим.
Выводим из работы наш обычный винт
Код: Выделить всё
zpool detach rootFS ada0
Код: Выделить всё
stat# zpool status
pool: rootFS
state: ONLINE
scan: resilvered 357G in 1h52m with 0 errors on Thu Apr 10 13:35:35 2014
config:
NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
errors: No known data errors
stat#
Разметка и добавление нового диска:
И вот настало время нашего первого диска, который за время этих эксперементов проверился и вроде как даже исправил что-то там - какраз опробуем. Прям на горячую суём новый диск
Код: Выделить всё
Apr 11 12:34:08 stat kernel: ada1 at ahcich1 bus 0 scbus2 target 0 lun 0
Apr 11 12:34:08 stat kernel: ada1: <WDC WD5003ABYX-01WERA1 01.01S02> ATA-8 SATA 2.x device
Apr 11 12:34:08 stat kernel: ada1: Serial Number WD-WMAYP5387574
Apr 11 12:34:08 stat kernel: ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
Apr 11 12:34:08 stat kernel: ada1: Command Queueing enabled
Apr 11 12:34:08 stat kernel: ada1: 476940MB (976773168 512 byte sectors: 16H 63S/T 16383C)
Apr 11 12:34:08 stat kernel: ada1: Previously was known as ad6
Смотрим что есть (я вам для разнообразия покажу уже размеченый ранее GPT диск)
Код: Выделить всё
stat# gpart show
=> 34 976773101 ada0 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)
=> 34 976773101 ada1 GPT (465G)
34 128 1 freebsd-boot (64k)
162 976772973 2 freebsd-zfs (465G)
stat#
Код: Выделить всё
stat# gpart delete -i 1 ada1
ada1p1 deleted
stat# gpart delete -i 2 ada1
ada1p2 deleted
stat#
Код: Выделить всё
stat# gpart create -s gpt ada1
gpart: geom 'ada1': File exists
stat# gpart add -b 34 -s 64k -t freebsd-boot ada1
ada1p1 added
stat# gpart add -t freebsd-zfs -l disk1 ada1
ada1p2 added
stat# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode written to ada1
stat#
Теперь вводим этот новый диск в массив
Код: Выделить всё
zpool attach rootFS /dev/gpt/disk0 /dev/gpt/disk1
Код: Выделить всё
stat# zpool status
pool: rootFS
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 Apr 11 14:14:37 2014
6.19G scanned out of 357G at 32.5M/s, 3h3m to go
6.19G resilvered, 1.74% done
config:
NAME STATE READ WRITE CKSUM
rootFS ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
gpt/disk0 ONLINE 0 0 0
gpt/disk1 ONLINE 0 0 0 (resilvering)
errors: No known data errors
stat#
1) у нас в массиве 2 диска
2) они оба имеют gpt разметку
3) на второй диск синхронизируются данные (resilvering)
4) статус синхранизации 1.74%
Ждум завершения работы, но уже можно начинать радоваться
Итог:
Результатом этой статьи стало:
1) мы переехали на более современную и менее чувствительную к внезапным выключениям файловую систему ZFS
2) мы собрали много разных разделов разделов в один (помните у нас заканчивалось место когда мы ядро обновляли)
3) ма переехали на более современную разметку GPT