Работа с дисковыми устройствами в Cloudstack и подключение пространства к файловой системе ОС Linux

1778.cloudstack.png-1024x0 В статье мы рассмотрим как с помощью панели Cloudstack можно управлять дисковым пространством виртуальных машин под управлением ОС Linux. Мы рассматриваем Linux поскольку это основная операционная система, используемая нашими клиентами в облаке, для остальных операционных систем Вы можете использовать аналогичные подходы, будут отличаться лишь инструменты. В случае же с Linux такие задачи возникают ежедневно и мы бы хотели предложить клиентам подробные инструкции по решению.

Внимание! Поскольку операции с дисковыми устройствами и файловыми системами могут нанести непоправимый ущерб вашим данным, то мы рекомендуем перед выполнением приведенных ниже операций сделать резервную копию всех необходимых данных VM или сделать снимок диска (дисков) в Cloudstack.

Итак, мы рассмотрим несколько способов добавления дискового пространства к виртуальной машине. Уменьшение дискового пространства — сложный процесс, который требует высокой квалификации от системного администратора и может привести к полной утрате ваших данных, поэтому мы его рассматривать не будем. Все данные способы требуют, чтобы операционная система была установлена на диск под управлением системы LVM2. К слову, шаблоны CentOS, Debian, Ubuntu, которые мы предоставляем клиентам организованы именно таким образом. Начнем, в Cloudstack каждая виртуальная машина может иметь два типа дисков:

  • ROOT — диск, который выделяется при создании системы из шаблона или ISO;
  • DATA — диск, который присоединяется к VM дополнительно.

В настоящее время пользователь может одновременно присоединить к VM до 4х дисков (ROOT + 3 DATA), но мы бы рекомендовали ограничиваться 3мя, чтобы всегда был резерв, на всякий случай. Так же, необходимо знать, что в нашем облаке предоставляется два типа дисков SSD (10, 20, 60 GB) и SAS (120, 250 GB), первые значительно превосходят в производительности вторые, но имеют меньший объем. Вы можете одновременно использовать диски и первого и второго типа, однако, надо понимать, что их производительность отличается и в рамках одной файловой системы не рекомендуется их смешивать, однако, если вы, например, хотите использовать большой диск для хранения медиа и малый, быстрый диск для хранения данных СУБД, это можно организовать (но в данном руководстве рассматривается тот случай, когда мы хотим расширить единую универсальную файловую систему, в которой хранится все). Итак, предположим для начала, что Вы  установили VM под управлением CentOS, Debian или Ubuntu из шаблона. В итоге, у Вас будет виртуальная машина, установленная на диск размером 10GB. Допустим, что мы хотим увеличить доступное свободное место с 10 до 20 GB. У нас возникает два варианта как сделать это:

  1. остановить VM и изменить диск ROOT или DATA с 10 до 20 GB, затем подключить свободное пространство (диск ROOT менять нельзя, если машина создана из шаблона);
  2. добавить в VM еще один диск размером 10GB (DATA диск) и подключить дисковое пространство.

Вариант 1 оставляет Вас с одним диском и требует перезагрузки, а вариант 2 позволяет вам добавить дополнительное место без перезагрузки VM. Итак, давайте посмотрим на диски нашей VM. Для начала перейдем в панель управления VM в Cloudstack: space-1теперь нажмем на ссылку «Вид Значения» чтобы увидеть тома виртуальной машины. По клику должна открыться панель томов данной VM: space-2 в которой мы видим один ROOT диск, относящийся к виртуальной машине. Для начала рассмотрим Вариант 2 расширения дискового пространства (добавлением диска).

Добавление тома DATA к виртуальной машине

Для добавления тома необходимо кликнуть по кнопке «Добавить том» и, указав параметры добавляемого тома, добавить его: space-3 Теперь данный том необходимо подключить к Вашей VM. Для этого необходимо выбрать данный том (DATA1-10GB) и нажать на кнопку, которая выглядит как скрепочка с плюсом, в диалоге выбрать Вашу VM: space-4 Итак, подключили. Дальнейшие действия необходимо выполнять непосредственно в виртуальной машине, подключившись к ней по SSH. Первое, что необходимо сделать — убедиться что устройство появилось. Для этого можно открыть это устройство с помощью cfdisk (устройство номер 2 будет называться /dev/vdb, 3 — /dev/vdc и т.п.).

# cfdisk /dev/vdb

При этом вы должны увидеть интерфейс следующего вида: space-5 Создаем раздел на весь диск и сохраняем изменения. Теперь мы должны данный раздел подключить к LVM2. Для этого необходимо выполнить следующие команды:

#-- пересканируем разделы
# partprobe

#-- создаем новый физический том /dev/vdb1
# pvcreate /dev/vdb1

#-- убеждаемся что он появился в списке томов
# pvs

#-- запрашиваем группы томов
# vgs
 VG #PV #LV #SN Attr VSize VFree
 ubuntu1404-template1-vg 1 2 0 wz--n- 9,76g 0 

#-- в моем случае у меня 1 группа томов - ubuntu1404-template1-vg
#-- подключим физический том /dev/vdb1 к этой группе
# vgextend ubuntu1404-template1-vg /dev/vdb1
 Volume group "ubuntu1404-template1-vg" successfully extended

#-- посмотрим какие есть логические тома
# lvs
 LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
 root ubuntu1404-template1-vg -wi-ao--- 8,76g 
 swap_1 ubuntu1404-template1-vg -wi-ao--- 1,00g 

#-- добавим пространство к тому root
# lvextend ubuntu1404-template1-vg/root -l+100%FREE

#-- выполним еще раз lvs чтобы убедиться что к тому root добавилось 10GB
# lvs
 LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
 root ubuntu1404-template1-vg -wi-ao--- 18,75g 
 swap_1 ubuntu1404-template1-vg -wi-ao--- 1,00g 

#-- теперь расширим файловую систему, чтобы добавить к ней свободное место
# resize2fs /dev/ubuntu1404-template1-vg/root
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/ubuntu1404-template1-vg/root is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/ubuntu1404-template1-vg/root is now 4916224 blocks long.

#-- выполним df -h чтобы убедиться, что место появилось
# df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/mapper/ubuntu1404--template1--vg-root 19G 1,1G 17G 6% /
none 4,0K 0 4,0K 0% /sys/fs/cgroup
udev 991M 4,0K 991M 1% /dev
tmpfs 201M 376K 200M 1% /run
none 5,0M 0 5,0M 0% /run/lock
none 1001M 0 1001M 0% /run/shm
none 100M 0 100M 0% /run/user
/dev/vda1 236M 37M 188M 17% /boot

Теперь расмотрим первый (1) вариант с расширением диска.

Расширение тома ROOT/DATA и подключение свободного места

Данный вариант требует перезагрузки системы и менее удобен, однако он может быть необходим в том случае, если машина уже имеет максимальное количество дисков, а свободное пространство необходимо увеличивать. Итак, сначала необходимо остановить машины через панель Cloudstack. Остановив, переходим к томам VM и выбираем том DATA1-10GB. Нажимаем на кнопочку (Resize volume) и выбираем 20GB SSD RAID: space-6 Жмем «ОК». Теперь наш том DATA1-10GB занимает 20GB. Стартуем VM, будем подключать свободные 10GB к LVM. Сначала запустим cfdisk и создадим раздел /dev/vdb2.

# cfdisk /dev/vdb

При этом вы должны увидеть интерфейс следующего вида:space-7   Как можно увидеть образовалось свободное пространство 10 GB. Создаем раздел /dev/vdb2 и сохраняем изменения. Теперь подключим /dev/vdb2 к LVM2

#-- пересканируем разделы
# partprobe

#-- создаем новый физический том /dev/vdb2
# pvcreate /dev/vdb2

#-- убеждаемся что он появился в списке томов
# pvs

#-- запрашиваем группы томов
# vgs

#-- в моем случае у меня 1 группа томов - ubuntu1404-template1-vg
#-- подключим физический том /dev/vdb1 к этой группе
# vgextend ubuntu1404-template1-vg /dev/vdb2
 Volume group "ubuntu1404-template1-vg" successfully extended

#-- посмотрим какие есть логические тома
# lvs
 LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
 root ubuntu1404-template1-vg -wi-ao--- 8,76g 
 swap_1 ubuntu1404-template1-vg -wi-ao--- 1,00g 

#-- добавим пространство к тому root
# lvextend ubuntu1404-template1-vg/root -l+100%FREE

#-- выполним еще раз lvs чтобы убедиться что к тому root добавилось 10GB
# lvs
 LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert
 root ubuntu1404-template1-vg -wi-ao--- 28,75g 
 swap_1 ubuntu1404-template1-vg -wi-ao--- 1,00g 
#-- теперь расширим файловую систему, чтобы добавить к ней свободное место
# resize2fs /dev/ubuntu1404-template1-vg/root
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/ubuntu1404-template1-vg/root is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/ubuntu1404-template1-vg/root is now 7536640 blocks long.
#-- выполним df -h чтобы убедиться, что место появилось
# df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/mapper/ubuntu1404--template1--vg-root 29G 1,1G 27G 4% /
none 4,0K 0 4,0K 0% /sys/fs/cgroup
udev 991M 4,0K 991M 1% /dev
tmpfs 201M 380K 200M 1% /run
none 5,0M 0 5,0M 0% /run/lock
none 1001M 0 1001M 0% /run/shm
none 100M 0 100M 0% /run/user
/dev/vda1 236M 37M 188M 17% /boot

В итоге, рассмотрим третий вариант — добавление нового диска DATA2 размером 60GB и вытеснение DATA1 с последующим удалением.

Добавление диска DATA2-60GB Вытеснение диска DATA1

Идем в панель Cloudstack и добавляем в VM еще один диск DATA2-60GB. Дальше все по старой схеме:

# cfdisk /dev/vdc

Обратите внимание — третий диск /dev/vdc. Создаем раздел /dev/vdc1.

#-- пересканируем разделы
# partprobe

#-- создаем новый физический том /dev/vdc1
# pvcreate /dev/vdc1

#-- убеждаемся что он появился в списке томов
# pvs

#-- запрашиваем группы томов
# vgs

#-- в моем случае у меня 1 группа томов - ubuntu1404-template1-vg
#-- подключим физический том /dev/vdc1 к этой группе
# vgextend ubuntu1404-template1-vg /dev/vdc1
 Volume group "ubuntu1404-template1-vg" successfully extended

А дальше мы вытесним и удалим /dev/vdb1 и /dev/vdb2:

#-- вытесним данные с физических томов /dev/vdb1 и /dev/vdb2
# pvmove /dev/vdb1
 /dev/vdb1: Moved: 0,1%
 /dev/vdb1: Moved: 2,6%
 /dev/vdb1: Moved: 5,7%
 /dev/vdb1: Moved: 8,2%
 /dev/vdb1: Moved: 10,6%
 /dev/vdb1: Moved: 13,1%
 /dev/vdb1: Moved: 15,5%
 /dev/vdb1: Moved: 18,1%
 /dev/vdb1: Moved: 20,5%
 /dev/vdb1: Moved: 22,7%
 /dev/vdb1: Moved: 25,2%
...
#-- отключаем физические тома от группы
# vgreduce ubuntu1404-template1-vg /dev/vdb1

# pvmove /dev/vdb2
 /dev/vdb2: Moved: 0,1%
 /dev/vdb2: Moved: 2,6%
 /dev/vdb2: Moved: 5,7%
 /dev/vdb2: Moved: 8,2%
 /dev/vdb2: Moved: 10,6%
 /dev/vdb2: Moved: 13,1%
 /dev/vdb2: Moved: 15,5%
 /dev/vdb2: Moved: 18,1%
 /dev/vdb2: Moved: 20,5%
 /dev/vdb2: Moved: 22,7%
 /dev/vdb2: Moved: 25,2%
...

#-- отключаем физические тома от группы
# vgreduce ubuntu1404-template1-vg /dev/vdb2

#-- удаляем физические тома
# pvremove /dev/vdb1
# pvremove /dev/vdb2

Теперь том DATA1-10GB можно отключить от VM. В данной статье мы научились увеличивать дисковое пространство VM и гибко управлять его выделением и распределением. За подробной информацией рекомендуем обратиться к документации по менеджеру томов LVM2.