You can compile a kernel anywhere you like, including your home directory. The only time directories outside the build tree are modified is when you make one of the install*
targets. So, to install a kernel you'd do the obvious:
cd $SOME_DIRECTORY
tar -xjvf linux-$VERSION.tar.bz2
cd linux-$VERSION
make mrproper menuconfig
# Configure the kernel here.
# Now build it using all your CPU threads in parallel.
make -j$(grep -c processor /proc/cpuinfo) bzImage modules
After you configure the kernel, it'll be built. At this point, you'll have a kernel binary (vmlinux) and a bootable kernel image under arch/$YOUR_ARCHITECTURE/boot/bzImage.
If you're building a monolithic kernel, you're done. Copy the uncompressed file (vmlinux
) or compressed file (bzImage
) to your intended volume, configure the boot manager if you need to, and off you go.
If you need to install modules, and assuming you've mounted your target volume on /mnt, you could say:
INSTALL_MOD_PATH=/mnt \
INSTALL_PATH=/mnt/boot \
make modules_install
This will copy the kernel image to /mnt/boot
and the modules to /mnt/lib/modules/$VERSION
.
Please note, I'm oversimplifying this. If you need help building the kernel manually, you should read some of the documents in the kernel source tree's Documentation/
subdirectory. The README
file also tells you how to build and install it in detail.
Booting the kernel is a different story, though. Most modern distributions use a initial RAMdisk image which contains a ton of drivers for the hardware needed to bring up the rest of the kernel (block devices, filesystems, networking, etc). This process won't make this image. Depending on what you need to do (what do you need to do?), you can use an existing one or make a new one using your distribution's toolchain. You should check the documentation on update-initramfs
.
There are other issues too, though. Using the standard toolchain you can't compile a kernel for a different architecture or sub-architecture. Note that in some cases, even kernels compiled on a particular type of x86 box won't work on certain other types of x86 boxes. It all depends on the combination of sub-architectures and the kernel config. Compiling across architectures (e.g. building an ARM kernel on an x86 machine) is altogether out of the question unless you install an appropriate cross-compilation toolchain.
If you're trying to rescue another installation or computer, however, a rescue disk might come in handier than building a custom kernel like that.
One more thing: if you're trying to build a kernel for another computer which boots, is the same architecture as the one you're compiling on, and runs a Debian or Debian-like OS (Ubuntu counts), you could install the kernel-package
package (sudo aptitude install kernel-package
). Then unpack the kernel, cd
to the root of the source tree, and say:
CONCURRENCY_LEVEL=$(grep -c processor /proc/cpuinfo) \
sudo make-kpkg --initrd binary-arch
This will apply necessary patches, configure the kernel, build it and package it as a .deb package (a few packages, actually). All you need to do is install it on your target system and you're done.
What I'm intending to do is like compiling a software with --directory-prefix=/opt/foobar/, so all the files are put in the desired location. You know what I mean?
– Haix64 Jan 12 '12 at 11:22sudo update-grub
, and it'll detect all the distributions and add GRUB menu entries for them.It really would help lots if you could explain your intentions at a high level, though. I.e. are you rescuing a system, bootstrapping a Linux installation, making your own distribution, compiling a kernel for a slower computer, cross-developing, or what?
– Alexios Jan 12 '12 at 15:46