Как я диск уменьшил в виртуалке под Hyper-V 2019
Появилась задача - уменьшить диск у виртуалки. Виртуалка - видеорегистратор на ubuntu 18 по управлением Hyper-V 2019,
с очень большим выделенным диском. Часть нагрузки с нее ушла, поэтому диск хотелось бы уменьшить,
чтобы освобожденное дисковое пространство передать другим виртуалкам. Не все пошло по плану, хочу рассказать.
Появилась задача - уменьшить диск у виртуалки. Виртуалка - видеорегистратор на ubuntu 18 по управлением Hyper-V 2019,
с очень большим выделенным диском. Часть нагрузки с нее ушла, поэтому диск хотелось бы уменьшить,
чтобы освобожденное дисковое пространство передать другим виртуалкам. Не все пошло по плану, хочу рассказать.
Итак дано. Виртуалка на ubuntu. Диск на 9Tb, занято примерно 3.5. Диск один раз уже уменьшался, до этого был 13Tb
но процесс до конца доведен не был, файл vhdx так и остался занимать 13Tb - сейчас уже не вспомню,
но вроде в процессе прошлого обрезания тоже все пошло не гладко, кстати именно поэтому хочу записать этот процесс,
чтобы в следующий раз вспомнить. Сразу предупреждаю - поскольку диски большие процесс занял очень много времени.
План вкратце такой.
1. Уменьшаем размер файловой системы внутри операционки
2. Уменьшаем размер партиций внутри операционки.
3. Уменьшаем размер диска в Hyper-V.
4. Уменьшаем размер файла vhdx в Hyper-V
1. Уменьшаем размер файловой системы внутри операционки
2. Уменьшаем размер партиций внутри операционки.
3. Уменьшаем размер диска в Hyper-V.
4. Уменьшаем размер файла vhdx в Hyper-V
Работоспособностью сервера было решено пренебречь :). Могу сказать что в итоге он не работал больше суток.
Поэтому смело грузимся с live-cd (я подсунул установщик ubuntu 18.04, и когда он предложил выбрать язык нажал
alt+F2 чтобы переключится в другую консоль и манипуляции проводил там).
У меня диск был разбит на два раздела, sda1=/boot/efi и sda2=/, уменьшать будем соответственно только sda2.
У меня диск был разбит на два раздела, sda1=/boot/efi и sda2=/, уменьшать будем соответственно только sda2.
ОБЯЗАТЕЛЬНО! Соберите и сохраните всю информацию о партициях, мне она пригодилась :)
запускаем fdisk и даем команду
p
чтобы получить информацию о партициях и диске,
затем команды i
для каждого раздела
Command (m for help): p Disk /dev/sda: 8.8 TiB, 9663676416000 bytes, 18874368000 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: gpt Disk identifier: 63A76DC1-85D9-3E40-936B-54362F2150A4 Device Start End Sectors Size Type /dev/sda1 2048 1050623 1048576 512M Microsoft basic data /dev/sda2 1050624 18874367966 18873317343 8.8T Linux filesystem Command (m for help): i Partition number (1,2, default 2): 1 Device: /dev/sda1 Start: 2048 End: 1050623 Sectors: 1048576 Size: 512M Type: Microsoft basic data Type-UUID: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 UUID: F751756E-5E67-4E26-A8B3-66550F08D938 Command (m for help): i Partition number (1,2, default 2): 2 Device: /dev/sda2 Start: 1050624 End: 18874367966 Sectors: 18873317343 Size: 8.8T Type: Linux filesystem Type-UUID: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 UUID: C32B4C20-A8C4-9C45-BEEF-12814AF24AFD Command (m for help):
Первым делом проверяем файловую систему:
Именно так, а не как я попытался на скрине :)
далее даем команду на изменение размера файловой системы
e2fsck -f /dev/sda2
Именно так, а не как я попытался на скрине :)
далее даем команду на изменение размера файловой системы
resize2fs /dev/sda2 4100G
Мне не хотелось высчитывать точные значения и/или столкнутся с тем что у resize2fs и fdisk разные
представления о том сколько в килобайте байтов ;) поэтому решил файловую систему отрезать на 4100G
(занято было, повторюсь, около 3.5Тб) а раздел потом обрезать на 4500G, потом соответственно все выровнять
Процедура очень долгая. После успешного завершения будем резать раздел.
Для этого его сначала удаляем (даем в fdisk'е команду
Затем сохраняем инфу на диск командой
d
, и указываем 2
-й раздел)
затем создаем на его месте меньший по размеру - даем команду n
, указываем что это 2
-й раздел,
указываем начальный сектор - у меня по умолчанию, указываем размер +4500G
.Затем сохраняем инфу на диск командой
w
при этом fdisk увидит, что там есть файловая система и когда
он спросит удалить ли ее - говорим чтобы не удалял! пишем N
Теперь начинаем работать в Hyper-v (я через powershell)
У меня виртуалка называется
Видим - Hyper-V понимает что диск размечен только на 4.5Тб (MinimumSize) пользуемся этим и даем такую команду
У меня виртуалка называется
UNIFY-G3
поэтому даю такую командуGet-VM -VMName UNIFY-G3 | Select-Object VMId | Get-VHDБерем оттуда путь к vhdx диску
Видим - Hyper-V понимает что диск размечен только на 4.5Тб (MinimumSize) пользуемся этим и даем такую команду
Resize-VHD -Path 'C:\CM\UNIFY-G3\Virtual Hard Disks\UNIFY-G3-1.vhdx' -ToMinimumSize
После завершения вижу что размер уменьшился, но физически файл занимает те же 13Tb
Даем команду.
Сервер не включается. Идем в консоль и видим что как будто не видит вообще диска. М-да...
Подключаем установочный диск, загружаемся в установку, потом alt+f2 - уходим в соседнюю консоль, и смотрим что же там произошло такого. К сожалению, я не заскриншотил экранчики (сами понимаете наверно, не до того было :) ) поэтому опишу примерно, а скриншоты покажу похожие
В общем я запустил fdisk и увидел что у меня вообще нет никакой разметки на диске, как будто он пустой, более того он был в режиме mbr
Optimize-VHD -Path "C:\CM\UNIFY-G3\Virtual Hard Disks\UNIFY-G3-1.vhdx"Обламываемся. Выключаем виртуалку полностью. Запускаем команду снова. Долго ждем пока отработает, потом проверяем - ура! Размер файла уменьшился. Вроде добились своего. Включаем виртуалку, и....
Сервер не включается. Идем в консоль и видим что как будто не видит вообще диска. М-да...
Подключаем установочный диск, загружаемся в установку, потом alt+f2 - уходим в соседнюю консоль, и смотрим что же там произошло такого. К сожалению, я не заскриншотил экранчики (сами понимаете наверно, не до того было :) ) поэтому опишу примерно, а скриншоты покажу похожие
В общем я запустил fdisk и увидел что у меня вообще нет никакой разметки на диске, как будто он пустой, более того он был в режиме mbr
Command (m for help): p Disk /dev/sdb: 4.4 TiB, 4832376144384 bytes, 9438234657 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0xee218c86 Command (m for help):
И вот тут меня очень выручило то что я заранее записал и сохранил все данные о диске и партициях
Переводим диск в режим gpt (командой
g
)
Command (m for help): g Created a new GPT disklabel (GUID: DA3F8AA3-4842-7C48-A88F-34FB588072C6). Command (m for help):
Затем воссоздал разделы. Первый раздел точно такой же как был (указал первый и последний сектор),
второй на все оставшееся место. Когда спросил надо ли убрать существующую сигнатуру - сказал нет
Command (m for help): n Partition number (1-128, default 1): 1 First sector (2048-9438234623, default 2048): 2048 Last sector, +sectors or +size{K,M,G,T,P} (2048-9438234623, default 9438234623): 1050623 Created a new partition 1 of type 'Linux filesystem' and of size 512 MiB. Command (m for help): n Partition number (2-128, default 2): 2 First sector (1050624-9438234623, default 1050624): 1050624 Last sector, +sectors or +size{K,M,G,T,P} (1050624-9438234623, default 9438234623): Created a new partition 2 of type 'Linux filesystem' and of size 4.4 TiB. Partition #2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N Command (m for help):
Затем у первого раздела поменял тип с дефолтного 'Linux filesystem' на 'Microsoft basic data'
(команда
t
, затем номер раздела 1
и тип 11
- полный список
можно посмотреть командой L
)
Command (m for help): t Partition number (1,2, default 2): 1 Partition type (type L to list all types): 11 Changed type of partition 'Linux filesystem' to 'Microsoft basic data'. Command (m for help):
Затем перешел в режим эксперта (команда
x
) и восстановил GUID диска и UUID у разделов
Команда
i
, затем вбил старый GUID. Потом для обоих разделов команда u
и вбил UUID которые были
Expert command (m for help): i Enter new disk UUID (in 8-4-4-4-12 format):63A76DC1-85D9-3E40-936B-54362F2150A4 Disk identifier changed from DA3F8AA3-4842-7C48-A88F-34FB588072C6 to 63A76DC1-85D9-3E40-936B-54362F2150A4. Expert command (m for help): u Partition number (1,2, default 2): 1 New UUID (in 8-4-4-4-12 format): F751756E-5E67-4E26-A8B3-66550F08D938 Partition UUID changed from 683FA9B5-F737-8F43-887F-086EDB278595 to F751756E-5E67-4E26-A8B3-66550F08D938. Expert command (m for help): u Partition number (1,2, default 2): 2 New UUID (in 8-4-4-4-12 format): C32B4C20-A8C4-9C45-BEEF-12814AF24AFD Partition UUID changed from 904B0DB7-6111-AE4D-A6E6-DC6B69455A65 to C32B4C20-A8C4-9C45-BEEF-12814AF24AFD. Expert command (m for help):
Вышел из экспертного меню
r
, и сохранил w
Затем на всякий случай прогнал fsck по второму разделу (тем более как раз разделы не примонтированы были)
- он не показал никаких ошибок, перезапустил виртуалку - и... все стало хорошо, все запустилось,
без всяких ошибок. Все данные сохранились.
Можно выдохнуть :).
Можно выдохнуть :).