Как я диск уменьшил в виртуалке под 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
Работоспособностью сервера было решено пренебречь :). Могу сказать что в итоге он не работал больше суток. Поэтому смело грузимся с live-cd (я подсунул установщик ubuntu 18.04, и когда он предложил выбрать язык нажал alt+F2 чтобы переключится в другую консоль и манипуляции проводил там).
У меня диск был разбит на два раздела, 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)
У меня виртуалка называется 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
Даем команду.
   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 по второму разделу (тем более как раз разделы не примонтированы были) - он не показал никаких ошибок, перезапустил виртуалку - и... все стало хорошо, все запустилось, без всяких ошибок. Все данные сохранились.
Можно выдохнуть :).