Comme mon travail en tant qu’administrateur système dans une société Web me fait rencontrer de nouveaux problèmes chaques jours, je me suis dit qu'il fallait que le monde profite de mes solutions :).

 

Installation d’un système nfsroot et le lancer via Grub2

Comment créer un système nfsroot linux ubuntu avec un bootloader grub2 sur machine locale.

La première idée qu’on a quand on cherche à monter un système linux en réseau, est de tout lancer par le système de PXE. Mais dans certains cas, le PXE peut être endommagé, où ne peux être reconnu au démarage par la carte mère. Dans ce genre de cas, il est nécessaire de gérer donc en local le chargement de certains fichiers indispensables au boot.

Ici je vais expliquer la marche à suivre pour pouvoir lancer un linux, stocké sur un serveur, sur une machine locale.

Dans notre cas, nous aurons aussi à monter les partitions de dossiers personnels, issus de l’ancien système en place (à savoir une partition NFS stocké sur un autre serveur local).

Première Etape : Installation du serveur debian.

Pour commencer, on doit avoir une machine de type serveur vide, que ce dernier soit connecté à Internet ainsi qu’une version CD de Debian.

Pour mon cas, Debian 6.0.

Pour commencer, évidement, on installe et configure debian sur la machine serveur. Il faut cependant le configurer selon nos besoins :

-Partitions :

-Une partition Physique « /boot » (512 Mo)

Elle stockera le système de boot du serveur. Debian étant le seul système installé sur le serveur, il est inutile d’en donner plus.

-Une partition Physique « / » (512 Mo)

C’est la racine de debian. Il faudra veiller à ce qu’elle ne soit pas trop chargée.

-Une partition Swap (2Go)

La swap est votre mémoire vive sur disque. En gros elle permet de délester la RAM en cas de surcharge. De façon général, on en configure le double de votre RAM réelle (i.e. Pour 1Go RAM, on met 2Go SWAP)

-Une partition LVM

Une partition LVM est une partition physique qui contient plusieurs partitions virtuelles. En effet, un disque dur ne peut être partitionné qu’en 4 morceaux physiques. En temps normal, sur les systèmes d’utilisations quotidiens comme Windows ou Ubuntu, quand l’on dépasse cette limite, le système prend sur lui de gérer les nouvelles partitions en LVM. Ici sous débian, c’est nous qui allons prendre ça en charge. Voici donc les partitions virtuelles contenues dans le LVM :

-Une partition « ubuntu » (16 Go)

Cette partition sera en fait la racine de notre système Ubuntu. De fait, elle contiendra aussi tout les programmes que l’on voudra installer sur le systèmes. Dans le cadre d’une utilisations de programmes simples de développement sous linux, 16Go est donc suffisant.

-Une partition « log » (4 Go)

Cette partition aura l’emplacement /var/log. C’est a dire qu’elle contiendra les logs du serveur. Il est important à noter que la partition doit avoir comme paramètres : nodev, nosuid et noexec, afin d’éviter tout scripts hostiles qui pourraient se retrouver dans les logs, et exécutés de manière non autorisé.

-Une partition « var » (2 Go)

Inutile d’épiloguer sur la partition de var.

-Une partition « usr » (2 Go)

Idem.

-Une partition « tmp » (1 Go)

Idem.

-Une partition « home » (4 Go)

La taille de votre home dépend totalement de vous. En effet, selon l’utilisation que vous voulez avoir de votre serveur, il nécessitera plus ou moins de place. Ici j’ai placé 4Go, à vous de voir.

NB : Ce sont tous des ext4 (excepté le Swap)

Une fois les partitions créées, il faut maintenant configurer leurs points de montages respectifs. Dans mon cas, j’avais oublié de le faire à la création, ce qui pose d’assez gros problèmes par la suite, donc je vous conseille de ne rien oublier à ce moment là.

Donc, pour les points de montages, l’intérêt c’est que la plupart sont radicalement explicites.

Les partitions logiques virtuelles vont avoir un nom bien particulier. Chez moi elles sont sys/home, sys/log etc…

Bref, donc les points de montage sont les suivants :

ubuntu → /srv/ubuntu

var → /var

log → /var/log (nodev,noexec,nosuid)

tmp → /tmp

home → /home

usr → /usr

Voila, une fois ces points de montages terminés, vous pouvez terminer l’installation de debian. Pensez à désactiver toutes les extensions (DHCP, Apache etc…) si vous n’en avez pas de besoins précis. Nous en utiliserons par principe on les téléchargera directement sur Internet afin d’avoir les dernières versions.

Donc, Debian est installé, on reboot, on tente un « mount » dans la console pour veiller à ce que les partitions soit bien montées, et si c’est ok, on passe a l’étape suivante.

Dans le cas où vous auriez oublié de configurer les points de montage :

Pas de panique

Ce qu’il y a de bien sous Linux, c’est qu’il y a toujours 50 façon de récupérer une erreur (mais 100 façon de les provoquer soit même).

Suivez simplement point par point cette manipulation.

Tout d’abord, si l’on a oublié de monter les partitions pour l’installation, il a forcément lui même créé et remplis les dossiers /var, /var/log etc… Problème, vous n’aviez pas réservé énormément de place pour la racine, et cette dernière, si vous continuez dans cette voie, va vite saturer.

Heureusement, j’ai une parade :

On va commencer par aller chercher nos partitions, car elle sont bien là, dans /dev/. Chez moi, elles sont toutes dans /dev/sys/ car le groupe LVM avait été nommé ainsi. Si vous ne vous souvenez plus comment vous avez créé votre groupe, vous pouvez toujours faire un grep home dans le dossier /dev, il vous trouvera votre partition dans ce fatras.

Une fois votre partition trouvé, il faut la monter, mais attention, pas de var sur le /var actuel, sinon elle sera invisible car les deux dossier (l’actuel /var et la partition var) vont se mêler.

Par conséquent, il faut y aller élément par élément.

Je vais expliquer en détail pour /var, et /var/log, il faudra ensuite l’appliquer pour les autres partitions.

NB : N’hésitez pas à vous faire une liste pour n’en oublier aucune.

Pour var :

On monte var dans /mnt.

mount /dev/sys/var /mnt

Ensuite on copie le contenu du /var original dans la partition monté.

cp /var /mnt

On démonte /mnt.

umount /mnt

Ensuite, on va monter la partition log.

mount /dev/sys/log /mnt

On copie son contenu.

cp /var/log /mnt

Et on démonte.

umount /mnt

Et on fait de même pour tout les autres.

Et voilà. Maintenant, que l’on a terminé de faire toutes nos copies, c’est là que ça va se corser, et qu’il faut être ingénieux. On aura beau configurer le fstab pour que chaque partitions prennent leur place au démarrage, elles ne feront pas plus que cohabiter, sinon marquer, les fichiers toujours présents dans les dossiers d’origine /var etc… Seulement, ces dossiers sont important, interdiction de les supprimer dés maintenant en se disant qu’ils seront de toute façon remplacés par leurs homologues partitionnés lors du redémarrage, et ceci pour plusieurs raisons ;

-Linux va vous vomir dans le crâne car les dossiers contiendront encore actuellement des processus en cours, et même si vous forcez la suppression de la plupart, les processus en cours eux, refuseront de se supprimer. C’est d’ailleurs une très bonne façon aussi de faire planter son serveur, c’est aussi suicidaire que de faire un « sudo rm -rf / ».

-Parce que vous avez peut être omis de copier quelque chose, ou qu’un fichier s’est mal copié, bref, il peut s’être passé n’importe quoi et cette solution couperai court à toute position de retrait en cas de problème.

Il va donc falloir être plus ingénieux : Une fois le redémarrage effectué, et vos partitions bien montées (vérifier avec un mount), vous allez monter votre partition / sur le /mnt.

mount / /mnt

Pourquoi ? Et bien parce qu’en montant la racine, celle ci va être montée indépendamment de toutes les autres partitions qui sont montées au système, et donc laisser apparaître les anciens /var, /home etc… d’origine.

Il vous suffira ensuite d’en supprimer les contenus (attention à ne pas supprimer les dossiers, sinon les points de montages ne pourront se faire si le dossier d’arrivée n’existe pas et ça puera la kernel panic) puis à démonter votre / du /mnt. Une fois le serveur de nouveau redémarré, vous aurez alors vos partitions correctement montée (mais aurez perdu 2h de travail par rapport à ceux qui ont penser à régler les partitions des l’installation, donc pensez y!)

Deuxième Étape : Installation du linux en debootstrap et chroot.

Avant-propos sur le debootstrap et le chroot.

Ces deux outils sont des outils très puissants, à manipuler avec précaution. Debootstrap permet d’installer un système Linux/UNIX au sein d’un autre système Linux/UNIX. Son utilité réside dans le fait d’avoir deux système distincts, sans avoir nécessairement besoin d’installer une gestion de machines virtuelles. De plus, grâce au debootstrap, il est inutile d’avoir un .iso de linux, un simple acces aux mirroirs via internet suffit. Le chroot est le complément élémentaire de debootstrap car il permet de prendre en main le système installé (l’application de chroot sur le dossier correspondant fera en sorte que la console deviendra alors la console de Ubuntu, et plus de debian).

Ici, nous allons installer via debootstrap, linux Ubuntu 11.04 à l’intérieur de notre partition /srv/ubuntu.

Installation de Ubuntu 11.04

Il faut commencer par installer sur Debian, les deux outils cité ci dessus. Jusqu’ici, rien de bien particulier. Il suffit de faire :

sudo apt-get install debootstrap dchroot

Une fois les deux outils installés, on passe aux choses sérieuses :

sudo debootstrap –-arch i386 ‘lsb_release -c -s’ /srv/ubuntu http://archive.ubuntu.com/ubuntu/

notez ici que je sélectionne l’architecture du système linux, à savoir 32bits. Vous pouvez, si vous voulez, sélectionner un système en 64bits, si votre parc informatique (les ordinateurs qui seront amenés à démarrer sur ce linux) est 100% compatible 64bits. Pour éviter les problèmes de compatibilité, je vous conseil cependant de vous en tenir au 32bits, même si cette recommandation sera obsolète d’ici quelques courtes années (car le 32bit est condamné à mort d’ici 2038 http://fr.wikipedia.org/wiki/Bug_de_l%27an_2038, ainsi que son incapacité à prendre en compte une RAM supérieurs à 3,5Go tout les systèmes sont amenés à être remplacés par des 64bits).

NB : Debootstrap accepte pas seulement les URLs, il peut aussi se lancer à partir d’un fichier. Par conséquent, on est pas soumis à la dernière version en date, ici, publié par Ubuntu, mais on peut par exemple lui soumettre une béta ou autre. Attention cependant a ne pas se méprendre sur les architectures. Si on lui précise une architecture 32bits avec une image de linux amd64, il risque de ne pas aimer.

NB 11.10 : Debootstrap n’a pas encore été mis à jour pour accueillir la 11.10, Oneiric. Il faut donc créer un script spécial qui va quand même lui permettre d’accéder aux sources. Pour ça on va dans

cd /usr/share/debootstrap/scripts/

cp natty oneiric

Et maintenant vous pouvez lancer :

debootstrap —arch amd64 ‘oneiric’ /srv/ubuntu/new/ http://archive.ubuntu.com/ubuntu/

Bref, ensuite, il faut charger certaines configurations communes de domaine de Debian jusqu’à Ubuntu. Pour ce faire on va balancer la commandes suivantes.

cp /etc/resolv.conf /srv/ubuntu/etc/resolv.conf

C’est trop anecdotique pour s’étaler dessus.

Ensuite, on va monter les partitions de /dev et de /proc depuis Debian jusqu’à Ubuntu. Ça permet de pouvoir prendre le contrôle de linux. En effet, dans l’état actuel, linux n’est pas capable de gérer ses processus et ses périphériques. En fait il est totalement impuissant. C’est pourquoi on va lui permettre d’utiliser les éléments de debian comme références.

sudo mount –-bind /dev /srv/ubuntu/dev

sudo mount -t proc /proc /srv/ubuntu/proc

Voila, linux est maintenant près pour sa prise en main. On va donc passer en chroot sur notre partition Linux fraîchement chargée (mais pas encore installée).

Pour ce faire, on va envoyer la commande suivante :

sudo chroot /srv/ubuntu

Et voilà, vous ètes dans Ubuntu. Pour faire courts, gardez à l’esprit que vous ètes à la racine de votre Ubuntu, et que donc, votre cd / vous affichera root@blahblah:/# mais qu’en réalité, du point de vue de debian, vous serez dans /srv/ubuntu. Et oui, ubuntu sera devenu la racine de votre Ubuntu.

On rajoute une partition en interne :

mount -t devpts devpts /dev/pts

Maintenant que l’on a accès a notre base Linux, il va falloir l’installer. Et oui, le debootstrap n’a fait que lui donner des éléments pour pouvoir tourner en chroot, mais votre distribution est encore loin d’être complète.

Donc une fois en chroot, et le contrôle total acquit, on installe donc Ubuntu.

Voici la serie de commande à balancer pour que l’installation se passe correctement :

apt-get update

apt-get install ubuntu-minimal ubuntu-standard ubuntu-desktop language-pack-fr language-pack-gnome-fr nfs-client

apt-get dist-upgrade

dpkg-reconfigure locales

dpkg-reconfigure console-setup

NB 11.10 : Oneiric instaure un nouveau système de gestion des services, nommé upstart. Ce dernier étant totalement incompatible avec chroot (Connexion au socket impossible), il faut donc le court-circuiter via les commandes suivantes pour terminer correctement l’installation.

dpkg-divert —local —rename —add /sbin/initctl

ln -s /bin/true /sbin/initctl

C’est un bug connu qui je l’espère sera remédié rapidement. Une fois l’installation finalisée à 100% (c’est a dire que vous quittez le chroot) définitivement, il faudra supprimer ce court-circuit sinon votre système ne démarrera jamais. Voici les commandes de suppression

Dpkg-divert —remove /sbin/initctl

rm /bin/true

Normalement, au terme de ces commandes (et d’une attente de plus ou moins 30 minute, selon votre connexion et les capacités de la machine), le système linux est installé et fin prêt à démarrer. Seulement, pour le moment, il n’est pas configuré totalement pour le nfs, même si dans l’apt-get install, on lui a précisé nfs-client, il n’est pas configuré en natif pour pouvoir tourner avec.

Il va donc falloir modifier encore quelques détails très importants.

On va donc commencer par nommé le système Ubuntu en interne. On va lui donner le nom de « nfs-ub ». C’est important pour la suite de le nommer clairement.

Donc pour le nommer on fait :

echo « nfs-ub » > /etc/hostname

Ensuite, il faut configurer la boucle IP interne :

dans le fichier /etc/hosts :

127.0.0.1 localhost

127.0.1.1 nfs-ub

Le reste doit être inchangé.

On va ensuite configurer notre utilisateur principal. Il est impératif de conserver précieusement les identifiants donnés, car même si l’on possède un système de compte à l’origine, il va y avoir une étape de vide entre le démarrage final du nfsroot et son utilisation, et c’est durant cette étape que ce compte va servir. Pour ce faire on fait :

adduser NomDeCompte

usermod -G admin -a NomDeCompte

ensuite lancer visudo

et placer

%admin ALL=(ALL) ALL

Voila, à présent, le compte créé sera un compte admin de type root, ce qui permettra aussi de pouvoir appliquer facilement toutes les configuration en root.

Courage, on en voit le bout !

Maintenant on va configurer le fstab interne à Linux. Normalement, ce dernier est pour le moment vide, dans la mesure ou ce dernier s’est installé sans vraiment connaître ses partitions (via le chroot).

Nous allons donc fixer ça :

vi /etc/fstab

# <file system> <mount point>   <type>  <options>       <dump>  <pass> 
proc            /proc           proc    defaults        0       0 
/dev/nfs        /               nfs     defaults        1       1 
none            /tmp            tmpfs   defaults        0       0 
none            /var/run        tmpfs   defaults        0       0 
none            /var/lock       tmpfs   defaults        0       0 
none            /var/tmp        tmpfs   defaults        0       0 

Maintenant que le fstab est configuré, il faut enfin placer Ubuntu en situation de se lancer en NFS. Comme dit plus haut, même si la version installé est une version NFS, elle ne se considère pas encore comme tel.

Il faut donc lui préciser.

Ça se passe dans le fichier :

vi /etc/initramfs-tools/initramfs.conf

à la ligne

BOOT=local

changer en

BOOT=nfs

et à la ligne

MODULES=most

changer en

MODULES=netboot

A partir de maintenant, la configuration du noyau linux a changé, et il va pouvoir enfin démarrer en NFS. Enfin presque, puisqu’il faut quand même reconstruire une partie du noyau :

apt-get install linux-image-generic

#dpkg-reconfigure « linux-image-‘uname -r’ »

update-initramfs -u

Et voilà, normalement après ça vous avez une image toute neuve et prête à fonctionner en nfs.

Ensuite, une dernière chose à configurer : Quand un PC client va se connecter et charger le NFS, il aura d’ores et déjà une adresse IP, donné par le DHCP au lancement de la procédure de boot. Mais si on le laisse faire, une fois linux démarré, il pourrait cherché à relancer une procédure d’acquisition d’adresse, ce qui aurai pour conséquence probable de faire casher Linux car ce dernier n’aurai alors plus accès à sa base NFS. Ce serai donc très gênant d’avoir un système qui, parce qu’il marche bien, ne marcherai pas. Donc pour l’empêcher de boucler bêtement dans ce problème, il ne faut donc pas oublier de configurer l’acquisition d’adresse IP en manuel, de façon a ce qu’elle ne s’amuse pas à changer quand ça lui chante.

C’est donc ici que ça se passe :

vi /etc/network/interfaces

Et on change

iface eth0 inet dhcp

par

iface eth0 inet manual

Et voilà, vous pouvez lacher la prise en main de linux en quittant le chroot

exit

Voila, félicitation, votre linux est désormais prêt à tourner en NFS. Cependant, rien n’est encore totalement terminé sur le serveur.

Troisième Étape : Configuration du serveur NFS

Et oui il reste encore une certaine quantité de choses à installer sur votre serveur debian. Pour commencer, il faut simplement installer le serveur nfs :

apt-get install nfs-kernel-server

Une fois ce petit outil installé, il va falloir lui préciser où se situe la partition nfs à partager.

Ca se passe dans le fichier /etc/exports

/srv/ubuntu IpdesClients (pour moi c’est 192.168.1.* pour couvrir toute la plage IP)(rw,no_root_squash,async,subtree_check)

N’oubliez pas de relancer le service après chaque modification de ce fichier via cette commande :

sudo service nfs-kernel-server reload

ou

exportsfs -a

Voila, votre serveur nfs est prêt.

Voila, en fait on dirait pas comme ça mais vous avez terminé la configuration de votre serveur ! Alors ? Heureux ? J’espère ! Parce que c’est pas encore terminé, il y a encore du travail !

Quatrième Étape : Installation sur le système client.

Nous allons enfin aborder la problématique du système client.

Pour être clair, cette solution est envisageable dans un cas particulier : vous voulez booter via un support amovible bootable du style USB avec Grub2 dessus, ou alors vous possédez déjà un linux d’installé sur votre machine, muni de grub2 également, et vous voulez quand même conserver cette version.

Et oui car l’intérêt de cette méthode, c’est qu’elle laisse le choix au démarrage, entre la version en LAN, ou un système local, comme Linux ou même pourquoi pas Windows ou MacOS.

Si en plus on imagine que les fichiers personnels sont séparés, cela permet en cas de panne du serveur où est contenu Linux, de pouvoir quand même travailler via les versions installées sur les machines.

Donc, on va commencer. Déjà, un conseil, effectuez cette technique sur une machine banché au serveur en local ; déjà pour pouvoir communiquer avec lui via ssh, ce qui est plus agréable que de devoir être sur le serveur en question, et ensuite pour éviter d’avoir recours à des supports amovibles pour transporter les images et autres fichiers nécessaires.

On va d’abord préparer le terrain. Une fois en mode sudo, vous allez vous rendre dans le dossier /boot/grub (cd) de votre disque dur actuel, et effectuer cette commande :

mkdir LAN

cd LAN

Voila, on va se placer dans ce dossier pour placer les fichiers de linux en question. Maintenant assurez vous d’être sur le même réseau que le serveur, et que ce dernier est bien équipé de ssh.

On va aller chercher les deux fichiers de configuration de linux pour les mettre en local.

Voici la commande :

scp login@Adresse-serveur:/srv/ubuntu/boot/vmlinuz-votreversiondedistrib-generic vmlinuz

scp login@Adresse-serveur:/srv/ubuntu/boot/initrd.img-votreversiondedistrib-generic initrd.img

Voila, normalement votre dossier /boot/LAN est équipé des dernières images du noyau linux. Ce sont des fichiers extrêmement important, car ceux sont eux qui vont avoir les compétences pour lancer le NFS.

Une fois ça fait, il va falloir aller dans les fichiers de configuration de grub2, situé dans /etc/grub.d.

Ici, vous allez créer un nouveau fichier nommé 11_OnLANLinux

touch /etc/grub.d/11_OnLANLinux

Dans ce fichier, voici ce qu’on va y mettre :

#!/bin/sh

exec tail -n +3 $0

menuentry ‘Ubuntu On Lan by Nak @ Your Mom’

{

insmod ext2

insmod fat

insmod ntfs

search —no-floppy —fs-uuid

linux /boot/LAN/vmlinuz root=/dev/nfs nfsroot=AdresseIPdevotreServeurNFS:/srv/ubuntu/ ip=dhcp rw quiet splash

initrd /boot/LAN/initrd.img

}

Comme on est sous Grub 2, il est nécessaire de recréer à chaque modification, le fichier de configuration général. Pour ce faire, il faut effectuer la commande suivante :

update-grub

Et voilà, normalement en dessous de vos linux habituels, vous devriez avoir votre distribution en ligne accessible.

Vous pouvez maintenant redémarrer sur ce nouveau système !

Cinquième Étape : LDAP et autres configuration de comptes

Pour le moment, votre système Ubuntu ne peux fonctionner qu’avec le compte que vous lui aviez paramétré pendant son installation. Quand on dispose d’une structure LDAP de comptes centralisé sur un réseau, il est alors nécessaire de lier la distribution Ubuntu avec tout ces comptes.

Mais tout l’intérêt est là. Vous avez entre les mains une distribution linux tout ce qu’il y a de plus normale et fonctionnelle. Par conséquent, rajouter quelque chose ou installer un paquet est aussi simple que sur une distribution classique.

Pour ldap, il faut utiliser votre gestionnaire de paquet préféré :

sudo apt-get install libpam-ldap libnss-ldap

Alors par contre, attention, ldap est a manier avec précaution. Veillez à connaître toute la configuration de votre serveur ldap pour être sur de ne pas vous tromper, sinon vous risquez de perdre totalement le contrôle de votre linux, et vous serez obliger de retourner en mode chroot.

Une fois ça fait, vous pourrez redémarrer, et vous logger avec votre compte stocké sur le ldap.

Ensuite, une dernière chose : Il est possible que certaines applications comme Thunderbird, rencontrent des problèmes pour se lancer. Dans ce cas, veillez à installer nscd. Ce dernier générera le cache nécessaire a son bon fonctionnement.

Voila, félicitation, vous avez un Linux en ligne tout neuf !

Enjoy !

NOTES :

Penser à fixer le serveur débian sur une IP précise avec le fichier /etc/network/interfaces. Ça évite de lui courir après sur le DNS.

Voici une petite copie du fichier de configuration.

# This file describes the network interfaces available on your system

# and how to activate them. For more information, see interfaces(5).

# The loopback network interface

auto lo

iface lo inet loopback

# The primary network interface

auto eth1

allow-hotplug eth1

iface eth1 inet static

address 192.168.0.8 (à voir dans votre cas)

netmask 255.255.255.0

gateway 192.168.0.252 (idem)