Få dobbelt så meget filplads under Linux

Af Keld Simonsen

Jeg har en bærbar PC med kun 2 Gb disk. Det kan hurtigt blive for lidt, og under Linux er der så mulighed for at have kompression  i standard-flisystemet ext2. Dette giver for  et standard-filsystem som RedHat 5.0 i fuld installation, en besparelse på ca 50 %, eller sagt på en anden måde: man kan have ca dobbelt så meget på harddisken.

Komprimeringen virker som en udvidelse til standard ext2-filsystemet. Man behøver ikke at lave sit ext2-filsystem om, reformattere el. lign., og kompressionen kan virke på enkelte filer, på et katalog eller på et træ af kataloger. Alt, man behøver er at installere et kernepatch og nogle utilities.

Jeg har kørt med det i ca 2 måneder, og haft en del nedbrud af andre årsager, uden at have tabt en eneste fil af betydning. Andre melder ligeledes om problemfri drift.
 

Hvad gør man?

En udførlig vejledning kan findes på http://www.netspace.net.au/~reiter/e2compr/ . I det følgende gives en kogebog for versionen 0.3.x  for nyere stabile kerner, dvs Linux-kerner version 2.0.3x og på i386 platform. Der er en nyere version på vej (0.4.x), som er også på vej ind i standard kernen, men der findes ikke nogen produktionspatch for dette til de kurante stabile linux-kerner.

To ting skal gøres:

1. installer kernepatch fra   http://www.dkuug.dk/keld/e2compr-pre0.3.5-patch-2.0.gz.uu i /usr/src - installer patch:

               cd /usr/src
               uudecode   <path>/e2compr-pre0.3.5-patch-2.0.gz.uu
               linux/scripts/patch-kernel

Derefter generer ny kerne på sædvanlig måde, evt også nye moduler.

               cd /usr/src/linux
               make menuconfig

Her stilles bl.a. spørgsmål om hvordan kompressionen skal virke. Jeg vil anbefale at man  installerer de fulde faciliteter såsom komprimer indirekte blokke, 32 blooke i cluster; man kan så senere finde ud af om man vil bruge dem eller ej.

               make zImage
               make modules
               make modules_install
               cp   arch/i386/boot/zImage   /boot/zImage
               lilo

(Eller hvor man nu  har sin kerne installeret).
 
2. Installer utilities: fsck, fsck.ext2, chattr, lsattr, e2compress, e2ratio.  Disse findes i filen  http://www.dkuug.dk/keld/2compr-971220.tar.gz.uu
 
 Så download denne fil og pak den ud, installer (check lige Makefile først):

                uudecode -o - e2compr-971220.tar.gz.uu | tar xvzf -
                cd  e2compr-971220/prebuilt
                make install

Hvordan virker det?

Kompressionen er en udvidelse til standard-filsystemt "ext2". For hver fil er der indført nogle flere attributter, herunder en for kompression, og der er også en parameter for hvilken kompressionsalgoritme der bruges. Tligængelige kompressionsalgoritmer er bl.a. gzip  i forskellige niveauer og lzv.  Disse udvidelser med attributter mv. ligger allerede i standard ext2 filsystemet, så der er ikke behov for at reformattere eller reorganisere filsystemet når man vil have kompression  med.

Hvorhenne data ligger er beskrevet for hver fil i dens inode. For hver diskblok (normalt af størrelsen 1 kilobyte i ext2-filsystemet) gives en addresse på disken hvor data ligger. Der laves så kompression på et antal diskblokke, fx 32 diskblokke ad gangen, og den plads der  spares bliver noteret som diskblokke, som ikke er allokerede. Internt i kernen er blokkene allokerede ukomprimerede; kompression og dekompression sker hhv. når en fil lukkes endeligt og ved indlæsning fra disken.

Der  sker ikke kompression hvis kernen på udskrivningstidspunktet finder ud af at der ikke spares diskplads ved kompressionen. Det kan være fordi filen er lille og alt alligevel kan være på den første diskblok, eller at filen i forvejen er komprimeret (fx en .gz fil).

Designet af dette er således rimeligt sikkert, det bygger på det mest udbredte filsystem til Linux,
nemlig ext2 filsystemet, og det virker på filniveau, så en enkelt fejl vil ikke påvirke hele filsystemet.  Man skal dog passe på med at boote en ny  (eller gammel) kerne  uden filkompression på et system med kompression, det kan give problemer med nyligt dannede filer, som skulle være komprimerede, men ikke er det. Det kan anbefales at filer, der skal bruges ved opstart, fx i /etc, /bin og /sbin ikke komprimeres - en kerne uden kompression vil da kunne komme i luften..

Hvordan bruges det?

Når filkompression er installeret bruges programmet "chattr" til at ændre om en fil komprimeres eller ej. Hvis man sætter kompression for et katalog, vil også nye filer i kataloget blive komprimeret.

"lsattr" udskriver attributter for filer. Den version jeg har brugt kunne kun gøre det for alle filer i et katalog. "du"  giver den reele plads brugt, ligesom "s" option på "ls" giver  det relle antal blokke brugt (mens størrelsen ikke ændres ved kompression)..
 

Performance

Komprimering er jo et klassisk valg mellem tid og plads. Mine tal er fra en 133 MHz 586 med 24 Mb RAM og en almindelig harddisk under RedHat 5.0. Af og til er den ekstra tid mærkbar, især ved loadning af større applikationer. Fx netscape har jeg sat til at være ukomprimeret. Ved kompilering af systemer er forskellen ikke stor - fx tog det 8 % længere for de komprimerede filer  ved kompileringen af kernen (make zImage - 13:40 minutter / 14:40 minutter).

Pladsmæssigt er der typisk kun 5 - 10 procents forskel på at have en .gz fil og og have en fil komprimeret af kernen.  Man kan typisk spare 50 % plads på et helt filsystem (idet nogen filer er komprimerede i forvejen), og mere på udvalgte kataloger, fx HOWTO filerne sparedes der ca 60 % på og kernens filer sparedes der ca 65 % på.
 

Afslutning

Jeg synes egentlig at man godt kunne lægge denne facilitet ind i standarddistributionen af Linux-kernen. Det er meget stabilt, og hvis det ikke anvendes, koster det blot lidt ekstra plads i kernen, men sløver ikke systemet ned.  Det vil også fjerne problemer med at bruge kerner  fra nye distributioner  uden kompression, på filsystemer med kompression. Mine nyeste informationer er da også at dette er på vej ind i kernen, først som eksperimentel driver, og ikke kompatibel med ovenstående....