\newpage

Démarrer sur le SI du jour
==========================

Présentation du système d'information
-------------------------------------

Le système d'information que vous allez avoir à gérer aujourd'hui est très
restreint, car il ne se compose que d'une seule machine !

Cette semaine, nous allons installer et configurer de nombreux services sur
cette machine.

L'image ISO que vous avez récupérée met à votre disposition un système Debian
minimaliste. Cette image s'occupe de faire le nécessaire pour démarrer le
système, sans que vous ayez à réaliser une installation complète, qui est plus
longue qu'intéressante. Néanmoins, si vous avez des interrogations au sujet de
la manière dont une installation se fait, ou du fonctionnement du bootloader,
n'hésitez pas à poser vos questions !


Accéder à la machine virtuelle
------------------------------

Une fois la machine virtuelle démarrée, vous pouvez vous y connecter en `root`
avec le mot de passe `adlin2019`.

Vous pouvez également démarrer en mode *single user*, mais comme votre disque
n'est sans doute pas encore utilisable à ce stade, vous ne pourrez pas changer
le mot de passe `root`. Vous pourrez néanmoins effectuer les étapes de
configuration du disque décrites plus loin, sous ce mode, puis redémarrer.

Lorsque vous avez accès à la ligne de commande du *bootloader*, vous pouvez
généralement ajouter l'option `init=/bin/sh` à la ligne de commande du noyau,
afin de lancer un shell au lieu du système d'init habituel.


Configuration du système de fichiers
------------------------------------

### Système initial

L'image ISO sur laquelle votre machine virtuelle démarre va tenter de monter un
OverlayFS avec la première partition du premier disque qu'il rencontre.

Vous ne pourrez pas apporter de modifications à votre système de fichiers tant
que vous n'aurez pas démarré dans le mode "disque dur configuré".


### Table des partitions

Si votre disque a fraîchement été créé, celui-ci ne contient encore aucune
partition, il ne contient d'ailleurs pas même de table de partitions !

Pour éditer (ou créer ...) la table de partitions d'un disque, vous pouvez
utiliser les utilitaires `fdisk`, `cfdisk`, `sfdisk`, `parted`, `gdisk`. Chacun
de ses programmes prend en argument le disque à modifier :

```
    cfdisk /dev/sda
```

Le TP ne se concentrant pas sur la phase de démarrage, vous pouvez ignorer les
choix de type de tables, de partitions, leurs drapeaux, les étiquettes, etc.

Assurez-vous de créer au moins deux partitions : la première occupera la
majeure partie de votre disque, tandis que la deuxième peut se limiter à une
centaine de MB, pour l'exercice.

Assurez-vous de bien lire tous les messages d'avertissements ! Il est important
que vous comprenniez ce que vous faites à ce stade, car cela peut entraîner des
pertes de données.


### Système de fichiers

Les partitions sont maintenant créées, mais il n'est pas encore possible de les
utiliser telles-quelles. Afin de pouvoir les utiliser, il est d'abord nécessaire
de les formater. Linux supporte une grande variété de systèmes de fichiers,
chacun ayant des caractéristiques et des usages particuliers. Le système de
fichiers « généraliste » est l'*Extended File System* (`ext`),

Durant la phase de formatage, les structures (telles que les tableaux d'inœuds,
le journal des transactions, etc. selon les caractéristiques du système de
fichiers) seront inscrites sur le disque. Un certain nombre d'en-têtes
référençant des pointeurs vers ces structures et autres particularités
éventuelles de la partition seront également inscrits. Il n'est à ce stade pas
nécessaire de mettre à zéro chaque secteur du disque ; il faut seulement
s'assurer d'initialiser les structures qui seront utilisées pour ne pas
récupérer de données aléatoires imprévisibles (notamment, le tableau d'inœuds
doit se terminer par une entrée `NULL`, qui sera interprété comme une fin de
liste par le noyau).

Utilisez les utilitaires `mkfs.X` (où `X` est à remplacer par le système de
fichiers que vous avez choisi) pour formater vos partitions.


### Partition d'échange

La *swap* (partition d'échange en français) est un espace du disque que l'on
dédie pour étendre la mémoire vive du système. En cas de débordement, le
système pourra choisir de placer sur le disque des pages dont il n'a pas besoin
sur le moment. Les pages placées dans l'espace d'échange ne seront à nouveau
utilisables que lorsque le noyau les aura replacées dans la RAM.

Encore de nos jours, où nos machines ont souvent beaucoup plus de RAM que ce
dont le système aura jamais besoin, il reste important d'avoir une partition
d'échange, à hauteur de 20 % de la quantité de mémoire
disponible[^currentswap].

[^currentswap]: <https://www.redhat.com/en/blog/do-we-really-need-swap-modern-systems>

Pour formater une partition d'échange, on utilise l'utilitaire `mkswap`.


### Montage automatique des partitions

#### Montage des partitions annexes

Automatique ne veut pas dire magique ! Pour chaque partition dont on dispose,
il va falloir indiquer dans le fichier `/etc/fstab` l'emplacement dans
l'arborescence où attacher la partition ainsi que quelques autres
caractéristiques.

```
# <fs>      <mountpoint>    <type>  <opts>          <dump/pass>
/dev/sda1   /               ext4    defaults        0 1
/dev/sda2   none            swap    swap            0 0
none        /tmp            tmpfs   defaults,nosuid,nodev,noexec    0 0
```

Notons que le montage des partitions est effectué par le système
d'initialisation (un simple appel à la commande `mount -a` ou équivalent). À
aucun moment le noyau ne va lire le contenu de ce fichier.

Voir aussi : `fstab(5)`

#### Montage de la racine

Nous pouvons constater que nous avons indiqué dans ce fichier l'emplacement de
notre partition racine. Mais ... le système d'init se trouvant sur cette
partition racine, comment peut-il monter lui-même la partition sur laquelle se
trouve son programme ?!

Parmi les dernières étapes de démarrage du noyau, juste avant le lancement du
programme se trouvant à l'emplacement `/sbin/init` (ou surchargé par l'option
`init=`), le noyau va monter la partition qui lui a été précisée dans l'option
`root=`.

Vous l'aurez donc compris, afin de bénéficier d'un système utilisable, vous
allez devoir redémarrer et ajouter l'option `root=/dev/sda1` à la ligne de
commande de votre noyau (ou choisir la ligne « avec disque configuré » !).


Persistance de la configuration réseau
--------------------------------------

Maintenant que notre système de fichiers n'est plus en lecture seul, vous allez
pouvoir y apporter des modifications. Par exemple pour installer un client
DHCP, afin de vous connecter au réseau facilement !

Deux solutions s'offrent à vous pour rendre persistant votre configuration réseau :

- éditer le fichier `/etc/network/interfaces`, en suivant les directives de la
  [documentation Debian](https://wiki.debian.org/NetworkConfiguration) ;
- éditer le fichier `/etc/systemd/network/50-dhcp.network`, en suivant les
  directives de
  [`systemd-networkd`](https://www.freedesktop.org/software/systemd/man/systemd.network.html).

À ce stade, vous devriez pouvoir redémarrer votre machine virtuelle et
constater la présence d'une IP dans l'en-tête de bienvenue.


Se mettre à l'aise
------------------

Un serveur SSH est déjà installé et configuré pour vous permettre d'avoir une
interface plus agréable que celle de votre hyperviseur.

**Attention :** si votre machine virtuelle est directement connectée au réseau
local (sans passer par un NAT), n'oubliez pas de modifier le mot de passe
`root` pour éviter que n'importe qui sur le réseau local (et ayant accès à ce
TP), ne rentre sur votre machine.


### Création d'un utilisateur

Une règle primordiale dans l'administration, c'est de ne jamais ~~trop
travailler~~ utiliser le compte `root` directement ! quelque soit le sytème
d'exploitation.

Sur chaque machine, on crée donc autant de comptes utilisateurs, qu'il y aura
de personnes susceptibles de s'y connecter pour l'administrer[^whysudo].

[^whysudo]: non seulement cela évite d'exécuter n'importe quel script ou
    programme avec des privilèges lorsque ce n'est pas nécessaire, mais cela
    permet également de pouvoir retracer, via les journaux, qui a réalisé
    quelles opérations.

Utilisez `adduser(8)` pour vous créer votre propre compte, et au minimum
`passwd(1)` pour lui définir un mot de passe.

C'est bon, vous pouvez maintenant commencer à utiliser le client SSH de votre
choix pour administrer votre machine virtuelle !


### `su` -- Switch User

Mais comment faire des opérations d'administration, avec un simple compte
utilisateur ?

La commande `su -` permet de changer devenir `root`, moyennant la connaissance
du mot de passe du compte. Notez l'option `-` passée à la commande, cela permet
de réinitialiser l'environnement comme si l'on venait de se connecter en tant
que l'utilisateur cible.

Afin de simplifier les opérations d'administration, une suite de commandes
fournies par le paquet `sudo` va devenir votre couteau suisse
d'administrateur. Utilisez :

- `sudo` : pour exécuter n'importe quelle commande, avec les privilèges
  administrateur ;
- `sudoedit` : pour éditer un fichier avec les droits administrateurs.

Après avoir installé le paquet, vous devrez ajouter les utilisateurs autorisés
à se servir de `sudo` dans le groupe `sudo` ou `wheel` (en fonction des
distributions). Vous pouvez également définir des conditions plus précise en
éditant le fichier `/etc/sudoers` (utilisez impérativement `visudo(1)` pour
éditer ce fichier).

**Super astuce !** votre terminal rit encore de vous, affichant `Permission
Denied` car vous avez oublié de préfixer votre commande par `sudo` ? essayez :

```
  sudo !!
```

### Top confort dans son coquillage

Un shell brut de configuration, c'est souvent source d'erreur ! N'hésitez pas à
recopier votre configuration et à changer votre shell (`chsh(1)`) pour vous
trouver dans un environnement plus amical !

On évitera toute configuration sur le compte `root`, étant donné qu'il est
susceptible d'être utilisé en dernier recours lorsque plus rien ne fonctionne,
une configuration basique aura plus de chance de résister. De toute manière,
vous n'utiliserez jamais ce compte !
