Hlavní navigace

Tip pro diskový prostor

Boleslav Bobčík

Určitě jste se již dostali do situace, kdy vám váš harddisk začal být těsný a přemýšleli jste, jak nějaký ten MB prostoru ušetřit. Dnes přinášíme jeden užitečný tip, který vám může pomoci.

Pevné disky jsou sice každým měsícem větší a větší, ale nekonečnou kapacitu asi ještě nějaký čas mít nebudou. Někdy se hodí, aby software nezabíral ani kilobajt navíc (pokud jste třeba provozovatel webhostingové služby, jistě raději diskový prostor pronajmete, než aby doslova ležel ladem). Přitom množství standardně instalovaného softwaru se chová poměrně nešetrně, protože obsahuje informace pro ladění programů. Ty jsou potřeba jen pro programátory v situaci, když hledají chyby. Běžný uživatel (jestli lze uživatele Linuxu nazvat běžný) často ani neví, že něco takového existuje.

O tom, jestli i ve vašem systému nejsou programy s těmito přebytečnými daty, se můžete přesvědčit velice jednoduše. Stačí v příslušném adresáři, například /bin, provést:

$ file * | egrep 'executable'

Na vysvětlenou pro méně zkušené: program file odhaduje podle obsahu souboru, v jakém je formátu. Rozpoznává mnoho grafických, zvukových a dalších formátů, pro nás jsou podstatné linuxovské spustitelné programy. Dozvíme se totiž i to, které soubory obsahují ladicí informace: ve výpisu se objeví „not stripped“.

Pokud jsme nějaké soubory obsahující balast objevili, máme samozřejmě možnost zmenšit je na přijatelnou (to jest minimální) velikost. K tomu slouží program strip, součást programátorských nástrojů (binutils). Jeho funkcí je odstranění tabulky symbolů z programových modulů, tedy i přímo z programů.

Nejprve, jako dobře vychovaní administrátoři, všechny programy z cílového adresáře zazálohujeme, abychom měli ústupovou cestu v případě nějaké chyby. Pak v tomto adresáři provedeme trochu komplikovanější operaci:

$ for SOUBOR in *; do \
      (file $SOUBOR | egrep 'executable.*not stripped' > /dev/null) \
          && strip -S $SOUBOR; \
  done

Každý soubor v cílovém adresáři takto otestujeme, zda jeho identifikace programem file určuje spustitelný program s ladicími údaji. Z nalezených cílů pak tento balast odstraníme. Tento postup je po malých úpravách možné použít i na sdílené knihovny, které také často obsahují (z neprogramá­torského hlediska) odpad.

U běžných linuxových utilit obvykle příliš velkou úsporu místa nezískáme, bude se jednat o několik kilobajtů. U rozsáhlých programových balíků bude ovšem rozdíl velmi zřetelný. Například modul jazyka PHP pro www server Apache má po kompilaci velikost asi 4 MB. Po odstranění ladicích informací zjistíme, že zabírá jen necelé 2 MB.

Našli jste v článku chybu?
3. 10. 2000 23:31
Selmi Lukoš (neregistrovaný)

Stripovat kniznice sa da uplne v pohode (dynamicke). Ja naviac rusim este sekcie .comment a .note, oplati sa to hlavne vtedy ak kompilovany program pozostaval z velkeho mnozstva zdrojakov - vtedy je vo vyslednom elfaci za kazdy zdrojak jeden riadok s identifikatorom kompilatora...

Inak ked sa vsetko odstripuje a miesta je stale malo, podumajte kus aj nad pakovanim (gzexe, upx) taky upx --best netscape ma celkom zaujimave vysledky ;-)

28. 9. 2000 14:18
Stanislav Brabec (neregistrovaný)

Myslím, že to bude tím, že moderní ELF sdílené knihovny strip většinou snesou (--strip-unused snad vždy). Pouze statické knihovny, linkovací moduly (např. do XFree86-4) a objekt kódy bych nestripoval. Jednou jsem takhle musel degradovat systém z glibc na libc5, protože jsem si po kompilaci glibc a gcc odstripoval /usr/lib/*crt*.o. Jinak na to mám vystavené celkem spolehlivé skripty na Penguinu (~utx/build). Ty poznají, co se nesmí stripovat.