Для чего это надо
Гибернация (спящий режим) — это режим выключения системы при котором её текущее состояние, включая состояние ОЗУ, сохраняется на энергонезависимое хранилище.
Этот режим при использовании совместно с Proxmox позволяет значительно ускорить процесс завершения работы основной — хост-системы без необходимости завершать работу гостевых виртуальных систем. Особенно удобно, когда в качестве гостевой системы развернуты терминальные сервера на Windows. Ведь при штатном завершении работы такой системы, в окнах пользователей появляется запрос на сохранение редактируемого документа и если у пользователя тоже отключился свет вместе с его компьютером и монитором пользователь отсутствует на месте, принудительное завершение системы вызовет предынфарктное состояние потерю редактируемых сотрудником/ми данных. Вот тут и спасет гибернация хостовых нод и после восстановления электроснабжения пользователи продолжать работать с того-же места!
Конечно, что-бы такое произошло нужно еще настроить ИБП сервера. Переход в режим гибернации удобно назначить в качестве события при разряде батареи ИБП, а благодаря скорости перехода в этот режим можно серьезно снизить требования к ёмкости его батарей.
Как это работает
Proxmox 2.2 работает на базе debian 6 и практически всё, что описано ниже в той или иной степени относится и к нему.
Активация режима гибернации требует наличия выделенного диска который будет видет GRUB напрямую при загрузке или отдельного раздела swap на таком диске. С томами находящимися внутри LVM запустить не удалось. При этом proxmox не позволяет создать нужную для такого режима структуру диска при установке. Связанно это вероятно с концепцией максимальной простоты развертывания системы с которой может справится даже домохозяйка.
Самое простое решение, это просто добавить еще один жесткий диск в сервер и назначить его хранилищем для режима гибернации, но мы рассмотрим более сложный вариант с изысканием свободного места на том-же диске куда поставился proxmox.
Исходные данные
При установке proxmox полностью задействует 1 из дисков уничтожая всю информацию на нём и создавая определенную структуру разделов:
# parted /dev/sda print free
Model: ATA WDC WD3200AAKS-7 (scsi)
Disk /dev/sda: 320GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
32.3kB 1049kB 1016kB Free Space
1 1049kB 537MB 536MB primary ext3 boot
2 537MB 320GB 320GB primary lvm
320GB 320GB 352kB Free Space
Таким образом мы узнали, что на физическом диске место не занятое под разделы составляет всего 352kB, что явно не достаточно для раздела подкачки на который система будет сохранять состояние занятой оперативной памяти при гибернации. Такой раздел должен иметь размер не менее чем размер ОЗУ ноды.
Примем, что необходимый нам размер, это 32 Гб.
Посмотрим теперь, из каких логических томов состоит наш физический том расположенный на втором разделе
# lvs
видим
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
data pve -wi-ao-- 203.09g
root pve -wi-ao-- 74.50g
swap pve -wi-ao-- 4.00g
Подготовка носителя
Выясним то, сколько свободного места уже сейчас внутри физического тома LVM2.
# pvs
Смотрим значение PFree
PV VG Fmt Attr PSize PFree
/dev/sda2 pve lvm2 a-- 297.59g 16.00g
Это значит, что мы сразу можем уменьшить раздел на физическом диске на 16.00 Гб, но наша задача получить 32 Гб, поэтому будем изыскивать дополнительные данные.
Будем обирать нужное нам пространство у логического тома data. Для этого мы уменьшим размер /dev/pve/data на 16 Гб. Данный процесс выполняется в 2 этапа. Сначала уменьшается размер файловой системы, а уже затем уменьшается размер самого логического тома. Так как процедура потенциально не безопасная, то будет выполнено отмонтирование файловой системы на период ресайзинга, соответственно все виртуальные машины, расположенные в /var/lib/vz должны быть остановлены на это время.
# lvresize /dev/pve/data -r -L-16Gb
Do you want to unmount "/var/lib/vz"? [Y|n] Ответим y
Теперь вновь выполним
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 pve lvm2 a-- 297.59g 32.00g
Мы видим, что объем свободного места внутри физического тома возрос до 32 Гб.
Теперь мы можем спокойно сократить его размер размер на размер доступного свободного места + 1 Гб для подстраховки:
Подсчитаем итоговый размер физического тома 297-32+1=266
# pvresize /dev/sda2 --setphysicalvolumesize 266Gb
Вновь посмотрим, что у нас получилось
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 pve lvm2 a-- 266.00g 412.00m
Размер физического тома LVM сократился на:
297.59 — 266 + 0.412 = 32,002 Гб
Но несмотря на это, размер раздела содержащего структуру LVM на жестком диске остался неизменным:
# parted /dev/sda print free
Number Start End Size Type File system Flags
32.3kB 1049kB 1016kB Free Space
1 1049kB 537MB 536MB primary ext3 boot
2 537MB 320GB 320GB primary lvm
320GB 320GB 352kB Free Space
Это нас не устраивает, так как необходимо получить свободное место под новый раздел в таблице разделов физического диска.
На данный момент не удалось обнаружить готовых утилит, способных изменять разделы содержащие структуру lvm2, поэтому просто удалим и заново создадим раздел на жестком диске с началом как у исходного но меньшего размера. Это потенциально довольно опасная процедура.
Рассчитаем параметры 2-го раздела, который мы в результате хотим получить. Он должен быть меньше текущего на 32 Гб
320 — 32 = 288 Гб
Таким образом 2-й раздел будет иметь параметры:
Тип primary
Начало 537MB
Конец 288Gb
Удалим раздел 2 подверждая игнорирование предупреждений
# parted /dev/sda rm 2
Создаем раздел заного, но меньшего размера чем было
# parted /dev/sda mkpart primary 537MB 288GB
Назначим флаг lvm разделу
# parted /dev/sda set 2 lvm on
Смотрим результат
# parted /dev/sda print free
Видим, что на физическом диске появилось свободное место под будущий раздел
Number Start End Size Type File system Flags
32.3kB 1049kB 1016kB Free Space
1 1049kB 537MB 536MB primary ext3 boot
2 537MB 288GB 287GB primary lvm
288GB 320GB 32.1GB Free Space
Создаем раздел типа swap. Его параметры:
Тип primary
fs linux-swap
Начало 288GB
Конец 320GB
Выполним:
# parted /dev/sda mkpart primary linux-swap 288GB 320GB
# mkswap /dev/sda3
Подготовительная работа закончена и теперь можно приступать непосредственно к настройке гибернации
Активация hibernate
Установка компонентов
# apt-get update
# apt-get install pm-utils
Добавление параметров в grub и fstab
# echo 'GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda3"' >> /etc/default/grub
# echo '/dev/sda3 none swap sw 0 0' >> /etc/fstab
Подключим новый раздел в качестве файла подкачки к системе
# swapon /dev/sda3
Обновим загрузчик
# update-grub
Можно приступать к тестированию непосредственно режима гибернации. Но прежде очень желательно выполнить перезагрузку сервера, если такая возможность имеется, так как произошли довольно серьезные изменения в структуре носителя!
# reboot
Выполним полную гибернацию с выключением питания системы
# pm-hibernate
Теперь осталось назначить выполнение этой команды при событии разряда батареи на ИБП, но это уже другая история которую я надеюсь опишу в следующей статье.
Все вышеописаное проверено на свежеустановленом proxmox 2.2
Автор: siv237