Skip to content

Instantly share code, notes, and snippets.

@devpilot
Forked from Yesveer/slurm-single-node.sh
Created June 23, 2025 07:42
Show Gist options
  • Select an option

  • Save devpilot/e64aa5f1627289e01c5d9a4ca23f99a6 to your computer and use it in GitHub Desktop.

Select an option

Save devpilot/e64aa5f1627289e01c5d9a4ca23f99a6 to your computer and use it in GitHub Desktop.
Install Slurm Cluster on single node.
#!/bin/bash
set -x
set -e
set -o pipefail
# install apt packeges
insatll_package() {
export DEBIAN_FRONTEND=noninteractive
sudo apt update && sudo apt upgrade -y
sudo apt-get install build-essential fakeroot devscripts equivs mariadb-server python3-mysqldb munge -y
echo "✅ Required packages installed successfully."
}
# Create slurm DB
create_slurm_db() {
sudo mysql <<EOF
CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'slurm@123';
grant all on slurm_acct_db.* TO 'slurm'@'localhost' identified by 'slurm@123' with grant option;
create database slurm_acct_db;
\q
EOF
echo "Slurm MySQL user and database created successfully."
}
# # Download and install Slurm
# download_and_install_slurm() {
# cd ~/
# wget https://download.schedmd.com/slurm/slurm-24.11.5.tar.bz2
# tar -xaf slurm-24.11.5.tar.bz2
# cd slurm-24.11.5/
# sudo mk-build-deps -i debian/control
# debuild -b -uc -us
# ./configure
# sudo make install
# }
download_and_install_slurm() {
local VERSION=${1:-24.11.5}
cd ~/
wget "https://download.schedmd.com/slurm/slurm-${VERSION}.tar.bz2"
tar -xaf "slurm-${VERSION}.tar.bz2"
cd "slurm-${VERSION}/"
sudo mk-build-deps -i debian/control
debuild -b -uc -us
./configure
sudo make install
}
# Permissions, create users and directories
set_permissions_and_directories() {
sudo useradd -r -M -s /bin/false slurm
sudo mkdir /var/spool/slurm
sudo mkdir /var/log/slurm/
sudo touch /var/log/slurm/slurmctld.log
sudo chmod 777 /var/log/slurm/slurmctld.log
sudo chmod 777 /var/spool/slurm
sudo mkdir -p /var/spool/slurm/ctld/statesave
sudo head -c 32 /dev/urandom | base64 | sudo tee /var/spool/slurm/ctld/statesave/jwt_hs256.key > /dev/null
sudo chmod 600 /var/spool/slurm/ctld/statesave/jwt_hs256.key
sudo chown slurm:slurm /var/spool/slurm/ctld/statesave/jwt_hs256.key
sudo useradd --system --no-create-home --shell /usr/sbin/nologin slurmrestd
}
# Create slurmdbd.conf if it does not exist
create_slurm_db_file() {
# Define the target path
CONF_DIR="/usr/local/etc"
CONF_FILE="$CONF_DIR/slurmdbd.conf"
# Create the directory if it doesn't exist
sudo mkdir -p "$CONF_DIR"
# Create and write to the config file
sudo tee "$CONF_FILE" > /dev/null <<EOF
#
# Example slurmdbd.conf file.
#
# See the slurmdbd.conf man page for more information.
#
# Archive info
#ArchiveJobs=yes
#ArchiveDir="/tmp"
#ArchiveSteps=yes
#ArchiveScript=
#JobPurge=12
#StepPurge=1
#
# Authentication info
AuthType=auth/munge
#AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info
DbdAddr=localhost
DbdHost=localhost
#DbdPort=7031
SlurmUser=slurm
#MessageTimeout=300
DebugLevel=verbose
#DefaultQOS=normal,standby
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=localhost
#StoragePort=1234
StoragePass=slurm@123
StorageUser=slurm
StorageLoc=slurm_acct_db
AuthAltTypes=auth/jwt
AuthAltParameters=jwt_key=/var/spool/slurm/ctld/statesave/jwt_hs256.key
EOF
# Set appropriate permissions
sudo chown slurm:slurm "$CONF_FILE"
sudo chmod 600 "$CONF_FILE"
sudo chown slurm:slurm /usr/local/etc/slurmdbd.conf
echo "✅ slurmdbd.conf created at $CONF_FILE"
}
# Create slurm.conf file with dynamic hostname & CPU count
create_slurm_conf() {
# Get current hostname
NODE_NAME=$(hostname)
CPU_COUNT=$(nproc)
# Define config path
CONFIG_PATH="/usr/local/etc/slurm.conf"
# Create the configuration file with dynamic hostname
cat <<EOF | sudo tee $CONFIG_PATH > /dev/null
ClusterName=single-node-cluster
SlurmctldHost=${NODE_NAME}
MpiDefault=none
ProctrackType=proctrack/linuxproc
ReturnToService=2
SlurmctldPort=6817
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
StateSaveLocation=/var/spool/slurm
SlurmdPidFile=/var/run/slurmd.pid
SlurmctldPidFile=/var/run/slurmctld.pid
SwitchType=switch/none
TaskPlugin=task/affinity
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=${NODE_NAME}
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log
#DebugLevel=debug
#AuthAltTypes=auth/jwt
#AuthAltParameters=jwt_key=/var/spool/slurm/ctld/statesave/jwt_hs256.key
AuthType=auth/munge
AuthAltTypes=auth/jwt
AuthAltParameters=jwt_key=/var/spool/slurm/ctld/statesave/jwt_hs256.key
# Compute Node
NodeName=${NODE_NAME} CPUs=${CPU_COUNT} RealMemory=2000 State=UNKNOWN
PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
EOF
# Set permissions (optional but recommended)
sudo chmod 644 $CONFIG_PATH
echo "✅ slurm.conf created at $CONFIG_PATH with hostname '${NODE_NAME}'"
}
# Start Slurm services and enable them on boot
enable_slurm_services() {
cd ~/slurm-24.11.5/etc/
sudo cp slurmctld.service.in /etc/systemd/system/slurmctld.service
sudo cp slurmd.service.in /etc/systemd/system/slurmd.service
sudo cp slurmdbd.service.in /etc/systemd/system/slurmdbd.service
sudo cp slurmrestd.service.in /etc/systemd/system/slurmrestd.service
cd ~/
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable slurmctld
sudo systemctl enable slurmd
sudo systemctl enable slurmdbd
sudo systemctl enable slurmrestd
#sudo systemctl start slurmctld
SERVICE_FILE="/etc/systemd/system/slurmctld.service"
sudo sed -i 's|@sbindir@/slurmctld|/usr/local/sbin/slurmctld|g' "$SERVICE_FILE"
#sudo systemctl start slurmd
SERVICE_FILE="/etc/systemd/system/slurmd.service"
sudo sed -i 's|@sbindir@/slurmd|/usr/local/sbin/slurmd|g' "$SERVICE_FILE"
#sudo systemctl start slurmdbd
SERVICE_FILE="/etc/systemd/system/slurmdbd.service"
sudo sed -i 's|@sbindir@/slurmdbd|/usr/local/sbin/slurmdbd|g' "$SERVICE_FILE"
#sudo systemctl start slurmrestd
SERVICE_FILE="/etc/systemd/system/slurmrestd.service"
sudo sed -i 's|@sbindir@/slurmrestd|/usr/local/sbin/slurmrestd|g' "$SERVICE_FILE"
sudo sed -i 's|@SLURMRESTD_PORT@|6820|g' "$SERVICE_FILE"
if ! grep -q "^User=slurm" "$SERVICE_FILE"; then
sudo sed -i '/^\[Service\]/a User=slurmrestd' "$SERVICE_FILE"
echo "✅ Added 'User=slurm' to $SERVICE_FILE"
else
echo "ℹ️ User=slurm already present in $SERVICE_FILE"
fi
if ! grep -q "^Group=slurm" "$SERVICE_FILE"; then
sudo sed -i '/^\[Service\]/a Group=slurmrestd' "$SERVICE_FILE"
echo "✅ Added 'Group=slurmrestd' to $SERVICE_FILE"
else
echo "ℹ️ Group=slurm already present in $SERVICE_FILE"
fi
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl start slurmctld slurmctld slurmd slurmdbd slurmrestd
echo "✅ Slurm services enabled and started successfully."
}
# Main script execution
read -p "Enter Slurm version to install [default: 24.11.5]: " SLURM_VERSION
SLURM_VERSION=${SLURM_VERSION:-24.11.5}
echo "Start apt package installation..."
insatll_package
echo "Start creating Slurm database..."
create_slurm_db
echo "Start downloading and installing Slurm (version: $SLURM_VERSION)..."
download_and_install_slurm "$SLURM_VERSION"
echo "Setting permissions and creating directories..."
set_permissions_and_directories
echo "Creating slurmdbd.conf file..."
create_slurm_db_file
echo "Creating slurm.conf file"
create_slurm_conf
echo "Enabling and starting Slurm services..."
enable_slurm_services
echo "✅ Slurm Installed successfully."
echo "Ready to use Slurm on this single-node setup."
echo " Ready to go make crazy things with Slurm! 🚀"
echo "Happy Hacking"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment