===== Darwin Management =====
==== Node Management ====
New nodes can be added with Luna by cloning any existing node and then adjusting their IP and MAC addresses.
Nodes can also be managed through groups and inherit group parameters unless they are overridden manually.
After any hardware reconfiguration, refresh the hardware inventory to avoid stale health alerts:
alertx hardware reset -H node01.cluster,node02.cluster,node03.cluster,node04.cluster,node05.cluster,node06.cluster,node07.cluster,node08.cluster,node09.cluster,node10.cluster,node11.cluster,node12.cluster,node13.cluster,node14.cluster
Exports are managed by trinityX playbooks, but they can still be adjusted manually in ///etc/exports.d/trinity.exports// when necessary.
==== BMC ====
Passwords for the head-node and compute-node BMCs are stored in //secrets.txt//. To change a BMC password manually, run:
/opt/IPMICFG-Linux.x86_64 -user setpswd 2
==== Slurm ====
Most Slurm configuration lives in ///etc/slurm//, mainly in the following files:
* ///etc/slurm/slurm.conf//
* ///etc/slurm/slurm-nodes.conf//
* ///etc/slurm/slurm-partitions.conf//
* ///etc/slurm/gres.conf//
* ///etc/slurm/cgroup.conf//
* ///etc/slurm/cgroup_allowed_devices_file.conf//
UNIX users are synchronized with Slurm Quality of Service (QoS) accounting every minute via:
* ///usr/local/sbin/slurm-sync-users//
* ///etc/default/slurm-sync-users//
* ///etc/systemd/system/slurm-sync-users.timer//
* ///etc/systemd/system/slurm-sync-users.service//
==== Grafana ====
Darwin's Grafana has two custom mechanisms worth knowing about:
* UNIX-to-Grafana user synchronization. The Authenticated Users team allows guests to read only the main page, while non-admin users can read all dashboards. Relevant files:
* ///usr/local/sbin/grafana-sync-authenticated-team//
* ///etc/systemd/system/grafana-sync-authenticated-team.service//
* ///etc/systemd/system/grafana-sync-authenticated-team.timer//
* Slurm textfile collection for the Slurm dashboard:
* ///usr/local/bin/slurm-job-names-collector.sh//
==== CryoSPARC ====
CryoSPARC lanes are stored in the following directories:
* ///trinity/structbio_home/cryosparcuser/lanes/intbio//
* ///trinity/structbio_home/cryosparcuser/lanes/struct_biotech//
After changing a lane, re-apply it from the corresponding directory. Example:
cd /trinity/structbio_home/cryosparcuser/lanes/intbio
/trinity/structbio_home/cryosparcuser/cryosparc_master/bin/cryosparcm cluster connect
==== Installation of Packages on Compute Nodes ====
1. Enter the image:
lchroot compute-image
2. Install necessary packages:
dnf install -y nano
3. Exit the image:
exit
4. Pack the image:
luna osimage pack compute-image
5. Reboot the compute/storage nodes:
luna control power reset \
node01,node02,node03,node04,node05,node06,node07,node08,node09,node10,node11,node12,node13,node14
6. Backup the image after the new configuration is tested successfully:
luna osimage remove full-compute-image-bak
luna osimage clone -o compute-image full-compute-image-bak
**Five main images are maintained:**
* //raw-compute-image-bak//: a fresh Rocky 9.6 compute-node image after running //ansible-playbook compute-default.yml//
* //compute-image//: the working image for compute nodes
* //full-compute-image-bak//: a backup copy of //compute-image//
* //storage-image//: the working image for storage nodes
* //full-storage-image-bak//: a backup copy of //storage-image//
**Hot changes can be applied in bulk with:**
pdsh -w node[01-14] "dnf install -y nano"
==== Custom Spack Packages ====
Spack can manage custom executables. The example below creates a simple //hello-world// package:
* **Create an executable**
mkdir -p /tmp/dummy-bin &&
cat > /tmp/dummy-bin/hello-world << EOF
#!/bin/bash
echo "Hello from my custom binary managed by Spack!"
EOF
chmod +x /tmp/dummy-bin/hello-world
* **Pack the executable**
tar \
-czf /tmp/dummy-software-1.0.tar.gz \
-C /tmp/dummy-bin \
hello-world
* **Create a local Spack repository**
mkdir -p /opt/spack/repos &&
spack repo create \
/opt/spack/repos/local_repo \
local_repo &&
spack repo add \
/opt/spack/repos/local_repo/spack_repo/local_repo
* **Copy the archive hash**
sha256sum /tmp/dummy-software-1.0.tar.gz
* **Create a package file**
spack create \
--name dummy-software \
file:///tmp/dummy-software-1.0.tar.gz
Insert the hash into the generated version line, for example //version('1.0.0', sha256='')//.
* **Install the package**
spack install dummy-software &&
module load Core/dummy-software &&
hello-world
==== Backups ====
* Configurations and overrides can be backed up in encrypted form (see //secrets.txt// for the password) to Bioengineering Department NextCloud:
dir=~/Documents/bioeng_data/darwin_assets
assets=/root/assets
ssh darwin_root "
mkdir -p '$assets'
tar -czpf '$assets'/ood.tar.gz \
/var/www/ood/public/custom.css \
/usr/share/ondemand-dex/web/themes/ondemand/styles.css \
/etc/ood/config/ondir=~/Documents/bioeng_data/darwin_assets
assets=/root/assets
ssh darwin_root "
mkdir -p '$assets'
tar -czpf '$assets'/ood.tar.gz \
/var/www/ood/public/custom.css \
/usr/share/ondemand-dex/web/themes/ondemand/styles.css \
/etc/ood/config/ondemand.d/ondemand.yml \
/etc/ood/config/nginx_stage.yml \
2>/dev/null
tar -czpf '$assets'/apps.tar.gz \
/var/www/ood/apps/sys \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/passwd/templates/index.html \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/app.py \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/static/js/custom.js \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/templates/osusers_modal.html \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/static/base/css/custom.css \
/etc/ood/config/apps \
/etc/selinux/local \
2>/dev/null
tar -czpf '$assets'/nginx.tar.gz \
/etc/nginx \
2>/dev/null
tar -czpf '$assets'/letsencrypt.tar.gz \
/etc/letsencrypt \
2>/dev/null
tar -czpf '$assets'/dokuwiki.tar.gz \
/var/www/dokuwiki \
2>/dev/null
tar -czpf '$assets'/grafana.tar.gz \
/etc/grafana/grafana.ini \
/var/lib/grafana \
/usr/local/bin/slurm-job-names-collector.sh \
/usr/local/sbin/grafana-sync-authenticated-team \
/etc/systemd/system/grafana-sync-authenticated-team.service \
/etc/systemd/system/grafana-sync-authenticated-team.timer \
2>/dev/null
tar -czpf '$assets'/slurm.tar.gz \
/trinity/shared/etc/slurm \
/usr/local/sbin/slurm-sync-users \
/etc/default/slurm-sync-users \
/etc/systemd/system/slurm-sync-users.service \
/etc/systemd/system/slurm-sync-users.timer \
2>/dev/null
tar -czpf '$assets'/nut.tar.gz \
/etc/nut \
/etc/systemd/system/prometheus-nut-exporter.service \
/trinity/local/etc/prometheus_server/file_sd/other/nut_exporter.yml \
2>/dev/null
tar -czpf '$assets'/cryosparc.tar.gz \
/etc/systemd/system/cryosparc.service \
/trinity/structbio_home/cryosparcuser/lanes \
/trinity/structbio_home/cryosparcuser/cryosparc_worker/config.sh \
2>/dev/null
tar -czpf '$assets'/raid0.tar.gz \
/trinity/images/compute-image/usr/local/sbin/mount-scratch-raid.sh \
/trinity/images/compute-image/etc/systemd/system/mount-scratch-raid.service \
2>/dev/null
tar -czpf '$assets'/netconsole.tar.gz \
/etc/logrotate.d/netconsole \
/usr/local/sbin/netconsole-receiver \
/etc/rsyslog.d/netconsole-6666.conf \
/etc/systemd/system/netconsole-receiver.service \
2>/dev/null
"
scp -q \
darwin_root:"$assets"/ood.tar.gz \
darwin_root:"$assets"/apps.tar.gz \
darwin_root:"$assets"/letsencrypt.tar.gz \
darwin_root:"$assets"/nginx.tar.gz \
darwin_root:"$assets"/dokuwiki.tar.gz \
darwin_root:"$assets"/grafana.tar.gz \
darwin_root:"$assets"/slurm.tar.gz \
darwin_root:"$assets"/nut.tar.gz \
darwin_root:"$assets"/cryosparc.tar.gz \
darwin_root:"$assets"/raid0.tar.gz \
darwin_root:"$assets"/netconsole.tar.gz \
"$dir"
for f in "$dir"/*.tar.gz; do
gpg --batch --yes \
--symmetric \
--cipher-algo AES256 \
--compress-algo none \
--passphrase-file ~/.darwin_backup_password \
"$f" &&
rm "$f"
done
bak_dir="$dir"_baks
n=$(ls "$bak_dir"/darwin_assets_bak*.tar.gz 2>/dev/null \
| sed -E 's/.*bak([0-9]+)\.tar.gz/\1/' \
| sort -n | tail -1)
n=$(( ${n:-0} + 1 ))
tar -czpf "$bak_dir/darwin_assets_bak$n.tar.gz" \
-C "$(dirname "$dir")" "$(basename "$dir")"
demand.d/ondemand.yml \
/etc/ood/config/nginx_stage.yml \
2>/dev/null
tar -czpf '$assets'/apps.tar.gz \
/var/www/ood/apps/sys \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/passwd/templates/index.html \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/app.py \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/static/js/custom.js \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/templates/osusers_modal.html \
/trinity/local/ondemand/trinityx-ood-2.0.1770215387/users/static/base/css/custom.css \
/etc/ood/config/apps \
/etc/selinux/local \
2>/dev/null
tar -czpf '$assets'/nginx.tar.gz \
/etc/nginx \
2>/dev/null
tar -czpf '$assets'/letsencrypt.tar.gz \
/etc/letsencrypt \
2>/dev/null
tar -czpf '$assets'/dokuwiki.tar.gz \
/var/www/dokuwiki \
2>/dev/null
tar -czpf '$assets'/grafana.tar.gz \
/etc/grafana/grafana.ini \
/var/lib/grafana \
/usr/local/bin/slurm-job-names-collector.sh \
/usr/local/sbin/grafana-sync-authenticated-team \
/etc/systemd/system/grafana-sync-authenticated-team.service \
/etc/systemd/system/grafana-sync-authenticated-team.timer \
2>/dev/null
tar -czpf '$assets'/slurm.tar.gz \
/trinity/shared/etc/slurm \
/usr/local/sbin/slurm-sync-users \
/etc/default/slurm-sync-users \
/etc/systemd/system/slurm-sync-users.service \
/etc/systemd/system/slurm-sync-users.timer \
2>/dev/null
tar -czpf '$assets'/nut.tar.gz \
/etc/nut \
/etc/systemd/system/prometheus-nut-exporter.service \
/trinity/local/etc/prometheus_server/file_sd/other/nut_exporter.yml \
2>/dev/null
tar -czpf '$assets'/cryosparc.tar.gz \
/etc/systemd/system/cryosparc.service \
/trinity/structbio_home/cryosparcuser/lanes \
/trinity/structbio_home/cryosparcuser/cryosparc_worker/config.sh \
2>/dev/null
tar -czpf '$assets'/raid0.tar.gz \
/trinity/images/compute-image/usr/local/sbin/mount-scratch-raid.sh \
/trinity/images/compute-image/etc/systemd/system/mount-scratch-raid.service \
2>/dev/null
tar -czpf '$assets'/netconsole.tar.gz \
/etc/logrotate.d/netconsole \
/usr/local/sbin/netconsole-receiver \
/etc/rsyslog.d/netconsole-6666.conf \
/etc/systemd/system/netconsole-receiver.service \
2>/dev/null
"
scp -q \
darwin_root:"$assets"/ood.tar.gz \
darwin_root:"$assets"/apps.tar.gz \
darwin_root:"$assets"/letsencrypt.tar.gz \
darwin_root:"$assets"/nginx.tar.gz \
darwin_root:"$assets"/dokuwiki.tar.gz \
darwin_root:"$assets"/grafana.tar.gz \
darwin_root:"$assets"/slurm.tar.gz \
darwin_root:"$assets"/nut.tar.gz \
darwin_root:"$assets"/cryosparc.tar.gz \
darwin_root:"$assets"/raid0.tar.gz \
darwin_root:"$assets"/netconsole.tar.gz \
"$dir"
for f in "$dir"/*.tar.gz; do
gpg --batch --yes \
--symmetric \
--cipher-algo AES256 \
--compress-algo none \
--passphrase-file ~/.darwin_backup_password \
"$f" &&
rm "$f"
done
bak_dir="$dir"_baks
n=$(ls "$bak_dir"/darwin_assets_bak*.tar.gz 2>/dev/null \
| sed -E 's/.*bak([0-9]+)\.tar.gz/\1/' \
| sort -n | tail -1)
n=$(( ${n:-0} + 1 ))
tar -czpf "$bak_dir/darwin_assets_bak$n.tar.gz" \
-C "$(dirname "$dir")" "$(basename "$dir")"
To unpack a backup archive:
tar -xzpf darwin_assets_bak1.tar.gz
To decrypt archived files (the password is in //secrets.txt//):
for f in darwin_assets/*.tar.gz.gpg; do
gpg --batch \
--passphrase-file ~/.darwin_backup_password \
--decrypt \
"$f" > "${f%.gpg}"
done