Skip to contentSkip to conversation

how to avoid that install.sh goes mad, if I am not root?

PATCH NAK Harald Dunkel 3 participants 9 messages Jan 20, 2011 – Jan 28, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi folks,

I am trying to build my own custom Debian kernel package. Problem:
If the kernel is supposed to be installed in a temporary package build directory, then it dies with

:
:
make[1]: Entering directory `/var/tmp/build_kernel/raw-kernel-2.6.37/linux-2.6.37'

sh /var/tmp/build_kernel/raw-kernel-2.6.37/linux-2.6.37/arch/x86/boot/install.sh 2.6.37 arch/x86/boot/bzImage \
                System.map "/var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot"
run-parts: executing /etc/kernel/postinst.d/dkms 2.6.37 /var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot/vmlinuz-2.6.37
dkms: running auto installation service for kernel 2.6.37:
      nvidia-current (260.19.29)...done.
      vboxhost (3.2.12)...done.

run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.37 /var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot/vmlinuz-2.6.37
run-parts: executing /etc/kernel/postinst.d/pm-utils 2.6.37 /var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot/vmlinuz-2.6.37
touch: cannot touch `/var/run/do-not-hibernate': Permission denied
run-parts: /etc/kernel/postinst.d/pm-utils exited with return code 1
make[3]: *** [install] Error 1
make[2]: *** [install] Error 2
make[1]: *** [sub-make] Error 2
make[1]: Leaving directory `/var/tmp/build_kernel/raw-kernel-2.6.37/linux-2.6.37'

AFAICS this happens because the arch/x86/boot/install.sh script calls /sbin/installkernel, which in turn runs all the scripts delivered by various other packages. This is fine for a regular kernel install as well as for an installation of the final kernel package, but for a non-root install in a package build directory /sbin/installkernel and all the run-parts scripts should not be run. installkernel doesn't even know the redefined install directory.

Would it be possible to avoid that /sbin/installkernel is run by install,sh, e.g. if the install directory has been redefined, or if UID != 0?

Any helpful comment would be highly appreciated

Harri
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk04igIACgkQUTlbRTxpHjcO3wCcCXsb6ma4ypqQliWi8XYyFcUE 6PYAnA1JP78Bw2uZM4eyr4FHO9uBi0Ex
=zAFX
-----END PGP SIGNATURE-----

#1 lore raw
Quoted 36 lines · Harald Dunkel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi folks,

I am trying to build my own custom Debian kernel package. Problem:
If the kernel is supposed to be installed in a temporary package build directory, then it dies with

:
:
make[1]: Entering directory `/var/tmp/build_kernel/raw-kernel-2.6.37/linux-2.6.37'

sh /var/tmp/build_kernel/raw-kernel-2.6.37/linux-2.6.37/arch/x86/boot/install.sh 2.6.37 arch/x86/boot/bzImage \
                System.map "/var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot"
run-parts: executing /etc/kernel/postinst.d/dkms 2.6.37 /var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot/vmlinuz-2.6.37
dkms: running auto installation service for kernel 2.6.37:
      nvidia-current (260.19.29)...done.
      vboxhost (3.2.12)...done.

run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.37 /var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot/vmlinuz-2.6.37
run-parts: executing /etc/kernel/postinst.d/pm-utils 2.6.37 /var/tmp/build_kernel/raw-kernel-2.6.37/debian/raw-kernel-2.6.37/boot/vmlinuz-2.6.37
touch: cannot touch `/var/run/do-not-hibernate': Permission denied
run-parts: /etc/kernel/postinst.d/pm-utils exited with return code 1
make[3]: *** [install] Error 1
make[2]: *** [install] Error 2
make[1]: *** [sub-make] Error 2
make[1]: Leaving directory `/var/tmp/build_kernel/raw-kernel-2.6.37/linux-2.6.37'

AFAICS this happens because the arch/x86/boot/install.sh script calls /sbin/installkernel, which in turn runs all the scripts delivered by various other packages. This is fine for a regular kernel install as well as for an installation of the final kernel package, but for a non-root install in a package build directory /sbin/installkernel and all the run-parts scripts should not be run. installkernel doesn't even know the redefined install directory.

Quoted 6 lines

Would it be possible to avoid that /sbin/installkernel is run by install,sh, e.g. if the install directory has been redefined, or if UID != 0?

Any helpful comment would be highly appreciated

First, at least on x86, the kernel will look for the 'installkernel' executable first in your own ~/bin/, so if you have that then it will override /sbin/installkernel.

Second, you don't have to let the kernel choose; just run /path/to/myinstallkernel $kernelversion path/to/boot/image System.map (Disadvantage: path/to/boot/image varies depending on arch.)

#2 lore raw
Quoted 5 lines · Mikael Pettersson

First, at least on x86, the kernel will look for the 'installkernel' executable first in your own ~/bin/, so if you have that then it will override /sbin/installkernel.

That still doesn't look like a good solution.

/me is thinking if we should have a new Kconfig for this, e.g. CONFIG_INSTALL_KERNEL whose default value is "/sbin/installkernel".

Cheers.

#3 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 9 lines · WANG Cong
Quoted 5 lines · Mikael Pettersson

First, at least on x86, the kernel will look for the 'installkernel' executable first in your own ~/bin/, so if you have that then it will override /sbin/installkernel.

That still doesn't look like a good solution.

Same for me.

Obviously running /sbin/installkernel is not reasonable for UID != 0 (or if $FAKEROOTKEY is set), so I would suggest to skip /sbin/installkernel and the default Lilo setup in install.sh for this case.

Only a suggestion, of course.

Regards

Harri
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk06A8oACgkQUTlbRTxpHjeuVwCeJjTgyjcIqvqrUTqxoGgAJngd iwkAn2U/qiekItqItRBmpeEqk/dH0FKZ
=LgO3
-----END PGP SIGNATURE-----

#4 lore raw

PATCH 1/1 make installkernel configurable from command line (was Re: how to avoid that install.sh goes mad, if I am not root?)

Quoted 14 lines · Harald Dunkel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 9 lines · WANG Cong
Quoted 5 lines · Mikael Pettersson

First, at least on x86, the kernel will look for the 'installkernel' executable first in your own ~/bin/, so if you have that then it will override /sbin/installkernel.

That still doesn't look like a good solution.

Quoted 7 lines

Same for me.

Obviously running /sbin/installkernel is not reasonable for UID != 0 (or if $FAKEROOTKEY is set), so I would suggest to skip /sbin/installkernel and the default Lilo setup in install.sh for this case.

Will the patch below work for you?

With this patch, you should be able to specify your own installkernel by "make INSTALLKERNEL=/your/installkernel install".

---

Makefile +1 -1
index 1f47495..44abded 100644
@@ -327,7 +327,7 @@ OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
 AWK		= awk
 GENKSYMS	= scripts/genksyms/genksyms
-INSTALLKERNEL  := installkernel
+INSTALLKERNEL  ?= /sbin/installkernel
 DEPMOD		= /sbin/depmod
 KALLSYMS	= scripts/kallsyms
 PERL		= perl
arch/x86/boot/install.sh +1 -2
index d13ec1c..c41f2b8 100644
@@ -33,8 +33,7 @@ verify "$3"
 
 # User may have a custom install script
 
-if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
-if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
+if [ -x "${INSTALLKERNEL}" ]; then exec "${INSTALLKERNEL}" "$@"; fi
 
 # Default install - same as make zlilo
 
#5 lore raw

Re: [Patch] make installkernel configurable from command line (was Re: how to avoid that install.sh goes mad, if I am not root?)

Quoted 49 lines · =?utf-8?Q?Am=C3=A9rico?= Wang writes:
Quoted 14 lines · Harald Dunkel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 9 lines · WANG Cong
Quoted 5 lines · Mikael Pettersson

First, at least on x86, the kernel will look for the 'installkernel' executable first in your own ~/bin/, so if you have that then it will override /sbin/installkernel.

That still doesn't look like a good solution.

Quoted 7 lines

Same for me.

Obviously running /sbin/installkernel is not reasonable for UID != 0 (or if $FAKEROOTKEY is set), so I would suggest to skip /sbin/installkernel and the default Lilo setup in install.sh for this case.

Will the patch below work for you?

With this patch, you should be able to specify your own installkernel by "make INSTALLKERNEL=/your/installkernel install".

---

Makefile +1 -1
index 1f47495..44abded 100644
@@ -327,7 +327,7 @@ OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
 AWK		= awk
 GENKSYMS	= scripts/genksyms/genksyms
-INSTALLKERNEL  := installkernel
+INSTALLKERNEL  ?= /sbin/installkernel
 DEPMOD		= /sbin/depmod
 KALLSYMS	= scripts/kallsyms
 PERL		= perl
arch/x86/boot/install.sh +0 -0
index d13ec1c..c41f2b8 100644

arch/x86/boot/install.sh verify "$3" · line 36

Quoted 6 lines
arch/x86/boot/install.sh +1 -2
@@ -33,8 +33,7 @@ verify "$3"
 
 # User may have a custom install script
 
-if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
-if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
+if [ -x "${INSTALLKERNEL}" ]; then exec "${INSTALLKERNEL}" "$@"; fi

NAK -- this breaks existing setups which rely on /root/bin/installkernel being picked up automatically.

Can you handle 'make INSTALLKERNEL=...' without breaking that please?

#6 lore raw

Re: [Patch] make installkernel configurable from command line (was Re: how to avoid that install.sh goes mad, if I am not root?)

Quoted 4 lines · Mikael Pettersson

NAK -- this breaks existing setups which rely on /root/bin/installkernel being picked up automatically.

Can you handle 'make INSTALLKERNEL=...' without breaking that please?

Yes, here we go.

--------->

---

Makefile +1 -1
index 1f47495..44abded 100644
@@ -327,7 +327,7 @@ OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
 AWK		= awk
 GENKSYMS	= scripts/genksyms/genksyms
-INSTALLKERNEL  := installkernel
+INSTALLKERNEL  ?= /sbin/installkernel
 DEPMOD		= /sbin/depmod
 KALLSYMS	= scripts/kallsyms
 PERL		= perl
arch/x86/boot/install.sh +2 -2
index d13ec1c..c8c9a92 100644
@@ -33,8 +33,8 @@ verify "$3"
 
 # User may have a custom install script
 
-if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
-if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
+if [ -x ~/bin/installkernel ]; then exec ~/bin/installkernel "$@"; fi
+if [ -x "${INSTALLKERNEL}" ]; then exec "${INSTALLKERNEL}" "$@"; fi
 
 # Default install - same as make zlilo
 
#7 lore raw

Re: [Patch] make installkernel configurable from command line (was Re: how to avoid that install.sh goes mad, if I am not root?)

[cc: linux-kbuild's address corrected]

Quoted 31 lines · =?utf-8?Q?Am=C3=A9rico?= Wang writes:
Quoted 4 lines · Mikael Pettersson

NAK -- this breaks existing setups which rely on /root/bin/installkernel being picked up automatically.

Can you handle 'make INSTALLKERNEL=...' without breaking that please?

Yes, here we go.

--------->

---

Makefile +1 -1
index 1f47495..44abded 100644
@@ -327,7 +327,7 @@ OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
 AWK		= awk
 GENKSYMS	= scripts/genksyms/genksyms
-INSTALLKERNEL  := installkernel
+INSTALLKERNEL  ?= /sbin/installkernel
 DEPMOD		= /sbin/depmod
 KALLSYMS	= scripts/kallsyms
 PERL		= perl
arch/x86/boot/install.sh +0 -0
index d13ec1c..c8c9a92 100644

arch/x86/boot/install.sh verify "$3" · line 39

Quoted 9 lines
arch/x86/boot/install.sh +2 -2
@@ -33,8 +33,8 @@ verify "$3"
 
 # User may have a custom install script
 
-if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
-if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
+if [ -x ~/bin/installkernel ]; then exec ~/bin/installkernel "$@"; fi
+if [ -x "${INSTALLKERNEL}" ]; then exec "${INSTALLKERNEL}" "$@"; fi
 
 # Default install - same as make zlilo

Tested. This works as far as not overriding root's ~/bin/installkernel if it exists, but it fails to give precedence to an explicit command-line INSTALLKERNEL=... over the built-in fallbacks. I don't see an easy way to fix that without first consolidating all archs' INSTALLKERNEL handling into the top-level Makefile.

Not using make install and just invoking your own install script directly works, so I'm not sure this is worth the trouble (unless you can unify all archs' INSTALLKERNEL handling as a side-effect / cleanup).

#8 lore raw

Re: [Patch] make installkernel configurable from command line (was Re: how to avoid that install.sh goes mad, if I am not root?)

Quoted 6 lines · Mikael Pettersson

Tested. This works as far as not overriding root's ~/bin/installkernel if it exists, but it fails to give precedence to an explicit command-line INSTALLKERNEL=... over the built-in fallbacks. I don't see an easy way to fix that without first consolidating all archs' INSTALLKERNEL handling into the top-level Makefile.

Yes, exactly, I can expect this.

Quoted 4 lines

Not using make install and just invoking your own install script directly works, so I'm not sure this is worth the trouble (unless you can unify all archs' INSTALLKERNEL handling as a side-effect / cleanup).

Agreed, I will have a try.

Thanks!