blob: efdf449a82384b6924186facaa22e57355696910 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
|
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
TEST_DESCRIPTION="Basic systemd setup"
KVERSION=${KVERSION-$(uname -r)}
# Uncomment this to debug failures
#DEBUGFAIL="systemd.unit=multi-user.target"
DEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort"
run_qemu() {
qemu-kvm \
-hda $TESTDIR/rootdisk.img \
-m 256M -nographic \
-net none -kernel /boot/vmlinuz-$KVERSION \
-append "root=/dev/sda1 systemd.log_level=debug raid=noautodetect loglevel=2 init=/usr/lib/systemd/systemd rw console=ttyS0,115200n81 selinux=0 $DEBUGFAIL" || return 1
ret=1
mkdir -p $TESTDIR/root
mount ${LOOPDEV}p1 $TESTDIR/root
[[ -e $TESTDIR/root/testok ]] && ret=0
cp -a $TESTDIR/root/var/log/journal $TESTDIR
cp -a $TESTDIR/root/failed $TESTDIR
umount $TESTDIR/root
cat $TESTDIR/failed
ls -l $TESTDIR/journal/*/*.journal
test -s $TESTDIR/failed && ret=$(($ret+1))
return $ret
}
run_nspawn() {
systemd-nspawn -b -D $TESTDIR/nspawn-root /usr/lib/systemd/systemd
ret=1
[[ -e $TESTDIR/nspawn-root/testok ]] && ret=0
cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
cp -a $TESTDIR/nspawn-root/failed $TESTDIR
cat $TESTDIR/failed
ls -l $TESTDIR/journal/*/*.journal
test -s $TESTDIR/failed && ret=$(($ret+1))
return $ret
}
test_run() {
run_qemu || return 1
if [[ -d /sys/fs/cgroup/systemd ]]; then
run_nspawn || return 1
fi
return 0
}
test_setup() {
rm -f $TESTDIR/rootdisk.img
# Create the blank file to use as a root filesystem
dd if=/dev/null of=$TESTDIR/rootdisk.img bs=1M seek=100
LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
[ -b $LOOPDEV ] || return 1
echo "LOOPDEV=$LOOPDEV" >> $STATEFILE
sfdisk -C 3200 -H 2 -S 32 -L $LOOPDEV <<EOF
,
EOF
mkfs.ext3 -L systemd ${LOOPDEV}p1
mkdir -p $TESTDIR/root
mount ${LOOPDEV}p1 $TESTDIR/root
mkdir -p $TESTDIR/root/run
kernel=$KVERSION
# Create what will eventually be our root filesystem onto an overlay
(
LOG_LEVEL=5
initdir=$TESTDIR/root
# create the basic filesystem layout
setup_basic_dirs
# install compiled files
(cd ../..; make DESTDIR=$initdir install)
# install possible missing libraries
for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
inst_libs $i
done
# activate kmsg import
echo 'ImportKernel=yes' >> $initdir/etc/systemd/journald.conf
# make a journal directory
mkdir -p $initdir/var/log/journal
# install some basic config files
inst /etc/sysconfig/init
inst /etc/passwd
inst /etc/shadow
inst /etc/group
inst /etc/shells
inst /etc/nsswitch.conf
inst /etc/pam.conf
inst /etc/securetty
inst /etc/os-release
inst /etc/localtime
# we want an empty environment
> $initdir/etc/environment
# set the hostname
echo systemd-testsuite > $initdir/etc/hostname
# setup the testsuite target
cat >$initdir/etc/systemd/system/testsuite.target <<EOF
[Unit]
Description=Testsuite target
Requires=multi-user.target
After=multi-user.target
Conflicts=rescue.target
AllowIsolate=yes
EOF
# setup the testsuite service
cat >$initdir/etc/systemd/system/testsuite.service <<EOF
[Unit]
Description=Testsuite service
After=multi-user.target
[Service]
ExecStart=/bin/sh -c 'systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok'
ExecStartPost=/usr/sbin/poweroff
Type=oneshot
EOF
mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
ln -fs ../testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
# make the testsuite the default target
ln -fs testsuite.target $initdir/etc/systemd/system/default.target
mkdir -p $initdir/etc/rc.d
cat >$initdir/etc/rc.d/rc.local <<EOF
#!/bin/bash
exit 0
EOF
chmod 0755 $initdir/etc/rc.d/rc.local
# install basic tools needed
dracut_install sh bash setsid loadkeys setfont \
login sushell sulogin gzip sleep echo
# install libnss_files for login
inst_libdir_file "libnss_files*"
# install dbus and pam
find \
/etc/dbus-1 \
/etc/pam.d \
/etc/security \
/lib64/security \
/lib/security -xtype f \
| while read file; do
inst $file
done
# install dbus socket and service file
inst /usr/lib/systemd/system/dbus.socket
inst /usr/lib/systemd/system/dbus.service
# install basic keyboard maps and fonts
for i in \
/usr/lib/kbd/consolefonts/latarcyrheb-sun16* \
/usr/lib/kbd/keymaps/include/* \
/usr/lib/kbd/keymaps/i386/include/* \
/usr/lib/kbd/keymaps/i386/qwerty/us.*; do
[[ -f $i ]] || continue
inst $i
done
# some basic terminfo files
for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
[ -f ${_terminfodir}/l/linux ] && break
done
dracut_install -o ${_terminfodir}/l/linux
# softlink mtab
ln -fs /proc/self/mounts $initdir/etc/mtab
# install any Exec's from the service files
egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/lib/systemd/system/*.service \
| while read i; do
i=${i##Exec*=}; i=${i##-}
inst $i
done
# install plymouth, if found... else remove plymouth service files
if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
/usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
dracut_install plymouth plymouthd
else
rm -f $initdir/usr/lib/systemd/system/plymouth* $initdir/usr/lib/systemd/system/*/plymouth*
fi
# some helper tools for debugging
[[ $DEBUGTOOLS ]] && dracut_install $DEBUGTOOLS
# install ld.so.conf* and run ldconfig
cp -a /etc/ld.so.conf* $initdir/etc
ldconfig -r "$initdir"
)
rm -fr $TESTDIR/nspawn-root
cp -avr $TESTDIR/root $TESTDIR/nspawn-root
umount $TESTDIR/root
}
test_cleanup() {
umount $TESTDIR/root 2>/dev/null
[[ $LOOPDEV ]] && losetup -d $LOOPDEV
return 0
}
. $TEST_BASE_DIR/test-functions
do_test "$@"
|