Zmiana rozmiaru partycji GPT na żywo w systemie Linux

12

W Linuksie zmieniałem rozmiar partycji MBR za pomocą fdisk, nawet na aktywnych systemach plików, a następnie wydawałem resize2fs / pvresize / ... (w zależności od typu fs), aby uzyskać przydzielone nowe miejsce.

Ostatnio korzystam z partycji Xen i GPT i zauważyłem, że niestety parted nie pozwala na zmianę rozmiaru montowanej partycji w czasie rzeczywistym, w rzeczywistości będzie narzekać:

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

Wypróbowałem kombinację resizepolecenia, a nawet rm+ mkpart, ale oba będą narzekać na zamontowanie partycji.

Jak mogę to zrobić?

cyberz
źródło
Doceniona zostanie metoda dostępna po wyjęciu z pudełka na RHEL / CentOS
cyberz

Odpowiedzi:

12

Najbezpieczniejszym sposobem na to jest uruchomienie przy użyciu awaryjnego nośnika (Live CD lub podobnego) i użycie GParted, który zmieni rozmiar partycji i systemu plików, który zawiera. Działa to tylko wtedy, gdy partycja nie jest aktualnie używana.

Jeśli nie możesz sobie pozwolić na przestoje, możesz spróbować użyć gdiskzamiast parted. Musisz usunąć partycję, której rozmiar chcesz zmienić, i utworzyć nową w jej miejscu z tym samym punktem początkowym, podobnie jak zrobiłbyś to fdisk. gdiskchce pracować na używanym dysku, chociaż jądro może nie rejestrować żadnych zmian. W takim przypadku może być konieczne użycie partprobelub kpartxpobranie jądra w celu zaakceptowania nowej tablicy partycji lub nawet ponowne uruchomienie komputera, jeśli to nie zadziała. (To wszystko powinno być dość podobne do korzystania fdisk).

Rod Smith
źródło
Wygląda ładnie, ale nie jest domyślnie dołączany do CentOS. Jakieś bardziej standardowe sposoby? Mam na myśli, że system podobny do redhat powinien mieć możliwość samodzielnej zmiany rozmiaru bez polegania na programach zewnętrznych
cyberz
2
Nie ma narzędzia dostarczanego z CentOS, które wykonałoby to zadanie. Państwo musi wychodzić z CentOS repozytorium robić, co chcesz. Zauważ, że prawie wszystkie inne dystrybucje (w tym Fedora) znajdują się gdiskw swoich repozytoriach, i słyszałem, że gdiskzostaną uwzględnione w następnej wersji RHEL (a zatem CentOS).
Rod Smith
Dziękuję za odpowiedź i komentarz, to jest dokładnie ta informacja, której szukałem
cyberz
1
gdiskjest dostępny w EPEL.
jornane
Próbowałem obu partxi partprobeostatecznie musiałem zrestartować komputer. W każdym razie dziękuję za te wskazówki
Alexandre Bourlier,
10

Zwykle działa to tylko z nowszymi dystrybucjami Linuksa. Potrzebne narzędzia:

  • partprobe (zwykle część parted)
  • gdisk / sgdisk

Partycja GPT przechowuje nagłówek kopii zapasowej na końcu dysku. Jeśli zmieniłeś rozmiar urządzenia bazowego, nagłówek kopii zapasowej znajdzie się gdzieś pośrodku. Pierwszym krokiem jest przeniesienie nagłówka partycji na koniec dysku.

Zakładając, że dysk to / dev / sda, a partycja to / dev / sda3 (musi być również ostatnią partycją):

sgdisk -e /dev/sda

Następnie usuń ostatnią partycję i utwórz ją ponownie:

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

Zazwyczaj zobaczysz komunikat wskazujący, że jądro nie może ponownie załadować tablicy partycji. Musisz uruchomić partprobe, aby partycja została zarejestrowana w nowym rozmiarze:

partprobe /dev/sda

Jeśli to się nie powiedzie, będziesz musiał ponownie uruchomić maszynę wirtualną. Następnie możesz rozbudować swój system plików za pomocą odpowiedniego narzędzia, dla ext4 itp .:

resize2fs /dev/sda3

Uwaga : uruchomienie sgdisk może być destrukcyjne. Upewnij się, że masz odpowiednie procedury tworzenia kopii zapasowych.

Nils Meyer
źródło
Niesamowite! Dzięki szczególnie za ten partprobekrok - zawsze myślałem, że konieczne jest ponowne uruchomienie przy zmianie tablicy partycji z dowolnymi zamontowanymi partycjami.
piit79
Należy pamiętać, że zniszczenie i odtworzenie partycji wygeneruje nowy PARTUUID dla partycji, który w przeciwnym razie jest jedynym niezawodnym i niezależnym od systemu plików sposobem fstab / GRUB / etc do niezawodnej identyfikacji partycji w konfiguracjach wielodyskowych.
Teo Klestrup Röijezon
5

Oto przykład, za pomocą którego zautomatyzowane narzędzie zmienia rozmiar partycji online w jednym uruchomieniu:

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

Oto lista opcji polecenia sgdisk:

  • -d 1 pierwsza partycja delete
  • -n 1: 2048: 0 mówi o utworzeniu nowej partycji „numer 1”, z początkowym sektorem 2048. Koniec sektora = „0”, co oznacza „wykorzystaj całą dostępną przestrzeń dla tej partycji
  • -u ustawia unikalny identyfikator GUID dla tej partycji (jest to specyficzne dla partycji GPT); możesz użyć „R”, aby GUID został ustawiony na losową wartość. Możesz również uzyskać identyfikator bieżącej partycji poprzez gdisk /dev/xvda; pwyjście, aby ponownie użyć tego samego identyfikatora użytkownika
  • -t 1: 0700 zasadniczo oznacza, że ​​pierwsza partycja ma kod typu „0700”.

/ dev / xvda był dyskiem, który podzieliliśmy na partycje.

Więc usuwa i tworzy od razu nową partycję na swoim miejscu.

PS. Kilka uwag na temat kodu typu „0700”. Od mężczyzny 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 

opisane wcześniej lub w pełni określona wartość GUID, taka jak EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Znaleziono najlepsze wyjaśnienie znaczenia „0700” tutaj - http://www.rodsbooks.com/gdisk/walkthrough.html

„Ale poczekaj” - mówisz - „Myślałem, że dysk ma partycję FAT!” Rzeczywiście tak jest. Windows używa jednego kodu GUID dla wszystkich swoich partycji danych, czy to FAT, czy NTFS. W przeszłości ten sam kod był używany w Linuksie dla jego partycji danych. (Więcej na ten temat wkrótce ...) Zatem w tym przypadku kilka różnych kodów MBR jest tłumaczonych na pojedynczy kod GUID GPT. Fdisk GPT używa, nieco arbitralnie, kodu 0x0700 (a ściślej EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) dla wszystkich z nich.

W moim przypadku uważam, że była to partycja ext4 dla Linuksa, ale kod typu partycji nie oznacza typu systemu plików, więc „0700” wygląda bardziej jak typ catchall dla sgdisk. Przynajmniej w przypadkach, które widziałem.

PPS. Może być konieczne uruchomienie partprobejądra, aby dowiedzieć się o zmianie partycjonowania bez ponownego uruchamiania systemu.

Tagar
źródło
„p” pokaże UUID dysku. „i” pokaże UUID partycji.
Keith
2

Właśnie podsumowuję tutaj odpowiedzi i komentarze:

partedpo prostu odmówi zmiany dowolnej zamontowanej partycji. gdiskwykona zadanie za Ciebie, ale nie ma go w standardowym repozytorium RHEL lub CentOS. Jest jednak w repozytorium EPEL .

Pamiętaj, że zmiana partycji na używanym dysku może uniemożliwić jądrze zarejestrowanie zmian. Jeśli tak się stanie, stosowanie partprobe, partxlub restart.

jornane
źródło
1

Czy pytasz o zmianę rozmiaru woluminu logicznego? Oto jak bym to zrobił:

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

LUB (xfs):

xfs_growfs /mount/point -D <bytes>
jredd
źródło
prawdopodobnie nie używa ext2 / ext3 / ext4, w przeciwnym razie resize2fs powinien działać w locie?
1
@Antony Lee: jeśli przejdą -rdo lvextend, a następnie wywołuje resize2fsdla Ciebie.
jmtd
0

fdisk jest zwykle nadal dostępny i może to zrobić, jeśli partycja jest ostatnią partycją, a jej początek się nie porusza.

Jest to jednak niebezpieczna operacja, którą należy wykonać z dużą ostrożnością. Zrób kopię zapasową!

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
```
Daniel Farrell
źródło