Home | History | Annotate | Download | only in doc
      1 This document describes one way to create the initrd directory hierarchy
      2 in order to allow an initrd to be built into your kernel.  The trick
      3 here is to steal the initrd file used on your Linux laptop, Ubuntu in
      4 this case.  There are probably much better ways of doing this.
      5 
      6 That said, here are the commands:
      7 
      8 ------------------------------------------------------------------------
      9 cd tools/testing/selftests/rcutorture
     10 zcat /initrd.img > /tmp/initrd.img.zcat
     11 mkdir initrd
     12 cd initrd
     13 cpio -id < /tmp/initrd.img.zcat
     14 ------------------------------------------------------------------------
     15 
     16 Another way to create an initramfs image is using "dracut"[1], which is
     17 available on many distros, however the initramfs dracut generates is a cpio
     18 archive with another cpio archive in it, so an extra step is needed to create
     19 the initrd directory hierarchy.
     20 
     21 Here are the commands to create a initrd directory for rcutorture using
     22 dracut:
     23 
     24 ------------------------------------------------------------------------
     25 dracut --no-hostonly --no-hostonly-cmdline --module "base bash shutdown" /tmp/initramfs.img
     26 cd tools/testing/selftests/rcutorture
     27 mkdir initrd
     28 cd initrd
     29 /usr/lib/dracut/skipcpio /tmp/initramfs.img | zcat | cpio -id < /tmp/initramfs.img
     30 ------------------------------------------------------------------------
     31 
     32 Interestingly enough, if you are running rcutorture, you don't really
     33 need userspace in many cases.  Running without userspace has the
     34 advantage of allowing you to test your kernel independently of the
     35 distro in place, the root-filesystem layout, and so on.  To make this
     36 happen, put the following script in the initrd's tree's "/init" file,
     37 with 0755 mode.
     38 
     39 ------------------------------------------------------------------------
     40 #!/bin/sh
     41 
     42 [ -d /dev ] || mkdir -m 0755 /dev
     43 [ -d /root ] || mkdir -m 0700 /root
     44 [ -d /sys ] || mkdir /sys
     45 [ -d /proc ] || mkdir /proc
     46 [ -d /tmp ] || mkdir /tmp
     47 mkdir -p /var/lock
     48 mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
     49 mount -t proc -o nodev,noexec,nosuid proc /proc
     50 # Some things don't work properly without /etc/mtab.
     51 ln -sf /proc/mounts /etc/mtab
     52 
     53 # Note that this only becomes /dev on the real filesystem if udev's scripts
     54 # are used; which they will be, but it's worth pointing out
     55 if ! mount -t devtmpfs -o mode=0755 udev /dev; then
     56 	echo "W: devtmpfs not available, falling back to tmpfs for /dev"
     57 	mount -t tmpfs -o mode=0755 udev /dev
     58 	[ -e /dev/console ] || mknod --mode=600 /dev/console c 5 1
     59 	[ -e /dev/kmsg ] || mknod --mode=644 /dev/kmsg c 1 11
     60 	[ -e /dev/null ] || mknod --mode=666 /dev/null c 1 3
     61 fi
     62 
     63 mkdir /dev/pts
     64 mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
     65 mount -t tmpfs -o "nosuid,size=20%,mode=0755" tmpfs /run
     66 mkdir /run/initramfs
     67 # compatibility symlink for the pre-oneiric locations
     68 ln -s /run/initramfs /dev/.initramfs
     69 
     70 # Export relevant variables
     71 export ROOT=
     72 export ROOTDELAY=
     73 export ROOTFLAGS=
     74 export ROOTFSTYPE=
     75 export IP=
     76 export BOOT=
     77 export BOOTIF=
     78 export UBIMTD=
     79 export break=
     80 export init=/sbin/init
     81 export quiet=n
     82 export readonly=y
     83 export rootmnt=/root
     84 export debug=
     85 export panic=
     86 export blacklist=
     87 export resume=
     88 export resume_offset=
     89 export recovery=
     90 
     91 for i in /sys/devices/system/cpu/cpu*/online
     92 do
     93 	case $i in
     94 	'/sys/devices/system/cpu/cpu0/online')
     95 		;;
     96 	'/sys/devices/system/cpu/cpu*/online')
     97 		;;
     98 	*)
     99 		echo 1 > $i
    100 		;;
    101 	esac
    102 done
    103 
    104 while :
    105 do
    106 	sleep 10
    107 done
    108 ------------------------------------------------------------------------
    109 
    110 References:
    111 [1]: https://dracut.wiki.kernel.org/index.php/Main_Page
    112 [2]: http://blog.elastocloud.org/2015/06/rapid-linux-kernel-devtest-with-qemu.html
    113 [3]: https://www.centos.org/forums/viewtopic.php?t=51621
    114