В статье мы рассмотрим как с помощью панели 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. У нас возникает два варианта как сделать это:
- остановить VM и изменить диск ROOT или DATA с 10 до 20 GB, затем подключить свободное пространство (диск ROOT менять нельзя, если машина создана из шаблона);
- добавить в VM еще один диск размером 10GB (DATA диск) и подключить дисковое пространство.
Вариант 1 оставляет Вас с одним диском и требует перезагрузки, а вариант 2 позволяет вам добавить дополнительное место без перезагрузки VM. Итак, давайте посмотрим на диски нашей VM. Для начала перейдем в панель управления VM в Cloudstack: теперь нажмем на ссылку «Вид Значения» чтобы увидеть тома виртуальной машины. По клику должна открыться панель томов данной VM: в которой мы видим один ROOT диск, относящийся к виртуальной машине. Для начала рассмотрим Вариант 2 расширения дискового пространства (добавлением диска).
Добавление тома DATA к виртуальной машине
Для добавления тома необходимо кликнуть по кнопке «Добавить том» и, указав параметры добавляемого тома, добавить его: Теперь данный том необходимо подключить к Вашей VM. Для этого необходимо выбрать данный том (DATA1-10GB) и нажать на кнопку, которая выглядит как скрепочка с плюсом, в диалоге выбрать Вашу VM: Итак, подключили. Дальнейшие действия необходимо выполнять непосредственно в виртуальной машине, подключившись к ней по SSH. Первое, что необходимо сделать — убедиться что устройство появилось. Для этого можно открыть это устройство с помощью cfdisk (устройство номер 2 будет называться /dev/vdb, 3 — /dev/vdc и т.п.).
# cfdisk /dev/vdb
При этом вы должны увидеть интерфейс следующего вида: Создаем раздел на весь диск и сохраняем изменения. Теперь мы должны данный раздел подключить к 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: Жмем «ОК». Теперь наш том DATA1-10GB занимает 20GB. Стартуем VM, будем подключать свободные 10GB к LVM. Сначала запустим cfdisk и создадим раздел /dev/vdb2.
# cfdisk /dev/vdb
При этом вы должны увидеть интерфейс следующего вида: Как можно увидеть образовалось свободное пространство 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.