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, но они оба будут жаловаться на монтируемый раздел.

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


Способ, доступный из коробки на 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ядро, чтобы узнать об изменении разделов без перезагрузки системы.


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

2

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

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

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


1

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

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

ИЛИ (xfs):

xfs_growfs /mount/point -D <bytes>

он, вероятно, не использует 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
```
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.