| This document describes one way to create the initrd directory hierarchy |
| in order to allow an initrd to be built into your kernel. The trick |
| here is to steal the initrd file used on your Linux laptop, Ubuntu in |
| this case. There are probably much better ways of doing this. |
| |
| That said, here are the commands: |
| |
| ------------------------------------------------------------------------ |
| cd tools/testing/selftests/rcutorture |
| zcat /initrd.img > /tmp/initrd.img.zcat |
| mkdir initrd |
| cd initrd |
| cpio -id < /tmp/initrd.img.zcat |
| ------------------------------------------------------------------------ |
| |
| Another way to create an initramfs image is using "dracut"[1], which is |
| available on many distros, however the initramfs dracut generates is a cpio |
| archive with another cpio archive in it, so an extra step is needed to create |
| the initrd directory hierarchy. |
| |
| Here are the commands to create a initrd directory for rcutorture using |
| dracut: |
| |
| ------------------------------------------------------------------------ |
| dracut --no-hostonly --no-hostonly-cmdline --module "base bash shutdown" /tmp/initramfs.img |
| cd tools/testing/selftests/rcutorture |
| mkdir initrd |
| cd initrd |
| /usr/lib/dracut/skipcpio /tmp/initramfs.img | zcat | cpio -id < /tmp/initramfs.img |
| ------------------------------------------------------------------------ |
| |
| Interestingly enough, if you are running rcutorture, you don't really |
| need userspace in many cases. Running without userspace has the |
| advantage of allowing you to test your kernel independently of the |
| distro in place, the root-filesystem layout, and so on. To make this |
| happen, put the following script in the initrd's tree's "/init" file, |
| with 0755 mode. |
| |
| ------------------------------------------------------------------------ |
| #!/bin/sh |
| |
| [ -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 |
| mount -t sysfs -o nodev,noexec,nosuid sysfs /sys |
| mount -t proc -o nodev,noexec,nosuid proc /proc |
| # Some things don't work properly without /etc/mtab. |
| ln -sf /proc/mounts /etc/mtab |
| |
| # Note that this only becomes /dev on the real filesystem if udev's scripts |
| # are used; which they will be, but it's worth pointing out |
| if ! mount -t devtmpfs -o mode=0755 udev /dev; then |
| echo "W: devtmpfs not available, falling back to tmpfs for /dev" |
| mount -t tmpfs -o mode=0755 udev /dev |
| [ -e /dev/console ] || mknod --mode=600 /dev/console c 5 1 |
| [ -e /dev/kmsg ] || mknod --mode=644 /dev/kmsg c 1 11 |
| [ -e /dev/null ] || mknod --mode=666 /dev/null c 1 3 |
| fi |
| |
| mkdir /dev/pts |
| mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true |
| mount -t tmpfs -o "nosuid,size=20%,mode=0755" tmpfs /run |
| mkdir /run/initramfs |
| # compatibility symlink for the pre-oneiric locations |
| ln -s /run/initramfs /dev/.initramfs |
| |
| # Export relevant variables |
| export ROOT= |
| export ROOTDELAY= |
| export ROOTFLAGS= |
| export ROOTFSTYPE= |
| export IP= |
| export BOOT= |
| export BOOTIF= |
| export UBIMTD= |
| export break= |
| export init=/sbin/init |
| export quiet=n |
| export readonly=y |
| export rootmnt=/root |
| export debug= |
| export panic= |
| export blacklist= |
| export resume= |
| export resume_offset= |
| export recovery= |
| |
| for i in /sys/devices/system/cpu/cpu*/online |
| do |
| case $i in |
| '/sys/devices/system/cpu/cpu0/online') |
| ;; |
| '/sys/devices/system/cpu/cpu*/online') |
| ;; |
| *) |
| echo 1 > $i |
| ;; |
| esac |
| done |
| |
| while : |
| do |
| sleep 10 |
| done |
| ------------------------------------------------------------------------ |
| |
| References: |
| [1]: https://dracut.wiki.kernel.org/index.php/Main_Page |
| [2]: http://blog.elastocloud.org/2015/06/rapid-linux-kernel-devtest-with-qemu.html |
| [3]: https://www.centos.org/forums/viewtopic.php?t=51621 |