Live изменение размера раздела GPT в Linux

12

В Linux я использовал для изменения размера разделов MBR, используя fdisk, даже в живых файловых системах, а затем запускал resize2fs / pvresize / ... (в зависимости от типа fs), чтобы получить новое выделенное пространство.

В последнее время я использую разделы Xen и GPT, и я заметил, что, к сожалению, parted не позволяет изменять размеры подключенного раздела на лету, на самом деле он будет жаловаться:

Error: Partition XXX is being used. You must unmount it before you modify it with Parted.

Я пробовал и resizeкоманду, и даже комбинацию rm+ mkpart, но они оба будут жаловаться на монтируемый раздел.

Как я могу это сделать?

cyberz
источник
Способ, доступный из коробки на RHEL / CentOS, был бы высоко оценен
cyberz

Ответы:

12

Самый безопасный способ сделать это - загрузиться с помощью аварийного носителя (live CD или подобного) и использовать GParted, который изменит размер как раздела, так и файловой системы, которую он содержит. Это будет работать, только если раздел в настоящее время не используется.

Если вы не можете позволить себе простои, попробуйте использовать gdiskвместо parted. Вам нужно будет удалить раздел, размер которого вы хотите изменить, и создать новый на его месте с той же начальной точкой, как вы это сделали fdisk. gdiskготов работать на используемом диске, хотя ядро ​​может не регистрировать никаких изменений. В этом случае вам может понадобиться использовать partprobeили kpartxзаставить ядро ​​принять новую таблицу разделов или даже перезагрузить компьютер, если это не сработает. (Это все должно быть очень похоже на использование fdisk.)

Род Смит
источник
Выглядит красиво, но не включено по умолчанию в CentOS. Есть еще стандартные способы? Я имею в виду, что система, похожая на redhat, должна иметь возможность самостоятельно изменять размеры, не полагаясь на внешние программы
cyberz
2
В комплекте с CentOS нет инструмента, который бы справился с этой задачей. Вы должны выйти из репозитория CentOS, чтобы делать то, что вы хотите. Обратите внимание, что почти все другие дистрибутивы (включая Fedora) включены gdiskв их репозитории, и я слышал, что gdiskони будут включены в следующую версию RHEL (и, следовательно, CentOS).
Род Смит
Спасибо за ответ и комментарий, это именно та информация, которую я искал
cyberz
1
gdiskдоступен в EPEL.
Jornane
Я попробовал и то partxи другое, partprobeно в итоге пришлось перезагрузить компьютер. В любом случае, спасибо за эти советы
Александр Бурлье
10

Обычно это работает только с более свежими дистрибутивами Linux. Необходимые инструменты:

  • partprobe (обычно часть parted)
  • gdisk / sgdisk

Раздел GPT хранит резервный заголовок в конце диска. Если вы изменили размер базового устройства, резервный заголовок будет где-то посередине. Первый шаг - переместить заголовок раздела в конец диска.

Предполагается, что диск является / dev / sda, а раздел - / dev / sda3 (также должен быть последним разделом):

sgdisk -e /dev/sda

Затем удалите последний раздел и заново создайте его:

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda

Обычно вы увидите сообщение о том, что ядро ​​не может повторно загрузить таблицу разделов. Вы должны запустить partprobe, чтобы раздел был зарегистрирован с новым размером:

partprobe /dev/sda

Если это не удастся, вам придется перезагрузить виртуальную машину. После этого вы можете вырастить свою файловую систему с помощью соответствующего инструмента, для ext4 и т.д .:

resize2fs /dev/sda3

Внимание : запуск sgdisk может быть разрушительным. Убедитесь, что у вас есть правильные процедуры резервного копирования на месте.

Нильс Мейер
источник
Потрясающие! Спасибо особенно за этот partprobeшаг - я всегда думал, что необходимо перезагружаться при изменении таблицы разделов с любыми подключенными разделами.
piit79
Помните, что уничтожение и воссоздание раздела приведет к созданию нового PARTUUID для раздела, который в противном случае является единственным надежным и независимым от файловой системы способом для fstab / GRUB / etc, позволяющим надежно идентифицировать разделы в многодисковых установках.
Тео Клеструп Ройедзон
5

Вот пример, который автоматизированный инструмент использует для изменения размера раздела в сети, за один прогон:

sgdisk -d 1 -n 1: 2048: 0 -c 1: -u 1: E485F29F-A1F4-4953-9DD8-799EAEA0119B -t 1: 0700 / dev / xvda

Вот список параметров для команды sgdisk:

  • -d 1 удалить первый раздел
  • -n 1: 2048: 0 говорит о создании нового раздела "номер 1" с начальным сектором 2048. Конечный сектор = "0", что означает "использовать все доступное пространство для этого раздела
  • -u устанавливает уникальный guid для этого раздела (это характерно для разделов GPT); Вы можете использовать «R» для GUID, чтобы установить случайное значение. Вы также можете получить идентификатор текущего раздела через gdisk /dev/xvda; pвывод, чтобы повторно использовать тот же UID
  • -t 1: 0700 означает, что первый раздел имеет тип-код '0700'.

/ dev / xvda был диском, который мы переделили.

Таким образом, он сразу удаляет и создает новый раздел на своем месте.

PS. Несколько заметок о типе '0700'. От мужчины SGDISK (8)

   -t, --typecode=partnum:{hexcode|GUID}
          Change a single partition's type  code.  You  enter  the  type  code  using  either  a  two-byte  hexadecimal  number,  as 

описанный ранее, или полностью указанное значение GUID, например, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Здесь вы найдете лучшее объяснение того, что означает «0700» - http://www.rodsbooks.com/gdisk/walkthrough.html

«Но подождите, - говорите вы, - я думал, что на диске есть раздел FAT!» Это действительно так. Windows использует один код GUID для всех своих разделов данных, будь то FAT или NTFS. В прошлом тот же код использовался в Linux для его разделов данных. (Подробнее об этом чуть позже ....) Таким образом, в этом случае несколько разных кодов MBR преобразуются в один код GUID GPT. GPT fdisk использует несколько произвольно код 0x0700 (или, точнее, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) для всех этих целей.

В моем случае я считаю, что это был раздел ext4 в Linux, но typecode раздела не означает тип файловой системы, поэтому «0700» больше похож на универсальный тип для sgdisk. По крайней мере, в тех случаях, которые я видел.

PPS. Вам может потребоваться запустить partprobeядро, чтобы узнать об изменении разделов без перезагрузки системы.

Tagar
источник
'p' покажет вам UUID диска. «Я» покажет вам UUID раздела.
Кит
2

Я просто суммирую некоторые ответы и комментарии здесь:

partedпросто откажется изменить любой смонтированный раздел. gdiskсделает всю работу за вас, но ее нет в стандартном репозитории RHEL или CentOS. Впрочем , он находится в репозитории EPEL .

Имейте в виду, что изменение разделов на используемом диске может помешать ядру зарегистрировать изменения. Если это произойдет, использование partprobe, partxили перезагрузка.

jornane
источник
1

Вы спрашиваете об изменении размера логического тома? Вот как я бы это сделал:

vgextend vgname /dev/sdb3
lvextend -L +3T /dev/mapper/location
resize2fs /mount/point

ИЛИ (xfs):

xfs_growfs /mount/point -D <bytes>
jredd
источник
он, вероятно, не использует ext2 / ext3 / ext4, иначе resize2fs должен работать на лету?
1
@ Энтони Ли: если вы переходите -rк lvextend, то это вызывает resize2fsдля вас.
JMTD
0

fdisk обычно все еще доступен и может делать это, если раздел является последним разделом, а начало раздела не перемещается.

Однако это опасная операция, которую следует выполнять с большой осторожностью. Сделайте резервную копию!

ec2-user@ip-10-0-20-15 ~]$ sudo fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.30.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 16777182 16773087   8G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): d
Partition number (1,128, default 128): 1

Partition 1 has been deleted.

Command (m for help): n
Partition number (1-127, default 1): 1
First sector (34-50331614, default 4096):
Last sector, +sectors or +size{K,M,G,T,P} (4096-50331614, default 50331614):

Created a new partition 1 of type 'Linux filesystem' and of size 24 GiB.
Partition #1 contains a xfs signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): p

Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

[ec2-user@ip-10-0-20-15 ~]$ sudo partprobe

[ec2-user@ip-10-0-20-15 ~]$ sudo fdisk -l
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

[ec2-user@ip-10-0-20-15 ~]$ sudo xfs_growfs /
meta-data=/dev/nvme0n1p1         isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 6290939
```
Дэниел Фаррелл
источник