debian: Fix Debian package handler when --use-installed not given. If there is no --use-installed option, then it didn't download all the packages (only the ones not installed). But this failed later when it tried to unpack the packages that hadn't been downloaded. Thus download all the packages if !use_installed.
Don't pass use_installed to every package handler function. use_installed is a global variable (defined in febootstrap_cmdline.mli) so there's not much point in passing it around to every function that needs it. This commit removes the optional argument in favour of just using the global variable in each package handler. However we still need a place where we can bail if the --use-installed flag is used for package handlers which don't support this yet. Thus add a ph_init function is called after the right package handler has been detected but before it is used. This is a convenient place to put the --use-installed checking and any other initialization that is required.
Find package dependencies fix for pacman. Since the pactree utility only accepts one package name, we must iterate through the packages rather than specify them all on the command line. To avoid errors when febootstrap is run on a system with outdated packages, use ls and awk on the febootstrap package cache directory rather than using the host's outdated pacman database.
Replace ArchLinux module detection with generic method. ArchLinux used to keep its kernel in /boot/vmlinuz26 but, with Linux 3.0, now uses /boot/vmlinuz-linux. Instead of just changing the kernel filename and module directory, this change removes the ArchLinux specific code, lets febootstrap find a kernel, and then computes the module directory from the version string extracted from the actual kernel file.
helper/init: Handle compressed modules transparently. Detect libz and, if present, define HAS_LIBZ and add -lz to Makefile's LIBS variable. Add entry on optional zlib package requirement. Detect both uncompressed and gzipped kernel modules. Some Linux distros (like ArchLinux) use gzipped kernel modules with filenames like ext2.ko.gz. This change modifies the filename pattern from (e.g.) "ext2.ko" to "ext2.ko*". When available, use libz to read the module. The init_module system call requires uncompressed kernel module bytes. On some systems (e.g. ArchLinux) the modules are gzipped on disk. Libz is used to read and uncompress gzipped disk files (*.ko.gz) or transparently read uncompressed modules (*.ko).
Use ext2fs_close2 API if available to avoid unnecessary fsync. This saves over 5 seconds during the slow path construction of the appliance. The ext2fs_close2 API is present in the e2fsprogs 'next' branch and will be in a later e2fsprogs release (thanks Ted Ts'o).