Archives mensuelles : octobre 2014

Configuration d’un poste client diskless

Dans ce tuto, je vais expliquer comment préparer un poste client diskless afin de le rendre accessible via un serveur netboot. Je me suis aidé du logiciel VirtualBox où j’ai, dans un premier temps, installé Linux Mint 17 Mate 32 bits, fait toutes les mises à jours, créé les comptes d’utilisateurs nécessaires. Il s’agit de la même méthode dans le cas d’une distribution Ubuntu 14.04.

Je me suis largement inspiré de ce tuto pour la suite des événements : http://shitwefoundout.com/wiki/Diskless_ubuntu

Pour la partie serveur, c’est ici.

Voici pour la configuration du client (à faire en root, sudo su -) :

Empêcher que la carte réseau soit gérée par networkmanager, en éditant /etc/network/interfaces :

iface eth0 inet manual

Mise en place de aufs et génération du ramdisk de démarrage :

Editer /etc/initramfs-tools/initramfs.conf et modifier ces paramètres :

MODULES=netboot
BOOT=nfs

Ajouter ceci à la fin du fichier /etc/initramfs-tools/modules :

aufs

Créez le dossier suivant et copiez-y le module de aufs :

mkdir /etc/initramfs-tools/scripts/modules
cp /lib/modules/$(uname -r)/kernel/ubuntu/aufs/aufs.ko /etc/initramfs-tools/scripts/modules/

Editez ce fichiers : /etc/initramfs-tools/scripts/init-bottom/00_aufs_init

#!/bin/sh -e

case $1 in
  prereqs)
    exit 0
    ;;
esac

for x in $(cat /proc/cmdline); do
  case $x in
    root=*)
      ROOTNAME=${x#root=}
      ;;
    aufs=*)
      UNION=${x#aufs=}
        case $UNION in
          LABEL=*)
            UNION="/dev/disk/by-label/${UNION#LABEL=}"
            ;;
          UUID=*)
            UNION="/dev/disk/by-uuid/${UNION#UUID=}"
            ;;
        esac
      ;;
  esac
done

echo "Union=$UNION"

if [ -z "$UNION" ]; then
    exit 0
fi

modprobe -b aufs && echo "OK: modprobe -b aufs" || echo "ERR: modprobe -b aufs"

# make the mount points on the init root file system
mkdir /aufs /ro /rw && echo "OK: mkdir /aufs /ro /rw" || echo "ERR: mkdir /aufs /ro /rw"

# mount read-write file system
if [ "$UNION" = "tmpfs" ]; then
  mount -t tmpfs rw /rw -o noatime,mode=0755 && echo "OK:  mount -t tmpfs rw /rw -o noatime,mode=0755 " ||
echo "ERR:  mount -t  tmpfs rw /rw -o noatime,mode=0755"
else
  mount $UNION /rw -o noatime
fi

# move real root out of the way
mount --move ${rootmnt} /ro && echo "OK: mount --move ${rootmnt} /ro" || echo "ERR: mount --move ${rootmnt} /ro"

mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro && echo "OK: mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro" ||
echo  "ERR: mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro"

# test for mount points on union file system
[ -d /aufs/ro ] || mkdir /aufs/ro
[ -d /aufs/rw ] || mkdir /aufs/rw

mount --move /ro /aufs/ro && echo "OK: mount --move /ro /aufs/ro" || echo "ERR: mount --move /ro /aufs/ro"
mount --move /rw /aufs/rw && echo "OK: mount --move /rw /aufs/rw" || echo "ERR: mount --move /rw /aufs/rw"

# strip fstab off of root partition
grep -v $ROOTNAME /aufs/ro/etc/fstab > /aufs/etc/fstab

mount --move /aufs /root && echo "OK: mount --move /aufs /root" || echo "ERR: mount --move /aufs /root"

exit 0

Et attribuez-lui les bonnes permissions :

chmod 0775 /etc/initramfs-tools/scripts/init-bottom/00_aufs_init

Créons maintenant le nouveau ramdisk en le plaçant dans /root :

update-initramfs -k $ (uname -r) -c -b /root/

Adaptons ensuite /etc/fstab : (Lisez cet article pour le swap diskless)

# Pour le boot :
proc        /proc    proc    defaults    0    0
/dev/nfs    /        nfs     defaults    0    0

# Pour le swap :
/dev/nbd0   none     swap    sw          0    0

# Pour les mises à jour futur de l'image :
/       /mnt/os      none       bind        0     0

Copions maintenant l’installation complète sur le serveur netboot :

mkdir /mnt/os
mount /mnt/os
rsync -avP /mnt/os/* 192.168.8.3:/srv/linuxmint/.

Voilà. La dernière commande peux-être utilisée à tout moment par la suite pour effectuer une mise à jour / adaptation de la distribution stockée dans le serveur.

Configuration d’un serveur linux netboot pour clients diskless

Dans cet article, je vais vous expliquer comment j’ai mis en place un serveur Debian 7 Wheezy permettant de démarrer des stations diskless (130 dans mon cas) en Linux Ubuntu 14.04 et Linux Mint 17

Sur mon serveur (ip 192.168.8.3/24) j’ai installé les paquets suivants :

apt-get install isc-dhcp-server tftpd-hpa nfs-kernel-server syslinux

Configuration du serveur dhcp ( /etc/dhcp/dhcpd.conf ), ajouter ceci à la fin (dans mon cas, réseau 192.168.8.0/24, router 192.168.8.1, dns 192.168.8.3, netboot 192.168.8.3) :

# cnet.local
subnet 192.168.8.0 netmask 255.255.255.0 {
authoritative;
option domain-name-servers 192.168.8.3;
option domain-name "cnet.local";
option broadcast-address 192.168.8.255;
option subnet-mask 255.255.255.0;
option routers 192.168.8.1;
max-lease-time 172800;
default-lease-time 86400;
range 192.168.8.100 192.168.8.199;
next-server 192.168.8.3;
filename = "pxelinux.0";
}

Configuration du serveur de netbook tftpd ( /etc/default/tftpd-hpa ) :

# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/boot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

Créer le répertoire de stockage et lui donner les bons droits :

mkdir -p /srv/boot
chown nobody:nogroup /srv/boot
chmod 777 /srv/boot

Mise en place de syslinux :

cp /usr/lib/syslinux/pxelinux.0 /srv/boot/.
cp /usr/lib/syslinux/menu.c32 /srv/boot/.
mkdir /srv/boot/pxelinux.cfg

Création du menu de démarrage ( /srv/boot/pxelinux.cfg/default ) :

DEFAULT menu.c32
TIMEOUT 100
ONTIMEOUT Ubuntu14
PROMPT 0
MENU TITLE PXE Boot
ALLOWOPTIONS 1
menu width 80
menu rows 15
MENU TABMSGROW 24
MENU MARGIN 10
NOESCAPE 1

LABEL BootLocal
localboot 0
TEXT HELP
Boot to local hdd
ENDTEXT

LABEL Ubuntu14
MENU LABEL Ubuntu 14.04 (32-bit) DISKLESS
KERNEL ubuntu14/vmlinuz-3.13.0-37-generic
APPEND boot=nfs root=/dev/nfs nfsroot=192.168.8.3:/srv/ubuntu_14.04,ro initrd=ubuntu14/initrd.img-3.13.0-37-generic ip=dhcp aufs=tmpfs quiet splash
TEXT HELP
Boot Ubuntu 14.04 DISKLESS
ENDTEXT

LABEL Mint17
MENU LABEL Linux Mint 17 DISKLESS
KERNEL mint/vmlinuz-3.13.0-24-generic
APPEND boot=nfs root=/dev/nfs nfsroot=192.168.8.3:/srv/linuxmint,ro initrd=mint/initrd.img-3.13.0-24-generic ip=dhcp aufs=tmpfs
TEXT HELP
Boot Mint 17 DISKLESS
ENDTEXT

Préparation du stockage des installations clientes :

mkdir /srv/ubuntu_14.04
mkdir /srv/boot/ubuntu14
mkdir /srv/linuxmint
mkdir /srv/boot/mint

Configuration du serveur nfs ( /etc/exports ) :

/srv/ubuntu_14.04 *(ro,async,no_root_squash,no_subtree_check,no_all_squash)
/srv/linuxmint *(ro,async,no_root_squash,no_subtree_check,no_all_squash)

A ce stade, je vous conseil un reboot du serveur car le serveur tftpd ne se relance pas convenablement suite au changement de la configuration.

Il ne reste plus qu’au suivre l’article sur la mise en place d’un poste client…

Mise en place d’une swap par le réseau en nbd

Dans le cadre d’une configuration d’un réseau de 130 postes en diskless Ubuntu 14.04  bootant à partir d’un serveur NFS et PXE en Debian Wheezy, voici comment j’ai mis en place un serveur swap via le protocol NBD en m’inspirant très largement du projet ltsp.

1. Côté serveur :
Debian 7, ip 192.168.8.169

Installation du serveur NBD :

apt-get install nbd-serveur

Fichier de configuration /etc/nbd-server/conf.d/swap.conf :

[swap]
 exportname = /tmp/nbd-swap/%s
 prerun = nbdswapd %s
 postrun = rm -f %s

Créer le fichier /usr/bin/nbdswapd (largement inspiré mais modifié de celui de base fourni par le paquet lstp-server-standalone)

# Generates a swap file to be exported with nbd-server.
 #
 # When called with no parameters, it assumes that it was ran from inetd,
 # and it launches nbd-server in order to serve it.
 # An inetd configuration line like the following is needed in that case:
 # 9572 stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/nbdswapd
 #
 # When called with one parameter, it assumes that it was ran from nbd-server,
 # so it just creates the specified swap file and exits.
 # The nbd-server configuration section is expected to look similar to this:
 # [swap]
 # exportname = /tmp/nbd-swap/%s
 # prerun = nbdswapd %s
 # postrun = rm -f %s
 # Fail on error, to notify nbd-server that the swap file wasn't created.
 set -e
 # Default sparse swapfile size, in MB
 SIZE=512
 # Default to running mkswap
 RUN_MKSWAP=true
 # Allow overriding the defaults from a configuration file
 if [ -f /etc/ltsp/nbdswapd.conf ]; then
 . /etc/ltsp/nbdswapd.conf
 fi
 # Abort if liveimg
 if grep -q "liveimg" /proc/cmdline; then
 exit 1
 fi
 SWAP="$1"
 SWAPDIR=/tmp/nbd-swap
 test -d "$SWAPDIR" || mkdir -p "$SWAPDIR"
 # generate the swap file
 dd if=/dev/zero of="$SWAP" bs=1M count=0 seek="$SIZE" 2> /dev/null
 chmod 600 "$SWAP"
 if [ "$RUN_MKSWAP" = "true" ]; then
 mkswap "$SWAP" > /dev/null
 fi

On le rend exécutable :

chmod +x /usr/bin/nbdswapd

La partie serveur est terminée. Par défaut, les fichiers swap se trouverons dans /tmp/nbd-swap/ip.du.client et feront une taille de 512 mb. Si vous désirez des autres paramètres, il suffira d’adapter le fichier /usr/bin/nbdswapd

2. Côté client

Installer le client nbd :

apt-get install nbd-client

Configuration du fichier client ( /etc/nbd-client ) , modif en rouge :

# If you don't want to reconfigure this package after installing, uncomment
 # the following line:
 #AUTO_GEN="n"
 # If you don't want the init script to kill nbd-client devices that aren't
 # specified in this configuration file, set the following to "false":
 KILLALL="false"
 # Note that any statical settings in this file will be preserved
 # regardless of the setting of AUTO_GEN, so its use is only recommended
 # if you set things in a dynamical way (e.g., through a database)
 #
 # Name of the first used nbd /dev-entry:
 NBD_DEVICE[0]=/dev/nbd0
 #
 # Type; s=swap, f=filesystem (with entry in /etc/fstab), r=raw (no other setup
 # than to run the client)
 NBD_TYPE[0]=s
 #
 # The host on which the nbd-server process is running
 NBD_HOST[0]=192.168.8.169
 # (IP du serveur)
 # The port on which this client needs to connect. Optional for
 # new-style exports (which use a single port, and export names).
 NBD_PORT[0]=
 #
 # The name of the export. Required for new-style exports.
 NBD_NAME[0]=swap
 #
 # Any extra parameters you would want to specify
 NBD_EXTRA[0]=-persist
 # The second networked block device could look like:
 # NBD_DEVICE[1]=/dev/nbd1
 # NBD_TYPE[1]="f"
 # NBD_HOST[1]="localhost"
 # NBD_NAME[1]="disk1"
 #
 # You can add as many as you want, but don't skip any number in the variable
 # names, or the initscript will fail.

Il faut également ajouter ceci dans le fichier /etc/fstab (afin que le reboot / shutdown se passe correctement ) :

/dev/nbd0   none     swap    sw          0    0

Un reboot plus tard, tout devrais fonctionner…