Гибернация на PROXMOX2

Источник: habrahabr
siv237

Для чего это надо


Гибернация (спящий режим) - это режим выключения системы при котором её текущее состояние, включая состояние ОЗУ, сохраняется на энергонезависимое хранилище. 

Этот режим при использовании совместно с Proxmox позволяет значительно ускорить процесс завершения работы основной - хост-системы без необходимости завершать работу гостевых виртуальных систем. Особенно удобно, когда в качестве гостевой системы развернуты терминальные сервера на Windows. Ведь при штатном завершении работы такой системы, в окнах пользователей появляется запрос на сохранение редактируемого документа и если у пользователя тоже отключился свет вместе с его компьютером и монитором пользователь отсутствует на месте, принудительное завершение системы вызоветпредынфарктное состояние потерю редактируемых сотрудником/ми данных. Вот тут и спасет гибернация хостовых нод и после восстановления электроснабжения пользователи смогут продолжить работать с того-же места!
Конечно, что-бы такое произошло нужно еще настроить ИБП сервера. Переход в режим гибернации удобно назначить в качестве события при разряде батареи ИБП, а благодаря скорости перехода в этот режим можно серьезно снизить требования к ёмкости его батарей.

Как это работает


Proxmox 2.2 работает на базе debian 6 и практически всё, что описано ниже в той или иной степени относится и к нему.

Активация режима гибернации требует наличия выделенного диска который будет виден GRUB напрямую при загрузке или отдельного раздела swap на системном диске. С логическим томом 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

Теперь осталось назначить выполнение этой команды при событии разряда батареи на ИБП, но это уже другая история которую я надеюсь опишу в следующей статье.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=31193