]>
Commit | Line | Data |
---|---|---|
ac4ded91 | 1 | #!/bin/sh |
cc02093d HH |
2 | # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- |
3 | # ex: ts=8 sw=4 sts=4 et filetype=sh | |
580bb541 PS |
4 | # |
5 | # This implementation is incomplete: Discovery mode is not implemented and | |
6 | # the argument handling doesn't follow currently agreed formats. This is mainly | |
3b403b32 | 7 | # because rfc4173 does not say anything about iscsi_initiator but open-iscsi's |
580bb541 PS |
8 | # iscsistart needs this. |
9 | # | |
ac4ded91 | 10 | |
c9f1e3d1 | 11 | type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh |
ac4ded91 | 12 | |
fb59f4c9 | 13 | PATH=/usr/sbin:/usr/bin:/sbin:/bin |
ac4ded91 | 14 | |
268de90f PS |
15 | # Huh? Empty $1? |
16 | [ -z "$1" ] && exit 1 | |
17 | ||
18 | # Huh? Empty $2? | |
19 | [ -z "$2" ] && exit 1 | |
20 | ||
3b403b32 | 21 | # Huh? Empty $3? This isn't really necessary, since NEWROOT isn't |
268de90f PS |
22 | # used here. But let's be consistent |
23 | [ -z "$3" ] && exit 1 | |
24 | ||
ac4ded91 HH |
25 | # root is in the form root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname> |
26 | netif="$1" | |
9babe97e | 27 | iroot="$2" |
ac4ded91 | 28 | |
0375106c | 29 | source_all /etc/conf.d |
580bb541 | 30 | |
50e7ff76 | 31 | # If it's not iscsi we don't continue |
9babe97e HH |
32 | [ "${iroot%%:*}" = "iscsi" ] || exit 1 |
33 | ||
34 | iroot=${iroot#iscsi:} | |
50e7ff76 PS |
35 | |
36 | # XXX modprobe crc32c should go in the cmdline parser, but I haven't yet | |
37 | # figured out a way how to check whether this is built-in or not | |
169f1671 | 38 | modprobe crc32c 2>/dev/null |
580bb541 | 39 | |
3fa9d4d7 HH |
40 | [ -e /sys/module/bnx2i ] && iscsiuio |
41 | ||
b43f4df5 | 42 | if getargbool 0 rd.iscsi.firmware -y iscsi_firmware ; then |
a3f4e770 HH |
43 | if [ -n "${root%%block:*}" ]; then |
44 | # if root is not specified try to mount the whole iSCSI LUN | |
cc02093d | 45 | printf 'ENV{DEVTYPE}!="partition", SYMLINK=="disk/by-path/*-iscsi-*-*", SYMLINK+="root"\n' >> /etc/udev/rules.d/99-iscsi-root.rules |
2a3faa2d | 46 | udevadm control --reload |
a3f4e770 HH |
47 | fi |
48 | iscsistart -b | |
49 | exit 0 | |
580bb541 PS |
50 | fi |
51 | ||
43f21852 HH |
52 | unset iscsi_initiator iscsi_target_name iscsi_target_ip iscsi_target_port |
53 | unset iscsi_target_group iscsi_protocol iscsirw iscsi_lun | |
2c031721 | 54 | unset iscsi_username iscsi_password |
43f21852 HH |
55 | unset iscsi_in_username iscsi_in_password |
56 | ||
580bb541 | 57 | # override conf settings by command line options |
b43f4df5 | 58 | arg=$(getargs rd.iscsi.initiator iscsi_initiator=) |
580bb541 | 59 | [ -n "$arg" ] && iscsi_initiator=$arg |
b43f4df5 | 60 | arg=$(getargs rd.iscsi.target.name iscsi_target_name=) |
580bb541 | 61 | [ -n "$arg" ] && iscsi_target_name=$arg |
b43f4df5 | 62 | arg=$(getargs rd.iscsi.target.ip iscsi_target_ip) |
580bb541 | 63 | [ -n "$arg" ] && iscsi_target_ip=$arg |
b43f4df5 | 64 | arg=$(getargs rd.iscsi.target.port iscsi_target_port=) |
580bb541 | 65 | [ -n "$arg" ] && iscsi_target_port=$arg |
b43f4df5 | 66 | arg=$(getargs rd.iscsi.target.group iscsi_target_group=) |
580bb541 | 67 | [ -n "$arg" ] && iscsi_target_group=$arg |
b43f4df5 | 68 | arg=$(getargs rd.iscsi.username iscsi_username=) |
580bb541 | 69 | [ -n "$arg" ] && iscsi_username=$arg |
b43f4df5 | 70 | arg=$(getargs rd.iscsi.password iscsi_password) |
580bb541 | 71 | [ -n "$arg" ] && iscsi_password=$arg |
b43f4df5 | 72 | arg=$(getargs rd.iscsi.in.username iscsi_in_username=) |
580bb541 | 73 | [ -n "$arg" ] && iscsi_in_username=$arg |
b43f4df5 | 74 | arg=$(getargs rd.iscsi.in.password iscsi_in_password=) |
580bb541 | 75 | [ -n "$arg" ] && iscsi_in_password=$arg |
ac4ded91 | 76 | |
3b403b32 | 77 | handle_netroot() |
169f1671 HH |
78 | { |
79 | iroot=$1 | |
80 | # override conf/commandline options by dhcp root_path | |
81 | # FIXME this assumes that all values have been provided | |
82 | OLDIFS="$IFS" | |
83 | IFS=@ | |
84 | set $iroot | |
85 | if [ $# -gt 1 ]; then | |
3b403b32 | 86 | authinfo=$1; shift |
cc02093d | 87 | iroot=$* |
766968bb HG |
88 | # allow empty authinfo to allow having an @ in iscsi_target_name like this: |
89 | # netroot=iscsi:@192.168.1.100::3260::iqn.2009-01.com.example:testdi@sk | |
cc02093d | 90 | if [ -n "$authinfo" ]; then |
169f1671 HH |
91 | IFS=: |
92 | set $authinfo | |
93 | iscsi_username=$1 | |
94 | iscsi_password=$2 | |
95 | if [ $# -gt 2 ]; then | |
cc02093d HH |
96 | iscsi_in_username=$3 |
97 | iscsi_in_password=$4 | |
169f1671 | 98 | fi |
cc02093d | 99 | fi |
3b403b32 | 100 | fi |
169f1671 HH |
101 | |
102 | IFS="$OLDIFS" | |
103 | ||
104 | local v=${iroot}: | |
105 | local i | |
3b403b32 | 106 | set -- |
169f1671 | 107 | while [ -n "$v" ]; do |
cc02093d HH |
108 | if [ "${v#\[*:*:*\]:}" != "$v" ]; then |
109 | # handle IPv6 address | |
110 | i="${v%%\]:*}" | |
111 | i="${i##\[}" | |
112 | set -- "$@" "$i" | |
113 | v=${v#\[$i\]:} | |
3b403b32 | 114 | else |
cc02093d HH |
115 | set -- "$@" "${v%%:*}" |
116 | v=${v#*:} | |
117 | fi | |
169f1671 HH |
118 | done |
119 | iscsi_target_ip=$1; shift | |
120 | iscsi_protocol=$1; shift # ignored | |
121 | iscsi_target_port=$1; shift | |
122 | iscsi_lun=$1; shift | |
123 | IFS=: | |
124 | iscsi_target_name=$* | |
125 | IFS="$OLDIFS" | |
580bb541 | 126 | # XXX is this needed? |
169f1671 HH |
127 | getarg ro && iscsirw=ro |
128 | getarg rw && iscsirw=rw | |
129 | fsopts=${fsopts+$fsopts,}${iscsirw} | |
580bb541 | 130 | |
169f1671 | 131 | if [ -z $iscsi_initiator ]; then |
580bb541 | 132 | # XXX Where are these from? |
cc02093d HH |
133 | [ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi |
134 | [ -f /etc/iscsi/initiatorname.iscsi ] && . /etc/iscsi/initiatorname.iscsi | |
135 | iscsi_initiator=$InitiatorName | |
580bb541 PS |
136 | |
137 | # XXX rfc3720 says 'SCSI Initiator Name: The iSCSI Initiator Name specifies | |
138 | # the worldwide unique name of the initiator.' Could we use hostname/ip | |
139 | # if missing? | |
169f1671 | 140 | fi |
580bb541 | 141 | |
50acb197 HH |
142 | if [ -z $iscsi_initiator ]; then |
143 | if [ -f /sys/firmware/ibft/initiator/initiator-name ]; then | |
144 | iscsi_initiator=$(while read line; do echo $line;done < /sys/firmware/ibft/initiator-name) | |
145 | fi | |
146 | fi | |
147 | ||
169f1671 | 148 | if [ -z $iscsi_target_port ]; then |
cc02093d | 149 | iscsi_target_port=3260 |
169f1671 | 150 | fi |
580bb541 | 151 | |
169f1671 | 152 | if [ -z $iscsi_target_group ]; then |
cc02093d | 153 | iscsi_target_group=1 |
169f1671 | 154 | fi |
ac4ded91 | 155 | |
169f1671 | 156 | if [ -z $iscsi_initiator ]; then |
580bb541 | 157 | # XXX is this correct? |
cc02093d | 158 | iscsi_initiator=$(iscsi-iname) |
169f1671 | 159 | fi |
580bb541 | 160 | |
169f1671 | 161 | if [ -z $iscsi_lun ]; then |
cc02093d | 162 | iscsi_lun=0 |
169f1671 | 163 | fi |
4ce19918 | 164 | |
19f3a804 HH |
165 | echo "InitiatorName='$iscsi_initiator'" > /run/initiatorname.iscsi |
166 | ln -s /run/initiatorname.iscsi /dev/.initiatorname.iscsi | |
580bb541 | 167 | |
4ce19918 | 168 | # FIXME $iscsi_protocol?? |
580bb541 | 169 | |
169f1671 | 170 | if [ -n "${root%%block:*}" ]; then |
c094baa0 | 171 | # if root is not specified try to mount the whole iSCSI LUN |
cc02093d | 172 | printf 'SYMLINK=="disk/by-path/*-iscsi-*-%s", SYMLINK+="root"\n' $iscsi_lun >> /etc/udev/rules.d/99-iscsi-root.rules |
169f1671 | 173 | fi |
064b6ea9 | 174 | |
169f1671 | 175 | # inject new exit_if_exists |
0b53ca70 | 176 | echo 'settle_exit_if_exists="--exit-if-exists=/dev/root"; rm "$job"' > $hookdir/initqueue/iscsi-settle.sh |
a52586e8 | 177 | |
169f1671 | 178 | # force udevsettle to break |
0b53ca70 | 179 | > $hookdir/initqueue/work |
a52586e8 | 180 | |
cc02093d HH |
181 | iscsistart -i $iscsi_initiator -t $iscsi_target_name \ |
182 | -g $iscsi_target_group -a $iscsi_target_ip \ | |
183 | -p $iscsi_target_port \ | |
184 | ${iscsi_username+-u $iscsi_username} \ | |
185 | ${iscsi_password+-w $iscsi_password} \ | |
186 | ${iscsi_in_username+-U $iscsi_in_username} \ | |
187 | ${iscsi_in_password+-W $iscsi_in_password} || : | |
580bb541 | 188 | |
c094baa0 | 189 | # install mount script |
169f1671 | 190 | if [ -n "${root%%block:*}" ]; then |
c094baa0 | 191 | # if root is not specified try to mount the whole iSCSI LUN |
0b53ca70 | 192 | echo "iscsi_lun=$iscsi_lun . /bin/mount-lun.sh " > $hookdir/mount/01-$$-iscsi.sh |
169f1671 HH |
193 | fi |
194 | } | |
195 | ||
196 | # loop over all netroot parameter | |
3b403b32 HH |
197 | if getarg netroot; then |
198 | for nroot in $(getargs netroot); do | |
169f1671 | 199 | [ "${netroot%%:*}" = "iscsi" ] || continue |
cc02093d | 200 | handle_netroot ${nroot##iscsi:} |
169f1671 HH |
201 | done |
202 | else | |
203 | handle_netroot $iroot | |
c094baa0 HH |
204 | fi |
205 | ||
fb67e4aa HH |
206 | need_shutdown |
207 | ||
580bb541 PS |
208 | # now we have a root filesystem somewhere in /dev/sda* |
209 | # let the normal block handler handle root= | |
ac4ded91 | 210 | exit 0 |