Ubuntu glaubt, dass die Btrfs-Festplatte voll ist, aber nicht

11
$ cat /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=a168d1ac-4e13-4643-976d-6e47ea1732b1 /boot        ext2  defaults                                                                   0 1
/dev/mapper/sda4_crypt                    /            btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@          0 2
/dev/mapper/sda4_crypt                    /tmp         btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@tmp       0 2
/dev/mapper/sda4_crypt                    /run         btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@run       0 2
/dev/mapper/sda4_crypt                    /var/crash   btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-crash 0 2
/dev/mapper/sda4_crypt                    /var/tmp     btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-tmp   0 2
/dev/mapper/sda4_crypt                    /var/log     btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-log   0 2
/dev/mapper/sda4_crypt                    /var/spool   btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@var-spool 0 2
/dev/mapper/sda5_crypt                    /home        btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,subvol=@home      0 3
/dev/mapper/750er                         /media/750er ext4  defaults                                                                   0 4
/dev/mapper/cswap                         none         swap  defaults                                                                   0 5
➜  ~  df -h         
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   13M 100% /
none                    4,0K     0  4,0K   0% /sys/fs/cgroup
udev                    2,0G  4,0K  2,0G   1% /dev
tmpfs                   396M  1,3M  394M   1% /run
none                    5,0M     0  5,0M   0% /run/lock
none                    2,0G  208K  2,0G   1% /run/shm
none                    100M   36K  100M   1% /run/user
/dev/mapper/sda4_crypt   38G   12G   13M 100% /tmp
/dev/sda2               231M   44M  175M  21% /boot
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/crash
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/tmp
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/log
/dev/mapper/sda4_crypt   38G   12G   13M 100% /var/spool
/dev/mapper/sda5_crypt  3,7T  2,4T  1,2T  67% /home
/dev/mapper/750er       688G  276G  377G  43% /media/750er
/dev/mapper/2tb         1,8T  1,7T  141G  93% /media/2tb
➜  ~  sudo btrfs fi df /
Data, single: total=9.47GiB, used=9.46GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=13.88GiB, used=1.13GiB
Metadata, single: total=8.00MiB, used=0.00
➜  ~  

Es ist eine 40-GB-Partition mit einigen Schnappschüssen. Aber es ist komprimiert, so dass ich denke, dass die 9,46 GB / 40 GB genau sind. Aber mein Ubuntu schlägt fehl, weil es sagt, dass es keinen Speicherplatz hat. Ich hatte apt-Fehler, kann keine Programme installieren und mein MySQL-Server konnte deswegen nicht gestartet werden.

Und ich weiß, dass dfich mich der Vollständigkeit halber nicht darauf verlassen kann .

Ich denke, Ubuntu verwendet, von dfdem bekannt ist, dass es intern falsch mit Btrfs meldet und aus diesem Grund fehlschlägt. Dies wäre für APT sinnvoll, wenn nach Speicherplatz gesucht wird. Es kann jedoch nicht auf die Festplatte geschrieben werden.

$ sudo time dd if=/dev/zero of=large bs=2G count=1
dd: error writing ‘large’: No space left on device
0+1 records in
0+0 records out
11747328 bytes (12 MB) copied, 1,29706 s, 9,1 MB/s
Command exited with non-zero status 1
0.00user 1.40system 0:01.44elapsed 97%CPU (0avgtext+0avgdata 2098028maxresident)k
160inputs+23104outputs (0major+383008minor)pagefaults 0swaps
Redanimalwar
quelle
1
Wie beantwortet die Antwort in dem Duplikat, mit dem ich verlinkt habe (erklärt btrfs fi df), Ihre Frage nicht?
Bain
Ich verstehe die Aussage "Der Unterschied zwischen insgesamt und verwendet (ca. 15 GB) ist Ihr fehlender Speicherplatz. Wie Sie sehen, wurde er bereits für Metadatenblöcke zugewiesen." Ich weiß nur, dass ich eine 40-Gig-Partition habe und es zeigt, dass ich = 9,46 GB verwendet habe. Muss ich zusätzlich die 13,88 GB DUP-Metadaten (was auch immer dies bedeutet) hinzufügen? Auch wenn noch viel Platz frei ist. Mir scheint, dieser Typ hat tatsächlich eine volle Festplatte, während dies für mich nicht der Fall ist.
Redanimalwar
Als vorübergehende Problemumgehung können Sie dem btrfs-Dateisystem ein Gerät hinzufügen und es später entfernen, wenn Sie das Problem behoben haben.
Ignis
2
Randnotiz: Sie sollten 0 0in Ihrem fstabfür die btrfs Subvolumes haben. Siehe diese FAQ
ignis

Antworten:

21

Btrfs unterscheidet sich von herkömmlichen Dateisystemen. Es ist nicht nur eine Schicht, die Dateinamen in Offsets auf einem Blockgerät übersetzt, sondern eher eine Schicht, die ein traditionelles Dateisystem mit LVM und RAID kombiniert. Und wie LVM hat es das Konzept, Speicherplatz auf dem zugrunde liegenden Gerät zuzuweisen, ihn jedoch nicht für Dateien zu verwenden.

Ein traditionelles Dateisystem ist in Dateien und freien Speicherplatz unterteilt. Es ist einfach zu berechnen, wie viel Speicherplatz belegt oder frei ist:

|--------files--------|                                                |
|------------------------drive partition-------------------------------|

Btrfs kombiniert LVM, RAID und ein Dateisystem. Das Laufwerk ist in Subvolumes unterteilt, die jeweils dynamisch dimensioniert und repliziert werden:

|--files--|    |--files--|         |files|         |                   |
|----@raid1----|------@raid1-------|-----@home-----|metadata|          |
|------------------------drive partition-------------------------------|

Das Diagramm zeigt die Partition, die in zwei Subvolumes und Metadaten unterteilt ist. Eines der Subvolumes ist dupliziert (RAID1), sodass von jeder Datei auf dem Gerät zwei Kopien vorhanden sind. Jetzt haben wir nicht nur das Konzept, wie viel Speicherplatz auf der Dateisystemebene frei ist, sondern auch, wie viel Speicherplatz auf der darunter liegenden Blockebene (Laufwerkspartition) frei ist. Der Speicherplatz wird auch von Metadaten belegt.

Wenn wir freien Speicherplatz in Btrfs berücksichtigen, müssen wir klären, um welchen freien Speicherplatz es sich handelt - um die Blockebene oder die Dateischicht? Auf der Blockebene werden Daten in 1-GB-Blöcken zugewiesen, sodass die Werte ziemlich grob sind und möglicherweise keinen Bezug zum Speicherplatz haben, den der Benutzer tatsächlich verwenden kann. Auf der Dateiebene ist es unmöglich, die Menge an freiem Speicherplatz anzugeben, da die Menge an Speicherplatz davon abhängt, wie er verwendet wird. Im obigen Beispiel nimmt eine auf dem replizierten Subvolume @ raid1 gespeicherte Datei doppelt so viel Speicherplatz ein wie dieselbe auf dem @ home- Subvolume gespeicherte Datei . Snapshots speichern nur Kopien von Dateien, die später geändert wurden. Es gibt keine 1-1-Zuordnung mehr zwischen einer Datei, wie sie der Benutzer sieht, und einer Datei, die auf dem Laufwerk gespeichert ist.

Sie können den freien Speicherplatz auf der Blockebene mit btrfs filesystem show /und den freien Speicherplatz auf der Subvolumebene mit überprüfenbtrfs filesystem df /


# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   13M 100% /

Für dieses gemountete Subvolume meldet df ein Laufwerk mit einer Gesamtgröße von 38 G, wobei 12 G verwendet werden und 13 M frei sind. 100% des verfügbaren Platzes wurde genutzt. Denken Sie daran, dass die Gesamtgröße 38G zwischen verschiedenen Subvolumes und Metadaten aufgeteilt ist - dies gilt nicht nur für dieses Subvolume.

# btrfs filesystem df /
Data, single: total=9.47GiB, used=9.46GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=13.88GiB, used=1.13GiB
Metadata, single: total=8.00MiB, used=0.00

Jede Zeile zeigt den gesamten Speicherplatz und den verwendeten Speicherplatz für einen anderen Datentyp und Replikationstyp. Bei den angezeigten Werten handelt es sich eher um Daten als um Rohbytes auf dem Laufwerk. Wenn Sie also RAID-1- oder RAID-10-Subvolumes verwenden, ist die Menge des verwendeten Rohspeichers doppelt so hoch wie die hier angezeigten Werte.

Die erste Spalte zeigt den Typ des gespeicherten Elements (Daten, System, Metadaten). Die zweite Spalte zeigt, ob eine einzelne Kopie jedes Elements gespeichert ist (einzeln) oder ob zwei Kopien jedes Elements gespeichert sind (DUP). Für vertrauliche Daten werden zwei Kopien verwendet, sodass eine Sicherung durchgeführt wird, wenn eine Kopie beschädigt ist. Bei DUP-Leitungen muss der verwendete Wert verdoppelt werden, um den auf dem tatsächlichen Laufwerk verwendeten Speicherplatz zu erhalten (da btrfs fs df gespeicherte Daten meldet, nicht den verwendeten Speicherplatz). Die dritte und vierte Spalte zeigen den gesamten und genutzten Platz. Es gibt keine freie Spalte, da die Menge an "freiem Speicherplatz" davon abhängt, wie er verwendet wird.

Das Besondere an diesem Laufwerk ist, dass Ihnen 9,47 GB Speicherplatz für normale Dateien zugewiesen sind, von denen Sie 9,46 GB verwendet haben. Aus diesem Grund erhalten Sie keinen Speicherplatz mehr für Gerätefehler . Sie haben 13,88 GB Speicherplatz für doppelte Metadaten zugewiesen, von denen Sie 1,13 GB verwendet haben. Da diese Metadaten DUP-dupliziert sind, bedeutet dies, dass 27,76 GB Speicherplatz auf dem tatsächlichen Laufwerk zugewiesen wurden, von dem Sie 2,26 GB verwendet haben. Daher werden 25,5 GB des Laufwerks nicht verwendet, stehen aber gleichzeitig nicht für Dateien zur Verfügung, in denen gespeichert werden soll. Dies ist das Problem "Btrfs riesige Metadaten zugewiesen" . Führen Sie aus, um dies zu korrigieren btrfs balance start -m /. Der Parameter -m weist btrfs an, nur Metadaten neu auszugleichen.

Ein ähnliches Problem besteht darin, dass nicht mehr genügend Metadaten vorhanden sind. Wenn die Ausgabe gezeigt hätte, dass die Metadaten tatsächlich voll sind ( verwendeter Wert nahe am Gesamtwert ), besteht die Lösung darin, mit dem Befehl zu versuchen, fast leere (<5% verwendete) Datenblöcke freizugeben btrfs balance start -dusage=5 /. Diese freien Blöcke könnten dann zum Speichern von Metadaten wiederverwendet werden.

Weitere Informationen finden Sie in den Btrfs-FAQs:

bain
quelle
Beachten Sie, dass btrfs derzeit kein unterschiedliches RAID auf verschiedenen Subvolumes haben kann. Dies ist jedoch geplant.
Ignis
Um nur die Metadaten auszugleichen, verwenden Sie btrfs Dateisystem balance -m, andernfalls werden die Daten ebenfalls neu geschrieben (was in diesem Fall unbrauchbar ist)
ignis
Beachten Sie auch, dass tatsächlich 27 GiB für Metadaten zugewiesen sind ( Quelle - "Die angezeigten Werte sind Daten und keine Rohbytes. Wenn Sie also RAID-1 oder RAID-10 verwenden, ist die Menge des verwendeten Rohspeichers doppelt so hoch wie die Werte, die Sie können siehe hier. ")
ignis
@ignis Vielen Dank für Ihre Kommentare, ich habe die Antwort bearbeitet.
Bain
1
@redanimalwar Die Antwort enthält ein Beispiel und eine Erklärung des freien Speicherplatzes in btrfs, da Sie sagten, Sie hätten die Erklärung bei btrfs nicht verstanden und es fehlt der freie Speicherplatz . Das Problem dort ist genau das gleiche Problem wie hier - überprüfen Sie die btrfs fi dfAusgabe - er hatte 49 GB eines 75 GB-Laufwerks für Metadaten zugewiesen, wobei 29 GB davon nicht verwendet wurden.
Bain
3

Kurze Antwort: Btrfs-Partitionsmetadaten werden von Standard-Festplatten-Dienstprogrammen wie df als "verwendet" angezeigt.

  1. Überprüfen Sie das Problemvolumen. beispielsweise: /

    btrfs subvolume list /
    
  2. Höchstwahrscheinlich füllen Schnappschüsse das Volumen. Löschen Sie den nicht benötigten Schnappschuss. Bewahren Sie eine vom letzten Datum auf. Sie sind sicher, dass das System einwandfrei funktioniert hat.

    btrfs subvolume delete <path> 
    

    Wobei der Pfad von der vorherigen Befehls-Subvolume-Liste stammt, in der "Snapshot" steht.

  3. Starten Sie neu und Sie sind fertig

Grund für das Problem könnte sein, dass Ihre Distribution oder Ihr Paketmanager jedes Mal, wenn Sie das System aktualisieren, Snaphots erstellt.

NB: Der Befehl balance schlägt fehl, wenn die Festplatte voll ist, da kein freier Speicherplatz vorhanden ist.

Michael Holopainen
quelle
2

In meinem Fall würde die Festplattennutzung nicht sinken, selbst wenn ich Dateien und Snapshots gelöscht hätte.

btrfs balance (Daten und Metadaten) funktionierte nicht mit dem Fehler "Kein Speicherplatz mehr auf dem Gerät"

btrfs balance start -m /
ERROR: error during balancing '/': No space left on device
There may be more info in syslog - try dmesg | tail

Das RAID1 zeigte auf beiden Festplatten die volle Auslastung, obwohl die tatsächliche Datennutzung weniger als ein Drittel davon betrug.

# btrfs fi sh
Label: none  uuid: 61a20f1a-c133-11e6-964b-d3bac0c48bbd
    Total devices 2 FS bytes used 153.94GiB
    devid    1 size 455.76GiB used 455.76GiB path /dev/sda2
    devid    2 size 455.76GiB used 455.76GiB path /dev/sdb2


# btrfs filesystem df /
Data, RAID1: total=452.73GiB, used=151.51GiB
System, RAID1: total=32.00MiB, used=80.00KiB
Metadata, RAID1: total=3.00GiB, used=2.42GiB
GlobalReserve, single: total=512.00MiB, used=0.00B

Lösung: Leere Brocken verwerfen , benötigt keinen zusätzlichen Platz:

btrfs balance start -dusage=0 /

btrfs balance start -musage=0 /

Quelle: https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-balance#ENOSPC

Alternative: Meine Lösung bestand darin, die Festplatten zu verkleinern. Siehe: /unix/239765/how-to-fix-btrfs-superblock-error-after-resize-shrink-btrfs-couldnt-get-super

btrfs filesystem resize 1:430g /
btrfs filesystem resize 2:430g /

(Befehle brauchen Zeit, überprüfen Sie das Syslog, um zu sehen, wie Blöcke verschoben werden.)

danach Größe ändern:

btrfs filesystem resize 1:450g /
btrfs filesystem resize 2:450g /

Danach funktionierte btrfs balance (Metadaten) wieder:

btrfs balance -m /

Dann btrfs Gleichgewicht der Daten (Verschieben von Datenblöcken mit einer Auslastung von weniger als 33%):

btrfs balance -dusage=33 /
Phiphi
quelle
1

Das Guthaben geht an @ignis und @bain. Nur um hier ohne den ganzen Vortrag eine einfache, direkt auf den Punkt bezogene Referenzantwort zu haben und um zu teilen, was ich tatsächlich getan habe, um das System wieder zum Laufen zu bringen.

btrfs balance start -m /mountpoint

Ist die magische Linie, um solche Probleme zu lösen.

Ich hatte einige Probleme, mit denen ich Sie nicht langweilen möchte, und ich weiß nicht, dass es notwendig war, dies von einer Live-CD aus auszuführen, aber was ich am Ende getan habe, nachdem das System durcheinander gebracht wurde und nicht gebootet wurde, war das Ausführen von btrfsck Die Geräte (entsperrte Krypto-Mapper) haben tatsächlich Fehler gefunden und dann das Root-BTRFS-Dateisystem ohne Optionen bereitgestellt /mnt, im Gegensatz zu meinem installierten System, auf /dem nur das @bereitgestellte Subvolume installiert ist . Also hatte ich auch alle Schnappschüsse und anderen Subvolumes drin. Ich weiß nicht, dass dies einen Unterschied macht.

btrfs balance start -m /mnt

Ich habe die Metadaten von erhalten

Metadata, DUP: total=13.88GiB, used=1.13GiB

zu

Metadata, DUP: total=1.38GiB, used=1.05GiB

Und eine Erfrischung:

$ sudo df -h /
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/sda4_crypt   38G   12G   26G  31% /

Also ich denke jetzt ist alles in Ordnung.

Redanimalwar
quelle