The zlibc package allows transparent on the fly uncompression of gzipped files. Your programs will be able to access any compressed file, just as if they were uncompressed. Zlibc will transparently uncompresses the data from these files as soon as they are read, just as a compressed filesystem would do. No kernel patch, no recompilation of these executables and no recompilation of the libraries is needed.
It is not (yet) possible execute compressed files with zlibc. However, there is another package, called tcx, which is able to uncompress executables on the fly. On the other hand tcx isn't able to uncompress data files on the fly. Fortunately, the both zlibc and tcx may coexist on the same machine without problems.
Zlibc can be found at the following places (and their mirrors): ftp://zlibc.linux.lu/zlibc-0.9k.tar.gz ftp://www.tux.org/pub/knaff/zlibc/zlibc-0.9k.tar.gz ftp://ibiblio.unc.edu/pub/Linux/libs/compression/zlibc-0.9k.tar.gz ftp://ftp.gnu.org/gnu/zlibc/compression/zlibc-0.9k.tar.gz
Before reporting a bug, make sure that it has not yet been fixed in the Alpha patches which can be found at: http://zlibc.linux.lu/ http://www.tux.org/pub/knaff/zlibc
These patches are named zlibc-version-ddmm.taz, where version stands for the base version, dd for the day and mm for the month. Due to a lack of space, I usually leave only the most recent patch.
There is an zlibc mailing list at zlibc @ www.tux.org . Please send all bug reports to this list. You may subscribe to the list by sending a message with 'subscribe zlibc @ www.tux.org' in its body to majordomo @ www.tux.org . (N.B. Please remove the spaces around the "@" both times. I left them there in order to fool spambots.) Announcements of new zlibc versions will also be sent to the list, in addition to the linux announce newsgroups. The mailing list is archived at http://www.tux.org/hypermail/zlibc/latest
If you install zlibc on Linux, make sure that your shared loader (ld-linux.so.1/ld.so) understands LD_PRELOAD. (Best if ld.so-1.8.5 or more recent)
Type ./configure. This runs the GNU autoconfigure script which configures the ∞MakefileIntegral and the ∞config.hIntegral file. You may compile time configuration options to ./configure, see for details.
Type make to compile zlibc.
Type make install to install zlibc and associated programs to its final target.
To use this module, set the environment variable LD_PRELOAD to point to the object. Example (sh syntax):
or (csh syntax):
setenv LD_PRELOAD /usr/local/lib/uncompress.so On linux, use /lib/uncompress.so instead of /usr/local/lib/uncompress.so .
You might want to put these lines in your ∞.profileIntegral or ∞.cshrcIntegral in order to have the uncompressing functions available all the time. Compress your files using gzip and enjoy
For security reasons, the dynamic loader disregards environmental variables such as LD_PRELOAD when executing set uid programs.
However, on Linux, you can use zlibc with set uid programs too, by using one of the two methods described below:
You may ing the path to ∞uncompress.soIntegral into ∞/etc/ld.so.preloadIntegral instead of using LD_PRELOAD.
WARNING: If you use ∞/etc/ld.so.preloadIntegral, be sure to install ∞uncompress.soIntegral on your root filesystem, for instance in /lib, as is done by the default configuration. Using a directory which is not available at boot time, such as /usr/local/lib will cause trouble at the next reboot!
It is also careful to remove zlibc from ∞/etc/ld.so.preloadIntegral when installing a new version. First test it out using LD_PRELOAD, and only if everything is ok, put it back into ∞/etc/ld.so.preloadIntegral.
If you have a version of ld.so which is more recent than 1.9.0, you can set LD_PRELOAD to just contain the basename of ∞uncompress.soIntegral without the directory. In that case, the file is found as long as it is in the shared library path (which usually contains ∞/libIntegral and ∞/usr/libIntegral)). Because the search is restricted to the library search path, this also works for set-uid programs.
Example (sh syntax):
or (csh syntax):
setenv LD_PRELOAD uncompress.so
The advantage of this approach over ∞ld.so.preloadIntegral is that zlibc can more easily be switched off in case something goes wrong.
Once zlibc is installed, simply compress your biggest datafiles using gzip. Your programs are now able to uncompress these files on the fly whenever they need them.
After compressing your datafiles, you also need to change any potential symbolic links pointing to them. Let's suppose that ∞xIntegral is a symlink to ∞tstfilIntegral:
> echo 'this is a test' >tstfil > ln -s tstfil x > ls -l total 1 -rw-r--r-- 1 alknaff sirac 15 Feb 25 19:40 tstfil lrwxrwxrwx 1 alknaff sirac 8 Feb 25 19:40 x -> tstfil
After compressing it, you'll see the following listing:
> gzip tstfil > ls -l total 1 pr--r--r-- 1 alknaff sirac 15 Feb 25 19:40 tstfil lrwxrwxrwx 1 alknaff sirac 8 Feb 25 19:40 x -> tstfil
∞TstfilIntegral is now shown as a pipe by zlibc in order to warn programs that they cannot seek in it. Zlibc still shows it with its old name, and you can directly look at its contents: > cat tstfil this is a test
However, ∞tstfilIntegral is not yet accessible using the symbolic link: > cat x cat: x: No such file or directory
In order to make ∞tstfilIntegral accessible using the link, you have to destroy the link, and remake it: > rm x /bin/rm: remove `x'? y > ln -s tstfil x > ls -l total 1 pr--r--r-- 1 alknaff sirac 15 Feb 25 19:40 tstfil lrwxrwxrwx 1 alknaff sirac 8 Feb 25 19:44 x -> tstfil > cat x this is a test
If you compress datafiles with hard links pointing to them, gzip refuses to compress them.
> echo 'this is a test' >tstfil
> ln tstfil x
> ls -li
166 -rw-r--r-- 2 alknaff sirac 15 Feb 25 19:46 tstfil
166 -rw-r--r-- 2 alknaff sirac 15 Feb 25 19:46 x > gzip tstfil gzip: tstfil has 1 other link -- unchanged
Thus you need to remove these hard links first, and remake them after compressing the file.
> rm x
/bin/rm: remove `x'? y
> gzip tstfil
> ln tstfil x
> ls -li
167 pr--r--r-- 2 alknaff sirac 15 Feb 25 19:46 tstfil
167 pr--r--r-- 2 alknaff sirac 15 Feb 25 19:46 x > cat x this is a test
Usually, programs don't make system calls directly, but instead call a library function which performs the actual system calls. For instance, to open a file, the program first calls the open library function, and then this function makes the actual syscall. Zlibc overrides the open function and other related functions in order to do the uncompression on the fly.
If the open system call fails because the file doesn't exist, zlibc constructs the filename of a compressed file by appending .gz to the filename supplied by the user program. If this compressed file exists, it is opened and piped trough gunzip, and the descriptor of the read end of this pipe is returned to the caller.
In some cases, the compressed file is first uncompressed into a
temporary file, and a read descriptor for this file is passed to the
caller. This is necessary if the caller wants to call lseek on
the file or mmap it. A description of data files for which using
temporary is necessary can be given in the configuration files
∞/usr/local/etc/zlibc.confIntegral (∞/etc/zlibc.confIntegral on
Actually the location of the system-wide include file
depends on the settings of sysconfdir and prefix during
./configure (see section Compile-time configuration).
and ∞~/.zlibrcIntegral. See section Configuration files, for a detailed description of their syntax.
Many user programs try to check the existence of a given file by other system calls before actually opening it. That's why zlibc also overrides these system calls. If for example the user program tries to stat a file, this call is also intercepted.
The compressed file, which exists physically on the disk, is also called 'the real file', and the uncompressed file, whose existence is only simulated by zlibc is called 'the virtual file'.
The behavior of zlibc can be tailored using configuration files or environment variables. This customization should normally not be needed, as the compiled-in defaults are already pretty complete.
Environmental variables come in two kinds: switch variables have a boolean value and can only be turned on or off, whereas string variables can have arbitrary strings as values.
These variables represent a flag which can be turned on or off. If their value is on or 1 they are turned on, if their value is off or 0 they are turned off. All other values are ignored. If the same flag can be turned on or off using config files, the environmental variable always has the priority.
If this variable is turned on, informational messages are printed on many operations of zlibc. Moreover, error messages are printed in order to point out errors in the configuration files, if any. If this variable is turned off, errors are silently ignored.
If this variable is turned on, and if the user program tries to unlink a virtual (uncompressed) file, zlibc translates this call into unlinking the real file. If this variable is turned off, unlink calls on virtual files are ignored.
If this variable is turned on, zlibc is switched off.
If this variable is turned on, the readdir function shows the real (compressed) files instead of the virtual (uncompressed) files.
These variables have a string value, which represent a file, a directory or a command.
This is the name of the directory where the temporary uncompressed files are put. The default is /tmp.
This is the extension which is appended to a virtual file name in order to obtain the real (compressed) file name. The default is .gz.
This is the name of the program to be invoked to uncompress the data. Default is gzip -dc.
This is the name of an additional configuration file. If this variable is defined and if the corresponding file exists, the configuration described in this file overrides the configurations in ∞~/.zlibrcIntegral and in ∞/usr/local/etc/zlibc.confIntegral (∞/etc/zlibc.confIntegral on Linux).
It is possible to operate zlibc entirely without configuration files. In this case, it uses the compiled-in defaults. These are generated at compile-time from the ∞zlibrc.sampleIntegral file. This file has the same syntax as the configuration files described above (see section Configuration files). If you want to change the compiled-in defaults of zlibc, edit that file, and remake.
Before it can be compiled, zlibc must be configured using the GNU autoconf script ./configure. In most circumstances, running ./configure without any parameters is enough. However, you may customize zlibc using various options to ./configure. The following options are supported:
Prefix used for any directories used by zlibc. By default, this is ∞/usr/localIntegral. Zlibc is installed in ∞$prefix/libIntegral, looks for its system wide configuration file in ∞$prefix/etcIntegral. Man pages are installed in ∞$prefix/manIntegral, info pages in ∞$prefix/infoIntegral etc. On Linux, if you use zlibc via ∞/etc/ld.so.preloadIntegral, you should use ∞/Integral as the prefix instead of the default ∞$prefix/libIntegral.
Directory containing the system-wide configuration file ∞zlibc.confIntegral. By default, this is derived from prefix (see above).
Disables run time configuration via environmental variables and via the configuration files. This may be needed in hyper secure environments.
Disables run time configuration via environmental variables
Tells zlibc not to use the /proc filesystem to find out the commandline of the programs for which it runs, even if a working /proc is detected.
Tells zlibc to use the /proc filesystem to find out the commandline of the programs for which it runs, even if no working /proc is detected.
Uses extension as the filename extension of compressed files. By default, is .gz
Allows to configure compressed filename extensions with at most length character via runtime configuration. By default is 5.
Uses directory to store the uncompressed files. By default is /tmp.
Defines how the program for uncompressing files should be invoked. This command should read the compressed file from stdin, and output the uncompressed data to stdout By default is gzip -dc.
In addition to the above-listed options, the standard GNU autoconf options apply. Type ./configure --help to get a complete list of these.