pxe boot endet in busybox

berni51

Open-Net-FreeBSD user
Du beschreibst das angedachte Szenario sehr gut! Und richtig, das kann noch spannend werden. Immerhin liegen hier 2 NUCs und 2 Brix-Würfel rum, nagelneu, nie benutzt, nur ein paar Jahre abgelagert. Die müssen alle noch pxeboot lernen.
 

CommanderZed

OpenBSD User
Teammitglied
Soweit ich weiß kann man auch bei Linux / noch immer ro mounten, man bräuchte dann nur ein /tmp zb in einer ramdisk o.ä. dann kann man auf individuelles verzichten

Alternativ müsste man sonst für jeden client nen eigenes / erstellen das man dann indivudell zuweist zb anhand der mac-addresse, da bekommt dann entsprechend jeder client vom dhcp seine "eigene" pxe config

/edit das kann man natürlich auch etwas komplexer gestalten und zb / individuell pro maschine mounten aber zb /usr ro für alle gleich machen, dann hat man individuelle /var /etc etc

/edit2 ich meine mich übrigens sehr dumpf daran zu erinnern das mal in den 2000ern des Bastelspaßes wegen mit OpenBSD(?) genauso gemacht zu haben, da kommt gerade sehr viel gefährliches Halbwissen wieder hoch ... ich muss mal schauen, villeicht probiere ich das heute Abend mal aus, irgendwie bekomm ich da richtig lust drauf je mehr wir hier schreiben ;)
 

KobRheTilla

used register
Das ist schon richtig, aber wird das beim Hochfahren eines Clients in /etc/ übernommen, wenn dieser seinen Dateibaum von nem Server (z.B. /nfsexport/InstalledLinuxOS/etc) erhält?
Wenn Hostname/IP-Adresse u.ä. nicht statisch vorkonfiguriert werden, sondern die DHCP-Werte übernommen werden, geht das alles. Wir hatten in der lokalen LUG im Jahr 2005 mal auf Basis von LTSP einen PVM-Cluster aufgebaut, um ein Video zu rendern. Alle Clients wurden übers Netz gebootet:


Rob
 

turrican

Well-Known Member
Soweit ich weiß kann man auch bei Linux / noch immer ro mounten, man bräuchte dann nur ein /tmp zb in einer ramdisk o.ä. dann kann man auf individuelles verzichten
Eventuell macht der systemd da ggf Probleme?

Alternativ müsste man sonst für jeden client nen eigenes / erstellen das man dann indivudell zuweist zb anhand der mac-addresse, da bekommt dann entsprechend jeder client vom dhcp seine "eigene" pxe config

/edit das kann man natürlich auch etwas komplexer gestalten und zb / individuell pro maschine mounten aber zb /usr ro für alle gleich machen, dann hat man individuelle /var /etc etc
Ich denke @KobRheTilla hat mit LTSP einen Weg in die richtige Richtung aufgezeigt - dort wirds mittels ner template OS Installation und Images per squashfs für die Clients gemacht. Den systemd scheinens damit ja auch im Griff zu haben.

/edit2 ich meine mich übrigens sehr dumpf daran zu erinnern das mal in den 2000ern des Bastelspaßes wegen mit OpenBSD(?) genauso gemacht zu haben, da kommt gerade sehr viel gefährliches Halbwissen wieder hoch ... ich muss mal schauen, villeicht probiere ich das heute Abend mal aus, irgendwie bekomm ich da richtig lust drauf je mehr wir hier schreiben ;)
Wäre vielleicht hernach auch ganz interessant, wie sich das mit den BSDs lösen ließe.
 

derOliver

Systemheld
Wo liegt denn DER große Unterschied, ein Installationsscript aufzurufen zum Aufruf einer Shell?
Die Tatsache dass das Installationsskript inkl. aller benötigten Tools in die initramfs passt. Du könntest natürlich ein komplettes Root filesystem in die initramfs legen aber die muss ja komplett in den RAM passen und wird über lahmes tftp übertragen. Darum enthält die initramfs nur alles was benötigt wird ein NFS Share einzuhängen und sobald das erledigt ist wird ein chroot aufs richtige Root Dateisystem gemacht.
 

datasmurf

Well-Known Member
Hallo,

ich hab auch am Anfang gedacht das man "einfach so" ISO's über PXE booten kann. Leider geht das nicht so einfach und bin so vorgegangen.

Code:
git clone https://github.com/ipxe/ipxe
cd ipxe/src

In diesem Verzeichnis die Datei menu.ipxe erstellt mit dem Inhalt

Code:
#!ipxe
dhcp
chain tftp://${next-server}/ipxe/menu

In der C Header Datei

./src/config/general.h

Sanboot und NFS definiert.

C:
...
/*
 * Download protocols
 *
 */

#define DOWNLOAD_PROTO_TFTP     /* Trivial File Transfer Protocol */
#define DOWNLOAD_PROTO_HTTP     /* Hypertext Transfer Protocol */
#undef  DOWNLOAD_PROTO_HTTPS    /* Secure Hypertext Transfer Protocol */
#undef  DOWNLOAD_PROTO_FTP      /* File Transfer Protocol */
#undef  DOWNLOAD_PROTO_SLAM     /* Scalable Local Area Multicast */
//#undef  DOWNLOAD_PROTO_NFS      /* Network File System Protocol */
// Download via NFS
#define  DOWNLOAD_PROTO_NFS      /* Network File System Protocol */
//#undef DOWNLOAD_PROTO_FILE    /* Local filesystem access */

/*
 * SAN boot protocols
 *
 */

//#undef    SANBOOT_PROTO_ISCSI    /* iSCSI protocol */
#define    SANBOOT_PROTO_ISCSI    /* iSCSI protocol */
//#undef    SANBOOT_PROTO_AOE    /* AoE protocol */
//#undef    SANBOOT_PROTO_IB_SRP    /* Infiniband SCSI RDMA protocol */
//#undef    SANBOOT_PROTO_FCP    /* Fibre Channel protocol */
//#undef    SANBOOT_PROTO_HTTP    /* HTTP SAN protocol */
// Boot via SAN HTTP
#define SANBOOT_PROTO_HTTP    /* HTTP SAN protocol */
....


Anschließend..

Code:
gmake bin/undionly.kpxe EMBED=menu.ipxe OBJCOPY=/usr/local/bin/objcopy

kompiliert. Die PXEBootloaderdatei

bin/undionly.kpxe: pxelinux loader (version 3.70 or newer) aus dem Verzeichnis ./src/bin nach /tftpboot/ kopiert.

Auf der OPNsense habe ich die DHCP Einstellungen angepasst, das

2021-12-16_15-31.png


Auf meiner "Workstation" mit der IP 192.168.1.137 hatte ich bereits den tftpd(8) Daemon über inetd(8) konfiguriert, da ich das für mein CISCO 8841 brauche. Übrigens gibt es Mittlerweile aber auch für OPNsense ein passendes tftpd Plugin.

Im Verzeichnis /tftpboot/ habe ich das Unterverzeichnis /tftpboot/ipxe erstellt.
Dort liegt dann die PXE Menüdatei für den PXE Boot.

Code:
#!ipxe
set keep-san 1
menu PXE Bootmenu

item mfsbsd mfsbsd
item tiny TinyCore

choose --default mfsbsd --timeout 3000 target && goto ${target}

:mfsbsd
sanboot http://192.168.1.137/fbsd.iso

:tiny
sanboot http://192.168.1.137/tiny.iso

Für Sanboot braucht man noch einen Webserver ich habe dafür Apache genommen. Ich habe die Einstellungen von Apache nicht weiter geändert.
Ich habe die ISO's einfach in das Vorkonfigurierte DOCROOT /usr/local/www/apache24/data kopiert. Damit lassen sich ISO booten wie Tiny Core Linux oder mfsBSD damit man aber bspw. die Devuan Desktop live Daten der ISO mittels PXE booten kann braucht man einen NFS Server. Dazu mit TrueNAS Core laufen und habe dort eine NFS Share eingerichtet. Wie man dies bspw. auf FreeBSD macht findet man im Handbuch.

Dann die aktuelle ISO von Devuan devuan_chimaera_4.0.0_amd64_desktop-live.iso heruntergeladen.

Bash:
cd /PFAD/ZUM/NFS/STAMMVERZEICHNIS
fetch https://mirror.leaseweb.com/devuan/devuan_chimaera/desktop-live/devuan_chimaera_4.0.0_amd64_desktop-live.iso
mdconfig -t vnode -f devuan_chimaera_4.0.0_amd64_desktop-live.iso
mount_cd9660 /dev/md0 /media
tree /media/live/
/media/live/
├── filesystem.squashfs
├── initrd.img
└── vmlinuz

mkdir devuan 
cp -R /media/live devuan/
/mnt/Media/NFS
.
└── devuan
    └── live
        ├── filesystem.squashfs
        ├── initrd.img
        └── vmlinuz

Dann die Datei /tftpboot/ipxe/menu mit

Code:
# Auf deine lokale Umgebund anpassen
set nfs-server 192.168.1.2
# Auf deine lokaler Umgebung anpassen
set nfs-root /mnt/Media/NFS
:devuan
# Zu den Argumenten und Paramtern: https://www.kernel.org/doc/html/latest/admin-guide/nfs/nfsroot.html#
kernel nfs://${nfs-server}:${nfs-root}/devuan/live/vmlinuz ip=dhcp nfsroot=${nfs-server}:${nfs-root}/devuan boot=/live root=/dev/nfs
initrd nfs://${nfs-server}:${nfs-root}/devuan/live/initrd.img
boot

ergänzt und dann den Client mit PXE booten dann wird erst der Linux-Kernel geladen anschließend die Ramdisk entpackt und die init Skripte laden dann das Rootdateisystem ( filesystem.squashfs ) über NFS.


Viel Erfolg!
 

berni51

Open-Net-FreeBSD user
Danke für die Beschreibung, @datasmurf. Ich wollts aber erstmal ohne ipxe versuchen, und bin dabei heute auch gut weitergekommen:
Hab ebenfalls das devuan_chimaera_4.0.0_amd64_desktop-live.iso genommen.
Das Iso hab ich dann gemountet: mount -o loop -i iso9669 /home/data/netboot/devuan_chimaera_4.0.0_amd64_desktop-live.iso /home/data/netboot/boot/desktop-live.
Dieses Verzeichnis hab ich dann über einen /etc/exports-Eintrag als nfs-Laufwerk freigegeben.

Jetzt bootet des diskless NUC schonmal einwandfrei in eine Bash und ich hab den gesamten Inhalt der Iso zur Verfügung. Selbst ein startx klappt und bringt einen xfce-Desktop auf den Schirm.

Jetzt ist aber noch jede Menge Feinarbeit nötig, damit das ordentlich läuft: Netzwerkanpassung, länderspezifische Einstellungen, noch ein paar Tools und ein beschreibbares Laufwerk dazu packen. Wahrschein bau ich ein angepasstes Iso auf der Basis von desktop-live zusammen.

Morgen geh ich die Prozedur nochmal durch und beschreib das Ganze dann etwas präziser.
 

CommanderZed

OpenBSD User
Teammitglied
@datasmurf Vielen Dank für die Anleitung, das klärt so einiges ... hab Mittwoch schon nen bisschen was vorbereitet aber bin dann ua aus Zeitmangel nicht wirklich weitergekommen.

Ganz interessant fand ich auch noch die Anleitung vom archlinux, das könnte da archlinux ja auch eine sehr nette Plattform ist evtl. für das was der @berni51 vorhat evtl. auch hilfreich sein:

 

berni51

Open-Net-FreeBSD user
Die Anleitung im Archwiki ist nicht schlecht, aber deren Weg über NBP gefällt mir überhaupt nicht. Ich schwör aus KISS. :cool:
 

berni51

Open-Net-FreeBSD user
Dank eurer Unterstützung in diesem Thread bin ich jetzt fast am Ende meiner pxeboot-Wünsche - aber eben nur fast.

Die Vorgehensweise war diese:
1.
Auf dem Raspberry ein Devuan Chimaera installiert, darauf pxelinux, isolinux, dnsmasq und nfs eingerichtet. Einfache Sache und mit einer winzigen Konfigurationsdatei /etc/dnsmasq.conf erledigt.
Code:
port=0
interface=eth0
#dhcp-range=192.168.0.0,proxy
dhcp-range=192.168.0.230,192.168.0.235
enable-tftp
tftp-root=/home/data/netboot
pxe-service=x86PC,"PXELINUX (BIOS)",bios/pxelinux
pxe-service=x86-64_EFI,"PXELINUX (EFI)",efi64/syslinux.efi
log-queries
log-facility=/var/log/dnsmasq.log
log-dhcp
Der dnsmasq arbeitet nicht als Namesrver, sondern ist nur für DHCP und tftp zuständig.

2.
Zwei iso-Images heruntergeladen: Devuan Chimaera Desktop-live und Refracta 12 nox. dann eine Verzeichnistruktur für pxeboot erzeugt:
Code:
data
└── netboot
    ├── bios
    │   ├── ldlinux.c32
    │   ├── libcom32.c32
    │   ├── libutil.c32
    │   ├── pxelinux.0
    │   ├── pxelinux.cfg -> ../pxelinux.cfg
    │   └── vesamenu.c32
    ├── boot
    │   ├── desktop-live
    │   │   ├── boot
    │   │   ├── efi
    │   │   ├── isolinux
    │   │   └── live
    │   └── refracta-nox
    │       ├── boot
    │       ├── efi
    │       ├── isolinux
    │       ├── live
    │       └── pkglist_refracta_12-test_nox_amd64-20211116_2049
    ├── efi64
    │   ├── ldlinux.e64
    │   ├── libcom32.c32
    │   ├── libutil.c32
    │   ├── pxelinux.cfg -> ../pxelinux.cfg
    │   ├── syslinux.efi
    │   └── vesamenu.c32
    ├── mnt-system
    └── pxelinux.cfg
        ├── default
        └── default~

3.
Die beiden Linux-Images dann lokal gemountet:
Code:
mount -o loop -t iso9660 /home/berni/Downloads/devuan_chimaera_4.0.0_amd64_desktop-live.iso /home/data/netboot/boot/desktop-live
mount -o loop -t iso9660 /home/berni/Downloads/refracta_12-test_nox_amd64-20211116_2049.iso /home/data/netboot/boot/refracta-nox

4.
Die beiden gemounteten Verzeichnisse dann als NFS-Laufwerke exportiert:
Code:
# /etc/exports: the access control list for filesystems which may be exported
#        to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/home/data/netboot/boot/desktop-live *(rw,sync,no_subtree_check)
/home/data/netboot/boot/refracta-nox *(rw,sync,no_subtree_check)

5.
Das Menu für pxeboot erstellt und in den Ordner pxelinux.cfg kopiert:
Code:
MENU TITLE  PXE Boot Menu
DEFAULT     vesamenu.c32

    LABEL local
        MENU LABEL Boot from local drive
        LOCALBOOT 0xffff

    MENU BEGIN amd64
    MENU TITLE amd64


            LABEL memtest
                MENU LABEL ^Memtest
                KERNEL ::boot/refracta-nox/live/memtest
                APPEND vga=788


            LABEL desktop-live
                MENU LABEL ^Chimaera-desktop-live
                KERNEL ::boot/desktop-live/live/vmlinuz
                APPEND vga=788 initrd=::boot/desktop-live/live/initrd.img boot=live root=/dev/nfs nfsroot=/home/data/netboot/boot/desktop-live init=/bin/bash

            LABEL refracta-nox
                MENU LABEL ^Refracta-nox
                KERNEL ::boot/refracta-nox/live/vmlinuz
                APPEND vga=788 initrd=::boot/refracta-nox/live/initrd.img boot=live root=/dev/nfs nfsroot=/home/data/netboot/boot/refracta-nox init=/bin/bash

    MENU END

6.
Tests. Beide iso Images booten und öffnen eine bash. Das Netzwerk funktioniert, sogar ein startx klappt. Aber es bleibt noch einiges zu tun:
  • die locales fest einbinden und abspeichern
  • den richtigen Nameserver und das Gateway übergeben
Es wird also darauf hinauslaufen, dass ich passende Isos erstellen werde. Mit den refracta-tools ist das keine große Sache. Und wenn alles richtig rund läuft, versuch ichs mal mit OpenBSD.

Hier der Stapellauf, also der erste halbwegs vernünftige pxeboot:
Raspberry boott Intel NUC
 
Oben