Btrfs su SSD, "spazio non disponibile sul dispositivo"; catch-22 con `fstrim` e` btrfs balance`; come recuperare?


3

Il filesystem di root del mio Kubuntu (montato sotto / ) è Btrfs. Io non uso -o discard come opzione di montaggio. Questo significa Ho bisogno di correre fstrim su richiesta .

In passato ho riscontrato questo problema: btrfs, nessun disco lasciato . Ho notato fstrim -v / mostrava quasi che nessuno spazio fosse tagliato. La mia soluzione era di correre btrfs balance start / prima fstrim. Questo è l'essenza di la mia risposta lì .

Oggi è diverso. Forse sono in ritardo con la manutenzione. È questo che succede:

# fstrim -v /
/: 24 KiB (24576 bytes) trimmed
# btrfs balance start /
ERROR: error during balancing '/': No space left on device

Ho eliminato alcuni sottovolumi (istantanee) con btrfs subvolume delete … e non ha aiutato. Non ricordo bene i dettagli, ma penso che in precedenza avrei potuto correre btrfs balance … perché preliminare fstrim tagliati almeno pochi MiB, non meno di 24 KiB come oggi. Ora sembra una situazione di catch-22 dove fstrim o btrfs balance Funzionerebbe solo se l'altro ha fatto il suo lavoro prima.

Per la cronaca, queste sono alcune statistiche che dimostrano che in effetti ho molto spazio:

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       112G   43G   68G  39% /

# btrfs fi df /
Data, single: total=108.73GiB, used=41.00GiB
System, single: total=64.00MiB, used=16.00KiB
Metadata, single: total=3.00GiB, used=1.02GiB
GlobalReserve, single: total=352.00MiB, used=0.00B

Nota: "Non ho ancora spazio sul dispositivo" durante il normale funzionamento. Penso che Btrfs continui ad adattare le nuove scritture all'interno di blocchi già presi. Tuttavia in passato ho colpito "nessuno spazio lasciato ..." durante apt-get upgrade, poi ho recuperato con btrfs balance e fstrim. Non so quando (se) questo mi colpisce ancora. Mi piacerebbe fare la mia manutenzione prima di ottenere "nessuno spazio lasciato ..." quando si fa qualcosa di importante.

Come recuperare da questa situazione così fstrim e btrfs balance non bloccarti l'un l'altro? Posso risolvere questo problema dal mio sistema in esecuzione?

In effetti l'ho già risolto, la mia risposta è qui sotto. La domanda è per riferimento futuro. Sentiti libero di aggiungere un'altra soluzione.


Informazioni aggiuntive:

$ uname -a
Linux foobar 4.4.0-78-generic #99-Ubuntu SMP […] x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

# dpkg -l | grep btrfs
ii  btrfs-tools  4.4-1ubuntu1  amd64  Checksumming Copy on Write Filesystem utilities

Risposte:


4

Sì, puoi recuperare dal tuo sistema in esecuzione. Il mio approccio originale è in basso; tuttavia, grazie al commento di Zan Lynx ho trovato un modo più semplice.

Il mio approccio migliorato

Questo è il commento citato:

Oppure se stai pensando in anticipo puoi dire a btrfs di usare meno del massimo del dispositivo btrfs filesystem resize

(Rispetto al mio approccio originale, il punto è di avere deliberatamente spazio libero su questo particolare dispositivo e di espandere il filesystem lì, piuttosto che aggiungere un dispositivo separato che potrebbe non essere così semplice.)

Buone notizie: i miei test indicano che non devo pensare al futuro! Anche se btrfs balance start / getta "senza spazio ...", sono ancora in grado di ridurre il filesystem, se solo c'è spazio per esso (cioè tutti i file e i metadati si adattano alle nuove dimensioni). Questo porta alla seguente soluzione:

# btrfs filesystem resize -100M /  # shrink a little...
Resize '/' of '-100M'
# btrfs filesystem resize +100M /  # ... and expand back
Resize '/' of '+100M'
# btrfs balance start /            # should work now
Done, had to relocate 88 out of 88 chunks
# fstrim -v /
/: 67,8 GiB (72753831936 bytes) trimmed

Il mio approccio originale

Questo è quello che devi fare (descrizione dettagliata in basso):

  1. Aggiungi un dispositivo aggiuntivo al filesystem Btrfs.
  2. btrfs balance start …
  3. fstrim …
  4. Elimina il dispositivo extra dal filesystem Btrfs.
  5. btrfs balance start …
  6. fstrim …

Il trucco è aggiungere un dispositivo aggiuntivo al filesystem Btrfs, quindi btrfs balance … ha un po 'di spazio aggiuntivo. Il dispositivo potrebbe essere come /dev/sdb o /dev/sdb3. In questo esempio sto usando un normale file 1 GiB sul mio HDD ( molto importante: Ricontrollo il file non appartiene al filesystem Btrfs che voglio espandere! questo potrebbe essere fatale). Penso che un file nella RAM (ad es /dev/shm/ ) dovrebbe andare bene.

# tmpf=/mnt/hdd/tempfile   # if this file exists, it will be overwritten!
# truncate -s 1G "$tmpf"
# extra=$(losetup -f --show "$tmpf")

Adesso $extra è come /dev/loop0 o qualcosa.

# btrfs device add "$extra" /

Al momento non devo riavviare il mio sistema operativo. Se lo facessi, mancherebbe una parte del suo filesystem di root perché no /dev/loop* sarebbe associato con /mnt/hdd/tempfile. Questo non sarà un problema se utilizzi un dispositivo normale (o una partizione) come dispositivo extra perché btrfs device scan durante l'avvio lo rileverà.

# btrfs balance start /

Nel mio caso il tempfile è un file sparse. In un'altra console corro watch ls -hls /mnt/hdd/tempfile e noto quando cresce fino alla sua (quasi) piena dimensione. In questo modo, so quando alcuni blocchi Btrfs vengono spostati dall'SSD. In caso di dubbio, lascia btrfs ballance … finire; ma io invoco btrfs balance cancel / per risparmiare un po 'di tempo. Ora torniamo alla console principale.

Nota: la prima riga sotto è da sopra btrfs balance start / comando che è stato interrotto.

balance canceled by user
# fstrim -v /
/: 26,7 GiB (28696862720 bytes) trimmed

fstrim tagliato più di prima. Non ho più bisogno del mio dispositivo extra.

# btrfs device delete "$extra" /   # may take a while
# btrfs balance start /            # should work now
Done, had to relocate 88 out of 88 chunks
# fstrim -v /
/: 67,8 GiB (72753831936 bytes) trimmed

E questo è tutto. Ora è il momento di pulire:

# losetup -d "$extra"
# rm "$tmpf"

Uso spesso un'unità USB o swapoff -a e formatto la mia partizione di swap come dispositivo btrfs. L'utilizzo di un'unità RAM sembra troppo rischioso.
Zan Lynx

1
Oppure se stai pensando in anticipo puoi dire a btrfs di usare meno del massimo del dispositivo btrfs filesystem resize
Zan Lynx

@ZanLynx Grazie! Ho migliorato molto la mia risposta con questo resize idea.
Kamil Maciorowski
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.