Была задача уменьшить объем диска, который используется у клиента на VM в yandex cloud, по причине того что он отжирает много денег, но по факту не используется.
Документация yandex говорит, что у них нет функционала уменьшения диска, только увеличение. И единственный способ это сделать, это создать новую VM с нужным размером диска и перенести данные на нее. После чего удалить старую VM.
Мне не хотелось заниматься полной настройкой новой VM, чтобы перенести данные туда и сервер работал точно так же как старый, поэтому я выбрал метод клонирования диска.
Метод заключается в следующих шагах:
- Создаем новый диск, нужной нам величины и подключаем его к старой VM
- Размечаем диск точно так же, как это сделано на старой VM. В моем случае это было 2 раздела: vda1 — это BIOS boot и vda2 — Linux filesystem. Через fdisk создаем точно такие же разделы. Далее через mkfs создаем файловую систему на втором разделе.
- После того как файловая система есть, маунтим ее в какой-нибудь временный каталог и делаем полное копирование всего диска (файлов) через rsync (`rsync -avxHAX —progress`)
- Далее после того как все файлы скопировались, меняем файл /etc/fstab на новом диске, указав UID нового диска для загрузки
- Следующим шагом — это пересобрать grub для нового диска, чтобы он загрузился именно с этого диска:
# mount --bind /dev /mnt/newfisk/dev
# mount --bind /dev/pts /mnt/newfisk/dev/pts
# mount --bind /proc /mnt/newfisk/proc
# mount --bind /sys /mnt/newfisk/sys
# chroot /mnt/newfisk
Где /mnt/newfisk — это замаунченный новый диск, куда мы скопировали все файлы со старого диска.
После того как зашли в chroot, пересобираем grub
# grub-install /dev/vdb1
# update-grub
Новый диск потенциально готов. Отключаем старую виртуалку и отсоединяем от него наш новый диск. И вот тут есть момент, который не удобен. Нельзя такой диск напрямую подключить как загрузочный диск к новой виртуалке или поменять загрузочный диск на старой виртуалке. Этот новый диск исключительно для подключения к уже готовой VM. Но если с этого диска сделать snapshot или образ, то уже можно создать виртуалку с этого снимка или образа, чем я и воспользовался. Снял с нового диска snapshot.
Затем создаем новую vm, с нужными характиристиками железа, но вместо дефолтного диска используем снятый snapshot. И это работает, новая vm создается из snaphot и успешно запускается.
Единственный момент, который я еще сделал во время создания, это отвзял старый ip адрес от старой vm и добавил его для новой, чтобы не перенастраивать домены.
Все, после проделанных манипуляций, у нас новая vm, с диском меньшего размера, но с полным содержимым из старой vm, у нас остался тот же самый ip и те же настройки, ничего не надо перетаскивать вручную. Старую vm и временный новый диск, из которого мы создали snapshot можно удалять.


No comments
RSS / trackback