Czy btrfs automatycznie kompresuje istniejące pliki, gdy kompresja jest włączona?

26

Jako format mojego /systemu plików wybrałem btrfs w instalatorze Ubuntu 12.04 LTS. Po zakończeniu instalacji dodałem compress=lzoopcje montowania /etc/fstabi uruchomiłem ponownie.

Czy istniejące pliki zostaną teraz automatycznie skompresowane, czy też muszę jawnie coś zrobić, aby tak się stało?

ændrük
źródło
1
Nie musisz restartować, możesz po prostu sudo mount -o remount /i nowe opcje fstab zaczną obowiązywać.
sep332
Uwaga: może być konieczne użycie opcji kompresji lub niektóre pliki nadal pozostaną nieskompresowane bez względu na to, co robisz ...
rogerdpack
Uwaga dotycząca siły ściskającej. Normalny kompres ma tę cechę, że jeśli wykryje, że kompresja nie przynosi żadnych korzyści, nie zawraca sobie głowy kontynuowaniem kompresji dla tego konkretnego pliku (oszczędzając w ten sposób zmarnowany procesor). Używając siły kompresji, i tak próbuje bezużytecznej kompresji. Dobre przykłady, w których ma to zastosowanie, dotyczą plików już skompresowanych (multimedia, pliki zip itp.). Innymi słowy, siła ściskająca jest ogólnie złym pomysłem. ;)
zaTricky

Odpowiedzi:

27

Będziesz musiał uruchomić, btrfs fi defragmentaby wymusić rekompresję istniejących danych. W przeciwnym razie tylko nowe dane zostaną skompresowane.

Z FAQ :

... rozważ ponowne podłączenie -o compressi przepisanie określonych plików w miejscu lub uruchomienie, btrfs fi defragmentaby wszystko ponownie skompresować. To może zająć chwilę.

Norbert Fabritius
źródło
btrfs fi defragment -r -clzo / path / to / fs
David Goodwin
2
Co z autodefragopcją montowania? Czy to również powoduje, że kompresuje on wcześniej nieskompresowane pliki podczas automatycznej defragmentacji?
Geremia,
1
Upewnij się, że używasz „-r” flagi rekurencyjnej do kompresji w katalogach.
Salami,
10

Zrobiłem to, co powiedział Norbert Fabritius, ale nie zauważyłem żadnej kompresji w istniejących plikach - df -h / before btrfs fi defragment = 658MB | df -h / po defragmentacji btrfs fi = 658 MB. Nowe pliki są w porządku. Szukając trochę, przynieś mi ten cytat:

Uruchamianie tego:

# btrfs filesystem defragment ~/stuff

nie defragmentuje zawartości katalogu.

To jest z założenia. btrfs fi defrag działa na pojedynczym obiekcie systemu plików przekazywanym do> it. Oznacza to, że polecenie defragmentuje tylko metadane przechowywane przez katalog> obiekt, a nie zawartość katalogu. Jeśli chcesz zdefragmentować zawartość> katalogu, coś takiego byłoby bardziej przydatne:

# find -xdev -type f -exec btrfs fi defrag '{}' \;

Po tym mój / on zajmuje 656 MB - nic wielkiego, ale na pewno jest kompresja.

Źródło: https://btrfs.wiki.kernel.org/index.php/Problem_FAQ#Defragmenting_a_directory_doesn.27t_work

Mam nadzieję, że to pomoże.

Przepraszam za mój angielski.

J. Neto
źródło
1
1. Korzystając z btrfs, nie używaj ani nie ufaj df . 2. Aby uzyskać lepszy współczynnik kompresji, użyj zlib (jednak jest wolniejszy)
ignis
3
Czy twoja linia poleceń nie powinna zawierać, defrag -clzoczy defrag -czlibzamiast tego defrag, jeśli chcesz kompresować?
jbo5112,
5
Istnieje flaga rekurencyjna „-r”, więc możesz to zrobić teraz:btrfs fi defrag -r -czlib ~/stuff
Salami
8

Zgodnie z dokumentacją Oracle można kompresować istniejące pliki w istniejącym systemie plików online, defragmentując każdy plik w nim za pomocą opcji -c, -clzo lub -czlib. LZO jest zalecane ze względu na prędkość.

find / -xdev \( -type f -o -type d \) -exec btrfs filesystem defragment -v -clzo -- {} +

Używa polecenia find do uruchomienia defragmentatora btrfs na każdym pliku w głównym systemie plików (podanym ukośnikiem zaraz po poleceniu „find” na początku). Jeśli masz inne podwoluminy, możesz użyć go ponownie ze ścieżką podwolumny (na przykład mam w / home) zamiast pojedynczego ukośnika.

Będziesz do tego potrzebować uprawnień roota, więc jeśli chcesz, dodaj sudo z przodu.

Widzieć:

Geoff
źródło
3

Według https://btrfs.wiki.kernel.org/index.php/Mount_options#List_of_options dostępne są następujące algorytmy kompresji:


compress,compress-force
Enable compression. Starting with kernel 2.6.38 you can choose the algorithm for compression:

 - compress=zlib - Better compression ratio. It's the default and safe for olders kernels.
 - compress=lzo - Faster compression.
 - compress=no - Disables compression (starting with kernel 3.6). 

compress-force= - Enable compression even for files that don't compress well, like videos and dd images of disks. The options compress-force=zlib and compress-force=lzo works for kernels >2.6.38.

Note that old (before 2012) btrfs-progs versions will probably fail some operations (e.g. fsck) on filesystems with LZO compression. 

Uwaga: ten post jest odpowiedzią na dodatkowe pytanie, jakie typy algorytmów kompresji są dostępne, które zostały zadane poniżej ... więc nie obwiniaj mnie.

Rostislav Stribrny
źródło
2

Według ArchWiki :

Wskazówka: Kompresję można również włączyć dla każdego pliku bez korzystania z compressopcji montowania; po prostu zastosuj chattr +cdo pliku. Po zastosowaniu do katalogów spowoduje, że nowe pliki będą automatycznie kompresowane w miarę ich dostarczania.

Bardzo dobrze! Niech Bóg błogosławi BTRFS!

Ponadto z wiki BTRFS :

Czy mogę wymusić kompresję pliku bez korzystania z opcji kompresji ?

Tak. Narzędzie chattrobsługuje ustawienie atrybutu pliku c, który oznacza i-węzeł w celu kompresji nowo zapisanych danych.

Geremia
źródło
-9

Kompresja jest domyślnie włączona w Btrfs, więc jeśli nie zostanie ona wyraźnie wyłączona, należy ją skompresować.

Diego
źródło
11
Nieprawda, musisz przekazać compression=„swój ulubiony algorytm kompresji” w fstab, aby go włączyć.
turbo
@turbo Jakie algorytmy kompresji są dostępne?
ζ--
wygląda na to, że obecnie są dozwolone 2 kompresje (cóż, 3 jeśli policzysz
rogerdpack