1This document describes one way to create the initrd directory hierarchy
2in order to allow an initrd to be built into your kernel.  The trick
3here is to steal the initrd file used on your Linux laptop, Ubuntu in
4this case.  There are probably much better ways of doing this.
5
6That said, here are the commands:
7
8------------------------------------------------------------------------
9cd tools/testing/selftests/rcutorture
10zcat /initrd.img > /tmp/initrd.img.zcat
11mkdir initrd
12cd initrd
13cpio -id < /tmp/initrd.img.zcat
14------------------------------------------------------------------------
15
16Another way to create an initramfs image is using "dracut"[1], which is
17available on many distros, however the initramfs dracut generates is a cpio
18archive with another cpio archive in it, so an extra step is needed to create
19the initrd directory hierarchy.
20
21Here are the commands to create a initrd directory for rcutorture using
22dracut:
23
24------------------------------------------------------------------------
25dracut --no-hostonly --no-hostonly-cmdline --module "base bash shutdown" /tmp/initramfs.img
26cd tools/testing/selftests/rcutorture
27mkdir initrd
28cd initrd
29/usr/lib/dracut/skipcpio /tmp/initramfs.img | zcat | cpio -id < /tmp/initramfs.img
30------------------------------------------------------------------------
31
32Interestingly enough, if you are running rcutorture, you don't really
33need userspace in many cases.  Running without userspace has the
34advantage of allowing you to test your kernel independently of the
35distro in place, the root-filesystem layout, and so on.  To make this
36happen, put the following script in the initrd's tree's "/init" file,
37with 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
47mkdir -p /var/lock
48mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
49mount -t proc -o nodev,noexec,nosuid proc /proc
50# Some things don't work properly without /etc/mtab.
51ln -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
55if ! 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
61fi
62
63mkdir /dev/pts
64mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
65mount -t tmpfs -o "nosuid,size=20%,mode=0755" tmpfs /run
66mkdir /run/initramfs
67# compatibility symlink for the pre-oneiric locations
68ln -s /run/initramfs /dev/.initramfs
69
70# Export relevant variables
71export ROOT=
72export ROOTDELAY=
73export ROOTFLAGS=
74export ROOTFSTYPE=
75export IP=
76export BOOT=
77export BOOTIF=
78export UBIMTD=
79export break=
80export init=/sbin/init
81export quiet=n
82export readonly=y
83export rootmnt=/root
84export debug=
85export panic=
86export blacklist=
87export resume=
88export resume_offset=
89export recovery=
90
91for i in /sys/devices/system/cpu/cpu*/online
92do
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
102done
103
104while :
105do
106	sleep 10
107done
108------------------------------------------------------------------------
109
110References:
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