NOTE: This is Part 3 in a series on booting Ubuntu from an iSCSI disk. We have previously created an iSCSI disk and connected to it from the Ubuntu Live installation CD. View all of the sections here.
Many of the commands in this post were taken from http://etherboot.org/wiki/sanboot/ubuntu_iscsi.
If you’re following along with the series, you are now on the first screen of the Ubuntu installation wizard and the iSCSI disk has been connected to your system. You can now continue the installation as normal. When you get to the disk selection screen, the iSCSI drive should show up as a normal drive; partition it as you like.
NOTE: After the installation completes, and before you reboot, we have a few more steps to complete. DO NOT REBOOT!
At this point if you rebooted, the boot process would fail with a message indicating that you don’t have a hard drive. If you are not a good listener and decided to reboot anyway, all is not lost. Simply boot to any Ubuntu live disk and follow the instructions in the previous post to connect to the iSCSI drive.
We need to configure the initrd process to connect to the iSCSI disk before it does anything else. In order to do this, we’ll need to mount our newly installed system. So once again open a terminal. Assuming your root file system was installed on iSCSI device /dev/sda1 you would enter
user@client:~$ sudo su root@client:~$ mkdir /mnt/newsystem root@client:~$ mount /dev/sda1 /mnt/newsystem root@client:~$ chroot /mnt/newsystem root@client:~$ mount -t proc none /proc root@client:~$ hostname -F /etc/hostname
Update: Users in the comments indicate you also need to run the following before you run the chroot command. YMMV.
root@client:~$ mkdir /mnt/newsystem/dev root@client:~$ mkdir /mnt/newsystem/proc root@client:~$ mkdir /mnt/newsystem/sys root@client:~$ mount --bind /dev /mnt/newsystem/dev root@client:~$ mount -t proc proc /mnt/newsystem/proc root@client:~$ mount -t sysfs sys /mnt/newsystem/sys
Now that we have switched from the live system to the system installed on the iSCSI disk, we need to install some packages.
root@client:~$ apt-get install initramfs-tools open-iscsi sysv-rc-conf
Next, we’ll want to add iSCSI to the list of modules to include in the boot image.
root@client:~$ echo "iscsi" >> /etc/initramfs-tools/modules
Setup the initiator’s unique ID with the following command. You’re welcome to use a different name, however, it must follow the same naming convention as before and cannot be the same as the name of the iSCSI disk itself. If, for some reason, you decide to allow multiple clients to connect to the iSCSI disk, each client computer will need its own unique ID.
root@client:~$ echo "InitiatorName=iqn.2012-03.com.example:xbmc-client1" > /etc/iscsi/initiatorname.iscsi
Touch the indicator file, so that the module is included in the new initrd.
root@client:~$ touch /etc/iscsi/iscsi.initramfs
Finally, we’ll update initramfs.
root@client:~$ update-initramfs -u
There are still a couple of items to clean up before we are ready to reboot. If the networking systems try to renegotiate an IP address, our connection to the iSCSI device will be lost and bad things will happen. So let’s switch the network configuration to manual.
root@client:~$ nano /etc/networking/interfaces
Change this file to read:
auto eth0 iface eth0 inet manual
Lastly we need to update GRUB to pass the iSCSI parameters to the kernel at boot time.
root@client:~$ nano /etc/default/grub
Append the following to GRUB_CMDLINE_LINUX_DEFAULT, substituting the appropriate values.
ip=dhcp ISCSI_INITIATOR=iqn.2012-03.com.example:xbmc-client1 ISCSI_TARGET_NAME=iqn.2012-03.com.example:xbmc-server ISCSI_TARGET_IP=192.168.0.101 ISCSI_TARGET_PORT=3260 ISCSI_USERNAME=<username> ISCSI_PASSWORD=<password>
Update GRUB to lock in the changes.
root@client:~$ update-grub
Now Ubuntu’s boot process is configured to boot over iSCSI, but we still have to setup iPXE to get the boot sequence started.
Part 4: Configuring iPXE (formerly gPXE) for booting an iSCSI disk
Thank you very much for this guide!
I have followed your instructions to the letter and on the last step:
root@client:~$ update-grub
I keep getting the following error:
/usr/sbin/grub-probe: error: cannot find a device for / (is /dev mounted?).
Any idea whats causing this?
I am using ubuntu 10.10 x64 and booting of an intel iBFT nic. When ubuntu attempts to load, it drops to the busy box and says it timed out waiting on the root drive.
Thanks!
Are there any hard drives/USB drives installed in the client machine? If so, when you change to the new system, i.e. when you mount /dev/sda1 on /mnt/newsystem, you need to confirm that /dev/sda1 is your iSCSI disk. You can type “fdisk -l” at the command line to list some basic information about each of the drives you have attached to the computer (Note: this must be run as root/sudo).
Once you are certain you have located the correct disk, if the /dev directory is still missing, you could manually mount the /dev directory like this:
root@client:~$ sudo su
root@client:~$ mkdir /mnt/newsystem
root@client:~$ mount /dev/sda1 /mnt/newsystem
root@client:~$ mkdir /mnt/newsystem/dev
root@client:~$ mount --bind /dev /mnt/newsystem/dev
root@client:~$ chroot /mnt/newsystem
root@client:~$ mount -t proc none /proc
root@client:~$ hostname -F /etc/hostname
If you haven’t done anything else with your system, you should be able to boot any ubuntu live CD and type these commands. If it’s still not working, I would be interested in seeing the output of the “fdisk -l” command as well as “df -ah”.
correction:
root@client:~$ mount -bind /dev /mnt/newsystem/dev
should be
root@client:~$ mount –bind /dev /mnt/newsystem/dev
also needs
root@client:~$ mount –bind /sys /mnt/newsystem/sys
before chrooting.
Ciao,
Andrew
Nice write up.
If you removed at the bashrc leading “root@client” text it would be easier to cut and paste:
from:
root@client:~$ mkdir /mnt/newsystem
to:
export newroot=/mnt/newsystem
mkdir $newroot
mount /dev/sda1 $newroot
mkdir $newroot/dev
chroot $newsystem
Note: verified using 12.04 64bit workstation.
More Notes:
Having turned off dhcp, (by setting eth0 to manual)
you now need to add the resolvers manually.
echo “timeout 2” > /etc/resolv.conf
echo “search example.com” >> /etc/resolv.conf
echo “nameserver 192.168.0.110” >> /etc/resolv.conf
When I did a chroot over to the new media, I got not get apt-get to work:
Err http://ports.ubuntu.com/ubuntu-ports/ raring/universe libcurses-perl powerpc 1.28-1build2
Something wicked happened resolving ‘ports.ubuntu.com:http’ (-11 – System error)
So I had to manually down load them :
wget http://ports.ubuntu.com/ubuntu-ports/pool/universe/libc/libcurses-perl/libcurses-perl_1.28-1build2_powerpc.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/main/libt/libterm-readkey-perl/libterm-readkey-perl_2.30-4build4_powerpc.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/universe/libc/libcurses-ui-perl/libcurses-ui-perl_0.9609-1_all.deb
wget http://ports.ubuntu.com/ubuntu-ports/pool/universe/s/sysv-rc-conf/sysv-rc-conf_0.99-7_all.deb
Then:
dpkg -i lib* sysv*
With trusty I also needed to run ‘grub-install /dev/sdf’ (sdf is my iscsi disk during install, the machine is not diskless).
The module is called iscsi_tcp instead of iscsi in trusty.