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