check() {
local _rootdev
# If our prerequisites are not met, fail anyways.
- require_binaries iscsistart hostname iscsi-iname || return 1
+ require_binaries iscsi-iname iscsiadm iscsid || return 1
# If hostonly was requested, fail the check if we are not actually
# booting from root.
- is_iscsi() {
- local _dev=$1
-
- [[ -L "/sys/dev/block/$_dev" ]] || return
- cd "$(readlink -f "/sys/dev/block/$_dev")"
- until [[ -d sys || -d iscsi_session ]]; do
- cd ..
- done
- [[ -d iscsi_session ]]
- }
-
[[ $hostonly ]] || [[ $mount_needs ]] && {
pushd . >/dev/null
- for_each_host_dev_and_slaves is_iscsi || return 255
+ for_each_host_dev_and_slaves block_is_iscsi
+ local _is_iscsi=$?
popd >/dev/null
+ [[ $_is_iscsi == 0 ]] || return 255
}
return 0
}
fi
if [ -d ${d}/initiator ] ; then
if [ ${d##*/} = "ibft" ] && [ "$ibft_mod" != "bnx2i" ] ; then
- echo -n "ip=ibft "
+ echo -n "rd.iscsi.ibft=1 "
fi
- echo -n "rd.iscsi.firmware=1"
+ echo -n "rd.iscsi.firmware=1 "
fi
done
}
install_iscsiroot() {
local devpath=$1
- local scsi_path iscsi_lun session c d conn
+ local scsi_path iscsi_lun session c d conn host flash
local iscsi_session iscsi_address iscsi_port iscsi_targetname iscsi_tpgt
+ local bootproto
scsi_path=${devpath%%/block*}
[ "$scsi_path" = "$devpath" ] && return 1
[ "$session" = "$devpath" ] && return 1
iscsi_session=${session##*/}
[ "$iscsi_session" = "$session" ] && return 1
+ host=${session%%/session*}
+ [ "$host" = "$session" ] && return 1
+ iscsi_host=${host##*/}
+
+ for flash in ${host}/flashnode_sess-* ; do
+ [ -f "$flash" ] || continue
+ [ ! -e "$flash/is_boot_target" ] && continue
+ is_boot=$(cat $flash/is_boot_target)
+ if [ $is_boot -eq 1 ] ; then
+ # qla4xxx flashnode session; skip iBFT discovery
+ iscsi_initiator=$(cat /sys/class/iscsi_host/${iscsi_host}/initiatorname)
+ echo "rd.iscsi.initiator=${iscsi_initiator}"
+ return;
+ fi
+ done
for d in ${session}/* ; do
case $d in
done
[ -z "$iscsi_address" ] && return
- local_address=$(ip -o route get to $iscsi_address | sed -n 's/.*src \([0-9a-f.:]*\).*/\1/p')
- ifname=$(ip -o route get to $iscsi_address | sed -n 's/.*dev \([^ ]*\).*/\1/p')
- printf 'ip=%s:static ' ${ifname}
-
- if [ -e /sys/class/net/$ifname/address ] ; then
- ifmac=$(cat /sys/class/net/$ifname/address)
- printf 'ifname=%s:%s ' ${ifname} ${ifmac}
- fi
+ ip_params_for_remote_addr "$iscsi_address"
if [ -n "$iscsi_address" -a -n "$iscsi_targetname" ] ; then
if [ -n "$iscsi_port" -a "$iscsi_port" -eq 3260 ] ; then
# can sort out rd.iscsi.initiator= duplicates
echo "rd.iscsi.initiator=${iscsi_initiator}"
echo "netroot=iscsi:${iscsi_address}::${iscsi_port}:${iscsi_lun}:${iscsi_targetname}"
+ echo "rd.neednet=1"
fi
return 0
}
# called by dracut
installkernel() {
- local _arch=$(uname -m)
+ local _arch=${DRACUT_ARCH:-$(uname -m)}
+ local _funcs='iscsi_register_transport'
- instmods bnx2i qla4xxx cxgb3i cxgb4i be2iscsi
+ instmods bnx2i qla4xxx cxgb3i cxgb4i be2iscsi qedi
hostonly="" instmods iscsi_tcp iscsi_ibft crc32c iscsi_boot_sysfs
- iscsi_module_filter() {
- local _funcs='iscsi_register_transport'
- # subfunctions inherit following FDs
- local _merge=8 _side2=9
- function bmf1() {
- local _f
- while read _f || [ -n "$_f" ]; do
- case "$_f" in
- *.ko) [[ $(< $_f) =~ $_funcs ]] && echo "$_f" ;;
- *.ko.gz) [[ $(gzip -dc <$_f) =~ $_funcs ]] && echo "$_f" ;;
- *.ko.xz) [[ $(xz -dc <$_f) =~ $_funcs ]] && echo "$_f" ;;
- esac
- done
- return 0
- }
-
- function rotor() {
- local _f1 _f2
- while read _f1 || [ -n "$_f1" ]; do
- echo "$_f1"
- if read _f2; then
- echo "$_f2" 1>&${_side2}
- fi
- done | bmf1 1>&${_merge}
- return 0
- }
- # Use two parallel streams to filter alternating modules.
- set +x
- eval "( ( rotor ) ${_side2}>&1 | bmf1 ) ${_merge}>&1"
- [[ $debug ]] && set -x
- return 0
- }
- { find_kernel_modules_by_path drivers/scsi; if [ "$_arch" = "s390" -o "$_arch" = "s390x" ]; then find_kernel_modules_by_path drivers/s390/scsi; fi;} \
- | iscsi_module_filter | instmods
+ if [ "$_arch" = "s390" -o "$_arch" = "s390x" ]; then
+ _s390drivers="=drivers/s390/scsi"
+ fi
+
+ dracut_instmods -o -s ${_funcs} =drivers/scsi ${_s390drivers:+"$_s390drivers"}
}
# called by dracut
# called by dracut
install() {
- inst_multiple umount iscsistart hostname iscsi-iname
inst_multiple -o iscsiuio
inst_libdir_file 'libgcc_s.so*'
+ inst_multiple umount iscsi-iname iscsiadm iscsid
+
+ inst_multiple -o \
+ $systemdsystemunitdir/iscsid.socket \
+ $systemdsystemunitdir/iscsid.service \
+ $systemdsystemunitdir/iscsiuio.service \
+ $systemdsystemunitdir/iscsiuio.socket \
+ $systemdsystemunitdir/sockets.target.wants/iscsid.socket \
+ $systemdsystemunitdir/sockets.target.wants/iscsiuio.socket
+
+ if [[ $hostonly ]]; then
+ inst_dir /etc/iscsi
+ inst_multiple $(find /etc/iscsi -type f)
+ else
+ inst_simple /etc/iscsi/iscsid.conf
+ fi
# Detect iBFT and perform mandatory steps
if [[ $hostonly_cmdline == "yes" ]] ; then
inst_hook cmdline 90 "$moddir/parse-iscsiroot.sh"
inst_hook cleanup 90 "$moddir/cleanup-iscsi.sh"
inst "$moddir/iscsiroot.sh" "/sbin/iscsiroot"
+
if ! dracut_module_included "systemd"; then
inst "$moddir/mount-lun.sh" "/bin/mount-lun.sh"
else
$systemdsystemunitdir/iscsiuio.socket \
iscsiadm iscsid
- mkdir -p "${initdir}/$systemdsystemunitdir/sockets.target.wants"
for i in \
+ iscsid.socket \
iscsiuio.socket \
; do
- ln_r "$systemdsystemunitdir/${i}" "$systemdsystemunitdir/sockets.target.wants/${i}"
+ $SYSTEMCTL -q --root "$initdir" enable "$i"
done
-
- mkdir -p "${initdir}/$systemdsystemunitdir/basic.target.wants"
+
for i in \
iscsid.service \
+ iscsiuio.service \
; do
- ln_r "$systemdsystemunitdir/${i}" "$systemdsystemunitdir/basic.target.wants/${i}"
+ $SYSTEMCTL -q --root "$initdir" add-wants basic.target "$i"
done
# Make sure iscsid is started after dracut-cmdline and ready for the initqueue
echo "After=dracut-cmdline.service"
echo "Before=dracut-initqueue.service"
) > "${initdir}/$systemdsystemunitdir/iscsid.service.d/dracut.conf"
- fi
+ # The iscsi deamon does not need to wait for any storage inside initrd
+ mkdir -p "${initdir}/$systemdsystemunitdir/iscsid.socket.d"
+ (
+ echo "[Unit]"
+ echo "DefaultDependencies=no"
+ echo "Conflicts=shutdown.target"
+ echo "Before=shutdown.target sockets.target"
+ ) > "${initdir}/$systemdsystemunitdir/iscsid.socket.d/dracut.conf"
+ mkdir -p "${initdir}/$systemdsystemunitdir/iscsiuio.socket.d"
+ (
+ echo "[Unit]"
+ echo "DefaultDependencies=no"
+ echo "Conflicts=shutdown.target"
+ echo "Before=shutdown.target sockets.target"
+ ) > "${initdir}/$systemdsystemunitdir/iscsiuio.socket.d/dracut.conf"
+
+ fi
+ inst_dir /var/lib/iscsi
dracut_need_initqueue
}