Morning all,
This has taken me days to sort out and lots of searching the net but finally
have ubuntu 22.04 deploying on xcat2 for pxe and xnba.
I'm sure there are a load of ways to complete this however this is how I did it
(obviously modify paths to suit your xcat setup):
Tables:
linuximage:
"ubuntu22.04-x86_64-install","/install/vessel/templates/subiquity.tmpl",,,"/install/vessel/templates/ubuntu22.pkglist","/install/global/os/ubuntu22.04/x86_64",,,,,,,,,,,,,,,,,,
osimage:
"ubuntu22.04-x86_64-install",,"v.ubuntu22","linux",,"install",,,,,"Linux","ubuntu22.04","x86_64","/install/vessel/templates/v.synclist",,,,,,,,
noderes: "ubuntu22",,"xnba",,,,,,"enp3s0f0","enp3s0f0",,,,,,,,,,,, #<-- not
sure if you need to specify the nic. Will test without later
nodehm: "ubuntu22","ipmi","ipmi",,,,,,,,,,,,,
nodetype:
"v.ubuntu22","ubuntu22.04","x86_64","v.ubuntu22","ubuntu22.04-x86_64-install",,,,
presecripts: "ubuntu22",,"vessel/v.ubuntu-xcat-installer",,
For our example node of shark099 the nodelist tab is as follows:
nodelist: "shark099","v.ubuntu22,ubuntu22,all",
Iso image:
Put the ubuntu-22.04.5-live-server-amd64.iso file in /install/isos
Extract the iso:
# copycds ubuntu-22.04.5-live-server-amd64.iso
We then have to move the extract directory /install/ubuntu22.04.5 to
/install/global/os/ubuntu22.04.5 and create a symlink to ubuntu22.04.
This is just our site and setup. You dont have to do this but you will need to
make sure the naming is consistent elsewhere.
Important for PXE installs:
/install/vessel/syncfiles/ubuntu/ldlinux.c32 #<-- this file comes from an
existing ubuntu install. You need to make sure you have syslinux-common on the
source system and then copy the file over. The pre script below copies this to
/tftpboot which is required for PXE to work
Scripts and templates
The template file "/install/vessel/templates/subiquity.tmpl" is as follows
(with sensitive info redacted):
#cloud-config
autoinstall:
version: 1
user-data:
hostname: #HOSTNAME#
disable_root: false
package_update: true
package_upgrade: true
timezone: UTC
keyboard:
layout: us
toggle: null
variant: ''
locale: en_US
storage:
layout:
name: direct
network:
version: 2
ethernets:
id0:
match:
macaddress: '#TABLE:mac:$NODE:mac#'
addresses:
- __NODEIP__/24
nameservers:
addresses: [#TABLE:site:key=master:value#, 8.8.8.8]
routes:
- to: default
via: '__GATEWAY__'
ssh:
allow-pw: true
install-server: true
authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu...........
apt:
primary:
- arches: [amd64]
uri: http://us.archive.ubuntu.com/ubuntu/
packages:
- bash
- nfs-common
- openssl
- isc-dhcp-client
- libc-bin
- openssh-server
- openssh-client
- wget
- vim
- rsync
- busybox-static
- gawk
- dnsutils
- chrony
- gpg
- snmp
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
- ipmitool
early-commands:
- echo "Hi!"
late-commands:
- echo "PermitRootLogin yes" >> /target/etc/ssh/sshd_config
- echo "StrictHostKeychecking=no" >> /target/etc/ssh/ssh_config
- systemctl daemon-reload
- mkdir -p /target/root/.ssh
- echo "#TABLE:site:key=idrsapub:value#" >>
/target/root/.ssh/authorized_keys
- systemctl restart sshd
- echo "Copy /etc/hosts file"
- wget http://#XCATVAR:XCATMASTER#:80/install/ubuntu/hosts -O
/target/etc/hosts
- mkdir -p /target/etc
- echo "Disabling systemd-resolved..."
- rm -f /target/etc/resolv.conf
- echo "domain #TABLE:site:key=domain:value#" > /target/etc/resolv.conf
- echo "nameserver #XCATVAR:XCATMASTER#" >> /target/etc/resolv.conf
- echo "nameserver 8.8.8.8" >> /target/etc/resolv.conf
- sed -i
's/GRUB_CMDLINE_LINUX_DEFAULT=""/GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"/g'
/target/etc/default/grub
- curtin in-target --target /target update-grub
- echo 'fs.file-max = 188898' >> /target/etc/sysctl.conf
- echo 'fs.inotify.max_user_instances=1280' >> /target/etc/sysctl.conf
- echo 'fs.inotify.max_user_watches=655360' >> /target/etc/sysctl.conf
- echo 'session required pam_limits.so' >> /target/etc/pam.d/common-session
- echo 'session required pam_limits.so' >>
/target/etc/pam.d/common-session-noninteractive
- echo '* soft nofile 188898' >> /target/etc/security/limits.conf
- echo '* hard nofile 188898' >> /target/etc/security/limits.conf
- echo "ulimit -Sn 188898" >> /target/root/.bashrc
- mkdir -p /target/etc/apt/keyrings
- mkdir -p /target/etc/apt/sources.list.d
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor
-o /target/etc/apt/keyrings/docker.gpg
- echo "deb [arch=$(dpkg --print-architecture)
signed-by=/etc/apt/keyrings/docker.gpg]
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee
/target/etc/apt/sources.list.d/docker.list
- apt-get update
- echo 'export HISTTIMEFORMAT="%d/%m/%y %H:%M:%S "' >> /target/root/.bashrc
- echo "export HISTSIZE=10000" >> /target/root/.bashrc
- echo "export HISTFILESIZE=10000" >> /target/root/.bashrc
- echo "export PS1='\[\e[31;1m\][\u@#TABLE:site:key=location:value# -
\[\e[34;1m\]\H \W]\# \[\e[0m\]'" >> /target/root/.bashrc
- echo "alias minicom='TERM=linux minicom'" >> /target/root/.bashrc
- sed -i
'/^session[[:space:]]\+optional[[:space:]]\+pam_motd.so[[:space:]]\+motd=\/run\/motd.dynamic/s/^/#/'
/target/etc/pam.d/sshd
- sed -i
'/^session[[:space:]]\+optional[[:space:]]\+pam_motd.so[[:space:]]\+noupdate/s/^/#/'
/target/etc/pam.d/sshd
- systemctl restart ssh
The prescript file "/install/vessel/prescripts/v.ubuntu-xcat-installer" is
follows:
#!/bin/bash
printenv > /tmp/postscript_env_$$.log
TFTPBOOT1="/tftpboot/pxelinux.cfg"
TFTPBOOT2="/tftpboot/xcat/osimage/ubuntu22.04-x86_64-install"
TFTPBOOTXNBA="/tftpboot/xcat/xnba/nodes"
AUTOINSTDIR="/install/autoinst"
SOURCEFILESDIR="/install/global/os/ubuntu22.04/x86_64/casper"
osimageNode(){
# Create the PXE files for the individual nodes
target="/tftpboot/ldlinux.c32"
source="/install/vessel/syncfiles/ubuntu/ldlinux.c32"
if [ ! -f "$target" ]; then
cp -f "$source" "$target"
fi
#
# Copy vmlinuz and initrd to the tftpbootdir location
#
cp -f ${SOURCEFILESDIR}/vmlinuz ${TFTPBOOT2}/vmlinuz
cp -f ${SOURCEFILESDIR}/initrd ${TFTPBOOT2}/initrd.img
for NODE in ${NODES//,/ }; do
IP=$(awk -v host="${NODE}" '$2 == host {print $1}' /etc/hosts)
# Extract the first 3 octets
NFSSERVER="${IP%.*}.10"
GATEWAY="${IP%.*}.1"
# Write the rest of this shite out to the pxe file
echo "#install ubuntu22.04-x86_64-v.ubuntu22" >
/tftpboot/pxelinux.cfg/${NODE}
echo "DEFAULT xCAT" >> /tftpboot/pxelinux.cfg/${NODE}
echo "LABEL xCAT" >> /tftpboot/pxelinux.cfg/${NODE}
echo " KERNEL xcat/osimage/ubuntu22.04-x86_64-install/vmlinuz" >>
/tftpboot/pxelinux.cfg/${NODE}
echo " INITRD xcat/osimage/ubuntu22.04-x86_64-install/initrd.img" >>
/tftpboot/pxelinux.cfg/${NODE}
echo " APPEND root=/dev/ram0 ramdisk_size=1500000 ignore_uuid ip=dhcp
boot=casper
url=http://${NFSSERVER}/install/isos/ubuntu-22.04.5-live-server-amd64.iso
cloud-config-url=http://${NFSSERVER}:80/install/autoinst/${NODE}/user-data
autoinstall" >> /tftpboot/pxelinux.cfg/${NODE}
# Modify the xnba files as well
echo "#!gpxe" > ${TFTPBOOTXNBA}/${NODE}
echo "imgfetch -n kernel
http://\${next-server}/tftpboot/xcat/osimage/ubuntu22.04-x86_64-install/vmlinuz"
>> ${TFTPBOOTXNBA}/${NODE}
echo "imgload kernel" >> ${TFTPBOOTXNBA}/${NODE}
echo "imgargs kernel ignore_uuid ip=dhcp boot=casper
url=http://\${next-server}/install/isos/ubuntu-22.04.5-live-server-amd64.iso
cloud-config-url=http://\${next-server}/install/autoinst/shark099/user-data
autoinstall" >> ${TFTPBOOTXNBA}/${NODE}
echo "imgfetch -n initrd
http://\${next-server}/tftpboot/xcat/osimage/ubuntu22.04-x86_64-install/initrd.img"
>> ${TFTPBOOTXNBA}/${NODE}
echo "imgexec kernel" >> ${TFTPBOOTXNBA}/${NODE}
cp -f ${TFTPBOOTXNBA}/${NODE} ${TFTPBOOTXNBA}/${NODE}.uefi
# Do some substitutions in the user-data file
sed -i "s/__NODEIP__/${IP}/" ${AUTOINSTDIR}/${NODE}/user-data
sed -i "s/__GATEWAY__/${GATEWAY}/" ${AUTOINSTDIR}/${NODE}/user-data
done
}
cleanupPXE(){
# Remove PXE files for the individual nodes
for NODE in ${NODES//,/ }; do
find /install/autoinst/ -name '${NODE}' -exec rm -rf {} +
find /tftpboot/pxelinux.cfg -name '${NODE}' -exec rm -rf {} +
find /tftpboot/pxelinux.cfg -xtype l -delete
find /tftpboot/xcat/xnba/nodes -name '${NODE}' -exec rm -rf {} +
done
}
case ${ACTION} in
osimage ) osimageNode;;
boot ) cleanupPXE;;
esac
Thats pretty much it. When you run "nodeset shark099 osimage" the prescript
will create the working pxe and xnba files so you can use either "pxe" or
"xnba" in noderes depending on your preference.
You can then use nodeset shark099 boot to change the state back to boot and
clean up the pxe and xnba files.
_______________________________________________
xCAT-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xcat-user