Installation de la tête du cluster H2 (2008)
From NBSWiki
Contents |
Introduction
Ce document s'avère être les notes d'installation détaillées de H2, le nouveau cluster au LIVIA (automne 2008).
Conventions
Pour simplifier notre tâches, certains aslias sont utilisées. Entre autres:
| Code: nodemerge, le emerge pour les noeuds |
alias nodemerge='ROOT=/tftproot/nfsroot/x86_64/ emerge' |
Ceci crées la nouvelle commande "nodemerge" qui perment de faire un emerge qui s'appliquera directement dans le noeud (ref: la doc de emerge).
Partition
H2 possèdes 2 disques de 1TB à mettre en RAID1: les partitions sont telles que suivent (boot, swap et root, dans l'ordre):
/dev/sd[ab]1 1 25 200781 fd Linux raid autodetect (200MB) /dev/sd[ab]2 26 999 7823655 fd Linux raid autodetect (8GB) /dev/sd[ab]3 1000 121601 968735565 fd Linux raid autodetect (923GB)
fdisk
livecd ~ # fdisk /dev/sda Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x559b5d0d. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. The number of cylinders for this disk is set to 121601. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-121601, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-121601, default 121601): +200M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (26-121601, default 26): Using default value 26 Last cylinder or +size or +sizeM or +sizeK (26-121601, default 121601): +8G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (1000-121601, default 1000): Using default value 1000 Last cylinder or +size or +sizeM or +sizeK (1000-121601, default 121601): Using default value 121601 Command (m for help): p Disk /dev/sda: 1000.2 GB, 1000204886016 bytes 255 heads, 63 sectors/track, 121601 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x559b5d0d Device Boot Start End Blocks Id System /dev/sda1 1 25 200781 83 Linux /dev/sda2 26 999 7823655 83 Linux /dev/sda3 1000 121601 968735565 83 Linux Command (m for help): t Partition number (1-4): 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): fd Changed system type of partition 2 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): fd Changed system type of partition 3 to fd (Linux raid autodetect) Command (m for help): p Disk /dev/sda: 1000.2 GB, 1000204886016 bytes 255 heads, 63 sectors/track, 121601 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x559b5d0d Device Boot Start End Blocks Id System /dev/sda1 1 25 200781 fd Linux raid autodetect /dev/sda2 26 999 7823655 fd Linux raid autodetect /dev/sda3 1000 121601 968735565 fd Linux raid autodetect Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Et on copie le tout sur sdb avec:
sfdisk -d /dev/sda | sfdisk /dev/sdb
Résultat:
livecd ~ # fdisk -l /dev/sd[ab] Disk /dev/sda: 1000.2 GB, 1000204886016 bytes 255 heads, 63 sectors/track, 121601 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x559b5d0d Device Boot Start End Blocks Id System /dev/sda1 1 25 200781 fd Linux raid autodetect /dev/sda2 26 999 7823655 fd Linux raid autodetect /dev/sda3 1000 121601 968735565 fd Linux raid autodetect Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes 255 heads, 63 sectors/track, 121601 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 1 25 200781 fd Linux raid autodetect /dev/sdb2 26 999 7823655 fd Linux raid autodetect /dev/sdb3 1000 121601 968735565 fd Linux raid autodetect
RAID
Création des devices MD
Il faut créer les devices:
for i in 0 1 2; do mknod /dev/md$i b 9 $i; done
Ce qui donne:
livecd ~ # ll /dev/md* brw-r--r-- 1 root root 9, 0 Oct 16 05:36 /dev/md0 brw-r--r-- 1 root root 9, 1 Oct 16 05:36 /dev/md1 brw-r--r-- 1 root root 9, 2 Oct 16 05:36 /dev/md2
Initialisation
Ici on n'a que 2 disques, dont toutes les partition vont être en RAID1 (oui, même le SWAP, sinon le système crash si le swap meurt):
for i in 0 1 2; do mdadm --create --verbose /dev/md$i --level=1 --raid-devices=2 /dev/sd[ab]$((i+1)); done
Résultat:
livecd ~ # for i in 0 1 2; do mdadm --create --verbose /dev/md$i --level=1 --raid-devices=2 /dev/sd[ab]$((i+1)); done mdadm: size set to 200704K mdadm: array /dev/md0 started. mdadm: size set to 7823552K mdadm: array /dev/md1 started. mdadm: size set to 968735488K mdadm: array /dev/md2 started.
Formattage des disques
boot
mke2fs /dev/md0
swap
mkswap /dev/md1
root
mkreiserfs /dev/md2
Mount des disques
livecd ~ # mount /dev/md2 /mnt/gentoo/ livecd ~ # mkdir /mnt/gentoo/boot livecd ~ # mount /dev/md0 /mnt/gentoo/boot/ livecd ~ # df -h /mnt/gentoo/ /mnt/gentoo/boot/ Filesystem Size Used Avail Use% Mounted on /dev/md/2 924G 33M 924G 1% /mnt/gentoo /dev/md/0 190M 1.6M 179M 1% /mnt/gentoo/boot
Installation de Gentoo
Le reste de l'installation est identique à la documentation officielle de Gentoo, mis à part l'utilisation d'un STAGE 3 personnalisé, issu du projet Google Summer of Code 2008 (Gentoo Clustering LiveCD) pour inclure les librairies et le GCC plus récent (permettant l'utilisation de la parallélisation OpenMP)....sauf pour quelques exceptions.
make.conf
Le coeur de toute installation Gentoo, voici le make.conf de notre installation. Il est primordial que le fichier soit correctement créé avant l'installation de quelque paquetage que ce soit! Notes sur les USE flags:
PBS: Actives l'utilisation de Torque pour gérer les ressources du cluster beep: Un nanane qui fait un beep à l'ajout d'un noeud au cluster -X -ipv6 -opengl -gtk -gnome: Absolument nécessaire pour installer une tête de cluster minimaliste. -fam: File Access Monitor: cette option utilisée par les paquetage gnome cause des interdépendances circulaires qui brisent portage.
| File: /etc/make.conf |
# Please consult /etc/make.conf.example for a more detailed example. CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer -mfpmath=sse" CXXFLAGS="$CFLAGS" # WARNING: Changing your CHOST is not something that should be done lightly. # Please consult http://www.gentoo.org/doc/en/change-chost.xml before changing. CHOST="x86_64-pc-linux-gnu" # These are the USE flags that were used in addition to what is provided by the # profile used for building. USE="-X -ipv6 -fam -opengl -gtk -gnome mmx sse sse2 beep pbs " PORT_LOGDIR=/var/log/portage MAKEOPTS="-j5" GENTOO_MIRRORS="http://letdie.ele.etsmtl.ca/pub/gentoo/ http://adelie.polymtl.ca/" PORTAGE_NICENESS=-1 AUTOCLEAN="yes" PORTAGE_TMPFS="/dev/shm" PORTAGE_TMPDIR="/dev/shm" FEATURES="buildpkg fixpackages sandbox ccache parallel-fetch" CCACHE_SIZE="2G" CLEAN_DELAY=1 LINGUAS="fr en pt es" PORTDIR_OVERLAY="/usr/local/portage" |
Packages de base
emerge -qv gentoo-sources grub reiserfsprogs \ ufed screen distcc dstat gentoolkit dhcpcd \ net-fs/nfs-utils syslog-ng vixie-cron sys-apps/pciutils \ ntp vim app-portage/eix app-portage/conf-update lshw -n
kernel
On triche, on recopies la configuration de kernel d'une machine quasiment identique pour sauver du temps:
(CHROOT) livecd linux # scp -P 2222 kyron.neuralbs.com:/usr/src/linux/.config ./ Password: .config 100% 48KB 48.4KB/s 00:00
Ensuite on valide la configuration:
make oldconfig
Les seules notes particulières par rapport à la configuration du kernel sont:
- CONFIG_HZ=100
- Compiler les pilotes suivants dans le kernel:
- contrôleur des disques (ICH8),
- raid1
- ext2,ext3,reiserfs
Tout le reste peut être compilé en module et, pour la plus part, ultérieurement.
On compile et on installe:
make -j5 && make modules_install && make install
GRUB
Installer sur tous les disques
ref: Gentoo-wiki Il faut installer GRUB sur tous les disques du RAID comme ça n'importe quel disque peut booter. On va forcer /dev/sd[ab] comme étant (hd0) pour que chacun puisse être le HDD de boot:
grub --no-floppy device (hd0) /dev/sda root (hd0,0) setup (hd0) device (hd0) /dev/sdb root (hd0,0) setup (hd0)
Grub.conf
On va explicitement dire au kernel quels disques font quel RAID (md1) pour ne pas se retrouver avec un root sur "md5".
title=Gentoo root (hd1,0) kernel /vmlinuz root=/dev/md2 md=2,/dev/sda3,/dev/sdb3
Configs (pre reboot)
Mot de passe root
passwd
Modifier les configuration de base dans /etc
| File: /etc/fstab |
/dev/md0 /boot ext2 noauto,noatime 1 2 /dev/md2 / reiserfs noatime 0 1 /dev/md1 none swap sw 0 0 /dev/cdrom /mnt/cdrom auto noauto,ro 0 0 shm /dev/shm tmpfs nodev,nosuid,noexec 0 0 |
vi /etc/fstab vi /etc/rc.conf vi /etc/ntp.conf
Nous spécifions "server ntp.etsmtl.ca"
Il est important de mettre la ligne suivante dans /etc/hosts, sinon nous allons avoir des problèmes avec ldap et autres:
| File: /etc/hosts |
127.0.0.1 localhost ::1 localhost 142.137.135.128 h2.gentoo.local h2 |
On continue la config dans /etc/conf.d
cd /etc/conf.d vi rc
Nous spécifions RC_PARALLEL_STARTUP="yes".
vi hostname
Nous spécifions HOSTNAME="H2".
vi clock
Keep ETH devices as they were detected
Pour conserver l'ordre et le nom des cartes réseau, c'est particulièrement critique pour une tête de cluster. À exécuter en dehors du CHROOT d'installation (dans le root du CD):
cp /etc/udev/rules.d/70-persistent-net.rules /mnt/gentoo/etc/udev/rules.d/
rc-update
for I in sshd syslog-ng vixie-cron net.eth0 ntpd ntp-client; do rc-update add $I default; done
Reboot
Il est maintenant temps de redémarrer le serveur. Ça n'est pas strictement obligatoire mais, si quoi que ce soit ne fonctionne pas, ce sera plus difficile à régler plus tard (question de mémoire humaine).
Image système des noeuds
Nous allons utiliser "dev-util/catalyst" pour créer les images des noeuds et app-portage/layman pour quelques paquetages additionnels:
emerge -q dev-util/catalyst app-portage/layman
catalyst
Ensuite nous configurons catalyst pour créer des images adaptés à notre matériel. le ficheir /etc/catalyst/catalystrc permet de définir certaines variables d'environnement qui seront aussi ajoutés au fichier make.conf de l'image créée.
| File: /etc/catalyst/catalystrc |
#!/bin/bash # This is an example catalystrc. As such, it doesn't actually *do* anything. # Uncomment the following to increase the number of threads used to compile. export MAKEOPTS="-j5 -s" #export PORTAGE_TMPFS="/dev/shm" #export PORTAGE_TMPDIR="/dev/shm/" export FEATURES="parallel-fetch -fixpackages" #export ACCEPT_KEYWORDS="~amd64" export CFLAGS="-march=nocona -O2 -pipe -fomit-frame-pointer -mfpmath=sse" export PBS_SERVER_NAME="master.gentoo.local" |
layman
Il faut modifier quelques configurations:
echo "source /usr/local/portage/layman/make.conf" >> /etc/make.conf
Modifier le paramètre storage dans /etc/layman/layman.cfg comme suit:
storage : /usr/local/portage/layman
Nous pouvons maintenant installer les sources additionnelles de paquetage (qui seront disponible pour catalyst _et_ le système en cours grâce à la modification du /etc/make.conf)
layman -S layman -a sunrise layman -a science
Composantes HPC/Clustering
Nous allons utiliser quelques composantes du Gentoo LiveCD overlay pour créer la tête H2 plus facilement. Notament:
- Le "overlay" qui contient les paquetages spécialisés pour le clustering,
- l'arborescence "/etc/portage" permettant d'utiliser des logiciels normalement masqués.
Pour ce faire, il faut installer "git" (contrôle de source) afin d'aller chercher les sources sur le site mentionné ci-dessus.
emerge dev-util/git mkdir -p /var/git && cd /var/git git clone git://git.overlays.gentoo.org/proj/clustering-livecd
Il s'agit ensuite d'ajouter le répertoire des paquetages personnalisés aux spécifications de portage (dans /etc/make.conf):
PORTDIR_OVERLAY="/usr/local/portage /var/git/clustering-livecd/overlay"
Nous allons aussi recopier le répertoire des paquetages démasqués/inclus explicitement par le projet:
cp -a /var/git/clustering-livecd/profiles/hpc-clustering/ /etc/portage/
Création de l'image des noeuds
Dans la section antécédente, nous avons installé catalyst pour nous permettre de créer l'image(s) des noeuds. Il s'agit de suivre les instructions dans /var/git/clustering-livecd/NFSroot-HOWTO (qui implique aussi le LiveCD-HOWTO) et, au besoin, de personnaliser les fichiers de spécifications dans /var/git/clustering-livecd/catalyst/nfsroot/2008.0/specs/amd64/. La création des stages 1 à 3 est particulièrement longue et sensible aux modifications de l'arborescence de référence (portage snapshot). Il est donc fortement recommandé de conserver le "snapshot" en question ainsi que tous les fichiers sources (qui se retrouveront dans /usr/portage/distfiles. Ce dernier répertoire est configurable et il est probablement sage de ne pas effacer son contenu arbitrairement (surtout si le système prend de l'âge et q'il est possible que les code source originaux ne soient plus disponibles).
Seules les étapes non décrites dans le LiveCD-HOWTO et le NFSroot-HOWTO sont détaillés ci-dessous:
snapshot
cd /var/tmp/catalyst/snapshots wget http://letdie.ele.etsmtl.ca/pub/gentoo/snapshots/portage-20081014.tar.bz2
Stage 3 (seed)
mkdir -p /var/tmp/catalyst/builds/drobbins/ cd /var/tmp/catalyst/builds/drobbins/ wget http://www.funtoo.org/linux/amd64/funtoo-amd64-2008.10.13/stage3-amd64-2008.10.13.tar.bz2
NOTE: il faut éditer les fichiers stage1.spec du nfsroot pour que ce 'seed' concorde.
Go!
Nous allons utiliser l'utilitaire screen étant donné que le processus tend à être long:
screen -S nfsroot
cd /var/git/clustering-livecd/catalyst/nfsroot/2008.0/specs/amd64/
for I in stage1.spec stage2.spec stage3.spec nfsroot_stage4.spec
do
catalyst -f $I
done
Si tout s'est bien passé, le fichiers /var/tmp/catalyst/builds/default/stage4-amd64-nfsroot.tar.bz2 devrait avoir été créé.
Installation de l'image
Il s'agit maintenant de décompresser l'image dans le répertoire qui servira de référence pour démarrer les noeuds:
| Code: installation NFS root |
mkdir -p /tftproot/nfsroot/x86_64 cd /var/tmp/catalyst/builds/default/ tar -xjf stage4-amd64-nfsroot.tar.bz2 -C /tftbroot/nfsroot/x86_64 |
Configuration de la tête
Configuration de l'authentification
Premièrement, nous devons installer openldap et net-nds/ldap-auth-0.1 avec USE="-minimal authmaster" (ce qui devrait être mis dans le fichier make.conf)
emerge openldap net-nds/ldap-auth-0.1
Il s'agit d'éditer le fichier suivant:
| File: /etc/gentoo/ldap_auth.conf |
CONFIG_OK="yes" LDAP_SERVER="H2.gentoo.local" DOMAIN="gentoo.local" DOMAIN_DESC="H2, LIVIA's 2008 cluster head server" OU="cluster" OU_DESC="Clustering department branch. All units defined under this branch are for use by the cluster" USERS_OU="users" USERS_OU_DESC="Cluster specific Users" GROUPS_OU="groups" GROUPS_OU_DESC="Cluster specific Groups" LDAP_ADMIN_DN="admin" LDAP_ADMIN_DN_PWD="your_password_here" ADMIN_DN="root" ADMIN_DN_DESC="root account (under LDAP)" ADMIN_GROUP_DN="wheel" ADMIN_GROUP_DN_DESC="Users in this group can freely modify the LDAP directory at will" [[ -z $ROOT ]] && ROOT="/" LDIF_OUT="./create_db.ldif" LDIF_OUT_KEEP="yes" |
Et de lancer les commandes suivantes:
emerge --config ldap-auth nodemerge --config ldap-auth
Créer un utilisateur
Après ce, il est maintenant possible d'ajouter un utilisateur avec la commande suivante:
diradm useradd -m eric
Changer son mot de passe
diradm usermod -p 1212patatepwel eric
Configuration des daemons pour les root NFS
Avant de pouvoir lancer la configuration automatique, il faut assigner une adresse IP fixe à ETH1, la carte réseau du cluster:
| File: /etc/conf.d/net |
config_eth1=( "192.168.0.1/24" ) |
Et ajouter eth1 dans la liste de démarrage et la démarrer:
| Code: ajout eth1 |
ln -s ln -s /etc/init.d/net.lo /etc/init.d/net.eth1 /etc/init.d/net.eth1 start |
La configuration est automatisée par le ebuild sys-cluster/beowulf-head-0.1 et le fichier de configuration suivant:
| File: /etc/gentoo/cluster.conf |
CONFIG_OK="yes"
PUBETH="eth0"
CLUSTER_ETH="eth1"
LOCALDOMAINNAME="gentoo.local"
TFTPROOT="/tftproot"
PXELINUX="${TFTPROOT}/pxelinux.0"
NFSROOT="${TFTPROOT}/nfsroot/$(uname -m)"
RWEXPORTS="/home "
ROEXPORTS=""
NFSEPORTOPTS="no_root_squash,async,no_subtree_check"
NFSMOUNTOPTS="rsize=8192,wsize=8192,soft,intr,actimeo=120,timeo=14"
NODENP=4
|
| Code: auto-configuration daemons |
emerge --config sys-cluster/beowulf-head-0.1 |
Le résultat est le suivant:
Configuring pkg... * dnsmasq added to runlevel default * Service dnsmasq starting * Service dnsmasq started * netmount already installed in runlevel 'default'; skipping * WARNING: netmount has already been started. * nfs added to runlevel default * Service nfs starting * Service rpc.statd starting * Service portmap starting * Service portmap started * Service rpc.statd started /var/lib/nfs/state: bad file size, setting state = 1 Backgrounding to notify hosts... * Service nfs started * pbs_server added to runlevel default * Service pbs_server starting Missing config file /var/spool/torque/server_priv/nodes * ERROR: pbs_server failed to start * pbs_sched added to runlevel default * Service pbs_sched starting grep: /var/spool/torque/server_priv/queues/*: No such file or directory No queues have been defined yet. * ERROR: pbs_sched failed to start * Since we just changed a resolvconf file, * it is required that your main NIC interface be restarted * or at least a renewal of dhcp be triggered. * ie: with dhcpcd one calls `dhcpcd -n eth0` * You will then want to restart dnsmasq.
Configuration Torque
Au moment de l'écriture de ce document, quelques "bugs" restent à régler dans le ebuild de beowulf-head. Présentement, il faut lancer la configuration de Torque manuellement:
Pour le serveur
| Code: Config Torque |
USE=server emerge --config torque |
Qui donne:
Configuring pkg... * Configuring Torque ... * Using /var/spool/torque as the pbs homedir * Using h2.gentoo.local as the pbs_server [ ok ]
Pour l'image des noeuds
| Code: Config Torque |
nodemerge --config torque |
Qui donne:
Configuring pkg... * Configuring Torque ... * Using /var/spool/torque as the pbs homedir * Using h2.gentoo.local as the pbs_server [ ok ]
Configuration OpenMPI
Simplement lancer les deux commandes suivantes:
| Code: Installation OpenMPI |
emerge -q openmpi nodemerge -qk openmpi |
