Jag har behövt köra btrfs balance
på mitt enda enhetsfilsystem när jag fick ENOSPC
även om det verkligen var ledigt utrymme.
Varför behöver detta köras?
Vad gör balansen egentligen?
Svar
Till skillnad från de flesta konventionella filsystem använder BTRFS en tvåstegsallokerare. Det första steget tilldelar stora områden av utrymme som kallas bitar för specifika datatyper , sedan tilldelar det andra steget block som ett vanligt filsystem inom dessa större regioner. Det finns tre olika typer av bitar:
-
Databitar: Dessa lagrar vanliga fildata.
-
Metadata Chunks: Dessa lagrar metadata om filer, inklusive bland annat tidsstämplar, kontrollsummor, filnamn, ägande, behörigheter och utökade attribut.
-
Systembitar: Detta är en speciell typ av bitar som lagrar data om var alla andra bitar finns.
Endast den typ av data som biten tilldelas för kan lagras i den biten. Det vanligaste fallet dessa dagar när du får ett -ENOSPC-fel på BTRFS är att filsystemet har slut på utrymme för data eller metadata i befintliga bitar och inte kan tilldela en ny bit. Du kan verifiera att så är fallet genom att kör btrfs fi df
på filsystemet som kastade felet. Om data- eller metadata-raden visar ett totalvärde som skiljer sig väsentligt från det använda värdet är det förmodligen orsaken.
Vad btrfs balance
gör är att skicka tillbaka saker genom fördelaren, vilket resulterar i att platsanvändningen i bitarna komprimeras. Om du till exempel har två metadatabitar som båda är 40% full, kommer en balans att resultera i att de blir en metadata som är 80% full. Genom att komprimera utrymmesanvändning så här kan balansoperationen ta bort de nu tomma bitarna och frigör därmed utrymme för tilldelning av nya bitar. Om du kör igen btrfs fi df
efter att du har kört saldot, bör du se att värdena Total och Begagnad ligger mycket närmare varandra, eftersom balansera bort bitar som inte behövdes längre.