Живий розмір розділу GPT у Linux


12

У Linux я змінив розмір розділів MBR за допомогою fdisk навіть у живих файлових системах, а потім видав resize2fs / pvresize / ... (залежно від типу fs), щоб отримати новий простір.

Останнім часом я використовую Xen та GPT розділи, і я помітив, що, на жаль, розлучений, здається, не дає можливості змінити розмір змонтованого розділу під час руху, насправді він скаржиться:

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

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

Як я можу це зробити?


Буде дуже вдячний спосіб, доступний у вікні RHEL / CentOS
cyberz

Відповіді:


12

Найбезпечніший спосіб це зробити - це завантажувати за допомогою аварійного носія (живий компакт-диск тощо) та використовувати GParted, який дозволить змінити розмір як розділу, так і файлової системи, яку він містить. Це буде працювати лише в тому випадку, якщо розділ наразі не використовується.

Якщо ви не можете дозволити собі простої, ви можете спробувати використовувати gdiskзамість цього parted. Вам потрібно буде видалити розділ, для якого потрібно змінити розмір, і створити на його місці новий з тим же початковою точкою, як і у вас fdisk. gdiskготовий працювати на використаному диску, хоча ядро ​​може не зареєструвати жодних змін. У такому випадку вам може знадобитися використовувати partprobeабо kpartxзмусити ядро ​​прийняти нову таблицю розділів або навіть перезавантажити комп'ютер, якщо це не працює. (Це все має бути дуже схоже на використання fdisk.)


Виглядає приємно, але не включено за замовчуванням у CentOS. Якісь стандартні способи? Я маю на увазі, система, схожа на redhat, повинна мати можливість змінювати розмір, не покладаючись на зовнішні програми
cyberz

2
Немає інструменту, який постачається з CentOS, який би зробив цю роботу. Вам потрібно вийти з сховища CentOS, щоб робити те, що ви хочете. Зауважте, що майже всі інші дистрибутиви (включаючи Fedora) включають gdiskу свої сховища, і я чув, що gdiskвін буде включений до наступної версії RHEL (а отже і до CentOS).
Rod Smith

Дякую за відповідь та коментар, це саме та інформація, яку я шукав
cyberz

1
gdiskдоступний у EPEL.
jornane

Я спробував і те, partxі в partprobeкінцевому підсумку довелося перезавантажити. Все одно дякую за ці поради
Олександр Бульє,

10

Зазвичай це працює лише з більш новими дистрибутивами Linux. Необхідні інструменти:

  • частковий зонд (як правило, частина проділу)
  • 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 / тощо для надійної ідентифікації розділів у налаштуваннях багатьох дисків.
Тео Клеструп Рейезон

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 встановлює унікальні настанови для цього розділу (це специфічно для 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 переводяться в єдиний код GPT GUID. GPT fdisk використовує дещо довільно код 0x0700 (а точніше, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) для всіх цих.

У моєму випадку я вважаю, що це був розділ Linux ext4, але код типу розділу не означає тип файлової системи, тому "0700" більше нагадує тип catchall для 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
@Antony Lee: якщо ти переходиш -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.