Installation d'un serveur NetHack 5.0.0 (branche cybernethack) avec dgamelaunch sous LXD
1er novembre 2026
Ce tutoriel monte un serveur NetHack public accessible en SSH. Le jeu est compilé depuis la branche cybernethack de HackTechDev/Nethack500_Lubuntu2604, sous l'utilisateur util01, et installé dans ~/nethack500. Il est ensuite servi par dgamelaunch dans un chroot, à l'intérieur d'un conteneur LXD.
Vue d'ensemble
Joueur (ssh -p 2222 nethack@ton-serveur)
│
Hôte Lubuntu 26.04 ── proxy LXD tcp:2222 → conteneur:22
│
Conteneur LXD « nethack »
│ sshd → compte « nethack » sans mot de passe → ForceCommand dgamelaunch
│
├── /home/util01/Nethack500_Lubuntu2604 sources (branche cybernethack)
├── /home/util01/nethack500 jeu installé (usage local de util01)
├── /home/util01/bin/nethack script de lancement local
│
└── /opt/nethack/
├── dgamelaunch binaire setuid root
├── dgamelaunch.conf
└── chroot/
├── home/util01/nethack500/ copie du jeu servie aux joueurs
├── dgldir/ comptes, ttyrec, dumplogs, rcfiles
└── lib/, usr/, etc/ bibliothèques, terminfo, locales
Le chemin /home/util01/nethack500 est gravé dans le binaire à la compilation. Le chroot reproduit donc exactement ce chemin. Dans le chroot, les parties tournent sous l'uid de util01, propriétaire des fichiers du jeu.
Qui lance quoi :
| Étape | Utilisateur |
|---|---|
| 1. Installation de LXD | ton compte sur l'hôte |
| 2. Conteneur LXD | ton compte sur l'hôte |
| 3. Paquets | root (conteneur) |
| 4. Compilation et installation de NetHack | util01 |
| 5. Compilation de dgamelaunch | util01, installation en root |
| 6 à 8. Chroot, configuration, SSH | root (conteneur) |
| 9. Mise à jour | hôte, util01 puis root |
1. Installation de LXD
- Installer le socle snap
core, puis LXD en version LTS 6.0, et vérifier la version installée :
util01@ordilocal:~$ sudo snap install core
util01@ordilocal:~$ sudo snap install lxd --channel=6.0/stable
util01@ordilocal:~$ lxd --version
6.10.1 LTS
- Si un ancien LXD (4.0 par exemple) est déjà installé,
snap installne fait rien : le mettre à jour à la place :
util01@ordilocal:~$ sudo snap refresh lxd --channel=6.0/stable
- Initialiser LXD avec les réglages par défaut (pont réseau
lxdbr0et stockage) :
util01@ordilocal:~$ sudo lxd init --minimal
2. Conteneur LXD (sur l'hôte)
- Ajouter l'utilisateur
util01dans le groupelxd:
util01@ordilocal:~$ sudo usermod -aG lxd util01
util01@ordilocal:~$ newgrp lxd
util01@ordilocal:~$ lxc list
-
Se déconnecter et se reconnecter.
-
Créer le conteneur
nethackà partir de l'image Ubuntu 26.04 :
util01@ordilocal:~$ lxc launch ubuntu:26.04 nethack
Launching nethack
util01@ordilocal:~$
- Limiter le conteneur à 2 processeurs et 1 Gio de mémoire :
util01@ordilocal:~$ lxc config set nethack limits.cpu 2
util01@ordilocal:~$ lxc config set nethack limits.memory 1GiB
- Vérifier que le conteneur tourne et qu'il a reçu une adresse IP :
util01@ordilocal:~$ lxc list
+---------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| nethack | RUNNING | 10.42.86.225 (eth0) | fd42:30fa:ec0d:4af5:216:3eff:fe96:af86 (eth0) | CONTAINER | 0 |
+---------+---------+---------------------+-----------------------------------------------+-----------+-----------+
util01@ordilocal:~$
- Rediriger le port 2222 de l'hôte vers le port SSH (22) du conteneur :
util01@ordilocal:~$ lxc config device add nethack ssh-nethack proxy listen=tcp:0.0.0.0:2222 connect=tcp:127.0.0.1:22
Device ssh-nethack added to nethack
util01@ordilocal:~$
- Ouvrir un shell root dans le conteneur
nethack:
util01@ordilocal:~$ lxc exec nethack -- bash
root@nethack:~#
- Créer l'utilisateur de compilation
util01dans le conteneur :
root@nethack:~# adduser util01
3. Paquets (root, dans le conteneur)
- Mettre le système à jour et installer les outils de compilation (NetHack et dgamelaunch), SQLite, le serveur SSH, rsync et quelques utilitaires :
root@nethack:~# apt update && apt full-upgrade -y
root@nethack:~# apt install -y git gcc make curl gettext libncurses-dev \
build-essential autoconf automake bison flex \
libsqlite3-dev sqlite3 openssh-server rsync \
mc vim btop
4. Installation de NetHack 5.0.0
4.1 Récupérer la branche
- Passer sous l'utilisateur
util01:
root@nethack:~# su - util01
util01@nethack:~$
- Créer le dossier
~/bin, qui recevra le script de lancement du jeu :
util01@nethack:~$ mkdir -p ~/bin
- Cloner la branche
cybernethackdu dépôt :
util01@nethack:~$ git clone --branch cybernethack https://github.com/HackTechDev/Nethack500_Lubuntu2604.git
- Entrer dans le dossier des sources :
util01@nethack:~$ cd Nethack500_Lubuntu2604
util01@nethack:~/Nethack500_Lubuntu2604$
4.2 Installer dans ~/nethack500
Par défaut, le dépôt installe dans ~/nh/install/.... Deux fichiers sont à adapter :
-
sys/unix/hints/linux.500: chemins compilés dans le jeu -
install.sh: dossier dont il sauvegarde et restaure les parties -
Modifier les chemins d'installation dans le fichier hints : jeu dans
~/nethack500, script de lancement dans~/bin:
util01@nethack:~/Nethack500_Lubuntu2604$ sed -i \
-e 's|^PREFIX=\$(wildcard ~)/nh/install$|PREFIX=/home/util01|' \
-e 's|^HACKDIR=\$(PREFIX)/games/lib/nethackdir$|HACKDIR=/home/util01/nethack500|' \
-e 's|^SHELLDIR = \$(PREFIX)/games$|SHELLDIR = /home/util01/bin|' \
sys/unix/hints/linux.500
- Adapter
install.shau nouveau dossier, pour la sauvegarde et la restauration des parties et pour les messages de fin :
util01@nethack:~/Nethack500_Lubuntu2604$ sed -i \
-e 's|^HACKDIR="\$HOME/nh/install/games/lib/nethackdir"$|HACKDIR="$HOME/nethack500"|' \
-e 's|~/nh/install/games/nethack|~/bin/nethack|g' \
install.sh
- Vérifier que seuls ces deux fichiers ont été modifiés :
util01@nethack:~/Nethack500_Lubuntu2604$ git diff --stat
install.sh | 8 ++++----
sys/unix/hints/linux.500 | 6 +++---
2 files changed, 7 insertions(+), 7 deletions(-)
util01@nethack:~/Nethack500_Lubuntu2604$
- Contrôler les chemins pris en compte (lignes 421 à 430) :
util01@nethack:~/Nethack500_Lubuntu2604$ grep -nE '^(PREFIX|HACKDIR|SHELLDIR|VARDIR)' sys/unix/hints/linux.500
411:PREFIX=$(abspath $(NHSROOT))
413:HACKDIR=$(PREFIX)/playground
416:VARDIRPERM = 0700
421:PREFIX=/home/util01
422:HACKDIR=/home/util01/nethack500
423:SHELLDIR = /home/util01/bin
424:VARDIRPERM = 0755
430:VARDIR = $(HACKDIR)
util01@nethack:~/Nethack500_Lubuntu2604$
4.3 Compiler et installer
- Compiler et installer le jeu avec les interfaces tty et curses :
util01@nethack:~/Nethack500_Lubuntu2604$ ./install.sh --console
Le script configure le build avec hints/linux.500, télécharge Lua, compile, sauvegarde les parties existantes, installe, puis copie config/nethackrc dans ~/.nethackrc.
- Lancer le jeu en local pour le tester, en partie normale puis en mode debug :
util01@nethack:~/Nethack500_Lubuntu2604$ ~/bin/nethack # partie normale
util01@nethack:~/Nethack500_Lubuntu2604$ ~/bin/nethack -D # mode debug (util01 est dans WIZARDS)
5. Installation de dgamelaunch
- Revenir dans le dossier personnel de
util01:
util01@nethack:~/Nethack500_Lubuntu2604$ cd ~
util01@nethack:~$
- Cloner les sources de dgamelaunch :
util01@nethack:~$ git clone https://github.com/paxed/dgamelaunch.git
- Entrer dans le dossier des sources :
util01@nethack:~$ cd dgamelaunch
- Configurer la compilation : comptes SQLite, mémoire partagée, emplacement du fichier de config, et options GCC tolérantes pour ce code ancien :
util01@nethack:~/dgamelaunch$ ./autogen.sh --enable-sqlite --enable-shmem \
--with-config-file=/opt/nethack/dgamelaunch.conf \
CFLAGS="-O2 -std=gnu17 -fcommon \
-Wno-error=implicit-function-declaration \
-Wno-error=incompatible-pointer-types \
-Wno-error=int-conversion"
- Compiler dgamelaunch :
util01@nethack:~/dgamelaunch$ make
- Revenir en root :
util01@nethack:~/dgamelaunch$ exit
logout
root@nethack:~#
- Créer le dossier d'installation. Le binaire doit être setuid root pour entrer dans le chroot, puis il abandonne ses privilèges :
root@nethack:~# mkdir -p /opt/nethack
- Installer le binaire en setuid root (droits 4755) :
root@nethack:~# install -o root -g root -m 4755 /home/util01/dgamelaunch/dgamelaunch /opt/nethack/
6. Le chroot (root)
6.1 Script de base
- Aller dans le dossier des sources de dgamelaunch :
root@nethack:~# cd /home/util01/dgamelaunch
- Ouvrir le script de création du chroot dans un éditeur :
root@nethack:/home/util01/dgamelaunch# vim dgl-create-chroot
- Remplacer les variables en tête du script par :
CHROOT="/opt/nethack/chroot/"
USRGRP="util01:util01"
COMPRESSBIN="/bin/gzip"
SQLITE_DBFILE="/dgldir/dgamelaunch.db"
NETHACKBIN="/home/util01/nethack500/nethack"
NH_PLAYGROUND_FIXED="/home/util01/nethack500/"
NHSUBDIR="/home/util01/nethack500/"
NH_VAR_PLAYGROUND="/home/util01/nethack500/"
- Neutraliser la ligne
mknoddu script : la création de fichiers spéciaux est interdite dans un conteneur non privilégié ;/dev/urandomsera fourni par LXD plus bas :
root@nethack:/home/util01/dgamelaunch# sed -i 's/^mknod urandom c 1 9$/: # urandom fourni par LXD (unix-char)/' dgl-create-chroot
- Corriger le script pour qu'il crée les dossiers parents du chemin du jeu (
mkdir -p) :
root@nethack:/home/util01/dgamelaunch# sed -i 's|^mkdir "\$CHROOT/\$NHSUBDIR"$|mkdir -p "$CHROOT/$NHSUBDIR"|' dgl-create-chroot
- Vérifier que la correction est en place :
root@nethack:/home/util01/dgamelaunch# grep -n 'mkdir -p "\$CHROOT/\$NHSUBDIR"' dgl-create-chroot
157:mkdir -p "$CHROOT/$NHSUBDIR"
- Supprimer un éventuel chroot créé lors d'un essai précédent, pour repartir propre :
root@nethack:/home/util01/dgamelaunch# rm -rf /opt/nethack/chroot
- Lancer la création du chroot :
root@nethack:/home/util01/dgamelaunch# ./dgl-create-chroot
Setting up chroot in /opt/nethack/chroot
Creating SQLite database at /dgldir/dgamelaunch.db
Copying /bin/gzip to bin
Edit /opt/nethack/chroot/etc/dgamelaunch.conf to suit your needs.
Copied text editors 'ee' and 'virus' to chroot.
Copying /home/util01/nethack500/nethack
Copying NetHack playground stuff.
cp: cannot stat '/home/util01/nethack500/*.lev': No such file or directory
root@nethack:/home/util01/dgamelaunch#
Le script s'arrête sur cp: cannot stat '*.lev' : c'est normal en 5.0, ces fichiers de la 3.4.3 n'existent plus.
Ce qu'il n'a pas fait (copie complète du jeu, bibliothèques, terminfo) est complété à la main à l'étape 6.2.
- Quitter le conteneur pour revenir sur l'hôte :
root@nethack:~# exit
exit
util01@ordilocal:~$
- Depuis l'hôte, créer
/dev/urandomdans le chroot (mknodest interdit dans un conteneur non privilégié) :
util01@ordilocal:~$ lxc config device add nethack chroot-urandom unix-char source=/dev/urandom path=/opt/nethack/chroot/dev/urandom mode=0666
Device chroot-urandom added to nethack
util01@ordilocal:~$
- Vérifier que
/dev/urandomexiste bien dans le chroot :
util01@ordilocal:~$ lxc exec nethack -- ls -l /opt/nethack/chroot/dev/urandom
crw-rw-rw- 1 root root 1, 9 Nov 1 08:46 /opt/nethack/chroot/dev/urandom
util01@ordilocal:~$
Si le chroot est un jour supprimé (rm -rf /opt/nethack/chroot), /dev/urandom et /dev/null disparaissent avec lui : un lxc restart nethack sur l'hôte les fait recréer par LXD.
6.2 Compléments pour NetHack 5.0
Le script date de NetHack 3.4.3 : on copie à la main le jeu complet et ce dont il a besoin.
- Revenir dans le conteneur en root :
util01@ordilocal:~$ lxc exec nethack -- bash
root@nethack:~#
- Définir les variables de chemin : racine du chroot (
C) et dossier du jeu (NH) :
root@nethack:~# C=/opt/nethack/chroot
root@nethack:~# NH=/home/util01/nethack500
- Copier le jeu complet dans le chroot (binaire, nhdat, fr.mo, aides traduites, sysconf…) :
root@nethack:~# mkdir -p $C$NH
root@nethack:~# rsync -a $NH/ $C$NH/
- Créer les répertoires de dgamelaunch et les donner à
util01:
root@nethack:~# mkdir -p $C/dgldir/{inprogress-nh500,userdata,ttyrec,rcfiles} $C/mail
root@nethack:~# chown -R util01:util01 $C/dgldir $C/mail $C/home/util01
- Copier dans le chroot les bibliothèques utilisées par le binaire :
root@nethack:~# for lib in $(ldd $NH/nethack | grep -o '/[^ ]*'); do
mkdir -p "$C$(dirname $lib)"; cp -n "$lib" "$C$lib"
done
- Vérifier qu'aucune bibliothèque ne manque :
root@nethack:~# for lib in $(ldd $NH/nethack | grep -o '/[^ ]*'); do
[ -e "$C$lib" ] && echo "OK $lib" || echo "MANQUE $lib"
done
OK /usr/lib/x86_64-linux-gnu/libncursesw.so.6
OK /usr/lib/x86_64-linux-gnu/libtinfo.so.6
OK /usr/lib/x86_64-linux-gnu/libm.so.6
OK /usr/lib/x86_64-linux-gnu/libc.so.6
OK /lib64/ld-linux-x86-64.so.2
root@nethack:~#
- Copier terminfo, le fuseau horaire et les locales UTF-8 (symboles Unicode, accents) :
root@nethack:~# mkdir -p $C/usr/share $C/usr/lib $C/lib $C/etc
root@nethack:~# cp -a /usr/share/terminfo $C/usr/share/
root@nethack:~# [ -d /lib/terminfo ] && cp -a /lib/terminfo $C/lib/
root@nethack:~# cp /etc/localtime $C/etc/
root@nethack:~# cp -a /usr/lib/locale $C/usr/lib/
6.3 sysconf du serveur
Le sysconf du chroot est indépendant de celui de util01. On le règle pour le serveur.
Tous les joueurs tournent sous l'uid util01. Avec CHECK_PLNAME=1, WIZARDS est comparé au pseudo dgamelaunch et non au compte Unix. Sans cette option, WIZARDS=util01 donnerait le mode debug à tous les joueurs.
- Réserver le mode debug à ton pseudo (ici
sam), comparerWIZARDSau pseudo, et enregistrer un récapitulatif texte de chaque partie :
root@nethack:~# sed -i -e 's|^WIZARDS=.*|WIZARDS=sam|' -e 's|^#CHECK_PLNAME=1|CHECK_PLNAME=1|' \
-e 's|^#DUMPLOGFILE=.*|DUMPLOGFILE=/dgldir/userdata/%n/dumplog/%t.txt|' $C$NH/sysconf
- Vérifier ces réglages (
SHELLERSdoit rester commenté, pour que personne ne puisse ouvrir un shell avec!) :
root@nethack:~# grep -nE '^#?(WIZARDS|CHECK_PLNAME|DUMPLOGFILE|SHELLERS)=' $C$NH/sysconf
16:WIZARDS=sam
33:#SHELLERS=
47:CHECK_PLNAME=1
141:DUMPLOGFILE=/dgldir/userdata/%n/dumplog/%t.txt
- Pour d'autres réglages, ouvrir le
sysconfdu chroot dans un éditeur :
root@nethack:~# vim $C$NH/sysconf
6.4 Test direct
Les options GDBPATH et GREPPATH servent à produire un rapport de débogage avec gdb si le jeu plante.
Sur le serveur, il vaut mieux les désactiver plutôt que de copier grep et gdb dans le chroot, et garder seulement la trace par la libc.
- Définir la variable
S, chemin dusysconfdu chroot :
root@nethack:~# S=/opt/nethack/chroot/home/util01/nethack500/sysconf
- Commenter
GDBPATHetGREPPATH, et désactiver la trace par gdb :
root@nethack:~# sed -i -e 's|^GDBPATH=|#GDBPATH=|' \
-e 's|^GREPPATH=|#GREPPATH=|' \
-e 's|^PANICTRACE_GDB=1|PANICTRACE_GDB=0|' "$S"
- Vérifier les lignes modifiées :
root@nethack:~# grep -nE 'GDBPATH|GREPPATH|PANICTRACE' "$S"
152:# if the program is built with the PANICTRACE compile-time option enabled.
153:# By default PANICTRACE is enabled if (NH_DEVEL_STATUS != NH_STATUS_RELEASED),
159:#GDBPATH=/usr/bin/gdb
160:#GREPPATH=/bin/grep
163:PANICTRACE_GDB=0
164:PANICTRACE_LIBC=2
root@nethack:~#
- Redéfinir la variable
C(racine du chroot) :
root@nethack:~# C=/opt/nethack/chroot
- Copier
libgcc_s.so.1dans le chroot ; la libc en a besoin pour afficher la trace en cas de crash :
root@nethack:~# for f in /lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1; do
[ -e "$f" ] && mkdir -p "$C$(dirname $f)" && cp "$f" "$C$f"
done
- Créer un
/etc/passwdminimal dans le chroot (root et util01), pour que le jeu trouve le nom du compte :
root@nethack:~# grep -E '^(root|util01):' /etc/passwd > $C/etc/passwd
- Créer de même un
/etc/groupminimal :
root@nethack:~# grep -E '^(root|util01):' /etc/group > $C/etc/group
- Quitter le conteneur pour revenir sur l'hôte :
root@nethack:~# exit
- Depuis l'hôte, créer
/dev/nulldans le chroot :
util01@ordilocal:~$ lxc config device add nethack chroot-null unix-char source=/dev/null path=/opt/nethack/chroot/dev/null mode=0666
Device chroot-null added to nethack
- Revenir dans le conteneur en root :
util01@ordilocal:~$ lxc exec nethack -- bash
- Lancer le jeu dans le chroot sous l'utilisateur
util01, pour tester :
root@nethack:~# LANG=C.UTF-8 chroot --userspec=util01:util01 /opt/nethack/chroot /home/util01/nethack500/nethack -u test
7. Configuration de dgamelaunch (root)
7.1 Fichiers de départ
- Aller dans le dossier des sources de dgamelaunch :
root@nethack:~# cd /home/util01/dgamelaunch
root@nethack:/home/util01/dgamelaunch#
- Définir la variable
C(racine du chroot) :
root@nethack:/home/util01/dgamelaunch# C=/opt/nethack/chroot
- Copier la configuration d'exemple dans
/opt/nethack:
root@nethack:/home/util01/dgamelaunch# cp examples/dgamelaunch.conf /opt/nethack/dgamelaunch.conf
- Copier les menus et la bannière d'exemple dans le chroot :
root@nethack:/home/util01/dgamelaunch# cp examples/dgl_menu_*.txt examples/dgl-banner $C/ 2>/dev/null
- Remplacer les références à NetHack 3.4.3 par NetHack 5.0.0 et par le chemin du jeu :
root@nethack:/home/util01/dgamelaunch# sed -i -e 's|/nh343/nethack|/home/util01/nethack500/nethack|g' \
-e 's/nh343/nh500/g' -e 's/NH343/NH500/g' -e 's/3\.4\.3/5.0.0/g' \
/opt/nethack/dgamelaunch.conf $C/dgl_menu_*.txt $C/dgl-banner
- Redéfinir la variable
C, au cas où elle aurait été perdue :
root@nethack:/home/util01/dgamelaunch# C=/opt/nethack/chroot
- Vérifier qu'il ne reste aucune référence à la 3.4.3 :
root@nethack:/home/util01/dgamelaunch# grep -nE 'nh343|NH343|3\.4\.3' /opt/nethack/dgamelaunch.conf $C/dgl_menu_*.txt $C/dgl-banner # ne doit rien afficher
- Afficher les réglages du jeu dans la configuration, pour contrôle :
root@nethack:/home/util01/dgamelaunch# grep -nE 'game_path|game_args|rc_template|rc_fmt|inprogressdir|NETHACKOPTIONS|save/' /opt/nethack/dgamelaunch.conf
256:# game_path = "/bin/nethackstub"
269:# game_args = "/bin/nethackstub",
279:# # rc_template = "/dgl-default-rcfile"
297:# inprogressdir = "%rinprogress-nethackstub/"
320: game_path = "/home/util01/nethack500/nethack"
324: game_args = "/home/util01/nethack500/nethack", "-u", "%n"
327: rc_template = "/dgl-default-rcfile.nh500"
329: rc_fmt = "%ruserdata/%n/%n.nh500rc"
331: inprogressdir = "%rinprogress-nh500/"
340: commands = cp "/nh500/var/save/%u%n.gz" "/nh500/var/save/%u%n.gz.bak",
341: # set NETHACKOPTIONS to point to the rcfile
342: setenv "NETHACKOPTIONS" "@%ruserdata/%n/%n.nh500rc",
356:# game_path = "/bin/crawlss017"
360:# game_args = "/bin/crawlss017",
367:# rc_template = "/dgl-default-rcfile.crawl"
368:# rc_fmt = "%rrcfiles/%n.crawlrc"
369:# inprogressdir = "%rinprogress-crawlss017/"
379:# game_path = "/bin/crawlss020"
383:# game_args = "/bin/crawlss020",
390:# rc_template = "/dgl-default-rcfile.crawl"
391:# rc_fmt = "/crawlss020/plr/%n/%n.crawlrc"
392:# inprogressdir = "%rinprogress-crawlss020/"
root@nethack:/home/util01/dgamelaunch#
- Récupérer l'uid et le gid de
util01dans les variablesUetG:
root@nethack:/home/util01/dgamelaunch# U=$(id -u util01); G=$(id -g util01)
- Régler le chemin du chroot, l'utilisateur sous lequel tournent les parties, le dossier des sauvegardes, et ajouter
LANGen UTF-8 :
root@nethack:/home/util01/dgamelaunch# sed -i -e 's|^chroot_path = .*|chroot_path = "/opt/nethack/chroot/"|' \
-e "s|^shed_uid = .*|shed_uid = $U|" \
-e "s|^shed_gid = .*|shed_gid = $G|" \
-e 's|/nh500/var/save/|/home/util01/nethack500/save/|g' \
-e '/setenv "NETHACKOPTIONS"/a\ setenv "LANG" "C.UTF-8",' \
/opt/nethack/dgamelaunch.conf
- Vérifier ces réglages :
root@nethack:/home/util01/dgamelaunch# sed -n '/^chroot_path/p;/^shed_[ug]id/p;338,348p' /opt/nethack/dgamelaunch.conf
chroot_path = "/opt/nethack/chroot/"
shed_uid = 1001
shed_gid = 1001
# back up savefile
commands = cp "/home/util01/nethack500/save/%u%n.gz" "/home/util01/nethack500/save/%u%n.gz.bak",
# set NETHACKOPTIONS to point to the rcfile
setenv "NETHACKOPTIONS" "@%ruserdata/%n/%n.nh500rc",
setenv "LANG" "C.UTF-8",
# set up nethack mail stuff, assuming it's compiled with it...
setenv "MAIL" "/mail/%n",
setenv "SIMPLEMAIL" "1",
# don't let the mail file grow
unlink "/mail/%n"
root@nethack:/home/util01/dgamelaunch#
- Personnaliser la bannière : date du message du jour et nom du serveur :
root@nethack:/home/util01/dgamelaunch# sed -i -e 's|"\$MOTDTIME" = "[^"]*"|"$MOTDTIME" = "2026.11.01"|' \
-e 's|"\$SERVERID" = "[^"]*"|"$SERVERID" = "$ATTR(14)NetHack 5.0 cybernethack$ATTR()"|' \
/opt/nethack/dgamelaunch.conf
- Vérifier la bannière :
root@nethack:/home/util01/dgamelaunch# grep -n 'MOTDTIME\|SERVERID' /opt/nethack/dgamelaunch.conf | head -3
54:bannervars = [ "$MOTDTIME" = "2026.11.01",
55: "$SERVERID" = "$ATTR(14)NetHack 5.0 cybernethack$ATTR()",
198:# $VERSION and $SERVERID will be replaced, as per the bannerfile above.
root@nethack:/home/util01/dgamelaunch#
7.2 Options par défaut des joueurs
On reprend la configuration du dépôt (curses, symboles Unicode), qui contient déjà OPTIONS=language:fr@cyber.
- Copier le
nethackrcdu dépôt comme modèle d'options des nouveaux joueurs :
root@nethack:/home/util01/dgamelaunch# cp /home/util01/Nethack500_Lubuntu2604/config/nethackrc $C/dgl-default-rcfile.nh500
- Rendre le modèle lisible par tous :
root@nethack:/home/util01/dgamelaunch# chmod 644 $C/dgl-default-rcfile.nh500
Chaque joueur reçoit une copie de ce fichier à l'inscription et peut la modifier depuis le menu (touche o). Les joueurs doivent avoir un terminal en UTF-8. Pour un serveur ouvert à tous, tu peux retirer les lignes symset et glyph, pour revenir à l'ASCII.
- Choisir la langue : français avec le thème cyberpunk :
root@nethack:/home/util01/dgamelaunch# LANGUE=fr@cyber
- Dans le modèle et dans les fichiers des joueurs déjà inscrits, supprimer toutes les lignes
languagepuis en ajouter une seule (les fichiers absents sont ignorés) :
root@nethack:/home/util01/dgamelaunch# for f in /opt/nethack/chroot/dgl-default-rcfile.nh500 /opt/nethack/chroot/dgldir/userdata/*/*.nh500rc; do
[ -e "$f" ] || continue
sed -i '/^OPTIONS=language:/d' "$f"
echo "OPTIONS=language:$LANGUE" >> "$f"
done
- Vérifier qu'il ne reste qu'une ligne
languagepar fichier :
root@nethack:/home/util01/dgamelaunch# grep -c '^OPTIONS=language:' /opt/nethack/chroot/dgl-default-rcfile.nh500 /opt/nethack/chroot/dgldir/userdata/*/*.nh500rc
/opt/nethack/chroot/dgl-default-rcfile.nh500:1
/opt/nethack/chroot/dgldir/userdata/sam/sam.nh500rc:1
/opt/nethack/chroot/dgldir/userdata/sammy/sammy.nh500rc:1
/opt/nethack/chroot/dgldir/userdata/test/test.nh500rc:1
root@nethack:/home/util01/dgamelaunch#
Sur une installation neuve, seul le modèle est listé.
7.3 Test local
- Lancer dgamelaunch en local pour tester le menu et une partie :
root@nethack:/home/util01/dgamelaunch# /opt/nethack/dgamelaunch -f /opt/nethack/dgamelaunch.conf
Inscription : r
Connexion : l
Jouer : p
Quitter avec #quit.
- Revenir dans le dossier personnel de root :
root@nethack:/home/util01/dgamelaunch# cd
root@nethack:~#
8. Accès SSH public (root)
- Créer le compte système
nethack, utilisé par les joueurs pour se connecter :
root@nethack:~# useradd -m -s /bin/sh nethack
- Supprimer son mot de passe, pour une connexion sans mot de passe :
root@nethack:~# passwd -d nethack
passwd: password changed.
root@nethack:~#
- Configurer sshd pour ce seul compte : mot de passe vide accepté, pas de tunnel ni de transfert, lancement forcé de dgamelaunch :
root@nethack:~# cat > /etc/ssh/sshd_config.d/50-nethack.conf <<'EOF'
Match User nethack
PasswordAuthentication yes
PermitEmptyPasswords yes
KbdInteractiveAuthentication no
PermitTTY yes
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
ForceCommand /opt/nethack/dgamelaunch -f /opt/nethack/dgamelaunch.conf
EOF
- Vérifier la syntaxe de la configuration SSH, puis redémarrer le service :
root@nethack:~# sshd -t && systemctl restart ssh
- Se connecter au serveur depuis une autre machine :
util01@ordilocal:~$ ssh -p 2222 nethack@IP-DE-L-HOTE
- Soit, dans mon cas, en local :
util01@ordilocal:~$ ssh -p 2222 nethack@192.168.1.228
9. Mettre à jour le jeu servi
Après une modification de la branche, on recompile en util01, puis on recopie le jeu dans le chroot sans toucher aux parties des joueurs ni au sysconf du serveur.
- Sur l'hôte, faire un instantané du conteneur avant la mise à jour :
util01@ordilocal:~$ lxc snapshot nethack avant-maj
- Dans le conteneur, en
util01: récupérer les modifications de la branche en gardant les deux fichiers adaptés, puis recompiler et réinstaller :
util01@nethack:~/Nethack500_Lubuntu2604$ git stash && git pull && git stash pop
util01@nethack:~/Nethack500_Lubuntu2604$ ./install.sh --console
- En root : recopier le jeu dans le chroot, sans les sauvegardes, les scores ni le
sysconfdu serveur :
root@nethack:~# rsync -a \
--exclude save --exclude record --exclude logfile --exclude xlogfile \
--exclude livelog --exclude perm --exclude sysconf \
/home/util01/nethack500/ /opt/nethack/chroot/home/util01/nethack500/
Une nouvelle version peut rendre les sauvegardes incompatibles : préviens les joueurs avant.