Задача - без перезагрузки системы расширить раздел (диск) на виртуальной машине Ubuntu 18.04, которая работает на VMWare.
Управление дисковым пространством организовано стандартно - физическое устройство содержит таблицу разделов GPT (три раздела - BIOS Boot, Linux Boot и раздел с LVM Physical Volume), а структутура LVM включает единственный Physical Volume и единственную Volume Group. Под директории /, /tmp, /var и /home выделены отдельные Logical Volumes.
Например - мне нужно выделить больше места под /var, но на диске место закончилось.
Поехали:
- Увеличиваем размер диска в консоли VMWare.
- Смотрим путь до устройства:
ls /sys/class/scsi_device/*/device/block/
Там будет что-то такое:
'/sys/class/scsi_device/2:0:0:0/device/block/': sr0 '/sys/class/scsi_device/32:0:0:0/device/block/': sda
- Нам нужно, чтобы Linux увидела новый размер диска /dev/sda, поэтому выполняем (с привилегиями root):
echo 1 > /sys/class/scsi_device/32\:0\:0\:0/device/rescan
- Проверяем, что диск в GPT:
fdisk -l /dev/sda | grep 'Disklabel type: gpt'
Если диск имеет таблицу MBR (Disklabel type: dos), то хорошо бы его сконверировать в GPT и починить/переустановить grub. Для этого - перемещаем таблицу разделов в конец диска
sgdisk -e -g /dev/sda
перечитываем таблицу разделов
partx -u /dev/sda
создаем новый маленький раздельчик номер 4 с типом EF02 (номер раздела и начальный/конечный сектора у вас будут другими)
sgdisk -n 4:293605246:293609946 -t 4:EF02 /dev/sda
переустанавливаем grub:
grub-install /dev/sda
- На всякий случай смотрим как разбит сейчас диск, потому что нижеприведенный скрипт ориентирован на то, что диск разбит дефолтно. Возможно, придется просто вручную указать размер последнего (не по номеру, а по размешению на диске) раздела (переменная PART). Вот пример разбиения, когда раздел с большим номером находится ПЕРЕД разделом с меньшим номером (о чем сообщает fdisk):
# fdisk -l /dev/sda ... * Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 976895 974848 476M 83 Linux /dev/sda2 978942 125827071 124848130 59.5G 5 Extended /dev/sda3 125827072 209715199 83888128 40G 8e Linux LVM /dev/sda5 978944 125827071 124848128 59.5G 8e Linux LVM Partition table entries are not in disk order.
- Теперь на появившемся пустом месте нужно либо создать новый раздел, либо расширить существующий. Я буду расширять. Для этого - можно использовать утилиту growpart, либо - сделать это вручную, с помощью скрипта:
#!/bin/bash set -e PART=/dev/sda3 #PART=`pvdisplay | grep 'PV Name' | awk '{print $3}'` PART=${PART#/dev/} DISK=$(readlink /sys/class/block/$PART) DISK=${DISK%/*} DISK=${DISK##*/} PARTNUM=${PART#"$DISK"} echo "Partition Number $PARTNUM" DISK=/dev/$DISK echo "Block Device - $DISK" echo "move backup gpt to end of disk" sgdisk -e -g $DISK echo "get first partition sector" FIRSTSECTOR=`sgdisk --info=$PARTNUM /dev/sda | grep 'First sector' | awk '{print $3}'` echo "get last sector" ENDSECTOR=$(sgdisk -E $DISK) echo "End Sector: $ENDSECTOR" echo "delete current partition" sgdisk -d $PARTNUM $DISK echo "replace with new from $FIRSTSECTOR to $ENDSECTOR" sgdisk -n $PARTNUM:$FIRSTSECTOR:$ENDSECTOR -c $PARTNUM:"Linux LVM $DISK$PARTNUM" -t $PARTNUM:8e00 $DISK # re-read the partition table entries partx -u $DISK pvresize $DISK$PARTNUM
Этот скрипт предполагает, что системе есть единственная VolumeGroup, в которую входит единственный PhysicalVolume и он является последним разделом на диске. Скрипт обнаруживает устройство, на котором размещен PhysicalVolume, обнаруживает номер раздела и его начальный сектор, затем - удаляет раздел и заново создает с началом в том же месте и максимальным размером. В завершение - скрипт перечитывает таблицу разделов и ресайзит PhysicalVolume.
- Теперь можно создавать новые LogicalVolumes или расширять имеющиеся. Я расширю то что уже есть:
lvresize -L +25G /dev/mapper/ubuntu--vg-var
- И отресайзю файловую систему:
resize2fs /dev/mapper/ubuntu--vg-var
Также, можно было не увеличивать существующий раздел, а создать новый, на нем создать PhysicalVolume, добавить в VolumeGroup и распределить место между LogicalVolumes. Или даже - просто на уровне Vmware не увеличивать диск, а добавить новый и уже его добавлять в VolumeGroup (даже не разбивая на разделы). В этом случае нужно будет обнаружить новый диск такой командой:
echo "- - -" > /sys/class/scsi_host/host1/scan
Номер scsi_host/host1 может быть другим.
Если что-то сломалось
После этих манипуляций следует проверить, что система нормально (пере)загружается :)
Если нет - смотрим, например, сюда: Fix GRUB
Discussion