$Id: Problems,v 1.16 2003/08/14 17:15:52 srivasta Exp $ This is an (incomplete) list of problems that people have encountered in the past while using kernel-package. Please remember to configure the kernel for your machine using make menuconfig, and to clean the source tree before compiling a new image using make-kpkg clean. a) Failure to format a floppy disk while installing kernel image. fdformat from the obsolete package miscutils sometimes has problems formatting floppies. Install the package fdutils instead. Also, sometimes the new fdformat fails for /dev/fd0 unless the parameters are set using setfdprm -- in short, make sure that you can format floppies manually before asking the kernel image postinst to do so. b) warning, 'debian/tmp-image/DEBIAN/control' contains user-defined field 'Installed-Size' warning, dpkg-deb: unable to create '..': is a directory The problem is actually that the version of dpkg being used is too old for kernel-package; kernel-package version 3.X needs dpkg 1.4.0.0 at least. c) dpkg-gencontrol fails with the error message failure: chown new files list file: Illegal seek This is an error in older versions of dpkg-dev. Upgrading to version 1.4.0.9 should help. d) install: debian/changelog: No such file or directory Remember to do make-kpkg clean with a patched/old kernel source tree (if this is not a clean tree, clean it first). e) make-kpkg goes into an infinite loop when trying to make oldconfig. This is _not_ a bug with kernel-package, it is a well known incompatibility between the new version of expr (which has suddenly become POSIX compliant) and the kernel sources (which did not expect expr to behave this way). The fix is to apply the following patch to the kernel sources. --- scripts/Configure.dist Mon Jan 20 14:43:24 1997 +++ scripts/Configure Tue Jan 21 05:41:30 1997 @@ -288,7 +288,7 @@ def=${old:-$3} while :; do readln "$1 ($2) [$def] " "$def" "$old" - if expr "$ans" : '0$\|-?[1-9][0-9]*$' > /dev/null; then + if expr "$ans" : '0$\|-\?[1-9][0-9]*$' > /dev/null; then define_int "$2" "$ans" break else @@ -319,7 +319,7 @@ while :; do readln "$1 ($2) [$def] " "$def" "$old" ans=${ans#*[x,X]} - if expr "$ans" : '[0-9a-fA-F]+$' > /dev/null; then + if expr "$ans" : '[0-9a-fA-F]\+$' > /dev/null; then define_hex "$2" "$ans" break else f) % depmod -a modprobe: error reading ELF header: No such file or directory This is a problem with the newly changed behavior of depmod and friends, who suddenly stopped liking non .o files in /lib/modules/. Newer versions of kernel package, like this one, handle that right. For older image packages, the test is: % find /lib/modules/2.0.30/ -type f -exec file {} \; | grep -v 'ELF 32-bit' /lib/modules/2.0.30/modules.dep: ASCII text Anything other than modules.dep showing up is something that depmod can no longer tolerate. Remove those files, and things should be fine. g) dpkg-gencontrol fails if LC_ALL is set to de_DE. Actually, I can't really confirm this works for anything except en_US. This is true as of dpkg/dpkg-dev 1.4.0.19. The error actually reported seems to be either that debian/substvars file can not be found, or that the changelog file is empty (even when the file is not empty). The work around seems to be to set the LC_ALL to en_US while compiling the kernel. This should be fixed soon. h) dpkg upgrades the custom kernel to a new standard kernel. This means that epochs were used; unfortunately I did not consider that when I wrote all the documentation. I have since upgraded the documentation; and you can add epochs to your custom kernel just as well as the upstream maintainers. i) The build keeps erring out. It fails with the following: objdump: illegal option -- k rm `which encaps` j) build fails with a bizarre error talking about /bin/ls and tab sizes = Text: make[3]: Leaving directory `/usr/src/kernel-source-2.0.32/arch/i386/math-emu' make[2]: Leaving directory `/usr/src/kernel-source-2.0.32/arch/i386/math-emu' ld -m elf_i386 -Ttext 0x100000 -e stext arch/i386/kernel/head.o init/main.o in it/version.o \ arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o net/network.a \ fs/filesystems.a \ drivers/block/block.a drivers/char/char.a drivers/net/net.a drivers/cdrom/cdrom.a drivers/pci/pci.a arch/i386/math-emu/math.a \ /usr/src/kernel-source-2.0.32/arch/i386/lib/lib.a /usr/src/kernel-source-2.0.32/lib/lib.a /usr/src/kernel-source-2.0.32/arch/i386/lib/lib.a -o vmlinux /usr/src/kernel-source-2.0.32 /bin/ls: invalid tab size: text make[1]: *** [vmlinux] Error 1 make[1]: Leaving directory `/usr/src/kernel-source-2.0.32' make: *** [all] Error 2 make-kpkg --zimage kernel_image This is truly a weird error message for machines that need zImage rather than the default bzImage k) Modules do not build when there is an epoch in the version. Some modules have been reported to have problems with epochs in the version number. l) The version number seems to be dropped in the name of the package, i.e., you get results like kernel-image-.._300_i386.deb, where the 300 is from the --revision flag. This seems to result from using the broken perl 5.005 packages installed a while ago in unstable. That package has since been withdrawn. Problems seem to go away when one downgrades to 5.004. This is also caused by a broken grep, (for example, grep 2.3-1). Upgrading to a fixed grep solves this (2.3-4 is knownn to work, at the time of writing this). m) Some versions of gcc do not interact well with the kernel sources (the upcoming gcc 2.95 has problems compiling the kernel without the flag '-fno-strict-aliasing' (I think you may have to edit the makefile for this, or something). This is an universal problem, hopefully there shall be a compromise somewhere A symptom may be failures like: Makefile:153: arch/i586/Makefile: No such file or directory make[1]: *** No rule to make target `arch/i586/Makefile'. Stop. n) I keep getting this kind of messages: make[1]: i386-linux-gcc: Command not found This is a result of having the env variable ARCH set when you do not intend to cross compile the kernel. Unsetting ARCH works fine. o) booting from the new kernel fails with VFS: Cannot open root device "308" or 03:08 immediately followed by a kernel panic The cause for this is either you have not compiled the file system type of the root file system into the kernel, or you have instructed your boot loader to expect an initrd kernel (this is required for running a recent official kernel image package from Debian), and have installed a non-initrd garden variety kernel image. You need to go back and recompile the kernel image, either including the root file system type as a builtin, or adding a --initrd flag to the make-kpkg run. p) Even when the kernel is built with a regular user using fakeroot, it fails with > install -p -d -o root -g root -m 755 debian/tmp-image/DEBIAN > install: cannot create directory `debian/tmp-image/DEBIAN': Permission > denied since the ./debian/tmp-image directory is owned by root.root It was actually due to the fact that (somehow) the XFS filesystem didn't have restrict_chown set (see /proc/sys/fs/xfs/restrict_chown), which was causing install to give away permissions on a directory (lesson: fakeroot and xfs w/o restrict_chown=1 don't play together nicely). q) The most recent versions of sudo (versions after 1.6.8p12-1) now create a default sudoers file with the env_reset option set. This causes make-kpkg to fail with the rather unexpected error message "make: Nothing to be done for `$(i_package)'." since the i_package variable is constructed without the APPEND_TO_VERSION string in the sub-make invocation with sudo because env_reset causes sudo to clean it out of the environment. Clearly there are other possible failure conditions/messages depending on which variables the root sub-make is expecting to find. So, using sudo with env_reset will cause errors, possibly with the above error message. r) When run in a git sourced tree, scripts/setlocalversion checks to see if the tree is the trunk, if not, it adds version information to the kernel version. It also checks to see if there are uncommited changes, if so, it adds the string "-dirty" to the version. Since we change a couple of files in ./scripts/, this falls afoul of the make-kpkg checks, since the version number is now different from what make-kpkg knows it to be. The workaround is to modify the setlocalversion script, like so: diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 82e4993..65dcb40 100644 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion @@ -16,7 +16,7 @@ if head=`git rev-parse --verify HEAD 2>/ fi # Are there uncommitted changes? - if git diff-index HEAD | read dummy; then + if git diff-index HEAD | grep -v -e "scripts/package/Makefile$" -e "scripts/package/builddeb$" -e "scripts/setlocalversion$" | read dummy; then printf '%s' -dirty fi fi s) There is a problem when GREP_OPTIONS are exported, since it may impact the results comoing out of grep in scripts that are tun in shubshells -- and, of course, make-kpkg is one of them. $ echo $GREP_OPTIONS --colour=always So the Perl regex does not match in: UTS_RELEASE_VERSION=$(call doit,if [ -f $(UTS_RELEASE_HEADER) ]; then \ grep 'define UTS_RELEASE' $(UTS_RELEASE_HEADER) | \ perl -nle 'm/^\s*\#define\s+UTS_RELEASE\s+("?)(\S+)\1/g && print $$2;';\ else echo "" ; \ fi) This shows up as an error message like: ,---- | The UTS Release version in include/linux/utsrelease.h | "" | does not match current version: | "2.6.18" | Please correct this. | make: *** [install/linux-image-2.6.18] Erreur 2 `----