]> git.ipfire.org Git - thirdparty/dracut.git/blob - test/TEST-50-MULTINIC/test.sh
testsuite: fixups
[thirdparty/dracut.git] / test / TEST-50-MULTINIC / test.sh
1 #!/bin/bash
2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
4 TEST_DESCRIPTION="root filesystem on NFS with multiple nics"
5
6 KVERSION=${KVERSION-$(uname -r)}
7
8 # Uncomment this to debug failures
9 #DEBUGFAIL="rd.shell"
10 #SERIAL="tcp:127.0.0.1:9999"
11 SERIAL="null"
12
13 run_server() {
14 # Start server first
15 echo "MULTINIC TEST SETUP: Starting DHCP/NFS server"
16
17 $testdir/run-qemu -hda $TESTDIR/server.ext3 -m 512M -nographic \
18 -net nic,macaddr=52:54:00:12:34:56,model=e1000 \
19 -net socket,listen=127.0.0.1:12350 \
20 -serial $SERIAL \
21 -watchdog ib700 -watchdog-action poweroff \
22 -kernel /boot/vmlinuz-$KVERSION \
23 -append "selinux=0 root=/dev/sda rootfstype=ext3 rd.debug rd.info rw loglevel=77 console=ttyS0,115200n81" \
24 -initrd $TESTDIR/initramfs.server -pidfile $TESTDIR/server.pid -daemonize || return 1
25 sudo chmod 644 $TESTDIR/server.pid || return 1
26
27 # Cleanup the terminal if we have one
28 tty -s && stty sane
29
30 echo Sleeping 10 seconds to give the server a head start
31 sleep 10
32 }
33
34 client_test() {
35 local test_name="$1"
36 local mac1="$2"
37 local mac2="$3"
38 local mac3="$4"
39 local cmdline="$5"
40 local check="$6"
41
42 echo "CLIENT TEST START: $test_name"
43
44 # Need this so kvm-qemu will boot (needs non-/dev/zero local disk)
45 if ! dd if=/dev/zero of=$TESTDIR/client.img bs=1M count=1; then
46 echo "Unable to make client sda image" 1>&2
47 return 1
48 fi
49
50 $testdir/run-qemu -hda $TESTDIR/client.img -m 512M -nographic \
51 -net nic,macaddr=52:54:00:12:34:$mac1,model=e1000 \
52 -net nic,macaddr=52:54:00:12:34:$mac2,model=e1000 \
53 -net nic,macaddr=52:54:00:12:34:$mac3,model=e1000 \
54 -net socket,connect=127.0.0.1:12350 \
55 -hdc /dev/null \
56 -watchdog ib700 -watchdog-action poweroff \
57 -kernel /boot/vmlinuz-$KVERSION \
58 -append "$cmdline $DEBUGFAIL rd.retry=5 rd.debug rd.info ro rd.systemd.log_level=debug console=ttyS0,115200n81 selinux=0 rd.copystate rd.chroot init=/sbin/init" \
59 -initrd $TESTDIR/initramfs.testing
60
61 if [[ $? -ne 0 ]] || ! grep -m 1 -q OK $TESTDIR/client.img; then
62 echo "CLIENT TEST END: $test_name [FAILED - BAD EXIT]"
63 return 1
64 fi
65
66
67 for i in $check ; do
68 echo $i
69 if ! grep -m 1 -q $i $TESTDIR/client.img; then
70 echo "CLIENT TEST END: $test_name [FAILED - BAD IF]"
71 return 1
72 fi
73 done
74
75 echo "CLIENT TEST END: $test_name [OK]"
76 return 0
77 }
78
79
80 test_run() {
81 if ! run_server; then
82 echo "Failed to start server" 1>&2
83 return 1
84 fi
85 test_client || { kill_server; return 1; }
86 }
87
88 test_client() {
89 # Mac Numbering Scheme
90 # ...:00-02 receive IP adresses all others don't
91 # ...:02 receives a dhcp root-path
92
93 # PXE Style BOOTIF=
94 # client_test "MULTINIC root=nfs BOOTIF=" \
95 # 00 01 02 \
96 # "root=nfs:192.168.50.1:/nfs/client BOOTIF=52-54-00-12-34-00" \
97 # "eth0" || return 1
98
99 # PXE Style BOOTIF= with dhcp root-path
100 client_test "MULTINIC root=dhcp BOOTIF=" \
101 00 01 02 \
102 "root=dhcp BOOTIF=52-54-00-12-34-02" \
103 "eth2" || return 1
104
105 # Multinic case, where only one nic works
106 client_test "MULTINIC root=nfs ip=dhcp" \
107 FF 00 FE \
108 "root=nfs:192.168.50.1:/nfs/client ip=dhcp" \
109 "eth1" || return 1
110
111 # Require two interfaces
112 client_test "MULTINIC root=nfs ip=eth1:dhcp ip=eth2:dhcp bootdev=eth1" \
113 00 01 02 \
114 "root=nfs:192.168.50.1:/nfs/client ip=eth1:dhcp ip=eth2:dhcp bootdev=eth1" \
115 "eth1 eth2" || return 1
116
117 # Require three interfaces with dhcp root-path
118 client_test "MULTINIC root=dhcp ip=eth0:dhcp ip=eth1:dhcp ip=eth2:dhcp bootdev=eth2" \
119 00 01 02 \
120 "root=dhcp ip=eth0:dhcp ip=eth1:dhcp ip=eth2:dhcp bootdev=eth2" \
121 "eth0 eth1 eth2" || return 1
122
123 kill_server
124 return 0
125 }
126
127 test_setup() {
128 # Make server root
129 dd if=/dev/null of=$TESTDIR/server.ext3 bs=1M seek=60
130 mke2fs -j -F $TESTDIR/server.ext3
131 mkdir $TESTDIR/mnt
132 sudo mount -o loop $TESTDIR/server.ext3 $TESTDIR/mnt
133
134 (
135 initdir=$TESTDIR/mnt
136 . $basedir/dracut-functions.sh
137
138 (
139 cd "$initdir";
140 mkdir -p dev sys proc run etc var/run tmp var/lib/{dhcpd,rpcbind}
141 mkdir -p var/lib/nfs/{v4recovery,rpc_pipefs}
142 chmod 777 var/lib/rpcbind var/lib/nfs
143 )
144
145 for _f in modules.builtin.bin modules.builtin; do
146 [[ $srcmods/$_f ]] && break
147 done || {
148 dfatal "No modules.builtin.bin and modules.builtin found!"
149 return 1
150 }
151
152 for _f in modules.builtin.bin modules.builtin modules.order; do
153 [[ $srcmods/$_f ]] && inst_simple "$srcmods/$_f" "/lib/modules/$kernel/$_f"
154 done
155
156 dracut_install sh ls shutdown poweroff stty cat ps ln ip \
157 dmesg mkdir cp ping exportfs \
158 modprobe rpc.nfsd rpc.mountd showmount tcpdump \
159 /etc/services sleep mount chmod
160 for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
161 [ -f ${_terminfodir}/l/linux ] && break
162 done
163 dracut_install -o ${_terminfodir}/l/linux
164 type -P portmap >/dev/null && dracut_install portmap
165 type -P rpcbind >/dev/null && dracut_install rpcbind
166 [ -f /etc/netconfig ] && dracut_install /etc/netconfig
167 type -P dhcpd >/dev/null && dracut_install dhcpd
168 [ -x /usr/sbin/dhcpd3 ] && inst /usr/sbin/dhcpd3 /usr/sbin/dhcpd
169 instmods nfsd sunrpc ipv6 lockd
170 inst ./server-init.sh /sbin/init
171 inst ./hosts /etc/hosts
172 inst ./exports /etc/exports
173 inst ./dhcpd.conf /etc/dhcpd.conf
174 dracut_install /etc/nsswitch.conf /etc/rpc /etc/protocols
175
176 dracut_install rpc.idmapd /etc/idmapd.conf
177
178 inst_libdir_file 'libnfsidmap_nsswitch.so*'
179 inst_libdir_file 'libnfsidmap/*.so*'
180 inst_libdir_file 'libnfsidmap*.so*'
181
182 _nsslibs=$(sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' /etc/nsswitch.conf \
183 | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|')
184 _nsslibs=${_nsslibs#|}
185 _nsslibs=${_nsslibs%|}
186
187 inst_libdir_file -n "$_nsslibs" 'libnss*.so*'
188
189 inst /etc/nsswitch.conf /etc/nsswitch.conf
190 inst /etc/passwd /etc/passwd
191 inst /etc/group /etc/group
192
193 cp -a /etc/ld.so.conf* $initdir/etc
194 sudo ldconfig -r "$initdir"
195 dracut_kernel_post
196 )
197
198 # Make client root inside server root
199 (
200 initdir=$TESTDIR/mnt/nfs/client
201 . $basedir/dracut-functions.sh
202 dracut_install sh shutdown poweroff stty cat ps ln ip \
203 mount dmesg mkdir cp ping grep ls
204 for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
205 [ -f ${_terminfodir}/l/linux ] && break
206 done
207 dracut_install -o ${_terminfodir}/l/linux
208 inst ./client-init.sh /sbin/init
209 (
210 cd "$initdir"
211 mkdir -p dev sys proc etc run
212 mkdir -p var/lib/nfs/rpc_pipefs
213 )
214 inst /etc/nsswitch.conf /etc/nsswitch.conf
215 inst /etc/passwd /etc/passwd
216 inst /etc/group /etc/group
217
218 dracut_install rpc.idmapd /etc/idmapd.conf
219 inst_libdir_file 'libnfsidmap_nsswitch.so*'
220 inst_libdir_file 'libnfsidmap/*.so*'
221 inst_libdir_file 'libnfsidmap*.so*'
222
223 _nsslibs=$(sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' /etc/nsswitch.conf \
224 | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|')
225 _nsslibs=${_nsslibs#|}
226 _nsslibs=${_nsslibs%|}
227
228 inst_libdir_file -n "$_nsslibs" 'libnss*.so*'
229
230 cp -a /etc/ld.so.conf* $initdir/etc
231 sudo ldconfig -r "$initdir"
232 )
233
234 sudo umount $TESTDIR/mnt
235 rm -fr $TESTDIR/mnt
236
237 # Make an overlay with needed tools for the test harness
238 (
239 initdir=$TESTDIR/overlay
240 . $basedir/dracut-functions.sh
241 dracut_install poweroff shutdown
242 inst_hook emergency 000 ./hard-off.sh
243 inst_simple ./99-idesymlinks.rules /etc/udev/rules.d/99-idesymlinks.rules
244 )
245
246 # Make server's dracut image
247 $basedir/dracut.sh -l -i $TESTDIR/overlay / \
248 -m "dash udev-rules base rootfs-block debug kernel-modules watchdog" \
249 -d "piix ide-gd_mod ata_piix ext3 sd_mod e1000 ib700wdt" \
250 -f $TESTDIR/initramfs.server $KVERSION || return 1
251
252 # Make client's dracut image
253 $basedir/dracut.sh -l -i $TESTDIR/overlay / \
254 -o "plymouth" \
255 -a "debug" \
256 -d "piix sd_mod sr_mod ata_piix ide-gd_mod e1000 nfs sunrpc ib700wdt" \
257 -f $TESTDIR/initramfs.testing $KVERSION || return 1
258 }
259
260 kill_server() {
261 if [[ -s $TESTDIR/server.pid ]]; then
262 sudo kill -TERM $(cat $TESTDIR/server.pid)
263 rm -f $TESTDIR/server.pid
264 fi
265 }
266
267 test_cleanup() {
268 kill_server
269 }
270
271 . $testdir/test-functions