]>
Commit | Line | Data |
---|---|---|
66a3d405 | 1 | #!/bin/bash |
a3f73298 | 2 | |
43c16bfa | 3 | [ -z "$USE_NETWORK" ] && USE_NETWORK="network-legacy" |
a3f73298 | 4 | |
f9f1314a | 5 | # shellcheck disable=SC2034 |
a3f73298 | 6 | TEST_DESCRIPTION="root filesystem over multiple iSCSI with $USE_NETWORK" |
66a3d405 HH |
7 | |
8 | KVERSION=${KVERSION-$(uname -r)} | |
9 | ||
66a3d405 | 10 | #DEBUGFAIL="rd.shell rd.break rd.debug loglevel=7 " |
66a3d405 HH |
11 | #SERVER_DEBUG="rd.debug loglevel=7" |
12 | #SERIAL="tcp:127.0.0.1:9999" | |
13 | ||
14 | run_server() { | |
15 | # Start server first | |
16 | echo "iSCSI TEST SETUP: Starting DHCP/iSCSI server" | |
17 | ||
8cd50230 HH |
18 | declare -a disk_args=() |
19 | declare -i disk_index=0 | |
20 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/server.img serverroot 1 | |
21 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/singleroot.img singleroot | |
22 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-1.img raid0-1 | |
23 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-2.img raid0-2 | |
24 | ||
b80ee080 | 25 | "$testdir"/run-qemu \ |
8cd50230 | 26 | "${disk_args[@]}" \ |
f9f1314a | 27 | -serial "${SERIAL:-"file:$TESTDIR/server.log"}" \ |
66a3d405 HH |
28 | -net nic,macaddr=52:54:00:12:34:56,model=e1000 \ |
29 | -net nic,macaddr=52:54:00:12:34:57,model=e1000 \ | |
ffbd37d7 | 30 | -net socket,listen=127.0.0.1:12331 \ |
006890a2 | 31 | -append "panic=1 oops=panic softlockup_panic=1 systemd.crash_reboot root=/dev/disk/by-id/ata-disk_serverroot rootfstype=ext4 rw console=ttyS0,115200n81 selinux=0 $SERVER_DEBUG" \ |
f9f1314a HH |
32 | -initrd "$TESTDIR"/initramfs.server \ |
33 | -pidfile "$TESTDIR"/server.pid -daemonize || return 1 | |
34 | chmod 644 "$TESTDIR"/server.pid || return 1 | |
66a3d405 HH |
35 | |
36 | # Cleanup the terminal if we have one | |
37 | tty -s && stty sane | |
38 | ||
3aae122c | 39 | if ! [[ $SERIAL ]]; then |
9a52c3fd | 40 | while :; do |
3aae122c | 41 | grep Serving "$TESTDIR"/server.log && break |
a3f73298 HH |
42 | echo "Waiting for the server to startup" |
43 | tail "$TESTDIR"/server.log | |
3aae122c HH |
44 | sleep 1 |
45 | done | |
46 | else | |
47 | echo Sleeping 10 seconds to give the server a head start | |
48 | sleep 10 | |
49 | fi | |
66a3d405 HH |
50 | } |
51 | ||
52 | run_client() { | |
9a52c3fd HH |
53 | local test_name=$1 |
54 | shift | |
66a3d405 HH |
55 | echo "CLIENT TEST START: $test_name" |
56 | ||
8cd50230 HH |
57 | dd if=/dev/zero of="$TESTDIR"/marker.img bs=1MiB count=1 |
58 | declare -a disk_args=() | |
59 | declare -i disk_index=0 | |
60 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/marker.img marker | |
66a3d405 | 61 | |
b80ee080 | 62 | "$testdir"/run-qemu \ |
8cd50230 | 63 | "${disk_args[@]}" \ |
66a3d405 HH |
64 | -net nic,macaddr=52:54:00:12:34:00,model=e1000 \ |
65 | -net nic,macaddr=52:54:00:12:34:01,model=e1000 \ | |
ffbd37d7 | 66 | -net socket,connect=127.0.0.1:12331 \ |
b2cf61d9 | 67 | -append "panic=1 oops=panic softlockup_panic=1 systemd.crash_reboot rw rd.auto rd.retry=50 console=ttyS0,115200n81 selinux=0 rd.debug=0 rd.shell=0 $DEBUGFAIL $*" \ |
f9f1314a | 68 | -initrd "$TESTDIR"/initramfs.testing |
8cd50230 | 69 | if ! grep -U --binary-files=binary -F -m 1 -q iscsi-OK "$TESTDIR"/marker.img; then |
2f78bafa HH |
70 | echo "CLIENT TEST END: $test_name [FAILED - BAD EXIT]" |
71 | return 1 | |
66a3d405 HH |
72 | fi |
73 | ||
74 | echo "CLIENT TEST END: $test_name [OK]" | |
75 | return 0 | |
76 | } | |
77 | ||
78 | do_test_run() { | |
79 | initiator=$(iscsi-iname) | |
80 | run_client "netroot=iscsi target1 target2" \ | |
9a52c3fd | 81 | "root=LABEL=sysroot" \ |
8cd50230 HH |
82 | "ip=192.168.50.101:::255.255.255.0::enp0s1:off" \ |
83 | "ip=192.168.51.101:::255.255.255.0::enp0s2:off" \ | |
9a52c3fd HH |
84 | "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \ |
85 | "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \ | |
86 | "rd.iscsi.initiator=$initiator" \ | |
66a3d405 HH |
87 | || return 1 |
88 | ||
28a68f1f | 89 | run_client "netroot=iscsi target1 target2 rd.iscsi.waitnet=0" \ |
9a52c3fd | 90 | "root=LABEL=sysroot" \ |
8cd50230 HH |
91 | "ip=192.168.50.101:::255.255.255.0::enp0s1:off" \ |
92 | "ip=192.168.51.101:::255.255.255.0::enp0s2:off" \ | |
9a52c3fd HH |
93 | "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \ |
94 | "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \ | |
95 | "rd.iscsi.firmware" \ | |
96 | "rd.iscsi.initiator=$initiator" \ | |
97 | "rd.iscsi.waitnet=0" \ | |
28a68f1f HH |
98 | || return 1 |
99 | ||
100 | run_client "netroot=iscsi target1 target2 rd.iscsi.waitnet=0 rd.iscsi.testroute=0" \ | |
9a52c3fd | 101 | "root=LABEL=sysroot" \ |
8cd50230 HH |
102 | "ip=192.168.50.101:::255.255.255.0::enp0s1:off" \ |
103 | "ip=192.168.51.101:::255.255.255.0::enp0s2:off" \ | |
9a52c3fd HH |
104 | "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \ |
105 | "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \ | |
106 | "rd.iscsi.firmware" \ | |
107 | "rd.iscsi.initiator=$initiator" \ | |
108 | "rd.iscsi.waitnet=0 rd.iscsi.testroute=0" \ | |
28a68f1f HH |
109 | || return 1 |
110 | ||
111 | run_client "netroot=iscsi target1 target2 rd.iscsi.waitnet=0 rd.iscsi.testroute=0 default GW" \ | |
9a52c3fd | 112 | "root=LABEL=sysroot" \ |
8cd50230 HH |
113 | "ip=192.168.50.101::192.168.50.1:255.255.255.0::enp0s1:off" \ |
114 | "ip=192.168.51.101::192.168.51.1:255.255.255.0::enp0s2:off" \ | |
9a52c3fd HH |
115 | "netroot=iscsi:192.168.51.1::::iqn.2009-06.dracut:target1" \ |
116 | "netroot=iscsi:192.168.50.1::::iqn.2009-06.dracut:target2" \ | |
117 | "rd.iscsi.firmware" \ | |
118 | "rd.iscsi.initiator=$initiator" \ | |
119 | "rd.iscsi.waitnet=0 rd.iscsi.testroute=0" \ | |
28a68f1f | 120 | || return 1 |
66a3d405 HH |
121 | |
122 | echo "All tests passed [OK]" | |
123 | return 0 | |
124 | } | |
125 | ||
126 | test_run() { | |
127 | if ! run_server; then | |
128 | echo "Failed to start server" 1>&2 | |
129 | return 1 | |
130 | fi | |
131 | do_test_run | |
132 | ret=$? | |
133 | if [[ -s $TESTDIR/server.pid ]]; then | |
f9f1314a HH |
134 | kill -TERM "$(cat "$TESTDIR"/server.pid)" |
135 | rm -f -- "$TESTDIR"/server.pid | |
66a3d405 HH |
136 | fi |
137 | return $ret | |
138 | } | |
139 | ||
1843c16c | 140 | test_check() { |
9a52c3fd | 141 | if ! command -v tgtd &> /dev/null || ! command -v tgtadm &> /dev/null; then |
66a3d405 HH |
142 | echo "Need tgtd and tgtadm from scsi-target-utils" |
143 | return 1 | |
144 | fi | |
1843c16c | 145 | } |
66a3d405 | 146 | |
1843c16c | 147 | test_setup() { |
66a3d405 HH |
148 | kernel=$KVERSION |
149 | # Create what will eventually be our root filesystem onto an overlay | |
f9f1314a | 150 | rm -rf -- "$TESTDIR"/overlay |
66a3d405 | 151 | ( |
f9f1314a | 152 | # shellcheck disable=SC2030 |
66a3d405 | 153 | export initdir=$TESTDIR/overlay/source |
f9f1314a HH |
154 | # shellcheck disable=SC1090 |
155 | . "$basedir"/dracut-init.sh | |
66a3d405 | 156 | ( |
f9f1314a | 157 | cd "$initdir" || exit |
66a3d405 HH |
158 | mkdir -p -- dev sys proc etc var/run tmp |
159 | mkdir -p root usr/bin usr/lib usr/lib64 usr/sbin | |
66a3d405 HH |
160 | mkdir -p -- var/lib/nfs/rpc_pipefs |
161 | ) | |
162 | inst_multiple sh shutdown poweroff stty cat ps ln ip \ | |
f9f1314a | 163 | mount dmesg mkdir cp ping grep setsid dd sync |
66a3d405 HH |
164 | for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do |
165 | [ -f ${_terminfodir}/l/linux ] && break | |
166 | done | |
167 | inst_multiple -o ${_terminfodir}/l/linux | |
168 | inst_simple /etc/os-release | |
f9f1314a HH |
169 | |
170 | inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh" | |
c08bc810 | 171 | inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh" |
f9f1314a HH |
172 | inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util" |
173 | ln -s dracut-util "${initdir}/usr/bin/dracut-getarg" | |
174 | ln -s dracut-util "${initdir}/usr/bin/dracut-getargs" | |
175 | ||
66a3d405 | 176 | inst ./client-init.sh /sbin/init |
f9f1314a | 177 | cp -a /etc/ld.so.conf* "$initdir"/etc |
4bd0ab61 | 178 | ldconfig -r "$initdir" |
66a3d405 HH |
179 | ) |
180 | ||
181 | # second, install the files needed to make the root filesystem | |
182 | ( | |
f9f1314a HH |
183 | # shellcheck disable=SC2031 |
184 | # shellcheck disable=SC2030 | |
66a3d405 | 185 | export initdir=$TESTDIR/overlay |
f9f1314a HH |
186 | # shellcheck disable=SC1090 |
187 | . "$basedir"/dracut-init.sh | |
006890a2 | 188 | inst_multiple sfdisk mkfs.ext4 poweroff cp umount setsid dd sync blockdev |
0f62da04 | 189 | inst_hook initqueue 01 ./create-client-root.sh |
66a3d405 | 190 | inst_hook initqueue/finished 01 ./finished-false.sh |
66a3d405 HH |
191 | ) |
192 | ||
193 | # create an initramfs that will create the target root filesystem. | |
194 | # We do it this way so that we do not risk trashing the host mdraid | |
195 | # devices, volume groups, encrypted partitions, etc. | |
f9f1314a | 196 | "$basedir"/dracut.sh -l -i "$TESTDIR"/overlay / \ |
1573bb81 | 197 | -m "dash crypt lvm mdraid kernel-modules qemu" \ |
006890a2 | 198 | -d "piix ide-gd_mod ata_piix ext4 sd_mod" \ |
9a52c3fd | 199 | --no-hostonly-cmdline -N \ |
f9f1314a HH |
200 | -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1 |
201 | rm -rf -- "$TESTDIR"/overlay | |
66a3d405 | 202 | |
8cd50230 HH |
203 | dd if=/dev/zero of="$TESTDIR"/marker.img bs=1MiB count=1 |
204 | dd if=/dev/zero of="$TESTDIR"/singleroot.img bs=1MiB count=200 | |
205 | dd if=/dev/zero of="$TESTDIR"/raid0-1.img bs=1MiB count=100 | |
206 | dd if=/dev/zero of="$TESTDIR"/raid0-2.img bs=1MiB count=100 | |
207 | ||
208 | declare -a disk_args=() | |
209 | declare -i disk_index=0 | |
210 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/marker.img marker | |
211 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/singleroot.img singleroot | |
212 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-1.img raid0-1 | |
213 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/raid0-2.img raid0-2 | |
214 | ||
66a3d405 | 215 | # Invoke KVM and/or QEMU to actually create the target filesystem. |
b80ee080 | 216 | "$testdir"/run-qemu \ |
8cd50230 | 217 | "${disk_args[@]}" \ |
006890a2 | 218 | -append "root=/dev/fakeroot rw rootfstype=ext4 quiet console=ttyS0,115200n81 selinux=0" \ |
f9f1314a | 219 | -initrd "$TESTDIR"/initramfs.makeroot || return 1 |
8cd50230 HH |
220 | grep -U --binary-files=binary -F -m 1 -q dracut-root-block-created "$TESTDIR"/marker.img || return 1 |
221 | rm -- "$TESTDIR"/marker.img | |
66a3d405 | 222 | |
909961d0 | 223 | # shellcheck disable=SC2031 |
f9f1314a HH |
224 | export kernel=$KVERSION |
225 | rm -rf -- "$TESTDIR"/overlay | |
66a3d405 | 226 | ( |
f9f1314a HH |
227 | mkdir -p "$TESTDIR"/overlay/source |
228 | # shellcheck disable=SC2031 | |
229 | # shellcheck disable=SC2030 | |
0f62da04 | 230 | export initdir=$TESTDIR/overlay/source |
f9f1314a HH |
231 | # shellcheck disable=SC1090 |
232 | . "$basedir"/dracut-init.sh | |
66a3d405 | 233 | ( |
f9f1314a | 234 | cd "$initdir" || exit |
66a3d405 HH |
235 | mkdir -p dev sys proc etc var/run tmp var/lib/dhcpd /etc/iscsi |
236 | ) | |
237 | inst /etc/passwd /etc/passwd | |
238 | inst_multiple sh ls shutdown poweroff stty cat ps ln ip \ | |
8b2afb08 HH |
239 | dmesg mkdir cp ping modprobe tcpdump setsid \ |
240 | sleep mount chmod pidof | |
66a3d405 HH |
241 | inst_multiple tgtd tgtadm |
242 | for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do | |
243 | [ -f ${_terminfodir}/l/linux ] && break | |
244 | done | |
245 | inst_multiple -o ${_terminfodir}/l/linux | |
8b2afb08 | 246 | instmods iscsi_tcp crc32c ipv6 af_packet |
66a3d405 | 247 | [ -f /etc/netconfig ] && inst_multiple /etc/netconfig |
9a52c3fd | 248 | type -P dhcpd > /dev/null && inst_multiple dhcpd |
66a3d405 HH |
249 | inst ./server-init.sh /sbin/init |
250 | inst ./hosts /etc/hosts | |
251 | inst ./dhcpd.conf /etc/dhcpd.conf | |
8b2afb08 HH |
252 | inst_multiple -o {,/usr}/etc/nsswitch.conf {,/usr}/etc/rpc \ |
253 | {,/usr}/etc/protocols {,/usr}/etc/services \ | |
254 | /etc/group /etc/os-release | |
255 | ||
256 | _nsslibs=$( | |
257 | cat "$dracutsysrootdir"/{,usr/}etc/nsswitch.conf 2> /dev/null \ | |
258 | | sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' \ | |
259 | | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|' | |
260 | ) | |
261 | _nsslibs=${_nsslibs#|} | |
262 | _nsslibs=${_nsslibs%|} | |
263 | ||
264 | inst_libdir_file -n "$_nsslibs" 'libnss_*.so*' | |
66a3d405 | 265 | |
f9f1314a | 266 | cp -a /etc/ld.so.conf* "$initdir"/etc |
4bd0ab61 | 267 | ldconfig -r "$initdir" |
66a3d405 HH |
268 | dracut_kernel_post |
269 | ) | |
8b2afb08 | 270 | |
0f62da04 HH |
271 | # second, install the files needed to make the root filesystem |
272 | ( | |
f9f1314a HH |
273 | # shellcheck disable=SC2031 |
274 | # shellcheck disable=SC2030 | |
0f62da04 | 275 | export initdir=$TESTDIR/overlay |
f9f1314a HH |
276 | # shellcheck disable=SC1090 |
277 | . "$basedir"/dracut-init.sh | |
006890a2 | 278 | inst_multiple sfdisk mkfs.ext4 poweroff cp umount sync dd |
0f62da04 HH |
279 | inst_hook initqueue 01 ./create-server-root.sh |
280 | inst_hook initqueue/finished 01 ./finished-false.sh | |
0f62da04 | 281 | ) |
66a3d405 | 282 | |
0f62da04 HH |
283 | # create an initramfs that will create the target root filesystem. |
284 | # We do it this way so that we do not risk trashing the host mdraid | |
285 | # devices, volume groups, encrypted partitions, etc. | |
f9f1314a | 286 | "$basedir"/dracut.sh -l -i "$TESTDIR"/overlay / \ |
1573bb81 | 287 | -m "dash rootfs-block kernel-modules qemu" \ |
006890a2 | 288 | -d "piix ide-gd_mod ata_piix ext4 sd_mod" \ |
9a52c3fd HH |
289 | --nomdadmconf \ |
290 | --no-hostonly-cmdline -N \ | |
f9f1314a | 291 | -f "$TESTDIR"/initramfs.makeroot "$KVERSION" || return 1 |
b80ee080 | 292 | rm -rf -- "$TESTDIR"/overlay |
a3f73298 | 293 | |
8cd50230 | 294 | dd if=/dev/zero of="$TESTDIR"/server.img bs=1MiB count=60 |
b80ee080 | 295 | dd if=/dev/zero of="$TESTDIR"/marker.img bs=1MiB count=1 |
8cd50230 HH |
296 | declare -a disk_args=() |
297 | # shellcheck disable=SC2034 | |
298 | declare -i disk_index=0 | |
299 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/marker.img marker | |
300 | qemu_add_drive_args disk_index disk_args "$TESTDIR"/server.img root | |
301 | ||
0f62da04 | 302 | # Invoke KVM and/or QEMU to actually create the target filesystem. |
b80ee080 | 303 | "$testdir"/run-qemu \ |
8cd50230 | 304 | "${disk_args[@]}" \ |
006890a2 | 305 | -append "root=/dev/dracut/root rw rootfstype=ext4 quiet console=ttyS0,115200n81 selinux=0" \ |
f9f1314a | 306 | -initrd "$TESTDIR"/initramfs.makeroot || return 1 |
8cd50230 HH |
307 | grep -U --binary-files=binary -F -m 1 -q dracut-root-block-created "$TESTDIR"/marker.img || return 1 |
308 | rm -- "$TESTDIR"/marker.img | |
0f62da04 HH |
309 | |
310 | # Make an overlay with needed tools for the test harness | |
a3f73298 | 311 | ( |
f9f1314a | 312 | # shellcheck disable=SC2031 |
8b2afb08 | 313 | # shellcheck disable=SC2030 |
a3f73298 | 314 | export initdir=$TESTDIR/overlay |
f9f1314a HH |
315 | # shellcheck disable=SC1090 |
316 | . "$basedir"/dracut-init.sh | |
a3f73298 HH |
317 | inst_multiple poweroff shutdown |
318 | inst_hook shutdown-emergency 000 ./hard-off.sh | |
319 | inst_hook emergency 000 ./hard-off.sh | |
8b2afb08 | 320 | inst_simple ./client.link /etc/systemd/network/01-client.link |
a3f73298 | 321 | ) |
0f62da04 | 322 | # Make client's dracut image |
f9f1314a | 323 | "$basedir"/dracut.sh -l -i "$TESTDIR"/overlay / \ |
1586621b | 324 | -o "plymouth dmraid nfs" \ |
9a52c3fd | 325 | -a "debug ${USE_NETWORK}" \ |
9a52c3fd | 326 | --no-hostonly-cmdline -N \ |
f9f1314a | 327 | -f "$TESTDIR"/initramfs.testing "$KVERSION" || return 1 |
a3f73298 | 328 | |
8b2afb08 HH |
329 | ( |
330 | # shellcheck disable=SC2031 | |
331 | export initdir="$TESTDIR"/overlay | |
332 | # shellcheck disable=SC1090 | |
333 | . "$basedir"/dracut-init.sh | |
334 | rm "$initdir"/etc/systemd/network/01-client.link | |
335 | inst_simple ./server.link /etc/systemd/network/01-server.link | |
336 | inst_hook pre-mount 99 ./wait-if-server.sh | |
337 | ) | |
338 | # Make server's dracut image | |
339 | "$basedir"/dracut.sh -l -i "$TESTDIR"/overlay / \ | |
1573bb81 | 340 | -a "dash rootfs-block debug kernel-modules network network-legacy" \ |
006890a2 | 341 | -d "af_packet piix ide-gd_mod ata_piix ext4 sd_mod e1000 drbg" \ |
8b2afb08 HH |
342 | --no-hostonly-cmdline -N \ |
343 | -f "$TESTDIR"/initramfs.server "$KVERSION" || return 1 | |
344 | ||
f9f1314a | 345 | rm -rf -- "$TESTDIR"/overlay |
66a3d405 HH |
346 | } |
347 | ||
348 | test_cleanup() { | |
349 | if [[ -s $TESTDIR/server.pid ]]; then | |
f9f1314a HH |
350 | kill -TERM "$(cat "$TESTDIR"/server.pid)" |
351 | rm -f -- "$TESTDIR"/server.pid | |
66a3d405 HH |
352 | fi |
353 | } | |
354 | ||
f9f1314a HH |
355 | # shellcheck disable=SC1090 |
356 | . "$testdir"/test-functions |