Installation de la tête du cluster H2 (2008)

From NBSWiki

Jump to: navigation, search

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:

  1. Le "overlay" qui contient les paquetages spécialisés pour le clustering,
  2. 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
Personal tools