Bzip2 Howto

David Fetter dfetter@best.com
v1.92 18 sierpnia 1998
Wersja polska: Krzysztof P. Jasiutowicz kpjas@priv.onet.pl
v0.99, 28 sierpnia 1998


Ten tekst wyja�nia jak u�ywa� programu do kompresji bzip2. Lokalna wersja tego tekstu w sgml-u jest dost�pna tu tu, a "autor-ytatywna" pod tym adresem tu. Dokument ten zosta� napisany w standardzie ISO-8859-2.

1. Wst�p

Bzip2 to superowy nowy algorytm kompresji danych. Og�lnie rzecz bior�c tworzy pliki, kt�re s� 60-70% mniejsze od takich samych plik�w spakowanych gzip-em.

Ten dokument opisze kilka typowych zastosowa� bzip2-a.

Przysz�e wersje tego dokumentu b�d� dotyczy�y planowanej bzip2 library kt�r� autor bzip2-a, Julian Seward opisuje nast�puj�co:

Pracuj� nad nast�pn� wersj� bzip2-a, kt�ra b�dzie u�ywa� tego samego
formatu pliku .bz2; g��wn� nowo�ci� b�dzie biblioteka podobna do zlib
s�u��ca do odczytywania i zapisu danych w tym formacie z poziomu programu.

Przysz�e wersje tego dokumentu mog� tak�e zawiera� podsumowanie dyskusji nad tym czy (i jak) bzip2 powinno by� zastosowane w j�drze Linux-a.

1.1 Revision History

v1.92

Zaktualizowa�em rozdzia� Pobieranie binari�w bzip2, doda�em S.u.S.E.

v1.91

Poprawi�em b��d w pisowni i poprawi�em kilka idiom�w shell-a w rozdziale o u�ywaniu bzip2-a z tar-em. Podzi�kowania dla Alessandro Rubini za nie.

Poprawi�em aby narz�dzie buzzit nie [to stomp] oryginalnego archiwum bzip2-a.

Doda�em bgrep, narz�dzie podobne do zgrep-a.

v1.9

Poprawi�em problem z gcc 2.7.*. Podzi�kowanie dla Ulrika Dickow-a za wskazanie go.

Doda�em elegancki spos�b Leonard-a Jean-Marc-a pos�ugiwania si� tar-em.

Doda�em szwedzkie t�umaczenie Linus-a �kerlund-a.

Poprawi�em rozdzia� o wu-ftpd np. sugestii Arnaud Launay-a.

Przenios�em t�umaczenia ich odpowiednich rozdzia��w.

v1.8

Wstawi�em buzzit i tar.diff do sgml-a tam gdzie ich miejsceg. Poprawi�em interpunkcj� i formatowanie. Podzi�kowania dla Arnaud Launay za jego pomoc w poprawianiu mojej w�asnej wersji. :-)

Porzuci�em xv project na razie z powodu braku wi�kszego zainteresowania.

Wspomnia�em o tipsach w przysz�ych wersjach tego dokumentu.

v1.7

Doda�em aplikacj� buzzit. Poprawi�em patch do na�o�enia na gnu tar.

v1.6

Doda�em tip TenThumbs-a dot. Netscape.

Tak�e zmieni�em lesspipe.sh dzi�ki jego sugestii. Powinien teraz lepiej dzia�a�.

v1.5

Doda�em francuskie t�umaczenie Arnaud Launay-a, i jego plik wu-ftpd.

v1.4

Doda�em japo�skie t�umaczenie Tetsu Isaji-ego.

v1.3

Doda�em plik Ulrik Dickow-a .emacs do emacs-a 19.30 lub wy�szej wersji.

(tak�e poprawi�em patch jka-compr.el do emacs-a dzi�ki jego sugestii. Ojej! Bzip2 nie ma jeszcze(?) flagi "append".)

v1.2

Zmienilem patch do emacs-a aby automagicznie rozpoznawa� pliki .bz2.

v1.1

Doda�em patch dla emacs-a.

v1.0

Runda 1.

2. Jak zdoby� bzip2

Home page Bzip2-a znajduje si� na Home site w Wielkiej Brytanii. Mirror site w U.S.A jest tu. Mo�na te� znale�� go na site-cie FTP Red Hat-a tu.

2.1 Bzip2-HOWTO w twoim j�zyku

Osoby pos�uguj�ce si� j�zykiem francuskim mog� skierowa� si� do francuskich dokument�w Arnaud Launay-a. Wersja WWW jest tu, a ftp mo�na u�y� tu Z Arnaud mo�na skontaktowa� si� poczt� elektroniczn� pod tym adresem

Osoby pos�uguj�ce si� j�zykiem japo�skim mog� skierowa� si� do japo�skich dokument�w Tetsu Isaji tu. Z Isaji mo�na skotaktowa� si� na jego stronie WWW, lub poczt� elektroniczn� pod tym adresem.

Osoby pos�uguj�ce si� j�zykiem szwedzkim mog� skierowa� si� do szwedzkich Linus-a �kerlund-a tu. Z Linus-em mo�na si� skontaktowa� poczt� elektroniczn� pod tym adresem.

2.2 Jak zdoby� prekompilowane binaria bzip2-a

Zobacz Home site-y.

Binarium Debian Intel jest tu.

Binarium alpha Red Hat-a jest tu.

Binarium Intel Red Hat-a jest tu.

Binarium SPARC Red Hat-a jest tu.

Binarium Intel Slackware jest tu.

Binarium Intel S.u.S.E jest tu.

Wy�ej wymienione s� tak�e dost�pne w analogicznuch miejscach r�nych lustrzanych site-�w.

2.3 Jak zdoby� �r�d�a bzip2-a

Znajduj� si� na oficjalnych site-ach (zobacz w Jak zdoby� Bzip2 gdzie, albo Red Hat ma je tu).

2.4 Kompilacja bzip2-a dla twojej maszyny

Je�li masz gcc 2.7.*, zmie� linijk� kt�ra brzmi

CFLAGS = -O3 -fomit-frame-pointer -funroll-loops

na

CFLAGS = -O2 -fomit-frame-pointer

to jest, zamie� -O3 na -O2 i pomi� -funroll-loops. You may also wish to add any -m* flags (like -m486, for example) you use when compiling kernels.

Usuni�cie -funroll-loops jest najistotniejsz� cz�ci�, poniewa� mo�e to spowodowa� wiele gcc 2.7-�w b�dzie generowa�o nieprawid�owy kod, a wszystkie gcc 2.7-y b�d� wi�kszy i wolniejszy kod wynikowy. Dla innych kompilator�w (lcc, egcs, gcc 2.8.x) standartowe CFLAGS s� w porz�dku.

Potem, po prostu make i zainstaluj wg README.

3. U�ywanie bzip2

Przeczytaj Wspanaia�� Stron� Podr�cznika Systemowego :)

4. U�ywanie bzip2 z tar-em

Poni�ej s� opisane trzy metody u�ywania bzip2 z tar-em, a mianowicie

4.1 Naj�atwiejsza do zrobienia:

Ta metoda nie wyamga wcale �adnych zmian. Aby od-tar-owa� bzip2-owane archiwum tar-owe, foo.tar.bz2 w aktualnym katalogu, wykonaj

/path/to/bzip2 -cd foo.tar.bz2 | tar xf -

To dzia�a, ale mo�e by� wnerwiaj�ce je�li wypisuje si� to zbyt cz�sto.

4.2 �atwa do zrobienia, do�� �atwa w u�yciu, nie trzba mie� uprawnie� root-a:

Dzi�ki dla Leonard Jean-Marc za ten tip. Dzi�ki tak�e dla Alessandro Rubini za wprawadzenie r�nic specyficznych dla csh.

W swoim .bashrc, mo�esz wstawi� tak� linijk� :

alias btar='tar --use-compress-program /usr/local/bin/bzip2 '

W .tcshrc, lub .cshrc, analogiczna linijka wygl�da tak:

alias btar 'tar --use-compress-program /usr/local/bin/bzip2'

4.3 Te� �atwa do zrobienia, ale wymaga dost�pu jako root.

Na�� poni�szy patch na gnu tar 1.12 w nast�puj�cy spos�b:

cd tar-1.12/src; patch < /path/to/tar.diff
skompiluj go, i zainstaluj go, i wszystko ju� gotowe do dzia�ania. Upewnij si� ze zar�wno tar jak i bzip2 s� w twojej $PATH poprzez "which tar" i "which bzip2." Aby u�y� nowego tar-a, po prostu zr�b
 tar xyf foo.tar.bz2
aby zdekompresowa� plik.

Aby utworzy� nowe archiwum, podobnie zr�b:

 tar cyf foo.tar.bz2 file1 file2 file3...directory1 directory2...

A oto patch:

*** tar.c       Thu Jun 11 00:09:23 1998
--- tar.c.new   Thu Jun 11 00:14:24 1998
***************
*** 196,201 ****
--- 196,203 ----
    {"block-number", no_argument, NULL, 'R'},
    {"block-size", required_argument, NULL, OBSOLETE_BLOCKING_FACTOR},
    {"blocking-factor", required_argument, NULL, 'b'},
+   {"bzip2", required_argument, NULL, 'y'},
+   {"bunzip2", required_argument, NULL, 'y'},
    {"catenate", no_argument, NULL, 'A'},
    {"checkpoint", no_argument, &checkpoint_option, 1},
    {"compare", no_argument, NULL, 'd'},
***************
*** 372,377 ****
--- 374,380 ----
                PATTERN                at list/extract time, a globbing PATTERN\n\
    -o, --old-archive, --portability   write a V7 format archive\n\
        --posix                        write a POSIX conformant archive\n\
+   -y, --bzip2, --bunzip2             filter the archive through bzip2\n\
    -z, --gzip, --ungzip               filter the archive through gzip\n\
    -Z, --compress, --uncompress       filter the archive through compress\n\
        --use-compress-program=PROG    filter through PROG (must accept -d)\n"),
***************
*** 448,454 ****
     Y  per-block gzip compression */
  
  #define OPTION_STRING \
!   "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"
  
  static void
  set_subcommand_option (enum subcommand subcommand)
--- 451,457 ----
     Y  per-block gzip compression */
  
  #define OPTION_STRING \
!   "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxyz"
  
  static void
  set_subcommand_option (enum subcommand subcommand)
***************
*** 805,810 ****
--- 808,817 ----
        case 'X':
        exclude_option = 1;
        add_exclude_file (optarg);
+       break;
+ 
+       case 'y':
+       set_use_compress_program_option ("bzip2");
        break;
  
        case 'z':

5. U�ywanie bzip2 z less-em

Aby dekompresowa� pliki bzip2 w locie, tj. aby m�c u�ywa� less-a do czytania ich bez wcze�niejszego bunzip2-owania ich, nale�y zrobi� lesspipe.sh (man less) w ten spos�b:

#!/bin/sh
# To jest preprocessor dla 'less-a'.  Jest on u�ywany, gdy ta zmienna 
# �rodowiskowa jest ustawiona:   LESSOPEN="|lesspipe.sh %s"

  case "$1" in
  *.tar) tar tvvf $1 2>/dev/null ;; # Ogl�daj zawarto�� r�nych plik�w tar-owych
  *.tgz) tar tzvvf $1 2>/dev/null ;;
# Dzia�a dla niezmodyfikowanej wersji tar-a 
  *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tzvvf - ;;
# Dzia�a z spatchowan� wersj� tar-a 
# *.tar.bz2) tyvvf $1 2>/dev/null ;;
  *.tar.gz) tar tzvvf $1 2>/dev/null ;;
  *.tar.Z) tar tzvvf $1 2>/dev/null ;;
  *.tar.z) tar tzvvf $1 2>/dev/null ;;
  *.bz2) bzip2 -dc $1  2>/dev/null ;; # Ogl�daj spakowane pliki  
  *.Z) gzip -dc $1  2>/dev/null ;;
  *.z) gzip -dc $1  2>/dev/null ;;
  *.gz) gzip -dc $1  2>/dev/null ;;
  *.zip) unzip -l $1 2>/dev/null ;;
  *.1|*.2|*.3|*.4|*.5|*.6|*.7|*.8|*.9|*.n|*.man) FILE=`file -L $1` ; # groff src
    FILE=`echo $FILE | cut -d ' ' -f 2`
    if [ "$FILE" = "troff" ]; then
      groff -s -p -t -e -Tascii -mandoc $1
    fi ;;
  *) cat $1 2>/dev/null ;;
#  *) FILE=`file -L $1` ; # Check to see if binary, if so -- view with 'strings'
#    FILE1=`echo $FILE | cut -d ' ' -f 2`
#    FILE2=`echo $FILE | cut -d ' ' -f 3`
#    if [ "$FILE1" = "Linux/i386" -o "$FILE2" = "Linux/i386" \
#         -o "$FILE1" = "ELF" -o "$FILE2" = "ELF" ]; then
#      strings $1
#    fi ;;
  esac

6. U�ywanie bzip2 z emacs-em

6.1 Zmaina emacs-a dla wszystkich:

Napisalem ten patch do jka-compr.el kt�ry dodaje bzip2 do auto-compression-mode.

Disclaimer: Spawdzi�em go tylko z emacs-20.2, ale nie mam powod�w by s�dzi�, �e podobne post�powanie nie b�dzie dzia�a� z innymi wersjami.

By go u�y�,

  1. Przejd� do katalogu �r�d�owego emacs-20.2/lisp (tam gdzie go roztarowa�e�)
  2. Wstaw ten patch do pliku jka-compr.el.diff ( powinien by� sam w tym pliku ;).
  3. Wykonaj
     patch < jka-compr.el.diff
    
  4. Wystartuj emacs-a, i wykonaj
     M-x byte-compile-file jka-compr.el
    
  5. Wyjd� z emacs-a.
  6. Przenie� pierwotny jka-compr.elc w bezpieczne miejsce gdyby by�y bug-i.
  7. Zast�p go new jka-compr.elc.
  8. Baw si� dobrze!
--- jka-compr.el        Sat Jul 26 17:02:39 1997
+++ jka-compr.el.new    Thu Feb  5 17:44:35 1998
@@ -44,7 +44,7 @@
 ;; The variable, jka-compr-compression-info-list can be used to
 ;; customize jka-compr to work with other compression programs.
 ;; The default value of this variable allows jka-compr to work with
-;; Unix compress and gzip.
+;; Unix compress and gzip.  David Fetter doda� bzip2 support :)
 ;;
 ;; If you are concerned about the stderr output of gzip and other
 ;; compression/decompression programs showing up in your buffers, you
@@ -121,7 +121,9 @@
 
 
 ;;; I have this defined so that .Z files are assumed to be in unix
-;;; compress format; and .gz files, in gzip format.
+;;; compress format; and .gz files, in gzip format, and .bz2 files,
+;;; in the snappy new bzip2 format from http://www.muraroa.demon.co.uk.
+;;; Keep up the good work, people!
 (defcustom jka-compr-compression-info-list
   ;;[regexp
   ;; compr-message  compr-prog  compr-args
@@ -131,6 +133,10 @@
      "compressing"    "compress"     ("-c")
      "uncompressing"  "uncompress"   ("-c")
      nil t]
+    ["\\.bz2\\'"
+     "bzip2ing"        "bzip2"         ("")
+     "bunzip2ing"      "bzip2"         ("-d")
+     nil t]
     ["\\.tgz\\'"
      "zipping"        "gzip"         ("-c" "-q")
      "unzipping"      "gzip"         ("-c" "-q" "-d")

6.2 Zmiana emacs-a dla pojedy�czego u�ytkownika:

Podzi�kowania za to male�� si� Ulrik-owi Dickow-owi, ukd@kampsax.dk, programi�cie systemowemu w Kampsax Technology:

Aby m�c u�ywa� bzip2 automatycznie gdy nie jeste� sysadmin-em, po prostu dodaj co nast�puje do swojego pliku .emacs.

;; Automatic (un)compression on loading/saving files (gzip(1) and similar)
;; We start it in the off state, so that bzip2(1) support can be added.
;; Code thrown together by Ulrik Dickow for ~/.emacs with Emacs 19.34.
;; Should work with many older and newer Emacsen too.  No warranty though.
;;
(if (fboundp 'auto-compression-mode) ; Emacs 19.30+
    (auto-compression-mode 0)
  (require 'jka-compr)
  (toggle-auto-compression 0))
;; Now add bzip2 support and turn auto compression back on.
(add-to-list 'jka-compr-compression-info-list
             ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'"
              "zipping"        "bzip2"         ()
              "unzipping"      "bzip2"         ("-d")
              nil t])
(toggle-auto-compression 1 t)

7. U�ywanie bzip2-a z wu-ftpd

Podzi�kowania dla Arnaud Launay za tego oszcz�dzacza bandwidth-u. To co nast�puje powinno si� znale�� w /etc/ftpconversions aby wykonywa� kompresj� i dekompresj� on-the-fly za pomoc� bzip2. Upewnij si�, �e �cie�ki takie jak (like /bin/compress) s� poprawne.

 :.Z:  :  :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
 :   : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
 :.gz: :  :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
 :   : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
 :.bz2: :  :/bin/bzip2 -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:BUNZIP2
 :   : :.bz2:/bin/bzip2 -9 -c %s:T_REG:O_COMPRESS:BZIP2
 :   : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
 :   : :.tar.Z:/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
 :   : :.tar.gz:/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP
 :   : :.tar.bz2:/bin/tar -c -y -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+BZIP2

8. U�ycie bzip2 z grep-em

Ten u�ytek, kt�ry nazwa�em bgrep, jest niewielk� modyfikacj� zgrep kt�ry jest dostarczany z Linux-em. Mo�na go u�ywa� do grep-owania plik�w bez bunzip2-owania ich najpierw.

#!/bin/sh

# bgrep -- a wrapper around a grep program that decompresses files as needed
PATH="/usr/bin:$PATH"; export PATH

prog=`echo $0 | sed 's|.*/||'`
case "$prog" in
        *egrep) grep=${EGREP-egrep}     ;;
        *fgrep) grep=${FGREP-fgrep}     ;;
        *)      grep=${GREP-grep}       ;;
esac
pat=""
while test $# -ne 0; do
  case "$1" in
  -e | -f) opt="$opt $1"; shift; pat="$1"
           if test "$grep" = grep; then  # grep is buggy with -e on SVR4
             grep=egrep
           fi;;
  -*)      opt="$opt $1";;
   *)      if test -z "$pat"; then
             pat="$1"
           else
             break;
           fi;;
  esac
  shift
done

if test -z "$pat"; then
  echo "grep through bzip2 files"
  echo "usage: $prog [grep_options] pattern [files]"
  exit 1
fi

list=0
silent=0
op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
case "$op" in
  *l*) list=1
esac
case "$op" in
  *h*) silent=1
esac

if test $# -eq 0; then
  bzip2 -cd | $grep $opt "$pat"
  exit $?
fi

res=0
for i do
  if test $list -eq 1; then
    bzip2 -cdfq "$i" | $grep $opt "$pat" > /dev/null && echo $i
    r=$?
  elif test $# -eq 1 -o $silent -eq 1; then
    bzip2 -cd "$i" | $grep $opt "$pat"
    r=$?
  else
    bzip2 -cd "$i" | $grep $opt "$pat" | sed "s|^|${i}:|"
    r=$?
  fi
  test "$r" -ne 0 && res="$r"
done
exit $res

9. U�ywanie bzip2-a z Netscape-m pod X-ami.

tenthumbs@cybernex.net pisze:

Znalaz�em spos�b aby spowodowa� �eby Linux-owy Netscape u�ywa� bzip2-a do Content-Encoding tak jak u�ywa gzip-a. Dodaj to do $HOME/.Xdefaults lub $HOME/.Xresources

U�ywam opcji -s poniewa� wol� straci� troch� z szybko�ci dekompresji na korzy�� zu�ycia RAM-u. Mo�n pomin�� t� opcj�, je�li kto� tak chce.

Netscape*encodingFilters:      \
        x-compress :  : .Z     : uncompress -c  \n\
        compress   :  : .Z     : uncompress -c  \n\
        x-gzip     :  : .z,.gz : gzip -cdq      \n\
        gzip       :  : .z,.gz : gzip -cdq      \n\
        x-bzip2    :  : .bz2   : bzip2 -ds \n

10. U�ycie bzip2-a do rekompresji plik�w skompresowanych w innych formatach

Ten program w perl-u pobiera plik skompresowany w innych formatach (.tar.gz, .tgz. .tar.Z, and .Z ) i przepakowuje je dla lepszej kompresji. Kod �r�d�owy w perl-u ma wiele porz�dnej dokumentacji dotycz�cej tego co robi i jak to robi co robi.

#!/usr/bin/perl -w

#######################################################
#                                                     #
# Ten program pobiera pliki skompresowane programami  #
# compress i gzip w aktualnym katalogu i zamienia je  #
# do formatu bzip2. Obs�uguje rozdszerzenie .tgz w    #
# prawid�owy spos�b, tworz�c plik .tar.bz2.           #
#                                                     #
#######################################################
$counter = 0;
$saved_bytes = 0;
$totals_file = '/tmp/machine_bzip2_total';
$machine_bzip2_total = 0;

while(<*[Zz]>) {
    next if /^bzip2-0.1pl2.tar.gz$/;
    push @files, $_;
}
$total = scalar(@files);

foreach (@files) {
    if (/tgz$/) {
        ($new=$_) =~ s/tgz$/tar.bz2/;
    } else {
        ($new=$_) =~ s/\.g?z$/.bz2/i;
    }
    $orig_size = (stat $_)[7];
    ++$counter;
    print "Repacking $_ ($counter/$total)...\n";
    if ((system "gzip -cd $_ |bzip2 >$new") == 0) {
        $new_size = (stat $new)[7];
        $factor = int(100*$new_size/$orig_size+.5);
        $saved_bytes += $orig_size-$new_size;
        print "$new is about $factor% of the size of $_. :",($factor<100)?')':'(',"\n";
        unlink $_;
    } else {
        print "Arrgghh!  Something happened to $_: $!\n";
    }
}
print "You've ",
      ($saved_bytes>=0)?"saved":"lost",
      " $saved_bytes bytes of storage space :",
       ($saved_bytes>=0)?")":"(", "\n";

unless (-e '/tmp/machine_bzip2_total') {
    system ('echo "0" >/tmp/machine_bzip2_total');
    system ('chmod', '0666', '/tmp/machine_bzip2_total');
}


chomp($machine_bzip2_total = `cat $totals_file`);
open TOTAL, ">$totals_file"
     or die "Can't open system-wide total: $!";
$machine_bzip2_total += $saved_bytes;
print TOTAL $machine_bzip2_total;
close TOTAL;

print "That's a machine-wide total of ",`cat $totals_file`," bytes saved.\n";

# # # #

Hosting by: Hurra Communications Sp. z o.o.
Generated: 2007-01-26 18:02:22