3

I'm in the process of setting up a compute cluster with the intent of using it for some parallel computing experiments. I have a single executable which I'd like to run on this cluster.

Due to operational constraints on said cluster I can only deploy this executable as a PXE boot image. Unfortunately, the only "ready-made" images I've been able to find are installation ones intended to install a particular distro. They don't particularly appear easy to modify.

Can someone perhaps provide some pointers as to how I could go about creating a pxelinux image that loads the linux kernel and subsequently run an executable?

Bartvbl
  • 133
  • 1
  • 5
  • Is your executable its own operating system?! – Michael Hampton Jul 13 '18 at 17:11
  • @MichaelHampton No, it's not. It's a program I compiled and have all required shared libraries for, so it should run on any linux distro. – Bartvbl Jul 13 '18 at 17:12
  • Well, then you can just PXE boot your favorite Linux distro. – Michael Hampton Jul 13 '18 at 17:16
  • @MichaelHampton I'm sorry if it's a dumb question, but how do I include my program in the files being distributed to the machines, and subsequently have the machines execute it once they have finished booting? – Bartvbl Jul 13 '18 at 17:20
  • Instead of booting the kernel/initrd for the _installer_, you boot the kernel/initrd for an _installed system_. Your distro's documentation should explain how to install the OS for PXE booting and root filesystem on the network. – Michael Hampton Jul 13 '18 at 17:21
  • @MichaelHampton Do you have an example of such documentation for a particular distro? The only ones I've been able to find talk about the installer. – Bartvbl Jul 13 '18 at 17:28
  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-disklesssystems – Michael Hampton Jul 14 '18 at 14:56

1 Answers1

2

Using ubuntu-18-x86_64-initrd.gz:

wget http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz
gzip -d initrd.gz
mkdir image
cd image
cpio -idmv < ../initrd

Now copy your executable, required shared libraries, and other files needed by your executable into image/. Edit etc/inittab. You probably want to remove ::sysinit:. Change ::respawn: to be an invocation of your executable.

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initrd-bionic-foo.gz

Copy initrd-bionic-foo.gz to your tftp server. Sample pxelinux.cfg entry:

default foo
label foo
kernel boot/Ubuntu-18.04-x86_64-linux
append initrd=boot/initrd-bionic-foo.gz
Mark Wagner
  • 18,019
  • 2
  • 32
  • 47