Jak mogę zmienić rozmiar partycji ext root w czasie wykonywania?


236

Jak mogę zwiększyć rozmiar partycji głównej systemu w czasie wykonywania?

Mam partycję, która nie jest przydzielana po partycji głównej (która jest także ext4), jak mogę dodać to nieprzydzielone miejsce do miejsca przydzielonego do partycji głównej bez konieczności wyłączania serwera?


3
Nienawidzę brzmieć jak kij w błocie, ale to wiąże się z pewnym ryzykiem? Dlaczego tak się dzieje? Czy czas pracy jest głównym ograniczeniem?
Chmura

Nie można zmienić rozmiaru partycji po lewej, ponieważ tak naprawdę byłby to ruch.
Zaz

5
Zwiększenie rozmiaru paritition ext4 online jest łatwe. Trudna część by się kurczyła (twój nagłówek dotyczy „zmiany rozmiaru”). Osoby zainteresowane WSZELKIMI manipulacjami na partycji głównej (przenoszenie, zmniejszanie, zmiana systemu plików, urządzenia) w czasie wykonywania powinny zapoznać się z moją odpowiedzią: askubuntu.com/a/728141/21888
vaab

Odpowiedzi:


214

GUI (Ubuntu 14.04 i nowsze) : GParted v0.17 i nowsze zapewniają przyjemny GUI do tego. (Starsze wersje odmawiają zmiany rozmiaru zamontowanej partycji).

Wiersz poleceń (dowolna wersja Ubuntu): Istnieją trzy kroki do tego.

Krok 1. Najpierw należy zmienić rozmiar partycji. Jeśli korzystasz z LVM, jest to łatwe i prawdopodobnie wiesz, jak postępować. Jeśli używasz klasycznych partycji, jest to nieco bardziej skomplikowane i może wymagać ponownego uruchomienia (chociaż nigdy nie musisz uruchamiać innego systemu lub płyty CD na żywo).

Tak to robię: użyj, fdiskaby najpierw usunąć partycję (chodzi o to, że dane na dysku zostaną zachowane), a następnie ostrożnie odtwórz ją z większym rozmiarem w tej samej pozycji.

Przykład:

$ sudo fdisk /dev/sda

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     9437183     4717568   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    10485759     5241856   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 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)
Syncing disks.

Ponownie ważne jest, aby nowa partycja zaczynała się od tego samego bloku, co stara. Identyfikator powinien również być zgodny (83 dla systemów Linux). Przygotuj się na utratę wszystkich danych przy najmniejszej literówce.

Aby być bezpiecznym, możesz również przywrócić flagę rozruchową (która według Wikipedii jest nadal wymagana na niektórych komputerach), naciskając a.

Zobacz sekcję komentarzy, aby dowiedzieć się, co zrobić, jeśli twoja partycja wymiany jest przeszkodą.

Do tej pory powinno być oczywiste, dlaczego ludzie zalecają używanie płyty CD na żywo. ;-)

Krok 2. Jak to fdiskprzypomina, musisz ponownie załadować tablicę partycji przed kontynuowaniem. Najbezpieczniejszym sposobem jest po prostu ponowne uruchomienie; ale możesz także użyć partprobelub kpartx (więcej informacji) .

Krok 3. Po zmianie rozmiaru partycji i ponownym załadowaniu tablicy partycji, wystarczy uruchomić resize2fssystem plików i możesz to zrobić, nawet jeśli jest on zamontowany jako partycja root.

Przykład:

$ sudo resize2fs /dev/sda1

16
To działało idealnie dla mnie. Jednak dodatkowo upewniłem się, że zachowana flaga rozruchowa jest w stanie oryginalnym.
Augustus Kling,

4
@ jbo5112: Jak fdiskmówi, partprobelub kpartxmoże działać zamiast restartu; zobacz także to pytanie . Nawet jeśli zrestartujesz komputer, rozwiązaniem jest nadal preferowanie korzystania z płyty CD na żywo, jeśli chodzi o przestoje, w których prosty restart może trwać krócej niż 10 sekund dla maszyny wirtualnej. Jest także szybszy w czasie pracy operatora, dlatego zwykle sam stosuję to podejście. :)
Søren Løvborg

1
@ Raymond: Jeśli pozwala na to nacisk pamięci (patrz free -h), wyłącz swap ( swapoff /dev/sda2), zmień tablicę partycji (w tym usuwając i ponownie tworząc partycję wymiany) i albo 1) uruchom ponownie lub 2) załaduj ponownie tablicę partycji i swaponponownie. (Jeśli pamięć jest zbyt napięta, aby tymczasowo wyłączyć swap, nadal możesz utworzyć i włączyć nową partycję wymiany ( /dev/sda3), a następnie swapoff sda2; ale wtedy będziesz musiał zaktualizować /etc/fstabnazwę urządzenia wymiany).
Søren Løvborg

1
Jeśli używasz vmware i zwiększyłeś rozmiar dysku, będziesz musiał uruchomić dysk sudo lshw -C, aby ponownie przeskanować systemy plików, aby vm rozpoznał większy dysk. Następnie postępuj zgodnie z instrukcjami powyżej.
Guy

2
Co powiesz na kurczenie się?
Aaron Franke

114

Możliwe jest dokonanie zmiany rozmiaru systemu plików ext4 on-line, nawet jeśli jest to twoja partycja root. Użyj resize2fspolecenia.

sudo resize2fs /dev/sda1

EDYCJA: Obkurczanie on-line jest niedozwolone:

root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported

55
Od man resize2fs: The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8).To pytanie dotyczy zmiany rozmiaru partycji , a nie systemu plików . Rozróżnienie jest subtelne, ale bardzo ważne.
Eliah Kagan

8
Możesz użyć fdisk, aby usunąć część główną, a następnie odtworzyć ją w tym samym bloku startowym. fdisk zapisze zmianę, ale wejdzie w życie dopiero po ponownym uruchomieniu. po ponownym uruchomieniu możesz użyć programu resize2fs, aby wysłać dysk do wypełnienia części.
James Becwar

3
Właśnie zmieniłem rozmiar partycji root ext4 online. Dlatego mogę potwierdzić, że to możliwe. Ale zamiast przekazać / dev / sda * jako parametr resize2fs, musisz przekazać nazwę woluminu logicznego.
CDR

10
Uważam, że pierwszy akapit strony resize2fs jest najciekawszy dla wstępnego pytania:The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.).
mo

5
Nie zastanawiaj się, fdiskkiedy growpartzrobisz to bardzo łatwo dla Ciebie.
STRML

54

Łatwiejsze rozwiązanie - użyj growpart <device> <partition>:

growpart /dev/xvda 1  # Grows the partition; note the space
resize2fs /dev/xvda1  # Grows the filesystem

Jak zawsze, na sfdisk -d /dev/xvda > partition_bak.dmpwszelki wypadek wykonaj kopię zapasową tablicy partycji ( ).


Co powiesz na kurczenie się?
Aaron Franke

sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table
Miałem

Obkurczanie nie jest możliwe w Internecie. Polecam gparteddo tego użyć .
STRML

4
growpart jest częścią chmury. Jeśli jeszcze tego nie zrobiłeś, możesz zainstalować przy pomocyapt-get install cloud-utils
klor

1
@monkut Późno na imprezę, ale prawdopodobnie dysk/dev/nvme0n1 . p5 to partycja 5 na tym dysku. W porównaniu z tradycyjnymi wycinkami dysku BSD używają podobnego schematu numeracji.
Per Lundberg,

12

Tak, możesz zmniejszyć / przenieść / rozwinąć partycję root online bez restartów (ani livecd, ani usbkey): zapoznaj się z tą odpowiedzią . Jest bardzo dobrze napisany i łatwy do naśladowania, choć dość długi i trochę ryzykowny. Więc jeśli chcesz tylko rozbudować partycję ext4, możesz trzymać się konwencjonalnych działających resize2fsrozwiązań.

Ogólne rozwiązanie, które mam, będzie działało na przykład na dowolnym typie rozwiązania dedykowanego lub VPS.

TLDR; Rozwiązanie to zakłada się pivot_root, aby tmpfswięc można umountbezpiecznie twoja partycja żyć i skrzypce z nim. Po zakończeniu pivot_rootwrócisz do nowej partycji root.

Umożliwia to praktycznie dowolną manipulację w głównym systemie plików (przenieś go, zmień system plików, zmień urządzenie fizyczne ...).

W tym procesie nie jest wymagane ponowne uruchamianie, co pozwala ominąć ograniczenia związane z resize2fs niemożnością zmniejszania ext4 partycji.

Ja osobiście tego używałem i działa bardzo dobrze również w systemie debian, więc powinno działać na Ubuntu. Jestem bardzo zaskoczony, że nie widzę tego dogłębnego rozwiązania bardziej powiązanego z wieloma pytaniami w witrynach stosu wymiany, które dotyczą tego samego problemu.

Uwaga: Oczywiście, jeśli chcesz rozbudować partycję, wystarczy proste resize2fs, jak podano w wielu miejscach i innych odpowiedziach tutaj.


4
Myślę, że dla większości ludzi, po zatrzymaniu wszystkich programów i usług uzyskujących dostęp do partycji root, równie dobrze możesz zrestartować komputer. W przypadku zmniejszania / przenoszenia może to być jeszcze szybsze niż w przypadku korzystania z płyty CD na żywo, ale w przypadku rozbudowy (zdecydowanie najczęstsze zadanie i pytanie o OP) istnieją sposoby, które nie wymagają tymczasowego wyłączenia większości systemu .
Søren Løvborg

2
@ SørenLøvborg: Możesz ponownie uruchomić podstawowe usługi, które wymagają ciągłej produkcji, wykonując pełną procedurę. Istnieje wiele konfiguracji, w których nie można umieścić LiveCD (instancje VPS, serwery dedykowane ...) lub okoliczności, w których chcesz uniknąć ponownego uruchamiania z określonych powodów. Oryginalny tytuł pytania wspomina o „zmianie rozmiaru”, która przyciąga osoby szukające kurczących się partycji online. ** Żadne inne rozwiązanie nie pozwala na kurczenie się ext4 online. ** To rozwiązanie jest ryzykowne, złożone, ale najpotężniejsze ze wszystkich i wypełnia wady innych.
vaab

1
Nie publikuj odpowiedzi w zależności od zewnętrznych linków. Umieść odpowiednią część w swojej odpowiedzi lub opublikuj link jako komentarz do pytania. Szczegółowe informacje można znaleźć w części Jak odpowiedzieć .
Melebius

10

Możesz także skorzystać z GParted - o ile partycja, której rozmiar zmieniasz, nie jest tą, z której uruchomiłeś system - w przeciwnym razie sugeruję, że opcja CD na żywo jest nieco łatwiejsza dla początkujących.

GParted wykonuje w zasadzie wszystkie kroki - bazując tylko na graficznym interfejsie użytkownika.


Uruchomiłem system z Live CD Ubuntu 12.04 i zmieniłem rozmiar partycji ext4 z GParted. Działało dobrze dla mnie. W każdym razie przed tą operacją utworzyłem kopię zapasową wszystkich ważnych danych.
StandDuPp

myślę, że gparted potrzebuje partycji odmontowanej. ale mogę się mylić.
Nick

Pytanie dotyczy oczywiście partycji, z której zostały uruchomione, a uruchomienie płyty CD na żywo wymaga ponownego uruchomienia komputera. -1
wjandrea

5

Właśnie skończyłem zmieniać rozmiar partycji root ext4 w systemie na żywo, gdy root był zamontowany.

[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.

[root@habib i686]# 

5

Chciałbym rozszerzyć odpowiedź na @ Søren Løvborg: rozszerzenie partycji z obecną partycją wymiany.

Najpierw układ dysku po rozszerzeniu:

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

Tak więc sda1 musi zostać rozszerzony o wolne miejsce na końcu dysku, ale partycja wymiany jest pomiędzy nimi. Oto jak możesz to zrobić:

Najpierw musimy wyłączyć swap. Sprawdź, ile zużywa i czy możesz to wyłączyć.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

swap nie jest tutaj używany, więc możemy go wyłączyć

$sudo swapoff /dev/sda5

Teraz zmienimy tablicę partycji:

$sudo fdisk /dev/sda

(uwaga: jeśli zdarzy się, że pierwsza partycja zacznie się od sektora 63 zamiast 2048, musisz dodać opcję -c=dos)

Welcome to fdisk (util-linux 2.27.1).
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/sda: 6.9 GiB, 7340032000 bytes, 14336000 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: dos
Disk identifier: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

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

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941

Created a new partition 1 of type 'Linux' and of size 5.9 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

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).

Uwaga: rozmiar sda1 to całkowita liczba sektorów minus rozmiar sektora partycji wymiany: 14335999-2093058 = 12242941

Jak wspomina fdisk: jądro nadal używa starej tablicy partycji, więc musimy ją ponownie załadować.

$partprobe

Teraz musimy uruchomić resize2fs na sda1 (nie zapomnij tego!)

$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

Teraz jeszcze się nie skończyło. Jak zapewne zauważyłeś, sda2 jest podzielony na partycje jako typ Linux (Ext4). Z jakiegoś powodu fdisk nie ma możliwości wyboru typu. Musimy to na przemian za pomocącfdisk

$ sudo cfdisk

Wybierz sda2 i zmień typ na 82 Linux swap / Solarisi pamiętaj, aby go napisać (wpisz „tak”, aby potwierdzić)

Teraz możemy ponownie aktywować swap

$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

I wreszcie włącz:

$swapon /dev/sda2

Jedyne, co musimy zrobić, to zaktualizować fstab, aby automatycznie instalował partycję wymiany podczas uruchamiania

$sudo nano /etc/fstab

I zmień UUID partycji wymiany na powyższe dane wyjściowe:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Teraz wszystko jest w porządku i możesz ponownie uruchomić komputer bez problemów.


co do naprzemiennego typu partycji wymiany, można to zrobić w fdisk kup, wybierając t, a następnie 5 (partycja 5), ​​a następnie 82 (typ Linux swap / Solaris)
Oz Edri

nie należy rozszerzać partycji 2? (a następnie w fdisk powinniśmy wybrać e zamiast p) Ponadto, czy polecenia mkswap i swapon nie powinny być uruchamiane na / dev / sda5 zamiast sda2?
Oz Edri,

1
Dla typu partycji wymiany: znalazłem w innych instrukcjach, że rzeczywiście możesz wybrać typ w fdisk, ale z jakiegoś powodu nie działał w mojej wersji. W każdym razie zawsze będzie działać z cfdisk
wouter205

1
W przypadku partycji wymiany: możesz użyć partycji rozszerzonej, ale musisz dodać dwie partycje: rozszerzoną i logiczną (zobacz mój początkowy układ partycji). W moim przykładzie kończę na 2 podstawowych partycjach: sda1 - ext4 - partycja główna i sda2 - partycja wymiany. Więc polecenia mkswap& swaponmuszą być uruchamiane na sda2. swapoffPopełniłem błąd na początku mojego postu: musi zostać wykonany na sda5. Komentarze są zawsze mile widziane, trudno było je zanotować.
wouter205,

1
Kiedy partycja wymiany jest zaszyfrowana, należy najpierw zatrzymać cryptdisks cryptdisks_stop, następnie zaktualizować / etc / crypttab zamiast /etc/fstabi ponownie uruchomić cryptdisks cryptdisks_start.
Dmitrij Chubarow

1

Właśnie zrobił to z powodzeniem bez umount, pivot_rootlub tymczasowym usunięciu partycji głównej, korzystając rozstał 3.2 na Ubuntu 16.04, jądra 4.4.0. Aby zachować ostrożność, zrobiłem wszystko, od wirtualnej konsoli z wyłączoną obsługą sieci, i na wszelki wypadek zrobiłem migawkę, ale migawka nie była potrzebna, więc mogłem równie dobrze zrobić to przez SSH i bez zmiany poziomów uruchamiania.

Określ rozmiar partycji: parted /dev/sda1 print | egrep "Disk.*GB"

Opcjonalnie przełącz na tryb wielu użytkowników bez sieci (należy to zrobić z konsoli, a nie SSH):

runlevel     # remember the original runlevel
init 2

Opcjonalnie weź migawkę maszyny wirtualnej, aby zachować ostrożność.

Zmień rozmiar partycji:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

Zmień rozmiar systemu plików: resize2fs /dev/sda1

Jeśli coś pójdzie nie tak, możesz przywrócić migawkę tutaj. Jeśli wszystko się dobrze, powrót do normalnego poziomu działania (otrzymanego powyżej) - zwykle 5: init 5. W tym momencie może być lepiej wykonać pełne ponowne uruchomienie, aby upewnić się, że wszystko wróci poprawnie (potem miałem problem z datą / ntp).


1

Wykonaj następujące kroki.

  1. otwórz terminal jako administrator su
  2. biegać parted
  3. wpisz, paby zobaczyć dostępne partycje
  4. zidentyfikuj swój numer partycji głównej (np. „sda 3” oznacza liczbę 3) i usuń sąsiednią partycję, używając rm PARTITION NUMBERdo utworzenia wolnego miejsca.
  5. teraz zwiększ rozmiar katalogu głównego, wpisując resizepart ROOT NUMBERi w razie potrzeby uruchom ponownie system
  6. wyjdź partedprzez wpisanie exiti wpisz typ terminala partprobei naciśnij enter (można to zrobić nawet po ponownym uruchomieniu)
  7. w końcu uruchom resize2fs /dev/sda PARTITION NUMBERi ciesz się przestronną partycją root.

0

Jak wspomniano wcześniej:

  • rozwijanie na żywo z systemu root jest możliwe. (żadnych trudności, ponieważ sekcja rozruchowa nie może zostać przeniesiona)

  • zmniejszanie partycji root na żywo musi odbywać się z zewnętrznego urządzenia rozruchowego (bootowanie z systemu CD / usb-stick na żywo), jak gdyby była jakaś usterka, niedopasowanie… cokolwiek… twój system zawiesza się, musi zostać zrestartowany i ostatecznie nie będzie w stanie poprawnie uruchomić.

Każde „ale ja to zrobiłem i działa” to szczęście.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.