# Le système d'exploitation GNU-Linux/Version imprimable

* Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
* Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
* Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.
Une version à jour et éditable de ce livre est disponible sur Wikilivres, une bibliothèque de livres pédagogiques, à l'URL : https://fr.wikibooks.org/wiki/Le_syst%C3%A8me_d%27exploitation_GNU-Linux

# Qu'est-ce qu'un système d'exploitation ?

Linux Is Not UniX.

## Objectifs

À la fin de ce chapitre, le lecteur sera en mesure :
* d’expliquer le rôle d’un système d’exploitation,
* de nommer les principales couches de l’architecture d’un système d’exploitation,
* d’associer les générations d’ordinateur aux différents types de systèmes d’exploitation,
* d’expliquer les différentes versions de UNIX et Linux.

## Introduction

Un système informatique moderne est composé d’un ou plusieurs processeurs, d’une mémoire principale, de disques durs, d’imprimantes, d’un clavier, d’une souris, d’un écran, d’une carte réseau et de beaucoup d’autres périphériques d’entrée/sortie. En un mot un système complexe. Dans ce contexte, développer des programmes d’application qui doivent tenir compte correctement de toutes ces entrées/sorties n’est pas une mince tâche. C’est pour cette raison que les ordinateurs modernes sont équipés d’un « système d’exploitation ». Une des tâches du système d’exploitation est donc d’offrir aux utilisateurs une interface simple et conviviale avec le matériel.
Dans ce chapitre, nous allons d’abord présenter une brève définition et description des systèmes d’exploitation. Par la suite, nous expliquons l’architecture et les fonctions d’un système d’exploitation. Puis finalement, les différentes versions de Unix et de Linux sont présentées.

## Qu'est-ce qu'un système d'exploitation

Un système d'exploitation effectue deux tâches bien distinctes :
* Présenter une machine virtuelle à l’utilisateur.
* Gérer les ressources de l’ordinateur.

### Machine virtuelle

Être une machine virtuelle signifie transformer un ensemble de circuits électroniques en un outil moderne qui offre une abstraction simple au niveau des entrées/sorties, de l'utilisation de la mémoire, de la gestion des fichiers, de la protection et du contrôle des erreurs, de l'interaction des programmes entre eux et de leur contrôle.
En deux mots : éviter au programmeur d’avoir à connaître les détails électroniques de tel ou tel microprocesseur et permettre à l'utilisateur de sauvegarder ses fichiers sans se soucier du type de disque utilisé pour stocker les informations.

### Gestionnaire de ressources

L'autre fonction du système d'exploitation est le partage des ressources. Le système d’exploitation joue un rôle de policier afin d'éviter les conflits d'utilisation de la mémoire, des périphériques d'entrée/sortie, des interfaces réseau, … On peut facilement imaginer ce qui arriverait si trois programmes essayaient d'imprimer en même temps sans que des priorités aient été préalablement établies.
De plus, lorsque l'ordinateur est utilisé par plusieurs usagers, le partage de la mémoire et surtout sa protection demeurent une priorité absolue. À tout moment, tout bon système d'exploitation doit connaître l'utilisateur d'une ressource, ses droits d'accès et son niveau de priorité.

## Architecture d’un système informatique

Tous les systèmes informatiques sont segmentés en « couches » pour permettre un meilleur contrôle de l'ensemble de l'ordinateur. La Figure 1 illustre les différentes couches d’un tel système.

### Matériel

Au plus bas niveau, on retrouve la première couche qui contient les composantes physiques constituées des circuits intégrés, des fils, des sources de courant, …
La couche suivante regroupe des outils logiciels primitifs qui permettent de contrôler directement les composantes physiques sous-jacentes, comme les registres internes du processeur et l’unité arithmétique et logique. Cette couche est appelée le microcode et réside bien souvent dans le processeur de l'ordinateur.
L'autre couche est celle du langage machine qui est interprété par le microcode. Ce langage de bas niveau regroupe 50 à 300 instructions pour permettre de déplacer des bits, de calculer ou de comparer des valeurs à l'aide des registres internes du processeur.

### Système d’exploitation

Le système d'exploitation qui se trouve juste au-dessus, offre aux programmeurs et aux utilisateurs un ensemble de fonctions du genre « lire le fichier » ou « afficher à l’écran ». Il s'agit ici d'un niveau d'abstraction élevé qui évite ainsi au programmeur de devoir écrire, par exemple, du code pour déplacer les têtes de lecture d'un disque rigide. Il s'agit du niveau d'exécution des pilotes de périphériques (contrôleurs d'interruptions, de disques, de carte graphique, ...).
En haut de la hiérarchie, il y a la couche où l'on retrouve les interpréteurs de commandes, les compilateurs et les logiciels d’application. Il est clair que ces programmes ne font pas partie du système d'exploitation, même s'ils sont livrés avec celui-ci dans bien des cas.

### Logiciels d’application

Finalement, au-dessus de toutes ces couches se trouvent les logiciels d’application qui permettent à un utilisateur d’effectuer des tâches particulières sans qu'il ait à tenir compte des couches inférieures.

## Fonctions d'un système d'exploitation

Aujourd'hui, l'informatique, aussi bien dans les entreprises que dans l'enseignement, utilise des machines plus petites fonctionnant avec des systèmes d'exploitation à caractère universel. Parmi ces systèmes d'exploitation, deux se distinguent particulièrement, un système mono-utilisateur, Windows, et un autre multi-utilisateurs et multi-tâches, Unix. D'une manière contestable, on peut affirmer que le premier système est destiné à des ordinateurs individuels, tandis que l'autre est réservé au travail en groupe.
Parmi les nombreux systèmes d’exploitation, Unix/Linux est celui qui offre le plus de richesse, le plus d'homogénéité et le plus de souplesse. Pour cette raison, dans ce livre, Linux a été choisi comme système d'exploitation pour illustrer les concepts théoriques. Par ailleurs, le système MS-DOS puis Windows, en évoluant, ont incorporé beaucoup de caractéristiques de Unix/Linux.
On peut diviser les fonctions des systèmes d'exploitation classiques en quatre parties principales :
* La gestion des processus (programmes).
* La gestion de la mémoire.
* Le système de fichiers.
* La gestion des entrées/sorties.
Les systèmes d'exploitation modernes intègrent par ailleurs d'autres caractéristiques. Ces dernières concernent notamment deux évolutions majeures des systèmes informatiques. La première est l'interconnexion des différentes machines et des différents systèmes par des réseaux locaux ou étendus. La seconde est la disparition des écrans de texte et leur remplacement par des dispositifs à fenêtres multiples disposant de propriétés graphiques.

### Historique des systèmes d'exploitation

L’histoire de l’informatique est très brève – les ordinateurs sont nés avec la seconde guerre mondiale – et pourtant, elle a connu de grandes évolutions. L'historique des systèmes d'exploitation est intimement liée à l'évolution de l’informatique. Cette évolution est séparée en 4 grandes étapes :
* Première génération (1945-55) : les tubes à vide.
* Deuxième génération (1955-65) : les transistors et le traitement par lots.
* Troisième génération (1965-80) : les circuits intégrés et la multiprogrammation.
* Quatrième génération (1980-aujourd’hui) : les micro-ordinateurs.
* Cinquième génération (compléter-compléter) : l'informatique quantique.

### Première génération (1945-55) : les tubes à vide

En 1946, le premier ordinateur ne comportant plus de pièces mécaniques est créé grâce à J. Mauchly et J. Presper Eckert : l’ENIAC (Electronic Numerical Integrator And Computer). Il est composé de 180 000 tubes à vide et occupe 1500 m². Son principal inconvénient est sa programmation : il était uniquement programmable manuellement avec des commutateurs ou des câbles à enficher.
Note : La première erreur informatique est due à un insecte qui, attiré par la chaleur, était venu se loger dans les tubes à vide et avait créé un court-circuit. Le mot « bug » (insecte en anglais), est donc resté pour nommer une erreur informatique.

### Deuxième génération (1955-65) : les transistors et le traitement par lots

En 1948, le transistor est créé par la firme Bell Labs grâce aux ingénieurs John Bardeen, Walter Brattain et William Shockley. Le transistor permet de rendre les ordinateurs moins encombrants et moins gourmands en énergie électrique : c’est la révolution dans l’histoire de l’informatique. Ce n’est qu’en 1960 qu’IBM commercialise l’un des premiers ordinateurs à base de transistors, l’IBM 7000.
C’est aussi à cette époque que les premiers systèmes d’exploitation sont apparus tel FMS (the Fortran Monitor System) et IBSYS (IBM’s operating System), utilisant le traitement par lots pour gérer l’exécution des programmes qui se fait maintenant de façon autonome.

### Troisième génération (1965-80) : les circuits intégrés et la multiprogrammation

Le circuit intégré est mis au point en 1958 par Texas Instrument. Il permet de réduire encore la taille des ordinateurs en intégrant plusieurs transistors dans le même composant électronique. Avec cette nouvelle génération d’ordinateurs, une nouvelle génération de systèmes d’exploitation mettant en application le concept de multiprogrammation fait son apparition.
Les premiers travaux sur MULTICS, l'ancêtre d'Unix, sont dus à Ken Thompson pour le compte de Bell Laboratories, AT&T, General Electric et le Massachusetts Institute for Technology.
En 1970, une première version d'Unix voit le jour. Elle fonctionne sur une machine PDP-7 de Digital Equipment. Les principales caractéristiques de ce système sont les suivantes :
* Gestion de fichiers sous forme d'une hiérarchie de répertoires.
* Entrées/sorties gérées de la même façon pour les fichiers, les processus (ou programmes) et les périphériques.
* Gestion multi-tâches de processus indépendants.
* Systèmes à base de commandes pouvant accepter de multiples interpréteurs de commandes, selon les besoins de l'utilisateur.
* Présence d'utilitaires et de compilateurs intégrés dans le système.
* Un système aussi portable que possible pouvant s'adapter à de nombreux types d'ordinateurs. C'est justement pour accroître la portabilité du système que Denis Ritchie inventa le langage de programmation C.
Une grande partie du système Unix fut réécrite en langage C. Le reste du système, en assembleur, dépend du type de machines sur lequel on installe le système. En 1976, la version 6 d'Unix, fut la première version complète. En 1979, ce fut le succès commercial avec la version 7. Cette version a été adoptée par Hewlett Packard et Digital Equipment.
Chaque constructeur eut le droit d'adapter Unix à ses machines. De même, des universités pouvaient travailler à son amélioration. Mais comme le nom d'Unix lui-même était protégé, chacun dut aussi choisir un nom différent. L'Université de Berkeley en Californie proposa ainsi les versions BSD (Berkeley Software Distribution). Face à cette diversité des versions d'Unix, AT&T proposa, dès 1983, le standard System V. Aujourd'hui, l'X/OPEN group a obtenu le droit de diffuser la marque Unix à tous les systèmes qui se soumettent à un contrôle approprié. Aujourd'hui encore, HP propose HP-UX, IBM propose sa version d'Unix appelée AIX et Sun propose Solaris.

### Quatrième génération (1980-aujourd’hui) : les micro-ordinateurs

En 1979, Microsoft prend une licence Unix et développe le système d'exploitation XENIX, disponible jusqu'en 1984. Au moment où le PC fit son apparition, Unix était déjà un système mûr. En 1981, lorsque IBM lança le PC, il choisit le système d'exploitation MS-DOS de Microsoft. MS-DOS, inspiré d'Unix, comportait dès le départ des contraintes liées à son architecture : insuffisance de la mémoire adressable, pas de gestion multi-tâches ou multi-utilisateurs, pas de protection de la mémoire.
Des particuliers eux aussi se sont attelés aux développements d'une version d'Unix : Andrew Tanenbaum, professeur à l'Université d'Amsterdam, développa avec ses élèves une version d'Unix pour PC, appelée Minix, qui vit le jour en 1987. Partant de Minix, Linus Torvalds développa Linux, un Unix pour PC dont la première version, appelée version 0.99, sortit en 1991. Aujourd'hui, Linux est devenu un système d'exploitation stable pour PC. Ce système constitue un logiciel libre, dont chaque utilisateur a le droit de modifier le code source.

# Unix et Linux
## Unix/Linux

Unix est un système d'exploitation très populaire parce qu'il est présent sur un grand nombre de plates-formes, du micro-ordinateur à l’ordinateur central (mainframe). L'avantage de cela, c'est que les programmes développés sous Unix peuvent être transférés d'une plate-forme à une autre avec un minimum de modifications.
Ce système est multitâche, c'est-à-dire qu'il est capable de gérer et d'exécuter plusieurs programmes simultanément. De plus, il est multi-utilisateurs, c'est-à-dire que plusieurs personnes peuvent s'y connecter en même temps et travailler ; le système partage alors toutes les ressources logicielles et matérielles de l'ordinateur entre les différents usagers.
L'histoire d'Unix est unique dans le monde des systèmes d'exploitation. En effet, alors que la plupart des systèmes d'exploitation ont été conçus par des fabricants d'ordinateurs pour vendre leurs machines, Unix n'a pas été conçu dans un but commercial. Il l'est devenu parce qu'il constitue une norme en matière de système d'exploitation.
Contrairement à un système d'exploitation commercial complètement contrôlé par son fabricant, le système Unix est aujourd'hui distribué par plusieurs intervenants dont voici les principaux :
* AT&T, à qui on attribue la paternité de Unix ;
* l'université de Berkeley, qui a fait évoluer Unix dans plusieurs domaines ;
* SUN Microsystems, à qui l’on doit les améliorations importantes de l'interface graphique ;
* Santa Cruz Operation et Microsoft, le XENIX/UNIX fut la première version pour PC de Unix.
À cause de cette situation de développement, le système d'exploitation Unix a mis plusieurs années à être standardisé. Actuellement, il en existe deux principales variantes, incompatibles entre elles :
* Unix SYSTEM V,
* Unix BSD.
Il existe aussi une multitude de variations mineures dérivées d'une des deux ou des deux principales variantes ; on a ainsi, en les regroupant :
* les systèmes Unix-Based ;
* les systèmes Unix-Like.

### Systèmes Unix-Based

Les systèmes étant "descendants" du système Unix original.
* XENIX/UNIX provenant de SCOMicrosoft ;
* AIX provenant d'IBM ;
* Mac OS X provenant d'APPLE ;
* SunOS/Solaris provenant de SUN MicroSystems ;
* IRIX provenant de Silicon Graphics ;
* ULTRIX provenant de DIGITAL ;
* HP-UX (Hewlett Packard UniX) provenant Hewlett-Packard.
* FreeBSD ;
* OpenBSD ;
* NetBSD ;

### Systèmes Unix-Like

Les systèmes Unix-Like reproduisent les mêmes fonctionnalités que la version AT&T, mais le noyau du système est incompatible parce qu'il a été réécrit pour éviter le versement de droit d'auteurs à AT&T. On retrouve dans cette catégorie :
* Minix ;
* GNU/Linux ;
* QNX.
Cette prolifération de produits a fait apparaître un certain nombre de différences entre les systèmes, dont les principales sont :
* les communications inter-programmes ;
* la gestion de la mémoire (segmentation ou pagination) ;
* divers paramètres du système ;
* divers outils qui peuvent être intégrés dans un produit et absents dans un autre.

### Principales distributions de Linux

Celui qui s'intéresse aux différentes versions de Linux doit faire la différence entre le noyau du système d'exploitation proprement dit (le kernel, en anglais) et la combinaison d'utilitaires qui l'accompagnent. Les distributions se différencient par le choix du noyau et le choix des différents utilitaires disponibles.
Au moment de la rédaction de ce texte, la version actuelle du noyau de Linux porte le numéro 4.2.x, mais les versions suivantes sont probablement prêtes. Vérifiez donc la version du noyau que vous vous procurez. Cette version figure dans de nombreuses distributions et constitue un élément commun.
De nombreux utilitaires sont également communs à toutes les distributions. (Exemples : Bourne Again Shell ou l'interface graphique Xfree86).
Voici une liste non exhaustive des distributions disponibles :
* CentOS
* RedHat (nom complet : Red Hat Enterprise Linux)
* Manjaro
* Fedora
* Mandriva
* Debian
* Ubuntu
* OpenSUSE

## Voir aussi

Consultez également ces pages dans d’autres projets Wikimedia :
* Article encyclopédique sur Wikipédia.
* Ressources éducatives sur Wikiversité.

# Partitionnement du disque
## Objectifs

À la fin de ce chapitre, le lecteur sera en mesure :
* d’expliquer le rôle des partitions,
* d’utiliser un outil de partitionnement,
* de créer un système de fichiers.

## Introduction

L’utilisation d’une unité de stockage (par exemple un disque dur) soit pour l’installation d’un système d’exploitation ou le stockage de données nécessite que celle-ci soit préalablement préparée d’abord par le partitionnement puis par le formatage logique. Dans ce chapitre, le concept de partition est expliqué avant de présenter un outil de partitionnement. Finalement, le formatage logique est présenté.

## Qu'est-ce qu'une partition?

Le partitionnement consiste à créer des zones sur le disque dont les données ne seront pas mélangées. Cela sert donc si l'on veut, par exemple, installer des systèmes d'exploitation différents n'utilisant pas le même système de fichiers. Il y aura donc au minimum autant de partitions que de systèmes d'exploitation utilisant des systèmes de fichiers différents. Dans le cas d'un utilisateur d'un système d'exploitation unique, il y aura une seule partition recouvrant tout le disque, sauf si l'utilisateur désire en créer plusieurs pour, par exemple, séparer les données et les programmes.
Il y a trois sortes de partitions: les partitions principales, la partition étendue et les partitions logiques. Un disque peut contenir jusqu'à quatre partitions principales (dont une seule peut être active), ou trois partitions principales et une partition étendue. Dans la partition étendue, l'utilisateur peut créer des partitions logiques (c'est-à-dire faire en sorte que l'on ait l'impression qu'il y a plusieurs disques durs de taille moindre).
Voyons voir un exemple dans lequel le disque contient une partition principale et une partition étendue composée de trois partitions logiques (nous verrons par la suite les partitions principales multiples):
Pour les systèmes Windows, seule la partition principale est amorçable, c'est donc la seule sur laquelle on peut démarrer le système d'exploitation. Sous Linux, toutes les partitions peuvent être amorçables.
On appelle partitionnement le processus qui consiste à écrire les secteurs qui constitueront la table de partitions. La table de partitions est une base de données contenant les informations sur les partitions: taille de celle-ci en terme de nombre de secteurs, position par rapport à la partition principale, types de partitions présentes, systèmes d'exploitation installés, ...

### Partition principale

Une partition principale doit être formatée logiquement, puis contenir un système de fichiers correspondant au système d'exploitation installé sur celle-ci. Si jamais vous avez plusieurs partitions principales sur votre disque, une seule sera active et visible à la fois; cela dépendra du système d'exploitation sur lequel vous avez démarré l'ordinateur. En choisissant le système d'exploitation que vous lancez au démarrage, vous déterminez la partition qui sera visible. La partition active est la partition sur laquelle un des systèmes d'exploitation est démarré au lancement de l'ordinateur. Sous Windows, les partitions autres que celle sur laquelle vous démarrez seront alors cachées, ce qui empêchera d'accéder à leurs données. Sous Linux, toutes les partitions sont accessibles.

### Partition étendue

La partition étendue a été mise au point pour outrepasser la limite des quatre partitions principales, en ayant la possibilité de créer autant de partitions logiques que vous désirez dans celle-ci. Au moins une partition logique est nécessaire dans une partition étendue, car vous ne pouvez pas y stocker de données directement.
Beaucoup de disques durs d’ordinateur sont formatés en une seule grande partition utilisant l'intégralité de l'espace disponible. Ce n'est pourtant pas la solution la plus avantageuse en terme de performances et de capacité. La solution est de créer plusieurs partitions, ce qui va vous permettre:
* d'installer plusieurs systèmes d'exploitation sur votre disque,
* d'économiser de l'espace disque,
* d'augmenter la sécurité de vos fichiers,
* d'organiser vos données plus facilement.

### Secteur de démarrage

Le secteur de démarrage (appelé Master Boot Record ou MBR en anglais) est le premier secteur d'un disque dur (cylindre 0, tête 0 et secteur 1). Il contient la table de partition principale et le code qui, une fois chargé en mémoire, va permettre d'amorcer le système d’exploitation.
Ce programme, une fois en mémoire, va déterminer sur quelle partition le système va s'amorcer, et il va démarrer le programme (appelé « bootstrap ») qui va amorcer le système d'exploitation présent sur cette partition.
D'autre part, c'est ce secteur du disque qui contient toutes les informations relatives au disque dur (fabricant, numéro de série, nombre d'octets par secteur, nombre de secteurs par « cluster », nombre de secteurs,...). Ce secteur est donc le secteur le plus important du disque dur. Il permet aussi au BIOS de reconnaître le disque dur. Ainsi, sans celui-ci, votre disque dur est inutilisable, c'est donc une des cibles préférées des virus.

## Outil de partitionnement

Sous Linux, il existe de nombreux outils de partitionnement. L'utilitaire fdisk est disponible sur la majorité des distributions de Linux. Il permet de créer, d’éditer et de détruire des partitions sur un disque. Le partitionnement avec fdisk entraînera la perte de toutes les données présentes sur le disque sur lequel vous effectuez les opérations.
Syntaxe :
Sans argument fdisk utilisera le premier disque dur qu'il trouve. Il est possible de préciser à fdisk le disque à partitionner, en lui donnant comme paramètre le nom du périphérique.
Exemple :
Partitionner le second disque dur IDE.
Une fois lancé, le menu suivant apparaît :
Le tableau suivant présente la liste des principales options de la commande fdisk:
| Commande | Description |
| d | Destruction d'une partition |
| l | Liste des types de partitions |
| m | impression du Menu en cours |
| n | création d'une Nouvelle partition |
| p | affichage des Partitions |
| q | Sortie de fdisk sans sauvegarde des paramètres (Quitter) |
| t | Modification du Type de partition |
| v | Vérification de la table des partitions |
| w | sauvegarde des modifications et sortie de fdisk (Write & exit) |

### Création des partitions

Voici les étapes pour créer une partition :
* Démarrer fdisk
* Taper n pour créer une nouvelle partition.
* Choisir le type de partition (primaire ou étendu).
* Choisir le numéro de la partition
* Ensuite fdisk vous demande l'emplacement du premier cylindre. Par défaut, fdisk affichera toujours le premier cylindre libre trouvé.
* fdisk vous demande alors l'espace à attribuer à cette partition. Cette taille peut être indiquée en nombre de cylindres, en Octets, en Kilo-octets ou en Mégaoctets.

### Afficher les partitions

La commande p du menu principal permet d’afficher les partitions du disque dur sélectionné.

## Formatage logique

Le formatage logique crée un système de fichiers sur le disque, qui va permettre à un système d'exploitation (DOS, Windows 11, Linux, OS X, Windows 10 ...) d'utiliser l'espace disque pour stocker et utiliser des fichiers. Les systèmes d'exploitation utilisent des systèmes de fichiers différents, ainsi le type de formatage logique dépend du système d'exploitation que vous utilisez.

### mkfs, création d’un système de fichiers

Syntaxe :
Description :
L’utilitaire mkfs permet de créer un système de fichiers sur un disque ou une partition. Ce système de fichiers est de type ext2, ext3 ou msdos.
Exemple 1:
Formater une disquette dos.
Exemple 2:
Formater une disquette Linux.
Exemple 3 :
Formater la partition /dev/hda3 en ext3.

### e2label, étiquetage d’une partition

Syntaxe :
Description :
La commande e2label affiche ou modifie le nom du système de fichiers spécifié.
Exemple :
Afficher l’étiquette de la partition /dev/hda2

## Exercices

* Nommez trois sortes de partitions?
* Qu’est-ce qu’une partition?
* Combien, au maximum, peut-il y avoir de partitions principales?
* Qu’est-ce qu’un secteur de démarrage?
* Qu’est-ce que le formatage logique?
* Formatez une disquette Linux. Écrivez au complet la commande utilisé.

# Installation
## Installer une distribution Debian

Cette installation a été effectuée à partir du CD-ROM d'installation via le réseau (Net install) Debian - branche stable.
La première étape a été de vérifier via les paramètres du BIOS que l'ordinateur démarrait par défaut sur la clef USB. Si tel est le cas, on doit voir le logo Debian apparaître à l'écran avec un invite "boot :".
En appuyant sur les touches de fonction (de F1 à F10), on peut consulter des paramètres optionnels à indiquer au noyau. Ces paramètres sont utiles dans certains cas pour la détection de matériel particulier.
Dans le cas d'une installation normale, on appuie juste sur la touche Entrée pour démarrer l'installation.
Le noyau d'installation se charge et détecte le matériel intégré à l'ordinateur.
La première étape du configurateur nous demande de choisir notre langue, notre localisation géographique et la disposition du clavier.
L'étape suivante concerne la détection des paramètres réseaux. Utilisant le protocole DHCP, cette étape s'est déroulée automatiquement. À noter que si cela n'avait pas été le cas, nous aurions du renseigner les paramètres réseaux manuellement : adresse IP, masque de réseau, adresse réseau, passerelle et serveur de noms.
Le processus d'installation détecte automatiquement les périphériques de stockage.
Vient ensuite le partitionnement du disque dur. Nous avons choisi le partitionnement manuel afin de configurer précisément les partitions désirées et leur taille.
Notre disque dur fait 80 Go. Nous avons créé 6 partitions :
* /boot (100Mo) : contient le(s) noyau(x) Linux
* / (20 Go) : la racine du système de fichiers
* /var (20 Go) : les données variables (dont notamment les logs)
* SWAP (2 Go) : la mémoire virtuelle
* /tmp (2 Go) : les fichiers temporaires
* /home (le reste, soit environ 36 Go) : les répertoires utilisateurs
Il est conseillé de créer plusieurs partitions pour des raisons de sécurité. Effectivement, les systèmes d'exploitation ne fonctionnent pas correctement si la partition système est pleine (la racine / sous Unix, ou C: dans le monde Microsoft). Étant donné que l'on fonctionne sur un système multi-utilisateurs, il est donc préférable de créer des partitions dédiées pour /home, /tmp et /var. Effectivement, les utilisateurs peuvent écrire des fichiers dans ces répertoires, et de ce fait les remplir. Si on a prévu une partition dédiée pour ces répertoires, le système va continuer à fonctionner même si ces partitions sont pleines.
L'installateur Debian a ensuite formaté les partitions et installé les paquets essentiels.
Le système nous a ensuite demandé de renseigner les paramètres du compte utilisateur (nom complet, login et mot de passe) et le mot de passe du compte root.
Le système nous a demandé ensuite de choisir un miroir Debian afin d'aller télécharger des paquets supplémentaires. Nous avons choisi un miroir en France.
Nous avons eu ensuite la possibilité de configurer un serveur mandataire (un proxy). Nous ne l'avons pas renseigné car notre réseau dispose d'un proxy transparent.
L'installateur Debian a ensuite téléchargé un très grand nombre de paquets supplémentaires.
Une fois le téléchargement terminé (prévoir un certain temps selon le type de connexion à Internet), le système a installé les paquets et nous a demandé de spécifier la résolution d'affichage de l'environnement graphique. Nous avons laissé les paramètres par défaut : 1024x768, 800x600 et 640x480. Il faudra bien entendu choisir la résolution en fonction de l'écran.
Le système nous demande ensuite si on désire installer le programme de boot GRUB. Ce programme est effectivement indispensable au bon démarrage du PC. Si GRUB détecte une partition Windows, il va automatiquement la rajouter au multi-boot.
À la suite de ces étapes, l'installation est terminée. Le système nous propose ensuite de redémarrer. Si tout s'est bien passé, l'ordinateur va redémarrer sur le nouveau système fraîchement installé.
* Partitionnement
* Taille
* Caractéristiques

## Procédure de récupération du boot

Dans certaines circonstances le boot de Linux peut avoir été supprimé par Windows, il devient alors impossible de démarrer Linux, il est néanmoins possible de le restituer en utilisant la procédure suivante:
En premier lieu il faut démarrer à partir du support d'installation de Linux (CD-ROM ou clef USB, assurez-vous que le CD-ROM soit bien en premier dans l'ordre de démarrage des périphériques dans le Bios)
À l'étape ou vous devez donner un nom à la machine, passez en mode console (ALT + F2 )
Faites un fdisk -l /dev/sda puis fdisk -l /dev/sdb pour examiner le contenu de vos partitions et vous assurer de l'emplacement de vos deux systèmes.
Si vous changez le disque dur de place Il faut monter la partition racine contenant le fichier /etc/fstab de façon à pouvoir le modifier ;
Restitution du boot GRUB
Faire ensuite :
- Alt+F1 : retour au menu Debian - revenir en arrière (2 fois) - dans le menu choisir installation Grub - revenir en arrière (2 fois) - et continuer: OUI (2 fois)
Redémarrer et normalement c'est OK, le boot GRUB est de nouveau opérationnel !

## Installer une distribution Red Hat

Les sources sont sur https://access.redhat.com/downloads/.
procédure d'installation d'une distribution Red Hat

## Installer une distribution Manjaro

Les sources sont sur https://manjaro.org/products.
procédure d'installation d'une distribution Manjaro

# Installer Debian via le réseau
### Installation de Debian par le réseau

packets nécessaire
* dhcp
* tftp
* pxe
Copiez ensuite le fichier /usr/lib/syslinux/pxelinux.0 dans /tftpboot
Configuration du dhcp
ddns-update-style none;
option domain-name "diskless.net";
'#'option domain-name-servers gw.diskless.net;
default-lease-time 600; max-lease-time 7200;
log-facility local7;
subnet 192.168.30.0 netmask 255.255.255.0 { range 192.168.30.100 192.168.30.110; '#'option routers rtr-239-0-2.example.org; } next-server 192.168.30.224; option root-path "192.168.30.224:/tftpboot/pxelinux.0";
filename "/tftpboot/pxelinux.0";
tftp
tftp dgram udp nowait root /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
configuration pxe
.# which interface to use
interface=eth0
default_address=192.168.30.210
.# the multicast ip address to listen on
multicast_address=224.0.1.2
.# mtftp info
mtftp_address=192.168.30.210
mtftp_client_port=1758 mtftp_server_port=1759
.# the port to listen on
listen_port=4011
.# enable multicast?
use_multicast=1
.# enable broadcast? use_broadcast=1
.# user prompt
prompt=Press F8 to view menu ... prompt_timeout=10
.# what services to provide, priority in ordering .# CSA = Client System Architecture .# service=<CSA>,<min layer>,<max layer>,<basename>,<menu entry=''>
service=X86PC,0,0,local,Local boot service=X86PC,0,0,pxelinux,PXELinux
.# tftpd base dir
tftpdbase=/tftpboot
.# domain name .# domain=bla.com
redemarer le service
Mettre la machine que vous voulez installer en boot pxe et vous devriez avoir l'interface d'installation de debian

# Le login
## Login

Les systèmes compatibles Unix sont par définition multi-tâches et multi-utilisateurs, c'est à dire que plusieurs personnes peuvent travailler simultanément sur le même système.
Chaque utilisateur est identifié par un nom d'utilisateur (login) et un mot de passe (password).
Le login est associé à un numéro unique (le UID : User IDentifiant) et permet d'identifier chaque utilisateur. Il ne contient ni espace, ni caractères spéciaux.
Le mot de passe doit être choisi judicieusement : il doit mélanger des caractères en minuscule et majuscule, des chiffres et des caractères spéciaux.
Chaque utilisateur dispose d'un répertoire de travail (le Home Directory) dans lequel il a le droit de créer ses propres fichiers et répertoires. Ce répertoire de travail se situe généralement dans le répertoire home et porte le nom du login. Exemple : le répertoire de travail de l'utilisateur alex est /home/alex.
Il existe un utilisateur particulier : le root. Le root est l'administrateur du système, il dispose de tous les droits et s'occupe de la gestion du système : ajout et suppression des utilisateurs, installation et configuration du système et des logiciels ...
Le root a tous les pouvoirs sur le système, il peut tout faire, y compris tout casser. De ce fait, il faut donc choisir un mot de passe très sécurisé, et toujours bien vérifier à deux fois avant d'exécuter une opération avec l'utilisateur root.
Le root n'est pas une personne à proprement parler, il s'agit d'une fonction. Ainsi, il ne faut jamais travailler en permanence avec le compte root, mais utiliser son compte habituel, et ne passer root (via les commandes su ou sudo) que si l'on a besoin de réaliser une opération d'administration.
Contrairement aux autres utilisateurs, le répertoire de travail du root se situe à la racine du système (/root). L'explication est simple : en cas de problème avec la partition /home, l'utilisateur root pourra quand même accéder à son répertoire de travail.

## Session

Pour voir les sessions ouvertes sur la machine :
Pour en tuer une :

## MOTD

À chaque connexion, l'en-tête situé dans /etc/motd s'affiche automatiquement. Ce nom correspond aux initiales de Message of the Day. Par exemple sur Ubuntu, il contient des informations sur la version, mais on peut aussi l'éditer pour y placer des instructions.

# Variables d'environnement

La liste des variables d'environnement est accessible par la commande printenv. Elles sont toutes nommées en capitales.
Pour en afficher une seule : echo $variable.
Pour en modifier une : export variable="valeur".
Pour la supprimer : unset variable.

## $HOME

Chemin du répertoire personnel de l'utilisateur courant. Il s'agit d'un répertoire associé à l'utilisateur lors de la création du compte, qui lui est réservé pour mettre ses documents personnels, ses scripts de personnalisation et ses fichiers de configuration. Cependant, l'exception est celui de l'utilisateur root où il correspond en général à la racine du système de fichiers (/).
Souvent, il s'agit du répertoire courant initial à l'ouverture d'une fenêtre de terminal (shell).

## $LANG

Langue du système.

## $PATH

Liste de chemins contenant les binaires accessibles globalement séparés par des caractères deux-points ":". Cette liste est utilisée quand le chemin complet d'un programme exécutable n'est pas spécifié.

## $PWD

Chemin absolu du répertoire courant permettant de résoudre les chemins relatifs (incluant les nom de fichiers sans chemin). La commande cd ou chdir (change directory) depuis un terminal permet de changer de répertoire courant.

## $SHELL

Version du shell. Ex :

## $TZ

Time zone : fuseau horaire.

# Commandes de base
## Éléments de syntaxe

Les commandes présentées dans les sections qui suivent sont introduites juste après un message d'invite qui dépend de la configuration du shell utilisé. Celui-ci est représenté par un signe dollar $. Il ne doit donc pas être tapé.
Le caractère dièse # marque le début d'un commentaire qui se termine en fin de ligne. Il n'est pas nécessaire de le recopier pour exécuter la commande.
Exemple :
Pour tester cette commande, il suffit d'entrer p w d ↵.
Les lignes qui ne sont pas marquées du signe dollar indiquent ce que la commande précédente doit/peut afficher.
Par ailleurs, il existe deux opérateurs de concaténation des commandes :
* ";" : qui enchaine les commandes quelques soient leurs résultats. Exemple : pwd ; pwd.
* "&" : qui stoppe l'enchainement si une commande renvoie une erreur. Exemple : pwd & pwd. De plus, si aucune commande ne figure après le "&", le terminal redonne le focus avant la fin de la première commande, de sorte que l'on peut en taper d'autres si elle est longue (en asynchrone).
** "&&" : idem sans les informations sur les processus.

## pwd (print working directory)

Affiche le répertoire courant.

## id

Affiche les informations relatives à l'utilisateur connecté.

## passwd

Permet de changer son mot de passe
Ne pas utiliser le symbole euros (€) dans les mots de passe, car il est potentiellement mal géré par Linux et pourrait se voir systématiquement refusé.

## cd (change directory)

Pour se placer dans un répertoire
Connecté en root, la commande cd m'amène au répertoire /root qui est le répertoire de travail de l'utilisateur root.
Connecté avec l'utilisateur alex, cd m'amène au répertoire de travail de l'utilisateur alex, à savoir /home/alex.

## ls (list sorting)

Liste les fichiers d'un répertoire
On peut combiner plusieurs options, l'ordre n'est pas important. Les quatre commandes suivantes sont identiques :
Lister de façon détaillée (-l) tous les fichiers, même cachés (-a), les plus récents (-t) en derniers (-r), avec leur taille en kilo-octets (-k) lisible facilement avec les unités K pour Kilo, M pour Mega, G pour Giga(-h).
Pour ne lister que les sous-dossiers :
Pour compter les éléments de la liste :

## cat (concatenate)

Affiche le contenu d'un fichier ou de plusieurs fichiers concaténés sur la sortie standard (l'écran)
Pour que les modifications de fichiers s'ajoutent en temps réel sur la sortie standard, utiliser :

## mkdir (make directory)

Permet de créer un répertoire
Exercice : je suis dans le répertoire /var/log, je souhaite créer un répertoire rep2 dans le répertoire /home/alex, comment faire ?
J'ai trois possibilités :
l'option -p permet de créer le(s) répertoire(s) parent(s).

## rmdir (remove directory)

Supprimer un répertoire vide

## cp (copy)

Copier un fichier
Attention, si le fichier destination existe déjà, il sera remplacé sans demande de confirmation !
Options courantes :

### Copier un dossier (avec son contenu)
## rm (remove)

Effacer un fichier
Attention, le fichier est effacé et sans demander confirmation !
Options courantes :

### Exemples

* Pour supprimer le répertoire "tmp" et son contenu :
* Pour supprimer les fichiers de log de plus de deux jours :

## mv (move)

Déplacer ou renommer des fichiers
Par précaution, on utilise l'option -i qui permet d'être averti par le système avant l'écrasement du fichier destination si celui-ci existe.
Si le dossier n'est pas vide, utiliser "-f" pour forcer l'écrasement.
Pour inclure les fichiers cachés dans les déplacements *, exécuter avant shopt -s dotglob.

## ln (link)

La commande ln permet de créer des liens, c'est à dire des raccourcis vers des fichiers ou des répertoires.
Exemple
Cette commande crée le lien suivant :

## find : recherche par nom de fichier

Par exemple pour trouver tous les fichiers .log dans le dossier courant récursivement :

## grep : recherche par contenu de fichier

Par exemple pour trouver tous les fichiers qui contiennent "mon texte" dans le dossier courant récursivement :
En regex en ignorant la casse :

## clear et reset

* clear masque les données affichées en console, et on peut les retrouver en remontant l'ascenseur.
* reset efface complètement les données affichées en console.

# L'aide en ligne man

Chaque commande dispose d'une page de manuel en ligne (appelée manpages).
Cette aide en ligne est très utile pour savoir comment utiliser les commandes et connaître la liste exhaustive de toutes les options disponibles.

## Ligne de commande

Pour accéder à cette aide en ligne, il suffit de taper man <le_sujet>. Le sujet peut être le nom d'une commande (section 1) :
Il peut être un nom de fonction C (section 2 ou section 3) :
L'exemple précédent donne explicitement le numéro de section où chercher le sujet pour éviter la confusion avec la commande shell printf (section 1).
Les pages de manuel sont réparties en section. Pour connaître l'ensemble des sections, il suffit de consulter la page de manuel de la commande man :
Certaines commandes sont à la fois des commandes systèmes, des appels systèmes ou des fichiers de configuration (exemple : passwd). Il est possible d'indiquer la section que l'on désire consulter :
Les pages de man sont découpées en différents chapitres (extrait de man 7 man) :
Les chapitres des pages de man :
| Chapitre | Descriptif |
| SYNOPSIS | Indique brièvement l'interface de la commande ou de la fonction. Pour les commandes, ce paragraphe montre sa syntaxe et ses arguments. Les caractères gras marquent le texte invariable et l'italique indique les arguments remplaçables. Les crochets encadrent les arguments optionnels, les barres verticales (caractère pipe) séparent les alternatives, et les ellipses ... signalent les répétitions. Pour les fonctions, on trouve toutes les déclarations et directives #include, suivies de la déclaration de fonction. |
| DESCRIPTION | Fournit une explication sur ce que la commande, la fonction ou le format représente. Décrit les interactions avec les fichiers et l'entrée standard, ou ce qui est produit sur la sortie standard ou d'erreur. Ne contient pas les détails d'implémentation internes, sauf s'ils sont critique pour comprendre l'interface. Décrit le cas principal, pour les détails sur les options, on utilise le paragraphe OPTIONS. S'il y a une sorte de grammaire d'entrée, ou un jeu de sous-commandes, on peut les placer dans une section UTILISATION supplémentaire (et placer un bref aperçu dans la section DESCRIPTION). |
| RETURN VALUE (VALEUR RENVOYÉE) | Donne une liste des valeurs qu'une routine de bibliothèque renverra à l'appelant et les conditions qui provoquent ces retours. |
| EXIT STATUS (CODE DE RETOUR) | Indique les codes de retour d'un programme et les conditions associées. |
| OPTIONS | Décrit les options acceptées par le programme et leur influence sur son son comportement. |
| USAGE (UTILISATION) | Décrit la grammaire de tout sous-langage implémenté. |
| EXAMPLES (EXEMPLES) | Donne un ou plusieurs exemples d'utilisation de la fonction, du fichier ou de la commande. |
| FILES (FICHIERS) | Liste les fichiers utilisés par le programme ou la fonction, tels que fichiers de configuration, de démarrage, et les fichiers manipulés directement par le programme. Il faut donner le chemin d'accès complet des fichiers et utiliser le mécanisme d'installation pour modifier le préfixe. Pour la plupart des programmes, l'installation par défaut se fait dans /usr/local, aussi, votre page de manuel de base devrait utiliser /usr/local comme base. |
| ENVIRONMENT (ENVIRONNEMENT) | Décrit toutes les variables d'environnement qui affectent le programme ou la fonction, ainsi que leurs effets. |
| DIAGNOSTICS (DIAGNOSTIQUE) | Fournit un survol des messages d'erreurs usuels et comment les considérer. Il n'est pas nécessaire d'indiquer les messages d'erreur système ou les signaux fatals qui peuvent apparaître durant l'exécution du programme, sauf s'ils sont traités spécialement. |
| SECURITY (SÉCURITÉ) | Décrit les problèmes de sécurité et leurs implications. Doit contenir les avertissements à propos des configurations ou des environnements à éviter, les commandes ayant des répercussions au niveau sécurité, etc. surtout s'ils ne sont pas évidents. Il n'est pas obligatoire de faire un paragraphe spécifique sur la sécurité. Si l'intelligibilité est améliorée, on peut placer ces informations dans les autres sections (telles que DESCRIPTION ou USAGE (UTILISATION)). Néanmoins, il est important de placer les informations de sécurité quelque part. |
| CONFORMING TO (CONFORMITÉ) | Décrit les standards ou les conventions suivis par l'implémentation. |
| NOTES | Contient des notes diverses. |
| BUGS (BOGUES) | Liste les limitations ou les défauts recensés, ainsi que les sujets à débat. |
| AUTHOR (AUTEUR) | Liste les auteurs de la documentation ou du programme afin de pouvoir leur envoyer les rapports de bogue. |
| SEE ALSO (VOIR AUSSI) | Fournit une liste des pages de manuel ayant un rapport, dans l'ordre alphabétique, suivies des autres documents éventuels. Il s'agit d'habitude de la dernière section. |

## Recherche par mot-clé

Si le sujet exact n'est pas déterminé, l'option -k permet une recherche par mot-clé :

## Commandes interactives

Une fois la commande man entrée, si le sujet est trouvé, la console présente la documentation page par page avec une interface similaire à la commande less ou more : l'appui d'une touche déclenche une commande immédiate.

### Navigation

Les terminaux récents permettent l'utilisation des touches de navigation : flèches, page suivante, page précédente...
* Défilement par lignes :
    Ligne suivante : ↵ ou ↓
    Ligne précédente : ↑
* Défilement par pages :
    Page suivante : ou ⇟
    Page précédente : B (back) ou ⇞
* Début / fin du document :
    Début du document ⇑ G
    Fin du document g

### Recherche dans le texte

/ puis entrez le terme rechercher ↵
L'écran défile directement sur la première occurrence trouvée ou bien affiche un message d'erreur. La commande met en valeur toutes les occurrences du terme.
Pour passer à l'occurrence suivante, il s'agit de la même commande mais sans entrer de terme à chercher : / ↵
La touche n permet de se placer sur l'occurrence suivante, la touche N sur la précédente.

### Quitter

Pour quitter, appuyez la touche Q (quit). Le contenu de l'écran du terminal est restauré.

# L'éditeur de texte vi

L'éditeur de textes vi
vi' (connu sous ses abréviations anglaises, prononcer vie-ail) est un éditeur de texte présent d'office sur la majorité des systèmes Unix actuels depuis 1976, souvent sous la forme d'un clone du logiciel vi originel.
vi est un éditeur modal, c'est-à-dire que la signification des boutons et des touches change selon le mode dans lequel il se trouve. L'un de ses intérêts a longtemps été de ne pas nécessiter de souris et de fonctionner avec un nombre réduit de touches. En effet, la présence de deux modes permet d'avoir un mode où les touches lettres servent à la saisie des caractères, en mode commande aux déplacements et autres commandes. De ce fait l'ensemble des nouvelles touches (flèches, clavier numérique et touches de fonction notamment) est totalement superflus. L'interface est donc la même pour tout ordinateur qu'il soit équipé d'un clavier de minitel ou d'un clavier avec d'innombrables touches.
Vi fut écrit par Bill Joy en 1976, « et ben ça ne nous rajeunit pas les enfants.»
Derrière un aspect rustique qui nécessites une familiarisation, se cache des fonctionnalités d'édition qui ne sont pas présentes dans d'autres éditeurs de texte. Le minimum à savoir pour utiliser vi est de connaître les deux touches permettant de basculer entre ces deux modes principaux.
Il y a donc 2 modes : insertion et commande.
* Pour passer du mode insertion au mode commande : touche < ESC >
* Pour passer du mode commande au mode insertion : touche i. (insert)
* En mode commande, on peut passer en un 3ème mode "mode Execution" en tapant ":'"(la ligne de commande est en bas de l'écran)
Les commandes de base de vi :
| Commande | Fonction de la commande |
| x | effacer une lettre (xterminator) |
| dd | effacer la ligne courante (delete) |
| yy | copier la ligne courante (yank) |
| p | coller la ligne copiée précédement lors de la commande yy ou de la commande dd |
| :x | aller à la ligne x (go to line) - Ex. :152 met le curseur à la ligne 152 |
| r | remplace un caractère (replace) |
| u | annule la dernière commande (undo) |
| :w | sauvegarder le fichier (write) |
| :q! | quitter vi sans sauvegarder (quit) |
| :wq | sauvegarder et quitter (write quit) |
| :help | pour afficher l'aide dans vi |
| :q | pour quitter la fenêtre d'aide si elle est ouverte ou l'éditeur |
| :w nom_fichier | enregistre ce qui est saisi dans le fichier nom_fichier |
| /toto | chercher la chaîne toto en avant |
| ?toto | chercher la chaîne toto en arrière |
| n | permet de chercher l'occurrence suivante de la chaîne |
| :s/alex/toto | remplace l'occurrence suivante de la chaîne alex par toto |
| :%s/alex/toto/gic | remplace la chaîne alex par toto dans tout le fichier "%" pour tout le fichier, "s" search, "g" global, "i" ignore la casse, "c" confirmation |
Il est difficile de savoir si on est en mode insertion ou en mode commande, le plus simple est d'appuyer plusieurs fois sur <ESC> pour être sûr d'être en mode commande.
vi est rustique, on le trouve sur tous les systèmes UNIX, même les plus vieux. Il est préférable d'utiliser vim (VI iMproved) quand c'est possible, c'est un éditeur vi amélioré
Après l'installation de vim, lancez le programme en tapant indifféremment vi ou vim
Vim est plus convivial, il prend en compte les flèches et d'autres fonctions du clavier récent.
Il existe bien entendu d'autres éditeurs de texte dans Linux, du plus perfectionné au plus basique, mais vi est celui qu'on trouve partout (même sur notre vieux minitel). Il est donc impératif d'en connaître les commandes de base.
Quelques autres éditeurs :

# Les shells

Shell veut dire Coquille, qui entoure le noyau. C'est un interpréteur de commandes qu'on utilise pour lancer des commandes ou programmer une suite de commandes. L'utilisateur discute avec le Shell, qui discute avec le noyau, qui à son tour discute avec le matériel. Originellement le shell est utilisé sous Unix, il s'est répandu depuis avec différentes versions, la forme la plus simple est sh.
Les versions connues :
* sh : shell Bourne
* ksh : korn shell
* Csh : Shell syntaxe du C
* Tcsh : Csh amélioré
* Bash : Bourne Again Shell
* Zsh : le petit dernier
Le shell est constitué de petits shells spécifiques à chaque travail, chacun ayant un fichier de configuration stocké dans le répertoire /home de chaque utilisateur, lequel peut les modifier à sa convenance :
* .profile : exécuté automatiquement lors d'un shell de connexion (à chaque login), quel que soit le shell
Fichiers de configuration spécifiques au shell Bash :
* .bash_profile : exécuté automatiquement lors d'un shell de connexion (à chaque login)
* .bashrc : chargé automatiquement lors d'un shell interactif
* .bash_logout : chargé lors de la fermeture du shell (à la déconnexion)
extraits des fichiers
les fichiers communs : /etc/profile et /etc/bash.bashrc
Autres fichiers liés au Bash
* .bash_history : c'est un fichier texte contenant l'historique des commandes tapées.

# La complétion

« L'art de la saisie des commandes ultra rapide ».
À chaque fois que vous tapez une commande, Linux vous aide à compléter votre commande en appuyant sur la touche TAB ↹.
Tapez le début de votre commande et en appuyant sur la touche TAB ↹, Linux vous la complète ou vous propose les différentes possibilités pour la compléter, à défaut vous aurez droit à un petit bip, s'il existe un trop grand nombre de propositions, Linux vous affiche ce nombre.
exemple :
* $ cd /h en tapant TAB ↹ Linux complète la commande en cd /home
* $ cd / en tapant TAB ↹ Linux me donne la liste de tous les répertoires de la racine afin que j'en choisisse un en tapant ses premiers caractères et que je complète encore par TAB ↹ si besoin est.

# Les jokers

Dans une commande sur les fichiers, on peut remplacer une partie d'un nom (un ou plusieurs caractères) de fichier par * ou un seul caractère par ?
Exemple
La commande zenity : man zenity

# Les répertoires importants

Une des premières difficultés pour les débutants Unix est de se repérer dans l'arborescence. Contrairement à un environnement Windows qui regroupe toutes les ressources nécessaires à un programme dans un même répertoire, les ressources dans un système unix (et dans une moindre mesure MacOS) sont réparties dans une hiérarchie générale. Ainsi si le code exécutable d'un programme se trouve dans le répertoire /bin, ses libraries se trouveront dans le répertoire /lib et ses fichiers de configuration dans le répertoire /etc.
La hiérarchie des systèmes unix est normalisée, la spécification étant accessible sur http://www.pathname.com/fhs/
Voici une liste des répertoires à connaître.

## Les programmes exécutables

* /bin : les commandes indispensables
* /usr/bin : les autres commandes
* /usr/local/bin : les commandes installées à la main

## Les programmes exécutables du super-utilisateur root

* /sbin : les programmes indispensables d'administration
* /usr/sbin : les autres programmes d'administration
* /usr/local/sbin : les programmes d'administration installées à la main

## Les fichiers de configuration

* /etc
En particulier, /etc contient les fichiers:

## Le(s) noyau(x) Linux

* /boot

## Les répertoires de travail des utilisateurs

* /home
Chaque utilisateur du système aura un répertoire dans /home portant son nom.
Par exemple le bureau de l'utilisateur "wiki" se trouve dans :
NB : si le bureau montre des icônes qui ne figure pas dans "/home/wiki/Bureau", on peut les retirer par exemple sur Gnome avec :

## Le répertoire de travail du super-utilisateur root

* /root

## Les librairies partagées

* /lib : les librairies indispensables
* /usr/lib : les autres librairies
* /usr/local/lib : les librairies des programmes installés à la main

## Les points de montage

* /mnt : Répertoire dans lequel on pourra créer des points de montage pour des systèmes de fichiers temporaires, destiné à un usage d'appoint. Les composants vitaux du système ne doivent pas dépendre de ce répertoire.
* /media : Répertoire dans lequel des points de montage seront créés automatiquement pour accéder aux supports de stockage amovibles (cdrom, clé usb...)

## Les périphériques

* /dev
En particulier, on trouve les fichiers :

## Les autres programmes et leurs fichiers annexes

* /usr
Ce répertoire est en lecture-seule et est destiné à être partagé. Les programmes installés par le système d'exploitation se trouvent dans /usr/bin. Les programmes installés manuellement par les utilisateurs se trouvent dans /usr/local.
« usr » veut dire Unix System Ressources et non pas user. Les fichiers relatifs aux utilisateurs du système se trouvent dans le répertoire « /home ».

## Le système de fichier virtuel

Donne les infos de la machine
* /proc

##### sur le processeur

Ex:/proc/cpuinfo

##### sur la mémoire

Ex:/proc/meminfo

##### sur les modules

Ex:/proc/modules

##### sur les montages du systeme

Ex:/proc/mount

##### sur la swaps

Ex:/proc/swaps

## Les fichiers temporaires

* /tmp
* /var/tmp

## Les données variables

* /var
Ce répertoire contient les données variables. En particulier:
* /var/log, ce répertoire contient les journaux (fichiers détaillant les historiques de programmes).
* /var/mail, ce répertoire contient les emails des utilisateurs du système. Un utilisateur du système peut voir ses emails via la commande « mail ».
* /var/spool, ce répertoire contient les données en attente de traitement (par un programme), et sont en générale supprimé après avoir été traité.
* /var/lib, ce répertoire contient les données des bases de données (Mysql, Postgresql) et les bases de données dpkg (rpm sur RedHat)
* /var/www : les sites Web

## Les programmes et ressources installés à la main

* /usr/local
Ce répertoire contient des données mis en place par l'administrateur du système, comme « /usr » mais dans un contexte plus « isolé » car ces ressources sont géré par ce même administrateur système, et contient des sous-répertoire tel que:

# Redirection des entrées/sorties
## Les entrées/sorties des processus

Chaque processus possède 3 flux standards qu'il utilise pour communiquer en général avec l'utilisateur :
* l'entrée standard nommée stdin (identifiant 0) : il s'agit par défaut du clavier,
* la sortie standard nommée stdout (identifiant 1) : il s'agit par défaut de l'écran,
* la sortie d'erreur standard nommée stderr (identifiant 2) : il s'agit par défaut de l'écran.
Ces flux peuvent être redirigés afin que le processus interagisse avec un autre au lieu d'interagir avec l'utilisateur.

## Redirection
### Rediriger la sortie standard

Quand on exécute une commande, le shell affiche le résultat sur la console de sortie (l'écran par défaut). On peut rediriger cette sortie vers un fichier en utilisant le signe >.
Exemple
Si le fichier existe déjà, il est écrasé.

#### Concaténation

Au lieu de créer un fichier, il est possible d'ajouter les sorties d'un processus à un fichier existant en utilisant le double signe >>.
Exemple
Si le fichier résultat existe déjà, les affichages sont concaténés.

#### Syntaxe complète

En fait, les signes > peuvent être précédés de l'identifiant du flux à rediriger. Pour la sortie standard, on peut donc utiliser les syntaxes suivantes :
Ce qui revient au même que les deux premiers exemples ci-dessus (redirection et concaténation).

### Rediriger la sortie d'erreur standard

La redirection du flux de sortie d'erreur standard utilise les mêmes signes, mais précédés de l'identifiant du flux : 2.
Exemples

### Rediriger l'entrée standard

Rediriger l'entrée standard permet d'entrer des données provenant d'un fichier au lieu du clavier.
Exemple

### Rediriger un flux vers un autre

Il est possible de rediriger un flux vers la sortie standard ou la sortie d'erreur en donnant l'identifiant du flux précédé du caractère & à la place du nom de fichier.
Exemple
Le fichier stdout_stderr.txt contient ce qui a été affiché à la fois sur le flux de sortie standard et le flux de sortie d'erreur.

### Échange des deux flux de sortie

L'échange des deux flux de sortie s'effectue en utilisant la syntaxe pour rediriger un flux vers un autre à trois reprises, en utilisant un identifiant de flux fictif comme intermédiaire (3).
Exemple

### Le pipe (un tube)

Redirige la sortie d'une commande vers l'entrée d'une autre commande. Il s'agit donc d'une chaîne de redirection entre deux processus qui ne passe pas par un fichier, mais par une zone mémoire du système.
Exemples
* Afficher la taille des fichiers et répertoires, et les trier du plus grand au plus petit :
* Même résultat, mais affiché page par page :
* Connaître le nombre de fichiers du répertoire /usr/bin :
Explications : L'option -1 de la commande ls affiche un fichier ou répertoire par ligne. La commande wc (word count) avec l'option -l (line) compte le nombre de lignes.
* Connaître tous les périphériques IDE détectés par le noyau Linux et les afficher page par page :
Explications : la commande dmesg affiche les messages du noyau Linux détectés durant le boot. La commande grep n'affiche que les lignes contenant le mot hd. La commande more affiche ces résultats page par page.
Autre exemple : extraire l'adresse IP de la carte réseau eth0 :

# Invoquer un programme en tâche de fond
## Invoquer un programme en tâche de fond

Certains programmes ne rendent pas la main immédiatement (exemple : la compilation d'un gros programme).
Pour récupérer la main, il suffit de rajouter un & (ET commercial ou Esperluette) à la fin de la commande :
Si on a lancé une commande qui ne rend pas la main et que l'on a oublié de rajouter le &, on peut utiliser la méthode suivante :
Le programme est alors stoppé. Il suffit de taper ensuite la commande bg (background) pour qu'il s'exécute en tâche de fond :
La commande fg (foreground) permet de refaire passer le programme en premier plan :
La commande jobs affiche les tâches en cours.

# Propriétaires et droits d'accès
## Les droits d'accès
### Fonctionnement

Chaque fichier du système est associé à des droits d'accès. Ceux-ci sont affichés par la commande ls en utilisant le format long : ls -l.
Ces droits d'accès sont résumés en 10 caractères de la forme suivante :
Exemple :
Le premier caractère représente le type de fichier :
Types de fichier :
| Type | Description |
| - | Regular file : fichier normal |
| d | Directory : répertoire |
| l | Link : lien |
| b | Block device : périphérique bloc (périphérique à accès direct) |
| c | Character device : périphérique caractère (périphérique à accès séquentiel) |
| s | Socket |
| p | Pipe (tube nommé) |
Le reste de la chaîne est scindé en 3 blocs de 3 caractères qui représentent les différents niveaux de droit :
* user(u) : droits concernant le propriétaire du fichier,
* group(g) : droits concernant les autres membres du même groupe que le propriétaire du fichier,
* other(o) : droits concernant tous les autres utilisateurs.
Les trois caractères d'un bloc sont les suivants, dans l'ordre :
* r (read) : droit de lire le fichier / lister le contenu du répertoire
* w (write) : droit d'écrire dans le fichier / modifier le répertoire (créer/supprimer des fichiers)
* x (execute) : droit d'exécuter le fichier (programme ou script) / ou de traverser le répertoire (changer le répertoire courant).
Si l'un des droits n'est pas accordé, un tiret est affiché à sa place.
Exemple :
Le fichier script.sh est un fichier normal (-) et est associé aux droits suivants :
* Le propriétaire peut lire, écrire et exécuter ce fichier (rwx),
* Les membres du même groupe que le propriétaire peuvent lire et écrire, mais pas exécuter ce fichier (rw-),
* Les autres utilisateurs peuvent seulement lire ce fichier (r--).
    Pour plus de détails voir : w:Permissions_Unix#Droits étendus.

### Modifier les droits d'accès

La commande chmod permet de modifier les droits associés à un fichier.
Enlever le droit de lecture (r) aux autres (o)
Ajouter un droit d'écriture (w) au groupe (g)
Combinaison des deux commandes :
Spécifier tous les droits avec une valeur numérique :

### Les droits par défaut et la commande umask

Les droits par défaut d'un nouveau fichier sont définis par rapport à un masque des droits défini pour chaque utilisateur avec la commande umask.
Afficher le masque courant :
Exemples :
* Un fichier est créé avec les droits par défaut 666 (rw-rw-rw-) filtré par le masque 022 :
    666 & ~022 = 644 rw- r-- r--
* Un >répertoire est créé avec les droits par défaut 777 (rwxrwxrwx) filtré par le masque 022 :
    777 & ~022 = 755 rwx r-x r-x

## Les propriétaires et les groupes
### La commande chown

La commande chown permet de changer le propriétaire d'un fichier ou d'un répertoire. Il faut être propriétaire du fichier ou répertoire, ou root selon la ressource que l'on souhaite modifier.

### La commande chgrp

Comme la commande chown, la commande chgrp change le groupe propriétaire d'un fichier ou d'un répertoire.
On peut aussi changer le propriétaire et le groupe en une seule commande :
Le raccourci suivant existe également :

## Les Access Control List (ACL)

chapitre à écrire

### Afficher les ACL

afficher tous les droits, y compris dans les sous-répertoires : $ getfacl -R *
afficher tous les droits sauf les droits de base : $ getfacl --skip-base -R *

### Modifier une ACL

manipulation de la commande setfacl

### Sauvegarder les ACL

manipulation de la commande star
Pour les systèmes de fichier XFS, il convient également de sauvegarde les ACLs. La sauvegarde des ACLs doit être effectuée dans un fichier avant la sauvegarde sur bande.
ou
si la sauvegarde se fait en chemin absolu.
Le fichier /home/acl.sauv sera également sauvegardé sur bande.

# Processus
## Définition d'un processus

Un processus est un programme en cours d'exécution. Par exemple, chaque fois que l'on lance la commande ls, un processus est créé durant l'exécution de la commande.
Un processus est identifié par un numéro unique que l'on appelle le PID (Process IDentifiant).
Un processus dispose d'un processus père que l'on appelle le PPID (Parent PID).
La particularité d'un processus est de s'exécuter avec les droits accordés à l'utilisateur qui a lancé la commande. Ceci participe fortement à la sécurité du système. Ainsi, si un utilisateur contracte un programme malveillant (un virus par exemple), le processus sera soumis au droit d'accès de cet utilisateur, et ne pourra pas effectuer des opérations non autorisées (comme par exemple modifier le fichier de mots de passe).
Au démarrage de l'ordinateur, le système charge le noyau Linux qui se charge de l'initialisation du matériel et de la détection des périphériques. Ceci fait, il démarre ensuite le processus init qui a comme particularité d'être le premier processus et de toujours utiliser le PID 1. Ce processus démarre ensuite des processus noyaux (dont le nom est noté entre crochets), et les premiers processus systèmes.
Chaque processus a ainsi un père (sauf init), et peut être à son tour le père d'autres processus, etc.
La commande pstree permet de visualiser l'arbre des processus. L'option -p permet de visualiser les PID de chaque processus.
Exemple :
Dans cette arborescence, on constate que le processus init est bien le père de tous les processus.

## Afficher la liste des processus

La commande ps permet d'afficher les processus. Utilisée sans option, la commande ps affiche les processus de l'utilisateur courant associé au terminal courant.
Pour connaître tous les processus, y compris ceux qui ne sont pas associés au terminal courant, on utilise les options aux (notation BSD) et -ef (notation Unix). Pour connaître la totalité des options, consulter la page de manuel de la commande ps (man ps).
Exemples :
Au final, on obtient les mêmes résultats.

## Les signaux
### Définition

Les signaux offrent un mécanisme permettant d'envoyer un message à un processus en cours d'exécution. On se sert généralement des signaux pour terminer un processus, lui indiquer de relire sa configuration, etc.

### Les différents signaux

Pour connaître la liste des signaux, il suffit de consulter la page de manuel de signal (section 7) :
Les signaux les plus connus sont les trois suivants :
* SIGHUP (signal n°1) : pour beaucoup de services réseaux, la réception du signal n°1 lui indique de lire sa configuration. Par exemple, cela permet d'indiquer au processus apache (serveur web) de relire sa configuration, sans avoir a arrêter et redémarrer le processus.
* SIGKILL (signal n°9) : termine un processus (arrêt brutal). Utile lorsque le SIGTERM ne marche pas (processus planté).
* SIGTERM (signal n°15) : demande au processus de s'arrêter (arrêt propre).

### Envoyer un signal à un processus
#### kill

La commande kill permet d'envoyer un signal au processus. Syntaxe :
Exemples :
Exemple :
ou directement :
(ce qui fonctionne aussi s'il y a plusieurs processus du même nom)

#### killall

La commande killall permet d'indiquer le nom du processus plutôt que son PID, et va envoyer le signal à tous les processus possédant ce nom. Exemple :
Utilisé sans option, les commandes kill et killall envoient le signal n°15 (arrêt propre).

#### pkill

Pour tuer un processus par son nom.
Par exemple pour killer une session bloquée :

## Autres commandes affichant les processus

La commande top permet d'afficher (entre autres) la liste des processus de manière dynamique (rafraîchit la liste toutes les 3 secondes).
Lorsque la commande top fonctionne, les lettres suivantes permettent de changer son fonctionnement :
* h : affiche l'aide
* q : quitte la commande top
* M : tri les processus par utilisation de la mémoire (du plus gourmand au plus sobre)
* P : tri les processus par utilisation du processeur (du plus gourmand au plus sobre)
* s : permet de changer la durée de rafraîchissement de top
* k : permet d'envoyer un signal à un processus

## Les processus légers

description des processus légers (light weight process, or thread)

### Les Thread ID (TID ou SPID)

Les processus légers SPID connus aussi sous le nom de TID (Threads ID) sont les numéros des threads. Explication par l'exemple :
Traduire les explications des TID et de la technique du double forking
Voir aussi : Processus léger sur Wikipédia

## Limiter un processus

CPULimit est un utilitaire qui permet de limiter la ressource CPU utilisée par un processus
La syntaxe est la suivante : cpulimit --pid <pid> --limit <limit>
<pid> est le pid du processus cible, et <limit> la limitation effective en pourcentage (maximum 100% sur un simple cœur, 200 pour un double ...)
Exemple :
Exemple avec le nom de processus (au lieu du pid) :
Parler de la commande nice

## Conserver un processus en activité

Il est possible de laisser tourner un processus lancé depuis la console même sans être connecté. On utilise la fonction nohup qui permet d'ignorer le signal SIGHUP lors de la déconnexion.
La sortie standard est automatiquement redirigée vers nohup.out dans le répertoire courant, sauf si une redirection est spécifiée.

# Locale

Cette page est considérée comme une ébauche à compléter . Si vous possédez quelques connaissances sur le sujet, vous pouvez les partager en éditant dès à présent cette page (en cliquant sur le lien « »).
Ressources suggérées : Aucune (vous pouvez indiquer les ressources que vous suggérez qui pourraient aider d'autres personnes à compléter cette page dans le paramètre « ressources » du modèle engendrant ce cadre)
Sous Linux, les locale sont des variables d'environnement qui ont un impact essentiel sur le bon fonctionnement des logiciels.
Une de ces variable permet notamment de configurer le codage de caractère utilisé par un logiciel. Aujourd'hui, les systèmes utilisent massivement utf-8 depuis le début du siècle. Ceci permet de manipuler des textes ou des fichiers comportant les caractères unicode

## Notes
# Configuration du réseau
## Quelques définitions

Nous avons trois grands axes pour configurer un réseau.

### L'adresse IP

Tout d'abord, une adresse IP est unique sur un réseau. C'est une suite de 4 nombres allant de 0 à 255 (inclus) séparés par des points (par exemple 192.168.1.32). Cette adresse IP appartient à une classe réseau. Il existe 5 classes d'IP :
* Classe A -> de 0.0.0.0 à 127.255.255.255
* Classe B -> de 128.0.0.0 à 191.255.255.255
* Classe C -> de 192.0.0.0 à 223.255.255.255
* Classe D -> Réservée à un usage multicast.
* Classe E -> Utilisée à titre expérimental.
De l'adresse IP et de sa classe, on peut déduire trois grandes adresses:
* Le masque réseau (netmask) qui serait dans notre cas 255.255.255.0 (classe C) sert à identifier le réseau associé à une adresse IP.
* L'adresse réseau (network address) : 192.168.1.0, cette adresse ne peut être attribuée à aucun ordinateur sur le réseau.
* L'adresse de diffusion (broadcast address) : permettant d'envoyer un message à toutes les machines situées sur le réseau (ici 192.168.1.255).
Il existe la notation CIDR(Classless Inter-Domain Routing) (/24). Sous Linux, on a l'outil ipcalc qui permet de voir cette notation.
Exemple :

### La passerelle

La passerelle ou GATEWAY permet de relier deux réseaux informatiques différents. Dans notre cas, elle est du type : 192.168.1.1.

### Le serveur DNS

Le serveur DNS ou Domain Name System établit la liaison entre un nom de domaine et une adresse IP. Grâce au serveur DNS nous pouvons retrouver une machine sur un réseau via son adresse IP ou bien sous sa forme canonique (par exemple www.domaine.fr).

## Les fichiers de configuration
### /etc/network/interfaces

Sur la distribution Debian, les paramètres réseaux vont être stockés à cet emplacement: /etc/network/interfaces. Éditons ce fichier avec vim. Nous retrouvons l'adresse Loopback (127.0.0.1) autrement appelé le localhost qui boucle sur notre propre machine.
Nous allons maintenant attribuer les adresses nécessaires au bon fonctionnement de notre serveur, car celles-ci avaient été attribuées automatiquement lors de l'installation. Nous allons donc enlever la configuration DHCP en nous attribuant une adresse spécifique pour notre serveur (192.168.30.219), ce qui nous donne :
AVANT :
APRES :
Il faut maintenant relancer le fichier et vérifier que la configuration a bien été prise en compte.

### /etc/resolv.conf

Ce fichier contient les adresses IP des serveurs de noms :
Les options search et domain permettent de spécifier un nom de domaine à rajouter à toute requête portant sur un nom qui ne contient pas de point. Ce qui signifie ici qu'une recherche sur pc235 sera tentée en utilisant pc235.mondomaine.fr. Si aucune correspondance n'est trouvée, une autre recherche sera alors tentée avec pc235.autredomaine.fr, etc.
L'option domain permet d'utiliser un nom (mais un seul) comprenant éventuellement un sous-domaine:
Dans ce cas, une recherche sera d'abord tentée avec pc235.truc.mondomaine.fr, puis, en cas d'échec, avec pc235.mondomaine.fr.
Ces deux options ne doivent pas figurer en même temps dans le fichier resolv.conf.
L'option nameserver permet d'indiquer l'adresse IP du serveur de noms. On peut mettre plusieurs lignes nameserver pour indiquer plusieurs serveurs de noms, mais attention, l'ordre à une importance : lors de la résolution d'un nom, le système va contacter le premier serveur DNS, et si il n'a pas obtenu de réponse au bout d'un certain temps (temps généralement limité à 30s), il contactera le deuxième.

### /etc/hostname

Ce fichier contient le nom de la machine (hostname). Il est utilisé lors du démarrage de la machine pour positionner le nom de la machine.

### /etc/hosts

Le fichier /etc/hosts est l'ancêtre du DNS. À la création de l'Internet, il y avait très peu d'ordinateurs connectés, et ce fichier contenait la liste de ces ordinateurs et de leurs adresses IP. Chaque fois que de nouveaux ordinateurs étaient connectés à Internet, il fallait mettre à jour ce fichier pour accéder à ces nouveaux ordinateurs. Vu le nombre croissant d'ordinateurs connectés à Internet, ce fonctionnement n'était plus adapté et a donné lieu à l'invention du DNS.
Désormais, ce fichier permet de connaître les adresses IP d'ordinateurs non présents dans le DNS.
Ce fichier contient une ligne pour l'entrée loopback :
Ce fichier doit aussi contenir une ligne indiquant le nom de l'ordinateur et son adresse IP; ceci est utile en cas de défaillance du serveur DNS :
À la fin de ce fichier, on trouve désormais des entrées pour IPv6 :
On peut y ajouter :
Puis tester immédiatement en local :

### /etc/host.conf

Historiquement, ce fichier contenait l'ordre de recherche pour la résolution des noms : d'abord la consultation du fichier /etc/hosts, et ensuite l'interrogation du DNS :
Désormais, ces préférences d'ordre de recherche sont indiquées dans le fichier /etc/nsswitch.conf (voir ci-dessous).

### /etc/nsswitch.conf

Ce fichier remplace désormais le fichier /etc/host.conf et permet d'indiquer au système l'ordre de recherche pour la résolution des noms :
L'option files indique au système de consulter d'abord les fichiers (/etc/hosts pour les noms d’hôtes et /etc/networks pour les noms de domaines) avant d'aller interroger le DNS.

### /etc/networks

Ce fichier contient le nom des réseaux et leur adresse réseau :

## Les commandes
### hostname

La commande hostname permet de connaître le nom de l'ordinateur :
L'option -f (-f ou --fqdn) permet de connaître le nom de l'ordinateur avec son nom de domaine (Full Qualified Domain Name) :
La commande hostname permet aussi de changer dynamiquement nom de machine, mais attention, cette modification est temporaire et ne sera plus active après un reboot. Pour changer de manière permanente le nom de la machine, il faut modifier le fichier /etc/hostname et le fichier /etc/hosts (voir ci-dessus) :

### ifconfig

Cette commande est de plus en plus souvent remplacée par ip depuis 2015.
Utilisé sans argument, la commande ifconfig affiche les interfaces réseau actives :
L'option -a permet d'afficher toutes les interfaces, y compris celles qui ne sont pas activées.
On peut aussi spécifier à ifconfig l'interface à afficher :
La commande ifconfig permet également de configurer une interface réseau. Attention, cette modification est faite dynamiquement et ne sera plus active après un redémarrage.
La commande ifconfig peut aussi créer des alias d'interface réseau. On peut ainsi affecter plusieurs adresses à une seule interface réseau.
Si vous supprimez l'interface principale (ici : eth0), tous les alias qui en dépendent seront supprimés.

### ip

La commande ip fait partie du projet LARTC : Linux Avanced Routing and Traffic Control. L'objectif est de fournir des fonctionnalités avancées réseaux qui ne sont pas disponibles dans la pile réseau standard Unix / Linux.
La commande ip remplace les commandes arp, ifconfig et route. Pour afficher la table arp :
On peut également écrire la forme abrégée en indiquant uniquement la première lettre :
Pour afficher les interfaces réseaux :
ou la forme abrégée :
Pour visualiser la table de routage :
ou la forme abrégée :
La commande ip permet également de modifier les informations : rajouter / supprimer une entrée ARP, rajouter / supprimer des adresses IP, rajouter / supprimer des routes ...
Pour renouveler son adresse auprès du serveur DHCP :

### arp

Le protocole ARP permet de trouver l'adresse MAC d'un ordinateur de mon réseau en fonction de son adresse IP.
La commande arp permet d'afficher la table de correspondance adresses IP => adresses MAC :
Attention, cette table de correspondance est régulièrement vidée.

### route

La commande route permet d'afficher la table de routage réseau :
L'option -n affiche la table de routage réseau sans remplacer les adresses IP par leurs noms canoniques :
On peut obtenir le même résultat en utilisant la commande netstat :
La commande route permet de modifier la table de routage. On peut ainsi rajouter une route pour contacter un réseau ou une machine particulière.
Exemple : joindre le réseau 10.0.0.0/8
Exemple : joindre la machine 1.2.3.4 :
parler de comment rendre une route permanente (modif de /etc/network/interfaces)

### ping

La commande ping permet de tester si on arrive à joindre un serveur donné. Cette commande utilise le protocole ICMP et envoi des paquets ICMP de type echo-request. Si l'ordinateur distant est joignable, il répondra à ce message par un paquet ICMP echo-reply.
Si l'ordinateur est injoignable, on n'obtiendra pas de réponse à nos paquets ICMP :
Attention, si l'ordinateur distant ne répond pas, cela ne signifie pas obligatoirement qu'il est indisponible. Le problème peut venir du réseau (la commande traceroute permettra de déterminer l'endroit qui bloque), ou il peut être paramétré pour ne pas répondre au protocole ICMP, ou un firewall sur la route peut bloquer le protocole ICMP.
L'option -c de la commande ping permet d'indiquer le nombre de paquets à envoyer :

### traceroute

La commande traceroute permet d'afficher la route empruntée pour atteindre un ordinateur donné :

### mtr

La commande mtr (my traceroute) permet aussi d'afficher la route empruntée pour atteindre un ordinateur donné, mais ré-actualise la liste en permanence :

### nslookup

La commande nslookup permet d'interroger un serveur DNS :
Cette commande est interactive, elle nécessite l'intervention de l'utilisateur. On utilise désormais les commandes host et dig pour effectuer les mêmes opérations (voir ci-dessous).

### host

La commande host permet d'effectuer une résolution DNS :
Elle permet aussi d'effectuer une résolution DNS inverse (quel nom canonique est associé à une adresse IP donnée ?) :

### dig

La commande dig permet d'interroger les enregistrements DNS (appellé aussi Ressources Records ou RR) d'un nom de domaine donné :
On peut indiquer à la commande dig le Ressource Record que l'on désire connaitre :
On peut indiquer à la commande dig le serveur DNS à interroger :

### whois

La commande whois permet d'interroger la base de données whois contenant les informations sur le propriétaire du domaine et les personnes responsables pour les aspects administratif et technique :
parler du routage avancé + rajouter lien vers LARTC

## Références

* ↑ Consulter par exemple le wikilivre À la découverte d'Unicode.
* ↑ https://www.linux.com/tutorials/replacing-ifconfig-ip/

# Les utilisateurs et groupes
## Les fichiers de configuration
### /etc/passwd

* contient la liste des utilisateurs, un par ligne
* contient d'autres informations relatives aux utilisateurs, dont notamment les UID (User IDentifiant) et GID (Group IDentifiant)
* contenait autrefois les mots de passe chiffrés de chaque utilisateur, mais désormais ces mots de passe sont stockés dans le fichier /etc/shadow
Le format de ce fichier est indiqué dans la page de manuel du fichier de configuration passwd (section 5) :
La majorité des comptes définis dans ce fichier sont des comptes administratifs ne servant uniquement à l'exécution de certaines applications (daemons). Ainsi, les processus fonctionnant avec ces comptes sont limités par les droits d'accés de ces derniers.

### /etc/shadow

* contient les mots de passe chiffrés
* ne peut être lu uniquement par le root ou les membres du groupe shadow
* contient des informations relatives à l'expiration des mots de passe
Le format de ce fichier est indiqué dans la page de manuel du fichier de configuration shadow (section 5) :
La commande chage permet de changer les informations relatives à l'expiration des mots de passe (man chage).

### /etc/group

* contient la liste des groupes, un par ligne
* pour chaque groupe, le numéro du groupe (GID)
* les membres du groupe
Le format de ce fichier est indiqué dans la page de manuel du fichier de configuration group (section 5) :

### /etc/gshadow

Contient les informations cachées sur les groupes. Il contient des lignes avec les champs suivant séparés par des deux-points :
* nom du groupe
* mot de passe chiffré
* liste d' administrateur du groupe séparés par des virgules
* liste des membres du groupe séparés par des virgules

### gpasswd

La commande gpasswd administre le fichier /etc/group. Elle permet d' affecter un mot de passe à un groupe.

### newgrp

Newgrp change l´identifiant de groupe réel actuel à la valeur du groupe indiqué, ou au groupe par défaut défini dans /etc/passwd si aucun nom de groupe n´est fourni.
La commande groups permet de connaitre les groupes dont je fais partie :
On peut aussi obtenir la liste des groupes (et leurs GID) avec la commande id :

### Conversion avec ou sans shadow

parler des commandes pwconv et grpconv

### Vérification de passwd et group

parler des commandes pwck et grpck

## Gérer les utilisateurs
### Ajouter un utilisateur

La commande useradd permet d'ajouter des utilisateurs. Le fichier /etc/default/useradd contient les paramètres par défaut de la commande.
Invoqué sans option, cette commande crée l'utilisateur, mais le compte n'est pas activé. De plus, elle n'a pas crée le répertoire de travail de l'utilisateur.
Sous Debian, on utilisera plutôt la commande adduser qui offre plus d'options (positionnement du mot de passe et du champ GECOS à la création du compte, et création du répertoire de travail).
La commande adduser dispose du fichier de configuration /etc/adduser.conf qui permet de positionner les valeurs par défaut de la commande. La commande adduser offrira plus d'options que la commande useradd.
Controler et compléter la description du fichier de configuration adduser.conf
Le fichier /etc/adduser.conf permet de configurer les options par défaut de la commande adduser
Extrait de adduser.conf
La commande adduser permet aussi de rajouter facilement un utilisateur à un groupe donné :
Syntaxe : adduser <le login> <le groupe>
Exemple :
Pour vérifier, on dispose de 3 possibilités : - grep audio /etc/group - id pierre - groups pierre
Le répertoire /etc/skel (skeleton : squelette) contient les fichiers par défaut à copier dans les répertoires de travail des utilisateurs nouvellement créés.

### Modifier un utilisateur

La commande usermod permet de modifier les informations relatives à un utilisateur donné.
Dans certains cas, il sera plus simple de modifier directement les fichiers /etc/passwd et /etc/group plutôt que d'utiliser cette commande.

### Supprimer un utilisateur

La commande userdel permet de supprimer des utilisateurs.
Sous Debian, on utilisera plutot la commande deluser qui offre plus d'options (notamment la possibilité de créer une archive de tous les fichiers de l'utilisateur avant de supprimer son répertoire de travail).
De la même manière que adduser, la commande deluser dispose du fichier de configuration /etc/deluser.conf qui permet de spécifier son comportement par défaut.
description du fichier deluser.conf
Extrait de deluser.conf

## Gérer les groupes
### Ajouter un groupe

La commande groupadd permet d'ajouter un groupe.
Sous Debian, on dispose de la commande addgroup, qui est en réalité un lien vers la commande adduser.

### Modifier un groupe

La commande groupmod permet de modifier les informations relatives à un groupe donné.
Pour ajouter un utilisateur à un groupe :
Dans certains cas, il sera plus simple de modifier directement le fichier /etc/group plutôt que d'utiliser cette commande.

### Supprimer un groupe

La commande groupdel permet de supprimer des groupes.
Sous Debian, on dispose de la commande delgroup, qui est en réalité un lien vers la commande deluser.

### Modifier manuellement les fichiers /etc/passwd, /etc/shadow, /etc/group et /etc/gshadow

Dans certains cas, il est plus simple d'éditer manuellement les fichiers de configuration /etc/passwd, /etc/shadow, /etc/group et /etc/gshadow plutôt que d'utiliser les commandes précédement évoquées.
Les commandes suivantes permettent de garantir qu'un seul root est en train de modifier un de ces fichiers :
* vipw : modification du fichier /etc/passwd
* vipw -s : modification du fichier /etc/shadow
* vigr : modification du fichier /etc/group
* vigr -s : modification du fichier /etc/gshadow
Pour plus d'information, se reporter aux pages de manuel (man vipw et man vigr).

# Le processus d'initialisation
## Le chargement du noyau Linux

Lorsque l'on allume son ordinateur, la carte mère effectue un test automatique qui se charge de tester le bon fonctionnement des composants de la carte mère (processeur, mémoire, etc.). Ce test s'appelle le POST (Power-On Self Test). Si tout est OK, ce test se termine par un (et un seul) bip.
Ceci fait, le BIOS charge ensuite le programme stocké dans le boot secteur du disque dur.
Sur architecture PC, il existe deux programmes permettant de charger le noyau Linux, ou un autre système d'exploitation.

### LILO

LILO (LInux LOader) a été le premier logiciel permettant d'effectuer cette opération.
Exemple de fichier de configuration de Lilo (/etc/lilo.conf) :
Ce fichier se compose de paramêtres communs (disque dur de boot, timeout ...) et de sections pour chaque système d'exploitation à booter.
Chaque fois que l'on modifie ce fichier, il faut exécuter la commande lilo afin de re-écrire dans le boot secteur l'emplacement exact du noyau sur le disque dur.

### GRUB

Aujourd'hui, on utilise le programme GRUB (GRand Unified Bootloader) car il offre des possibilités supplémentaires.
Contrairement à Lilo, Grub sait lire une partition Linux (ext2/3, XFS, reiserFS ...) afin de charger son fichier de configuration (/boot/grub/menu.lst) et le(s) noyau(x) Linux.
Exemple de fichier de configuration de Grub (/boot/grub/menu.lst)
À la différence de Lilo, il n'est pas nécessaire d'exécuter une commande particulière lorsque l'on modifie ce fichier.
parler du initrd

### Messages du noyau Linux

Une fois chargé en mémoire, le noyau va se charger de détecter et d'initialiser les composants de la carte mère et les périphériques présents.
Ces messages sont affichés sur l'écran lors du démarrage.
La commande dmesg permet de consulter ces messages ultérieurement. Exemples :
À noter que la commande dmesg affiche tous les messages détectés durant le boot, ainsi que les messages du noyau affichés par la suite (c.a.d. durant le fonctionnement du système).
Dans certains cas, l'affichage de la commande dmesg peut être tronqué (notamment les messages affichés durant le boot). Dans ce cas, on peut consulter le fichier /var/log/dmesg qui ne contient que les messages du boot.

## Le processus init

Une fois que le noyau a détecté l'ensemble des composants de l'ordinateur, il lance le processus du système : init.
Le processus init a comme particularité d'avoir le PID (Process IDentifiant) n$^o$ 1 (c'est le premier processus), et de fait, il est le père de tous les autres.
Le processus init est lancé par le noyau pour démarrer les autres processus internes à ce dernier (noté entre crochet lorsque l'on fait ps aux), comme par exemple les processus kjournald qui gère les journaux des systèmes de fichiers journalisés. }}
Le processus dispose d'un fichier de configuration, c'est le fichier /etc/inittab, contenant entre autres les runlevel, paramètres de init.
La syntaxe de ce fichier est la suivante :
code:niveau:action:commande
Exemple de fichier /etc/inittab :

## Les runlevels et les scripts de démarrage

Une fois que le système a effectué le runlevel S (initialisation minimale, comme par exemple vérifier l'intégrité des systèmes de fichiers), il va dans le runlevel 2 (Debian).
Les niveaux de Runlevel
* S : Initialisation commune à tous les runlevels
* 0 : Arrêt de la machine
* 1 : Single-User
* 2,3,4,5 : Fonctionnement normal
* 6 : Reboot de la machine
Les principe de fonctionnement est le suivant :
* tous les scripts de démarrage et d'arrêt sont stockés dans le répertoire /etc/init.d/.
* les répertoires rc0.d, rc1.d ... rc6.d contiennent des liens qui vont appeler les scripts d'initialisation.
* Si le lien commence par un S, le script va être appelé avec l'option start
* Si le lien commence par un K, le script va être appelé avec l'option stop
* le numéro qui suit le S ou le K indique l'ordre de démarrage ou d'arrêt.
Exemple, le serveur d'impression cupsys :
Le script de démarrage et d'arrêt est situé dans /etc/init.d :
Le lien suivant indique qu'il faut appeller ce script avec l'option start dans le runlevel 2 (runlevel par défaut sous Debian) :
Le lien suivant indique qu'il faut appeller ce script avec l'option stop dans le runlevel 0 (arrêt de la machine) :
Pour lister les daemons (actifs et inactifs) :

### La commande update-rc.d

Sous Debian, la commande update-rc.d permet de gérer les liens des runlevels.
Par exemple, pour enlever le démarrage automatique du serveur web apache :
Pour re-activer le démarrage automatique du serveur web apache :
Pour connaitre la liste des options de la commande update-rc.d, il suffit de l’appeler sans argument :
Pour activer Nginx :

### La commande chkconfig

attention : spécifique à REDHAT
Pour savoir en quel(s) runlevel est lancé un service (ie. postgresql)
Pour positionner le lancement d'un service à un runlevel donné (ie. 3, 4 et 5)
parler du modèle de script d'initialisation /etc/init.d/skeleton

## Commandes pour manipuler les runlevel

La commande runlevel permet de connaître le runlevel dans lequel on est :
Dans cet exemple, on est dans le runlevel n°2 (fonctionnement sous Debian). Le N nous indique le runlevel précédent (N (No) : pas de runlevel précédent)
La commande init ou la commande telinit permet de changer de runlevel. Exemple :

## Arrêter ou redémarrer le système

Pour arrêter le système :
* Commun à tous les UNIX : shutdown
* Spécifique Linux et systèmes récents : halt et reboot
NB : on rajoute un & pour garder la main
Il existe différentes options telles que :
* -h (h pour halt) : arrêt immédiat
* -r now (r pour reboot) : redémarrage immédiat
* -h +10 : arrêt différé dans 10 minutes
* -h 10:30 : arrêt à 10h30
* -c : annule l'arrêt

## Références

* ↑ (en) Dr. Sam Liles, ICCWS2014- 9th International Conference on Cyber Warfare & Security: ICCWS 2014, Academic Conferences Limited, 24 mars 2014 (lire en ligne)
* ↑ https://linuxonfire.wordpress.com/2012/10/19/what-are-init-0-init-1-init-2-init-3-init-4-init-5-init-6-2/

# Les systèmes de fichiers
## Les systèmes de fichiers Unix

UNIX gère les i-nodes (data structure) dans une table qui contient des informations telles que :
* le propriétaire ;
* le groupe de fichiers ;
* les droits d'accès ;
* la date de modification ;
* le type de fichier.
Sous UNIX et LINUX on trouve des partitions, ex. : boot, var, tmp, home qui permettent d'organiser le système de fichiers. Au départ EXT2 sous UNIX, aujourd'hui EXT3 par défaut correspond à EXT2 plus le journal, qui a l'avantage de consigner tout ce que fait le système, et qui en cas de crash lui permet de démarrer plus rapidement sans erreurs. Les deux formats sont compatibles. Il existe toutes sortes de systèmes de fichiers.

### Non journalisés

* Ext et Ext2 : Extented FS version 2 (Linux, BSD)
* FAT : File Allocation Table (DOS/Windows, Linux, BSD, OS/2, Mac OS X). Se décompose en plusieurs catégories :
** FAT12 ;
** FAT16 ;
** FAT32 ;
** VFAT.
* FFS : Fast File System (BSD, Linux expérimental)
* HFS : Hierarchical File System (Mac OS, Mac OS X, Linux)
* HPFS : High Performance FileSystem (OS/2, Linux)
* minix fs (minix, Linux)
* S5 (UNIX System V, Linux)
* UFS : Unix File System (BSD, Linux en lecture seule)

### Journalisés

* BFS (BeOS, Haiku, Linux en lecture seule et expérimental)
* Ext3 : Extented FS version 3 - notamment pour l'ajout de la journalisation (Linux, BSD)
* Ext4 : Extented FS version 4 - notamment pour étendre sa capacité à 1024 péta-octets (Linux expérimental)
* HFS+ (Mac OS X, Linux)
* JFS (AIX, OS/2, Linux)
* JFS2 AIX5
* LFS : (Linux)
* NSS : Novell Storage Services (Netware et Suse Linux)
* NTFS : New Technology FileSystem (Windows NT/2000/XP, Linux (écriture disponible grâce au pilote NTFS-3G), Mac OS X en lecture seule)
* ReiserFS (Linux, BSD en lecture seule)
* Reiser4 (Linux expérimental)
* Spufs : Synergistic processing unit filesystem
* UFS+ : Unix FS + journal (BSD, Linux en lecture seule)
* XFS (Irix, Linux, BSD en lecture seule)
* ZFS : Zettabyte FileSystem (Solaris10, FreeBSD 8.0)

### Réseau

* AFS Andrew File System : (Aix, Linux)
* Coda (Systèmes de fichiers informatique) (Linux)
* NFS (tous les Unix, Linux, Mac OS X) (Windows pour la 4)
* NCP NetWare Core Protocol (Novell NetWare, Linux en client seul)
* SSHFS (tous les Unix ?, Linux)
* SMB ou Server message block (Windows) (Linux, BSD et Mac OS X via Samba)
* CIFS (Évolution de SMB, supporté par Samba ainsi que par Windows 2000 et XP)

### Cluster

* GPFS, General Parallel File Sytem : Linux, AIX
* LustreFS, Compression de Linux et de Cluster : Linux
* OCFS2, développé par Oracle : Linux
* PVFS2, Parallel Virtual FileSystem version 2 : Linux, Unix

### Spécialisés

* CFS Cryptographic File System : FS chiffré (BSD, Linux)
* cramfs : FS compressé (Linux en lecture seule)
* EFS Encrypting File System : FS chiffré au dessus de NTFS (Windows)
* ISO 9660 : en lecture seule sur tous les systèmes lisant les CDROM/DVDROM de données
* JFFS et JFFS2 : FS pour support physique sans block, typiquement des cartes flash. Il est compressé et journalisé (Linux)
* QNX4fs : FS utilisé pour le temps réel (QNX, Linux en lecture seule)
* UDF : le format de disque universel (système de fichiers des DVD-ROM et des disques optiques réinscriptibles tels les CD-RW, DVD±RW, etc.)

## mount

Cette commande indique tous les systèmes de fichiers qui sont montés. On l'utilise pour accéder à une partition (en root pour accéder au CD-ROM ou au lecteur disquette).
Exemple : pour brancher une clé USB il faut la monter. On édite le fichier log par la commande tail -f /var/log/messages afin de savoir sur quel système de fichiers se trouve la clé. Puis on utilise mount pour accéder au contenu de la clé.
Exemple :
Il est possible de préciser le système de fichier s'il ne le détecte pas
Syntaxe :
Exemple :
Lorsque l'on a fini d'utiliser la clé il faut la démonter à cause du cache.
Pour sauvegarder des montages réguliers, on utilise le fichier "fstab" détaillé ci-après, et sudo mount -a monte tous ceux qui sont dedans.

## umount

La commande umount permet de démonter une partition. Cette opération est indispensable si on veut être sûr que les données soient correctement écrites sur la partition. Exemples :
ou
Si la partition est en cours d'utilisation, on ne pourra pas la démonter et la commande umount va retourner un message d'erreur :
Deux commandes permettent de connaître les fichiers ouverts et les processus qui sont en train d'utiliser la partition et qui empêchent le démontage.
La commande lsof (list open files) permet de connaître les fichiers ouverts :
La commande fuser permet aussi de connaître les processus qui ont des fichiers ouverts sur la partition.

## Le fichier /etc/fstab

Le fichier /etc/fstab contient la liste des partitions montées automatiquement au démarrage du système.
Extrait d'un fichier fstab :
Pour monter automatiquement une partition au démarrage, il suffit de rajouter une ligne dans le fichier /etc/fstab, comme par exemple :
Pour chaque partition, on peut spécifier des options dans le fichier /etc/fstab. Options les plus courantes :
* user : permet aux utilisateurs d'effectuer les opérations de montage / démontage
* noauto : ne monte pas automatiquement la partition au boot
La commande sync force le noyau à écrire le cache. Pour savoir la taille qu'il reste sur la clé on utilisera la commande df (disk free) -h (human readable) pour avoir les informations en kilo,mega,giga. df -i affiche le pourcentage d'occupation de la table des i-nodes.

### NFS

Pour les partages NFS, on peut lancer sudo apt install nfs-common.

## Formater un système de fichiers

La commande mkfs (make filesystem) permet de formater un système de fichiers. Exemple :
parler des inodes et superblocks
ATTENTION LE SYSTÈME DE FICHIER NE DOIT PAS ÊTRE MONTÉ
mkfs est un wrapper (aiguillage)
Afin de simuler le formatage, nous allons créer un disque dur virtuel. Pour simuler ceci avec un disque dur virtuel, on utilisera le pseudo périphérique loop.
Ceci crée un fichier vide hd1 qui aura une taille de 100 Mo.
On attache le pseudo-pérphérique /dev/loop0 à notre fichier hd1.
Une fois le disque dur virtuel crée on peut le formater :
Pour le démonter :
CAS PARTICULIER : pour les disquettes, on effectue en général un formatage de bas niveau :
ATTENTION À BIEN DÉMONTER AU PRÉALABLE LE PÉRIPHÉRIQUE
La commande suivante permet de vérifier l'intégrité du système de fichiers :
L'option -c de fsck permet de vérifier les bad blocks (en lecture seule par défaut). L'option -v (verbose, soit verbeux) pour voir ce qu'il fait.
parler des commandes : badblocks, tune2fs, dumpe2fs

## Le swap
### Partition de swap

Le SWAP signifie échange, il s'agit d'une mémoire virtuelle en effet lorsque la mémoire de l'ordinateur arrive à saturation, le système écrit sur une partition SWAP de façon à libérer de la mémoire.
Il est possible de créer une partition SWAP grâce à la commande mkswap :
On utilisera la commande swapon /dev/sdb5 pour l'activer :
Avec la commande 'free,' il est possible de vérifier si le swap est activé :
Pour lister les partitions SWAP :

### Fichier de swap

Il est possible de créer un fichier swap en complément d'une partition SWAP, pour faire ceci nous allons commencer par créer un fichier de huit gigaoctets :
On initialise ensuite le fichier en swap :
On active le swap :
Pour désactiver la partition de SWAP :
Si l'on tape la commande free on constate que la taille du swap a augmenté.
Pour visualiser son utilisation autrement :

## Utilitaires disques-durs
### Technologie S.M.A.R.T.

SMART est une technologie de monitoring des disques dur.
Nom du package apt : smartmontools
Le fichier /etc/smartd.conf permet de programmer des tests, et l'envoie de messages d'alertes.

### hdparm

hdparm permet de configurer les paramètres d'accès au disque dur.
Pour tester les performances on utilise l'option -tT

### hddtemp

hddtemp utilise les données SMART du disque dur spécifié et retourne sa température.
L'option -n permet de ne renvoyer que la valeur de la température (utile pour les scripts)

# Le système virtuel /proc
## Le système de fichiers virtuel /proc

/proc n'existe pas sur le disque dur, il est fournit dynamiquement par le noyau, d'où le nom de virtuel.
Il permet de fournir des informations sur ce que voit le noyau.
En outre pour accéder à certains renseignements il sera nécessaire de monter obligatoirement /proc (définit dans /etc/fstab et fait automatiquement au boot).
Les commandes ps, top, uptime (et bien d'autres) utilisent /proc pour récupérer des informations.
Quelques exemples d'informations :
Certains répertoires commencent par des numéros, il s'agit des PID (Process IDentifier) des processus en cours d'exécution. À l'intérieur, on peut obtenir des renseignements sur le processus et sur son contexte d'exécution. Exemples :
Parler de /proc pour modifier dynamiquement le comportement du noyau
Parler de /sys et des sysctl

# Les périphériques /dev
## Les fichiers spéciaux

Nous allons nous intéresser plus particulièrement au répertoire /dev :
Ce dossier contient tous les périphériques matériels, par exemple : un lecteur CD-ROM, une carte son, une carte réseau, etc.
Il contient également les pseudo-périphériques. Quelques exemples :
* /dev/zero génére des zéros
* /dev/random génère de l'aléatoire
* /dev/null constitue un trou noir à octets, et notamment utilisé pour se débarrasser des fichiers et des affichages
* /dev/loop0 permet de créer de faux périphériques de type block (stockage) à partir de fichiers créés avec la commande dd
Si on liste le contenu de /dev
On s'aperçoit que certains périphériques sont de type c (de l'anglais character) dans ce cas ils communiquent octet par octet. Ex : un port série.
Alors que d'autres sont de types b (blocks) ils communiquent par blocs de données (ex: un disque dur).
Par ailleurs le noyau identifie chaque périphérique au moyen de deux numéros, le majeur (en vert) et le mineur (en rouge), exemple :
Les partitions sda1 à sda4 ont le même majeur. Le majeur correspond au premier disque dur SCSI ou SATA.
Le noyau identifie ensuite chaque partition grâce au numéro mineur.
Les majeurs et les mineurs sont définis dans la documentation accompagnant le noyau Linux dans le fichier /usr/src/linux/Documentation/devices.txt ... et oui! comme vous pouvez vous en douter, le noyau Linux est livré avec une documentation très fournie disponible dans le répertoire Documentation/ livré avec le noyau, voir chapitre Le noyau Linux et les modules.
Extrait de /usr/src/linux/Documentation/devices.txt :
La commande mknod sert à créer de nouveaux périphériques :
On peut également directement lui affecter les droits d'accès :

## dmidecode

Cette commande affiche les informations sur les périphériques hardware. Par exemple pour déterminer la version et puissance de la RAM :

# L'ordonnanceur de travaux cron

cron est un daemon qui permet de programmer des tâches répétitives.

## Configuration de cron

Le fichier de configuration de cron est /etc/crontab, éditable uniquement par le root. Exemple :
Si on veut recevoir un mail à chaque échec d'une tâche, ajouter :
Voici la syntaxe de la programmation de la fréquence de répétition :
m h dom mon dow user command :
| code | signification | valeur ou note |
| m | minutes | 0 à 60 |
| h | heure | 0 à 23 |
| dom | day of month / jour du mois | 1 à 31 |
| mon | month / mois | 1 à 12 |
| dow | day of week / jour de la semaine | 0 à 7, 0= dimanche, 7= dimanche, on peut aussi mettre les trois premières lettres du jour en anglais |
| user | user / utilisateur | utilisateur appelant la commande |
| command | command / commande | commande appelée par l'évènement |
Tous les champs peuvent être remplacés par "*" si on souhaite toutes les valeurs correspondantes.
Notation avancée :
On peut définir des valeurs multiples ou des plages de valeurs pour les heures, les jours etc... :
Par exemple, au lieu de faire plusieurs lignes de cron pour plusieurs fois le même évènement, on peut mettre plusieurs valeurs séparées par ","
On peut aussi indiquer une plage de valeur dont les limites sont séparées par "-".
De même, on peut définir des fréquences avec "/". Par exemple, toutes les 2h s'écrira */2 dans la deuxième colonne.

## Exemples

L'utilisateur root appelle la commande beep, toutes les heures à 0 minute le 7 mars.
L'utilisateur root appelle la commande beep, à 8h15 et 8h45 tous les jours.
L'utilisateur toto appelle la commande beep toutes les heures de 8h à 18h tous les jours.
L'utilisateur titi appelle la commande beep à midi tous les lundi, mercredi et vendredi.
L'utilisateur tata appelle la commande beep toutes les 2h du lundi au vendredi.

## Répertoires de cron

En plus de la commande cron, il existe des répertoires spécifiques pour définir des commandes cron à fréquences précises. Ces répertoires particuliers sont localisés dans le repertoire /etc
Titre du tableau :
| cron.hourly | toutes les heures |
| cron.daily | tous les jours |
| cron.weekly | toutes les semaines |
| cron.monthly | tous les mois |
Il suffit de mettre un fichier script exécutable dans le répertoire choisi pour qu'il s'exécute.
Dans le même ordre d'idée, on peut rajouter des répertoires particuliers reliés à des fonctions spécifiques d'une entreprise ou d'une personne, pour exécuter des cron. Il suffit de mettre des fichiers contenants des lignes cron dans le répertoire /etc/cron.d/.
exemple : /etc/cron.d/comptabilite
Une fois le crontab modifié, il faut lui faire prendre en compte les modifications. Pour cela, on dispose de trois méthodes :
ou
ou

## Les crontabs utilisateurs

Un utilisateur peut programmer ses propres crontabs. Ces crontabs sont stockés dans /var/spool/cron/crontabs/<login>
Titre du tableau :
| crontab -l | donne la liste des crontabs actifs |
| crontab -e | permet d'éditer son propre crontab |
En utilisant la commande crontab , il n'est pas nécessaire de relancer le daemon cron pour que les modifications soient prises en compte.

## Droits d'accès

parler de cron.allow et cron.deny

## L'horloge Linux

Avant de planifier ses opérations il est primordial de bien s'assurer que les informations de temps système sont correctes.

#### Réglage manuel

Pour connaître la date actuelle on utilise la commande date :
Cette même commande accepte des arguments pour forcer la mise à jour de l'horloge système au format "MMJJHHmmYYYY". Il faut disposer des droits super utilisateur pour cette action.
Enfin, il existe deux horloges dans le système, l'horloge matérielle et l'horloge logicielle. Pour synchroniser ces deux horloges utilisez la commande hwclock.

#### Réglage automatique (NTP)

Network Time Protocol (NTP) est un protocole de synchronisation de l'heure courante. Pour que l'heure de la machine soit récupérée du réseau :
Lors du changement d'heure hiver/été où on passe de 2 h à 3 h, les tâches programmées entre 2 h 00 et 2 h 59 ne seront donc pas exécutées. À l'inverse, lors du changement d'heure été/hiver, ces mêmes tâches seront exécutées deux fois (à 3 h, il est encore 2 h). Afin d'éviter ce désagrément, la plupart des systèmes Unix sont configurés pour utiliser le temps universel coordonné (UTC), qui n'est pas sujet à ces règles de changement d'heure.

# Le backup : tar et gzip

Régulièrement, il vous faudra archiver des informations, en particulier des données utilisateurs. Pour cela, le système GNU/Linux intègre 2 outils: TAR et GZIP. Comme vous allez le voir, ces 2 outils sont complémentaires dans le procéssus d'archivage des données, ou backup.

## Archiver des données avec tar

Le nom de cette commande vient du système de sauvegarde sur bande : Tape ARchive. Le principe est simple : prendre un grand nombre de fichiers (et/ou de répertoires) et les regrouper en un seul gros. tar est une commande récursive. Elle va archiver toute l'arborescence en partant du répertoire que vous lui spécifiez.

### Archivage

Syntaxe :
Si vous rajoutez v après c, la commande va afficher à l'écran toutes ses actions.
Exemple :
Note: Comme vous le voyez sur notre exemple, la commande tar retire le / du répertoire parent. En faisant cela, elle évite les écrasements de fichiers dans le cas ou vous restituez votre fichier au même endroit.

### Test de l'archive

Une fois l'archivage effectué, vous pouvez vérifier votre archive avec la commande :

### Restitution

De même, si vous rajoutez v après x, la commande affichera les informations.
Exemple :

## gzip

La commande gzip est un compresseur de données. Il va partir d'un fichier et compresser l'information pour en diminuer la taille.

### Compresser un fichier

Exemple :
En utilisant ls -l , on voit très bien la taille du fichier images non compressé, qui est passé de 10240 octets à 4662 octets.
Pour compresser chaque fichier d'un dossier, utiliser l'option "recursive" : gzip -r. Par contre gzip ne permet pas de compresser tout le dossier dans un seul fichier .gz (d'où l’intérêt de le combiner avec tar).
Pour compresser sous un autre nom, deux solutions :
* -S (suffixe)
* -c (sortie standard). Ex : gzip -c test.log > $(date +"%y_%m_%d")_test.log.gz

### Décompresser un fichier

Exemple :

### Lire un .gz

Il existe la commande zgrep pour filtrer le contenu des fichiers gzippés, évitant ainsi de les décompresser, grepper, puis recompresser. Ex :

## Combiner tar et gzip

On peut combiner tar et gzip pour archiver et compresser en une action (option z) :
parler des autres outils : dump/restore, compress, cpio ...

## Les alternatives à gzip
### bzip2

bzip2 est un autre algorithme de compression. Il est plus performant mais beaucoup moins rapide que gzip.
Pour compresser un fichier avec bzip2 :
Pour le décompresser :
Tout comme gzip, on peut indiquer à tar d'utiliser bzip2 pour compresser l'archive (option j):

### Comparaison des logiciels de compression

Comparaison des logiciels de compression

## Un shell script de sauvegarde journalière de /etc

Voici un shell script qui permet de sauvegarder quotidiennement le répertoire /etc :

## Les sauvegardes incrémentales

La commande find permet de trouver des fichiers correspondants à des critères donnés. On peut par exemple connaître la liste des fichiers modifiés depuis 1 jour :
En combinant la commande find et la commande tar, on peut ainsi facilement sauvegarder les fichiers modifiés depuis la veille, et ainsi réaliser une sauvegarde incrémentale.
La commande suivante retourne la liste de tous les fichiers du système modifiés depuis hier (en excluant les fichiers contenus dans /proc, /dev et /sys), et stocke la liste de ces fichiers dans le fichier /tmp/fic_du_jour:
On peut ensuite appeler la commande tar avec l'option -T qui permet d'indiquer la liste des fichiers à archiver :
Grâce aux tubes (pipe), on peut s'affranchir de passer par un fichier temporaire et directement enchaîner les deux commandes :
Toujours grâce aux tubes, on peut découper le fichier obtenu en plusieurs fichiers d'une taille donnée :
Pour re-assembler les fichiers découpés, on utilise la commande cat :

## Les logiciels spécialisés

parler de rsync, amanda, bacula, mondorescue et partimage

# ghost avec partimage
### installation d'un serveur d'images

sur le serveur
ensuite il faut faire plusieurs modifications.
Allez dans le répertoire partimaged et modifier le fichier partimagedusers afin de donner l'autorisation de se connecter a votre utilisateur.
il faut créer un dossier qui contiendra les images.
partimage fonctionnant avec l'utilisateur partimag il faut lui donner les droits.
redemmarer le service

### sur le client

installation de partimage
avec l'utilisateur root on lance partimage
la vous tombez sur un interface graphique
* sélectionner la partition à sauvegarder.
* saisissez le nom de l'image ici: /opt/img/mondebian.
* cocher la case connexion au serveur entrer l'adresse ip puis F5.
il devrait vous demander un login et un mot de passe défini dans /etc/partimaged/partimagedusers.
On donne une description de l'image On sélectionne le type de compression et ensuite " OK ".

### sauvegarder une partition NTFS

telechargement de KNOPPIX ici.
rebooter votre machine avec knoppix une fois démarré si il n'y a pas de DHCP sur le réseaux il faut attribuer un adresse IP.
et lancer partimage
restauration

# sauvegarde de fichiers avec rsync
### Serveur de sauvegardes avec rsync ssh

sur le serveur
sur le client
Il est nécessaire de générer une paire de clés se reporter à la partie ssh-keygen ici
sauvegarder des fichiers
options rsync
* -a : permet de copier tous les fichiers, y compris les fichiers et dossiers cachés (fichiers commençant par .)
* -c : active la compression de type gzip pendant le transfert.
* -t Conserver la date
* -p Conserver les permissions
* -o Conserver le propriétaire
* -g Conserver les groupes
* --delete Effacer sur la destination
* -v affiche les opérations avant de les effectuer
* --ignore-existing Ignorer les fichiers existants
* -x Ne pas quitter le système de fichier
* --progress Montrer la progression
* --size-only Taille seulement
* --delete : si le fichier « linux » existe dans « destination » et pas dans « source », il sera supprimé.

# Les fichiers journaux syslog
## Syslog

syslog est un daemon dédié à l'enregistrement des journaux (log) Les journaux log sont stockés dans le répertoire /var/log/
Voici le contenu du répertoire /var/log
un journal log est un fichier texte dont les évènements sont enregistrés, un par ligne.
* « Extrait de fichier syslog - les messages sont enregistrés avec la date et l'heure de l'évènement »
Dans chaque ligne d'évènement on distingue :
* La date à laquelle l'évènement a été déclenché
* Le processus déclencheur de l'évènement
* Le processus ayant demandé l'ajout du message correspondant au log
* Le niveau de gravité du message (priority)
TP : afficher les dernières procédures de login, l'heure des tentatives, si elles ont échoué ou réussi.
le fichier log /var/log/auth.log est le journal des authentifications.
syslog possède un fichier de configuration syslog.conf, il est stocké dans le répertoire /etc . On peut modifier ce fichier pour l'adapter à nos besoins en messages d'évènements survenus sur le système : envoi de mail, authentification, etc...
Ce fichier est un fichier texte, dont chaque ligne est séparée en deux parties :
* 1ère partie : (le ou) les processus demandeurs (séparés par un point virgule) suivi d'un point et de leur niveau de priorité : <dispositif>.<niveau>
<dispositif> est appelé facility <niveau> est appelé priority, c'est le niveau de criticité du log. Exemple : panic, error, warning, debug, info...
* 2ème partie : le fichier log correspondant (qui reçoit le message et l'ajoute à la liste de ses messages) : <fichier de log>
* « Voici un exemple de fichier /etc/syslog.conf »
expliquer en détail la syntaxe du fichier
lister les différents fichiers de log et leur utilité
parler des outils de surveillance et d'analyse des logs : swatch, logwatch, logreport ...

### Swatch

L'utilitaire swatch peut surveiller un fichier de log et réaliser une action s'il voit passer un mot-clé.
Exemple de fichier de configuration /root/.swatchrc :

## Le Serveur de log

On peut être amené à créer un serveur de log si on possède plusieurs serveurs dont on souhaite centraliser les log, par mesure de sécurité ou par commodité (facilité de consultation, d'archivage, etc...)
Si on monte un serveur de log, il suffit d'ajouter :
* côté serveurs envoyant les messages de log :----> une ligne dans le fichier syslog.conf de chaque serveur en mentionnant les processus envoyant les messages (exemple : *.* pour tous) et le nom du serveur de log ou son adresse IP précédée de @, comme ainsi :
* côté serveur de log :----> l'option SYSLOGD ="-r" dans le fichier /etc/default/syslogd
* Schéma de réseau avec Serveur de log
* Extrait du fichier syslogd d'un serveur non dédié au log - la commande SYSLOGD n'est pas activée

## La commande logger

La commande logger permet d'envoyer un message à syslog même connecté en utilisateur
-t permet d'ajouter unnom, un tag c'est un mot quelconque pour signer le message

## Le programme logrotate

logrotate est un fichier texte situé dans etc/, il sert à configurer 'la politique des rotations' des logs. Effectivement, il faut supprimer les anciens fichiers log, sinon on risque une saturation du disque. Pour cela on peut programmer des rotations de logs qui se traduisent par l'archivage des fichiers log assez récents et la suppression des anciens, et ceci avec une périodicité bien définie.
La page man de logrotate donne toute la syntaxe et les mots clé.
Les lignes importantes à configurer du fichier /etc/logrotate.conf:
* monthly : tourner les logs tous les mois (enlever le weekly existant dans le fichier de configuration par défaut Debian)
* rotate n : conserver n fichiers (ici un fichier par mois [mettre 60, soit 5 ans])
* create : créer un nouveau fichier de log
* compress : compresser le fichier tourné
Pour tester vos fichiers de configuration logrotate.conf (et donc de logrotate.d/*) taper : /usr/sbin/logrotate -dv /etc/logrotate.conf.
extrait du fichier logrotate.conf
parler du répertoire /etc/logrotate.d

# Installation de nouveaux logiciels

Au début de linux, installer un logiciel libre nécessitait de récupérer les sources et de les compiler. Cette étape de compilation pouvait être fastidieuse car il fallait disposer de toutes les librairies utilisées par le logiciel.
Redhat a énormément simplifié ce processus en inventant le format RPM (Redhat Package Manager), format qui propose les logiciels open-source pré-compilés.
Debian s'en est inspiré pour créer le format DEB.
* REDHAT = logiciel.x.y.rpm
* DEBIAN = logiciel.x.y.deb
x et y correspondent aux numéros de version du logiciel.

## dpkg

dpkg est le programme qui permet d'installer, mettre à jour et supprimer un logiciel en format DEB. Sur Redhat, la commande rpm fait la même chose.

### Installer un fichier DEB

L'option -i (i: install) de dpkg (debian package) permet d'installer un fichier DEB :

### Connaitre la liste de tous les logiciels installés

L'option -l (l : list) permet de connaitre la liste de tous les logiciels installés :

### Savoir quel package a installé tel fichier

L'option -S permet de savoir quel package a installé tel fichier :

### Connaitre le descriptif d'un package installé

L'option --status permet de consulter le descriptif d'un package installé :
On apprend notamment :
* la priorité : s'agit-il d'un package indispensable ou optionnel ?
* la taille disque occupée par le package installé
* le nom et l'email du mainteneur Debian
* l'architecture
* le numéro de verstion
* les dépendances
* une description courte et longue

### Autres options de dpkg

La commande dpkg dispose d'une page de manuel détaillant toutes les options disponibles :

## apt-get

La commande apt-get permet d'installer, mettre à jour et supprimer les logiciels. Le principal avantage d'apt-get par rapport à dpkg est sa capacité à télécharger les packages sur les mirroirs Debian et de résoudre les dépendances nécessaires au logiciel, et ceci de façon récursive.

### Installer un logiciel

L'option install de la commande apt-get permet d'installer un logiciel :
Note: apt-get install va télécharger tous les packages nécessaires au bon fonctionnement du logiciel, et apeller dpkg -i sur chaque fichier DEB téléchargés.
Il existe plus de 300 miroirs DEBIAN

### Rajouter des mirroirs

On peut rajouter des miroirs à apt-get en modifiant le fichier /etc/apt/sources.list. Ce fichier contient la liste des mirroirs officiels DEBIAN, et on peut rajouter d'autres mirroirs.
On peut rajouter à ce fichier un miroir contenant des fichiers DEB non-intégrés dans les miroirs officiels Debian :

### Mettre à jour la liste des logiciels disponibles

Chaque fois que l'on modifie le fichier /etc/apt/sources.list, il faut lancer la commande apt-get update pour récupérer la liste des nouveaux logiciels :
Note: apt-get utilise la commande wget pour télécharger les fichiers.

### Mettre à jour tous les logiciels installés

L'option upgrade de apt-get prend la liste des paquets installés, regarde sur le dépôt si ces logiciels sont disponibles dans une version plus récentes. Si c'est le cas, cette commande va mettre à jour ces logiciels.

### Effacer les fichiers DEB installés

Par défaut, la commande apt-get conserve tous les fichiers DEB installés dans le répertoire /var/cache/apt/archives.
L'option clean permet d'effacer les fichiers DEB que l'on a installé :

### Autres options de apt-get

La commande apt-get dispose d'une page de manuel détaillant toutes les options disponibles :

## apt-cache
### Chercher un package

L'option search de la commande apt-cache permet de rechercher un terme sur les paquets installés et non-installés.

### Voir les informations d'un package

L'option show de la commande apt-cache permet de voir les informations d'un paquet (installé ou non).

### Autres options de apt-cache

La commande apt-cache dispose d'une page de manuel détaillant toutes les options disponibles :

## aptitude

La commande aptitude est un remplaçant d'apt-get, son principal avantage est de désinstaller les dépendances.

## apk

Si la distribution est basée sur Alpine Linux, elle renvoie :
Il faut alors utiliser apk update et apk add. Ex :

## synaptic

Le programme synaptic permet d'effectuer les mêmes opérations que la commande apt-get depuis l'interface graphique.

## Les documentations des packages

Chaque package Debian est accompagné d'une documentation. Ces documentations se trouvent dans le répertoire /usr/share/doc :
/usr/share/doc/<nom du package>/
Certaines documentations sont compressées en gzip afin d'économiser de la place disque. On peut utiliser les commandes zcat, zmore ou zless pour visualiser ces fichiers sans avoir à les décompresser :

## Installer un logiciel à partir des sources

Dans certains cas, on peut être amené à devoir installer un logiciel à partir des fichiers sources :
* le logiciel n'est pas disponible sous Debian en .DEB
* on a besoin d'une version plus récente du logiciel
* on a besoin d'une option uniquement activable durant la compilation
Pour faire ceci, on télécharge les sources du logiciel et on va les compiler.
Debian fournit un répertoire particulier destiné à accueillir les programmes installés à la main : /usr/local.
Si on regarde le contenu de ce répertoire, on constate qu'il contient des sous-répertoires déjà présents à la racine :
Ces répertoires vont accueillir tous les fichiers des programmes installés à la main :
* les exécutables : /usr/local/bin ou /usr/local/sbin
* les fichiers de configuration : /usr/local/etc
* les librairies : /usr/local/lib
* les pages de man : /usr/local/man
* les fichiers communs (icones, traductions ...) : /usr/local/share
Pour illustrer cette méthodologie, nous allons installer pidgin.
Tout d'abord, on télécharge les fichiers sources du logiciel dans le répertoire /usr/local/src :
La première chose à faire est de lire le fichier README :
On apprend dans ce fichier qu'il faut lire le fichier INSTALL pour connaître les dépendances et la procédure pour compiler le logiciel :
Comme dans la majorité des logiciels écrits en langage C, il faut effectuer la procédure standard : ./configure; make; make install .
On lance donc la première commande :
Cette étape se solde par une erreur : pidgin a besoin de la librairie perl XML parser. On cherche donc le paquet Debian contenant cette librairie :
On installe donc le packet libxml-parser-perl :
On relance le ./configure :
Cette étape se solde à nouveau par une erreur : pidgin a besoin de la librairie de développement glib2. On cherche donc le paquet Debian contenant cette librairie et on l'installe :
On relance le ./configure :
Cette étape se solde à nouveau par une erreur : pidgin a besoin de la librairie de développement xml2. On cherche donc le paquet Debian contenant cette librairie et on l'installe :
On relance le ./configure :
Cette fois-ci, l'étape s'est terminée sans erreur et on peut lancer la compilation :
Ca y est (enfin!), le logiciel s'est correctement installé, et l'exécutable a été copié dans le répertoire /usr/local/bin :
On peut désormais lancer le logiciel et l'utiliser :
parler de checkinstall

# Le noyau Linux et les modules

Dans certains cas, on peut être amené à recompiler un noyau Linux :
* support d'un périphérique (driver)
* activation d'une option
Les sources du noyau Linux sont disponibles sur kernel.org dans le répertoire /pub/linux/kernel/v2.6/.
Les sources doivent être installées dans le répertoire /usr/src et il faut un lien linux vers la version du noyau que l'on désire compiler :
Si on désire utiliser les mêmes options de compilation du noyau actuel, on copie le fichier /boot/config-2.6.18-5-686 dans le répertoire /usr/src/linux sous le nom .config :
Pour lancer la configuration (en mode texte) du noyau, on tape ensuite make menuconfig. Il faut avoir précédement installé la librairie de développement ncurses et tous les outils de compilation :
On installe ensuite kernel-package qui contient les outils Debian permettant de fabriquer un packet .deb contenant le noyau Linux, les modules, le initrd et un script configurant Grub pour booter sur le nouveau noyau (cf explications ci-dessous) :
On lance ensuite la configuration du noyau via make menuconfig :
On configure le noyau, on quitte en enregistrant la configuration.
Debian fournit une méthode particulière pour lancer la compilation du noyau. il faut auparavant installer le packet kernel-package.
La procédure Debian consiste à fabriquer un fichier .DEB contenant le noyau et les modules compilés. L'avantage de cette méthode est de faciliter la mise à jour du noyau. De même, elle va automatiquement mettre à jour GRUB ou LILO pour démarrer sur le nouveau noyau.
Si on veut que Debian fabrique le fichier initrd automatiquement, il suffit de l'indiquer avec l'option --initrd de make-kpkg.
On lance la compilation du noyau et des modules avec la commande make-kpkg :
On peut également fabriquer un initrd manuellement, voici la procédure :
On le rajoute dans /boot/grub/menu.lst :
Il ne reste plus qu'à rebooter pour démarrer sur le nouveau noyau.
Si tout c'est bien passé, le système va démarrer sur le nouveau noyau. Sinon, le noyau va s'arrêter sur un kernel panic et il faudra rebooter sur le noyau précédent, reprendre la configuration du noyau, le recompiler (avec un numéro de version différent, comme par exemple custom.2).
On vérifie que l'on a bien démarré sur notre nouveau noyau avec la commande uname :
Pour plus d'informations sur la compilation d'un noyau selon Debian, on peut consulter le Debian Linux Kernel Handbook.

## Modules
### lsmod

Cette commande permet de visualiser les modules chargés en mémoire.
Syntaxe:

### modinfo

Cette commande permet de visualiser les informations du module comme le nom du créateur, et les options de chargements.
Syntaxe:
mettre un exemple

### insmod et modprobe

Bien que ces deux commandes permettent de charger un module, la différence tient du fait que certains modules ont besoins que d'autres modules soient chargés.
insmod tente de charger le module demandé et si celui-ci a besoin d'un autre module pour se charger et que ce dernier ne l'est pas, insmod renvoie un message d'erreur et ne charge pas le module.
Syntaxe:
modprobe, lui, charge les modules dépendant au modules avant de lancer celui-ci.
Syntaxe:

### rmmod

Cette commande décharge le module dont le nom est indiqué. Contrairement aux autres commandes, il ne faut pas lui indiquer le chemin du module, mais son nom tel qu'il apparaît listé par la commande lsmod.
Syntaxe:
rmmod décharge le module nom_du_module

### depmod

À faire...
/etc/modules

# Autres commandes utiles
## Manipulation des flux et des fichiers textes
### awk

* Wikipédia propose un article sur : « awk ».
La commande awk permet d'effectuer des manipulations sur des fichiers texte (ou un flux redirigé en entrée), dont notamment afficher une colonne particulière. Exemple :
Cette commande dit à dpkg que l'on ne veut que la deuxième colonne.

### sed

* Wikipédia propose un article sur : « Stream Editor ».
sed est un utilitaire de traitement de données capable d'utiliser les expressions régulières.
Exemples :
* Pour remplacer toute « chaine1 » avec « chaine2 » dans le fichier « chemin1.txt » :
* Pour substituer toute « chaine1 » dans le fichier « chemin1.txt » avec « chaine2 » et envoyer le résultat dans le fichier « chemin2.txt » :
* Exemple de changement de format de date :
donne :
* Si erreur d’édition sous Windows : ^M, convertir avec :
Pour le stocker en variable :
Pour que le regex soit interprété, lancer sed -E.

## Trouver les commandes et les programmes
### which

* Wikipédia propose un article sur : « which ».
La commande which permet de connaitre dans quel répertoire se situe une commande (présente dans le PATH) :

### updatedb et locate

* Wikipédia propose un article sur : « locate ».
La commande locate (ou slocate) permet une recherche rapide sur le système de fichier (suite à une indexation réalisée par updatedb).
Lorsque l'indexation a eu lieu il y a plus de 8 jours, la commande locate l'indique par un message.
Pour réindexer le système de fichier :
Note sur les droits : updatedb utilise par défaut une base d'indexation globale. Il faut donc avoir les droits super-utilisateur pour mettre à jour l'indexation globale.

## Divers
### file

* Wikipédia propose un article sur : « file (Unix) ».
La commande "file" permet de connaître le type du fichier indiqué en paramètre.

### du

* Wikipédia propose un article sur : « du (Unix) ».
La commande "du" sert à afficher la taille des grandes espaces (partitions de disque et répertoires)
L'option "s" affiche seulement un total pour chaque type d'argument.
L'option "h" permet l'affichage automatique de l'unité adaptée (Ko, Mo, Go...).

### df

* Wikipédia propose un article sur : « df (Unix) ».
La commande df affiche l'espace occupé par les systèmes de fichiers.
L'option "h" permet l'affichage automatique de l'unité adaptée (Ko, Mo, Go...).
Pour les inodes :

### eval

* Wikipédia propose un article sur : « Eval ».
Ajoute une couche d'évaluation, par exemple pour les variables variables. Ex :

### timeout

Permet de lancer une commande qui se stoppera au plus tard après le temps défini. Ex :

# Installation RAID1 logiciel + LVM + XFS

Voici la configuration à obtenir lors de l'installation de Debian :

# Scripts de surveillance

Ce chapitre contient différents scripts de surveillance de l'activité d'un serveur Linux

# En langage Python
## alimon.py (A LInux MONitor)

Lien direct : alimon.py.

# Théorie des réseaux sans fil
## Réseaux sans fil de type PAN, LAN, MAN et WAN
## Les réseaux sans fil PAN

PAN : Personal Area Network

### La norme ZBEE

* Norme 802.15.4
* Consomme très peu d'énergie
* Bas débit (maximum 250 Kbit/s)
* Idéal pour les applications de type domotique et automatisme
* Faible coûts de fabrication du composant (1$)
La norme définit trois débits différents :
* 250 Kbit/s en 2.4 GHz (international)
* 20 Kbit/s en 868 MHz (Europe)
* 40 Kbit/s en 915 MHz (USA)

### La norme Wireless USB

Objectif : remplacer l'USB
Autres noms : W-USB (Wireless USB), UWB (Ultra-Wide Band), Wimedia
* Norme 802.15.3
* Très haut débit (jusqu'à 480 Mbit/s)
* Idéal pour les applications multimédia (audio, vidéo) et pour le transfert de données
* Possibilité de fonctionner en réseau ou en mode ad-hoc
* Authentification et chiffrement possible
Débits théoriques :
* 54 Mbit/s à 2.4 GHz
* jusqu'à 480 Mbit/s de 3.1 à 10.7 GHz

### La norme Bluetooth

* Norme 802.15.1
* Inventé par Ericsson, aujourd'hui groupement de 2500 sociétés
* Technologie peu onéreuse (composant à partir de 3$) et fortement intégré (puce de 9 mm x 9 mm)
* Débits théoriques : de 1 à 3 Mbit/s selon la version de la norme
La norme Bluetooth utilise la fréquence 2.4 GHz et définit trois puissances d'émission :
* 1 mW : portée de quelques mètres
* 2.5 mW : portée de 10 à 20 mètres
* 100 mW : portée de 100 mètres
Un réseau Bluetooth, un piconet, est composé d'un maître et de 7 esclaves maximum. Le débit sera partagé entre les différents membres du piconet.
On peut interconnecter des piconets pour former un scatternet (scatter : dispersion)
Les communications peuvent être symétrique (vitesses d'émission et de réception identiques) ou asymétrique (vitesses d'émission et de réception différentes).

## Les réseaux sans fil LAN

LAN : Local Area Network

### La norme Wifi

Principales normes 802.11 :
* 802.11a : fréquence d'émission à 5 GHz, débit jusqu'à 54 Mbit/s
* 802.11b : fréquence d'émission à 2.4 GHz, débit jusqu'à 11 Mbit/s
* 802.11g : fréquence d'émission à 2.4 GHz, débit jusqu'à 54 Mbit/s
* 802.11n : fréquence d'émission à 2.4 GHz ou 5 GHz, débit jusqu'à 300 Mbit/s en utilisant les technologies MIMO (Multiple-Input Multiple-Output) et OFDM (Orthogonal Frequency Division Multiplexing)
Très proche de l'ethernet câblé (802.3), utilise la sous-couche LLC générique de la couche 2, et ré-implémente la sous-couche MAC.
Contrairement à ethernet câble qui est basé sur la technique d'accès CSMA/CD, la norme Wi-Fi utilise le CSMA/CA (Carrier Sense Multiple Access / Collision Avoidance).
Il y a plusieurs modes de fonctionnement, dont voici les principaux :
* mode Ad-Hoc permet d'établir des connexions sans passer par un point d'accès
* mode Infrastructure permet d'établir des connexions en passant par un point d'accès, et également de gérer un système de distribution basé sur plusieurs points d'accès utilisant le même ESSID.
* mode monitor permet de passer la carte Wi-Fi en mode promiscuous, c'est à dire qu'elle voit passer toutes les trames, et pas seulement celles qui lui sont destinées.
Le Wi-Fi utilise des trames de synchronisation temporelle, appelée les beacon frames. Ces trames contiennent l'heure du point d'accès.

#### Sécurité WEP

* Premier protocole d'authentification et de chiffrement
* Signifie : Wired Equivalent Privacy
* Aujourd'hui totalement obsolète car non sécurisé
* Utilise des clés de 64 bits (clé secrète de 40 bits + vecteur d'initialisation -IV- de 24 bits) ou des clés de 128 bits (clé secrète de 104 bits + vecteur d'initialisation -IV- de 24 bits)
* Définit deux techniques d'authentification : Open System Authentication (diffusion du ESSID) et Shared Key Authentication (pas de diffusion d'informations avant l'authentification)

#### Sécurité WPA

* Inventé pour pallier les failles de sécurité du WEP
* Signifie : Wi-Fi Protected Access
* La norme WPA1 fonctionne sur du matériel existant (mais est cassable). La norme WPA2 nécessite du matériel plus puissant (authentification et chiffrement plus complexe) et est la méthode la plus sécurisée à l'heure actuelle
* Utilise le standard 802.1x qui se charge de l'authentification et de la génération de la clé
* Le modèle 802.11i assure la sécurité au niveau de la sous-couche MAC via le protocole TKIP (Temporal Key Integrity Protocol) ou via le protocole CCMP (Counter with Cipher Block Chaining Message Authentication Code Protocol) (plus sécurisé)

## Les réseaux sans fil MAN

MAN : Metropolitan Area Network

### La norme Wimax
## Les réseaux sans fil WAN

WAN : Wide Area Network

### La norme 802.20
# Mise en pratique
### Les commandes Wi-Fi

Utilisateurs de Gnome, Attention ! les commandes ci-dessous ne fonctionneront que si vous avez désactivé au préalable Network Manager :
Ubuntu 9.10 et supérieur :
Ubuntu 9.04 :

#### iwconfig

Invoquée seule, la commande iwconfig affiche toutes les interfaces réseaux :
On peut indiquer à la commande iwconfig l'interface à afficher :
On peut également utiliser la commande iwconfig pour configurer les paramètres du réseau sans fil :
* Pour définir le nom du réseau :
* Pour définir le canal à utiliser :
on peut également spécifier la fréquence avec l'option freq :
* pour définir le débit
* pour fixer le débit :
Le 802.11b définit les débits suivants : 1, 2, 5.5 et 11 Mbit/s.
Le 802.11g définit en plus les débits suivants : 6, 9, 12, 18, 24, 36, 48 et 54 Mbit/s.
* Pour activer ou non le chiffrement WEP :
* pour spécifier la clé WEP :
on peut gérer de trousseau de quatre clés. On indique le numéro de clé entre crochets :
* pour changer le mode (ad-hoc, managed, monitor ...) de la carte :
Attention, il faut que la configuration côté IP soit arrêtée :
* pour changer la puissance d'émission (si la carte le permet) :
On peut également spécifier plusieurs paramètres sur la même ligne :

#### iwlist

La commande iwlist permet d'obtenir des informations complémentaires. Invoquée seule, elle affiche la liste des options disponibles :
On peut optionnellement spécifier l'interface réseau (inutile si il n'y en a qu'une).
* Afficher la liste des réseaux détectés :
* afficher les canaux et fréquences disponibles, et également le canal/fréquence actuellement utilisé :
* afficher la liste des clés WEP :
* afficher les possiblités d'authentification du driver de la carte :
* afficher la liste des points d'accés détectés :
autres options

#### iwevent

La commande iwevent permet d'afficher en temps réel les évènements Wi-Fi de la carte.
On lance iwevent sur une console, et sur une autre, on passe des commandes iwconfig. On constate que iwevent affiche les évènements générés :

#### iwpriv

La commande iwpriv permet de configurer des paramêtres propres à la carte Wi-Fi.
Par exemple, le driver de cette carte ne fournit de paramêtres spécifiques à configurer.
Avec un autre driver, on obtient la liste des ioctl configurables :
Certaines cartes ethernet câble permettent également de configurer des paramêtres internes :

#### iwspy

Si la carte et le driver le permettent, la commande iwspy permet d'afficher des statistiques en temps réel sur la liaison Wi-Fi :
Par exemple, la carte (et/ou driver) ci-dessous ne permet pas de collecter des informations.

### Test du réseau Ad-Hoc

Il faut tout d'abord passer la carte en mode Ad-Hoc :
On ajuste ensuite les paramêtres Wifi :
On spécifie ensuite une adresse MAC commune à tout le réseau Ad-Hoc :
On spécifie les paramêtres IP :
Désormais, les différents membres du réseau Ad-Hoc doivent pouvoir se pinguer.
Si ce n'est pas le cas, on peut essayer de changer la fréquence et de la remettre pour forcer une ré-detection / re-configuration.

### Connexion à un réseau WPA

Pour se connecter à un réseau WPA depuis Linux, il faut avoir installé le package wpasupplicant :
On crée le fichier de configuration suivant :
On lance la commande wpa_supplicant :
Cette commande ne rend pas la main, donc soit on la lance en tâche de fond avec &, soit on la laisse tourner et on ouvre une nouvelle fenêtre.
On lance ensuite le client DHCP pour obtenir une adresse IP :

# L'outil d'administration Webmin
## Installation de Webmin

Webmin est un logiciel qui permet de configurer un serveur Unix / Linux via une interface Web.
Webmin est disponible sur de nombreuses plateformes : Windows, Redhat, Fedora, CentOS, SuSE, Mandrake, Debian, et Ubuntu.
Il est supporté par Debian, mais on peut aussi télécharger sur leur site un fichier .deb.
On installe les dépendances de Webmin, puis on télécharge l'archive de Webmin et on l'installe en root :
Quelques secondes après l'interface web doit être accessible (ex : https://localhost:10000/).

## Configuration de Webmin
### Changement du mot de passe

Cela changera le mot de passe de root dans Webmin et ne modifie en aucun cas le mot de passe root du système.

### Changement du port

Éventuellement on peut changer le port par défaut pour limiter les risques d'attaque :

### Envoi des alertes

Pour recevoir les alertes détectées par Webmin par email, il faut se rendre sur /webmin/edit_sendmail.cgi.

## Gestion des utilisateurs de Webmin

Webmin permet aux utilisateurs Unix de se connecter au portail Webmin, et à certaines bases de données.

## Gestion des serveurs BDD

Il est possible de créer des bases MySQL, des tables et d'exécuter du code SQL via l'interface. Elle se révèle être moins développée que phpMyAdmin.

## Gestion des serveurs Mail

Il est possible d'utiliser les boites emails des utilisateurs depuis l'interface Webmin, pour envoyer et recevoir (du moins théoriquement via send_mail.cgi) :
Leurs logs étant :
Si les envois ne partent pas, tester en shell :
S'il y a une erreur sur les variables d'environnements :

## Gestion des sauvegardes

Des backups peuvent être planifiés ou effectués en live travers l'interface :

## Références

* ↑ http://www.webmin.com
* ↑ http://www.webmin.com/download.html
* ↑ http://doc.ubuntu-fr.org/webmin
* ↑ http://www.debianadmin.com/install-webmin-on-debian-7-6-wheezy.html
* ↑ https://bobcares.com/blog/webmin-email-alerts/

# telnet

Telnet est un protocole conçu pour accéder aux ordinateurs à distance, en mode client-serveur. Il est moins sûr que SSH car non crypté. Son port par défaut est 23 mais on peut le spécifier en paramètre.

## Exemples
### Tester si le port HTTP est ouvert et que son service écoute

Une fois connecté avec telnet, si on ne peut pas quitter avec CTRL + C, taper en azerty : CTRL + ALT GR + ), puis "quit" et entrée.

### Envoyer un email sur un serveur SMTP
# cURL

cURL est une commande pour appeler une page web (port 80 ou 443) en GET (par défaut) ou en POST.
Aide :

## Exemples
### Ignorer les erreurs HTTPS

Pour ne pas vérifier le certificat SSL/TLS, utiliser "-k" (ou "--insecure") :

### POST

Le verbe HTTP est précisable avec "-X". Exemple de création de page MediaWiki :

### Télécharger un fichier

Il faut préciser le nom du fichier avec "-o" (ou "--output").

### Mesurer le temps de réponse

On peut aussi mesurer le temps de réponse d'un site avec le paramètre "-w". Ex :
Cela affiche le code HTML de la page suivi du temps de la requête : 0,103497 s, puis le temps en total après téléchargement : 0,137093.

## Références

* ↑ https://netbeez.net/blog/http-transaction-timing-breakdown-with-curl/

# wget

La commande wget permet de télécharger un fichier depuis la ligne de commande :
Pour utiliser un proxy, il faut définir la variable d'environnement http_proxy. Exemple :
wget sur ftp
wget est également compatible avec le protocole ftp. Il est ainsi capable de télécharger un fichier ou un ensemble de fichier depuis un ftp distant.
Pour télécharger les sous-répertoire et fichiers on utilise l'option "-r".
L'option "-nH" permet de ne pas sauvegarder le nom d'hôte, autrement wget fera la copie vers un nouveau dossier créé portant le nom de l'hôte du serveur ftp.

## Utilisation de base

Typiquement Wget s'utilise par la ligne de commande, avec un ou plusieurs URLs passés en paramètres. De nombreuses options permettent d'affiner le comportement souhaité (téléchargement multiple, suivre les liens...).
Il est possible de télécharger automatiquement plusieurs URLs dans une hiérarchie de dossiers.

# Le serveur de noms BIND
## Historique

À la création d'Internet, chaque ordinateur du réseau contenait un fichier /etc/hosts qui listait le nom de toutes les machines du réseau et leurs adresses IP. À chaque fois que l'on rajoutait une machine sur Internet, il fallait mettre à jour ce fichier.
Le nombre de machines connecté à Internet s'étant rapidement accru, cette solution de fichier /etc/hosts communs est devenu ingérable, et il a fallu inventer un procédé capable de palier ce problème.
La solution qui s'est imposée fut la création d'une base de données distribuée, et ainsi est né le principe de serveur DNS.
Un serveur DNS permet de faire la correspondance entre un nom canonique (ex : www.google.fr) et son adresse IP.
Le premier serveur DNS fut créé par l'université de Berkeley et s'appelle BIND (Berkeley Internet Name Domain). BIND est le serveur DNS le plus utilisé et le plus populaire, environ 79 % d'Internet fonctionne avec ce logiciel.

## Configuration du client DNS

Sur un serveur Unix, la liste des serveurs DNS est définie dans le fichier /etc/resolv.conf.

## Principe de fonctionnement du DNS

Schéma : l'arbre à l'envers
Au sommet de l'arbre on trouve des serveurs root qui aiguille vers les top level domain (com, net, org, fr, etc.) Il existe une branche spéciale ARPA avec un sous domaine in-addr qui sert à gérer le reverse DNS.

## La commande host

La commande host permet d'obtenir l'adresse IP d'un ordinateur :
La commande host permet également de consulter le DNS inverse, c'est à dire quel nom canonique est associé à une adresse IP donnée :

## La commande dig

La commande dig permet d'interroger un serveur DNS.
Voici quelques exemples :
En interrogeant le sommet de l'arbre ., on obtient la liste des serveurs racines du DNS, appelés les root-servers :
En interrogeant la branche com, on obtient la liste des serveurs DNS gérant les noms de domaines en .com :
Si on interroge la branche fr, on obtient la liste des serveurs DNS gérant les noms de domaines en .fr. On constate que les extensions nationales sont gérés par des organismes nationaux (dans le cas de la France, le NIC France) :
En indiquant un nom de domaine, dig permet de connaitre différentes informations, comme par exemple :
La liste des serveurs DNS gérant le nom de domaine :
La liste des serveurs de mails :

## Les Ressources Records (RR)

Les informations stockées dans un serveur DNS sont classifiées à l'aide des Ressources Records (RR).
Il existe de nombreux Ressources Records, voici les plus courants :
* NS (Name Server) indique les serveurs DNS gérant le nom de domaine. Exemple : dig google.com NS donne les name server de google.com
* A (Adresse IPv4) indique l'adresse IPv4 associée à un FQDN (Full Qualified Domain Name). Exemple : dig www.google.com A donne les adresses IPv4 de www.google.com
* AAAA (Adresse IPv6) indique l'adresse IPv6 associée à un FQDN (Full Qualified Domain Name). Exemple : dig www.google.com AAAA donne les adresses IPv6 de www.google.com
* MX (Mail eXchanger) indique le(s) serveur(s) de mail à contacter pour délivrer les emails du domaine. Exemple : dig google.fr MX donne les serveurs de mails acceptant des emails destinés à <un nom>@google.fr.
* CNAME (Canonical NAME) permet de créer des Alias (des noms étant des raccourcis vers d'autres noms). Exemple : host www.google.fr nous indique que www.google.fr est alias vers www.google.com.
* PTR (PoinTeuR) est utilisé par le reverse DNS pour effectuer la résolution d'une adresse IP vers un nom (FQDN). Exemple : host 72.14.207.99 nous indique que l'adresse IP 72.14.207.99 est associé au nom eh-in-f99.google.com

## Installation de BIND

Pour installer le serveur BIND sous Debian, on utilise la commande suivante :
À partir de Debian Lenny, le package contenant le serveur BIND s'appelle bind9

## Configuration de BIND

Les fichiers de configuration de BIND sont situés dans le répertoire /etc/bind.
Le fichier principal de configuration de BIND est /etc/bind/named.conf. Debian a choisit de découper ce fichier en 3 fichiers afin de faciliter les mises à jour.
À noter que dans ces fichiers, les lignes en commentaire commencent par // et non le # habituel des .conf, que l'on retrouve dans la syntaxe Apache.

### /etc/bind/named.conf.options

Dans ce fichier, il est possible de préciser dans la section forwarders l'adresse IP du DNS à qui l'on souhaite renvoyer les demandes de résolutions de noms. Par exemple, ceci est utile lorsque notre serveur DNS ne peut pas accéder directement à Internet.
Par défaut BIND écoute sur le port 53 en UDP. On peut également changer ce port dans ce fichier, mais ceci est délicat car il faudra accorder la configuration des clients en conséquence. À noter que le dossier /etc/services contient le numéro par défaut des ports de tous les services.

### /etc/bind/named.conf.local

On va définir dans ce fichier nos zones locales.

### Le fichier définissant la zone

On crée ensuite le fichier de zone /etc/bind/db.mondomaine.fr
À noter que dans les fichiers de zone, les lignes en commentaire commencent par ; et non le # habituel.
Points importants de ce fichier :
Le caractère @ (arobas) remplace le nom de la zone.
Lorsque l'on définit un nom canonique, on a deux possibilités :
* soit on donne le nom en entier (ex: pc210.mondomaine.fr.) . Dans ce cas-là, il ne faut pas oublier le point final, sinon le système rajoute automatiquement le nom de la zone (mondomaine.fr).
* soit on ne donne que le nom "court" (ex: alex). Dans ce cas-là, il ne met pas le point final afin que le système rajoute le nom de la zone.

### Test de fonctionnement

Une fois que l'on a modifié ces fichiers, on relance le serveur DNS :
On modifie ensuite le fichier /etc/resolv.conf pour lui indiquer d'utiliser le DNS que l'on vient de configurer :
Pour tester, on essaye de pinguer un nom définit dans le DNS :
Si tout se passe bien, le DNS doit effectuer la résolution.
On peut aussi utiliser les commandes host et dig pour vérifier :

### Le fichier définissant la zone inverse

Maintenant que l'on a configuré le DNS de la zone mondomaine.fr, on va créer la zone inverse qui va permettre d'associer un nom à une adresse IP.
On rajoute tout d'abord la zone inverse dans le fichier named.conf.local :
Le nom de la zone est composé de l'adresse réseau (à l'envers) associé à in-addr.arpa.
On crée ensuite le fichier /etc/bind/db.192.168.30 :
Le ressource record PTR permet de définir le nom associé à l'adresse IP.
Pour vérifier, on relance le DNS et on lui demande quelle nom est associé à une adresse IP donnée :

## Gestion des zones

Pour modifier les redirections DNS d'un domaine, il faut modifier sa zone :
Après modification des zones DNS, il s'avère nécessaire de demander sa propagation en cliquant tout en haut à droite sur Apply Configuration. Cela équivaut à la commande RNDC pour "Remote Name Daemon Control" :
Et éventuellement vérifier qu'il n'y a pas eu d'erreur :
Cela permet par exemple de s'apercevoir que le numéro de série de la version de la zone doit être changé à chaque modification :
Ce que L'interface graphique Webmin, plus ergonomique pour mettre à jour les zones DNS, incrémente automatiquement.

## Problèmes connus
### SERVFAIL

Le serveur DNS mentionné (localhost dans l'exemple) ne connait pas le domaine, mais il peut parfois le résoudre avec host.
Si le localhost est censé être autoritaire et que la zone y semble bien définie, ajouter un point à la fin de chaque URL, pour éviter qu'il les interprète en ajoutant le domaine après. En effet :
* example.com. IN NS ns.example2.com pourra être interprété à tort :
* example.com. IN NS ns.example2.com.example.com., mais pas :
* example.com. IN NS ns.example2.com.

### NXDOMAIN

Le domaine est inconnu des DNS, en général il suffit d'attendre la propagation 24 h.
Mais parfois, il manque juste un rndc reload ou un /etc/init.d/bind9 restart.

### found SPF/TXT record but no SPF/SPF record found

Ces enregistrements vont par deux : IN TXT et IN SPF.

### Le domaine ne se propage pas, telnet localhost 53 fonctionne en local mais pas de l'extérieur

Les symptômes sont les mêmes que si le port 53 était bloqué par le pare-feu, mais en fait il faut ajouter les IP publiques dans "/etc/bind/named.conf.options" :
Puis redémarrer le service :

### query (cache) '...' denied

Retirer les IP locales de :

## Références

* ↑ (en) Bryan J. Hong, Building a Server with FreeBSD 7: A Modular Approach, No Starch Press, 2008 (lire en ligne)
* ↑ http://www.root-servers.org/ www.root-servers.org

# Le serveur de configuration réseau DHCP
## Fonctionnement du serveur DHCP

DHCP : Dynamic Host Configuration Protocol. Ce service permet de configurer automatiquement les paramètres IP des machines du réseau local. Le principe est simple. Une machine se connecte sur le réseau local et envoie une requête DHCP Discover pour demander à un éventuel serveur DHCP une adresse IP. Si le serveur est présent, il renvoie un message DHCP Offer. Si plusieurs serveurs DHCP sont présents sur le réseau, le client retient une offre d'un des serveurs et diffuse une demande DHCP : DHCP Request. Le serveur choisit par le client renvoie alors un message de validation DHCP ACK. Le client reçoit donc : Adress IP, Masque de réseau, Adresse de passerelle et Adresse des serveurs DNS.

## Configuration du serveur DHCP

Le fichier de configuration du serveur DHCP est /etc/dhcp3/dhcpd.conf.
Pour certains ordinateurs, on peut leur attribuer tout le temps la même adresse IP en les identifiant avec leurs adresses MAC. Il suffit de rajouter la section suivante :
Chaque fois que l'on modifie ce fichier, ne pas oublier de relancer le serveur DHCP afin qu'il prenne en compte les modifications :
ou
Chaque fois que DHCP attribue une adresse IP, il enregistre un message dans /var/log/syslog :
DHCP stocke les adresses IP attribuées dans le fichier /var/lib/dhcp/dhcpd.leases. Ceci lui permet notamment d'attribuer à un ordinateur la même adresse IP (même si ceci n'est pas obligatoire).

# Le serveur de shell distant SSH
## Le serveur SSH

SSH (Secure SHELL) permet de se connecter à un ordinateur distant et de disposer d'un shell sécurisé. Par défaut, le serveur SSH attend les connexions distantes sur le port 22 / protocole TCP.
Pour installer un serveur SSH, on utilise la commande suivante :
La connexion et le transfert de données via SSH est sécurisée par un système de chiffrement utilisant soit l'algorithme RSA (Rivest Shamir Adleman), soit l'algorithme DSA (Digital Signature Algorithm).
Lors de son installation, le serveur SSH génère des clés de chiffrement RSA et DSA. Ces clés sont composées d'une partie privée et d'une partie publique. Elles sont stockées dans le répertoire /etc/ssh/ :
Chaque tentative de connexion est enregistrée dans le fichier /var/log/auth.log.

### Fichier de configuration

Le fichier de configuration du serveur SSH est /etc/ssh/sshd_config :
Les options de ce fichier de configuration sont décrites dans la page de manuel de sshd_config :
Le fichier de configuration par défaut proposé par Debian nécessite quelques ajustements.
La ligne PermitRootLogin yes autorise les connexions distantes à partir du compte root. Cette option est dangereuse car elle permet à un attaquant distant de scanner le mot de passe du super-utilisateur root.
La bonne pratique est de se connecter avec son compte utilisateur (ex: alex), et ensuite de passer root avec la commande su, ou d'effectuer les opérations d'administration avec la commande sudo.
On remplace donc cette ligne par :
Afin de renforcer la sécurité, on peut limiter les connexions SSH à une liste d'utilisateurs donnés. Ceci est réalisé avec l'option AllowUsers :
Sur le même principe, on peut restreindre les connexions à un ou plusieurs groupes Unix :
Afin que ces modifications soient prises en compte, il faut relancer le serveur SSH :

## Le client SSH
### Utilisation

Pour se connecter à un serveur SSH, on utilise la commande ssh. Sa syntaxe est la suivante :
Exemple :
ou
Si on possède le même login sur la machine locale et distante, il est inutile de spécifier le login :
Si ssh ne fonctionne pas sur le port standard 22, l'option -p permet d'indiquer le port à utiliser :
L'option -X du client SSH permet de rediriger l'affichage graphique (le DISPLAY) via le tunnel SSH, et ainsi lancer un programme graphique distant et l'afficher sur notre ordinateur :
Il faut toutefois que l'option X11Forwarding soit positionnée à yes sur le serveur pour que la redirection graphique fonctionne.

### Vérification du fingerprint

Lors de la première connexion, ssh affiche le fingerprint du serveur SSH et demande confirmation :
Si on veut être certain de l'authenticité du serveur distant, on peut contacter l'administrateur et vérifier avec lui que le fingerprint indiqué est le bon. Pour faire ceci, taper la commande ssh-keygen -l sur le serveur ssh et indiquer le chemin vers la clé RSA du serveur ssh :
Par la suite, le fichier /home/<user>/.ssh/known_hosts stoque l'identité chiffrée de la machine et ssh ne nous demande plus confirmation.

### Authentification automatique

Si on se connecte souvent sur le même serveur, on peut générer une paire de clés afin de ne pas avoir à saisir le mot de passe à chaque connexion.
Sur la machine cliente
On génére une paire de clés avec la commande ssh-keygen :
On ne saisi pas de passphrase, sinon le système va demander à saisir la passphrase à chaque connexion, ce qui est aussi contraignant que la saisie du mot de passe.
Sur la machine distante
On se connecte sur la machine distante et on copie le contenu de la clé publique précédement générée (/home/alex/.ssh/id_rsa.pub) dans le fichier /home/alex/.ssh/authorized_keys.
Note: Si on ne dispose pas de la commande ssh-copy-id (anciennes versions de ssh), on peut utiliser la commande suivante :
Ceci fait, on peut se connecter sur la machine distante sans avoir à saisir le mot de passe.

### La commande scp

La commande scp (Secure Copy) permet de copier un fichier d'un ordinateur vers un autre en utilisant SSH.
Par exemple, la commande suivante permet de copier le fichier fichier.txt vers le répertoire /tmp de l'ordinateur pc211 :
On peut également copier un fichier distant sur la machine locale :
L'option -r permet de copier un répertoire de manière récursive.
scp contient une faille que rsync n'a pas, où un serveur malicieux peut envoyer au client des fichiers non demandés.

### Les clients SSH sous Windows

Il existe plusieurs clients SSH pour Windows, dont notamment les logiciels libres suivants :
* PuTTY : fournit une liste de serveurs où se connecter en SSH uniquement.
* WinSCP : client SSH, SFTP, FTP et SCP.
* Bitvise : n'affiche qu'un serveur SSH et SFTP pour chaque profil (nécessite de les charger depuis le système de fichier à chaque changement de serveur).
* MobaXterm : fournit une liste de sessions où se connecter en double-cliquant (en SSH et SFTP), mais problèmes fréquents pour copier-coller en console.

## Problèmes connus
### Le mot de passe est toujours demandé malgré la clé SSH

Quand on teste la clé SSH depuis le client :
si les logs d'authentification du serveur acceptent la clé :
cela donne :
ou :
au lieu de :
Il faut donc réinstaller les clés.

### Authentication refused: bad ownership or modes for directory

Il faut s'approprier le dossier :

### Could not create directory '/c/UsersUtilisateur/.ssh' ... Failed to add the host to the list of known hosts

Se produit sous Windows quand le chemin défini n'est pas celui retenu par SSH. Par exemple, quand :
ou
ou
donnent tous :
Peu importe la casse.
On peut aussi utiliser CMD au lieu de Bash pour modifier la variable d'environnement "home", ce qui aboutit à un résultat équivalent :
Attention : sous Git CMD cela ne fonctionne pas, il faut vraiment utiliser la console DOS du système :
Mais surtout il faut utiliser CMD pour mettre à jour le contenu du dossier .ssh sans obtenir cette erreur, par exemple en installant OpenSSH for Windows :

### Connection closed by authenticating user user 172.19.0.1 port 55920 [preauth]

Regarder les logs du client SSH. S'il n'en n'a pas, utiliser à la place :
Cela dira si le format de la clé est invalide ou autre.

### Could not open a connection to your authentication agent

Lancer :
et réitérer.

### Enter passphrase for key

Il faut ajouter la clé privée depuis le serveur avec :
Sinon, spécifier la clé privée depuis le client :
Sinon, voir #Permission denied (publickey,hostbased).

### error: Received disconnect from x.x.x.x port yyyyy:13: Unable to authenticate [preauth]

Se produit sur un serveur quand on essaie de se connecter automatiquement sans spécifier de clé privée.

### Failed publickey for...

La clé envoyée par le client ne correspond pas à la clé publique indiquée dans /etc/ssh/sshd_config (ou elle n'est peut-être pas dans ~/.ssh/authorized_keys).

### Load key "my_key.ppk": error in libcrypto

Regénérer les clés.

### Permission denied (publickey,hostbased)

Il manque l'enregistrement de la clé publique (ssh -i).
Sinon, utiliser Putty.

### Server refused our key

Vérifier les permissions, par exemple pour root :
D'où :
Cela peut aussi être lié à la non prise en charge par le serveur de l'en-tête et du pied de la clé publique. Dans ce cas, retirer les deux lignes :
Si le problème persiste, la cause est détaillée dans :
Si aucun log n'apparait lorsque le client reçoit l'erreur, passer en LogLevel DEBUG dans la configuration du serveur SSH :
Cela permettra par exemple de savoir si l'erreur provient de authorized_keys.

### WARNING: UNPROTECTED PRIVATE KEY FILE! / bad permissions / Permission denied (publickey)

Sous Linux il est facile d'appliquer les permissions sur la clé :
NB : sous Windows par contre, la commande chmod n'a aucun effet depuis Bash, même lancée en tant qu'administrateur. Et une modification des droits après suppression de l'ACL, via Cygwin ou l'explorateur Windows fonctionne chez eux, mais n'a guère plus d'effet pour SSH :

### we did not send a packet, disable method

Cette erreur du client SSH peut venir d'un authorized_keys mal rempli :

## Références

* ↑ https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html
* ↑ http://www.putty.org/
* ↑ http://winscp.net

# Le partage de fichiers Samba
## Introduction

Samba est l'implémentation du protocole SMB (Server Message Block) sous Unix / Linux. Il sert à partager des fichiers et des imprimantes avec les réseaux Microsoft.
Site officiel : www.samba.org
Samba lance deux services : smbd et nmbd.
Le protocole SMB est tout sauf performant : il pollue le réseau par l'utilisation intensive du broadcast.
Samba utilise les ports 137 (netbios name service, nbname, en UDP), 138 (netbios datagram service nbdatagram, en UDP), 139 (netbios session service, nbsession, en TCP), et 445 ("direct-hosted" tcp, en tcp et udp).
La méthode de connexion traditionnelle smb utilise les ports 137, 138 et 139 tandis que la nouvelle méthode (CIFS, sur Windows XP) n'utilise que le port 445.

## Installation

Pour installer Samba, on tape la commande suivante :

## Configuration

Le fichier de configuration de Samba est /etc/samba/smb.conf.
Le programme testparm analyse le fichier smb.conf et signale les erreurs éventuelles.
Après avoir modifié la configuration, il faut relancer le service :
Le fichier /etc/samba/smb.conf se divise en différentes sections :
* La section [global] : configuration globale de samba
* La section [homes] : cette section particulière permet de remonter une ressource qui correspond au répertoire de travail (home directory) de l'utilisateur qui s'est authentifié.
On peut ensuite créer différentes sections, une par partage voulu.
Samba peut fonctionner de différentes manières. Voici quelques cas de figures courants.

## Le partage par ressource sur un réseau Workgroup

Voici un fichier /etc/samba/smb.conf permettant de partager une ressource (répertoire ou imprimante) sur un réseau Workgroup :
Dans le cas du mode share, pour pouvoir positionner un mot de passe sur une ressource, il faut créer un compte UNIX 'invite' :
On crée ensuite une entrée dans le fichier /etc/samba/smbpasswd :
Le mot de passe saisi correspondra à celui du répertoire partagé.
NB : dans les versions récentes de Samba, il faut utiliser la commande pdbedit à la place de smbpasswd :
Il faut ensuite créer le répertoire partagé et donner l'arborescence partagée à l'utilisateur invite du groupe invite :
NB : il faut que l'utilisateur nobody ait le droit d'écriture sur le répertoire partagé.
Petit rappel : il est toujours utile de faire un testparm pour vérifier la cohérence du fichier de configuration, et ne pas oublier de relancer le service pour que les modifications soient prises en compte.
On peut tester la configuration avec la commande smbclient :
La commande smbclient demande un mot de passe, on tape entrée.

## Le partage par utilisateur sur un réseau Workgroup

Voici un fichier /etc/samba/smb.conf permettant de partager une ressource (répertoire ou imprimante) avec une authentification Utilisateur / Mot de passe sur un réseau Workgroup :
Dans le cas du mode user, pour ne partager une ressource partagée qu'à certains utilisateurs, il faut tout d'abord créer un compte UNIX pour chacun d'eux :
On crée ensuite une entrée dans le fichier /etc/samba/smbpasswd :
NB : dans les versions récentes de Samba, il faut utiliser la commande pdbedit à la place de smbpasswd :
Coté Linux, les utilisateurs doivent avoir le droit d'écriture sur le répertoire partagé. La meilleure méthode consiste à créer un groupe Unix contenant les utilisateurs autorisés, et d'attribuer le répertoire partagé au groupe en question :
Avantage : pour partager cette ressource à de nouveaux utilisateurs, il suffit de leur créer le compte Unix, une entrée dans smbpasswd et de les ajouter au groupe prive (il n'est plus nécessaire de modifier le fichier smb.conf).
Permet de définir le propriétaire des fichiers créés avec l'option +s. Ici les propriétaires seront les membres du groupe prive au lieu de l'utilisateur.

## Connexion à un Active Directory Windows 2012

Serveur AD : SERV2012 (192.168.10.254)
Domaine : DOMWIN.LAN

### Configuration de /etc/resolv.conf

Il faut indiquer dans le fichier /etc/resolv.conf d'utiliser le serveur AD en tant que serveur DNS :

### Configuration de Kerberos

On installe Kerberos pour l'authentification sur AD :
On configure Kerberos avec notre domaine AD (DOMWIN.LAN) :

### Connexion au domaine AD

On obtient un ticket Kerberos :
On récupére le SID du serveur AD (nom netbios de AD : SERV2012) :
On rejoint le domaine AD :
On vérifie en interrogeant les partages du serveur AD. Pour cela, on utilise un compte définit sur AD :
On essaye d'accéder à un partage définit sur AD :
Fichiers /etc/krb5.conf et /etc/samba/smb.conf : Voir pastebin.com/EDxh7yqH

## Le partage sur un domaine Microsoft

Voici un fichier /etc/samba/smb.conf permettant de rejoindre un domaine existant afin de partager des ressources :
Remarque : Pour que le serveur Linux puisse rejoindre le domaine existant, il faut se connecter au moins une fois avec le compte Administrateur défini sur le contrôleur de domaine, afin que ce dernier crée un compte machine :
Dans le cas du mode server, les utilisateurs (login et mot de passe) sont définis sur un serveur existant.
Coté Linux, les utilisateurs doivent avoir le droit d'écriture sur le répertoire partagé. Cependant, les utilisateurs ne sont pas définis sur le serveur Linux mais sur le contrôleur de domaine. La solution consiste à permettre à tout le monde d'écrire dans ce répertoire, Samba se chargeant de n'autoriser que les utilisateurs autorisés sur le contrôleur de domaine.

## Samba en contrôleur de domaine Microsoft

Voici un fichier /etc/samba/smb.conf permettant de faire un contrôleur de domaine Microsoft :
On crée ensuite le compte de l'utilisateur admin. il faudra utiliser ce compte lors de la première connexion d'un ordinateur au domaine.
NB: Sur une Ubuntu, le groupe admin existe déjà, donc, soit on rajoute l'option --ingroup users, soit on utilise un compte différent pour l'administration (ex: Administrateur).
NB2 : dans les versions récentes de Samba, il faut utiliser la commande pdbedit à la place de smbpasswd :
Pour chaque membre du domaine, il faut créer un compte unix correspondant à la machine et rajouter une entrée de type machine dans smbpasswd.
Attention : ce login doit porter le nom netbios de la machine et se terminer par un dollar (d'ou le --force-badname) :
NB : On peut automatiser la création des comptes machines en rajoutant la ligne suivante dans la section [global] de smb.conf :
Sous Debian :
Sous Redhat :
Il faut aussi créer le répertoire pouvant accueillir le netlogon :
On crée également le répertoire stockant les profils itinérants :
Le netlogon peut servir par exemple à créer automatiquement un volume réseau (ex: Z:), ou ajuster l'heure de l'ordinateur avec celle du contrôleur de domaine.
On peut optionnellement créer un fichier logon.bat :
Il faut ensuite relancer samba et winbind :

## Utilisation de smbclient

smbclient est un client pour les réseaux samba.
Exemple :

## Monter un répertoire réseau

Manuellement :
Automatique à chaque démarrage :
Rajouter dans /etc/fstab :

## Utilisation de SWAT : Samba Web Administration Tools

SWAT est une page web permettant de configurer samba de façon plus "simple", mais comme souvent avec les interfaces graphiques, de manière moins pointue.
Pour les amateurs du clickodrôme:
<Image de SWAT>
Une fois installé, on accède à SWAT avec un navigateur sur l'adresse localhost:901 Swat va lire le fichier smb.conf et le présenter dans une page html. Les onglets permettent de configurer les partages, les imprimantes, de voir les docs etc. Par défaut, l'accès distant à SWAT est interdit, mais il est activable. Toutefois, il est déconseillé d'utiliser cette option.

# Le partage de fichiers NFS

Le protocole NFS (Network File System) permet de partager des fichiers dans les réseaux Unix.

## Installation du serveur NFS

Pour installer le serveur NFS sous Debian, il suffit de taper la commande suivante :

## Configuration du serveur NFS

La configuration du serveur NFS est stockée dans le fichier /etc/exports.
Ce fichier de configuration dispose d'une page de manuel :
Voici quelques exemples extrait du manpage :
* La première ligne exporte l’ensemble du système de fichiers vers les machines « master » et « trusty ». En plus des droits d’écriture, toute transformation d’UID est désactivée pour l’hôte « trusty ».
* Les deuxième et troisième lignes montrent des exemples de noms de machines avec caractères jokers, et de groupes de machines (« @trusted »).
* La quatrième ligne montre comment mapper tous les utilisateurs vers UID et GID particulier.
* La dernière ligne partage un répertoire /pub, à toutes les machines dans le monde, en effectuant les requêtes sous le compte anonyme. L’option insecure permet l’accès aux clients dont l’implémentation NFS n’utilise pas un port réservé.
À chaque modification du fichier /etc/exports, il faut relancer le serveur NFS pour que les modifications soient prises en compte :
On peut également utiliser la commande exportfs :

## Options d'exportation

Voici les options d'exportation les plus courantes :
* secure : cette option impose l’utilisation d’un port réservé (inférieur à 1024) comme origine de la requête.
* rw : exporte le répertoire en lecture / écriture
* ro : exporte le répertoire en lecture seule
* async : le serveur NFS va pouvoir répondre que le fichier a été écrit sur le support de stockage, même si cela n'a pas encore été fait. Améliore les performances du serveur.
* sync : le serveur NFS va écrire physiquement les fichiers sur le support de stockage avant de répondre. Réduit les performances du serveur.

### Options liées aux correspondances de UID et de GID (UID et GID mapping)

Le principal problème avec NFS est la correspondance des UID et des GID. Effectivement, l'utilisateur alex peut avoir le UID 1000 sur le client et un UID différent sur le serveur. NFS travaille avec les UID et GID numérique, il va donc par défaut enregistrer sur le serveur que le fichier appartient à l'utilisateur 1000, et non à l'utilisateur alex.
Pour pallier ces problèmes, NFS fournit des mécanismes pour transformer les UID et les GID.
Le problème se pose également avec le super-utilisateur root qui dispose du UID 0. Pour des raisons de sécurité, NFS va transformer par défaut les fichiers posés par le root vers le UID et le GID du compte anonyme (nobody.nogroup).
* root_squash : option par défaut. transforme les requètes provenant de l'UID 0 / GID 0 vers le UID et GID du compte anonyme.
* no_root_squash : ne transforme pas les requètes provenant de l'UID 0 / GID 0. À utiliser avec précaution.
* all_squash : transforme tous les UID/GID vers le UID/GID de l’utilisateur anonyme.
* anonuid : permet de spécifier le UID de l'utilisateur anonyme.
* anongid : permet de spécifier le GID de l'utilisateur anonyme.

## Utilisation de NFS depuis un poste client

La commande mount permet à un poste client d'accéder à un répertoire partagé par un serveur NFS.
Synopsis :
Exemple :
Si on veut que ce répertoire soit accessible à chaque boot, il suffit de rajouter la ligne suivante dans le fichier /etc/fstab :

## Authentification centralisée avec NIS

Pour résoudre le problème des UID / GID non identiques, la solution consiste à déployer NIS.
Pour installer NIS sous Debian, utiliser la commande suivante :
Lors de l'installation il faut indiquer le domaine NIS, ce dernier peut être différent du domaine internet.
Pour le déploiement du serveur et des clients NIS, on va suivre la procédure Debian décrite dans le fichier /usr/share/doc/nis/nis.debian.howto.gz :

### Configuration du serveur NIS

Il faut tout d'abord vérifier que le fichier /etc/hosts contient l'adresse IP et le nom FQDN du serveur :
Il faut ensuite vérifier que le fichier /etc/defaultdomain contienne le domaine NIS :
Dans le fichier /etc/ypserv.securenets, on restreint l'utilisation du domaine NIS au domaine du réseau local. On remplace la ligne 0.0.0.0 0.0.0.0 par : 255.255.255.0 192.168.30.0.
On modifie ensuite /etc/default/nis pour indiquer qu'il s'agit du serveur NIS :
On relance le serveur NIS :
Cette étape peut prendre un certain temps ...
On lance ensuite la création des bases de données NIS avec la commande suivante :
Ceci va créer les fichiers partagés dans le répertoire /var/yp/DOMAINENIS.

### Configuration du client NIS

On installe nis (c'est le même paquet qui fait office de client et de serveur) :
On vérifie que le fichier /etc/defaultdomain contienne le domaine NIS :
Dans le fichier /etc/yp.conf, on indique l'adresse IP du serveur NIS :
On démarre le client NIS :
On vérifie que le fichier /etc/nsswitch.conf contient bien les lignes suivantes :
L'option files indique au système d'aller voir les fichiers classiques /etc/passwd, /etc/group et /etc/shadow.
L'option nis indique au système d'aller ensuite interroger le serveur NIS.
À la fin du fichier /etc/passwd, on rajoute la ligne suivante :
À la fin du fichier /etc/shadow, on rajoute la ligne suivante :
À la fin du fichier /etc/group, on rajoute la ligne suivante :
Pour tester, on lance la commande suivante :
On doit voir afficher le fichier /etc/passwd partagé.
Sur le serveur NIS, on rajoute un utilisateur :
Si tout fonctionne, on doit pouvoir se logger sur le client NIS avec l'utilisateur jack.

# Le serveur d'impression CUPS
## Introduction

CUPS (Common Unix Printing System) est un serveur d'impression. CUPS permet ainsi d'imprimer sur une imprimante accessible sur le réseau ou locale (généralement connectée avec un câble USB). La communication avec les imprimantes utilise le protocole IPP (Internet Printing Protocol).
CUPS est très simple à configurer. De ce fait, il est de plus en plus souvent utilisé en remplacement de LPR (premier serveur sous UNIX).
Site Internet : www.cups.org
Le site linuxprinting.org liste les imprimantes compatibles avec CUPS.
Généralement, un système linux moderne est désormais livré avec les utilitaires nécessaire pour détecter, configurer et utiliser des imprimantes.

### Installation (Debian)

L'installation initiale de CUPS sous Debian peut se faire avec la commande suivante :
Le paquet cups-pdf fournit une imprimante virtuelle qui permet de générer des fichiers PDF.
Le paquet cups-bsd fournit les commandes traditionnelles lpr, lpq et lprm.
Les paquets foomatic-db-compressed-ppds et openprinting-ppds contiennent des descriptions PPD (PostScript Printer Description) pour un très grand nombre d'imprimantes.
D'autres paquets de PPD sont également disponibles comme hp-ppd ou hpijs-ppds. Mais aussi le meta-paquet printer-driver-all-enforce qui englobe une vingtaine de paquets de différents drivers CUPS.

## Configuration côté serveur

CUPS se configure via une interface web accessible par l'adresse http://localhost:631/ .
* On Clique sur Add Printer pour ajouter une imprimante
* On spécifie son nom, sa localisation physique et sa description. Exemple : HP1200, Salle D11, L'imprimante laser de la salle D11
* On choisit ensuite le périphérique correspondant au mode de connexion de l'imprimante avec le PC (ex: port parallèle, USB, ipp, http...etc)
* Si l'imprimante est partagée par un autre serveur CUPS, il faut spécifier l'adresse IPP de l'imprimante, comme par exemple : ipp://192.168.30.210/printers/hp1200
* On choisit ensuite le constructeur de l'imprimante. Dans le cas où votre constructeur n'est pas dans la liste, il faut télécharger sur Internet le fichier PPD (Printer Postscript Description) correspondant et utiliser le bouton Parcourir pour uploader le fichier
* On choisit ensuite le driver correspondant au modèle de l'imprimante. Certains drivers sont les mêmes pour des imprimantes différentes. Si on ne trouve pas son imprimante, il faut aller sur www.linuxprinting.org pour connaitre la compatibilité de l'imprimante avec un autre driver
* Pour valider les modifications, on s'authentifie avec le compte root pour que le logiciel puisse écrire le fichier de configuration de CUPS

### Fichier de configuration

Le fichier principal de configuration de CUPS est /etc/cups/cupsd.conf. Il faut le modifier pour indiquer à quel réseau on partage les imprimantes.
Tout d'abord, on indique à CUPS d'écouter sur toutes les interfaces réseaux. On remplace Listen localhost:631 par :
Dans la balise <Location />, il faut rajouter "Allow" suivi de l'adresse du réseau sur lequel se trouve l'imprimante afin de permettre à mon réseau d'accéder à celle-ci.
Lorsque ce fichier est modifié, il faut relancer le service :

## Configuration côté client / utilisateur
### Interface(s) graphiques

Des outils d'interface graphique permettant d'accéder au système CUPS existent :
    gtklp (Gtk/Gnome)
    system-config-printer-gnome (Gtk/Gnome)

### Interface web

Comme pour la configuration côté serveur, on configure CUPS côté client via l'interface WEB.
Dans la procédure décrite ci dessus, au lieu de spécifier un périphérique local (port parallèle, USB ou autre), on spécifie l'adresse IPP de l'imprimante.
Exemple:
ou (sous Windows) :

## Impression

Les imprimantes sont normalement utilisables via les applications qui ont besoin d'imprimer (menu «Imprimer» !) : suite bureautique, navigateur internet...
Néanmoins, il est possible de les utiliser sans passer par une application, et même de contrôler directement l'état des imprimantes, en utilisant des commandes spécifiques du système.

### Les commandes d'impression

Ces commandes sont fournies par le paquet cupsys-bsd installé précédement.

#### La commande lpr

    permet d'imprimer un fichier :
Pour imprimer sur une imprimante en particulier :
Pour spécifier le nombre de copies (ici 2 copies) :

#### La commande lpq

    permet d'afficher la file d'impression (queue) et connaître les numéros de "job" :
    L'imprimante HP1200 est opérationnelle et en cours d'impression. C'est l'impression de l'utilisateur alex qui est en cours.
    L'impression de l'utilisateur root est en première position de la file d'attente.
Pour voir la file d'attente d'une imprimante en particulier :

#### La commande lprm

    (lp remove) permet de supprimer une impression de la file d'attente à l'aide de son numéro de "job" :
Pour supprimer toute la file d'attente (cette action n'est permise que pour le compte root) :

#### La commande lpstat

    (lp statistiques) permet d'obtenir diverses statistiques
* La liste des imprimantes installées et l'imprimante par défaut
* etc...

## Supervision

La supervision s'intéresse au suivi du bon fonctionnement et à la détection (et correction!) des problèmes.

### Logs

Le premier outil de supervision est l'examen des fichiers «journaux» (logs) de fonctionnement du système CUPS. Ces fichiers sont localisés dans le répertoire
On y trouve trois type d'enregistrements
    access.log : enregistrement des accès d'impressions
    error.log : enregistrement des erreurs
    page.log : enregistrement des pages pour statistiques
Pou obtenir le maximum d'information, il faut positionner le mode Debug dans le fichier de configuration du serveur CUPS
Une surveillance simple dans un terminal :

# Le serveur de fichiers FTP
## Introduction

Le protocole FTP (File Transfer Protocol) permet d'échanger des fichiers volumineux. Il utilise le port 21 (canal de contrôle) et le port 20 (canal des données) en protocole TCP.
Il existe plusieurs serveurs FTP : ProFTPD, Pure-FTPd, VsFTPd, wu-ftpd, muddleftpd... Chacun se différencie des autres par ses fonctionnalités et sa facilité (ou non) a être configuré.
Généralement ces serveurs peuvent également fournir un serveur SFTP (FTP sécurisé, sur le port 22).

## ProFTPD

    Pour plus de détails voir : Administration réseau sous Linux/ProFTPD.
* Installation :
* Configuration :
Une fois les modifications faites sur le fichier de configuration, ne pas oublier de relancer le service :
Exemple de configuration :

## Commandes

Pour piloter un flux SFTP en commandes :

## Références

* ↑ https://docs.oracle.com/cd/E26502_01/html/E29001/remotehowtoaccess-14.html

# Le serveur Web Apache
## Installation de Apache2
### LAMP

Logiciel tout-en-un pour Linux (Apache + MySQL + PHP), comme WAMP pour Windows.

### Installation manuelle
#### Apache sur Debian / Ubuntu

Le service peut ne pas être lancé par défaut, mais même s'il l'est on peut quand-même essayer de l'activer avec :
On peut ensuite tester le serveur, pour voir si une page s'affiche ou s'il refuse la connexion :
Cette adresse est le rebouclage, elle peut aussi être rentrée directement dans tout navigateur web.
Si Apache était déjà installé vérifier le fichier pour indiquer le démarrage automatique d'Apache 2 /etc/default/apache2 :

##### Installer PHP

On distingue principalement deux versions de PHP : celle dont le binaire est appelé par le serveur Web, et php-fpm qui possède son propre service daemon (aussi appelé par le serveur Web) testable ainsi :
FPM signifie FastCGI Process Manager, puisque le processus PHP-fpm écoute les requêtes CGI. Cela peut se traduire soit par des requêtes TCP/IP, soit par un socket Unix (.sock dans le vhost).
PHP peut-être installé avec toutes les déclinaisons de la distribution Debian (stable, testing, unstable). Il suffit pour cela d'insérer vos lignes préférées dans le fichier /etc/apt/sources.list :
Ce qui suit suppose que le serveur Web a bien été installé ; exécuter les commandes suivantes :
Une fois ces commandes exécutées, redémarrer le serveur Web. Dans le cas d'Apache cela s'effectue avec la commande suivante :
Si tout s'est bien passé, vous disposez maintenant d'un serveur Web qui a la capacité d'exécuter des scripts PHP dans votre navigateur.
Testons :
Pour débugger :

###### Mise à jour

Pour PHP 7 ou 8 sur Ubuntu :
Sur Debian :
Puis :
Une fois les serveurs Web installés, ils se lancent automatiquement à chaque démarrage de la machine, ce qui est souhaitable pour un serveur, mais pas toujours pour un PC. Pour éviter cela, il suffit d'y désactiver les daemons :

###### Bibliothèques

Voici une liste de bibliothèques fréquemment utilisées dans les applications :
D'autres s'installent avec pecl au lieu de apt.
Pour les activer après installation, on peut éditer le php.ini ou lancer : phpenmod nom_du_module_php. Ex : sudo phpenmod gd.
Pour les désactiver : phpdismod nom_du_module_php
Pour détecter l'emplacement du php.ini de la version de PHP par défaut : php --ini.

##### Désinstaller PHP

Pour éviter de désinstaller tous les paquets PHP un par un (par exemple après une bascule de PHP7.0 vers PHP7.1), il existe "ppa-purge" :

#### Apache sur Gentoo

Premièrement il faut installer Apache :
Ensuite, il faut installer PHP :
Puis il faut qu'apache utilise PHP dans sa configuration.
* Code : Configuration de apache
* # nano -w /etc/conf.d/apache2
* APACHE2_OPTS="-D PHP5"

#### MySQL seul

MySQL est disponible sur http://dev.mysql.com/downloads/gui-tools/5.0.html au format :
* .msi (Windows)
* .dmg (Mac)
* .rpm (Linux)
* .tar
En l'absence de gestionnaire de paquets, utiliser le .tar ainsi :

#### APT
##### Variante

La dénomination des paquets mentionnés peut varier légèrement selon la version. Dans un terminal, entrez :
et confirmez.
(Remarque : il semblerait qu'en installant le paquet "mysql-server-5.0", au lieu du paquet mentionné plus haut, certaines personnes rencontrent des problèmes. Il est donc préférable d'installer ce paquet, ou d'installer la dernière version 4 stable avec : $ sudo apt-get install mysql-server-4.1. Consultez le forum pour plus d'informations : )
Lancez ensuite la commande :
Appuyez sur Entrée lorsqu'il vous demande le mot de passe root MySQL : pour le moment il n'y en a pas.
Le script vous demande alors si vous voulez mettre un mot de passe pour l'utilisateur root. Répondez Y, et entrez (2 fois le nouveau mot de passe du root MySQL). Il vous pose ensuite une série de questions. Si vous ne savez pas quoi répondre, acceptez les choix par défaut en appuyant simplement sur Enter.
Votre serveur MySQL est prêt. Par défaut il se lance à chaque démarrage du système, si vous ne le souhaitez pas, il vous suffit de lancer :
et de répondre "Non" à la question du démarrage systématique de MySQL.

#### Sur Gentoo
### Modules

De nombreux modules complémentaires peuvent être installés sur Apache.
Pour les lister, on utilise apachectl (parfois apache2ctl) :
ou
Pour activer un module :
Un fichier est alors créé dans /etc/apache2/mods-enabled/.
Exemple pour la réécriture d'URL :
Pour le désactiver :
La configuration du module reste toutefois disponible dans /etc/apache2/mods-available/.

### Sites

Pour lister les sites du serveur :
Pour activer un site :
Le fichier du site est alors visible dans /etc/apache2/sites-enabled/.
Pour le désactiver :
Le site est dans /etc/apache2/sites-available/.

## Problème d'encodage d'Apache2

Si vous rencontrez un problème d'encodage des caractères de vos pages, par exemple les caractères accentués apparaissant sous la forme "�" (<?>), c'est probablement parce qu'Apache2 déclare dans les en-têtes HTTP qui accompagnent les pages visionnées un encodage par défaut en Unicode (UTF-8) :
Tandis que les pages visionnées utilisent un autre encodage des caractères, comme par exemple Latin1 (ISO-8859-1). Même si vos documents indiquent le jeu de caractères utilisé, le paramètre donné par le serveur dans les en-têtes HTTP est prioritaire !
Pour corriger ce problème, il faudra éditer /etc/apache2/apache2.conf :

#### Encodage par défaut en Latin1 (ISO-8859-1)

Cherchez la ligne suivante :
Décommentez-la en enlevant le # :
Pour ceux qui ont la locale iso-8859-15 (sinon vous pouvez faire "sudo dpkg-reconfigure locales" pour l'ajouter) et qui désirent l'utiliser par défaut, ajoutez un 5 en fin de ligne :
ainsi que la ligne suivante dans le paragraphe en-dessous :
Il ne vous reste plus qu'à mettre "fr" en première position dans la ligne LanguagePriority (juste au-dessus), et à demander à apache de relire sa configuration :

#### Aucun encodage par défaut

Il est également possible de s'affranchir de tout encodage par défaut, de la manière suivante :
Cherchez la directive AddDefaultCharset :
Remplacez l'attribut par la valeur Off :
Là encore, on demandera à Apache de relire sa configuration :
Maintenant, les en-têtes HTTP ne contiendront plus d'indication d'encodage des caractères. Attention : il faudra alors que chaque page indique l'encodage utilisé, car s'en remettre à la détection automatique par les navigateurs peut s'avérer assez aléatoire !

## Configuration de Apache2

Le fichier de configuration principal de Apache2 est /etc/apache2/apache2.conf. Dans le cas de Apache version 1.3, ce fichier s'appelle /etc/apache/httpd.conf.
Par défaut, Apache utilise deux fichiers de logs :
* /var/log/apache2/access.log : contient les logs de connexion au serveur Web
* /var/log/apache2/error.log : contient les erreurs survenues
Dans les fichiers de configuration /etc/apache2/apache2.conf ou /etc/apache2/conf.d/security, on peut être amené à modifier :
Le fichier /etc/apache2/ports.conf contient la liste des ports sur lequel Apache écoute. On peut changer le port le par défaut (80), ou lui indiquer d'écouter sur d'autres ports (ex: 443 pour https) en rajoutant des lignes Listen <port>.

### Héberger plusieurs sites Internet

Apache permet de gérer plusieurs sites internet sur le même serveur, pour cela on va utiliser des sections VirtualHost. Pour chaque site Internet, on crée un nouveau fichier dans /etc/apache2/sites-enabled et on lui indique la section VirtualHost (voir ci-dessous). Par convention, on appelle ce fichier avec le nom du site Internet :
Les différents sites vont être stockés dans le répertoire /var/www.On va créer un sous-répertoire par site :
Afin de tester, on crée une page HTML minimale :
Après toutes modifications des fichiers de configuration, on relance Apache2 avec la commande suivante :
On peut tester avec son navigateur en se connectant à l'URL suivante :
Dans cet exemple, il faut bien entendu que www.mondomaine.fr pingue vers notre serveur. On peut simuler ceci en rajoutant une entrée dans le fichier /etc/hosts ou en modifiant le DNS.

### Installer des modules supplémentaires

Apache 2 permet l'installation de nombreux modules pour offrir plus de services ou pour renforcer la sécurité.
Les modules sont dans le répertoire /etc/apache2/mods-available . C'est ici qu'il faut copier les modules additionnels que vous pourrez télécharger pour Apache.
Pour activer un module on peut créer manuellement un lien symbolique dans le répertoire mods-enable
Par exemple pour activer le mod URL Rewriting
Une alternative consite à utiliser la commande a2enable / a2disable
NB : sur les dernières versions de apache2, ces deux commandes s'appellent respectivement a2enmod et a2dismod.

### Protéger un répertoire avec un login / mot de passe

Pour protéger un répertoire avec un login et un mot de passe, on crée dans le répertoire à protéger un fichier .htaccess qui contient le code suivant :
On crée ensuite le fichier /etc/apache2/utilisateurs à l'aide de la commande htpasswd :
La première fois, on utilise l'option -c de la commande htpasswd pour créer le fichier.
On crée ensuite le fichier /etc/apache2/groupes :
Il faut également éditer le fichier /etc/apache2/sites-enabled/000-default afin d'activer la prise en charge du fichier htaccess. Ajouter, si cela n'existe pas encore :
On relance le serveur web :

## Outils pour générer des statistiques de connexion

Chaque fois qu'un visiteur vient sur le site Internet, Apache enregistre sa connexion dans les fichiers /var/log/apache2/*_access.log.
Voici deux logiciels libres qui analysent ces fichiers et qui permettent de générer des statistiques sur les connexions :
* Awstats
** Exemple de statistiques Awstats
* Webalizer
** Exemple de statistiques Webalizer
* Piwik

# Le serveur Web Nginx
## Commandes

Relancer le serveur :
Voir la configuration du processus lancé :
Voir les logs :
Activer un vhost :
La différence entre "restart" et "reload", est que le premier stoppe tout puis tente de redémarrer, alors que "reload" ne stoppe les anciens processus que si le fichier de configuration ne contient pas d'erreur, et donc que les nouveaux peuvent se lancer. Il est donc plus sécurisé.

## Paramètres

La configuration se trouve dans les fichiers .conf du dossier /etc/nginx/conf.d/.
Exemples de configuration :

## vhosts

On peut trouver des validateurs de vhosts en ligne.

### Variables

le module ngx_http_core_module offre des variables correspondant à celles d'Apache.
* $host
* $alias
* $root
* $realpath_root
* $document_root : $root ou $alias de la requête
* $document_uri
* $request_uri
* $fastcgi_script_name

### Mots réservés

Comme dans Apache, la priorité entre les vhosts est déterminée par l'ordre alphabétique des .conf de /etc/nginx/sites-enables.
Les directives sont :

#### listen

Host et port écoutés par le vhost. Ex :

#### server_name

URL du vhost.
* Exemple simple : server_name x.example.com alias.example.com;
* Pour désigner un nom de serveur invalide (généralement dans le vhost default) : server_name _;
* Pour du regex, préfixer avec "~". Ex : server_name ~^(x|y|z)\.example\.com$;
** Le regex permet même les groupes de capture utilisables dans la suite du vhost (ex : $ma_variable) avec la syntaxe suivante : (?<ma_variable>.+). Exemple avec appel :

#### root

Dossier du système de fichier vers lequel redirige l'URL du vhost.

#### location

Bloc paramétrant un chemin donné au sein de l'URL du server_name. Il peut contenir plusieurs autre mots réservés.

##### fastcgi_param

Définit un des paramètres FastCGI.

#### index

Définit l'index à exécuter. Il peut être global ou inclus dans une location. Ex :

#### return

Ex :

#### rewrite

Réécriture d'URL. Ex :

#### access_log et error_log

Optionnel : emplacement des logs d'accès et d'erreur. Par défaut, /var/log/nginx/access.log et error.log.

#### add_header

Ajoute des clés aux en-têtes HTTP. Par exemple pour les règles de protection Content Security Policy (CSP) contre le cross-site scripting (XSS) :
Pour la protection contre le clickjacking :
Par ailleurs, des sites d'audit gratuits peuvent ensuite révéler s'il reste des failles.

### Exemples

Pour un site HTTP :
Pour un site IPv4 et IPv6 en HTTP et HTTPS :

### Rediriger le flux HTTP vers HTTPS

Ajouter dans la configuration la ligne commençant par "rewrite" ci-dessous :

## Références

* ↑ https://www.tecmint.com/connect-nginx-to-php-fpm/
* ↑ https://nginx.viraptor.info/
* ↑ http://nginx.org/en/docs/http/ngx_http_core_module.html
* ↑ http://nginx.org/en/docs/http/ngx_http_core_module.html
* ↑ http://nginx.org/en/docs/http/server_names.html
* ↑ https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
* ↑ https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

# La base de données MySQL
## Introduction

MySQL est un serveur de bases de données relationnelles SQL (Open Source), fonctionnant sur le port 3306 en mode TCP.
Prérequis : Apache.

## Moteurs de stockage

Par défaut, MySQL utilise le moteur de stockage MyISAM.
Toutefois, MySQL propose d'autres moteurs de stockage :
* InnoDB : support des transactions (compatible ACID), des clés étrangères et de l'intégrité référentielle
* MERGE ou MRG_MYISAM : permet de fusionner plusieurs tables de structures identiques
* BDB : Berkeley DB est un format de stockage très répandu (utilisé par exemple par OpenLDAP) et supporte les transactions (compatible ACID)
* HEAP ou MEMORY : ces tables sont stockées en mémoire vive (RAM), elles sont très rapides mais ne survivent pas à un redémarrage de MySQL
* CSV : les données sont stockées dans des fichiers au format CSV (Comma Separated Values)
* ARCHIVE : stocke des informations en utilisant le minimum de place disque (perte de la notion d'index)
* BLACKHOLE : les données sont tout simplement envoyées vers /dev/null et donc perdues. Moteur utilisé pour faire des tests

## Types de données

Chaque information stockée dans une table est définie par un type décrivant la nature de l'information enregistrée.

### Les nombres

* TINYINT
* SMALLINT
* MEDIUMINT
* INT
* BIGINT
* FLOAT
* DOUBLE
* DECIMAL

### Les chaînes de caractères

* CHAR
* VARCHAR
* BINARY
* VARBINARY
* BLOB
* TEXT
* ENUM
* SET

### Les dates et heures

* DATE
* TIME
* DATETIME
* TIMESTAMP
* YEAR

## Installation

Pour installer mysql sous Debian, on tape la commande suivante :

## Fichier de configuration

Le fichier de configuration est /etc/mysql/my.cnf.
Dans ce fichier de configuration on trouve plusieurs sections :
Chaque fois que l'on modifie ce fichier, il faut relancer mysql :
Les bases de données sont stockées dans le répertoire /var/lib/mysql/. Il faut donc sauvegarder ce répertoire.
Pour se connecter à Mysql à partir du shell, on utilise le client Mysql :

## Commandes SQL d'importation / exportation
### LOAD DATA INFILE

La commande SQL LOAD DATA INFILE permet d'importer des données dans une table SQL à partir d'un fichier texte.
Par exemple, nous avons la table suivante :
Nous voulons insérer le fichier suivant :
Pour importer le fichier dans la table contact, nous tapons la commande suivante :
Vérification :
Pour connaître l'ensemble des options disponibles de la commande LOAD DATA INFILE, voir la documentation Mysql : Doc Mysql / LOAD DATA INFILE

### SELECT INTO OUTFILE

La commande SQL SELECT INTO OUTFILE permet d'exporter des données de la base de données dans un fichier texte.
Dans le cas présent, les champs "prenom" et "nom" ont été sélectionnés à partir de la table "contacts" afin de pouvoir être exportés dans le fichier "result.txt" situé dans le répertoire "/tmp"
Attention, il faut penser à préciser les clauses "FIELDS" et "LINES" destinées à traiter correctement les délimitations des champs et des lignes lors de l'export !
Remarque : C'est l'utilisateur mysql qui crée ce fichier, il doit donc avoir les droits nécessaires :

## Les fichiers de données

Les fichiers contenant les données sont stockés dans /var/lib/mysql/.
/var/lib/mysql/ est donc le répertoire important à sauvegarder.
Chaque base de données dispose de son propre répertoire /var/lib/mysql/<nomdelabase>/.
Le fichier db.opt contient la configuration de la base de données (encodage des caractères ...).
Le fichier <nomdetable>.FRM décrit la structure de la table.
Dans le cas du format MyISAM, chaque table est enregistrée dans deux fichiers :
* <nomdetable>.MYD : contient les données
* <nomdetable>.MYI : contient les index
Dans le cas du format Innodb, toutes les tables sont stockées dans un ou plusieurs seuls fichiers : ibdata1, ibdata2 ...

## Les fichiers journaux

Les fichiers journaux sont contenus dans le répertoire /var/log/mysql/.
Il y a 3 fichiers importants :
* mysql.log : contient les authentifications des utilisateurs et les requêtes SQL
* mysql.err : contient les erreurs. Sous Debian, ce fichier n'existe pas ou est vide car les erreurs Mysql sont envoyées à syslog (Debian improvement).
* mysql-slow.log : contient les requêtes lentes
Pour activer les fichiers log, il faut décommenter les deux lignes dans /etc/mysql/my.cnf :
Puis relancer mysql :

## Les documentations
### Package Debian mysql-doc-5.0

Debian propose un package contenant les documentations Mysql. Il faut pour y accéder installer le package mysql-doc-5.0 :
La documentation sur mysql est accessible dans le répertoire /usr/share/doc/mysql-doc-5.0.
Dans ce répertoire, on trouve des pages HTML qui contiennent toute la documentation de mysql.

### Documentations en ligne

Sur le site de mysql
- Toutes les documentations
- Le manuel de référence en français

### Listes de diffusion

Toutes les listes de diffusion

### IRC

Canal #mysql sur Freenode

## Modifications des privilèges

Il y a quatre techniques pour modifier les privilèges :
* modifier directement les tables user et db de la base de données mysql (ne pas oublier de faire un FLUSH PRIVILEGES; après)
* utiliser les instructions SQL GRANT et REVOKE
Exemple : enlever tous les droits à l'utilisateur alex sur la base de données dbalex :
Exemple : donner tous les droits à l'utilisateur alex sur la base de données dbalex :
on peut également spécifier les droits à donner :
* utiliser la commande shell mysql_setpermission (cf ci-dessous)
* utiliser un outil graphique de type PhpMyAdmin

## Les commandes d'administration

Utile : pour ne pas avoir à spécifier le mot de passe du root chaque fois que l'on invoque une commande mysql*, il suffit de créer un fichier .my.cnf dans son répertoire de travail et qui contient le mot de passe à utiliser. Attention aux droits d'accès à ce fichier !

### mysql

La commande mysql est le client Mysql en ligne de commande. Il permet de se connecter à Mysql et de saisir des commandes SQL.
Voici les options les plus courantes :
Options de base (communes à la plupart des commandes mysql) :
* -h (--host=) : définit l'hôte hébergeant la base de données
* -D (--database=) : définit la base sur laquelle l'utilisateur va se connecter.
* -u (--user=) : précise le nom d'utilisateur Mysql sous lequel l'utilisateur se connecte.
* -P (--port=) : détermine le port à utiliser pour la connexion
* -p (--password=) : demande la saisie du mot de passe (obligatoire si l'utilisateur a été défini pour se connecter avec un mot de passe)
Exemple :
Dans cet exemple la requête demande de se connecter par mot de passe à la base dbalex en tant que paul.
Autres options intéressantes :
* -H (--html) : permet de produire des sorties en HTML
* -X (--xml) : permet de produire des sorties en XML
Pour aller plus loin :
Donne la liste et un bref descriptif de toutes les options à utiliser avec la commande mysql

### mysqldump

mysqldump peut sauvegarder des bases de données MySQL. Son fonctionnement est particulièrement intéressant car elle génère les commandes SQL permettant de re-créer la base de données sur un autre serveur, ou d'exporter les données vers du CSV et du XML.

#### Backup

Pour exporter la base de donnée « myBase », on utilise la commande suivante :
Ceci fera l'export dans un fichier « myBase_backup.sql ».
Exemple de dump d'une base :
Pour dumper toutes les bases :
Pour dumper certains enregistrements de certaines tables :

##### Sans les données

Pour ne récupérer que le schéma :

##### Aux formats Oracle, PostgreSQL, Microsoft SQL Server...

L'option --compatible permet de spécifier à mysqldump le format à utiliser pour être compatible avec les bases de données existantes. Exemple :
Cette option peut prendre les valeurs suivantes : ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options

##### Tâche planifiée

Pour définir le backup automatique d'une base tous les soirs à minuit, sous Linux :
Le fichier décompresser est au format SQL et peut donc être exécuter pour recréer les bases, tables, et insérer les enregistrements.

#### Restauration

Pour importer une base de données sauvegardée via mysqldump, on utilise la commande cliente mysql et une redirection en entrée :
En cas de gros volume, il est plus rapide de copier les .bin des bases, au lieu d'utiliser mysqldump.

##### Préparation

Pour réinjecter le dump dans d'autres bases, il vaut mieux nettoyer la base de destination.

##### Vers une base distante

En utilisant mysqldump et ssh, on peut dupliquer une base de données sur une machine distante :

### mysqlimport

Attention : le nom du fichier (sans extension) doit être le même que la table.

### mysqladmin

La commande mysqladmin permet de passer des commandes à Mysql.
OPTIONS :
Commandes :
* create : créé une base de données
* drop : supprimé une base de données
* flush-privileges : rechargé les tables de droits
* flush-hosts : met à jour les informations concernant les hôtes
* flush-logs : met à jour les informations concernant les journaux
* flush-status : efface les variables status
* flush-tables : met à jour les informations concernant les tables
* flush-threads : met à jour les informations concernant les threads
* password : change le mot de passe
* old-password : change le mot de passe en utilisant l'ancien algorithme de chiffrement
* ping : teste si mysql fonctionne
* reload : recharge la configuration
* refresh : vide les caches
* shutdown : arrête mysql
* status : connaitre des informations sur l'état du serveur
* extended-status : connaitre des informations détaillées sur l'état du serveur
* proc ou processlist : connaitre les utilisateurs connectés
* debug : Passe Mysql en mode debug
* kill : Permet d'arrêter des threads. On indique le numéro de connexion à terminer obtenu avec proc ou processlist
* start-slave : Démarre la réplication sur le serveur de réplication esclave
* stop-slave : Arrête la réplication sur le serveur de réplication esclave
* variables : Affiche les variables internes Mysql
* version : Affiche le numéro de version de Mysql
Utile : j'ai perdu le mot de passe du compte root mysql, comment le changer :
1. On arrête Mysql :
2. On relance le daemon mysqld avec l'option --skip-grant-tables
3. Depuis une autre fenêtre, on se connecte à Mysql
4. On met à jour la table user :
5. On arrête proprement le daemon mysqld :
6. On relance Mysql :

### mysqlcheck

La commande mysqlcheck permet de vérifier l'intégrité d'une base de données. On indique la (les) base(s) de données à vérifier (et optionnellement les tables à vérifier), et la commande donne l'état : OK ou corrompue.
Options courantes :
* -r ou --repair : permet de corriger presque tout, sauf les problèmes de doublons pour les clés uniques.
* -a ou --analyse : permet d'analyser les tables indiquées.
* -o ou --optimize : permet d'optimiser les tables indiquées.
Exemple : vérifier l'intégrité de toutes les tables de la base de données testdb :
Vérifier uniquement la table client :
Vérifier les tables user et db de la base de données mysql :
Remarque : mysqlcheck ne fonctionne qu'en utilisant des instructions SQL (CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, et OPTIMIZE TABLE), il a donc besoin que le serveur Mysql soit en train de fonctionner.

### myisamchk

La commande myisamchk permet la restauration d'une table ou plusieurs tables endommagées à la suite de crash répétés du démon mysqld.
Attention : myisamchk intervient directement sur les fichiers, il se passe de mysqld contrairement à mysqlcheck !
Quelques précautions d'usage: : Si vous utilisez myisamchk pour réparer ou optimiser les tables, vous devez toujours vous assurer que mysqld n'utilise pas cette table (ce qui s'applique aussi si vous utilisez --skip-external-locking ). Si vous n'éteignez pas le serveur mysqld , vous devez au moins utiliser mysqladmin flush-tables avant de lancer myisamchk.
Attention : Vos tables peuvent être corrompues si le serveur mysqld et myisamchk travaillent dans une même table simultanément.
Vérifier la cohérence d'une table:
On indique à myisamchk les tables à vérifier en désignant les fichiers index MYI :
On peut également spécifier toutes les tables comme ceci :
Voire carrément vérifier toutes les tables de toutes les bases :
La commande affiche un rapport d'analyse, et si tout est OK, ne signale pas d'erreur :
Cette commande trouvera 99.99% de toutes les erreurs. Elle ne peut toutefois détecter les erreurs qui impliquent uniquement le fichier de données (ce qui est très inhabituel).
Si vous voulez uniquement vérifier une table sans que la commande produise un affichage, il faut utiliser l'option -s (ou --silent).

### mysql_setpermission

La commande mysql_setpermission permet de définir les permissions des utilisateurs Mysql de manière intéractive.
Ecrit en Perl, ce script a besoin des modules DBI et DBD::mysql pour fonctionner.
* 1 : Permet de modifier le mot de passe d'un utilisateur éxistant
* 2 : Permet d'ajouter/modifier le droit SELECT d'un utilisateur sur une table en créant un utilisateur et une table :
L'utilisateur user aura le droit SELECT sur la base de donnée dbuser
* 3 : Même fonction que la sélection 2, sauf que l'on donne le droit SELECT sur une table existante.
* 4 : Même fonction que la sélection 2, pour les droits SELECT,INSERT,UPDATE,DELETE.
* 5 : Même fonction que la sélection 2, pour les droits SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES
* 6 : Même fonction que la sélection 2, pour tous les droits.
* 7 : Met les droits par défaut (N) pour un utilisateur existant.
* 0 : sortir du programme
Les différentes options de mysql_setpermission :
* --help (ou -h) : permet d'afficher l'aide
* --host (ou -h) : se connecte au serveur Mysql donné
* --password (ou -p) : pour qu'il demande le mot de passe à la connexion
* --port (ou -P) : donne le numéro de port si différent de celui par défaut
* --user (ou -u) : se connecte au serveur avec le nom de compte donné

### mysqlhotcopy

La commande mysqlhotcopy permet de copier une base de données à chaud, c'est à dire sans arrêter le serveur Mysql.
Pour cela, la commande bloque les tables afin qu'il n'y ai pas de modification des tables durant la copie.
Les tables sont ensuite débloquées.
Exemple d'utilisation :
Vérification :

## Autres programmes utiles
### MySQL Workbench

Anciennement nommé MySQL Administrator, MySQL Workbench est aujourd'hui maintenu par Oracle.
| Accueil de MySQL Workbench | Accueil de MySQL Administrator |
| Configuration de MySQL Workbench | Configuration de MySQL Administrator |

### MySQL Query Browser

MySQL Query Browser n'est plus développé depuis 2012.

### MySQL Control Center

mysqlcc est l'ancien logiciel d'administration de MySQL, il s'est arrêté en 2013, et donc n'est pas 100 % compatible avec la version 5 de MySQL. Il est désormais remplacé par MySQL Workbench.

### MySQL Navigator

MySQL Navigator n'est plus développé depuis 2013.

## Références

* ↑ http://stackoverflow.com/questions/6645818/how-to-automate-database-backup-using-phpmyadmin
* ↑ https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
* ↑ http://sqlbrowser.www2.pl/?act=download
* ↑ http://sourceforge.net/projects/mysqlcc/?source=navbar
* ↑ http://sourceforge.net/projects/mysqlnavigator/?source=typ_redirect

# Memcached
## Installation

Memcached s'installe sur un serveur de mémoire cache distribuée, base de données de paires clé-valeur, qui est accessible par ses clients sur le port 11211, en TCP ou UDP.
Installation :

### Client

Sur Docker PHP :

### Test

Si ça fonctionne sur le serveur mais pas depuis les autres machines, c'est certainement qu'il écoute 127.0.0.1 au lieu de son IP externe. Pour le vérifier :
ou
Pour le résoudre :

### Commandes

* Reset mémoire :

## Utilisation

Memcached propose plusieurs commandes. Pour tester si le serveur fonctionne avant de l'utiliser en PHP, on peut donc les lancer avec telnet nom_du_serveur 11211.
* stats : informations sur le cache en cours.
* set : ajoute une paire clé-valeur dans le cache.
* add : ajoute une paire clé-valeur uniquement si la clé n'existe pas déjà.
* get : récupère la valeur à partir de la clé donnée en paramètre.
* delete : supprime la paire clé-valeur de la clé donnée.
* flush_all : supprime tout ce qu'il y a dans le cache.
Par exemple pour lire une clé, il faut d'abord voir les descriptions de toutes les clés :
Puis l'appeler par son numéro pour voir son nom (le zéro représente l'absence de limite) :

# Redis
## Installation

Redis est comme Memcached, un système de gestion de base de données clef-valeur scalable, très hautes performances. En 2019, il devient plus utilisé que Memcached car il possède plus de fonctionnalités. Par exemple il permet en plus une persistance sur la mémoire morte utile pour les reprises sur panne, autoriser les groupes de paires clé-valeur, et gère mieux le parallélisme.

### Serveur

Pour l'installer :
Obtenir la version :

### Client

Sur Docker PHP :
Sur WAMP :
* Télécharger le .dll sur https://pecl.php.net/package/redis
* L'extraire dans le dossier correspondant à la version de PHP. Ex : bin\php\php8.2.0\ext
* L'activer dans php.ini.
* Redémarrer WAMP.
Ensuite on le voit dans phpinfo.

## Commandes

Pour se loguer au serveur Redis :
Les commandes Redis les plus utiles :

### Lecture

* MONITOR : suivre l'activité du serveur en temps réel.
* KEYS * : liste des clés.
* GET : affiche la valeur de la clé en paramètre (ou nil si elle n'existe pas).
* MGET : affiche les valeurs des clés en paramètre.
* QUIT : quitter.

### Écriture

* SET : définit une valeur associée à la clé en paramètre.
* EXPIRE : définit une durée avant expiration pour la clé en paramètre, en secondes.
* SETEX : SET + EXPIRE.
* DEL : supprimer par le nom complet de la clé.
* FLUSHALL : vider toute la base de données.
Exemple de reset mémoire depuis le shell :

## redis-cli

Pour afficher les clés de la base en shell :
Par défaut, redis-cli pointe sur 127.0.0.1. Pour regarder une autre machine :
Supprimer des clés par leurs noms (exemple de celles qui ont le préfixe "users:") :
ou :

## Plusieurs bases

Chaque instance de Redis peut accueillir jusqu'à 16 bases de données.
Elles sont accessibles par un suffixe dans leur DSN. Par défaut, redis://localhost:6379 pointe sur la base zéro : redis://localhost/0:6379.

# Le serveur de mails Postfix
## Le serveur de mail Postfix

Postfix est un serveur de mail écrit dans l'idée de remplacer Sendmail, serveur de mail historique de moins en moins utilisé car sa configuration est très complexe et qu'il contient des failles de sécurité.
Postfix effectue 99 % des fonctions de Sendmail, les 1% restant ne sont que purement applicable dans une minorité de cas. De plus, il allie performance et facilité d'installation et de paramétrage.
Il existe de nombreux autres serveurs de mails, parmi les plus connus : Qmail, Exim, Qpsmtpd, Courier...

### Quelques définitions

* DNS : Domain Name System (port 53), pour convertir les adresses URL en adresses IP.
* SMTP : Simple Mail Transfer Protocol (port 25), pour l'envoi et l'acheminement du courrier.
* POP : Post Office Protocol (port 110), pour la réception du courrier.
* IMAP : Internet Message Access Protocol (port 143), sert à la réception du courrier. À la différence de POP, les emails restent stockés sur le serveur IMAP.
* MTA : Mail Transfer Agent. Il s'agit des serveurs de mails SMTP.
* MDA : Mail Delivery Agent. Il s'agit du serveur qui dépose les messages dans chaque boîte aux lettres (POP ou IMAP).
* MUA : Mail User Agent. Il s'agit des logiciels clients de messagerie, ex : Mozilla Thunderbird, Microsoft Outlook, KMail, Eudora, ou Evolution.

### Comment ça marche ?

* Schéma du cheminement des mails entre les correspondants (trois cas illustrés en fonction des moyens mis en œuvre).
Le schéma précédent nous propose trois cas de figure :

#### Cas numéro 1

* Nous avons deux sociétés : societe.com et client.com
* Paul (paul@societe.com) veut envoyer un mail à Pierre (pierre@client.com)
* Le mail part en direction du serveur SMTP de sa société (smtp.societe.com)
* Celui-ci est accepté par le serveur de mail smtp.societe.com car il vient de son propre réseau
* smtp.societe.com fait une demande au serveur DNS pour connaitre le serveur de mail qui gère les courriers de @client.com : client.com MX ? (Mail eXchanger)
* Le serveur DNS répond : smtp.client.com
* Le serveur de mail smtp.societe.com contacte donc le serveur SMTP smtp.client.com
* Lorsque le client de messagerie de Pierre veut consulter ces mails, il va demander à POP si il y a quelque chose pour lui et télécharge le mail de Paul
* Pierre a donc bien reçu le mail de Paul
* Pierre répond à Paul de la même manière
* Le mail suit le cheminement inverse : smtp.client.com demande au serveur DNS le serveur de messagerie de societe.com. Celui-ci lui répond : smtp.societe.com
* Le mail est acheminé vers le serveur SMTP smtp.societe.com
* Il est stocké jusqu'à la demande de Paul de lire ces mails. Contrairement à Pierre, le client de messagerie de Paul interroge le serveur IMAP imap.societe.com. La différence est que le mail de Pierre est lu directement depuis le serveur IMAP et reste stocké sur ce dernier

#### Cas numéro 2

* Notre ami Paul fait partie d'une association (asso.org) et dispose d'un email sur ce domaine : paul@asso.org
* L'association dispose d'un hébergement chez hebergeur.net qui lui fournit différents services serveur SMTP, POP, IMAP et accès webmail
* Paul utilise son email sur asso.org (paul@asso.org) pour envoyer un email à son ami Jack qui dispose aussi d'un email sur asso.org : jack@asso.org
* Ce mail est acheminé via son réseau vers son serveur SMTP. Dans son client Outlook, Paul a paramétré plusieurs comptes
* Le serveur de sa société (smtp.societe.com) accepte d'envoyer le mail sur Internet, même si l'email émetteur et le destinataire utilisent des noms de domaine différents, car il vient de son propre réseau
* Ce mail est donc envoyé au serveur SMTP asso.org : smtp.hebergeur.net
* Paul peut donc s'il le souhaite aller consulter ses mails sur asso.org via le serveur POP ou IMAP qui va rapatrier directement les mails paul@asso.org

#### Cas numéro 3

* Jack utilise une connexion à Internet fournie par un fournisseur d'accès à Internet : fai.fr. Pour lire son email sur asso.org (jack@asso.org), Jack utilise son navigateur Web et l'accès Webmail fournit par fai.fr
* Il se connecte donc sur l'adresse webmail.asso.org et peut ainsi visualiser ses mails. Aucun email ne sera rapatrié sur son PC.
* Il peut également répondre à tous ses mails via un Webmail.

### Installation de Postfix

Installer en premier Postfix, si un autre serveur de mail est déjà présent, il le supprimera :
Pour l'instant, nous laissons toutes les options par défaut, nous allons le configurer par la suite.
Une fois l'installation terminée, nous allons configurer Postfix.

### Configuration de Postfix

Pour que cela fonctionne sur Internet, il faut que le nom local du serveur (hostname) soit le même que celui du réseau (défini dans les DNS). Dans cet exemple, il s'appellera mail.mondomaine.fr. De plus, il faut commenter la ligne ci-dessous mydestination qui bride les envois vers l'extérieur.
Le fichier de configuration principal de Postfix est /etc/postfix/main.cf. Copier le suivant en remplaçant mondomaine.fr par le vrai domaine du serveur :
On peut visualiser la totalité des options possibles de Postfix et leurs valeurs par défaut via la commande postconf :
En français ça donne : délivre en local les emails vers mydestination avec mailbox_command, sinon délivre-les sur Internet mais en refusant ceux qui ne viennent pas de mynetworks ou relayhost (s'ils sont vides on accepte rien, s'ils sont commentés on accepte tout, même de relayer des spams).
Une fois main.cf sauvegardé pour la première fois, on vérifie que le fichier /etc/mailname contient le nom de domaine de notre réseau :
Chaque fois que l'on modifie le fichier /etc/postfix/main.cf, il faut relancer Postfix :
Pour chaque mail envoyé ou reçu, Postfix enregistre les informations d'acheminement dans le fichier /var/log/mail.log. Il est donc très utile de surveiller ce fichier durant les tests de fonctionnement.
Pour vérifier que le serveur de mail fonctionne, on envoi un mail à un utilisateur et on regarde le fichier /var/log/mail.log.
Dans un autre terminal :

## Ajouter une boite aux lettres

Pour ajouter une boite aux lettres, il existe trois solutions :
* Créer un compte Unix.
* Créer une adresse virtuelle.
* Créer un alias.
Les voici en lignes de commandes, mais elles sont aussi réalisables au moyen d'un webmail.

### Nouveau compte système

Pour des raisons de sécurité, on positionne le shell de l'utilisateur à /bin/false (ainsi il ne pourra pas se logger sur le serveur). Le mot de passe saisi sera celui de sa boite aux lettres. On rajoute l'utilisateur dans le groupe mail afin qu'il puisse écrire le fichier <login>.lock dans le répertoire /var/mail.

### Adresse virtuelle

Activer la fonction dans :
avec :
Ensuite il faut définir les adresses emails dans /etc/postfix/virtual, sous forme de paires clé-valeur :
Puis créer la base de données à partir du fichier :

### Alias

Pour éditer la liste des adresses emails alias de celles d'une boite :
Par exemple en y ajoutant les plus fréquents :
Ainsi, quelqu'un qui voudra reporter un problème à abuse@mondomaine.fr écrira dans la boite de root, ce qui sera visible par une notification à chaque fois que ce dernier se connectera en SSH.
Puis la commande newaliases crée alors /etc/aliases.db à partir de cette liste.

## MDA : filtres de courrier électronique

Par défaut les emails des boites créées ci-dessus s'empilent tous dans un fichier de /var/mail/. Afin de les router vers des boites mails séparées, on utilise un ou plusieurs logiciels Mail Delivery Agent.
* Pour les transferts locaux (vers une boite mail personnelle du serveur), ils utilisent le protocole LMTP.
* Pour les transferts distants (vers un client de messagerie), il faut choisir entre le protocole POP3 (qui déplace les emails vers le client) et IMAP (qui laisse une copie des emails sur le serveur).
Voici plusieurs exemples de MDA :

### procmail

Pour installer procmail :
* En remplaçant user par l'utilisateur du processus.
* Sur Ubuntu il s'installe dans /usr/bin/procmail, mais d'autres distributions nécessitent d'adapter ce chemin ci-dessus.
Explications :
* Le fichier utilisateur .forward permet d'insérer le filtrage procmail dans le parcours des emails à destination de cet utilisateur.
* Le fichier .procmailrc configure le filtrage pour l'utilisateur concerné.
* maildirmake crée l'arborescence nécessaire à l'accueil des emails :
** new (nouveau) : boite de réception.
** cur (courante) : boite courante.
** tmp (temporaire) : mails en transit.
Pour voir s'il fonctionne, envoyer un email à l'utilisateur configuré ci-dessus, puis regarder s'il est arrivé :
En cas de problème :

### fetchmail

Pour installer fetchmail :
Il se configure avec :
On peut par exemple lui dire de tout transférer vers procmail en y ajoutant :
Ou bien lui faire récupérer directement des boites utilisateurs distantes avec :
La ligne mailbox_command du fichier /etc/postfix/main.cf doit pointer vers procmail, qui reroute ensuite vers fetchmail.
fetchmail peut récupérer les emails de fournisseurs externes, tels que Gmail, Yahoo ou Outlook.com, par cron. C'est un mail retrieval agent (MRA).

### Dovecot

En plus d'un MDA intégré, Dovecot intègre un serveur POP ou IMAP.
Tout comme pour fetchmail, il peut fonctionner en aval de procmail. Toutefois, il est possible de remplacer procmail par Dovecot dans /etc/postfix/main.cf :
pour Ubuntu :
Ensuite, l'installation de Dovecot dépend du protocole souhaité dans le MUA qui viendra relever le courrier :

#### Serveur IMAP

IMAP nécessite le format de stockage Maildir. Nous allons donc tout d'abord configurer Postfix pour lui indiquer d'utiliser le format Maildir au lieu du traditionnel mbox.
On modifie le fichier /etc/postfix/main.cf. On commente l'option mailbox_command (qui appelle procmail) et on rajoute l'option home_mailbox :
On relance postfix :
Pour chaque utilisateur existant, il faut ensuite créer le répertoire Maildir. On fait ceci à l'aide de la commande maildirmake fournie par dovecot-imapd ou courrier-imap :
Pour automatiser la création du répertoire Maildir pour les nouveaux utilisateurs, on exécute la commande maildirmake dans le répertoire /etc/postmaster. Ainsi tous les nouveaux utilisateurs auront automatiquement le répertoire Maildir dans leur home directory :

## Webmails

Par défaut les webmails cherchent les courriels dans le dossier définit dans le serveur POP ou IMAP, et qui peut être différent de là où ils sont distribués.
Par exemple pour la configuration ci-dessus avec Dovecot, /etc/dovecot/conf.d/10-mail.conf doit contenir mail_location = maildir:/home/%u/Maildir.

### SquirrelMail

SquirrelMail est un webmail très simple à installer, qui fonctionne sans SGBD. Outre les envois et réceptions d'emails, il permet d'archiver en créant ou supprimant des dossiers.
Si n'est déjà le cas, on installe le serveur Web Apache :
Pour installer SquirrelMail sous Debian, on tape la commande suivante :
On peut configurer Squirrelmail en utilisant le programme squirrelmail-configure. Ce fichier permet configurer le fichier /etc/squirrelmail/config.php. À noter que l'on peut modifier directement ce fichier sans passer par squirrelmail-configure.
SquirrelMail est fourni avec la section à rajouter à Apache pour l'activer. On va donc dans le répertoire de configuration de Apache pour lui indiquer d'utiliser ce fichier :
On relance Apache :
On peut tester si SquirrelMail fonctionne avec son navigateur en se connectant à l'URL suivante :

### Postfixadmin

Postfixadmin est un webmail qui fonctionne avec MySQL.

### Roundcube

Roundcube est un webmail qui fonctionne avec MySQL, PostgreSQL, SQLite ou MSSQL. Il est très ergonomique (glisser-déposer, effacement en masse avec Maj + clic puis Suppr), plus graphique mais plus lent et moins stable que SquirrelMail.
Et voilà : http://localhost/roundcube

## Configuration pour des envois distants

Pour que les emails ne soient pas directement écartés ou classés dans les spams par les serveurs de messagerie des destinataires, il faut impérativement montrer patte-blanche de plusieurs façons :
* Règle de reverse DNS.
* Règle DNS SPF (1 ou 2).
* Règle DNS DMARC.
* Signature DKIM dans chaque email correspondant à l'enregistrement DNS TXT dédié.
* Absence de blacklistage sur l'adresse IP publique du SMTP.
* Optimisation du ratio texte / image à 60 / 40 %.
Un serveur de messagerie qui accepte d'envoyer des emails pour le compte de n'importe qui se retrouvera rapidement blacklisté par des organismes antispams, dont les listes sont utilisées par de nombreux serveurs MX. Et cela peut coûter de l'argent pour se déblacklister. Pour s'en prémunir, il est donc très fortement recommandé de laisser le paramètre relayhost = non commenté.

## Sécurisation TLS

Tout d'abord, il faut générer une clé de cryptage asymétrique, puis indiquer son chemin dans main.cf :
En cas d'erreur, on peut vérifier sa mise en place avec
Pour plus d'information sur les certificats .pem, voir Apache/HTTPS.

## Références

* ↑ « Amplification d'attaque DDoS : Memcached fait exploser les compteurs » (consulté le 19 octobre 2018)
* ↑ https://github.com/memcached/memcached/wiki/Commands
* ↑ https://aws.amazon.com/fr/elasticache/redis-vs-memcached/
* ↑ https://www.disko.fr/reflexions/technique/redis-vs-memcached/
* ↑ https://redis.io/commands
* ↑ https://redis.io/commands/set/
* ↑ https://redis.io/commands/setex/
* ↑ https://rdbtools.com/blog/redis-delete-keys-matching-pattern-using-scan/
* ↑ https://www.mikeperham.com/2015/09/24/storing-data-with-redis/
* ↑ http://doc.ubuntu-fr.org/postfix
* ↑ https://www.digitalocean.com/community/tutorials/how-to-install-and-setup-postfix-on-ubuntu-14-04
* ↑ http://www.troubleshooters.com/lpm/201202/images/dovecot_setup.png
* ↑ « Utilisation simple de procmail »
* ↑ (en) « A Quick, Practical Procmail Guide »
* ↑ http://wiki.dovecot.org/LDA/Postfix
* ↑ http://www.clickz.com/clickz/column/1695095/hotmail-delivery-tips-sender-id-spf
* ↑ https://www.isalo.org/wiki.debian-fr/Amavisd-new_et_DKIM
* ↑ http://whatismyipaddress.com/blacklist-check
* ↑ http://themediaonline.co.za/2011/07/the-five-rules-of-designing-email/

# Les annuaires LDAP
## Configuration

Pour Debian Squeeze le fichier slapd.conf se situe dans /usr/share/doc/slapd/examples/slapd.conf. Il faut donc changer son emplacement avec cp /usr/share/doc/slapd/examples/slapd.conf /etc/ldap/. Puis modifier le fichier /etc/default/slapd et changer la ligne 'SLAPD_CONF=/etc/ldap/slapd.conf'.
La configuration de OpenLDAP se situe dans le fichier /etc/ldap/slapd.conf :
Après chaque modification de ce fichier, on relance OpenLDAP avec la commande suivante :

### Création de l'annuaire

On crée le fichier LDIF qui va initialiser le sommet de l'arbre :
On injecte le fichier LDIF dans l'annuaire via la commande ldapadd :
Pour créer les autres entrées, on peut désormais utiliser PhpLdapAdmin.

### Les commandes d'administration OpenLDAP

Parler des commandes : slapacl, slapcat, slapindex, slapadd, slappasswd, slapauth, slapdn te slaptest

## Les programmes complémentaires
### Les outils en ligne de commande

NB : les commandes suivantes sont fournies par le paquet Debian ldap-utils. Elles disposent des options génériques suivantes :
* -h <adresse IP ou nom> : permet d'indiquer le serveur hébergeant l'annuaire LDAP
* -x : on utilise l'authentification simple et non l'authentification TLS/SSL.
* -b <basedn> : permet d'indiquer l'annuaire à consulter (le basedn ou suffix)
* -D <dn d'un objet> : permet de s'authentifier avec le DN indiqué
* -W : demande la saisie du mot de passe du DN précédemment indiqué
* -f <fichier LDIF> : permet d'indiquer un fichier LDIF

#### ldapadd

La commande ldapadd permet d'ajouter des entrées dans l'annuaire LDAP.
Prenons par exemple le fichier LDIF suivant qui crée le suffixe (le basedn) de notre annuaire :
Pour injecter ce fichier LDIF dans notre annuaire :
Si tout se passe bien, vous devez voir des lignes :

#### ldapsearch

La commande ldapsearch permet d'interroger l'annuaire LDAP.
Affiche toutes les entrées de l'annuaire :
Affiche les attributs de l'utilisateur bob via l'utilisation d'un filtre :
Affiche uniquement les attributs uid et homeDirectory de l'utilisateur bob :

#### ldapdelete

La commande ldapdelete permet de supprimer une entrée de l'annuaire LDAP. On indique à cette commande le(s) dn(s) à supprimer.
Supprime l'utilisateur bob :

#### ldapmodify

La commande ldapmodify permet de modifier une entrée de l'annuaire LDAP.
rajouter un exemple de la commande ldapmodify

#### ldapmodrdn

La commande ldapmodrdn permet de renommer une entrée de l'annuaire LDAP. Cette opération revient à changer le dn (distinguished name) d'une entrée.
rajouter un exemple de la commande ldapmodrdn

#### ldapcompare

La commande ldapcompare permet de comparer des entrées de l'annuaire LDAP.
rajouter un exemple de la commande ldapcompare

#### ldappasswd

La commande ldappasswd permet de changer le mot de passe d'une entrée de l'annuaire LDAP.
rajouter un exemple de la commande ldappasswd

#### ldapwhoami

La commande ldapwhoami permet de connaître avec quelle identité on est connecté à l'annuaire LDAP, c'est l'équivalent de la commande Unix whoami.
rajouter un exemple de la commande ldapwhoami
slapadd est utilisé pour ajouter des entrées spécifiées dans le format LDAP Directory Interchange Format (LDIF) dans une base de données slapd.
slapcat est utilisé pour générer une sortie LDIF LDAP basé sur le contenu d'une base de données slapd.
slapd est un serveur LDAP autonome.
slapindex est utilisé pour regénérer les index de slapd suivant le contenu actuel d'une base de données.
slurpd est un serveur réplicat autoname pour LDAP.

### PhpLdapAdmin

PhpLdapAdmin est un logiciel qui permet d'administrer un annuaire LDAP via une interface Web.
Installation :
Configuration :
PhpLdapAdmin s'est configuré avec l'annuaire définit par défaut dans OpenLDAP. Si on a changé ce dernier, il faut modifier les deux lignes suivantes dans la configuration de PhpLdapAdmin :
À chaque modification de ce fichier, il est préférable de redémarrer apache :
Accès à PhpLdapAdmin : http://localhost/phpldapadmin/

## La réplication LDAP
### Configuration du provider LDAP

On modifie le fichier /etc/ldap/slapd.conf du provider LDAP pour indiquer l'annuaire à répliquer, on rajoute les lignes en gras dans la configuration de l'annuaire et on modifie les attributs à indexer :

### Configuration du consumer LDAP

On modifie /etc/ldap/slapd.conf du second OpenLDAP (le consumer) pour lui indiquer l'annuaire à répliquer et l'adresse du premier OpenLDAP (le provider).
Il faut ensuite créer le répertoire du nouvel annuaire et le donner à l'utilisateur et au groupe openldap :
Il ne reste plus qu'à relancer OpenLDAP :

### Validation de la réplication

L'objectif est de constater la réplication des objets de l'annuaire.

#### Procédure n°1 : validation de l'ajout de données sur le réplicat
##### Coté Provider

* on crée un fichier LDIF contenant l'utilisateur à rajouter
* on injecte ce fichier LDIF dans notre annuaire
* on vérifie que l'utilisateur a bien été créé

##### Coté Consumer

* on attend quelques secondes et on constate que l'utilisateur a bien été créé sur le réplicat

#### Procédure n°2 : validation de la suppression de données sur le réplicat
##### Coté Provider

* on supprime l'utilisateur de notre annuaire
* on vérifie que l'utilisateur a bien été supprimé

##### Coté Consumer

* on attend quelques secondes et on constate que l'utilisateur a bien été supprimé sur le réplicat

# La supervision
## Nagios

Nagios s'installe assez facilement pour surveiller, archiver et représenter les périodes où les machines sont en ligne, leurs services sont lancés et leurs ressources disponibles :
Il peut ainsi prévenir automatiquement par email, chaque contact associé à une machine quand l'état d'un service change (ex : processeur saturé, disque dur plein à 90 %, page web inaccessible...).

### Installation du serveur

Le paquet Ubuntu s'arrête à la version 3 :
Sinon, pour être sûr d'obtenir la dernière version, il est possible de récupérer le tarball en renseignant son nom sur le site officiel, puis de l'installer à partir de l'étape 2 en root :
Enfin, pour ajouter un service à monitorer, il suffit de modifier les fichiers .cfg.

#### Interface graphique

Le portail web (ex : http://127.0.0.1/nagios/) a pour prérequis Apache. Il s'installe comme suit :
Par défaut il est protégé par le mot de passe du compte nagiosadmin.
Par ailleurs, la page d'accueil par défaut ne montrant pas les services monitorés, il peut être rentable d'utiliser http://127.0.0.1/nagios/?corewindow=/nagios/cgi-bin/status.cgi?host=all à la place.
Le menu Map permet un affichage sous forme de carte :

#### Fichiers de configuration .cfg

Pour configurer ce que Nagios doit surveiller, on doit éditer les fichiers de configuration .cfg importés depuis /usr/local/nagios/etc/nagios.cfg (généralement tout ce qui est dans /usr/local/nagios/etc/objects/).
Que la surveillance soit opérationnelle, ces fichiers doivent comporter les quatre objets suivants (par défaut le classement est d'un type d'objet par fichier mais un .cfg peut tous les contenir) :
L'objet commande pointe sur le fichier exécutable du système d'exploitation qui sera exécuté par Nagios (en Shell, Perl, Java, Python...). Ex :
Plusieurs objets services peuvent ensuite appeler une même commande avec différents arguments (ex : SFTP du serveur 1, du serveur 2...).

##### Nagios 4

Avant de mettre à jour Nagios ou Linux, bien sauvegarder la configuration de /usr/local/nagios/etc/ (ou /etc/nagios3/) selon la version.

#### Plugins

Les plugins permettent de monitorer plus de services, ils sont téléchargeables depuis https://www.nagios.org/download/plugins :

#### Addons

Les addons ajoutent des fonctionnalités supplémentaires, comme des représentations graphiques : https://www.nagios.org/download/addons/.

##### Surveillance SFTP

* En shell.
* En Java.
* En Perl.

##### Test de formulaire HTML

* https://exchange.nagios.org/directory/Plugins/Websites,-Forms-and-Transactions/Check-form/details

### Installation d'un client

Il suffit d'installer http://www.nsclient.org/ en administrateur sur la machine à surveiller. Parfois le pare-feu doit être ouvert sur le port 5666 ou 12489.
Sur Ubuntu : apt-get install xinetd.

## Références

* ↑ https://library.nagios.com/library/products/nagioscore/manuals/
* ↑ https://www.nagios.org/download/core/
* ↑ http://doc.ubuntu-fr.org/nagios
* http://djibril.developpez.com/tutoriels/linux/nagios-pour-debutant/

## Voir aussi

* en:System Monitoring with Xymon

# Installation d'un service en mode chroot

La commande chroot permet de faire fonctionner des applications Linux dans un environnement protégé. En fonctionnant dans un "root directory" virtuel, les applications sont alors cloisonnées dans un espace qui leur est propre, évitant ainsi les éventuels méfaits commis à l'encontre du système en cas d'infraction.
chroot est un outil GNU faisant partie de GNU Core Utilities, plus précisément des shellutils.

# Protection avec iptables

Iptables est un outil permettant de paramétrer Netfilter le filtre de paquet intégré à Linux.

## Principe des tables

Netfilter utilise une liste de règles inscrites dans trois tables : INPUT, OUTPUT, FORWARD.
Le paquet arrivant est voué à:
* soit être filtré suivant les règle de la table INPUT pour être utilisé par un processus de la machine
* soit être transféré à une autre machine en respectant les règle de la table FORWARD
* soit quitter la machine dans les condition de la table OUTPUT
Le but est donc de modifier les tables en ajoutant et supprimant des règles dans les différentes tables. pour cela nous utilisons la commande iptables.

## Les actions sur les tables
### Le principe

Par défaut, iptables est composé de 3 catégories appelées "chaînes" (chain) :
* INPUT : Chaîne où l'on règle le trafic entrant.
* FORWARD : Chaîne où l'on règle le trafic qui sera redirigé.
* OUTPUT : Chaîne où l'on règle le trafic sortant.
À chaque chaîne est attribuée une "politique" (policy), les deux principales sont :
* ACCEPT : Politique d'acceptation. Par défaut, tout ce qui n'est pas dans la chaîne est accepté.
* DROP : Politique de refus. Par défaut, tout ce qui n'est pas dans la chaîne sera rejeté. (utile pour filtrer les connections entrantes)
Un exemple concret. Par défaut, si vous n'avez jamais touché à votre iptables, voici ce que vous devez avoir :
On constate ici que rien n'est sécurisé : tout entre (Chain INPUT, policy ACCEPT), tout sort (Chain OUTPUT, policy ACCEPT).

### Réglage simple

Tout d'abord, si votre iptables ne ressemble pas à l'exemple ci-dessus, ou tout simplement si vous souhaitez réinitialiser vos réglages, tapez ces commandes :
Les commandes de base :
Les règles sont lues dans un ordre précis. De la première vers la dernière. De cette manière, dans l'hypothèse où la première règle interdit une connexion alors que la suivante l'autorise, la connexion sera interdite.
* APPEND : Ajouter une règle dans une chaîne. La règle ainsi créée s'ajoute après la dernière règle.
* INSERT : Insère une règle dans une chaîne. La règle ainsi créée s'ajoute avant la première règle.
* LIST : Liste les règles existant dans toutes les chaînes.
* DELETE : Supprime une règle d'une chaîne.
* POLICY : Configure la politique d'une chaîne.
Créer une configuration de base :
Nous allons autoriser une connexion déjà établie (ESTABLISHED) à recevoir du trafic.
Autorisons maintenant le trafic sur deux ports utilisés par des services très répandus / utilisés. Bien évidemment à vous de faire le tri en fonction de ce que vous utilisez ou non.
* Trafic SSH :
* Trafic Web :
* Requêtes Ping :
* Trafic Local :
Voici ce que vous devriez avoir pour l'instant si vous listez les filtres (l'option -v permet de voir sur quelle interface la règle est appliquée) :
Comme vous pouvez le constater, la politique est une politique d'acceptation (policy ACCEPT). Donc tous les paquets entrent sans restriction. En résumé, jusque là, nos modifications n'ont servies à rien. Nous allons donc devoir modifier la politique en politique de refus (policy DROP).
La modification est effective immédiatement. À partir de maintenant, seuls les paquets TCP entrants sur les ports 80, 22 ainsi que les requêtes ICMP sont acceptés.
Ces modifications ne seront pas prises en compte au redémarrage. Il faut pour cela créer un fichier script contenant toutes les commandes précédentes.
Créez ce fichier dans le répertoire /etc/init.d/ et n'oubliez pas de le rendre exécutable (chmod 700 nom_du_fichier). Enfin, utilisez la commande update-rc.d afin que ce script soit exécuté au démarrage.

## Logs

Par défaut, les journaux d'iptables ne renseignent pas les actions effectuées par le par-feu. Pour les obtenir, il faut définir un niveau de log, par exemple :
Ensuite les opérations sont visibles dans le syslog.

## Conditions
### Adresses IP et ports en destination et en source

Pour sécuriser un serveur FTP, en n'autorisant que son adresse IP et interdisant toutes les autres à se connecter à Linux sur le port 21 :

### Limites

Pour se prémunir des attaques DDoS on peut limiter le trafic à un certain nombre de connexions par minute sur un port :

### Suivi

conntrack

## Références

* ↑ http://www.inetdoc.net/guides/iptables-tutorial/logtarget.html

# Erreurs connues

Messages d'erreurs avec solutione connue.

## E667: Fsync failed

Le fichier est corrompu pour "vim" suite à une modification, mais pas pour les autres éditeurs. En utilisant donc un pour le ravoir.

## mount.nfs: mount point /mnt/public does not exist

Lancer : mkdir /mnt/public avant le montage.

## Please install all available updates for your release before upgrading

Si ça ne suffit pas, désinstaller les paquets listés avec :

## This account is currently not available

Par exemple pour lancer un processus en tant que www-data :

## Nagios

* Les erreurs du serveur peuvent être obtenues avec tail /usr/local/nagios/var/nagios.log.
* Celles du client Windows dans C:\Program Files\NSClient++\nsclient.log (si configuré dans le nsclient.ini).

### connect to address 127.0.0.1 and port 12489: Connexion refusée

Si le pare-feu est déjà ouvert à Nagios ou au port 12489, et si C:\Program Files\NSClient++\nsc.ini autorise déjà l'IP du serveur Nagios, et que le processus nscp.exe est bien lancé, c'est peut être qu'avec Nagios 4 il faut utiliser C:\Program Files\NSClient++\nsclient.ini.
Normalement ensuite un telnet 127.0.0.1 12489 depuis le client fonctionne.

### Erreurs sur /usr/local/nagios/var/spool/checkresults

Ex :
En effet, /usr/local/nagios/var/spool/checkresults est nécessaire au lancement du processus Nagios 4, et peut être créé manuellement à cet effet :

### Error: Could not open command file '/usr/local/nagios/var/rw/nagios.cmd' for update!

Si depuis le portail web on ne peut pas planifier de maintenance à cause de cette erreur, alors que les permissions du fichier semblaient correctes, il faut modifier le fichier suivant :
Rechercher la ligne démarrant par "chown $NagiosUser:$NagiosGroup $NagiosRunFile", puis ajouter en dessous :

### Internal Server Error

Si la page d'accueil fonctionne mais pas les vues monitoring, c'est certainement que le CGI n'arrive pas à s'exécuter.
Parfois l'erreur est notée plus clairement : You don't have permission to access /cgi-bin/nagios3/status.cgi on this server.

### It appears as though you do not have permission to view information for any of the services you requested

Dans l'interface web, passer "use_authentication=1" à 0 dans cgi.cfg.

### Kernel panix

Peut se produire si la RAM est insuffisante (ex : < 512 Mo sur Ubuntu 16.04).

### Network Unreachable

Si le serveur Nagios ping une machine qui fonctionne, mais qu'elle y apparait comme injoignable, c'est à cause de la différence entre le ping IPv4 et le ping6. Il faut juste modifier le check-host-alive de command.cfg en ajoutant "-4" à la fin :

### NSClient - ERROR: Could not get data for 5 perhaps we don't collect data this far back?

Un reboot du service ne change rien, il faut redémarrer l'OS.

### NSClient - ERROR: Could not get value

Idem que ci-dessus.

### NSClient - ERROR: Failed to get PDH valuee

Idem que ci-dessus.

### NSClient - ERROR: Invalid password

Sur le client Windows, modifier dans C:\Program Files\NSClient++\NSC.ini, la ligne password=, afin qu'il corresponde à celui définit sur le serveur, dans /usr/local/nagios/etc/objects/resource.cfg à la ligne $USER4$=. Ou vice-versa.
Sinon réinstaller le client, sa version n'est peut-être plus à jour.
Si la commande suivante fonctionne depuis le serveur, c'est qu'il faut compléter commands.cfg :

### Status UNKNOWN, Status Information Utilisation:

La connexion au client Nagios fonctionne, mais le statut est flou : il faut réinstaller et reconfigurer Nagios client (problème de version avec le serveur incompatible).

### Warning: Host 'xxx' has no default contacts or contactgroups defined!

Survient dans les logs au lancement de Nagios pour avertir qu'en cas d'alerte sur la machine mentionnée, personne ne sera prévenu.
Pour y remédier, vérifier la ligne contact_groups dans template.cfg :

## Nginx
### Flusher le cache des redirections 301

Dans les .conf :

### Messages d'erreur
#### 413 Request Entity Too Large

Dans nginx.conf, augmenter la valeur :

#### Access to fetch at 'https://example.com' from origin 'http://example.fr' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values

Dans le vhost, retirer la clause suivante (car elle se retrouve en double chez le client) :

#### Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur https://example.com. Raison : le recours à plusieurs en-têtes CORS « Access-Control-Allow-Origin » n’est pas autorisé.

Si l'erreur survient sur Firefox et pas Chrome : remplacer l'étoile par les domaines d'origine.

#### closed keepalive connection

Ce n'est pas à proprement parler une erreur, mais une notification normale.

#### Connection refused

Il manque l'activation du site (ln -s /etc/nginx/sites-available/... /etc/nginx/sites-enabled).

#### directory index of "/var/www/mon_site/" is forbidden, client: 172.170.0.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"

Si le dossier est bien accessible en shell, il faut remplacer dans le vhost :
par :

#### FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream ou Nginx propose de télécharger le fichier d'index au lieu de l'exécuter

Ajouter au vhost concerné le nom de son fichier d'index (et vérifier qu'il existe et est accessible avec l'utilisateur du serveur web) :
Sinon, remplacer le fastcgi_param SCRIPT_FILENAME. Ex :
par :
Dans Symfony cela peut survenir quand on utilise le vhost de la version 4 (public/index.php) sur la 3 (web/app.php ou app_dev.php).

#### fastcgi_pass
##### connect failed (111: Connection refused) while connecting to upstream, client: 172.170.0.1, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://172.170.0.11:9000", host: "example.com"

Remplacer dans le vhost :
par :

##### host not found in upstream "php73-fpm" ou php7.3-fpm could not be resolved ou Failed at step EXEC spawning /usr/lib/php/php-fpm-socket-helper: No such file or directory

Changer le vhost concerné vers unix:/var/run/php/php7.3-fpm.sock.

##### connect to unix:/var/run/php/php7.3-fpm.sock failed (2: No such file or directory) while connecting to upstream

Généralement assorti de "502 Bad Gateway" dans le navigateur.
Installer php7.3-fpm ou changer le vhost vers fastcgi_pass php7.3-fpm:9000;.

#### File not found

Vérifier les logs Nginx, cela peut être dû à "Permission denied". Si un chmod ne résout pas le problème, recloner l'appli.
Si ça survient à chaque relance, ça vient peut-être de Git : Git/Débogage#File_mode_changed_from_100644_to_100755.

#### no resolver defined to resolve php73-fpm

Ajouter dans nginx.conf :

#### pread / pwrite "/etc/nginx/conf.d/default.conf" failed (38: Function not implemented)

Relancer Docker Desktop.

#### "ssl_stapling" ignored, issuer certificate not found

Modifier le vhost : changer de certificat ou ajouter :

#### upstream timed out (110: Connection timed out) while reading response header from upstream, upstream: "fastcgi://unix:/var/run/php/php7.3-fpm.sock"

Relancer le processus php7.3-fpm.

## Postfix
#### 421 Server Busy Error

Trouver le goulet d'étranglement avec qshape.

#### 451 4.3.0 Temporary lookup failure

Sinon, recopier le main.cf ci-dessus.

#### 454 4.7.1 Relay access denied / relaying denied

* Commenter le bridage par adresses réseaux dans /etc/postfix/main.cf :
* Sinon, vérifier que le domaine du destinataire figure bien dans /etc/postfix/main.cf :
* Sinon, dans /etc/postfix/main.cf, le paramètre virtual_mailbox_domains est vide.
* Sinon, ajouter ou modifier les lignes suivantes à /etc/postfix/main.cf :
* Sinon, recopier le main.cf ci-dessus.
Lors des tests, ne pas commenter relayhost = pendant plus d'une heure sous peine de devenir spammeur à son insu.

#### 501 5.1.7 Bad sender address syntax

Modifier l'adresse de l'expéditeur (ex : dans les options Squirrel).

#### 550 relay not permitted / Sender verify failed

Vérifier le reverse DNS.

#### 550 unknown recipient / 550 5.1.1: Recipient address rejected: User unknown in local recipient table

Le domaine ou sa boite mail n'est pas installé sur le MX.
S'il s'agit bien d'un utilisateur local, créer un alias d'une boite existante.
Sinon, si le serveur MX distant fonctionne par ailleurs, commenter dans /etc/postfix/main.cf :
Et relancer postfix.

#### Connection closed by foreign host / ou aucune commande ne répond après la connexion au SMTP

Si le serveur s'arrête immédiatement après son lancement, certaines erreurs sont visibles dans les logs. Sinon, recopier le main.cf ci-dessus.

#### dsn=4.4.1, status=deferred

Si les emails fonctionnent en local, mais pas depuis l'extérieur (avec la même adresse d'expéditeur), et qu'ils ne sont pas visibles dans
Retester en ouvrant le port SMTP du pare-feu :
Ou sinon en ouvrant tous les ports :

#### dsn=5.4.6, status=bounced (mail for mail.mondomaine.fr loops back to myself)

* Le paramètre mydestination n'est pas bien définit.
* Le domaine est inactif dans la table MySQL

#### Erreurs Dovecot
##### Error: Invalid settings in userdb

Survient quand on se connecte par exemple au webmail en root. Cette protection incite à utiliser un autre compte, la solution la plus simples est de définir un alias dans pour root dans /etc/aliases.
Si cela survient alors qu'un alias existait déjà, il suffit de relancer newaliases pour réparer.

##### Error: stat(/home/postmaster/Maildir/tmp) failed: Permission denied
#### Erreurs fetchmail

Les symptômes suivants sont liés à la même erreur fetchmail :
* POP3 : Erreur de login ou d'identification inconnue / erreur socket durant la réception
* IMAP : Connexion refusée / Échec de l'autorisation
* SMTP : The recipient server did not accept our requests to connect. Socket error
Pour déboguer, utiliser la commande :
Sinon, bien vérifier que l'utilisation et le mot de passe sont entre guillemets dans :
Et le chemin vers le programme dans :
Les retours de mails sont visibles dans :
ou :

#### Erreurs procmail
##### Mails perdus / delivered to command: procmail -a "$EXTENSION" / delivered to command: IFS=' '&&exec /usr/bin/procmail -f-||exit 75 #user

Si les logs montrent que les mails sont bien envoyés, mais restent introuvables par ailleurs, vérifier la boite système via :
Si cela commence par /var/mail/, les emails perdus sont probablement tous dans le fichiers :
Pour les router vers les boites des utilisateurs, revoir la configuration des .forward et .procmailrc ci-dessus, jusqu'à voir les nouveaux dans :

#### Unable to connect to remote host: Connection refused

ou si les logs donnent :
alors réinstaller.

#### unknown key version / dkim=temperror (no key for signature)

Lorsqu'on envoie par webmail, il faut qu'un logiciel insère automatiquement la signature DKIM dans chaque courrier sortant. C'est pourquoi il faut installer OpenDKIM.
Lorsqu'il redémarre, le syslog peut indiquer des erreurs de permissions sur la clé qu'il faut corriger :

#### warning: cannot get RSA private key from file: nomdedomaine.fr.key disabling TLS support

Ceci apparait dans mail.log quand on chiffre la clef privée avec un mot de passe. Il ne faut donc pas en mettre.

#### warning: connect #1 to subsystem private/proxymap: Connection refused

Il manque la ligne dans master.cf :

## Références

* ↑ http://alexnogard.com/error-could-not-open-command-file-usrlocalnagiosvarrwnagios-cmd-for-update/
* ↑ https://docs.nginx.com/nginx/admin-guide/content-cache/content-caching/
* ↑ http://postfix.traduc.org/
* ↑ http://unix.stackexchange.com/questions/128630/postfix-email-bounced-mail-for-domain-loops-back-to-myself
* ↑ https://sourceforge.net/projects/opendkim/files/

# Médiagraphie

A. S. Tanenbaum, « Modern Operating Systems », Prentice Hall, 951 p., 2001.
S. Pierre, « Introduction aux ordinateurs : organisation, exploitation et programmation », Télé-université, 253 p., 1996.
Ellen Siever et al., « Linux in a nutshell : a desktop quick reference », O’Reilly and Associates, 2000.
Jeffrey Dean, « LPI Linux Certification in a Nutshell: a desktop quick reference », O’Reilly and Associates, 2000.
Renaldo Garcia, “Linux – Un système d’exploitation Unix », Éditions Vermette, 2000.

# Auteurs

L'écriture de ce livre a été initié par Stéphane Gill. Les deux premiers chapitres sont basés sur les notes de cours "Système d'exploitation" de Stéphane Gill utilisées au collège Ahuntsic.
Les chapitres suivants ont été écrits par Alexandre GUY et les étudiants de la formation Administrateur Systèmes & Réseaux de l'Université de Perpignan Via Domitia (UPVD).
Merci également aux autres wikinautes qui ont participés à l'élaboration de ce wikibook en le complétant et corrigeant.