Come posso ridimensionare una partizione root ext in fase di esecuzione?


236

Come posso aumentare la dimensione della partizione root di un sistema in fase di esecuzione?

Ho una partizione che non è allocata dopo la partizione di root (che è anche ext4), come posso aggiungere quello spazio non allocato allo spazio allocato alla partizione di root senza dover spegnere il server?


3
Odio sembrare un bastone nel fango, ma questo comporta un bel po 'di rischio? Perché questo deve accadere? L'uptime è il principale vincolo?
Cloud

Non puoi ridimensionare una partizione a sinistra, perché sarebbe effettivamente una mossa.
Zaz,

5
Aumentare le dimensioni delle partizioni ext4 online è facile. La parte difficile sarebbe restringere (il titolo riguarda il "ridimensionamento"). Per le persone interessate a QUALSIASI manipolazione su una partizione di root (sposta, riduci, cambia filesystem, dispositivo) in fase di esecuzione, consultare la mia risposta: askubuntu.com/a/728141/21888
vaab

Risposte:


214

GUI (Ubuntu 14.04 e successive) : GParted v0.17 e successive forniscono una buona GUI per questo. (Le versioni precedenti rifiuteranno di ridimensionare una partizione montata).

Riga di comando (qualsiasi versione di Ubuntu): ci sono tre passaggi per questo.

Passaggio 1. La partizione deve essere prima ridimensionata. Se stai usando LVM, è facile e presumibilmente sai come procedere. Se stai usando le partizioni classiche, è un po 'più complicato e potrebbe richiedere un riavvio (anche se non devi mai avviare un altro sistema o CD live).

Ecco come lo faccio: utilizzare fdiskprima di eliminare la partizione (l'idea è che i dati sul disco vengano conservati), quindi ricrearli attentamente con dimensioni maggiori nella stessa posizione.

Esempio:

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

Ancora una volta, è fondamentale che la nuova partizione inizi nello stesso blocco della vecchia. L'ID dovrebbe anche corrispondere (83 per i sistemi Linux). Preparati a perdere tutti i tuoi dati al minimo errore di battitura.

Per essere al sicuro, puoi anche ripristinare il flag di avvio (che secondo Wikipedia è ancora richiesto su alcuni computer) premendo a.

Vedere la sezione dei commenti per sapere cosa fare se la partizione di swap è in mezzo.

Ormai dovrebbe essere evidente il motivo per cui le persone raccomandano di usare un CD live. ;-)

Passaggio 2. Come è fdiskutile ricordare, è necessario ricaricare la tabella delle partizioni prima di procedere. Il modo più sicuro è semplicemente riavviare; ma puoi anche usare partprobeo kpartx (maggiori informazioni) .

Passaggio 3. Una volta ridimensionato la partizione e ricaricata la tabella delle partizioni, è una semplice questione di esecuzione resize2fssul file system e puoi farlo anche quando è montata come partizione root.

Esempio:

$ sudo resize2fs /dev/sda1

16
Ha funzionato perfettamente per me. Tuttavia, ho anche assicurato che il flag di avvio conservato fosse nello stato originale.
Augustus Kling

4
@ jbo5112: come fdiskdetto, partprobeo kpartxpotrebbe funzionare invece di un riavvio; vedi anche questa domanda . Anche se si riavvia, la soluzione è comunque preferibile all'utilizzo di un CD live quando si tratta di tempi di inattività, in cui un riavvio semplice può essere inferiore a 10 s per una macchina virtuale. È anche più veloce nel tempo dell'operatore, motivo per cui di solito utilizzo questo approccio da solo. :)
Søren Løvborg,

1
@Raymond: se la pressione della memoria lo consente (vedi free -h), disabilita lo swap ( swapoff /dev/sda2), cambia la tabella delle partizioni (inclusa la cancellazione e la ricreazione della partizione di swap) e 1) riavvia o 2) ricarica swaponnuovamente la tabella delle partizioni . (Se la memoria è troppo stretta per disabilitare temporaneamente lo swap, puoi comunque creare e abilitare una nuova partizione di swap ( /dev/sda3), quindi swapoff sda2; ma poi dovrai aggiornare /etc/fstabcon il nuovo nome del dispositivo di swap.)
Søren Løvborg

1
Se si utilizza vmware e le dimensioni del disco sono state estese, sarà necessario eseguire sudo lshw -C disk per eseguire nuovamente la scansione dei filesystem in modo che vm riconosca l'unità più grande. Quindi seguire le istruzioni sopra.
Guy,

2
Che dire di restringersi?
Aaron Franke,

114

È possibile effettuare un ridimensionamento online di un filesystem ext4, anche se è la partizione di root. Usa il resize2fscomando

sudo resize2fs /dev/sda1

EDIT: la riduzione on-line non è consentita:

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
Da 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).questa domanda riguarda il ridimensionamento della partizione , non del filesystem . La distinzione è sottile ma molto importante.
Eliah Kagan,

8
È possibile utilizzare fdisk per eliminare la partizione di root e quindi ricrearla nello stesso blocco iniziale. fdisk scriverà la modifica, ma non avrà effetto fino a dopo un riavvio. dopo il riavvio è possibile utilizzare il programma resize2fs per inviare il disco per riempire la partion.
James Becwar,

3
Ho appena ridimensionato una partizione root ext4 online. Pertanto posso confermare che è possibile. Invece di passare / dev / sda * come parametro per ridimensionare2fs, è necessario passare il nome del volume logico.
CDR

10
Trovo il primo paragrafo della manpage resize2fs più interessante per la domanda iniziale: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
Per favore, non scherzare con fdiskquando growpartlo farà molto facilmente per te.
STRML

54

Una soluzione più semplice growpart <device> <partition>: utilizzare :

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

Come sempre, esegui il backup della tabella delle partizioni ( sfdisk -d /dev/xvda > partition_bak.dmp) per ogni evenienza.


Che dire di restringersi?
Aaron Franke,

Speravo di usare questo metodo, ma ottenuto sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(usando il dual boot con windows)
monkut

La contrazione non è possibile on-line. Vi consiglio di usarlo gparted.
STRML

4
growpart fa parte di cloud-utils. Nel caso in cui non sia stato installato, è possibile installare conapt-get install cloud-utils
klor

1
@monkut In ritardo alla festa, ma è probabile che il tuo disco/dev/nvme0n1 . p5 è la partizione 5 su questo disco. Confronta con le tradizionali porzioni di dischi BSD, usano uno schema di numerazione simile.
Per Lundberg,

12

Sì, puoi ridurre / spostare / far crescere una partizione di root online senza riavviare (né livecd, né usbkey): consulta questa risposta . È scritto molto bene e facile da seguire, anche se piuttosto lungo e un po 'rischioso. Quindi, se vuoi solo far crescere la tua partizione ext4, puoi attenerti alle resize2fssoluzioni di lavoro convenzionali .

La soluzione generale che ho citato funzionerà su qualsiasi tipo di soluzione dedicata o VPS per esempio.

TLDR; questa soluzione comporta per pivot_rootper tmpfsin modo da poter umounttranquillamente la vostra partizione di root vivere e violino con esso. Una volta fatto, pivot_roottornerai sulla tua nuova partizione di root.

Ciò consente praticamente qualsiasi manipolazione sul file system di root (spostalo, cambia il filesystem, cambia il suo dispositivo fisico ...).

Non è richiesto alcun riavvio nel processo e ciò consente di aggirare la limitazione di resize2fs non essere in grado di ridurre le ext4 partizioni.

L'ho usato personalmente e funziona molto bene anche sul sistema debian, quindi dovrebbe funzionare su Ubuntu. Sono molto sorpreso di non vedere questa soluzione approfondita un po 'più legata alle molte domande nei siti Web stackexchange che affrontano lo stesso problema.

Nota: ovviamente se vuoi far crescere la tua partizione, resize2fsbasterà una semplice come indicato in numerosi punti e in altre risposte qui.


4
Penso che per la maggior parte delle persone, una volta arrestato l'accesso a tutti i programmi e servizi alla partizione di root, è possibile che sia stato riavviato il computer. Per ridurre / spostare, potrebbe essere ancora più veloce dell'uso di un CD live, ma per crescere (di gran lunga l'attività più comune e ciò che l'OP ha chiesto), ci sono modi che non comportano un arresto temporaneo della maggior parte del sistema .
Søren Løvborg

2
@ SørenLøvborg: è possibile riavviare i servizi principali che richiedono una produzione continua mentre si esegue la procedura completa. Esistono molte configurazioni in cui non è possibile inserire LiveCD (istanze VPS, server dedicati ...) o circostanze in cui si desidera evitare il riavvio per motivi specifici. Il titolo della domanda originale menziona il "ridimensionamento", che attira le persone che cercano di ridimensionare le partizioni online. ** Nessun'altra soluzione consente di ridurre ext4 online. ** Questa soluzione è rischiosa, complessa, ma la più potente di tutte e colma le carenze degli altri.
vaab

1
Si prega di non pubblicare risposte a seconda dei collegamenti esterni. Inserisci la parte pertinente nella tua risposta o pubblica il link come commento alla domanda. Vedi Come rispondere per i dettagli.
Melebio

10

Potresti anche usare GParted - purché la partizione che stai ridimensionando non sia quella da cui hai avviato - altrimenti suggerisco che l' opzione live CD sia un po 'più semplice per i principianti.

GParted esegue sostanzialmente tutti i passaggi, basandosi solo su una GUI fronteggiata.


Ho avviato il mio sistema con Ubuntu 12.04 Live CD e ho ridimensionato la partizione ext4 con GParted. Ha funzionato bene per me. Ad ogni modo, prima di questa operazione ho eseguito il backup di tutti i miei dati importanti.
StandDuPp,

penso, gparted ha bisogno di partizione smontata. ma posso sbagliarmi.
Nick,

La domanda riguarda ovviamente la partizione da cui è stato avviato e l'avvio di un CD live richiede il riavvio della macchina. -1
wjandrea,

5

Ho appena finito di ridimensionare una partizione root ext4 su un sistema live mentre il root era 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

Vorrei fare un'estensione sulla risposta di @ Søren Løvborg: estendere la partizione con una partizione di swap presente.

Innanzitutto il layout del disco dopo averlo esteso:

$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

Quindi sda1 deve essere esteso con lo spazio libero alla fine del disco, ma la partizione di swap è tra di loro. Ecco come puoi farlo:

Per prima cosa dobbiamo disabilitare lo scambio. Controlla quanto viene utilizzato e se è possibile disattivarlo.

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

lo swap non è utilizzato qui, quindi possiamo disattivarlo

$sudo swapoff /dev/sda5

Ora cambieremo la tabella delle partizioni:

$sudo fdisk /dev/sda

(nota: se la prima partizione inizia nel settore 63 anziché nel 2048, è necessario aggiungere l'opzione -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).

Nota: la dimensione di sda1 è la quantità totale di settori meno la dimensione del settore della partizione di swap: 14335999-2093058 = 12242941

Come menziona fdisk: il kernel sta ancora usando la vecchia tabella delle partizioni, quindi dobbiamo ricaricarla.

$partprobe

Ora dobbiamo eseguire resize2fs su sda1 (non dimenticarlo!)

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

Ora, le cose non sono ancora finite. Come probabilmente avrai notato, sda2 è partizionato come tipo Linux (Ext4). Per qualche motivo, in fdisk non è possibile scegliere il tipo. Quindi dobbiamo alternarlo usandocfdisk

$ sudo cfdisk

Scegli sda2 e modifica il tipo in 82 Linux swap / Solarise assicurati di scriverlo (digitare yes per confermare)

Ora possiamo riattivare lo swap

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

E infine accenderlo:

$swapon /dev/sda2

L'unica cosa che dobbiamo fare è aggiornare fstab per montare automaticamente la partizione di swap all'avvio

$sudo nano /etc/fstab

E cambia l'UUID della partizione di swap nell'output sopra:

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

Ora va tutto bene e puoi riavviare senza problemi.


come per alternare il tipo di partizione di swap, può essere fatto in fdisk buy selezionando t quindi 5 (partizione 5) quindi 82 (tipo Linux swap / Solaris)
Oz Edri

la partizione 2 non dovrebbe essere estesa? (e quindi in fdisk dovremmo scegliere e anziché p) Inoltre, i comandi mkswap e swapon non dovrebbero essere eseguiti su / dev / sda5 anziché su sda2?
Oz Edri,

1
Per il tipo di partizione di swap: ho trovato in altre istruzioni che puoi effettivamente selezionare il tipo in fdisk ma per qualche ragione non ha funzionato nella mia versione. Ad ogni modo, funzionerà sempre con cfdisk
wouter205,

1
Per la partizione di swap: è possibile utilizzare una partizione estesa ma è necessario aggiungere due partizioni: una estesa e una logica (vedere il layout iniziale della mia partizione). Nel mio esempio, finisco con 2 partizioni primarie: sda1 - ext4 - partizione root e sda2 - partizione di swap. Quindi i comandi mkswap& swapondevono essere eseguiti su sda2. Ho fatto un errore all'inizio del mio post: swapoffdeve essere eseguito su sda5. I commenti sono sempre ben accetti, è stato difficile annotare.
wouter205,

1
Quando la partizione di swap è crittografata, è necessario prima arrestare i cryptdisk con cryptdisks_stop, quindi aggiornare / etc / crypttab invece di /etc/fstabe riavviare i cryptdisk con cryptdisks_start.
Dmitri Chubarov,

1

L'ho fatto con successo senza umount, pivot_rooto rimozione temporanea della partizione principale, usando parted 3.2 sul kernel Ubuntu 16.04, 4.4.0. Per essere prudenti, ho fatto di tutto, da una console virtuale con la rete disabilitata, e ho fatto un'istantanea in anticipo per ogni evenienza, ma l'istantanea non era necessaria, quindi avrei potuto farlo altrettanto bene tramite SSH e senza cambiare i runlevel.

Determina le dimensioni della partizione: parted /dev/sda1 print | egrep "Disk.*GB"

Opzionalmente passare alla modalità multiutente senza rete (deve essere fatto da una console, non SSH):

runlevel     # remember the original runlevel
init 2

Facoltativamente, fare uno snapshot VM per essere cauti.

Ridimensiona partizione:

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

Ridimensiona il filesystem: resize2fs /dev/sda1

Se qualcosa va storto, puoi ripristinare la tua istantanea qui. Se tutto è andato bene, tornare a runlevel normale (ottenuto sopra) - normalmente 5: init 5. Potrebbe essere meglio eseguire un riavvio completo a questo punto per assicurarsi che tutto ritorni correttamente (ho avuto un problema data / ntp in seguito).


1

Segui questi passi.

  1. terminale aperto come superutente su
  2. correre parted
  3. digitare pper visualizzare le partizioni disponibili
  4. identifica il tuo numero di partizione di root (es: 'sda 3' significa numero 3) ed elimina una partizione adiacente usando rm PARTITION NUMBERper creare spazio libero.
  5. ora aumenta la dimensione della radice digitando resizepart ROOT NUMBERe riavvia il sistema se necessario
  6. uscire parteddigitando exite nel tipo di terminale partprobee premere invio (questo può essere fatto anche dopo il riavvio)
  7. finalmente corri resize2fs /dev/sda PARTITION NUMBERe goditi la spaziosa partizione di root.

0

Come affermato in precedenza:

  • è possibile l'espansione live da un sistema di root (nessuna difficoltà, poiché la sezione di avvio non deve essere spostata)

  • la riduzione di una partizione di root live deve essere eseguita da un dispositivo di avvio esterno (avvio da cd / usb-stick di sistema live), come se ci fosse qualche errore, mancata corrispondenza .. qualsiasi cosa ... il sistema si blocca, deve essere riavviato e alla fine non lo sarà in grado di avviarsi correttamente.

Qualsiasi tipo di "ma l'ho fatto e funziona" è pura fortuna.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.