Рано или поздно всегда приходиться делать изменение размера диска или раздела Linux. Варианты как это сделать существуют разные и все зависит от конкретного случая. Постарался найти вариант который подходит для разных случаев.

Введение

Рано или поздно всем необходимо произвести изменение размера диска, раздела, или вообще перестроить разбивку диска по новому.

Вариантов как это сделать множество, но мне кажется я нашел идеальный и 100% рабочий вариант.

Основной принцип состоит из следующих моментов:

  • Подключаем дополнительный диск;
  • Загружаем систему с Live-образа;
  • Переносим информацию на дополнительный диск;
  • Создаем, изменяем разделы на требуемом диске;
  • Возвращаем данные в случае форматирования;
  • Обновляем загрузчик системы и вносим правки в файл системы отвечающий за подключение разделов диска в систему.

Это очень грубая общая схема не отражающая всех нюансов, но дающая понять суть процесса.

В моем случае необходимо было поменять размер диска с преобразованием системы XFS в EXT4 на виртуальной машине работающей в Proxmox.

Меня лично необходимость уменьшить раздел возникла по причине того что в системе Proxmox появился диск SSD, но вот перенести туда нужную машину я не мог по причине большого размера диска а не реально используемого пространства.

Подготовка

Обязательно перед выполнением работ сделайте резервные копии виртуальных машин или как минимум данных с них!

Все действия необходимо выполнять только на отключенных разделах.

Забегая вперед скажу, что для уменьшения размера диска мы будем использовать возможности типа файлов raw и для этого в системе Proxmox диски должны находится в файловом варианте.

В моем случае делались изменения размеров на корневом разделе а значит необходимо запустить систему с Live-образа. Для этих целей у меня сделана собственная сборка дистрибутива Calculate Linux где установлены все необходимые мне утилиты. Можно использовать любой удобный вам Live-образ системы Linux.

Перед началом работ выполните команду которая покажет все реально смонтированные диски в работающей системе:

df -h
= часть вывода команды =
/dev/sda2 10G   6,9G   3,2G  69%  /
/dev/sda3 89G   11G    79G   12%  /var/sevo44
/dev/sda1 976M  179M   731M  20%  /boot

Сохраните эти данные, так как в последствии нам с ними будет проще работать.

Загружаем систему используя Live-образ.

Работать в консоли самого Proxmox не удобно, так как нет возможности копировать команды.  Запускаю ssh сервер командой:

/etc/init.d/sshd start

Подключаюсь по ssh используя данные авторизации live-образа.

Все подготовительные действия сделаны и переходим к непосредственной работе с разделами диска.

В примере имеется ввиду что раздел /boot выведен на отдельный раздел и мы его не трогаем. Всегда при создании выношу раздел boot на отдельный раздел и не раз эта схема упрощала мне жизнь при работе или проблемах с диском.

Изменение размера диска без форматирования

В случае простого изменения размеров у разделов все просто.

К сожалению раздел XFS уменьшить нельзя а увеличить можно.

Запускаем программу Gparted и выполняем необходимые действия с имеющимися разделами. Уменьшаем, перераспределяем или отключаем какой то раздел и переносим в корень. Например, в моем случае раздел /var/sevo44 находился на отдельном разделе а мне захотелось перенести его в корневой раздел.

Самое главное это перед тем как удалять раздел и переносить его в общий не забудьте сохранить данные с него.

Если выполнялись действия только по изменению размера имеющихся разделов делать больше ничего не надо. После перезагрузки система успешно запустится с новым размером разделов.

Изменение размера диска с форматированием

В моем случае файловая система была XFS и для уменьшения этого раздела мне необходимо было его переформатировать.

Определяем имеющиеся диски в системе выполнив команду:

fdisk -l
= часть вывода команды с пояснениями =
Диск /dev/sda: 100 GiB, 107374182400 байт, 209715200 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x85300bf3
Устр-во    Загрузочный   начало     Конец   Секторы Размер Идентификатор Тип
/dev/sda1  *               2048   2099199   2097152     1G            83 Linux
/dev/sda2               2099200  23070719  20971520    10G            83 Linux
/dev/sda3              23070720 209715199 186644480    89G            83 Linux

Диск /dev/sdb: 32 GiB, 34359738368 байт, 67108864 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт

Из вывода видно что sda рабочий диск а sdb подключенный.

Создаем раздел из всего диска sdb и форматируем его в ext4:

cfdisk -z /dev/sdb
mkfs.ext4 /dev/sdb1

Создаем две папки куда будем монтировать диски:

mkdir /mnt/sda && mkdir /mnt/sdb

Монтируем раздел sdb1 в необходимую папку:

mount /dev/sdb1 /mnt/sdb

C диском sda немного посложнее. В нашем случае разделы были подключены следующим образом:

df -h
= часть вывода с работающей системы =
/dev/sda2   10G    6,9G   3,2G  69%  /
/dev/sda3   89G    11G     79G  12%  /var/sevo44
/dev/sda1   976M   179M   731M  20%  /boot

Раздел sda1 надо оставить как есть а вот sda3 убрать переместив все данные в корневой раздел sda2.

Монтируем вначале главный раздел а затем вложенный:

mount /dev/sda2 /mnt/sda
mount /dev/sda3 /mnt/sda/var/sevo44

Проверяем что у нас получилось:

df -h
= часть вывода = 
/dev/sdb1  32G   49M   30G    1%  /mnt/sdb
/dev/sda2  10G  6.9G  3.2G   68%  /mnt/sda
/dev/sda3  89G   11G   79G   12%  /mnt/sda/var/sevo44

Всё смонтировалось как надо.

Переноси теперь все данные с папки /mnt/sda в папку /mnt/sdb

Переносить необходимо в консольном файловом менеджере Midnight Commander (mc), так как она при переносе сохранит все права на файлы и перенесёт все один в один.

Есть и другие способы переноса в консоли, но вариант с Midnight Commander проще и наглядней.

После переноса проверяем правильность и только после этого отключаем разделы диска sda строго в таком порядке:

umount /mnt/sda/var/sevo44
umount /mnt/sda

Запускаем программу Gparted с Live-образа и делаем с разделами что нам необходимо. В моем случае получилось следующее:

resize_xfs_proxmox-sevo44-1

Удалил раздел sda3 а раздел sda2 увеличил и отформатировали в формат ext4. Уменьшили диск больше чем на 50 Гиб.

Можно высчитывать и обрезать раздел ровно для последующего уменьшения, но мне проще потом его расширить подключившись с Live-образа.

Монтируем sda2 в папку /mnt/sda и копируем обратно в программе mc все данные с папки /mnt/sdb в /mnt/sda:

mount /dev/sda2 /mnt/sda

После копирования и проверки отключаем sdb1:

umount /mnt/sdb

Теперь нам необходимо отредактировать файл /etc/fstab который отвечает за монтирование разделов.

Определим какие uuid у разделов диска sda (при форматирование раздела uuid меняется на новый):

# blkid
= часть вывода =
/dev/sda1: UUID="fe3e2650-e8ed-48c0-91af-6dd7091114b5" TYPE="ext4" PARTUUID="85300bf3-01"
/dev/sda2: UUID="611171b8-5da5-460c-a6da-7bf8d42f2128" TYPE="ext4" PARTUUID="85300bf3-02"

Открываем /mnt/sda/etc/fstab и смотрим какие там прописаны uuid и параметры файловых систем:

vim /mnt/sda/etc/fstab
= часть необходимого вывода =
UUID=24b899e5-70a1-42f3-9df9-26edbae4ddec /           xfs defaults 0 0
UUID=fe3e2650-e8ed-48c0-91af-6dd7091114b5 /boot       ext4 defaults 1 2
UUID=11f4da95-8de0-4817-b4a9-48d3e859db09 /var/sevo44 xfs defaults 0 0

Как видим у раздела /boot uuid не поменялся а вот у корневого сменился. Приведем файл к необходимым параметрам:

= необходимая для изминения часть =
# /dev/sda2
UUID=611171b8-5da5-460c-a6da-7bf8d42f2128 /     ext4 defaults 1 1
# /dev/sda1
UUID=fe3e2650-e8ed-48c0-91af-6dd7091114b5 /boot ext4 defaults 1 2

Обновление загрузчика Grub2

После перезагрузки системы CentOS 8 вы увидите такое сообщение:

resize_xfs_proxmox-sevo44-2

Система говорит что она не видит корневой диск с таким uuid.

В случае если вы делали изменения раздела /boot вы увидите другую ошибку и способ устранения этой ошибки выходит за рамки данной статьи.

Решается эта проблема в два шага:

  1. Загрузится указав правильный uuid;
  2. В загрузившейся системе обновить Grub2.

Запускаем систему и как только увидите варианты загрузки нажимайте клавишу е:

resize_xfs_proxmox-sevo44-3

В результате вы увидите место где необходимо сменить информацию:

resize_xfs_proxmox-sevo44-4

Меняем на наш новый uuid 611171b8-5da5-460c-a6da-7bf8d42f2128 и нажимаем сочетание клавиш Ctrl и X.

Система загрузится, но значения загрузчика не поменяются. Выполним команду которая обновит grub2 в системе CentOS 8:

grub2-mkconfig -o /boot/grub2/grub.cfg
= вывод команды =
Generating grub configuration file ...
Found CentOS Linux 8 (Core) on /dev/sdb1
done

Все успешно обновилось, но я не отключил дополнительный диск и он добавился в меню загрузчика. На работу системы это никак не повлияет, но лучше не забывать отключать дополнительный диск после того как он больше не нужен.

Диск мы уменьшили и добились работоспособности системы теперь осталось выполнить последнее действие по уменьшению файла raw.

Преобразование раздела утилитой fstransform

Существует более простой способ, но как он работает на практике точно сказать не могу. Для меня описанный вариант выше более надежен, так как я не завишу от правильности действий этой утилиты.

Утилита называется fstransform и способна она преобразовывать в разные форматы.

Для преобразования корневого раздела необходимо загрузится с Live-образа установить утилиту и преобразовать нужный раздел.

Для Live-образа системы Debian (консольный вариант) нам вначале необходимо получить права root:

sudo su

Обновить список пакетов и установить:

apt update
apt install fstransform

Определить нужный раздел для преобразования командой # fdisk -l и запустить необходимую команду:

fstransform /dev/sda2 ext4

Раздел преобразуется с изменением uuid и дальше необходимо выполнить действия аналогично описанным выше.

Боле подробно об утилите можно посмотреть тут.

Уменьшение диска образа RAW

Возможно если у вас виртуальная машина работает на LVM существует способ более простой и не надо переносить образ в файловый вариант, но мне не захотелось выполнять более сложные действия с системой LVM.

Воспользуемся командой которая может произвести изменение диска обрезав образ диска raw с конца на нужный размер.

В нашем случае номер виртуальной машины был 112 и нам необходимо уменьшить образ на 50 G:

qemu-img resize /var/lib/vz/images/112/vm-112-disk-0.raw -50G
= вывод команды =
WARNING: Image format was not specified for '/var/lib/vz/images/112/vm-112-disk-0.raw' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
qemu-img: warning: Shrinking an image will delete all data beyond the shrunken image's end. Before performing such an operation, make sure there is no important data there.
qemu-img: warning: Using the --shrink option will suppress this message. Note that future versions of qemu-img may refuse to shrink images without this option.
Image resized.

Как видим образ успешно изменён.

Осталось загрузится c Live-образа и в программе Gparted задействовать все свободное место от диска.

В системе Proxmox после изменения размера диска в разделе вы увидите уже новые параметры а вот в свойствах машины будет стоять старое значение. Возможно необходимо выполнить какое то действие, но в моем случае я переношу диск на раздел LVM и после этого везде будет показываться правильное значение.

Вывод

Как видно из статьи нюансы и главное внимательность при работе с разделами главный залог успеха. В любом случае всегда необходимо делать резервную копию выполняя изменение размера диска.

При создании новой системы всегда в голове возникает мысль как лучше разбить и какое использовать место, но попасть в нужные параметры удаётся не всегда. Зная как производить изменение разделов можно больше не ломать голову а делать все стандартным проверенным способом и в случае необходимости все исправить.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделитесь ей с друзьями!
Пожалуйста, оставляйте свои комментарии

Читая их я получаю информацию которая позволяет мне улучшить качество написания статей. Кроме того, оставляя комментарии вы помогаете сайту получить более высокий рейтинг у поисковых систем. Давайте общаться.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания Google.