Vraag Hoe kan ik de grootte van een ext-rootpartitie wijzigen tijdens runtime?


Hoe kan ik tijdens runtime de rootpartitie van een systeem vergroten?

Ik heb een partitie die niet is toegewezen na de root-partitie (die ook ext4 is), hoe kan ik die niet-toegewezen ruimte toevoegen aan de ruimte die is toegewezen aan de root-partitie zonder de server te hoeven afsluiten?


194
2018-01-30 17:23


oorsprong


Ik haat het om als een stok in de modder te klinken, maar dit brengt behoorlijk wat risico met zich mee? Waarom moet dit gebeuren? Is uptime de belangrijkste beperking? - DevNull
Je kunt het formaat van een partitie niet naar links wijzigen, omdat dat eigenlijk een zet zou zijn. - Zaz
Het vergroten van de grootte van ext4 paritities online is eenvoudig. Het moeilijke deel zou kleiner worden (je kop gaat over "het formaat wijzigen"). Voor mensen die geïnteresseerd zijn in ELKE manipulatie op een rootpartitie (verplaatsen, verkleinen, wijzigen van bestandssysteem, apparaat) tijdens runtime moet ik mijn antwoord raadplegen: askubuntu.com/a/728141/21888 - vaab


antwoorden:


GUI (Ubuntu 14.04 en hoger): GParted v0.17 en later bieden hiervoor een mooie GUI. (Oudere versies zullen weigeren de grootte van een aangekoppelde partitie te wijzigen).

Commandoregel (elke Ubuntu-versie): Er zijn drie stappen om dit te doen.

Stap 1. De partitie moet eerst worden verkleind. Als u LVM gebruikt, is dat eenvoudig en weet u waarschijnlijk wat u moet doen. Als u klassieke partities gebruikt, is het een beetje ingewikkelder, en mei vereisen een reboot (hoewel je nooit een ander systeem of live-CD hoeft te booten).

Dit is hoe ik het doe: Gebruik fdisk om eerst de partitie te verwijderen (het idee is dat de gegevens op de schijf bewaard blijven), en zorg vervolgens voor een zorgvuldige herhaling met een grotere afmeting op dezelfde positie.

Voorbeeld:

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

Nogmaals, het is van cruciaal belang dat de nieuwe partitie begint met hetzelfde blok als het oude. De id moet ook overeenkomen (83 voor Linux-systemen). Wees voorbereid om al je gegevens te verliezen bij de minste typefout.

Voor de zekerheid kunt u ook de opstartvlag (die volgens Wikipedia is nog steeds vereist op sommige computers) door op te drukken a.

Zie het commentaargedeelte voor wat u moet doen als uw swappartitie in de weg zit.

Inmiddels zou duidelijk moeten zijn waarom mensen aanbevelen om een ​​live-CD te gebruiken. ;-)

Stap 2. Als fdisk herinnert u er vriendelijk aan dat u de partitietabel opnieuw moet laden voordat u doorgaat. De veiligste manier is om opnieuw te starten; maar je kunt ook gebruiken partprobe of kpartx  (meer informatie).

Stap 3. Zodra de grootte van de partitie is gewijzigd en de partitietabel opnieuw is geladen, is het een kwestie van hardlopen resize2fs op het bestandssysteem, en je kunt dit doen, zelfs als het is aangekoppeld als de rootpartitie.

Voorbeeld:

$ sudo resize2fs /dev/sda1

170
2018-04-06 14:23



Dit werkte perfect voor mij. Ik heb er echter ook voor gezorgd dat de bootvlag bewaard bleef in de originele staat. - Augustus Kling
@ jbo5112: As fdisk zegt, partprobe of kpartx kan werken in plaats van opnieuw opstarten; zie ook deze vraag. Zelfs als je opnieuw opstart, heeft de oplossing nog steeds de voorkeur boven het gebruik van een live-cd als het gaat om downtime, waarbij een eenvoudige reboot minder dan 10 seconden kan zijn voor een virtuele machine. Het is ook sneller in operator-tijd, daarom gebruik ik deze benadering meestal zelf. :) - Søren Løvborg
@ Raymond: als geheugendruk het toelaat (zie free -h), schakel de swap uit (swapoff /dev/sda2), wijzig de partitietabel (inclusief het verwijderen en opnieuw maken van de swappartitie) en 1) reboot of 2) herlaad de partitietabel en swapon nog een keer. (Als het geheugen te krap is om tijdelijk uit te schakelen, kunt u nog steeds een a maken en inschakelen nieuwe swap partitie (/dev/sda3) en swap-out sda2; maar dan moet je updaten /etc/fstab met de naam van het nieuwe swap-apparaat.) - Søren Løvborg
Als u vmware gebruikt en de grootte van de schijf hebt uitgebreid, moet u sudo lshw -C disk uitvoeren om de bestandssystemen opnieuw te scannen, zodat de vm de grotere schijf herkent. Volg dan de bovenstaande instructies. - Guy
Hoe zit het met krimpen? - Aaron Franke


Het is mogelijk om de grootte van een ext4 bestandssysteem on-line aan te passen, zelfs als dit uw rootpartitie is. Gebruik de resize2fs opdracht.

sudo resize2fs /dev/sda1

EDIT: Online inkrimpen is niet toegestaan:

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

109
2018-03-02 10:50



Van 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). Deze vraag gaat over het wijzigen van de grootte tussenschot, niet de bestandssysteem. Het onderscheid is subtiel maar erg belangrijk. - Eliah Kagan
U kunt fdisk gebruiken om de rootpartitie te verwijderen en deze vervolgens in hetzelfde startblok opnieuw te maken. fdisk zal de wijziging uitschrijven, maar deze zal pas van kracht worden na een herstart. na het opnieuw opstarten kunt u het programma resize2fs gebruiken om de schijf te verzenden om de partitie te vullen. - James Becwar
Ik heb net een ext4 rootpartitie online aangepast. Daarom kan ik bevestigen dat het mogelijk is. Maar in plaats van het doorgeven van / dev / sda * als parameter om resize2fs te wijzigen, moet je de logische volumenaam doorgeven. - CDR
Ik vind de eerste alinea van de de manpage van resize2fs het meest interessant voor de eerste vraag: 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'
Vergeet alsjeblieft niet fdisk wanneer growpart zal dit heel gemakkelijk voor u doen. - STRML


Een eenvoudigere oplossing - gebruik growpart <device> <partition>:

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

Maak zoals altijd een back-up van uw partitietabel (sfdisk -d /dev/xvda > partition_bak.dmp) voor de zekerheid.


22
2017-07-18 13:26



Hoe zit het met krimpen? - Aaron Franke
Was van plan om deze methode te gebruiken, maar kreeg sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table (met behulp van dual boot met windows) - monkut
Krimpen is niet mogelijk om online te doen. Ik raad aan om te gebruiken gparted ervoor. - STRML
Dit was perfect voor het wijzigen van de grootte van de rootpartitie en het bestandssysteem van mijn AWS VM. Proost. - MetaFight
growpart is onderdeel van cloud-utils. In het geval dat u niet hebt geïnstalleerd, kunt u installeren met apt-get install cloud-utils - klor


U kunt ook gewoon gebruik maken van GParted - zolang de partitie waarvan je het formaat wijzigt niet degene is van waaruit je hebt opgestart - anders stel ik de live CD optie is iets gemakkelijker voor beginners.

GParted eigenlijk doet alle stappen - alleen op basis van een GUI fronted.


8
2017-09-30 11:34



Ik heb mijn systeem opgestart met Ubuntu 12.04 Live CD en ik heb de ext4-partitie met GParted gewijzigd. Werkte goed voor mij. Hoe dan ook, voor deze operatie heb ik een back-up gemaakt van al mijn belangrijke gegevens. - StandDuPp
ik denk dat Gparted partitie niet-gemonteerd nodig heeft. maar ik kan het mis hebben. - Nick
De vraag is duidelijk over de partitie waarmee ze hebben opgestart en voor het opstarten van een live-cd moet de machine opnieuw worden opgestart. -1 - wjandrea


Ja, je kunt een online rootpartitie verkleinen / verplaatsen / laten groeien zonder enige herstart (noch livecd, noch usbkey): raadpleeg dit antwoord. Het is heel goed geschreven en gemakkelijk te volgen, hoewel vrij lang en een beetje riskant. Dus als u alleen uw ext4-partitie wilt laten groeien, kunt u vasthouden aan de conventionele werking resize2fsoplossingen.

De algemene oplossing die ik heb gevonden, zal bijvoorbeeld werken op elk type dedicated of VPS-oplossing.

TLDR; deze oplossing houdt in pivot_root naar tmpfs dus je kunt het umount veilig je rootpartitie leven en ermee worstelen. Als je klaar bent, doe je het pivot_root terug op je nieuwe rootpartitie.

Dit maakt vrijwel elke manipulatie op het root-bestandssysteem mogelijk (verplaats het, verander het bestandssysteem, verander het fysieke apparaat ...).

Opnieuw opstarten is niet vereist in het proces en dit staat toe om beperking te omzeilen van resize2fs  niet kunnen krimpen  ext4 partities.

Ik heb dit persoonlijk gebruikt en het werkt ook heel goed op debian-systeem, dus het zou op Ubuntu moeten werken. Ik ben zeer verbaasd om deze diepgaande oplossing niet een beetje meer te zien in verband met de vele vraag op websites met stackexchange die hetzelfde probleem behandelen.

Notitie: Natuurlijk, als je je partitie wilt laten groeien, is dat een simpele resize2fs zal genoeg zijn zoals vermeld op talloze plaatsen en in andere antwoorden hier.


8
2018-02-01 02:08



Ik denk dat voor de meeste mensen, als je alle programma's en services hebt gestopt die toegang hebben tot de rootpartitie, je net zo goed de machine opnieuw hebt opgestart. Voor krimpen / verplaatsen, kan dat nog steeds sneller zijn dan het gebruik van een live-CD, maar om te groeien (verreweg de meest voorkomende taak en wat OP gevraagd heeft), zijn er manieren die geen tijdelijke uitschakeling van het grootste deel van het systeem inhouden . - Søren Løvborg
@ SørenLøvborg: u kunt de kernservices die voortdurend moeten worden geproduceerd opnieuw opstarten terwijl u de volledige procedure uitvoert. Er zijn veel configuraties waarbij u LiveCD (VPS-instanties, speciale servers ...) of omstandigheden waarin u om specifieke redenen wilt rebasen, niet kunt gebruiken. De titel van de oorspronkelijke vraag vermeldt "resizing", waardoor mensen die op zoek zijn naar krimpende partities online worden aangetrokken. ** Geen enkele andere oplossing maakt het mogelijk om ext4 online te verkleinen. ** Deze oplossing is riskant, complex, maar de meest krachtige en vult de tekortkomingen van de anderen. - vaab


Net klaar met het wijzigen van de grootte van een ext4 root-partitie op een live-systeem, terwijl de root was mount.

[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
2017-12-04 22:40





Ik heb dit met succes zonder gedaan umount, pivot_rootof tijdelijke verwijdering van de hoofdpartitie met behulp van parted 3.2 op Ubuntu 16.04, 4.4.0 kernel. Om voorzichtig te zijn deed ik alles van een virtuele console met uitgeschakeld netwerk en maakte van tevoren een momentopname voor het geval dat de momentopname niet nodig was, dus ik had dit net zo goed kunnen doen via SSH en zonder de runlevels te wijzigen.

Bepaal de partitiegrootte: parted /dev/sda1 print | egrep "Disk.*GB"

Optioneel overschakelen naar multi-user modus zonder netwerken (moet worden gedaan vanaf een console, niet via SSH):

runlevel     # remember the original runlevel
init 2

Neem optioneel een VM-momentopname om voorzichtig te zijn.

Formaat van partitie wijzigen:

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

Resize bestandssysteem: resize2fs /dev/sda1

Als er iets misgaat, kunt u uw snapshot hier herstellen. Als alles goed is gegaan, keert u terug naar het normale runlevel (hierboven verkregen) - normaal 5: init 5. Het is misschien beter om op dit punt een volledige herstart uit te voeren om ervoor te zorgen dat alles weer goed werkt (ik had nadien een datum / ntp-probleem).


1
2017-07-14 00:09





Zoals eerder genoemd:

  • live uitbreiden van een root-systeem is mogelijk. (geen problemen, omdat de opstartsectie niet mag worden verplaatst)

  • krimpen van een live root-partitie moet gedaan worden vanaf een extern opstartapparaat (opstart vanaf live-systeem cd / usb-stick), alsof er een fout is, mismatch ... wat dan ook .. je systeem blijft hangen, moet opnieuw worden opgestart en zal uiteindelijk niet in staat om correct te booten.

Elke vorm van "maar ik deed het en het werkt" is puur geluk.


0
2018-01-10 21:58





Volg deze stappen.

  1. open terminal als superuser su
  2. rennen parted
  3. type p om de beschikbare partities te bekijken
  4. identificeer uw rootpartitienummer (bijv .: 'sda 3' betekent nummer 3) en verwijder een aangrenzende partitie met behulp van rm PARTITION NUMBERom vrije ruimte te creëren.
  5. verhoog nu de root-grootte door te typen resizepart ROOT NUMBER en reboot systeem indien nodig
  6. Uitgang parted door te typen exit en in terminaltype partprobe en druk op enter (dit kan zelfs worden gedaan nadat opnieuw wordt opgestart)
  7. eindelijk rennen resize2fs /dev/sda PARTITION NUMBER en geniet van een ruime rootpartitie.

0
2017-09-13 20:22





Ik zou graag een uitbreiding willen maken op het antwoord van @ Søren Løvborg: de partitie uitbreiden met een aanwezige swappartitie.

Eerst de lay-out van de schijf na het uitbreiden ervan:

$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

Dus sda1 moet worden uitgebreid met de vrije ruimte aan het einde van de schijf, maar de swappartitie zit er tussenin. Dit is hoe je het kunt doen:

Eerst moeten we swap uitschakelen. Controleer hoeveel het wordt gebruikt en of je het kunt uitschakelen.

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

swap is hier niet gebruikt, dus we kunnen het uitschakelen

$sudo swapoff /dev/sda2

Nu zullen we de partitietabel veranderen:

$sudo fdisk /dev/sda

(Opmerking: als je toevallig de eerste partitie start bij sector 63 in plaats van 2048, moet je de optie toevoegen -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): 122                                                                  42941

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

Opmerking: de grootte van sda1 is het totale aantal sectoren minus de sectorgrootte van uw swappartitie: 14335999-2093058 = 12242941

Zoals fdisk vermeldt: de kernel gebruikt nog steeds de oude partitietabel, dus we moeten hem opnieuw laden.

$partprobe

Nu moeten we resize2fs uitvoeren op sda1 (vergeet dit niet!)

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

Nu zijn de dingen nog niet voorbij. Zoals je waarschijnlijk hebt gemerkt, is sda2 gepartitioneerd als type Linux (Ext4). Om een ​​of andere reden is er geen manier om fdisk te kiezen voor het type. Dus we moeten het afwisselen met behulp van cfdisk

$ sudo cfdisk

Kies sda2 en wijzig het type in 82 Linux swap / Solarisen zorg ervoor dat je het schrijft (typ yes om te bevestigen)

Nu kunnen we de swap opnieuw activeren

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

En ten slotte inschakelen:

$swapon /dev/sda2

Het enige dat we moeten doen is fstab bijwerken om de swappartitie tijdens het opstarten automatisch te koppelen

$sudo nano /etc/fstab

En verander de UUID van de swappartitie naar de bovenstaande uitvoer:

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

Nu is alles goed en kunt u zonder problemen herstarten.


0
2017-09-07 06:58