среда, 27 мая 2009 г.

Подкачка и дамп в ZFS root pool

В некоторых случаях миграции с UFS на ZFS посредством Live Upgrade возникает необходимость полностью освободить устройство, на котором находился UFS boot environment.

На практике, однако, иногда возможно столкнуться с ситуацией, когда мигрировать приходится дважды. Скажем, по схеме UFS BE->old ZFS BE->new ZFS BE. Например, для последовательной миграции сначала на ZFS root pool и последующего апгрейда ОС с возвращением ее на первоначальный жесткий диск уже с другой файловой системой. Особенно если второй и третий шаг выполняется со слайсами 0 на весь объем дисков.

При этом иногда происходит следующее. Первый переход выполняется сравнительно беспроблемно, однако при попытке удаления старого root pool происходит ошибка - dataset busy.

Если посмотреть на содержимое файловых систем ZFS, можно заметить, что на старом томе остались dump и swap устройства. Причем на новом rpool их нет.

Попытка избавиться от занятости датасета, в общем, удается. Перезапускаем систему, стартуем ее с нового rpool - вуаля, старый rpool удаляется.

Однако новая система неожиданно оказывается без подкачки и dump-устройства.

# swap -l

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

Первым это обнаруживает Oracle - он начинает стартовать необычно долго.

top показывает отсутствие подкачки в принципе.

Можно ли в такой ситуации что-нибудь втереть, или вправить или еще что-нибудь?

Оказывается, можно.

Перво-наперво, идем сюда и читаем мануалы:

Номер 1
Номер 2

Что из них следует? Следует то, что можно (и нужно) попробовать создать датасеты для подкачки и дампа и присоединить их к работающей системе и действующему rpool.

Как это сделать?

Сначала создадим dump:

zfs create -V 4G -b 128k rpool/dump

(для примера - в нашей системе 4 Гб ОЗУ, отсюда размер датасета - кстати, его можно на ZFS rpool легко изменить, если, разумеется, есть свободное место)

Далее, используя dumpadm, добавляем созданный датасет как дамп-устройство в действующий root pool:

# dumpadm
Dump content: kernel pages
Dump device: /dev/zvol/dsk/rpool/dump (dedicated)
Savecore directory: /var/crash/athena

используя в качестве целевого устройства вот это логическое имя: /dev/zvol/dsk/rpool/dump

Замечание: Можно не добавлять дамп-датасет в /etc/dumpadm.conf. Как показала практика, его достаточно создать с именем <имя rpool>/dump, перезагрузиться и он будет подключен к системе автоматически.

Далее создаем датасет для подкачки:

# zfs create -V 8G -b 8k rpool/swap

Внимательно смотрим на размеры блока - для SPARC он должен быть равен 8k, для x86 - 4k. Размер области подкачки примем равным (в нашем случае) двум объемам физической памяти. Так надо.

Осталось последнее - подключить swap к системе:

# swap -a /dev/zvol/dsk/rpool/swap

и сделать запись (если ее вдруг не окажется там) в /etc/vfstab:

/dev/zvol/dsk/rpool/swap - - swap - no -


Данную запись нужно поставить раньше, чем запись

swap - /tmp tmpfs - yes -

Это обеспечит нам автоматическое монтирование датасета подкачки при перезагрузке.

Вуаля - у нас подключена подкачка и dump-устройство. Можно выполнить zfs list и убедиться, что новые датасеты стали частью системы, а swap -l показывает активное устройство подкачки.

PS. Насколько быстро работает подкачка на датасете ZFS? Говорят, быстро. До сих пор мне не доводилось видеть начинающуюся подкачку на системах с ZFS. Системы на ZFS, по моим наблюдениям, вообще в принципе становятся более стрессоустойчивыми.