]>
Commit | Line | Data |
---|---|---|
70787ab6 LR |
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 | |
17 | ||
18 | $testdir/run-qemu \ | |
19 | -hda "$TESTDIR"/server.ext3 \ | |
20 | -m 512M -smp 2 \ | |
21 | -display none \ | |
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 \ | |
30 | ${SERIAL:+-serial "$SERIAL"} \ | |
31 | ${SERIAL:--serial file:"$TESTDIR"/server.log} \ | |
32 | -watchdog i6300esb -watchdog-action poweroff \ | |
33 | -no-reboot \ | |
34 | -append "panic=1 loglevel=7 root=/dev/sda rootfstype=ext3 rw console=ttyS0,115200n81 selinux=0 rd.debug" \ | |
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 | |
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 | |
69 | ||
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 \ | |
82 | -append "panic=1 $cmdline rd.debug $DEBUGFAIL rd.retry=5 rw console=ttyS0,115200n81 selinux=0 init=/sbin/init" \ | |
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 \ | |
98 | -append "panic=1 $cmdline rd.debug $DEBUGFAIL rd.retry=5 rw console=ttyS0,115200n81 selinux=0 init=/sbin/init" \ | |
99 | -initrd "$TESTDIR"/initramfs.testing | |
100 | fi | |
101 | ||
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 | ||
115 | if [[ "$check" != "$CONF" ]]; then | |
116 | echo "Expected: '$check'" | |
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 | " | |
141 | vlan=vlan0001:ens5 | |
142 | vlan=vlan2:ens5 | |
143 | vlan=ens5.3:ens5 | |
144 | vlan=ens5.0004:ens5 | |
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 | |
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 | |
150 | rd.neednet=1 | |
151 | root=nfs:192.168.50.1:/nfs/client bootdev=ens3 | |
152 | " \ | |
153 | 'ens3 ens5.0004 ens5.3 vlan0001 vlan2 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens3 # Generated by dracut initrd NAME="ens3" DEVICE="ens3" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Ethernet /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens5.0004 # Generated by dracut initrd NAME="ens5.0004" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.57.104" PREFIX="24" GATEWAY="192.168.57.1" TYPE=Vlan DEVICE="ens5.0004" VLAN=yes PHYSDEV="ens5" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens5.3 # Generated by dracut initrd NAME="ens5.3" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.56.103" PREFIX="24" GATEWAY="192.168.56.1" TYPE=Vlan DEVICE="ens5.3" VLAN=yes PHYSDEV="ens5" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-vlan0001 # Generated by dracut initrd NAME="vlan0001" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.54.101" PREFIX="24" GATEWAY="192.168.54.1" TYPE=Vlan DEVICE="vlan0001" VLAN=yes PHYSDEV="ens5" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-vlan2 # Generated by dracut initrd NAME="vlan2" ONBOOT=yes NETBOOT=yes BOOTPROTO=none IPADDR="192.168.55.102" PREFIX="24" GATEWAY="192.168.55.1" TYPE=Vlan DEVICE="vlan2" VLAN=yes PHYSDEV="ens5" EOF ' \ | |
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 | " \ | |
166 | 'bond0 bond1 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-bond0 # Generated by dracut initrd NAME="bond0" DEVICE="bond0" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp BONDING_OPTS="" NAME="bond0" TYPE=Bond /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-bond1 # Generated by dracut initrd NAME="bond1" DEVICE="bond1" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp BONDING_OPTS="" NAME="bond1" TYPE=Bond /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens4 # Generated by dracut initrd NAME="ens4" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond0" DEVICE="ens4" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens5 # Generated by dracut initrd NAME="ens5" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond0" DEVICE="ens5" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens6 # Generated by dracut initrd NAME="ens6" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond1" DEVICE="ens6" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens7 # Generated by dracut initrd NAME="ens7" TYPE=Ethernet ONBOOT=yes NETBOOT=yes SLAVE=yes MASTER="bond1" DEVICE="ens7" EOF ' \ | |
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 | " \ | |
179 | 'br0 br1 /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-br0 # Generated by dracut initrd NAME="br0" DEVICE="br0" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Bridge NAME="br0" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-br1 # Generated by dracut initrd NAME="br1" DEVICE="br1" ONBOOT=yes NETBOOT=yes IPV6INIT=yes BOOTPROTO=dhcp TYPE=Bridge NAME="br1" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens4 # Generated by dracut initrd NAME="ens4" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br0" DEVICE="ens4" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens5 # Generated by dracut initrd NAME="ens5" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br0" DEVICE="ens5" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens6 # Generated by dracut initrd NAME="ens6" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br1" DEVICE="ens6" /run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-ens7 # Generated by dracut initrd NAME="ens7" TYPE=Ethernet ONBOOT=yes NETBOOT=yes BRIDGE="br1" DEVICE="ens7" EOF ' \ | |
180 | || return 1 | |
181 | ||
182 | kill_server | |
183 | return 0 | |
184 | } | |
185 | ||
186 | test_setup() { | |
187 | # Make server root | |
188 | dd if=/dev/null of="$TESTDIR"/server.ext3 bs=1M seek=120 | |
189 | mke2fs -j -F -- "$TESTDIR"/server.ext3 | |
190 | mkdir -- "$TESTDIR"/mnt | |
191 | mount -o loop -- "$TESTDIR"/server.ext3 "$TESTDIR"/mnt | |
192 | kernel=$KVERSION | |
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 | |
228 | instmods nfsd sunrpc ipv6 lockd af_packet 8021q ipvlan macvlan | |
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 \ | |
263 | mount dmesg mkdir cp ping grep ls sort | |
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 | |
f3f081e5 | 305 | inst_simple ./99-default.link /etc/systemd/network/99-default.link |
70787ab6 LR |
306 | ) |
307 | ||
308 | # Make server's dracut image | |
309 | $basedir/dracut.sh -l -i "$TESTDIR"/overlay / \ | |
310 | --no-early-microcode \ | |
311 | -m "udev-rules base rootfs-block fs-lib debug kernel-modules watchdog" \ | |
312 | -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" \ | |
313 | --no-hostonly-cmdline -N \ | |
314 | -f "$TESTDIR"/initramfs.server "$KVERSION" || return 1 | |
315 | ||
316 | # Make client's dracut image | |
317 | $basedir/dracut.sh -l -i "$TESTDIR"/overlay / \ | |
318 | --no-early-microcode \ | |
319 | -o "plymouth" \ | |
2b1b3bcd | 320 | -a "debug network-legacy" \ |
70787ab6 LR |
321 | -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" \ |
322 | --no-hostonly-cmdline -N \ | |
323 | -f "$TESTDIR"/initramfs.testing "$KVERSION" || return 1 | |
324 | } | |
325 | ||
326 | kill_server() { | |
327 | if [[ -s "$TESTDIR"/server.pid ]]; then | |
328 | kill -TERM -- $(cat "$TESTDIR"/server.pid) | |
329 | rm -f -- "$TESTDIR"/server.pid | |
330 | fi | |
331 | } | |
332 | ||
333 | test_cleanup() { | |
334 | kill_server | |
335 | } | |
336 | ||
337 | . "$testdir"/test-functions |