Introduction ~
Long back I edited initrd as old linux (Ubuntu 6.06) box was not able to boot with SCSI hard disk? One of my friend wanted to do the same for other purpose. So got a chance to write article on the same? Let’s start with what is initrd?
What is initrd ?
initrd (Initial Ram Disk) is a temporary file system ( used as /) commonly used in the boot process of the Linux kernel. It is typically used for making preparations before the real root file system can be mounted.
Why someone want to edit/modify initrd ?
I assume that you all are familier with Linux booting process? Once Linux kernel loaded in to memory (RAM) it start init (father/mother of all process) process. is that true? Let me ask you one question. Before loading actual physical root file system (/) how kernel access /sbin/init script? what is the use by specifying “initrd” file in GRUB ? hold on!!
Suppose your root partion resides on some SCSI device and driver for this SCSI devices is compiled as a kernel module. Of course this module is required at boot time to have access to the root partion — but it is not in the kernel. Thus the need for an initrd image. Additionally after udev subsystem become common, somebody has to start udev to create device nodes. This is initrd’s duty too.
See the GRUB menu as shown below ~
title Ubuntu 9.04, kernel 2.6.28-11-generic
kernel /vmlinuz-2.6.28-11-generic root=/dev/sda3 ro quiet splash
initrd /initrd.img-2.6.28-11-generic
GRUB loads kernel and initrd image in to memory(RAM). When kernel boots it checks for initrd image, and if it exists starts init script that resides on this image. init script is usually written in bash. When init script on initrd image is finished, kernel usually start standard init process ie /sbin/init
Step 1] Copy original initrd image file to temp location ~
** Create temporary directory and copy initrd file in that temp directory
arunsb@laptop:~$ cp /boot/initrd.img-2.6.28-11-generic /tmp/
arunsb@laptop:~$ mkdir /tmp/initrd-src
** Now extract “initrd” image –
arunsb@laptop:~$ cd /tmp/initrd-src
arunsb@laptop:/tmp/initrd-src$ gzip -dc /tmp/initrd.img-2.6.28-11-generic | cpio -id
38791 blocks
arunsb@laptop:/tmp/initrd-src$ ls -l
total 36
drwxr-xr-x 2 arunsb arunsb 4096 2009-07-12 16:32 bin
drwxr-xr-x 3 arunsb arunsb 4096 2009-07-12 16:32 conf
drwxr-xr-x 6 arunsb arunsb 4096 2009-07-12 16:32 etc
-rwxr-xr-x 1 arunsb arunsb 4825 2009-07-12 16:32 init
drwxr-xr-x 5 arunsb arunsb 4096 2009-07-12 16:32 lib
drwxr-xr-x 2 arunsb arunsb 4096 2009-07-12 16:32 sbin
drwxr-xr-x 8 arunsb arunsb 4096 2009-07-12 16:32 scripts
drwxr-xr-x 3 arunsb arunsb 4096 2009-07-12 16:32 usr
arunsb@laptop:/tmp/initrd-src$
** Check how “init” looks like ~
arunsb@laptop:/tmp/initrd-src$ head init
#!/bin/sh
echo “Loading, please wait…”
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
arunsb@laptop:/tmp/initrd-src$
Step 2] Edit/Modify as per your requirement
Step 3] How to create initrd image ~
Create initrd image from scratch –
root@laptop:/home/arunsb# mkinitramfs -v -o /tmp/initrd-arun-$(uname -r)
root@laptop:/home/arunsb# ls -l /tmp/initrd-arun-2.6.28-11-generic
-rw-r–r– 1 root root 7536506 2009-07-12 17:11 /tmp/initrd-arun-2.6.28-11-generic
root@laptop:/home/arunsb# du -sh /tmp/initrd-arun-2.6.28-11-generic
7.2M /tmp/initrd-arun-2.6.28-11-generic
root@laptop:/home/arunsb#
mkinitramfs ~ is the tool used to create initrd image. “initrd” image is a gzipped cpio archive.
** After all modifcation create initrd image as shown below…
arunsb@laptop:/tmp/initrd-src$ find . | cpio –quiet –dereference -o -H newc | gzip -9 > /tmp/initrd.img-2.6.28-11-arun
arunsb@laptop:/tmp/initrd-src$ ls -l /tmp/initrd.img-2.6.28-11-arun
-rw-r–r– 1 arunsb arunsb 7505955 2009-07-12 16:56 /tmp/initrd.img-2.6.28-11-arun
arunsb@laptop:/tmp/initrd-src$
* Enjoy !!
Regards,
Arun Bagul