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