qLinux
… a distribution study


<< Prev
Make the System Bootable

Next >>
GRUB-2.06


Create an Initramfs

Preface

Using a statically linked binary of busybox (musl) make our life easier. However, not all commands of busybox are suitable for us.

Part I

Create a directory  image  and change into it. The next steps will be done inside this directory. Create the directory layout:

cd image
mkdir -pv qlnx/{bin,etc,dev,lib,prc,sys}
ln -sv qlnx/{bin,etc,dev,lib,prc,sys} .
mv -v /prc /proc
mkdir -v /run

Copy the required tools and the related shared libraries into the image directory. Starting with  bash :

$ cp /qlnx/bin/bash /qlnx/bin/sh qlnx/bin
$ ldd /qlnx/bin/bash
        /qlnx/lib/ld-musl-x86_64.so.1 (0x7f115adc4000)
        libreadline.so.8 => /qlnx/lib/libreadline.so.8 (0x7f115ad6e000)
        libhistory.so.8 => /qlnx/lib/libhistory.so.8 (0x7f115ad61000)
        libncursesw.so.6 => /qlnx/lib/libncursesw.so.6 (0x7f115acf8000)
        libc.so => /qlnx/lib/ld-musl-x86_64.so.1 (0x7f115adc4000)

Copy the libc and the loader. This is required one time only:

$ cp -vnd /qlnx/lib/libc.so* /qlnx/lib/ld-musl-x86_64.so.1 qlnx/lib

Copy the other listed listed libraries including symlinks:

$ cp -vnd /qlnx/lib/qlnx/lib/libreadline.so* \
$ cp -vnd /qlnx/lib/qlnx/lib/libhistory.so* \
$ cp -vnd /qlnx/lib/qlnx/lib/libncursesw.so* qlnx/lib

Repeat this for the following tools:

bash
cut
echo
killall
ln
ls
mkdir
mknod
modprobe
mount
setsid
sh     <-- link to bash
switch_root

Put  busybox  to the image and create some recommended symlinks:

cd <image-dir>/bin
cp -vnd busybox .
ln -s busybox poweroff
ln -s busybox reboot

It is highly recommended to create symlinks or make copies of  busybox . The issue is that all hard links will change if one of them will be overwritten. Thus if you copy a regular qlnx binary to the image and overwrite a hard link  busybox  itself will be overwritten.

Create some devices:

mknod -m 644 dev/console c 5 1
mknod -m 666 dev/null c 1 3

Create a  fstab  file:

echo "devtmpfs        /qlnx/dev       devtmpfs        mode=0755       0 0" > /qlnx/etc/fstab

Create a file  init  in the root of the image directory

#!/qlnx/bin/sh

PATH="/qlnx/bin:/bin"

mount -t proc  none /qlnx/prc
mount -t sysfs none /qlnx/sys

[ ! -e /dev/console ] && mknod /dev/console c 5 1
[ ! -e /dev/null ]    && mknod /dev/null c 1 3
# The next devices are not required if we mount /dev (see below)
[ ! -e /dev/tty ]     && mknod /dev/tty c 5 0
[ ! -e /dev/tty0 ]    && mknod /dev/tty0 c 4 0
[ ! -e /dev/tty1 ]    && mknod /dev/tty1 c 4 1
[ ! -e /dev/ttyS0 ]   && mknod /dev/ttyS0 c 4 64
[ ! -e /dev/ttyS1 ]   && mknod /dev/ttyS1 c 4 65
[ ! -e /dev/random ]  && mknod /dev/random c 1 8
[ ! -e /dev/urandom ] && mknod /dev/urandom c 1 9
[ ! -e /dev/zero ]    && mknod /dev/zero c 1 5

mount devtmpfs

echo -e "\nBoot took $(cut -d' ' -f1 /qlnx/prc/uptime) seconds\n"

exec /qlnx/bin/setsid /qlnx/bin/sh

setsid
    This prevents an error, that “job control is turned off” in an interactive shell.

Create the initramfs image itself. We use the  cpio  from busybox:

cd image
find . | busybox cpio -ov -H newc | gzip -9 >../initrd.img

Test It

If you don't want to test the step until here then jump to Part II.

qemu-system-x86_64 -kernel bzImage -nographic -append 'console=ttyS0' -initrd initrd.img

-nographic -append 'console=ttyS0'
    Run in the current terminal.

The initramfs part starts with a line:

Unpacking initramfs...

Now you can play a little bit around. To exit simply run

poweroff -f

Part II

Remove the last line from [init  and add the following lines (replace  /dev/sdb1  with the correct device):

mkdir /newroot
rootdev="/qlnx/dev/sdb1"
mount $rootdev /newroot

mount --move /qlnx/sys /newroot/qlnx/sys
mount --move /qlnx/prc /newroot/qlnx/prc
mount --move /qlnx/dev /newroot/qlnx/dev

# Now switch to the new filesystem, and run /qlnx/bin/sinit out of it. Use
# "exec" here, because you want the new init program to inherit PID 1.
exec switch_root /newroot /qlnx/bin/sinit

Some people will  umount  the filesystems instead of a  mount –move . There might be situations where a new mount after  switch_root  is more clean, but most commonly moving the mount points is ok.

Recreate the initramfs image. We use the  cpio  from busybox:

cd image
find . | busybox cpio -ov -H newc | gzip -9 >../initrd.img

Copy the  initrd.img  image and and the kernel  bzImage  to your boot directory. Adjust your bootloader (here is a simple reference).


<< Prev
Make the System Bootable

        

Next >>
GRUB-2.06