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