2010-03-15

FreeBSD, переводим живую фс на журнал

В общем то тривиальная операция, но решил на память записать:

Итаг, задача.

Нужно к живой фс (2 Tb) прикрутить журнал (gjournal), ибо при нештатном выключении fsck занимает достаточно долгое время, чтобы пользователи начали орать в стиле: "Аааааааа, где наша почта!!!! Отдел ИТ казлы!!!!!". Background fsck + soft updates не решение, ибо пока раздел чекается при загруженной системе, работать с почтой невозможно, ибо все аццки тупит. Ибо, ибо...пора завязывать с этим словечком...Так вот, нужен журнал (который,кстати, все равно не отменяет fsck). Под это дело мудрые разработчики придумали gjournal. В процессе действия я еще переведу раздел на gpt (просто захотелось экспы)

Сложность заключается в том, что все это я провернул из дома, т.к. сидеть в выходные на работе не хотелось. Спас отца русской демократии ip-kvm.
Поехали:

flanker# uname -a
FreeBSD flanker.domain.ru 7.2-RELEASE-p7 FreeBSD 7.2-RELEASE-p7 #0: Fri Mar 12 14:18:18 MSK 2010     root@flanker.domain.ru:/usr/obj/usr/src/sys/FLANKER-2010-03-12  i386
# Переводим систему в single mode
flanker# shutdown now
# Теперь в single mode (надо консоль, ssh не будет,у меня ip-kvm)
# отмонтируем нужный раздел (у меня var)
# Кстате, здесь у меня наступил тупняк, я запустил dump в multiuser, но он повис..
# Причем повис так, что даже init не смог его убить. Написал ему kill -9, но он никак не отреагировал, из-за этого не давало отмонтировать var.
# Спустя 20 минут сервак очнулся..фух...
flanker# umount /var
# Дампим текущую фс куда-нить, я заблаговременно подключил терабайтник и смонтировал его в /backup + ночью до этого у меня вся почта забэкапилась на другой сервак, так, на всякий случай.
flanker# dump -0 -f - /dev/aacd1s1d > /backup/var.img
# Ждал около часа (хотя в сумме там 300 гигов всего)
# Все, дамп сделался, теперь курочим разделы
# Создадим таблицу GUID разделов, -f говорит, что надо затереть mbr
flanker# gpt create -f /dev/aacd1
# Теперь нарезаем разделы (на журнал я сделал 10 гигов, с огромным запасом)
# -s это размер в секторах (512 байт на сектор)
# Надо -s == (10G * 1024^3) / 512 == 20971520
flanker# gpt add -s 20971520 -t ufs aacd1
# Далее раздел под собственно сами данные, -s не указываем - утилита сделает максимально возможный по объему раздел
flanker# gpt add -t ufs aacd1
# Посмотрим что получилось
flanker# gpt show aacd1
start        size         index  contents
0            1                   PMBR
1            1                   Pri GPT header
2            32                  Pri GPT table
34           20971520     1      GPT part - FreeBSD UFS/UFS2
20971554     2908897213   2      GPT part - FreeBSD UFS/UFS2
2929868767   32                  Sec GPT table
2929868799   1                   Sec GPT header
flanker# ls -l /dev/aacd1*
crw-r-----  1 root  operator    0,  77 Mar 13 14:09 /dev/aacd1
crw-r-----  1 root  operator    0,  87 Mar 13 14:16 /dev/aacd1p1
crw-r-----  1 root  operator    0,  98 Mar 13 14:16 /dev/aacd1p2
# Отлично, сделаем ufs на разделе с данными
# -J - флаг журнала, O2 - UFS2 (хотя можно и не указывать, это дефолтно), 
# Soft Updates нафиг не нужны c журналом
flanker# newfs -J -O2 /dev/aacd1p2
# Все, сделали фс, посмотрим что как на всякий случай:
flanker# tunefs -p aacd1p2
tunefs: ACLs: (-a)                                         disabled
tunefs: MAC multilabel: (-l)                               disabled
tunefs: soft updates: (-n)                                 disabled
tunefs: gjournal: (-J)                                     enabled
tunefs: maximum blocks per file in a cylinder group: (-e)  2048
tunefs: average file size: (-f)                            16384
tunefs: average number of files in a directory: (-s)       64
tunefs: minimum percentage of free space: (-m)             8%
tunefs: optimization preference: (-o)                      time
tunefs: volume label: (-L)
# Так, все хорошо. Прикрутим журнал
# Маленькой отступление - я журнал вкомпилировал в ведро
# Добавил туда, хотя хэндбук говорит только про 2 опцию, которая по дефолту в ядре
# options         GEOM_JOURNAL            # GEOM class for journaling
# options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling
# Кому влом пересобирать ядро надо
# 1. kldload /boot/kernel/geom_journal.ko
# 2. echo geom_journal_load="YES" >> /boot/loader.conf
# Итак, непосредственно включаем журналирование:
# первый идет провайдер данных, второй провайдер журнала!
flanker# gjournal label /dev/aacd1p2 /dev/aacd1p1
# Усе, получили журналируемую файловую систему, смонтируем ее
flanker# mount /dev/aacd1p2.journal /var
# Ресторим на нее дамп
flanker# cd /var
flanker# restore -vrf /backup/var.img
# Правим fstab
flanker# vim /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
...
# Важно поменять pass с 2 на 1
/dev/aacd1p2.journal    /var            ufs     rw,async        1       1
# Выходим в multiuser
flanker# exit
# PROFIT!!!
Вот и прикрутили журнал к фс на серваке, без потери аптайма =)

6 комментариев:

olegk комментирует...

не совсем понял про живой сервак без потери аптайма. Ты же грузил сервак в сингл-мод - уже нифига не живой, он пользователям в это время недоступен.

Артем комментирует...

Ну в общем да, на горячуюю не поменяешь, я в том смысле что аптайм у сервака сохранился...

Анонимный комментирует...

Действительно интересно. Побольше бы таких статей.

Анонимный комментирует...

Очень интересная статья. Скажите, а могу ли я ее повесить на один из своих сайтов? Соотвественно с гиперсылкой на вас.

Анонимный комментирует...

Спасибо понравилось !

Анонимный комментирует...

Хороший у вас блог! удачи в развитии