]>
Commit | Line | Data |
---|---|---|
4e669086 HH |
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 bridging/bonding/vlan" | |
5 | KVERSION=${KVERSION-$(uname -r)} | |
6 | ||
7 | # Uncomment this to debug failures | |
8 | #DEBUGFAIL="rd.shell rd.break" | |
9 | #DEBUGFAIL="rd.shell rd.break rd.debug" | |
10 | #SERIAL="tcp:127.0.0.1:9999" | |
11 | ||
12 | run_server() { | |
13 | # Start server first | |
14 | echo "MULTINIC TEST SETUP: Starting DHCP/NFS server" | |
15 | ||
16 | fsck -a "$TESTDIR"/server.ext3 || return 1 | |
ca8f1c1b | 17 | |
4e669086 HH |
18 | $testdir/run-qemu \ |
19 | -hda "$TESTDIR"/server.ext3 \ | |
20 | -m 512M -smp 2 \ | |
21 | -display none \ | |
6058b06b HH |
22 | -netdev socket,id=n0,listen=127.0.0.1:12370 \ |
23 | -netdev socket,id=n1,listen=127.0.0.1:12371 \ | |
24 | -netdev socket,id=n2,listen=127.0.0.1:12372 \ | |
25 | -netdev socket,id=n3,listen=127.0.0.1:12373 \ | |
26 | -device e1000,netdev=n0,mac=52:54:01:12:34:56 \ | |
27 | -device e1000,netdev=n1,mac=52:54:01:12:34:57 \ | |
28 | -device e1000,netdev=n2,mac=52:54:01:12:34:58 \ | |
29 | -device e1000,netdev=n3,mac=52:54:01:12:34:59 \ | |
4e669086 HH |
30 | ${SERIAL:+-serial "$SERIAL"} \ |
31 | ${SERIAL:--serial file:"$TESTDIR"/server.log} \ | |
32 | -watchdog i6300esb -watchdog-action poweroff \ | |
4e669086 | 33 | -no-reboot \ |
7934c6f9 | 34 | -append "panic=1 systemd.crash_reboot loglevel=7 root=/dev/sda rootfstype=ext3 rw console=ttyS0,115200n81 selinux=0 rd.debug" \ |
4e669086 HH |
35 | -initrd "$TESTDIR"/initramfs.server \ |
36 | -pidfile "$TESTDIR"/server.pid -daemonize || return 1 | |
37 | chmod 644 -- "$TESTDIR"/server.pid || return 1 | |
38 | ||
39 | # Cleanup the terminal if we have one | |
40 | tty -s && stty sane | |
41 | ||
42 | echo Sleeping 10 seconds to give the server a head start | |
43 | sleep 10 | |
44 | } | |
45 | ||
46 | client_test() { | |
47 | local test_name="$1" | |
48 | local do_vlan13="$2" | |
49 | local cmdline="$3" | |
50 | local check="$4" | |
51 | local CONF | |
52 | ||
53 | echo "CLIENT TEST START: $test_name" | |
54 | ||
55 | [ "$do_vlan13" != "yes" ] && unset do_vlan13 | |
56 | ||
57 | # Need this so kvm-qemu will boot (needs non-/dev/zero local disk) | |
58 | if ! dd if=/dev/zero of="$TESTDIR"/client.img bs=1M count=1; then | |
59 | echo "Unable to make client sda image" 1>&2 | |
60 | return 1 | |
61 | fi | |
6058b06b HH |
62 | if [[ $do_vlan13 ]]; then |
63 | nic1=" -netdev socket,connect=127.0.0.1:12371,id=n1" | |
64 | nic3=" -netdev socket,connect=127.0.0.1:12373,id=n3" | |
65 | else | |
66 | nic1=" -netdev hubport,id=n1,hubid=2" | |
67 | nic3=" -netdev hubport,id=n3,hubid=3" | |
68 | fi | |
4e669086 | 69 | |
ca8f1c1b HH |
70 | if $testdir/run-qemu --help | grep -qF -m1 'netdev hubport,id=str,hubid=n[,netdev=nd]' && echo OK; then |
71 | $testdir/run-qemu \ | |
72 | -hda "$TESTDIR"/client.img -m 512M -smp 2 -nographic \ | |
73 | -netdev socket,connect=127.0.0.1:12370,id=s1 \ | |
74 | -netdev hubport,hubid=1,id=h1,netdev=s1 \ | |
75 | -netdev hubport,hubid=1,id=h2 -device e1000,mac=52:54:00:12:34:01,netdev=h2 \ | |
76 | -netdev hubport,hubid=1,id=h3 -device e1000,mac=52:54:00:12:34:02,netdev=h3 \ | |
77 | $nic1 -device e1000,mac=52:54:00:12:34:03,netdev=n1 \ | |
78 | -netdev socket,connect=127.0.0.1:12372,id=n2 -device e1000,mac=52:54:00:12:34:04,netdev=n2 \ | |
79 | $nic3 -device e1000,mac=52:54:00:12:34:05,netdev=n3 \ | |
80 | -watchdog i6300esb -watchdog-action poweroff \ | |
81 | -no-reboot \ | |
7934c6f9 | 82 | -append "panic=1 systemd.crash_reboot $cmdline rd.debug $DEBUGFAIL rd.retry=5 rw console=ttyS0,115200n81 selinux=0 init=/sbin/init" \ |
ca8f1c1b HH |
83 | -initrd "$TESTDIR"/initramfs.testing |
84 | else | |
85 | $testdir/run-qemu \ | |
86 | -hda "$TESTDIR"/client.img -m 512M -smp 2 -nographic \ | |
87 | -net socket,vlan=0,connect=127.0.0.1:12370 \ | |
88 | ${do_vlan13:+-net socket,vlan=1,connect=127.0.0.1:12371} \ | |
89 | -net socket,vlan=2,connect=127.0.0.1:12372 \ | |
90 | ${do_vlan13:+-net socket,vlan=3,connect=127.0.0.1:12373} \ | |
91 | -net nic,vlan=0,macaddr=52:54:00:12:34:01,model=e1000 \ | |
92 | -net nic,vlan=0,macaddr=52:54:00:12:34:02,model=e1000 \ | |
93 | -net nic,vlan=1,macaddr=52:54:00:12:34:03,model=e1000 \ | |
94 | -net nic,vlan=2,macaddr=52:54:00:12:34:04,model=e1000 \ | |
95 | -net nic,vlan=3,macaddr=52:54:00:12:34:05,model=e1000 \ | |
96 | -watchdog i6300esb -watchdog-action poweroff \ | |
97 | -no-reboot \ | |
7934c6f9 | 98 | -append "panic=1 systemd.crash_reboot $cmdline rd.debug $DEBUGFAIL rd.retry=5 rw console=ttyS0,115200n81 selinux=0 init=/sbin/init" \ |
ca8f1c1b HH |
99 | -initrd "$TESTDIR"/initramfs.testing |
100 | fi | |
101 | ||
4e669086 HH |
102 | { |
103 | read OK | |
104 | if [[ "$OK" != "OK" ]]; then | |
105 | echo "CLIENT TEST END: $test_name [FAILED - BAD EXIT]" | |
106 | return 1 | |
107 | fi | |
108 | ||
109 | while read line; do | |
110 | [[ $line == END ]] && break | |
111 | CONF+="$line " | |
112 | done | |
113 | } < "$TESTDIR"/client.img || return 1 | |
114 | ||
9dfd73bc LR |
115 | if [[ ! "$CONF" =~ ^$check$ ]]; then |
116 | echo "Expected: /^$check\$/" | |
4e669086 HH |
117 | echo |
118 | echo | |
119 | echo "Got: '$CONF'" | |
120 | echo "CLIENT TEST END: $test_name [FAILED - BAD CONF]" | |
121 | return 1 | |
122 | fi | |
123 | ||
124 | echo "CLIENT TEST END: $test_name [OK]" | |
125 | return 0 | |
126 | } | |
127 | ||
128 | ||
129 | test_run() { | |
130 | if ! run_server; then | |
131 | echo "Failed to start server" 1>&2 | |
132 | return 1 | |
133 | fi | |
134 | test_client || { kill_server; return 1; } | |
135 | } | |
136 | ||
137 | test_client() { | |
138 | client_test "Multiple VLAN" \ | |
139 | "yes" \ | |
140 | " | |
6058b06b HH |
141 | vlan=vlan0001:ens5 |
142 | vlan=vlan2:ens5 | |
143 | vlan=ens5.3:ens5 | |
144 | vlan=ens5.0004:ens5 | |
4e669086 HH |
145 | ip=ens3:dhcp |
146 | ip=192.168.54.101::192.168.54.1:24:test:vlan0001:none | |
147 | ip=192.168.55.102::192.168.55.1:24:test:vlan2:none | |
6058b06b HH |
148 | ip=192.168.56.103::192.168.56.1:24:test:ens5.3:none |
149 | ip=192.168.57.104::192.168.57.1:24:test:ens5.0004:none | |
4e669086 HH |
150 | rd.neednet=1 |
151 | root=nfs:192.168.50.1:/nfs/client bootdev=ens3 | |
152 | " \ | |
9dfd73bc | 153 | 'ens3 inet 192\.168\.50\.[0-9]*/24 brd 192\.168\.50\.255 ens5\.0004 inet 192\.168\.57\.104/24 brd 192\.168\.57\.255 ens5\.3 inet 192\.168\.56\.103/24 brd 192\.168\.56\.255 vlan0001 inet 192\.168\.54\.101/24 brd 192\.168\.54\.255 vlan2 inet 192\.168\.55\.102/24 brd 192\.168\.55\.255 EOF ' \ |
4e669086 HH |
154 | || return 1 |
155 | ||
156 | client_test "Multiple Bonds" \ | |
157 | "yes" \ | |
158 | " | |
159 | bond=bond0:ens4,ens5 | |
160 | bond=bond1:ens6,ens7 | |
161 | ip=bond0:dhcp | |
162 | ip=bond1:dhcp | |
163 | rd.neednet=1 | |
164 | root=nfs:192.168.50.1:/nfs/client bootdev=bond0 | |
165 | " \ | |
9dfd73bc | 166 | 'bond0 inet 192\.168\.50\.[0-9]*/24 brd 192\.168\.50\.255 bond1 inet 192\.168\.51\.[0-9]*/24 brd 192\.168\.51\.255 EOF ' \ |
4e669086 HH |
167 | || return 1 |
168 | ||
169 | client_test "Multiple Bridges" \ | |
170 | "no" \ | |
171 | " | |
172 | bridge=br0:ens4,ens5 | |
173 | bridge=br1:ens6,ens7 | |
174 | ip=br0:dhcp | |
175 | ip=br1:dhcp | |
176 | rd.neednet=1 | |
177 | root=nfs:192.168.50.1:/nfs/client bootdev=br0 | |
178 | " \ | |
9dfd73bc | 179 | 'br0 inet 192\.168\.50\.[0-9]*/24 brd 192\.168\.50\.255 br1 inet 192\.168\.51\.[0-9]*/24 brd 192\.168\.51\.255 EOF ' \ |
4e669086 HH |
180 | || return 1 |
181 | ||
182 | kill_server | |
183 | return 0 | |
184 | } | |
185 | ||
186 | test_setup() { | |
187 | # Make server root | |
66a3d405 | 188 | dd if=/dev/null of="$TESTDIR"/server.ext3 bs=1M seek=120 |
4e669086 HH |
189 | mke2fs -j -F -- "$TESTDIR"/server.ext3 |
190 | mkdir -- "$TESTDIR"/mnt | |
191 | mount -o loop -- "$TESTDIR"/server.ext3 "$TESTDIR"/mnt | |
ca8f1c1b | 192 | kernel=$KVERSION |
4e669086 HH |
193 | ( |
194 | export initdir="$TESTDIR"/mnt | |
195 | . "$basedir"/dracut-init.sh | |
196 | ||
197 | ( | |
198 | cd "$initdir"; | |
199 | mkdir -p -- dev sys proc run etc var/run tmp var/lib/{dhcpd,rpcbind} | |
200 | mkdir -p -- var/lib/nfs/{v4recovery,rpc_pipefs} | |
201 | chmod 777 -- var/lib/rpcbind var/lib/nfs | |
202 | ) | |
203 | ||
204 | for _f in modules.builtin.bin modules.builtin; do | |
205 | [[ $srcmods/$_f ]] && break | |
206 | done || { | |
207 | dfatal "No modules.builtin.bin and modules.builtin found!" | |
208 | return 1 | |
209 | } | |
210 | ||
211 | for _f in modules.builtin.bin modules.builtin modules.order; do | |
212 | [[ $srcmods/$_f ]] && inst_simple "$srcmods/$_f" "/lib/modules/$kernel/$_f" | |
213 | done | |
214 | ||
215 | inst_multiple sh ls shutdown poweroff stty cat ps ln ip \ | |
216 | dmesg mkdir cp ping exportfs \ | |
217 | modprobe rpc.nfsd rpc.mountd showmount tcpdump \ | |
218 | /etc/services sleep mount chmod | |
219 | for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do | |
220 | [ -f "${_terminfodir}"/l/linux ] && break | |
221 | done | |
222 | inst_multiple -o "${_terminfodir}"/l/linux | |
223 | type -P portmap >/dev/null && inst_multiple portmap | |
224 | type -P rpcbind >/dev/null && inst_multiple rpcbind | |
225 | [ -f /etc/netconfig ] && inst_multiple /etc/netconfig | |
226 | type -P dhcpd >/dev/null && inst_multiple dhcpd | |
227 | [ -x /usr/sbin/dhcpd3 ] && inst /usr/sbin/dhcpd3 /usr/sbin/dhcpd | |
ca8f1c1b | 228 | instmods nfsd sunrpc ipv6 lockd af_packet 8021q ipvlan macvlan |
4e669086 HH |
229 | inst_simple /etc/os-release |
230 | inst ./server-init.sh /sbin/init | |
231 | inst ./hosts /etc/hosts | |
232 | inst ./exports /etc/exports | |
233 | inst ./dhcpd.conf /etc/dhcpd.conf | |
234 | inst_multiple /etc/nsswitch.conf /etc/rpc /etc/protocols | |
235 | ||
236 | inst_multiple rpc.idmapd /etc/idmapd.conf | |
237 | ||
238 | inst_libdir_file 'libnfsidmap_nsswitch.so*' | |
239 | inst_libdir_file 'libnfsidmap/*.so*' | |
240 | inst_libdir_file 'libnfsidmap*.so*' | |
241 | ||
242 | _nsslibs=$(sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' /etc/nsswitch.conf \ | |
243 | | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|') | |
244 | _nsslibs=${_nsslibs#|} | |
245 | _nsslibs=${_nsslibs%|} | |
246 | ||
247 | inst_libdir_file -n "$_nsslibs" 'libnss_*.so*' | |
248 | ||
249 | inst /etc/nsswitch.conf /etc/nsswitch.conf | |
250 | inst /etc/passwd /etc/passwd | |
251 | inst /etc/group /etc/group | |
252 | ||
253 | cp -a -- /etc/ld.so.conf* "$initdir"/etc | |
254 | ldconfig -r "$initdir" | |
255 | dracut_kernel_post | |
256 | ) | |
257 | ||
258 | # Make client root inside server root | |
259 | ( | |
260 | export initdir="$TESTDIR"/mnt/nfs/client | |
261 | . "$basedir"/dracut-init.sh | |
262 | inst_multiple sh shutdown poweroff stty cat ps ln ip \ | |
9dfd73bc | 263 | mount dmesg mkdir cp ping grep ls sort sed |
4e669086 HH |
264 | for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do |
265 | [[ -f ${_terminfodir}/l/linux ]] && break | |
266 | done | |
267 | inst_multiple -o "${_terminfodir}"/l/linux | |
268 | inst_simple /etc/os-release | |
269 | inst ./client-init.sh /sbin/init | |
270 | ( | |
271 | cd "$initdir" | |
272 | mkdir -p -- dev sys proc etc run | |
273 | mkdir -p -- var/lib/nfs/rpc_pipefs | |
274 | ) | |
275 | inst /etc/nsswitch.conf /etc/nsswitch.conf | |
276 | inst /etc/passwd /etc/passwd | |
277 | inst /etc/group /etc/group | |
278 | ||
279 | inst_multiple rpc.idmapd /etc/idmapd.conf | |
280 | inst_libdir_file 'libnfsidmap_nsswitch.so*' | |
281 | inst_libdir_file 'libnfsidmap/*.so*' | |
282 | inst_libdir_file 'libnfsidmap*.so*' | |
283 | ||
284 | _nsslibs=$(sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' -- /etc/nsswitch.conf \ | |
285 | | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|') | |
286 | _nsslibs=${_nsslibs#|} | |
287 | _nsslibs=${_nsslibs%|} | |
288 | ||
289 | inst_libdir_file -n "$_nsslibs" 'libnss_*.so*' | |
290 | ||
291 | cp -a -- /etc/ld.so.conf* "$initdir"/etc | |
292 | ldconfig -r "$initdir" | |
293 | ) | |
294 | ||
295 | umount "$TESTDIR"/mnt | |
296 | rm -fr -- "$TESTDIR"/mnt | |
297 | ||
298 | # Make an overlay with needed tools for the test harness | |
299 | ( | |
300 | export initdir="$TESTDIR"/overlay | |
301 | . "$basedir"/dracut-init.sh | |
302 | inst_multiple poweroff shutdown | |
303 | inst_hook emergency 000 ./hard-off.sh | |
304 | inst_simple ./99-idesymlinks.rules /etc/udev/rules.d/99-idesymlinks.rules | |
305 | ) | |
306 | ||
307 | # Make server's dracut image | |
308 | $basedir/dracut.sh -l -i "$TESTDIR"/overlay / \ | |
309 | --no-early-microcode \ | |
310 | -m "udev-rules base rootfs-block fs-lib debug kernel-modules watchdog" \ | |
ca8f1c1b | 311 | -d "ipvlan macvlan af_packet piix ide-gd_mod ata_piix ext3 sd_mod nfsv2 nfsv3 nfsv4 nfs_acl nfs_layout_nfsv41_files nfsd e1000 i6300esb ib700wdt" \ |
4e669086 HH |
312 | --no-hostonly-cmdline -N \ |
313 | -f "$TESTDIR"/initramfs.server "$KVERSION" || return 1 | |
314 | ||
315 | # Make client's dracut image | |
316 | $basedir/dracut.sh -l -i "$TESTDIR"/overlay / \ | |
317 | --no-early-microcode \ | |
318 | -o "plymouth" \ | |
319 | -a "debug" \ | |
ca8f1c1b | 320 | -d "ipvlan macvlan af_packet piix sd_mod sr_mod ata_piix ide-gd_mod e1000 nfsv2 nfsv3 nfsv4 nfs_acl nfs_layout_nfsv41_files sunrpc i6300esb ib700wdt" \ |
4e669086 HH |
321 | --no-hostonly-cmdline -N \ |
322 | -f "$TESTDIR"/initramfs.testing "$KVERSION" || return 1 | |
323 | } | |
324 | ||
325 | kill_server() { | |
326 | if [[ -s "$TESTDIR"/server.pid ]]; then | |
327 | kill -TERM -- $(cat "$TESTDIR"/server.pid) | |
328 | rm -f -- "$TESTDIR"/server.pid | |
329 | fi | |
330 | } | |
331 | ||
332 | test_cleanup() { | |
333 | kill_server | |
334 | } | |
335 | ||
336 | . "$testdir"/test-functions |