====== Debian etch ====== ===== Preparing an existing installation for iSCSI ===== This howto is based on the following assumptions: * a base debian etch with all the security updates * the system is installed on a single partition "/" on /dev/sda1 * there is an already done iscsi target on an iscsi server * there is a working dhcp server ==== Compile iscsistart and fwparam_ibft ==== Since two fundamental tools from open-iscsi are not included in the debian package, they have to be compiled from the sources with the following steps (i have used a different machine for all the compilation stuff). Install the appropriate devel packages: apt-get build-dep open-iscsi apt-get install libdb4.3-dev Download the sources and compile them: wget http://www.open-iscsi.org/bits/open-iscsi-2.0-865.13.tar.gz (this is the latest tarball at this time) tar xzf open-iscsi-2.0-865.13.tar.gz cd open-iscsi-2.0-865.13 make -C usr make -C utils/fwparam_ibft The two files needed are ''usr/iscsistart'' and ''utils/fwparam_ibft/fwparam_ibft'' so they have to be copied in ''/usr/sbin''. ==== Install the needed packages ==== apt-get install iproute ==== Disable networking scripts ==== The file ''/etc/network/interfaces'' must contain only the information needed to setup the loopback adapter or some additional network cards not used in the iSCSI boot process. If you have only one interface (in example eth0), be sure to have a stanza like this in ''/etc/network/interfaces'' auto eth0 iface eth0 inet manual So ifupdown will report the network card as "up", otherwise some script will not work well (in exemple the nfs mount). ==== Create the initramfs scripts ==== Create two scripts shown below. These scripts have to be executable. * ''/etc/initramfs-tools/hooks/iscsi_tcp'' will copy the ''iscsi_tcp'', ''ib_iser'' kernel modules followed by their dependancies, ''/usr/sbin/iscsistart'' and ''/usr/sbin/fwparam_ibft'' to the initial ramdisk. * ''/etc/initramfs-tools/scripts/local-top/iscsi_tcp'' is copied to the ram disk and run at boot-time, just before the root filesystem is mounted. If the root device string looks like a SCSI device it brings up the appropriate Ethernet device, sets up the ip address passed through dhcp and connects the root file system on the iSCSI target. After you have made sure that ''/etc/initramfs-tools/initramfs.conf'' contains the line BUSYBOX=y you can update the initial ramdisk: dpkg-reconfigure linux-image-$(uname -r) If the modifications were applied to a physical disk on the client machine, you can now [[sanboot:transfer|transfer the contents of your physical disk to the SAN target]]. If the image you wish to export to client systems was modified directly,, you can now [[sanboot:iscsitarget|make the contents of that image available via iSCSI]]. ==== Hint ==== * If the system hangs before the root device has been mounted, passing ''break=mount'' on the command line will spawn a shell before ''scripts/local-top/iscsi_tcp'' is run. This should allow for further debugging. ==== Scripts ==== === /etc/initramfs-tools/hooks/iscsi_tcp === #!/bin/sh set -e PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions [ -x /usr/sbin/iscsistart ] && copy_exec /usr/sbin/iscsistart /sbin [ -x /usr/sbin/fwparam_ibft ] && copy_exec /usr/sbin/fwparam_ibft /sbin [ -x /sbin/ip ] && copy_exec /sbin/ip /sbin manual_add_modules iscsi_tcp manual_add_modules ib_iser === /etc/initramfs-tools/scripts/local-top/iscsi_tcp === #!/bin/sh set -e PREREQ="udev" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac case $ROOT in /dev/sd*) # Evaluate IBFT parameters for i in $(fwparam_ibft -b); do export $i; done #Bring up the interface used to boot for i in $(ls /sys/class/net); do IFADDR=$(cat /sys/class/net/$i/address) if [ $IFADDR = $iSCSI_INITIATOR_HWADDR ]; then echo "Using $i with MAC $IFADDR" export iSCSI_INITIATOR_IF=$i fi done modprobe -q iscsi_tcp modprobe -q ib_iser echo "Bringing up $iSCSI_INITIATOR_IF for iSCSI..." ip link set $iSCSI_INITIATOR_IF up echo "Setting up networking on $iSCSI_INITIATOR_IF..." ip addr add $iSCSI_INITIATOR_IPADDR/$iSCSI_INITIATOR_MASK brd + dev $iSCSI_INITIATOR_IF ip route add default via $iSCSI_INITIATOR_GATEWAY echo "Connecting to iSCSI target $iSCSI_TARGET_NAME on $iSCSI_TARGET_IPADDR..." iscsistart -i $iSCSI_INITIATOR_NAME -t $iSCSI_TARGET_NAME -g 1 -a $iSCSI_TARGET_IPADDR sleep 5 ;; esac ===== Using gPXE to boot over iSCSI ===== Since my network cards don't support booting via iSCSI, I've used the great gPXE, loading it after a "standard" PXE request. This is called [[:pxechaining|PXE Chainloading]] A separate stanza containing the right ''root-path'' option should be created for each host in ''/etc/dhcp3/dhcpd.conf'', like in the example. host iscsi-test { hardware ethernet 00:0C:29:5C:53:C2; fixed-address 192.168.23.195; filename ""; option root-path "iscsi:192.168.23.2::::iqn.2007-10.org.appliedgenomics:test.disk1"; }