/ Linux

Ubuntu: Booten via PXE von iSCSI Target

Heute möchte ich mich damit beschäftigen wie man ein Ubuntu-System via PXE von einem iSCSI Target zum booten bringen kann.

Anwendungszweck

In meinem PC ist jedeglich eine SSD verbaut und ich habe keine große Lust die Partitionierung dieser zu ändern. Außerdem läuft bei mir im LAN schon ein PXE Server, weshalb also nicht einfach Ubuntu auf einem iSCSI Target installieren und via PXE davon booten?

Anmerkung: Ich setze für dieses Tutorial voraus das bereits ein korrekt konfigurierter PXE Server vorhanden ist, der in eine Syslinux-Umgebung bootet.

iSCSI am Server einrichten

Vorwort

Zu Beginn benötigen wir erstmal ein Medium das via iSCSI freigegeben werden soll, dafür kann man entweder eine komplette Festplatte verwenden, diese darf dann allerdings am Server nicht gemountet werden und kann somit auch nur noch für iSCSI verwendet werden.
Oder die zweite Möglichkeit, die ich auch bei mir angewandt habe, wir erstellen uns einen Festplatten Container und geben diesen frei.

Pakete installieren
bash:~$ apt-get update && apt-get install iscsitarget iscsitarget-dkms -y
Container erzeugen
bash:~$ mkdir /iscsi_disks && cd /iscsi_disks
bash:~$ dd if=/dev/zero of=ubuntu.disk count=0 bs=1 seek=80G

So erzeugen wir einen Container der später bis zu 80 GB groß werden darf, natürlich kann man die Größe beliebig anpassen.

Freigabe einrichten
bash:~$ nano -w /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

bash:~$ nano -w /etc/iet/ietd.conf
# namens-regel: [iqn.jahr-monat.domain/ip:name]
Target iqn.2015-09.server.local:ubuntu
   Lun 0 Path=/iscsi_disks/ubuntu.disk,Type=fileio
   # Optional: ip des iSCSI Initiators, der sich verbinden darf (kann auch ein ganzes Netzwerk sein)
   initiator-address 192.168.2.0/24

bash:~$ /etc/init.d/iscsitarget restart
Freigabe überprüfen
bash:~$ ietadm --op show --tid=1
# Ausgabe:
Wthreads=8
Type=0
QueuedCommands=32
NOPInterval=0
NOPTimeout=0
Ubuntu installieren

Tip: Bevor man mit der Installation beginnt sollte man sicherheitshalber alle im PC verbauten Festplatten abklemmen.

Zuerst booten wir ein normales Ubuntu Live System (CD/USB-Stick/PXE), dort öffnen wir erstmal ein Terminal und installieren die benötigten Pakete:

bash:~$ sudo -i
bash:~$ apt-get update && apt-get install open-iscsi -y
bash:~$ /etc/init.d/open-iscsi start
iSCSI Laufwerk einhängen
bash:~$ iscsiadm -m discovery -t st -p server.local
# Ausgabe:
192.168.2.2:3260,1 iqn.2015-09.server.local:ubuntu

bash:~$ iscsiadm -m node --targetname "iqn.2015-09.server.local:ubuntu" --portal "server.local:3260" --login

Nun können wir den normalen Ubuntu-Installer starten, die Partitionierung erledigen wir manuell und erstellen eine Partition für unseren Swap (Empfehlung: 2GB) und eine weitere Partition für unser System (root), der wir den restlichen Speicher zuweisen. Dann fahren wir wie gewohnt mit der Installation fort.

Nachdem die Installation abgeschlossen ist starten wir nicht neu!

Damit unser firsch installiertes System booten kann sind noch ein paar Schritte nötig, wir müssen dazu mittels chroot in das System wechseln:

bash:~$ sudo -i
bash:~$ mount /dev/sda2 /mnt
bash:~$ chroot /mnt /bin/bash
bash:~/$ mount -t proc none /proc
bash:~/$ echo "nameserver 192.168.2.1" >> /etc/resolv.conf
bash:~/$ apt-get update && apt-get install initramfs-tools open-iscsi sysv-rc-conf -y
bash:~/$ echo "iscsi" >> /etc/initramfs-tools/modules
bash:~/$ echo "InitiatorName=iqn.2015-09.server.local:ubuntu-client1" > /etc/iscsi/initiatorname.iscsi
bash:~/$ touch /etc/iscsi/iscsi.initramfs
bash:~/$ update-initramfs -u
bash:~/$ nano -w /etc/network/interfaces
auto eth0
iface eth0 manual

# Kernel und Initialramdisk auf den PXE Server kopieren
bash:~/$ scp /vmlinuz /initrd.img root@server.local:/tftp/iscsi/

# Umgebung verlassen
bash:~/$ umount /proc
bash:~/$ exit

Damit sollte unser System nun in der Lage sein zu booten, nun müssen wir nur noch einen Eintrag in unserem Syslinux Menü anlegen:

label ubuntu-iscsi
    menu label Ubuntu (iSCSI)
    kernel iscsi/vmlinuz
    append initrd=iscsi/initrd.img ip=dhcp ISCSI_INITIATOR=iqn.2015-09.server.local:ubuntu-client1 ISCSI_TARGET=iqn.2015-09.server.local:ubuntu ISCSI_TARGET_IP=server.local ISCSI_TARGET_PORT=3260 root=UUID=5c0bd3d6-b43b-48d4-ac82-cc9b364f4544 rw

Anmerkung: Sollte der Domainname bei ISCSI_TARGET_IP nicht funktionieren, gibt man die IP-Adresse stattdessen an, außerdem ist bei root die UUID von /dev/sda2 auf unserem iSCSI Target gemeint auslesen kann man sie wie folgt:

bash:~$ sudo blkid /dev/sda2

Sollte man nach dem Boot nur einen schwarzen Bildschirm vorfinden hilft eventuell der Parameter nomodeset.

Somit sind wir nun fertig und können nun unser System via PXE booten.

Ubuntu: Booten via PXE von iSCSI Target
Share this