test.sh revision 7bcd865d386d96caac83cb1c589fdb8f9ce3b081
2N/A#!/bin/bash
2N/A# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
2N/A# ex: ts=8 sw=4 sts=4 et filetype=sh
2N/ATEST_DESCRIPTION="Basic systemd setup"
2N/A
2N/AKVERSION=${KVERSION-$(uname -r)}
2N/AKERNEL_VER=$(uname -r)
2N/A
2N/A# Uncomment this to debug failures
2N/A#DEBUGFAIL="systemd.unit=multi-user.target"
2N/ADEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort"
2N/A
2N/Arun_qemu() {
2N/A # TODO: qemu wrapper script: http://www.spinics.net/lists/kvm/msg72389.html
2N/A qemu-kvm \
2N/A -hda $TESTDIR/rootdisk.img \
2N/A -m 512M -nographic \
2N/A -net none -kernel /boot/vmlinuz-$KERNEL_VER \
2N/A -append "root=/dev/sda1 systemd.log_level=debug raid=noautodetect loglevel=2 init=/usr/lib/systemd/systemd ro console=ttyS0,115200n81 selinux=0 $DEBUGFAIL" || return 1
2N/A
3783N/A ret=1
2N/A mkdir -p $TESTDIR/root
2N/A mount ${LOOPDEV}p1 $TESTDIR/root
32N/A [[ -e $TESTDIR/root/testok ]] && ret=0
32N/A cp -a $TESTDIR/root/failed $TESTDIR
313N/A cp -a $TESTDIR/root/var/log/journal $TESTDIR
313N/A umount $TESTDIR/root
313N/A cat $TESTDIR/failed
313N/A ls -l $TESTDIR/journal/*/*.journal
313N/A test -s $TESTDIR/failed && ret=$(($ret+1))
313N/A return $ret
313N/A}
313N/A
313N/A
2238N/Arun_nspawn() {
3996N/A ../../systemd-nspawn -b -D $TESTDIR/nspawn-root /usr/lib/systemd/systemd
313N/A ret=1
313N/A [[ -e $TESTDIR/nspawn-root/testok ]] && ret=0
313N/A cp -a $TESTDIR/nspawn-root/failed $TESTDIR
313N/A cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
2238N/A cat $TESTDIR/failed
313N/A ls -l $TESTDIR/journal/*/*.journal
2238N/A test -s $TESTDIR/failed && ret=$(($ret+1))
127N/A return $ret
127N/A}
1622N/A
1622N/A
1622N/Atest_run() {
127N/A if check_qemu ; then
3996N/A run_qemu || return 1
3996N/A else
3996N/A dwarn "can't run qemu-kvm, skipping"
538N/A fi
538N/A if check_nspawn; then
538N/A run_nspawn || return 1
538N/A else
3996N/A dwarn "can't run systemd-nspawn, skipping"
538N/A fi
327N/A return 0
327N/A}
327N/A
327N/Atest_setup() {
327N/A rm -f $TESTDIR/rootdisk.img
327N/A # Create the blank file to use as a root filesystem
327N/A dd if=/dev/null of=$TESTDIR/rootdisk.img bs=1M seek=200
327N/A LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
327N/A [ -b $LOOPDEV ] || return 1
327N/A echo "LOOPDEV=$LOOPDEV" >> $STATEFILE
327N/A sfdisk -C 6400 -H 2 -S 32 -L $LOOPDEV <<EOF
327N/A,3200
3996N/A,
3996N/AEOF
3996N/A
2238N/A mkfs.ext3 -L systemd ${LOOPDEV}p1
2238N/A echo -n test >$TESTDIR/keyfile
2238N/A mkdir -p $TESTDIR/root
2238N/A mount ${LOOPDEV}p1 $TESTDIR/root
177N/A mkdir -p $TESTDIR/root/run
177N/A
3987N/A # Create what will eventually be our root filesystem onto an overlay
3987N/A (
3987N/A LOG_LEVEL=5
2N/A initdir=$TESTDIR/root
3987N/A
883N/A # create the basic filesystem layout
26N/A setup_basic_dirs
38N/A
38N/A # install compiled files
3996N/A (cd ../..; make DESTDIR=$initdir install)
1622N/A
26N/A # remove unneeded documentation
3996N/A rm -fr $initdir/usr/share/{man,doc,gtk-doc}
3996N/A
3996N/A # install possible missing libraries
477N/A for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
538N/A inst_libs $i
38N/A done
3996N/A
6N/A # make a journal directory
3778N/A mkdir -p $initdir/var/log/journal
3985N/A
3985N/A # install some basic config files
3985N/A inst /etc/sysconfig/init
3778N/A inst /etc/passwd
3778N/A inst /etc/shadow
2N/A inst /etc/group
34N/A inst /etc/shells
34N/A inst /etc/nsswitch.conf
94N/A inst /etc/pam.conf
94N/A inst /etc/securetty
156N/A inst /etc/os-release
156N/A inst /etc/localtime
34N/A # we want an empty environment
59N/A > $initdir/etc/environment
1273N/A > $initdir/etc/machine-id
1273N/A
1622N/A # set the hostname
72N/A echo systemd-testsuite > $initdir/etc/hostname
72N/A
59N/A eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)
2N/A
85N/A cat >$initdir/etc/fstab <<EOF
61N/ALABEL=systemd / ext3 rw 0 1
61N/AEOF
220N/A
61N/A # setup the testsuite target and the test ending service
61N/A cp $TEST_BASE_DIR/{testsuite.target,end.service} $initdir/etc/systemd/system/
1762N/A
172N/A # setup the testsuite service
61N/A cat >$initdir/etc/systemd/system/testsuite.service <<EOF
61N/A[Unit]
220N/ADescription=Testsuite service
220N/AAfter=multi-user.target
61N/A
172N/A[Service]
454N/AExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;'
61N/AType=oneshot
172N/AEOF
61N/A
152N/A mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
74N/A ln -fs ../testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
61N/A ln -fs ../end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
220N/A
85N/A # make the testsuite the default target
172N/A ln -fs testsuite.target $initdir/etc/systemd/system/default.target
61N/A mkdir -p $initdir/etc/rc.d
172N/A cat >$initdir/etc/rc.d/rc.local <<EOF
61N/A#!/bin/bash
3996N/Aexit 0
172N/AEOF
61N/A chmod 0755 $initdir/etc/rc.d/rc.local
61N/A # install basic tools needed
220N/A dracut_install sh bash setsid loadkeys setfont \
61N/A login sushell sulogin gzip sleep echo mount umount cryptsetup
454N/A dracut_install dmsetup modprobe
61N/A
172N/A # install libnss_files for login
61N/A inst_libdir_file "libnss_files*"
172N/A
61N/A # install dbus and pam
152N/A find \
152N/A /etc/dbus-1 \
220N/A /etc/pam.d \
61N/A /etc/security \
61N/A /lib64/security \
43N/A /lib/security -xtype f \
220N/A | while read file; do
43N/A inst $file
120N/A done
64N/A
64N/A # install dbus socket and service file
64N/A inst /usr/lib/systemd/system/dbus.socket
43N/A inst /usr/lib/systemd/system/dbus.service
43N/A
120N/A # install basic keyboard maps and fonts
64N/A for i in \
64N/A /usr/lib/kbd/consolefonts/latarcyrheb-sun16* \
64N/A /usr/lib/kbd/keymaps/include/* \
220N/A /usr/lib/kbd/keymaps/i386/include/* \
64N/A /usr/lib/kbd/keymaps/i386/qwerty/us.*; do
64N/A [[ -f $i ]] || continue
486N/A inst $i
486N/A done
64N/A
64N/A # some basic terminfo files
64N/A for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
64N/A [ -f ${_terminfodir}/l/linux ] && break
64N/A done
64N/A dracut_install -o ${_terminfodir}/l/linux
64N/A
43N/A # softlink mtab
16N/A ln -fs /proc/self/mounts $initdir/etc/mtab
16N/A
16N/A # install any Exec's from the service files
34N/A egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/lib/systemd/system/*.service \
34N/A | while read i; do
16N/A i=${i##Exec*=}; i=${i##-}
6N/A inst $i
12N/A done
1622N/A
12N/A # install plymouth, if found... else remove plymouth service files
12N/A # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
12N/A # PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
12N/A # /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
12N/A # dracut_install plymouth plymouthd
12N/A # else
12N/A rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth*
12N/A # fi
12N/A
369N/A # some helper tools for debugging
369N/A [[ $DEBUGTOOLS ]] && dracut_install $DEBUGTOOLS
3781N/A
369N/A # install ld.so.conf* and run ldconfig
61N/A cp -a /etc/ld.so.conf* $initdir/etc
61N/A ldconfig -r "$initdir"
61N/A ddebug "Strip binaries"
61N/A find "$initdir" -perm +111 -type f | xargs strip --strip-unneeded | ddebug
61N/A
12N/A # copy depmod files
181N/A inst /lib/modules/$KERNEL_VER/modules.order
181N/A inst /lib/modules/$KERNEL_VER/modules.builtin
12N/A # generate module dependencies
61N/A if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \
61N/A ! depmod -a -b "$initdir" $KERNEL_VER; then
12N/A dfatal "\"depmod -a $KERNEL_VER\" failed."
279N/A exit 1
279N/A fi
181N/A )
181N/A rm -fr $TESTDIR/nspawn-root
181N/A ddebug "cp -ar $TESTDIR/root $TESTDIR/nspawn-root"
2N/A cp -ar $TESTDIR/root $TESTDIR/nspawn-root
4239N/A # we don't mount in the nspawn root
4239N/A rm -f $TESTDIR/nspawn-root/etc/fstab
4239N/A
99N/A ddebug "umount $TESTDIR/root"
99N/A umount $TESTDIR/root
99N/A}
3996N/A
3996N/Atest_cleanup() {
3996N/A umount $TESTDIR/root 2>/dev/null
181N/A [[ $LOOPDEV ]] && losetup -d $LOOPDEV
181N/A return 0
181N/A}
99N/A
40N/A. $TEST_BASE_DIR/test-functions
844N/Ado_test "$@"
40N/A