Last active
June 27, 2025 06:09
-
-
Save Yesveer/d80c1946603221666295e7730de78118 to your computer and use it in GitHub Desktop.
Install Slurm Cluster on single node.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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