Задача - без перезагрузки системы расширить раздел (диск) на виртуальной машине 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

Enter your comment. Wiki syntax is allowed:
 
  • linux_faq/vmware_disk_expand_without_reboot.txt
  • Last modified: 2020/09/17 11:35
  • by admin