Ceci est une ancienne révision du document !


Table des matières

Version : 2023.01

Dernière mise-à-jour : 2023/06/08 11:41

Topic 1: System Architecture

Contenu du Module

  • Topic 1: System Architecture
    • Contenu du Module
    • BIOS, EFI et OpenFirmware
      • Systèmes à base du BIOS
        • Charger de Démarrage
      • Systèmes à base de l'EFI
      • Autres Systèmes
    • Gestionnaire d'amorçage
      • LILO
        • La Commande LILO
        • Codes Erreur de LILO
      • Grub Legacy sous RHEL/CentOS 6
        • Configurer GRUB Legacy
          • La Section Globale
          • Une Section spécifique à un OS
        • Configurer l'Authentification
        • Modifier la Configuration de GRUB Legacy en Ligne de Commande
      • GRUB 2 sous RHEL/CentOS 7
        • Le fichier /boot/grub/device.map
        • Le fichier /etc/default/grub
        • Les fichiers du répertoire /etc/grub.d
        • Configurer l'Authentification
          • RHEL/CentOS < 7.2
          • RHEL/CentOS >= 7.2
        • Modifier la Configuration de GRUB 2 en Ligne de Commande
      • Chargeurs de Démarrages Alternatifs
        • Systemd-boot
        • U-boot
        • Le Projet Syslinux
          • SYSLINUX
          • EXTLINUX
          • ISOLINUX
          • PXELINUX
        • Isodhpfx
    • Initramfs sous RHEL/CentOS 6
      • Examiner l'image existante
      • Le script init
      • La Commande dracut
    • Initramfs sous RHEL/CentOS 7
      • Examiner l'image existante
      • Le script init
      • Consulter le contenu d'un fichier dans initramfs
      • La Commande dracut
    • Fichiers Spéciaux
    • Commandes
      • La Commande lspci
      • La Commande lsusb
      • La Commande dmidecode
    • Répertoire /proc
      • Répertoires
        • ide/scsi
        • acpi
        • bus
        • net
        • sys
        • La Commande sysctl
      • Fichiers
        • Processeur
        • Interruptions système
        • Canaux DMA
        • Plages d'entrée/sortie
        • Périphériques
        • Modules
        • Statistiques de l'utilisation des disques
        • Partitions
        • Espaces de pagination
        • Statistiques d'utilisation du processeur
        • Statistiques d'utilisation de la mémoire
        • Version du noyau
      • Interprétation des informations dans /proc
        • Commandes
          • free
          • uptime ou w
          • iostat
          • vmstat
          • mpstat
          • sar
          • Utilisation des commandes en production
            • Identifier un système limité par le processeur
            • Identifier un système ayant un problème de mémoire
            • Identifier un système ayant un problème d'E/S
    • Modules usb
    • udev
      • La Commande udevadm
    • Système de fichiers /sys
    • Limiter les Ressources
      • ulimit
      • Groupes de Contrôle
        • LAB #1 - Travailler avec les cgroups sous RHEL/CentOS 7

BIOS, EFI et OpenFirmware

Systèmes à base du BIOS

Au démarrage d'un système à base d'un processeur x86 ou x86-64, le premier programme exécuté a été traditionnellement le BIOS. Le BIOS a pour fonction de :

  • Tester les composants et les circuits,
  • Faire appel au BIOS de la carte graphique pour initialiser le système d'affichage,
  • Détecter les périphériques de stockage,
  • Lancer le Charger de Démarrage du système d'exploitation en utilisant le bootstrap loader.

Charger de Démarrage

La première partie du Charger de Démarrage est en règle générale placé dans le MBR du disque. Le format du MBR est le suivant :

  • 446 octets pour le Charger de Démarrage,
  • 64 octets pour la table de partitions, soit 16 octets par partition décrite,
  • 2 octets ayant une valeur fixe en hexadécimale de AA55.

Systèmes à base de l'EFI

Depuis 2011, le BIOS est en train d'être remplacé par l'utilisation de l'UEFI (Unified Extensible Firmware Interface ou Interface micrologicielle extensible unifiée) issue du développement de l'EFI conçue par Intel pour les processeurs Itanium..

Sous EFI la première partie du gestionnaire de démarrage est un fichier ayant une extension .efi se trouvant dans un sous-répertoire au nom du système d'exploitation à lancer dans une partition appelée EFI System Partition ou ESP. Cette partition est normalement montée à /boot/efi sous Linux.

Pour que EFI fonctionne, le micrologiciel (firmware) d'EFI doit avoir connaissance de chaque système d'exploitation à démarrer.

A retenir : Sous Linux c'est l'application efibootmgr qui permet de créer et de supprimer des entrées ainsi que de modifier l'ordre de démarrage.

Important : L'UEFI gère parfaitement les SSD (Solid State Drives) qui utilisent le standard NVMe (Non-Volatile Memory Express). Linux supporte les SSD depuis le noyau 3.3.

Autres Systèmes

Les systèmes utilisant des processeurs autre qu'un x86 ou x86-64 utilisent un logiciel tel OpenFirmware.

Gestionnaires de Démarrage

Des gestionnaires d'amorçage sous Linux, un se distingue comme étant le plus utilisé :

  • GRUB (Grand Unified Boot Loader)

Cependant il en existe d'autres :

  • LILO (LInux LOader)
  • SysLinux
  • LoadLin

LILO

LILO (LInux LOader) est configuré par le fichier /etc/lilo.conf.

La Commande LILO

La commande lilo peut prendre une de plusieurs options. Les options les plus importantes sont :

Option Description
-M Permet d'écrire sur le MBR
-d Permet de réduire ou augmenter le temps d'attente avant le lancement du noyau par défaut
-D Permet de sélectionner un noyau par défaut en indiquant son label
-u Permet de désinstaller LILO
-v Permet d'activer le mode verbose
-m Permet de modifier le fichier map par défaut (/boot/map)
-i Permet de spécifier un nouveau fichier à utiliser comme secteur de boot (/boot/boot.b)
-C Permet de modifier le fichier de configuration par défaut
-q Permet de créer le fichier /boot/map qui contient l'emplacement des noyaux qui peuvent être booter

Codes Erreur de LILO

Lors du démarrage, LILO permet d'identifier les éventuelles erreurs :

Affichage Erreur
(rien) Aucun morceau de LILO n'a été chargé. Soit LILO n'est pas installé, soit la partition sur laquelle son secteur d'amorce se trouve n'est pas active.
L Le premier morceau du chargeur d'amorce a été chargé et démarré, mais il ne peut charger le second morceau. Les codes d'erreur à deux chiffres indiquent le type de problème. (Voir également la section “Codes d'erreur disque”.) Ce cas indique en général une panne de périphérique ou une incohérence de géométrie (c'est à dire de mauvais paramètres disques).
LI Le premier morceau du chargeur d'amorce a pu charger le second morceau, mais n'a pas réussi à l'exécuter. Cela peut être causé par une incohérence de géométrie ou par le déplacement de /boot/boot.b sans lancer l'installateur de carte.
LIL Le second morceau du chargeur d'amorce a été démarré, mais il ne trouve pas la table de descripteurs dans le fichier carte. C'est en général dû à une panne de périphérique ou une incohérence de géométrie.
LIL? Le second morceau du chargeur d'amorce a été chargé à un adresse incorrecte. C'est en général causé par une subtile incohérence de géométrie, ou par le déplacement de /boot/boot.b sans lancer l'installateur de carte.
LIL- La table de descripteurs est corrompue. Cela peut être dû à une incohérence de géométrie ou au déplacement de /boot/map sans lancer l'installeur.
LILO Tous les éléments de LILO ont été correctement chargés.

Si le BIOS signale une erreur lorsque LILO essaye de charger une image d'amorce, le code d'erreur correspondant est affiché. Ces codes vont de 0x00 à 0xbb. Reportez-vous au Guide Utilisateur de LILO pour leur explication.

Important : LILO ne gère pas les systèmes UEFI.

Grub Legacy sous RHEL/CentOS 6

A retenir : Grub Legacy a été créé en 1999.

Dans le cas où le Charger de Démarrage grub n'est pas installé, il convient de saisir la commande suivante :

# grub-install /dev/sda [Entrée]

sda est le nom du périphérique ou grub doit s'installer dans le MBR. Notez cependant que le MBR a une taille trop petite pour contenir tout le Charger de Démarrage. Pour cette raison, le gestionnaire est divisé en deux. Le gestionnaire de niveau 1 est stocké dans le MBR et indique où se trouve le gestionnaire de niveau 2, c'est-à-dire le répertoire /boot.

Il est aussi possible d'utiliser la commande :

# grub-install '(hd0)' [Entrée]

hd0 indique à grub le premier disque.

Il est à noter que la première partie du Charger de Démarrage peut également être installé dans un PBR (Partition Boot Record) dans le cas d'un système dual-boot voire multi-boot au quel cas on parle de chainloading :

# grub-install /dev/sda1 [Entrée]

ou :

# grub-install 'hd(0,0)' [Entrée]

(0,0) est la nomenclature grub pour la première partition du premier disque.

Le gestionnaire de niveau 1 a pour seul but le lancement du gestionnaire de niveau 2. Le gestionnaire de niveau 2 charge le noyau en mémoire, monte l'image initrd et charge les modules nécessaires pendant que le noyau monte la partition racine / en lecture seule.

Pour désinstaller grub du MBR, utilisez une disquette DOS pour démarrer la machine puis taper la commande suivante au prompt :

A> fdisk /mbr [Entrée]

Configurer GRUB Legacy

grub se configure grâce au fichier /boot/grub/menu.lst. Pour visualiser ce fichier, il convient de saisir la commande suivante :

[root@centos6 ~]# cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS Linux (2.6.32-71.29.1.el6.i686)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-71.29.1.el6.i686 ro root=UUID=e73735d6-c14b-4a40-8735-f34fc868da8a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=fr-latin9 crashkernel=auto rhgb quiet
	initrd /initramfs-2.6.32-71.29.1.el6.i686.img 
title centos (2.6.32-71.el6.i686)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-71.el6.i686 ro root=UUID=e73735d6-c14b-4a40-8735-f34fc868da8a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=fr-latin9 crashkernel=auto rhgb quiet
	initrd /initramfs-2.6.32-71.el6.i686.img

Important : Sous les distributions dérivées de Red Hat, par exemple Fedora, le fichier menu.lst s'appelle grub.conf.

Ce fichier comporte plusieurs sections :

* la section des **paramètres globaux**,
* une ou plusieurs sections pour chaque système d'opération installé sur la machine.
La Section Globale
Paramètre Explication
default=0 Ce paramètre désigne le numéro de l'entrée à charger par défaut. La valeur de 0 indique la première section commençant par le mot clef title
timeout=5 Ce paramètre indique le délai en secondes après lequel l'entrée par défaut sera chargée.
splashimage=(hd0,0)/grub/splash.xpm.gz Ce paramètre indique l'emplacement de l'image de fond du menu de GRUB Legacy
hiddenmenu Ce paramètre cache le menu de GRUB Legacy pendant le chargement de l'entrée par défaut, sauf si l'utilisateur appuie sur une touche
color Ce paramètre prend la forme de deux pairs de couleurs. Le premier, par exemple white/blue, définit les couleurs de l'avant-plan et de l'arrière-plan des entrées normales du menu, tandis que le deuxième, par exemple yellow/blue définit les couleurs de l'avant-plan et de l'arrière-plan des entrées sélectionnées du menu
password=motdepasse Cette option n'est présente que dans le cas où un mot de passe a été spécifié pour protéger GRUB Legacy
Une Section spécifique à un OS
Paramètre Explication
title CentOS Linux (2.6.32-71.29.1.el6.i686) Ce paramètre indique le début d'une section de configuration d'une entrée pour un système d'exploitation ainsi que le nom qui apparaît dans le menu de GRUB Legacy
root (hd0,0) Ce paramètre indique la partition contenant le noyau de Linux. Dans l'exemple hd0,0 indique la première partition du premier disque dur. Cette partition est ensuite montée en tant que /boot.
kernel /vmlinuz-2.6.32-71.29.1.el6.i686 Ce paramètre indique le nom du noyau à charger pour démarrer la machine. Son chemin est relatif à la partition de démarrage (hd0,0). Certaines options peuvent être passées au noyau en les spécifiant en tant qu'arguments telles rhgb ou Red Hat Graphical Boot et quiet qui supprime les messages de démarrage qui apparaissent avant le lancement de l'animation graphique activée par l'option rhgb
initrd Ce paramètre stipule l'emplacement du disque initial chargé en mémoire lors du démarrage. Son chemin est relatif à la partition de démarrage (hd0,0).
lock
rootnoverify (hd0,1) Ce paramètre indique une section concernant un système d'exploitation non Linux, tel que Windows™

Configurer l'Authentification

Grub Legacy peut être protéger par un mot de passe en incluant la directive suivante dans le fichier /boot/grub/menu.lst :

password --md5 <mot de passe>

Le mot de passe doit être chiffré avec MD5 :

[root@centos6 ~]# grub-md5-crypt
Password: 
Retype password: 
$1$VLOzG$ibdk0my4IHny/XtNIGRhv1

Editez ensuite le fichier /boot/grub/menu.lst :

[root@centos6 ~]# cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
password --md5 $1$VLOzG$ibdk0my4IHny/XtNIGRhv1
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-504.1.3.el6.i686)
	lock
	root (hd0,0)
	kernel /vmlinuz-2.6.32-504.1.3.el6.i686 ro root=UUID=b9f29672-c84e-4d3b-b132-189758a084eb rd_NO_LUKS rd_NO_MD LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=fr-latin9 rd_NO_LVM rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-504.1.3.el6.i686.img
title CentOS (2.6.32-358.18.1.el6.i686)
	lock
	root (hd0,0)
	kernel /vmlinuz-2.6.32-358.18.1.el6.i686 ro root=UUID=b9f29672-c84e-4d3b-b132-189758a084eb rd_NO_LUKS rd_NO_MD LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=fr-latin9 rd_NO_LVM rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-358.18.1.el6.i686.img
title CentOS (2.6.32-358.6.1.el6.i686)
	lock
	root (hd0,0)
	kernel /vmlinuz-2.6.32-358.6.1.el6.i686 ro root=UUID=b9f29672-c84e-4d3b-b132-189758a084eb rd_NO_LUKS rd_NO_MD LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=fr-latin9 rd_NO_LVM rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-358.6.1.el6.i686.img
title CentOS (2.6.32-279.el6.i686)
	lock
	root (hd0,0)
	kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9f29672-c84e-4d3b-b132-189758a084eb rd_NO_LUKS rd_NO_MD LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=fr-latin9 rd_NO_LVM rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-279.el6.i686.img

Important : Notez l'addition de la ligne password –md5 $1$VLOzG$ibdk0my4IHny/XtNIGRhv1 ainsi que le mot clef lock sur une ligne située après chaque ligne commençant par title.

Modifier la Configuration de GRUB Legacy en Ligne de Commande

Lors du démarrage de GRUB Legacy, il est possible de voir son menu en appuyant sur n'importe quelle touche. Si GRUB Legacy a été protégé par un mot de passe, il convient d'appuyer sur la touche p puis de rentrer le mot de passe. A ce stade il est possible d'utiliser deux autres touches :

  • la touche e pour accéder à l'éditeur de l'interface,
  • la touche c pour accéder à la ligne de commande.

En mode édition notez l'utilisation des touches suivantes :

  • e : éditer une ligne,
  • d : supprimer une ligne,
  • o : ajouter une ligne après la ligne courante,
  • O : ajouter une ligne avant la ligne courante,
  • b : démarrer avec la configuration modifiée,
  • echap : abandonner les modifications et retourner à l'interface de GRUB.

GRUB 2 sous RHEL/CentOS 7

GRUB 2 est une ré-écriture complète de GRUB Legacy. Il apporte des améliorations, notamment GRUB 2 sait utiliser des partitions RAID et LVM.

Le lancement de GRUB 2 se fait en trois étapes :

  • Etape 1 : Le boot.img, stocké dans les 512 premiers octets du secteur 0 avec la table des partitions, est lancé. Son seul but est de lancer l'étape 1.5,
  • Etape 1.5 : Le core.img, d'une taille approximative de 25 Ko et stocké dans les secteurs 1 à 62, est lance. Son travail est de charger des pilotes qui supportent de multiples systèmes de fichiers puis de lancer l'étape 2 dans un des systèmes de fichiers,
  • Etape 2 : Contenu dans le répertoire /boot/grub2/, il lance le menu pour que l'utilisateur puisse choisir les système d'exploitation à lancer.

Dans le cas où le Charger de Démarrage GRUB 2 n'est pas installé, il convient de saisir la commande suivante :

# grub2-install /dev/périphérique [Entrée]

périphérique est le nom du périphérique ou l'étape 1 de GRUB2 doit s'installer dans le MBR.

GRUB 2 lit ses entrées de menus à partir du fichier /boot/grub2/grub.cfg. Pour visualiser ce fichier, il convient de saisir la commande suivante :

[root@centos7 ~]# cat /boot/grub2/grub.cfg 
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-229.4.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-b35de665-5ec8-4226-a533-58a1b567ac91' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8d3bd48-1386-411c-9675-41c3f8f1a309
	else
	  search --no-floppy --fs-uuid --set=root e8d3bd48-1386-411c-9675-41c3f8f1a309
	fi
	linux16 /vmlinuz-3.10.0-229.4.2.el7.x86_64 root=UUID=b35de665-5ec8-4226-a533-58a1b567ac91 ro vconsole.keymap=fr crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8
	initrd16 /initramfs-3.10.0-229.4.2.el7.x86_64.img
}
menuentry 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-b35de665-5ec8-4226-a533-58a1b567ac91' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8d3bd48-1386-411c-9675-41c3f8f1a309
	else
	  search --no-floppy --fs-uuid --set=root e8d3bd48-1386-411c-9675-41c3f8f1a309
	fi
	linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=b35de665-5ec8-4226-a533-58a1b567ac91 ro vconsole.keymap=fr crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8
	initrd16 /initramfs-3.10.0-123.el7.x86_64.img
}
menuentry 'CentOS Linux, with Linux 0-rescue-a2feb9eb09b1488da0f23b99a66350f8' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-a2feb9eb09b1488da0f23b99a66350f8-advanced-b35de665-5ec8-4226-a533-58a1b567ac91' {
	load_video
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8d3bd48-1386-411c-9675-41c3f8f1a309
	else
	  search --no-floppy --fs-uuid --set=root e8d3bd48-1386-411c-9675-41c3f8f1a309
	fi
	linux16 /vmlinuz-0-rescue-a2feb9eb09b1488da0f23b99a66350f8 root=UUID=b35de665-5ec8-4226-a533-58a1b567ac91 ro vconsole.keymap=fr crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet
	initrd16 /initramfs-0-rescue-a2feb9eb09b1488da0f23b99a66350f8.img
}
if [ "x$default" = 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' ]; then default='Advanced options for CentOS Linux>CentOS Linux, with Linux 3.10.0-123.el7.x86_64'; fi;
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Prenons le cas des paramètres de Grub Legacy et comparons-les aux paramètres de GRUB 2 :

Grub Legacy GRUB 2
title Menuentry
root (hd0,0) set root=hd(0,1). Notez que GRUB 2 commence toujours la numérotation des disques à 0 mais numérote les partitions à partir de 1
kernel linux
initrd initrd
lock Ce paramètre n'existe plus sous GRUB 2.
rootnoverify (hd0,1) Ce paramètre n'existe plus sous GRUB 2. Les paramètres des systèmes d'exploitation non Linux sont définit avec le paramètre root

Notez que ce fichier ne doit pas être modifié manuellement. En effet, il est généré par la commande grub2-mkconfig sous RHEL/CentOS 7. La commande grub2-mkconfig prend en argument l'emplacement du fichier destination, par exemple :

  • grub2-mkconfig -o /boot/grub2/grub.cfg, ou
  • grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

Lors de l'exécution de la commande grub2-mkconfig plusieurs fichiers sont lus :

Le fichier /boot/grub2/device.map

[root@centos7 ~]# cat /boot/grub2/device.map
# this device map was generated by anaconda
(hd0)      /dev/sda
(hd1)      /dev/sda

Le fichier /etc/default/grub

Ce fichier contient la configuration par défaut des paramètres de GRUB 2 :

[root@centos7 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=fr crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Important : Notez que toute modification de ce fichier nécessite l'exécution de la commande grub2-mkconfig sous RHEL/CentOS 7 pour que les modifications soient prises en compte.

Dans ce fichier les directives sont :

Directive Description
GRUB_DEFAULT Entrée du menu sélectionner par défaut
GRUB_TIMEOUT Durée de l'affichage du menu avant le démarrage en utilisant la valeur de GRUB_DEFAULT
GRUB_DISTRIBUTOR Ligne de commande qui génère le texte de l'entrée
GRUB_CMDLINE_LINUX_DEFAULT Paramètres passés au noyau lors d'un démarrage normal (Hors donc le mode secours)
GRUB_CMDLINE_LINUX Paramètres passés au noyau peu importe le type de démarrage
GRUB_TERMINAL Si non commentée, cette directive désactive le démarrage graphique
GRUB_GFXMODE Indique la résolution utilisée lors d'un démarrage graphique
GRUB_DISABLE_LINUX_UUID Si true, cette directive empêche l'utilisation de l'UUID de la partition
GRUB_DISABLE_LINUX_RECOVERY Si true, cette directive empêche la génération des entrées en mode recovery
GRUB_INIT_TUNE Permet d'obtenir un beep au démarrage de GRUB 2
GRUB_BADRAM Permet de spécifier de la mémoire défaillante

Les fichiers du répertoire /etc/grub.d

Les fichiers de ce répertoire sont exécutés dans l'ordre alphanumérique et servent à construire les menus de GRUB 2 :

[root@centos7 ~]# ls -l /etc/grub.d
total 68
-rwxr-xr-x. 1 root root  8702 Mar 26 09:27 00_header
-rwxr-xr-x. 1 root root   992 Oct 17  2014 00_tuned
-rwxr-xr-x. 1 root root 10114 Mar 26 09:27 10_linux
-rwxr-xr-x. 1 root root 10275 Mar 26 09:27 20_linux_xen
-rwxr-xr-x. 1 root root  2559 Mar 26 09:27 20_ppc_terminfo
-rwxr-xr-x. 1 root root 11169 Mar 26 09:27 30_os-prober
-rwxr-xr-x. 1 root root   214 Mar 26 09:27 40_custom
-rwxr-xr-x. 1 root root   216 Mar 26 09:27 41_custom
-rw-r--r--. 1 root root   483 Mar 26 09:27 README
  • Le fichier /etc/grub.d/10_Linux,
    • Le fichier 10_Linux contient des boucles pour rechercher des noyaux Linux,
  • Le fichier /etc/grub.d/30_os-prober,
    • Ce fichier recherche des éventuels systèmes d'exploitation autre que Linux,
  • Les fichiers /etc/grub.d/40_custom et /etc/grub.d/41_custom,
    • Ces deux fichiers sont fournis en tant que modèles à personnaliser.

Configurer l'Authentification

RHEL/CentOS < 7.2

Pour configurer l'authentification sous GRUB 2, il faut créer le fichier /etc/grub.d/01_users :

[root@centos7 ~]# touch /etc/grub.d/01_users 
[root@centos7 ~]# chmod 755 /etc/grub.d/01_users 

Créez deux mots de passe hashés au format PBKDF2 en utilisant la commande grub2-mkpasswd-pbkdf2 sous RHEL/CentOS :

[root@centos7 ~]# grub2-mkpasswd-pbkdf2
Enter password: pass123
Reenter password: pass123
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.0298C1C613A451C46FBC95BB2AC7A41BCEC1C61512EF785BD81E3B65DFF9D57ED4ADF8906C3EF33C22C06FBDD366E1C118FC41110BD646A4D49EF86EFD0573BF.E14A45900096D773BE99BEA9AB8D4FA81431458952798B997D4FC9E0850426F6798979371B8EBD331DB33AE8FEAE25E6773156D42F21B884DBA405546782B3BD

Editez le fichier /etc/grub.d/01_users ainsi :

/etc/grub.d/01_users
#!/bin/sh -e
cat <<EOF
set superusers="root"
password_pbkdf2 root
grub.pbkdf2.sha512.10000.0298C1C613A451C46FBC95BB2AC7A41BCEC1C61512EF785BD81E3B65DFF9D57ED4ADF8906C3EF33C22C06FBDD366E1C118FC41110BD646A4D49EF86EFD0573BF.E14A45900096D773BE99BEA9AB8D4FA81431458952798B997D4FC9E0850426F6798979371B8EBD331DB33AE8FEAE25E6773156D42F21B884DBA405546782B3BD
EOF

Il est aussi possible d'utiliser des mots de passe non cryptés. Modifiez donc le fichier /etc/grub.d/01_users ainsi :

/etc/grub.d/01_users
#!/bin/sh -e
cat <<EOF
set superusers="root"
password root pass123
EOF

Sous RHEL/CentOS, lancez la commande grub2-mkconfig -o /boot/grub2/grub.cfg :

[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.4.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.4.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-a2feb9eb09b1488da0f23b99a66350f8
Found initrd image: /boot/initramfs-0-rescue-a2feb9eb09b1488da0f23b99a66350f8.img
done

A faire : Redémarrez votre VM. Constatez que GRUB 2 demande un nom d'utilisateur ainsi qu'un mot de passe. Attention, le clavier est en QWERTY ( pass123 = pqss&é“ ).

RHEL/CentOS >= 7.2

Depuis la version 7.2 de RHEL/centOS le fichier /etc/grub.d/01_users existe déjà :

[root@centos7 ~]# cat /etc/grub.d/01_users 
#!/bin/sh -e
cat << EOF
if [ -f \${prefix}/user.cfg ]; then
  source \${prefix}/user.cfg
  if [ -n "\${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root \${GRUB2_PASSWORD}
  fi
fi
EOF

Ce script est évidement présent dans le fichier grub.cfg :

### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n ${GRUB2_PASSWORD} ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### END /etc/grub.d/01_users ###

Ce script :

  • teste si le fichier /boot/grub2/user.cfg existe puis si c'est le cas,
  • teste si la variable $GRUB2_PASSWORD est fixée puis si c'est le cas,
  • assigne le mot de passe à root.

Pour créer le contenu du fichier /boot/grub2/user.cfg, il convient d'utiliser la commande grub2-setpassword :

[root@centos7 ~]# grub2-setpassword
Enter password: pass123
Confirm password: pass123

Consultez maintenant le fichier /boot/grub2/user.cfg :

[root@centos7 ~]# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.3DD268A626FC781A0693D381A5F1BBDE6C834D1D904F023AED8CEF2985304FEC9F0C1C8B975156F5DF534F4B10BCCDC5C187B0C12F55E970A244D9EF2EF962DD.9BB2011598B8E5EFD9A464ED96C0FECB8DCD8FD6942E5114E035AD8A9E2DCFF32A9DC1C222B4226A462B32E7B6D80247F96D79133F18F6524544984837EF4D06

A faire : Redémarrez votre VM. Appuyez sur la touche e au début du processus de démarrage. Constatez que GRUB 2 demande un nom d'utilisateur ainsi qu'un mot de passe. Attention, le clavier est en QWERTY ( pass123 = pqss&é“ ). Notez qu'à ce stade le mot de passe ne protège que l'édition des entrées de GRUB2.

Pour pouvoir protéger le démarrage du système, il convient d'éditer le fichier grub.cfg en supprimant la directive –unrestricted de la ligne menuentry :

[root@centos7 ~]# cat /boot/grub2/grub.cfg
...
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.21.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-e65fe7da-cda8-4f5a-a827-1b5cabe94bed' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  2d947276-66e8-41f4-8475-b64b67d7a249
        else
          search --no-floppy --fs-uuid --set=root 2d947276-66e8-41f4-8475-b64b67d7a249
        fi
        linux16 /vmlinuz-3.10.0-693.21.1.el7.x86_64 root=UUID=e65fe7da-cda8-4f5a-a827-1b5cabe94bed ro rhgb quiet LANG=en_GB.UTF-8
        initrd16 /initramfs-3.10.0-693.21.1.el7.x86_64.img
}
...
[root@centos7 ~]# vi /boot/grub2/grub.cfg
...
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.21.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-e65fe7da-cda8-4f5a-a827-1b5cabe94bed' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  2d947276-66e8-41f4-8475-b64b67d7a249
        else
          search --no-floppy --fs-uuid --set=root 2d947276-66e8-41f4-8475-b64b67d7a249
        fi
        linux16 /vmlinuz-3.10.0-693.21.1.el7.x86_64 root=UUID=e65fe7da-cda8-4f5a-a827-1b5cabe94bed ro rhgb quiet LANG=en_GB.UTF-8
        initrd16 /initramfs-3.10.0-693.21.1.el7.x86_64.img
}
...

A faire : Redémarrez votre VM. Constatez que GRUB 2 demande un nom d'utilisateur ainsi qu'un mot de passe. Attention, le clavier est en QWERTY ( pass123 = pqss&é“ ). Notez que cette modification n'est pas permenante.

Modifier la Configuration de GRUB 2 en Ligne de Commande

Lors du démarrage de GRUB 2, trois actions sont possibles à partir du menu :

  • Lancer un système d'exploitation en le sélectionnant avec les flèches puis en appuyant sur la touche ↵ Entrée,
  • Lancer l'éditeur en appuyant sur la touche e,
  • Lancer l’interface de la ligne de commande GRUB en appuyant sur la touche c.

En mode édition notez l'utilisation des touches suivantes :

  • flèches : se déplacer dans l'écran. L'édition se fait en utilisant simplement les touches du clavier,
  • Crtl-X : démarrer avec la configuration modifiée,
  • echap : abandonner les modifications et retourner à l'interface menu de GRUB 2.

Important : Certaines distributions, telle qu'Ubuntu, cache le menu de GRUB 2 derrière une interface graphique. Afin de voir ce menu, il convient d'appuyer sur la touche Shift pendant que la machine démarre.

Chargeurs de Démarrages Alternatifs

Systemd-boot

Un Chargeur de Démarrage étroitement lié à Systemd ( voir plus bas ), celui-ci connaît actuellement un gain de popularité.

U-boot

Un Chargeur de Démarrage qui peut booter n'importe quelle image à partir de n'importe quel support.

Le Projet Syslinux

SYSLINUX

Un Chargeur de Démarrage pour les systèmes qui utilisent le système de fichier FAT. Par exemple le systèmes sur clefs USB.

EXTLINUX

Un Chargeur de Démarrage de petite taille qui sait booter des systèmes de fichier, EXT2, EXT3, EXT4 et BRTFS.

ISOLINUX

Un Chargeur de Démarrage pour booter des LiveCD et LiveDVD. Dans le cas d'ISOLINUX, deux fichiers sont necéssaires :

  • isolinux.bin qui contient l'image du Chargeur de Démarrage et
  • isolinux.cfg qui contient les paramètres de configuration.
PXELINUX

Un Chargeur de Démarrage pour booter à partir d'un serveur réseau. Ce système utilise le standard PXE (Pre-boot Execution Environment) qui utilise :

  • DHCP pour attribuer une adresse IP à la machine et
  • BOOTP pour charger l'image du Chargeur de Démarrage à partir du serveur en utilisant le protocol TFTP (Trivial File Transfer Protocol). L'image à télécharger doit s'appeler /tftpboot/pxelinux.0 et chaque machine doit avoir un fichier de configuration dans le répertoire /tftpboot/pxelinux.cfg/

Isodhpfx

Un Chargeur de Démarrage hybride, appelé isodhpfx.bin, qui peut être chargé sur un disque ou une clef USB. Le fichier isodhpfx.bin est créé avec le programme xorriso.

Initramfs sous RHEL/CentOS 6

Un fichier Initramfs INITial Ram File System est une image d'un système minimal initialisée au démarrage du système.

Ce fichier utilise le système de fichier cramFS qui est un système de fichier compressé au format gzip et archivé via cpio.

L'image est chargée en mémoire vive et permet ainsi d'avoir un système minimal pouvant ensuite charger le système de fichier principal.

Examiner l'image existante

Pour examiner une image initramfs, il convient d'abord de la copier vers /tmp et de la décompresser :

[root@centos6 ~]# cp /boot/initramfs-2.6.32-71.29.1.el6.i686.img /tmp/custom.gz
[root@centos6 ~]# gunzip /tmp/custom.gz 

Ensuite il convient d'extraire l'image grâce à la commande cpio :

[root@centos6 ~]# cd /tmp
[root@centos6 tmp]# mkdir initrd
[root@centos6 tmp]# cd initrd
[root@centos6 initrd]# cpio -cid -I ../custom
59631 blocs

Installez maintenant le paquet tree :

[root@centos6 initrd]# yum install tree

Utilisez maintenant la commande tree pour examiner le contenu de l'image :

[root@centos6 initrd]# tree | more
.
├── bin
│   ├── basename
│   ├── cat
│   ├── cp
│   ├── dash
│   ├── dd
│   ├── dmesg
│   ├── grep
│   ├── gzip
│   ├── ln
│   ├── loadkeys
│   ├── ls
│   ├── mkdir
│   ├── mknod
│   ├── mount
│   ├── mv
│   ├── plymouth
│   ├── plymouthd
│   ├── readlink
│   ├── rm
│   ├── sed
│   ├── setfont
│   ├── sh -> dash
│   ├── sleep
│   ├── umount
│   └── uname
├── cmdline
--Plus--

Comme vous pouvez le constater, l'image contient une arborescence Linux minimaliste :

[root@centos6 initrd]# ls
bin      dev                    emergency  init       initqueue-finished  lib    pre-pivot    pre-udev  sbin  sysroot  usr
cmdline  dracut-004-33.2.el6_0  etc        initqueue  initqueue-settled   mount  pre-trigger  proc      sys   tmp      var

A faire : Utilisez le manuel de la commande cpio pour comprendre les options utilisées.

Le script init

Le script init est lancé lors du chargement de l'image :

[root@centos6 initrd]# more init
#!/bin/sh
#
# Licensed under the GPLv2
#
# Copyright 2008-2009, Red Hat, Inc.
# Harald Hoyer <harald@redhat.com>
# Jeremy Katz <katzj@redhat.com>

wait_for_loginit()
{
    if getarg rdinitdebug; then
	set +x
	exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
	# wait for loginit
	i=0
	while [ $i -lt 10 ]; do 
	    j=$(jobs)
	    [ -z "$j" ] && break
	    [ -z "${j##*Running*}" ] || break
	    sleep 0.1
	    i=$(($i+1))
	done	
	[ $i -eq 10 ] && kill %1 >/dev/null 2>&1

        while pidof -x /sbin/loginit >/dev/null 2>&1; do
            for pid in $(pidof -x /sbin/loginit); do
                kill $HARD $pid >/dev/null 2>&1
            done
--Plus--(8%)

A faire : Passez en revue le contenu du script.

La Commande dracut

La commande dracut permet de créer facilement une image initramfs. Les options de la commande sont :

[root@centos6 initrd]# dracut --help
Usage: /sbin/dracut [OPTION]... <initramfs> <kernel-version>
Creates initial ramdisk images for preloading modules

  -f, --force           Overwrite existing initramfs file.
  -m, --modules [LIST]  Specify a space-separated list of dracut modules to
                         call when building the initramfs. Modules are located
                         in /usr/share/dracut/modules.d.
  -o, --omit [LIST]     Omit a space-separated list of dracut modules.
  -a, --add [LIST]      Add a space-separated list of dracut modules.
  -d, --drivers [LIST]  Specify a space-separated list of kernel modules to
                        exclusively include in the initramfs.
  --add-drivers [LIST]  Specify a space-separated list of kernel 
                        modules to add to the initramfs.
  --filesystems [LIST]  Specify a space-separated list of kernel filesystem
                        modules to exclusively include in the generic
                        initramfs.
  -k, --kmoddir [DIR]   Specify the directory, where to look for kernel 
                        modules
  --fwdir [DIR]         Specify additional directories, where to look for 
                        firmwares, separated by :
  --kernel-only         Only install kernel drivers and firmware files
  --no-kernel           Do not install kernel drivers and firmware files
  --strip               Strip binaries in the initramfs
  --nostrip             Do not strip binaries in the initramfs (default)
  --mdadmconf           Include local /etc/mdadm.conf
  --nomdadmconf         Do not include local /etc/mdadm.conf
  --lvmconf             Include local /etc/lvm/lvm.conf
  --nolvmconf             Do not include local /etc/lvm/lvm.conf
  -h, --help            This message
  --debug               Output debug information of the build process
  -v, --verbose         Verbose output during the build process
  -c, --conf [FILE]     Specify configuration file to use.
                         Default: /etc/dracut.conf
  -l, --local           Local mode. Use modules from the current working
                         directory instead of the system-wide installed in
                         /usr/share/dracut/modules.d.
                         Useful when running dracut from a git checkout.
  -H, --hostonly          Host-Only mode: Install only what is needed for
                         booting the local host instead of a generic host.
  -i, --include [SOURCE] [TARGET]
                        Include the files in the SOURCE directory into the
                         Target directory in the final initramfs.
  -I, --install [LIST]  Install the space separated list of files into the
                         initramfs.

Le fichier de configuration de dracut est /etc/dracut.conf :

[root@centos6 initrd]# cat /etc/dracut.conf
# Sample dracut config file

# Specific list of dracut modules to use
#dracutmodules+=""

# Dracut modules to omit
#omit_dracutmodules+=""

# Dracut modules to add to the default
#add_dracutmodules+=""

# additional kernel modules to the default
add_drivers+=""

# list of kernel filesystem modules to be included in the generic initramfs
#filesystems+=""

# build initrd only to boot current hardware
#hostonly="yes"
#

# install local /etc/mdadm.conf
mdadmconf="yes"

# install local /etc/lvm/lvm.conf
lvmconf="yes"

Exécutez maintenant la commande suivante afin de générer le fichier initramfs :

# dracut -v initramfs [Entrée]

Notez la présence de votre nouvelle image /tmp/initrd/initramfs.

Déplacez votre fichier initramfs au répertoire /boot :

[root@centos6 initrd]# mv initramfs /boot

Editez maintenant votre fichier /boot/grub/menu.lst et ajoutez une nouvelle section qui utilise votre initramfs.

...
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS Linux (initramfs)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-71.29.1.el6.i686 ro root=UUID=e73735d6-c14b-4a40-8735-f34fc868da8a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=fr-latin9 crashkernel=auto rhgb quiet
	initrd /initramfs
title CentOS Linux (2.6.32-71.29.1.el6.i686)
...

A faire : Re-démarrez votre machine pour tester votre configuration.

Initramfs sous RHEL/CentOS 7

Le fichier Initramfs INITial Ram File System est une archive au format cpio compressé :

[root@centos7 ~]# cp /boot/initramfs-3.10.0-514.16.1.el7.x86_64.img /tmp/custom
[root@centos7 ~]# cd /tmp
[root@centos7 tmp]# ls
custom  systemd-private-be6ac69163a0437aa9a0b0cb2f8514e6-chronyd.service-rOpG2C  systemd-private-be6ac69163a0437aa9a0b0cb2f8514e6-cups.service-yzrHum
[root@centos7 tmp]# mv custom custom.gz
[root@centos7 tmp]# gunzip custom.gz 
[root@centos7 tmp]# mkdir initramfs
[root@centos7 tmp]# cd initramfs
[root@centos7 initramfs]# cpio -cid -I ../custom
113591 blocks
[root@centos7 initramfs]# ls
bin  dev  etc  init  lib  lib64  proc  root  run  sbin  shutdown  sys  sysroot  tmp  usr  var
[root@centos7 initramfs]# ls -l
total 4
lrwxrwxrwx.  1 root root    7 Dec  4 11:00 bin -> usr/bin
drwxr-xr-x.  2 root root  100 Dec  4 11:00 dev
drwxr-xr-x. 11 root root  520 Dec  4 11:00 etc
lrwxrwxrwx.  1 root root   23 Dec  4 11:00 init -> usr/lib/systemd/systemd
lrwxrwxrwx.  1 root root    7 Dec  4 11:00 lib -> usr/lib
lrwxrwxrwx.  1 root root    9 Dec  4 11:00 lib64 -> usr/lib64
drwxr-xr-x.  2 root root   40 Dec  4 11:00 proc
drwxr-xr-x.  2 root root   40 Dec  4 11:00 root
drwxr-xr-x.  2 root root   40 Dec  4 11:00 run
lrwxrwxrwx.  1 root root    8 Dec  4 11:00 sbin -> usr/sbin
-rwxr-xr-x.  1 root root 3117 Dec  4 11:00 shutdown
drwxr-xr-x.  2 root root   40 Dec  4 11:00 sys
drwxr-xr-x.  2 root root   40 Dec  4 11:00 sysroot
drwxr-xr-x.  2 root root   40 Dec  4 11:00 tmp
drwxr-xr-x.  7 root root  140 Dec  4 11:00 usr
drwxr-xr-x.  2 root root   80 Dec  4 11:00 var

Examiner l'image existante

Pour examiner une image initramfs archivée, il convient d'utiliser la commande lsinitrd :

[root@centos7 initramfs]# cd ..
[root@centos7 tmp]# lsinitrd custom | more
Image: custom: 56M
========================================================================
Version: dracut-033-502.el7_4.1

Arguments: -f

dracut modules:
bash
nss-softokn
i18n
network
ifcfg
drm
plymouth
kernel-modules
qemu
resume
rootfs-block
terminfo
udev-rules
biosdevname
systemd
usrmount
base
fs-lib
shutdown
========================================================================
drwxr-xr-x  12 root     root            0 Apr 23  2018 .
crw-r--r--   1 root     root       5,   1 Apr 23  2018 dev/console
crw-r--r--   1 root     root       1,  11 Apr 23  2018 dev/kmsg
crw-r--r--   1 root     root       1,   3 Apr 23  2018 dev/null
lrwxrwxrwx   1 root     root            7 Apr 23  2018 bin -> usr/bin
drwxr-xr-x   2 root     root            0 Apr 23  2018 dev
drwxr-xr-x  11 root     root            0 Apr 23  2018 etc
drwxr-xr-x   2 root     root            0 Apr 23  2018 etc/cmdline.d
drwxr-xr-x   2 root     root            0 Apr 23  2018 etc/conf.d
-rw-r--r--   1 root     root          124 Apr 23  2018 etc/conf.d/systemd.conf
-rw-r--r--   1 root     root          248 Jan  5  2018 etc/dhclient.conf
-rw-r--r--   1 root     root            0 Apr 23  2018 etc/fstab.empty
--More--

Comme vous pouvez le constater, l'image contient une arborescence Linux minimaliste :

Le script init

Le script init est lancé lors du chargement de l'image. RHEL/CentOS 7 utilise le système de démarrage systemd. Pour cette raison le script init sous RHEL/CentOS 7 est un lien symbolique vers /usr/lib/systemd/systemd :

[root@centos7 tmp]# lsinitrd custom | grep init
...
lrwxrwxrwx.  1 root root   23 Dec  4 11:00 init -> usr/lib/systemd/systemd
...

Consulter le contenu d'un fichier dans initramfs

Pour consulter le contenu d'un fichier inclus dans l'initramfs, il convient d'utiliser la commande lsinitrd de la manière suivante :

[root@centos7 tmp]# lsinitrd /boot/initramfs-$(uname -r).img  /etc/ld.so.conf
include ld.so.conf.d/*.conf

La Commande dracut

La commande dracut permet de créer facilement une image initramfs. Les options de la commande sont :

[root@centos7 tmp]# dracut --help
Usage: /sbin/dracut [OPTION]... [<initramfs> [<kernel-version>]]

Version: 033-463.el7

Creates initial ramdisk images for preloading modules

  --kver [VERSION]      Set kernel version to [VERSION].
  -f, --force           Overwrite existing initramfs file.
  -a, --add [LIST]      Add a space-separated list of dracut modules.
  --rebuild         Append arguments to those of existing image and rebuild
  -m, --modules [LIST]  Specify a space-separated list of dracut modules to
                         call when building the initramfs. Modules are located
                         in /usr/lib/dracut/modules.d.
  -o, --omit [LIST]     Omit a space-separated list of dracut modules.
  --force-add [LIST]    Force to add a space-separated list of dracut modules
                         to the default set of modules, when -H is specified.
  -d, --drivers [LIST]  Specify a space-separated list of kernel modules to
                         exclusively include in the initramfs.
  --add-drivers [LIST]  Specify a space-separated list of kernel
                         modules to add to the initramfs.
  --omit-drivers [LIST] Specify a space-separated list of kernel
                         modules not to add to the initramfs.
  --filesystems [LIST]  Specify a space-separated list of kernel filesystem
                         modules to exclusively include in the generic
                         initramfs.
  -k, --kmoddir [DIR]   Specify the directory, where to look for kernel
                         modules
  --fwdir [DIR]         Specify additional directories, where to look for
                         firmwares, separated by :
  --kernel-only         Only install kernel drivers and firmware files
  --no-kernel           Do not install kernel drivers and firmware files
  --print-cmdline       Print the kernel command line for the given disk layout
  --early-microcode     Combine early microcode with ramdisk
  --no-early-microcode  Do not combine early microcode with ramdisk
  --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
  --strip               Strip binaries in the initramfs
  --nostrip             Do not strip binaries in the initramfs
  --prelink             Prelink binaries in the initramfs
  --noprelink           Do not prelink binaries in the initramfs
  --hardlink            Hardlink files in the initramfs
  --nohardlink          Do not hardlink files in the initramfs
  --prefix [DIR]        Prefix initramfs files with [DIR]
  --noprefix            Do not prefix initramfs files
  --mdadmconf           Include local /etc/mdadm.conf
  --nomdadmconf         Do not include local /etc/mdadm.conf
  --lvmconf             Include local /etc/lvm/lvm.conf
  --nolvmconf           Do not include local /etc/lvm/lvm.conf
  --fscks [LIST]        Add a space-separated list of fsck helpers.
  --nofscks             Inhibit installation of any fsck helpers.
  --ro-mnt              Mount / and /usr read-only by default.
  -h, --help            This message
  --debug               Output debug information of the build process
  --profile             Output profile information of the build process
  -L, --stdlog [0-6]    Specify logging level (to standard error)
                         0 - suppress any messages
                         1 - only fatal errors
                         2 - all errors
                         3 - warnings
                         4 - info
                         5 - debug info (here starts lots of output)
                         6 - trace info (and even more)
  -v, --verbose         Increase verbosity level
  -q, --quiet           Decrease verbosity level
  -c, --conf [FILE]     Specify configuration file to use.
                         Default: /etc/dracut.conf
  --confdir [DIR]       Specify configuration directory to use *.conf files
                         from. Default: /etc/dracut.conf.d
  --tmpdir [DIR]        Temporary directory to be used instead of default
                         /var/tmp.
  -l, --local           Local mode. Use modules from the current working
                         directory instead of the system-wide installed in
                         /usr/lib/dracut/modules.d.
                         Useful when running dracut from a git checkout.
  -H, --hostonly        Host-Only mode: Install only what is needed for
                        booting the local host instead of a generic host.
  -N, --no-hostonly     Disables Host-Only mode
  --hostonly-cmdline    Store kernel command line arguments needed
                        in the initramfs
  --no-hostonly-cmdline Do not store kernel command line arguments needed
                        in the initramfs
  --hostonly-i18n       Install only needed keyboard and font files according
                        to the host configuration (default).
  --no-hostonly-i18n    Install all keyboard and font files available.
  --persistent-policy [POLICY]
                        Use [POLICY] to address disks and partitions.
                        POLICY can be any directory name found in /dev/disk.
                        E.g. "by-uuid", "by-label"
  --fstab               Use /etc/fstab to determine the root device.
  --add-fstab [FILE]    Add file to the initramfs fstab
  --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
                        Mount device [DEV] on mountpoint [MP] with filesystem
                        [FSTYPE] and options [FSOPTS] in the initramfs
  --add-device "[DEV]"  Bring up [DEV] in initramfs
  -i, --include [SOURCE] [TARGET]
                        Include the files in the SOURCE directory into the
                         Target directory in the final initramfs.
                        If SOURCE is a file, it will be installed to TARGET
                         in the final initramfs.
  -I, --install [LIST]  Install the space separated list of files into the
                         initramfs.
  --install-optional [LIST]  Install the space separated list of files into the
                         initramfs, if they exist.
  --gzip                Compress the generated initramfs using gzip.
                         This will be done by default, unless another
                         compression option or --no-compress is passed.
  --bzip2               Compress the generated initramfs using bzip2.
                         Make sure your kernel has bzip2 decompression support
                         compiled in, otherwise you will not be able to boot.
  --lzma                Compress the generated initramfs using lzma.
                         Make sure your kernel has lzma support compiled in,
                         otherwise you will not be able to boot.
  --xz                  Compress the generated initramfs using xz.
                         Make sure that your kernel has xz support compiled
                         in, otherwise you will not be able to boot.
  --lzo                  Compress the generated initramfs using lzop.
                         Make sure that your kernel has lzo support compiled
                         in, otherwise you will not be able to boot.
  --lz4                  Compress the generated initramfs using lz4.
                         Make sure that your kernel has lz4 support compiled
                         in, otherwise you will not be able to boot.
  --compress [COMPRESSION] Compress the generated initramfs with the
                         passed compression program.  Make sure your kernel
                         knows how to decompress the generated initramfs,
                         otherwise you will not be able to boot.
  --no-compress         Do not compress the generated initramfs.  This will
                         override any other compression options.
  --list-modules        List all available dracut modules.
  -M, --show-modules    Print included module's name to standard output during
                         build.
  --keep                Keep the temporary initramfs for debugging purposes
  --printsize           Print out the module install size
  --sshkey [SSHKEY]     Add ssh key to initramfs (use with ssh-client module)
  --logfile [FILE]      Logfile to use (overrides configuration setting)

If [LIST] has multiple arguments, then you have to put these in quotes.

For example:

    # dracut --add-drivers "module1 module2"  ...

Le fichier de configuration de dracut est /etc/dracut.conf :

# PUT YOUR CONFIG HERE OR IN separate files named *.conf
# in /etc/dracut.conf.d
# SEE man dracut.conf(5)

# Sample dracut config file

#logfile=/var/log/dracut.log
#fileloglvl=6

# Exact list of dracut modules to use.  Modules not listed here are not going
# to be included.  If you only want to add some optional modules use
# add_dracutmodules option instead.
#dracutmodules+=""

# dracut modules to omit
#omit_dracutmodules+=""

# dracut modules to add to the default
#add_dracutmodules+=""

# additional kernel modules to the default
add_drivers+="ehci-hcd ohci-hcd usb-storage scsi_mod sd_mod"

# list of kernel filesystem modules to be included in the generic initramfs
#filesystems+=""

# build initrd only to boot current hardware
#hostonly="yes"
#

# install local /etc/mdadm.conf
#mdadmconf="no"

# install local /etc/lvm/lvm.conf
#lvmconf="no"

# A list of fsck tools to install. If it's not specified, module's hardcoded
# default is used, currently: "umount mount /sbin/fsck* xfs_db xfs_check
# xfs_repair e2fsck jfs_fsck reiserfsck btrfsck". The installation is
# opportunistic, so non-existing tools are just ignored.
#fscks=""

# inhibit installation of any fsck tools
#nofscks="yes"

# mount / and /usr read-only by default
#ro_mnt="no"

# set the directory for temporary files
# default: /var/tmp
#tmpdir=/tmp

Exécutez maintenant la commande suivante afin de générer le fichier initramfs :

[root@centos7 tmp]# dracut -v initramfs
Executing: /sbin/dracut -v initramfs
dracut module 'busybox' will not be installed, because command 'busybox' could not be found!
dracut module 'busybox' will not be installed, because command 'busybox' could not be found!
*** Including module: bash ***
*** Including module: nss-softokn ***
*** Including module: i18n ***
*** Including module: network ***
*** Including module: ifcfg ***
*** Including module: drm ***
*** Including module: plymouth ***
*** Including module: kernel-modules ***
*** Including module: qemu ***
*** Including module: resume ***
*** Including module: rootfs-block ***
*** Including module: terminfo ***
*** Including module: udev-rules ***
Skipping udev rule: 91-permissions.rules
*** Including module: biosdevname ***
*** Including module: systemd ***
*** Including module: usrmount ***
*** Including module: base ***
*** Including module: fs-lib ***
*** Including module: shutdown ***
*** Including modules done ***
*** Installing kernel module dependencies and firmware ***
*** Installing kernel module dependencies and firmware done ***
*** Resolving executable dependencies ***
*** Resolving executable dependencies done***
*** Hardlinking files ***
*** Hardlinking files done ***
*** Stripping files ***
*** Stripping files done ***
*** Generating early-microcode cpio image contents ***
*** Constructing GenuineIntel.bin ****
*** Store current command line parameters ***
*** Creating image file ***
*** Creating microcode section ***
*** Created microcode section ***
*** Creating image file done ***
*** Creating initramfs image file '/tmp/initramfs' done ***

Notez la présence de votre nouvelle image /tmp/initrd/initramfs :

[root@centos7 initrd]# ls -l /tmp/initrd/initramfs
-rw-------. 1 root root 16373488 Jun 10 10:23 /tmp/initrd/initramfs

Déplacez votre fichier initramfs au répertoire /boot :

[root@centos7 initrd]# mv initramfs /boot

Ouvrez votre fichier /boot/grub2/grub.cfg et cherchez la section 10_linux. Copiez la première section menuentry :

...
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-229.4.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-b35de665-5ec8-4226-a533-58a1b567ac91' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8d3bd48-1386-411c-9675-41c3f8f1a309
	else
	  search --no-floppy --fs-uuid --set=root e8d3bd48-1386-411c-9675-41c3f8f1a309
	fi
	linux16 /vmlinuz-3.10.0-229.4.2.el7.x86_64 root=UUID=b35de665-5ec8-4226-a533-58a1b567ac91 ro vconsole.keymap=fr crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8
	initrd16 /initramfs-3.10.0-229.4.2.el7.x86_64.img
}
...

Créez maintenant le fichier /etc/grub.d/09_redhat, collez la section précédemment copiée à la place indiquée entre les lignes cat « EOF et EOF puis modifiez la dernière ligne initrd16 :

#!/bin/sh -e
cat << EOF
menuentry 'CentOS Linux, with Linux 3.10.0-229.4.2.el7.x86_64 et initramfs' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-229.4.2.el7.x86_64-advanced-b35de665-5ec8-4226-a533-58a1b567ac91' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8d3bd48-1386-411c-9675-41c3f8f1a309
        else
          search --no-floppy --fs-uuid --set=root e8d3bd48-1386-411c-9675-41c3f8f1a309
        fi
        linux16 /vmlinuz-3.10.0-229.4.2.el7.x86_64 root=UUID=b35de665-5ec8-4226-a533-58a1b567ac91 ro vconsole.keymap=fr crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet
        initrd16 /initramfs
}
EOF

Rendez ce fichier exécutable :

[root@centos7 initrd]# chmod +x /etc/grub.d/09_redhat

Avant de continuer, supprimer le fichier /etc/grub.d/01_users et éditez le contenu du fichier /etc/grub.d/40_custom ainsi :

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

Mettez à jour grub afin que celui-ci prend en compte le nouveau fichier :

[root@centos7 initrd]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.4.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.4.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-a2feb9eb09b1488da0f23b99a66350f8
Found initrd image: /boot/initramfs-0-rescue-a2feb9eb09b1488da0f23b99a66350f8.img
done

Controlez le fichier /boot/grub2/grub.cfg :

...
### BEGIN /etc/grub.d/09_redhat ###
menuentry 'CentOS Linux, with Linux 3.10.0-229.4.2.el7.x86_64 et initramfs' --class centos --class gnu-linux --class gnu --class os --unrestricted  'gnulinux-3.10.0-229.4.2.el7.x86_64-advanced-b35de665-5ec8-4226-a533-58a1b567ac91' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  e8d3bd48-1386-411c-9675-41c3f8f1a309
        else
...

A faire : Re-démarrez votre machine pour tester votre configuration.

Fichiers Spéciaux

Dans l'ordinateur les périphériques sont reliés à un contrôleur qui communique avec le processeur à l'aide d'un bus. Le contrôleur ainsi que les périphériques nécessitent des pilotes. Sous Linux, les pilotes sont généralement fournis sous la forme d'un module. Chaque périphérique est représenté par un fichier spécial dans le répertoire /dev et c'est dans ce fichier que le système trouve les informations nécessaires pour s'adresser au pilote.

Important : Les périphériques qui nécessitent à ce que l'ordinateur soit éteint afin des les brancher/débrancher sont appelés communément Cold Plug Devices. Les périphériques qui peuvent être brancher/débrancher à chaud sont appelés des Hot Plug Devices.

Consultez le contenu du répertoire /dev :

[root@centos7 ~]# ls -l /dev | more
total 0
crw-------. 1 root    root     10, 235 Oct 28 09:40 autofs
drwxr-xr-x. 2 root    root         140 Oct 28 09:40 block
drwxr-xr-x. 2 root    root          80 Oct 28 09:40 bsg
crw-------. 1 root    root     10, 234 Oct 28 09:40 btrfs-control
drwxr-xr-x. 3 root    root          60 Oct 28 09:40 bus
lrwxrwxrwx. 1 root    root           3 Oct 28 09:40 cdrom -> sr0
drwxr-xr-x. 2 root    root        2800 Oct 28 09:41 char
crw-------. 1 root    root      5,   1 Oct 28 09:40 console
lrwxrwxrwx. 1 root    root          11 Oct 28 09:40 core -> /proc/kcore
drwxr-xr-x. 3 root    root          80 Oct 28 09:40 cpu
crw-------. 1 root    root     10,  61 Oct 28 09:40 cpu_dma_latency
crw-------. 1 root    root     10,  62 Oct 28 09:40 crash
drwxr-xr-x. 5 root    root         100 Oct 28 09:40 disk
drwxr-xr-x. 2 root    root          60 Oct 28 09:40 dri
lrwxrwxrwx. 1 root    root          13 Oct 28 09:40 fd -> /proc/self/fd
crw-rw-rw-. 1 root    root      1,   7 Oct 28 09:40 full
crw-rw-rw-. 1 root    root     10, 229 Oct 28 09:41 fuse
crw-------. 1 root    root     10, 228 Oct 28 09:40 hpet
drwxr-xr-x. 3 root    root           0 Oct 28 09:40 hugepages
prw-------. 1 root    root           0 Oct 28 09:40 initctl
drwxr-xr-x. 3 root    root         240 Oct 28 09:40 input
crw-r--r--. 1 root    root      1,  11 Oct 28 09:40 kmsg
--More--

On peut noter dans la sortie de la commande que certains fichiers sont de type bloc (b), tandis que d'autre sont de type caractère (c).

...
brw-rw----  1 root    disk      8,   1 Nov  1 08:39 sda1
...
crw-rw-rw-  1 root    tty       5,   0 Nov  1 08:39 tty
...

La différence entre les deux repose sur le type de communication entre le système et le module. Dans le premier cas le système accède au périphérique par des coordonnées du bloc de données sur le support tandis que dans le deuxième cas la communication d'échange de données se fait octet par octet sans utiliser des tampons.

Les deux informations clefs du fichier spécial sont situées à la place de la taille d'un fichier normal et se nomment le majeur et le mineur :

  • le majeur identifie le pilote du périphérique et donc son contrôleur,
  • le mineur identifie le périphérique ou une particularité du périphérique telle une partition d'un disque.

Commandes

La Commande lspci

Cette commande vous renseigne sur les adaptateurs reliés aux bus PCI, AGP et PCI express :

[root@centos7 ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01)
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0b.0 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02)

Pour obtenir de l'information sur un adaptateur spécifique, il convient d'utiliser la même commande avec l'option -v en spécifiant l'identifiant concerné :

[root@centos7 ~]# lspci -v -s 00:03.0
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
	Subsystem: Intel Corporation PRO/1000 MT Desktop Adapter
	Flags: bus master, 66MHz, medium devsel, latency 64, IRQ 19
	Memory at f0000000 (32-bit, non-prefetchable) [size=128K]
	I/O ports at d010 [size=8]
	Capabilities: [dc] Power Management version 2
	Capabilities: [e4] PCI-X non-bridge device
	Kernel driver in use: e1000

ou :

[root@centos7 ~]# lspci -vv -s 00:03.0
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
	Subsystem: Intel Corporation PRO/1000 MT Desktop Adapter
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 64 (63750ns min)
	Interrupt: pin A routed to IRQ 19
	Region 0: Memory at f0000000 (32-bit, non-prefetchable) [size=128K]
	Region 2: I/O ports at d010 [size=8]
	Capabilities: [dc] Power Management version 2
		Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [e4] PCI-X non-bridge device
		Command: DPERE- ERO+ RBC=512 OST=1
		Status: Dev=ff:1f.0 64bit- 133MHz- SCD- USC- DC=simple DMMRBC=2048 DMOST=1 DMCRS=8 RSCEM- 266MHz- 533MHz-
	Kernel driver in use: e1000

Options de la commande

Les options de cette commande sont :

[root@centos7 ~]# lspci --help
lspci: invalid option -- '-'
Usage: lspci [<switches>]

Basic display modes:
-mm		Produce machine-readable output (single -m for an obsolete format)
-t		Show bus tree

Display options:
-v		Be verbose (-vv for very verbose)
-k		Show kernel drivers handling each device
-x		Show hex-dump of the standard part of the config space
-xxx		Show hex-dump of the whole config space (dangerous; root only)
-xxxx		Show hex-dump of the 4096-byte extended config space (root only)
-b		Bus-centric view (addresses and IRQ's as seen by the bus)
-D		Always show domain numbers

Resolving of device ID's to names:
-n		Show numeric ID's
-nn		Show both textual and numeric ID's (names & numbers)
-q		Query the PCI ID database for unknown ID's via DNS
-qq		As above, but re-query locally cached entries
-Q		Query the PCI ID database for all ID's via DNS

Selection of devices:
-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]	Show only devices in selected slots
-d [<vendor>]:[<device>]			Show only devices with specified ID's

Other options:
-i <file>	Use specified ID database instead of /usr/share/hwdata/pci.ids
-p <file>	Look up kernel modules in a given file instead of default modules.pcimap
-M		Enable `bus mapping' mode (dangerous; root only)

PCI access options:
-A <method>	Use the specified PCI access method (see `-A help' for a list)
-O <par>=<val>	Set PCI access parameter (see `-O help' for a list)
-G		Enable PCI access debugging
-H <mode>	Use direct hardware access (<mode> = 1 or 2)
-F <file>	Read PCI configuration dump from a given file

La Commande lsusb

Cette commande vous renseigne sur les adaptateurs reliés au bus usb :

[root@centos7 ~]# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

[root@centos7 ~]# lsusb -vt
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/8p, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/8p, 480M

Options de la commande

Les options de cette commande sont :

[root@centos7 ~]# lsusb --help
Usage: lsusb [options]...
List USB devices
  -v, --verbose
      Increase verbosity (show descriptors)
  -s [[bus]:][devnum]
      Show only devices with specified device and/or
      bus numbers (in decimal)
  -d vendor:[product]
      Show only devices with the specified vendor and
      product ID numbers (in hexadecimal)
  -D device
      Selects which device lsusb will examine
  -t, --tree
      Dump the physical USB device hierarchy as a tree
  -V, --version
      Show version of program
  -h, --help
      Show usage and help

La Commande dmidecode

La commande dmidecode lit la table DMI (Desktop Management Interface) aussi appelée SMBIOS (System Management BIOS) et fourni les informations sur :

  • l'état du matériel actuel,
  • les extensions possibles.
[root@centos7 ~]# dmidecode
# dmidecode 2.12
SMBIOS 2.5 present.
10 structures occupying 450 bytes.
Table at 0x000E1000.

Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
	Vendor: innotek GmbH
	Version: VirtualBox
	Release Date: 12/01/2006
	Address: 0xE0000
	Runtime Size: 128 kB
	ROM Size: 128 kB
	Characteristics:
		ISA is supported
		PCI is supported
		Boot from CD is supported
		Selectable boot is supported
		8042 keyboard services are supported (int 9h)
		CGA/mono video services are supported (int 10h)
		ACPI is supported

Handle 0x0001, DMI type 1, 27 bytes
System Information
	Manufacturer: innotek GmbH
	Product Name: VirtualBox
	Version: 1.2
	Serial Number: 0
	UUID: DDEE345C-66F8-4250-B5A2-85CEF2C1C54D
	Wake-up Type: Power Switch
	SKU Number: Not Specified
	Family: Virtual Machine

Handle 0x0008, DMI type 2, 15 bytes
Base Board Information
	Manufacturer: Oracle Corporation
	Product Name: VirtualBox
	Version: 1.2
	Serial Number: 0
	Asset Tag: Not Specified
	Features:
		Board is a hosting board
	Location In Chassis: Not Specified
	Chassis Handle: 0x0003
	Type: Motherboard
	Contained Object Handles: 0

Handle 0x0003, DMI type 3, 13 bytes
Chassis Information
	Manufacturer: Oracle Corporation
	Type: Other
	Lock: Not Present
	Version: Not Specified
	Serial Number: Not Specified
	Asset Tag: Not Specified
	Boot-up State: Safe
	Power Supply State: Safe
	Thermal State: Safe
	Security Status: None

Handle 0x0007, DMI type 126, 42 bytes
Inactive

Handle 0x0005, DMI type 126, 15 bytes
Inactive

Handle 0x0006, DMI type 126, 28 bytes
Inactive

Handle 0x0002, DMI type 11, 7 bytes
OEM Strings
	String 1: vboxVer_4.3.28
	String 2: vboxRev_100309

Handle 0x0008, DMI type 128, 8 bytes
OEM-specific Type
	Header and Data:
		80 08 08 00 01 15 21 00

Handle 0xFEFF, DMI type 127, 4 bytes
End Of Table

Options de la commande

Les options de cette commande sont :

[root@centos7 ~]# dmidecode --help
Usage: dmidecode [OPTIONS]
Options are:
 -d, --dev-mem FILE     Read memory from device FILE (default: /dev/mem)
 -h, --help             Display this help text and exit
 -q, --quiet            Less verbose output
 -s, --string KEYWORD   Only display the value of the given DMI string
 -t, --type TYPE        Only display the entries of given type
 -u, --dump             Do not decode the entries
     --dump-bin FILE    Dump the DMI data to a binary file
     --from-dump FILE   Read the DMI data from a binary file
 -V, --version          Display the version and exit

Répertoire /proc

Le répertoire /proc contient des fichiers et des répertoires virtuels. Le contenu de ces fichiers est créé dynamiquement lors de la consultation. Seul root peut consulter la totalité des informations dans le répertoire /proc.

[root@centos7 ~]# ls /proc
1      217    260   2833  3085  465   5898         fb            sched_debug
10     22619  2605  2879  3091  478   5933         filesystems   scsi
11     22650  2606  2883  3104  482   5940         fs            self
12     228    261   2884  3108  484   60           interrupts    slabinfo
1215   229    262   29    3124  485   604          iomem         softirqs
1217   22908  263   2901  3172  488   698          ioports       stat
1227   230    264   2906  3185  490   7            irq           swaps
1228   232    265   2910  3304  492   7110         kallsyms      sys
1230   233    2671  2913  3496  494   8            kcore         sysrq-trigger
1264   23387  2676  2924  3543  495   83           keys          sysvipc
13     235    27    2926  363   5     9            key-users     timer_list
1372   23580  2749  2931  370   502   acpi         kmsg          timer_stats
14     23916  2752  2937  372   503   asound       kpagecount    tty
15     23998  2759  2948  38    508   buddyinfo    kpageflags    uptime
16     24     2762  2955  381   509   bus          loadavg       version
17     24013  2764  2967  40    519   cgroups      locks         vmallocinfo
1732   2427   2765  2971  41    521   cmdline      mdstat        vmstat
1744   248    2767  2973  414   525   consoles     meminfo       zoneinfo
17788  2486   2768  2983  431   530   cpuinfo      misc
18     25     2782  2985  432   536   crypto       modules
19     2586   2798  2988  433   549   devices      mounts
2      259    28    2998  434   586   diskstats    mtrr
20     2595   2802  3     436   587   dma          net
20638  2597   2806  3058  454   5894  driver       pagetypeinfo
21     26     2818  3084  458   5897  execdomains  partitions

Répertoires

ide/scsi

Ce répertoire contient des répertoires dans lesquels se trouvent des informations sur la capacité, le type et la géométrie des disques.

acpi

Ce répertoire contient des informations sur la gestion de l'énérgie, les températures, les vitesses de ventilateurs, la charge des batteries.

bus

Ce répertoire contient un sous-répertoire par bus.

net

Ce répertoire contient des informations sur le réseau.

sys

Ce répertoire contient des paramètres du noyau. Certains des fichiers dans ce répertoire sont accessibles en écriture par root en temps réel. Par exemple pour éviter des attaques réseau DoS utilisant la commande ping, saisissez la commande suivante :

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all [Entrée]

Cette commande a pour résultat d'ignorer les reqûetes ping.

La commande sysctl

Les fichiers dans le répertoire /proc/sys peuvent être administrés par la commande sysctl en temps réel.

La commande sysctl applique les règles consignés dans le fichier /etc/sysctl.conf au démarrage de la machine.

Saisissez la commande :

[root@centos7 ~]# cat /etc/sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

[root@centos7 ~]# cat /usr/lib/sysctl.d/00-system.conf
# Kernel sysctl configuration file
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 4294967295

# Controls the maximum number of shared memory segments, in pages

[root@centos7 ~]# ls -l /etc/sysctl.d/
total 0
lrwxrwxrwx. 1 root root 14 Jun  4 09:54 99-sysctl.conf -> ../sysctl.conf

[root@centos7 ~]# cat /etc/sysctl.d/99-sysctl.conf 
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
Options de la commande

Les options de la commande sysctl sont :

[root@centos7 ~]# sysctl --help

Usage:
 sysctl [options] [variable[=value] ...]

Options:
  -a, --all            display all variables
  -A                   alias of -a
  -X                   alias of -a
      --deprecated     include deprecated parameters to listing
  -b, --binary         print value without new line
  -e, --ignore         ignore unknown variables errors
  -N, --names          print variable names without values
  -n, --values         print only values of a variables
  -p, --load[=<file>]  read values from file
  -f                   alias of -p
      --system         read values from all system directories
  -r, --pattern <expression>
                       select setting that match expression
  -q, --quiet          do not echo variable set
  -w, --write          enable writing a value to variable
  -o                   does nothing
  -x                   does nothing
  -d                   alias of -h

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see sysctl(8).

Important : Consultez la page de la traduction du manuel de sysctl ici pour comprendre la commande.

Fichiers

Processeur

[root@centos7 ~]# cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 55
model name	: Intel(R) Celeron(R) CPU  N2840  @ 2.16GHz
stepping	: 8
microcode	: 0x19
cpu MHz		: 2167.721
cache size	: 6144 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 5
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl pni monitor ssse3 lahf_lm
bogomips	: 4335.44
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

Interruptions système

[root@centos7 ~]# cat /proc/interrupts
           CPU0       
  0:        189   IO-APIC-edge      timer
  1:       5890   IO-APIC-edge      i8042
  8:          0   IO-APIC-edge      rtc0
  9:          1   IO-APIC-fasteoi   acpi
 12:      22452   IO-APIC-edge      i8042
 14:          0   IO-APIC-edge      ata_piix
 15:      13891   IO-APIC-edge      ata_piix
 19:      25816   IO-APIC-fasteoi   ehci_hcd:usb1, enp0s3
 20:     119352   IO-APIC-fasteoi   vboxguest
 21:      33754   IO-APIC-fasteoi   ahci, snd_intel8x0
 22:          0   IO-APIC-fasteoi   ohci_hcd:usb2
NMI:          0   Non-maskable interrupts
LOC:    1630315   Local timer interrupts
SPU:          0   Spurious interrupts
PMI:          0   Performance monitoring interrupts
IWI:      83206   IRQ work interrupts
RTR:          0   APIC ICR read retries
RES:          0   Rescheduling interrupts
CAL:          0   Function call interrupts
TLB:          0   TLB shootdowns
TRM:          0   Thermal event interrupts
THR:          0   Threshold APIC interrupts
MCE:          0   Machine check exceptions
MCP:         48   Machine check polls
ERR:          0
MIS:          0

Important : Un pilote de périphérique demande au processeur de fournir un service en utilisant un IRQ. Quand la demande est faite, le processeur interrompe ses activités et passe le contrôle au pilote identifié par l'IRQ. Techniquement l'attribution d'un IRQ à un périphérique doit être exclusive. Dans le cas où deux périphériques demandent un service en même temps, c'est le périphérique ayant l'IRQ le plus bas qui est prioritaire.

Canaux DMA

[root@centos7 ~]# cat /proc/dma
 4: cascade

Plages d'entrée/sortie

[root@centos7 ~]# cat /proc/ioports | more
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0071 : rtc_cmos
  0070-0071 : rtc0
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : 0000:00:01.1
  0170-0177 : ata_piix
01f0-01f7 : 0000:00:01.1
  01f0-01f7 : ata_piix
0376-0376 : 0000:00:01.1
  0376-0376 : ata_piix
03c0-03df : vga+
03f6-03f6 : 0000:00:01.1
  03f6-03f6 : ata_piix
0cf8-0cff : PCI conf1
4000-4003 : ACPI PM1a_EVT_BLK
--More--

Si deux périphériques ont le même port, les deux périphériques seront inutilisables.

Périphériques

[root@centos7 ~]# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  6 lp
  7 vcs
 10 misc
 13 input
 14 sound
 29 fb
 99 ppdev
116 alsa
128 ptm
136 pts
162 raw
180 usb
188 ttyUSB
189 usb_device
202 cpu/msr
203 cpu/cpuid
226 drm
250 hidraw
251 usbmon
252 bsg
253 watchdog
254 rtc

Block devices:
259 blkext
  8 sd
  9 md
 11 sr
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp

Modules

[root@centos7 ~]# cat /proc/modules | more
tcp_lp 12663 0 - Live 0xffffffffa059d000
lp 17759 0 - Live 0xffffffffa0593000
nls_utf8 12557 1 - Live 0xffffffffa0527000
isofs 39844 1 - Live 0xffffffffa0588000
bnep 19704 2 - Live 0xffffffffa0516000
bluetooth 372662 7 bnep, Live 0xffffffffa052c000
rfkill 26536 3 bluetooth, Live 0xffffffffa051f000
fuse 87741 3 - Live 0xffffffffa04ff000
ip6t_rpfilter 12546 1 - Live 0xffffffffa04fa000
ip6t_REJECT 12939 2 - Live 0xffffffffa04f5000
ipt_REJECT 12541 2 - Live 0xffffffffa04f0000
xt_conntrack 12760 7 - Live 0xffffffffa04e6000
ebtable_nat 12807 0 - Live 0xffffffffa04e1000
ebtable_broute 12731 0 - Live 0xffffffffa04eb000
bridge 115385 1 ebtable_broute, Live 0xffffffffa04c3000
stp 12976 1 bridge, Live 0xffffffffa04be000
llc 14552 2 bridge,stp, Live 0xffffffffa04b5000
ebtable_filter 12827 0 - Live 0xffffffffa04b0000
ebtables 30913 3 ebtable_nat,ebtable_broute,ebtable_filter, Live 0xffffffffa04a3
000
ip6table_nat 12864 1 - Live 0xffffffffa049e000
nf_conntrack_ipv6 18738 5 - Live 0xffffffffa0498000
nf_defrag_ipv6 34651 1 nf_conntrack_ipv6, Live 0xffffffffa048a000
--More--

Statistiques de l'utilisation des disques

[root@centos7 ~]# cat /proc/diskstats
  11       0 sr0 21 0 132 157 0 0 0 0 0 157 157
   8       0 sda 19700 638 2178341 386424 13324 1605 547086 356748 0 164849 740706
   8       1 sda1 2129 0 9438 2181 2057 0 4122 392 0 2527 2569
   8       2 sda2 17213 598 2165719 382957 11202 1605 542964 356316 0 164048 736814
   8       3 sda3 170 31 1608 775 0 0 0 0 0 775 775

Partitions

[root@centos7 ~]# cat /proc/partitions
major minor  #blocks  name

  11        0      56876 sr0
   8        0   20971520 sda
   8        1     204800 sda1
   8        2    7168000 sda2
   8        3    3072000 sda3

Espaces de pagination

[root@centos7 ~]# cat /proc/swaps
Filename				Type		Size	Used	Priority
/dev/sda3                               partition	3071996	0	-1

Statistiques d'utilisation du processeur

[root@centos7 ~]# cat /proc/loadavg
1.82 1.07 0.81 3/379 25349

Statistiques d'utilisation de la mémoire

[root@centos7 ~]# cat /proc/meminfo
MemTotal:        1791624 kB
MemFree:           72272 kB
MemAvailable:     769436 kB
Buffers:             404 kB
Cached:           790132 kB
SwapCached:            0 kB
Active:          1002556 kB
Inactive:         529520 kB
Active(anon):     620404 kB
Inactive(anon):   131808 kB
Active(file):     382152 kB
Inactive(file):   397712 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       3071996 kB
SwapFree:        3071992 kB
Dirty:             35168 kB
Writeback:             0 kB
AnonPages:        741568 kB
Mapped:           138756 kB
Shmem:             10664 kB
Slab:              98304 kB
SReclaimable:      59848 kB
SUnreclaim:        38456 kB
KernelStack:        5808 kB
PageTables:        24140 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3967808 kB
Committed_AS:    3006392 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       28612 kB
VmallocChunk:   34359706684 kB
HardwareCorrupted:     0 kB
AnonHugePages:    256000 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       75712 kB
DirectMap2M:     1759232 kB

Version du noyau

[root@centos7 ~]# cat /proc/version
Linux version 3.10.0-229.4.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Wed May 13 10:06:09 UTC 2015

Interprétation des informations dans /proc

Les informations brutes stockées dans /proc peuvent être interprétées grâce à l'utilisation des commandes dites de gestion des performances :

  • free,
  • uptime et w,
  • iostat,
  • vmstat,
  • mpstat,
  • sar.

Commandes

free

La commande free permet de donner l’état de la mémoire totale, libre, partagée, swap et bufferisée. Saisissez donc la commande suivante :

[root@centos7 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1749         859          76           6         813         707
Swap:          2999           3        2996

Dans le cas de cet exemple, nous pouvons constater que l’affichage montre :

  • 1749 Mo de mémoire physique totale,
  • 859 Mo de mémoire physique utilisée et 76 Mo de mémoire physique libre,
  • 2999 Mo de mémoire swap totale et 3 Mo de swap utilisé

Les options de cette commande sont :

[root@centos7 ~]# free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).
uptime ou w

Chacune des ces commandes indique la charge moyenne du ou des processeurs depuis 1 minute, 5 minutes et 15 minutes :

[root@centos7 ~]# uptime
 14:43:46 up  4:05,  2 users,  load average: 0.92, 1.23, 0.95

[root@centos7 ~]# w
 14:43:49 up  4:05,  2 users,  load average: 0.92, 1.23, 0.95
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
trainee  :0       :0               Wed09   ?xdm?  40:01   0.74s gdm-session-worker [pam/gdm-password]
trainee  pts/0    :0               Wed10    5.00s  0.65s 26.90s /usr/libexec/gnome-terminal-server

Les valeurs load average ou charge moyenne indiquent le nombre moyen de processus en cours de traitement ou en attente pour la période concernée.

Par exemple si les valeurs sur un système muni d'un seul processeur étaient 3,48 4,00 3,85 ceci indiquerait que le processeur a du mal à traiter les processus mettant en moyenne :

  • 2,48 processus en attente dans la dernière minute,
  • 3,00 processus en attente dans les dernières 5 minutes,
  • 2,85 processus en attente dans les dernières 15 minutes.

Les options de ces commandes sont :

[root@centos7 ~]# uptime --help

Usage:
 uptime [options]

Options:
 -p, --pretty   show uptime in pretty format
 -h, --help     display this help and exit
 -s, --since    system up since
 -V, --version  output version information and exit

For more details see uptime(1).

[root@centos7 ~]# w --help

Usage:
 w [options]

Options:
 -h, --no-header     do not print header
 -u, --no-current    ignore current process username
 -s, --short         short format
 -f, --from          show remote hostname field
 -o, --old-style     old style output
 -i, --ip-addr       display IP address instead of hostname (if possible)

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see w(1).
iostat

La commande iostat affiche des statistiques sur l'utilisation des disques, des terminaux et des lecteurs de cartouche :

[root@centos7 ~]# iostat
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.00    0.14    2.67    0.29    0.00   87.90

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.00         0.00         66          0
sda               2.56        95.04        37.09    1409026     549881

Au-dessous de la première ligne indiquant la version du noyau du système et son nom d'hôte ainsi que la date actuelle, iostat affiche une vue d'ensemble de l'utilisation CPU moyenne du système depuis le dernier démarrage. Le rapport d'utilisation du CPU inclut les pourcentages suivants :

  • Pourcentage de temps passé en mode utilisateur (exécutant des applications, etc.)
  • Pourcentage de temps passé en mode utilisateur (pour les processus qui ont modifié leur priorité de programmation à l'aide de la commande nice)
  • Pourcentage de temps passé en mode noyau
  • Pourcentage de temps passé en inactivité

Notez la valeur de %iowait. Dans le cas où ce pourcentage est trop élévé, ceci indique que le processeur passe son temps à attendre les entrées et les sorties de disque.

Pour surveiller la vitesse des entrées et des sorties du disque, vous pouvez utiliser la commande hdparm.

Sous RHEL/CentOS 7, la commande hdparm n'est pas disponible par défaut. Installez donc le paquet hdparm :

[root@centos7 ~]# yum install hdparm
[root@centos7 ~]# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 254 MB in  3.02 seconds =  84.19 MB/sec

Au-dessous du rapport d'utilisation du CPU de la sortie de la commande iostat figure le rapport d'utilisation des périphériques. Ce dernier contient une ligne pour chaque périphérique disque du système et inclut les informations suivantes :

  • La spécification du périphérique, apparaissant sous la forme dev<major-number>-sequence-number où <major-number> correspond au nombre majeur du périphérique et <sequence-number> correspond à un numéro de séquence commençant par zéro.
  • Le nombre de transferts (ou opérations d'E/S) par seconde.
  • Le nombre de blocs de 512 octets lus par seconde.
  • Le nombre de blocs de 512 octets écrits par seconde.
  • Le nombre total de blocs de 512 octets lus par seconde.
  • Le nombre total de blocs de 512 octets écrits par seconde.

Les options de cette commande sont :

[root@centos7 ~]# iostat --help
Usage: iostat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ [ -T ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ]
[ <device> [...] | ALL ]
vmstat

La commande vmstat affiche des statistiques sur la mémoire, la pagination et la charge ponctuelle du processeur :

[root@centos7 ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  0   4600 352560     20 620332    0    0   114    37  157  236  9  3 88  0  0
 1  0   4600 352736     20 620368    0    0     0     0  231  310 29  7 63  0  0
 0  0   4600 352736     20 620368    0    0     0     0  223  318 32  7 60  0  0
 1  0   4600 352776     20 620328    0    0     0     0  250  339 34  9 57  0  0
 0  0   4600 352776     20 620328    0    0     0     0  215  285 30  9 61  0  0
 0  0   4600 352776     20 620328    0    0     0     0  234  326 31  7 61  0  0
 1  0   4600 352776     20 620328    0    0     0     0  219  306 31  8 62  0  0
 0  0   4600 352776     20 620328    0    0     0     0  223  298 29  7 63  0  0
 0  0   4600 352776     20 620328    0    0     0     0  223  314 32  7 60  0  0
 1  0   4600 352776     20 620332    0    0     0     0  238  309 34  7 59  0  0

La première ligne subdivise le champ en six catégories à savoir : processus, mémoire, swap, E/S, système et CPU sur lesquelles elle donne des statistiques. La seconde ligne identifie de manière encore plus détaillée chacun des champs, permettant ainsi de parcourir simplement et rapidement l'ensemble des données lors de la recherche de statistiques spécifiques.

Les champs relatifs aux processus sont les suivants :

  • r — Le nombre de processus exécutables attendant d'avoir accès au CPU
  • b — Le nombre de processus exécutables dans un état de veille qui ne peut être interrompu

Les champs relatifs à la mémoire sont les suivants :

  • swpd — La quantité de mémoire virtuelle utilisée
  • free — La quantité de mémoire libre
  • buff — La quantité de mémoire utilisée par les tampons (ou buffers)
  • cache — La quantité de mémoire utilisée comme cache de pages

Les champs relatifs au swap sont les suivants :

  • si — La quantité de mémoire chargée depuis le disque
  • so — La quantité de mémoire déchargée sur le disque

Les champs relatifs aux Entrées/Sorties (E/S) sont les suivants :

  • bi — Blocs envoyés vers un périphérique blocs
  • bo— Blocs reçus d'un périphérique blocs

Les champs relatifs au système sont les suivants :

  • in — Nombre d'interruptions par seconde
  • cs — Nombre de changements de contexte par seconde

Les champs relatifs au CPU sont les suivants :

  • us — Le pourcentage de temps pendant lequel le CPU exécute un code de niveau utilisateur
  • sy — Le pourcentage de temps pendant lequel le CPU exécute un code de niveau système
  • id — Le pourcentage de temps pendant lequel le CPU était inoccupé
  • wa — Attente d'E/S

Les options de cette commande sont :

[root@centos7 ~]# vmstat --help

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see vmstat(8).

Important : Par défaut la commande vmstat affiche des informations depuis le démarrage du système.

mpstat

La commande mpstat affiche des statistiques détaillées sur le CPU :

[root@centos7 ~]# mpstat
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:19:32 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:19:32 PM  all    9.38    0.14    2.52    0.31    0.00    0.24    0.00    0.00    0.00   87.42

Dans le cas où vous avez plusieurs processeurs ou coeurs, vous pouvez visualiser ces mêmes informations par unité de traitement :

[root@centos7 ~]# mpstat -P ALL
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:20:06 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:20:06 PM  all    9.42    0.14    2.53    0.31    0.00    0.24    0.00    0.00    0.00   87.36
03:20:06 PM    0    9.42    0.14    2.53    0.31    0.00    0.24    0.00    0.00    0.00   87.36

Pour afficher 5 jeux de statistiques à des intervales de 2 secondes pour tous les unités de traitement, il convient d'utiliser la commande suivante :

[root@centos7 ~]# mpstat -P ALL 2 5
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:20:43 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:20:45 PM  all   27.46    0.00    7.04    0.00    0.00    0.00    0.00    0.00    0.00   65.49
03:20:45 PM    0   27.46    0.00    7.04    0.00    0.00    0.00    0.00    0.00    0.00   65.49

03:20:45 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:20:47 PM  all   24.83    0.00    5.37    0.00    0.00    0.67    0.00    0.00    0.00   69.13
03:20:47 PM    0   24.83    0.00    5.37    0.00    0.00    0.67    0.00    0.00    0.00   69.13

03:20:47 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:20:49 PM  all   17.95    0.00    4.49    0.00    0.00    0.00    0.00    0.00    0.00   77.56
03:20:49 PM    0   17.95    0.00    4.49    0.00    0.00    0.00    0.00    0.00    0.00   77.56

03:20:49 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:20:51 PM  all   18.18    0.00    3.90    0.00    0.00    0.00    0.00    0.00    0.00   77.92
03:20:51 PM    0   18.18    0.00    3.90    0.00    0.00    0.00    0.00    0.00    0.00   77.92

03:20:51 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:20:53 PM  all   24.14    0.00    6.21    0.00    0.00    0.00    0.00    0.00    0.00   69.66
03:20:53 PM    0   24.14    0.00    6.21    0.00    0.00    0.00    0.00    0.00    0.00   69.66

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all   22.39    0.00    5.36    0.00    0.00    0.13    0.00    0.00    0.00   72.12
Average:       0   22.39    0.00    5.36    0.00    0.00    0.13    0.00    0.00    0.00   72.12

Les options de cette commande sont :

[root@centos7 ~]# mpstat --help
Usage: mpstat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -u ] [ -V ] [ -I { SUM | CPU | SCPU | ALL } ]
[ -P { <cpu> [,...] | ON | ALL } ]
sar

La commande sar permet de surveiller toutes les ressources du système selon l'option qui est passée en argument à la commande. Quelques options importantes sont :

Option Description
-u Pourcentage d'utilisation du CPU
-q Nombre de processus en attente
-r Utilisation de la mémoire centrale
-w Surveillance du swapping
-p Surveillance de la pagination
-b Utilisation des tampons
-d Utilisation des disques

Sous RHEL/CentOS 7 la commande /usr/lib64/sa/sadc permet de collecter les informations :

[root@centos7 ~]# ls /usr/lib64/sa
sa1  sa2  sadc

Le script /usr/lib64/sa/sa1 exécute la commande sadc. Ce script prend deux options :

Option Description
-t L'interval entre les collectes
-n Nombre de collectes

Le script /usr/lib64/sa/sa2 exécute la commande sar et consigne les informations dans un fichier au format /var/log/sa/sar<jj>.

Pour pouvoir fonctionner correctement, ces scripts doivent être appelés par cron.

Modifiez le fichier /etc/cron.d/sysstat ainsi :

[root@centos7 ~]# cat /etc/cron.d/sysstat
# Run system activity accounting tool every 10 minutes
# */10 * * * * root /usr/lib64/sa/sa1 1 1
*/2 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

Attendez deux minutes puis saisissez les commandes suivantes :

[root@centos7 ~]# sar
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

02:20:02 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
02:30:01 PM     all     12.95      0.01      3.36      0.01      0.00     83.67
02:40:01 PM     all     27.64      0.50      7.84      0.06      0.00     63.96
02:50:01 PM     all     11.56      2.46      4.59      1.18      0.00     80.21
03:00:01 PM     all      0.45      0.01      0.64      0.03      0.00     98.88
03:10:01 PM     all      0.38      0.01      0.61      0.01      0.00     98.98
03:20:01 PM     all     25.80      0.02      6.68      0.85      0.00     66.66
03:28:02 PM     all     21.59      0.06      6.84      0.21      0.00     71.31
03:30:01 PM     all     22.88      0.01      5.76      0.00      0.00     71.35
03:32:01 PM     all     11.34      0.01      2.99      0.11      0.00     85.55
Average:        all     13.21      0.41      4.01      0.30      0.00     82.06
[root@centos7 ~]# sar -u 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:34:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:34:06 PM     all     29.73      0.00     14.19      0.00      0.00     56.08
03:34:11 PM     all     17.62      0.00      4.40      0.00      0.00     77.98
03:34:16 PM     all      4.75      0.00      1.30      0.00      0.00     93.95
Average:        all     15.55      0.00      5.68      0.00      0.00     78.78
[root@centos7 ~]# sar -r 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:34:48 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
03:34:53 PM    137708   1653916     92.31        20    561940   2950052     60.66    776232    539396        12
03:34:58 PM    130988   1660636     92.69        20    566552   3000196     61.69    779820    542436        20
03:35:03 PM    131360   1660264     92.67        20    566584   2999016     61.66    779288    542472        48
Average:       133352   1658272     92.56        20    565025   2983088     61.33    778447    541435        27
[root@centos7 ~]# sar -w 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:35:51 PM    proc/s   cswch/s
03:35:56 PM      0.00    608.04
03:36:01 PM      1.06    531.75
03:36:06 PM     25.94   1226.28
Average:         8.36    767.19
[root@centos7 ~]# sar -b 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:36:09 PM       tps      rtps      wtps   bread/s   bwrtn/s
03:36:14 PM      0.00      0.00      0.00      0.00      0.00
03:36:19 PM      0.00      0.00      0.00      0.00      0.00
03:36:24 PM      2.32      0.00      2.32      0.00     31.79
Average:         0.89      0.00      0.89      0.00     12.25
[root@centos7 ~]# sar -d 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:36:46 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
03:36:51 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:36:51 PM    dev8-0      0.31      0.00      2.45      8.00      0.00      0.00      0.00      0.00

03:36:51 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
03:36:56 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:36:56 PM    dev8-0      4.31      0.00     55.38     12.86      0.04      9.36      1.93      0.83

03:36:56 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
03:37:01 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:37:01 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       dev8-0      1.49      0.00     18.63     12.53      0.01      8.73      1.80      0.27
[root@centos7 ~]# sar -p 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:37:16 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:37:21 PM     all     38.30      0.00      7.31      0.00      0.00     54.39
03:37:26 PM     all     45.81      0.00      9.58      0.00      0.00     44.61
03:37:31 PM     all     33.33      0.00      7.67      0.00      0.00     59.00
Average:        all     39.11      0.00      8.18      0.00      0.00     52.71
[root@centos7 ~]# sar -v 5 3
Linux 3.10.0-229.4.2.el7.x86_64 (centos7.fenestros.loc) 	11/02/2015 	_x86_64_	(1 CPU)

03:38:44 PM dentunusd   file-nr  inode-nr    pty-nr
03:38:49 PM    136266      5792    122548         2
03:38:54 PM    136266      5792    122548         2
03:38:59 PM    136266      5792    122548         2
Average:       136266      5792    122548         2

Les options de cette commande sont :

[root@centos7 ~]# sar --help
Usage: sar [ options ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -B ] [ -b ] [ -C ] [ -d ] [ -H ] [ -h ] [ -p ] [ -q ] [ -R ]
[ -r ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -V ] [ -v ] [ -W ] [ -w ] [ -y ]
[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -m { <keyword> [,...] | ALL } ] [ -n { <keyword> [,...] | ALL } ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ -f [ <filename> ] | -o [ <filename> ] | -[0-9]+ ]
[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]

Utilisation des commandes en production

Identifier un système limité par le processeur

Dans ce cas utilisez les commandes suivantes :

  • uptime ou w
  • vmstat
  • mpstat -P ALL
  • sar -u
  • iostat -c
Identifier un système ayant un problème de mémoire

Dans ce cas utilisez les commandes suivantes :

  • free
  • sar -B
Identifier un système ayant un problème d'E/S

Utilisez la commande :

  • iostat -d -x

Modules usb

L'USB (Universal Serial Bus) est un bus de données qui peut offrir des taux de transfert jusqu'à 480Mb/s sous la version 2.0 et jusqu'à 4.8 Gb/s sous la version 3.0. Les modules nécessaires pour les contrôleurs USB sont :

Version USB Module Nom Complet
1.0\1.1 UHCI Universal Controller Host Interface
OHCI Open Controller Host Interface
2.0 EHCI Enhanced Host Controller Interface
3.0 XHCI Extensible Host Controller Interface

Le tableau suivant liste les modules courrament chargés en fonction du périphérique utilisé :

Module Type de Périphérique
usb_storage Supports de masse
usbhid Periphériques HID (Human Interface Device)
snd-usb-audio Cartes son usb
usbvidéo Cartes vidéo et d'acquisition
irda-usb Périphériques infrarouges
usbnet Cartes réseaux usb

Les modules peuvent être chargés par un des moyens suivants :

  • INITrd,
  • Le processus init,
  • kmod, d'une manière dynamique et transparente lors du branchement du périphérique, en utilisant le fichier /lib/modules/2.6.18-194.3.1.el5/modules.usbmap,
  • udev,
  • manuellement.

A faire : Branchez une clef USB avant de continuer. Si vous utilisez VirtualBox, activez la clef dans votre machine virtuelle grâce aux menus Périphériques > Périphériques USB > le_nom_de_votre_clef.

udev

Depuis le noyau Linux 2.6 Linux est capable de détecter des périphériques branchés à chaud. Cette technologie s'appelle le hotplugging. Le hotplugging est obtenu grâce à l'utilisation de trois composants :

  • Udev,
  • HAL,
  • Dbus.

Les rôles de chaque composant sont les suivants :

  • Udev se charge de créer et supprimer d'une manière dynamique les nœuds dans le répertoire /dev,
  • HAL obtient des informations à partir d'Udev et créé un fichier au format XML représentant le périphérique branché. Il informe ensuite Nautilus en utilisant le Dbus,
  • Dbus joue le rôle d'un bus système qui est utilisé pour la communication inter-processus.

Lors de démarrage de Linux, Udev joue un rôle important :

  • Au démarrage tmpfs est monté sur /dev,
  • Udev copie les éventuels nœuds statiques de /lib/udev/devices vers /dev,
  • le démon udevd collecte des données appelées uevents du noyau et cherche une règle correspondante dans le répertoire /lib/udev/rules.d/,
  • Udev crée les nœuds et liens symboliques spécifiés dans la règle identifiée,
  • Udev stocke les règles contenues dans /lib/udev/rules.d/*.rules en mémoire,
  • En cas de modification des ces règles, Udev met à jour la mémoire.

Udev repose sur le filesystem sysfs monté sur /sys qui permet de rendre les périphériques visibles à Udev dans l'User Space. Par exemple, lors du branchement d'une clé USB, Udev crée /dev/sdb1 automatiquement et utilise les informations contenues dans le fichier /lib/modules/`uname -r`/modules.alias pour trouver le pilote nécessaire :

Le fichier de configuration principal d'Udev est /etc/udev/udev.conf :

[root@centos7 ~]# cat /etc/udev/udev.conf
# see udev(7) for details

#udev_log="info"

Les fichiers de règles se trouvent dans /lib/udev/rules.d/ :

[root@centos7 ~]# ls /lib/udev/rules.d/
10-dm.rules                       61-gnome-bluetooth-rfkill.rules  77-mm-ericsson-mbm.rules                  90-iprutils.rules
11-dm-lvm.rules                   62-multipath.rules               77-mm-huawei-net-port-types.rules         90-pulseaudio.rules
11-dm-mpath.rules                 63-md-raid-arrays.rules          77-mm-longcheer-port-types.rules          90-vconsole.rules
13-dm-disk.rules                  64-btrfs.rules                   77-mm-nokia-port-types.rules              91-drm-modeset.rules
40-libgphoto2.rules               65-libwacom.rules                77-mm-pcmcia-device-blacklist.rules       95-cd-devices.rules
40-redhat.rules                   65-md-incremental.rules          77-mm-platform-serial-whitelist.rules     95-dm-notify.rules
40-usb_modeswitch.rules           65-sane-backends.rules           77-mm-simtech-port-types.rules            95-udev-late.rules
42-usb-hid-pm.rules               69-cd-sensors.rules              77-mm-telit-port-types.rules              95-upower-battery-recall-dell.rules
50-rbd.rules                      69-dm-lvm-metad.rules            77-mm-usb-device-blacklist.rules          95-upower-battery-recall-fujitsu.rules
50-udev-default.rules             69-libmtp.rules                  77-mm-usb-serial-adapters-greylist.rules  95-upower-battery-recall-gateway.rules
56-hpmud.rules                    69-xorg-vmmouse.rules            77-mm-x22x-port-types.rules               95-upower-battery-recall-ibm.rules
60-alias-kmsg.rules               70-power-switch.rules            77-mm-zte-port-types.rules                95-upower-battery-recall-lenovo.rules
60-cdrom_id.rules                 70-printers.rules                77-nm-olpc-mesh.rules                     95-upower-battery-recall-toshiba.rules
60-fprint-autosuspend.rules       70-spice-vdagentd.rules          78-sound-card.rules                       95-upower-csr.rules
60-keyboard.rules                 70-touchpad-quirks.rules         80-drivers.rules                          95-upower-hid.rules
60-net.rules                      70-uaccess.rules                 80-kvm.rules                              95-upower-wup.rules
60-persistent-alsa.rules          70-wacom.rules                   80-mm-candidate.rules                     97-bluetooth-serial.rules
60-persistent-input.rules         71-biosdevname.rules             80-net-name-slot.rules                    98-kexec.rules
60-persistent-serial.rules        71-seat.rules                    80-udisks2.rules                          98-rdma.rules
60-persistent-storage.rules       73-idrac.rules                   81-kvm-rhel.rules                         99-qemu-guest-agent.rules
60-persistent-storage-tape.rules  73-seat-late.rules               85-regulatory.rules                       99-systemd.rules
60-persistent-v4l.rules           75-net-description.rules         85-usbmuxd.rules
60-raw.rules                      75-probe_mtd.rules               90-alsa-restore.rules
61-accelerometer.rules            75-tty-description.rules         90-alsa-tools-firmware.rules

Important : Il vous est possible d'ajouter des règles si besoin est. Dans ce cas, créez un fichier 99-local.rules est éditez-le au lieu d'éditer les fichiers existants.

Comme indique le nom de chaque fichier, le contenu est composé de règles à l'attention d'udev. Le fichier des règles par défaut est le 50-udev-default.rules :

[root@centos7 ~]# cat /lib/udev/rules.d/50-udev-default.rules | more
# do not edit this file, it will be overwritten on update

SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"

# select "system RTC" or just use the first one
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"

ACTION!="add", GOTO="default_permissions_end"

SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty"
KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"

SUBSYSTEM=="mem", KERNEL=="mem|kmem|port", GROUP="kmem", MODE="0640"

SUBSYSTEM=="input", KERNEL=="js[0-9]*", MODE="0664"

SUBSYSTEM=="video4linux", GROUP="video"
SUBSYSTEM=="misc", KERNEL=="agpgart", GROUP="video"
--More--

Chaque règle prend la forme suivante :

KEY, [KEY, …] NAME [, SYMLINK]

Chaque KEY est un champ au format type=valeur qui doit correspondre à un périphérique unique. La valeur de type peut prendre plusieurs formes :

Type Description Exemples
BUS Type de bus usb, scsi, ide
KERNEL Le nom par défault du périphérique donné par le noyau hda, ttyUSB0, lp0
SUBSYSTEM Le nom noyau du sous-système, généralement identique à la valeur du BUS usb, scsi
DRIVER Le nom du pilote qui contrôle le périphérique usb-storage
ID Le numéro du périphérique sur son bus PCI bus id, USB id
PLACE Ne concerne que les périphériques USB et donne la position topologique du périphérique sur son bus S/O
SYSFS{filename} Le nom du fichier dans /sys pour le périphérique. Ce fichier contient le fabricant, le label, le numéro de série et UUID du périphérique. La vérification de jusqu'à 5 fichiers est possible par règle S/O
PROGRAM Ceci permet à Udev d'appeler un programme externe pour nommer un périphérique S/O
RESULT Valeur à comparer au résultat de PROGRAM S/O

NAME et SYMLINK sont utilisées pour stipuler ce que Udev doit faire avec le périphérique :

Type Description Exemples
NAME Le nome du nœud dans /dev S/O
SYMLINK Le ou les lien(s) symbolique(s) qui pointe(nt) vers le NAME S/O

La commande udevadm

Pour obtenir de l'information sur un périphérique il convient d'utiliser la commande udevadm :

[root@centos7 ~]# udevadm info --query=all -n /dev/sda
P: /devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda
N: sda
S: disk/by-id/ata-VBOX_HARDDISK_VBc40eec8a-49b6b6f3
E: DEVLINKS=/dev/disk/by-id/ata-VBOX_HARDDISK_VBc40eec8a-49b6b6f3
E: DEVNAME=/dev/sda
E: DEVPATH=/devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda
E: DEVTYPE=disk
E: ID_ATA=1
E: ID_ATA_FEATURE_SET_PM=1
E: ID_ATA_FEATURE_SET_PM_ENABLED=1
E: ID_ATA_SATA=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
E: ID_ATA_WRITE_CACHE=1
E: ID_ATA_WRITE_CACHE_ENABLED=1
E: ID_BUS=ata
E: ID_MODEL=VBOX_HARDDISK
E: ID_MODEL_ENC=VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
E: ID_PART_TABLE_TYPE=dos
E: ID_REVISION=1.0
E: ID_SERIAL=VBOX_HARDDISK_VBc40eec8a-49b6b6f3
E: ID_SERIAL_SHORT=VBc40eec8a-49b6b6f3
E: ID_TYPE=disk
E: MAJOR=8
E: MINOR=0
E: MPATH_SBIN_PATH=/sbin
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=957366

Les options de la commande

Les options de la commande udevadm sont :

[root@centos7 ~]# udevadm --help
Usage: udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]
  info         query sysfs or the udev database
  trigger      request events from the kernel
  settle       wait for the event queue to finish
  control      control the udev daemon
  monitor      listen to kernel and udev events
  hwdb         maintain the hardware database index
  test         test an event run
  test-builtin test a built-in command

[root@centos7 ~]# udevadm info --help
Usage: udevadm info OPTIONS
  --query=<type>             query device information:
      name                     name of device node
      symlink                  pointing to node
      path                     sys device path
      property                 the device properties
      all                      all values
  --path=<syspath>           sys device path used for query or attribute walk
  --name=<name>              node or symlink name used for query or attribute walk
  --root                     prepend dev directory to path names
  --attribute-walk           print all key matches while walking along the chain
                             of parent devices
  --device-id-of-file=<file> print major:minor of device containing this file
  --export                   export key/value pairs
  --export-prefix            export the key name with a prefix
  --export-db                export the content of the udev database
  --cleanup-db               cleanup the udev database
  --help

Système de fichiers /sys

Le système de fichiers virtuel /sys a été introduit avec le noyau Linux 2.6. Son rôle est de décrire le matériel pour udev.

Saisissez la commande suivante :

[root@centos7 ~]# ls -l /sys
total 0
drwxr-xr-x.   2 root root 0 Oct 28 09:40 block
drwxr-xr-x.  24 root root 0 Oct 28 09:40 bus
drwxr-xr-x.  45 root root 0 Oct 28 09:40 class
drwxr-xr-x.   4 root root 0 Oct 28 09:40 dev
drwxr-xr-x.  11 root root 0 Oct 28 09:40 devices
drwxr-xr-x.   5 root root 0 Oct 28 09:40 firmware
drwxr-xr-x.   6 root root 0 Oct 28 09:40 fs
drwxr-xr-x.   2 root root 0 Oct 28 09:40 hypervisor
drwxr-xr-x.   9 root root 0 Oct 28 09:40 kernel
drwxr-xr-x. 146 root root 0 Oct 28 09:40 module
drwxr-xr-x.   2 root root 0 Oct 28 09:40 power

Chaque répertoire contient des informations :

  • block
    • contient des informations sur les périphériques bloc
  • bus
    • contient des informations sur les bus de données
  • class
    • contient des informations sur des classes de matériel
  • devices
    • contient des informations sur la position des périphériques sur les bus
  • firmware
    • contient, entre autre, des informations sur l'ACPI
  • module
    • contient des informations sur les modules du noyau
  • power
    • contient des informations sur la gestion de l'énergie
  • fs
    • contient des informations sur les systèmes de fichiers

Pour illustrer ceci, saisissez la commande suivante :

[root@centos7 ~]# cat /sys/block/sda/sda1/size
409600

Ce chiffre correspond aux nombre de secteurs.

Limitation des ressources

ulimit

Les ressources disponibles aux utilisateurs peuvent être limitées par l'utilisation de la commande ulimit.

La commande ulimit gère deux types de limite, la limite hard en utilisant l'option -H et la limite soft en utilisant l'option -S. Seul root peut positionner une limite hard et ceci à condition que la limite ne dépasse pas les ressources réelles.

La limite soft est la limite imposée à l'utilisateur par défaut tandis que la limite hard est la limite que l'utilisateur peut atteindre en utilisant la commande ulimit lui-même.

L'utilisateur root peut paramétrer les limites accordées en éditant la fichier /etc/security/limits.conf :

[root@centos7 ~]# cat /etc/security/limits.conf
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
#That means for example that setting a limit for wildcard domain here
#can be overriden with a wildcard setting in a config file in the
#subdirectory, but a user specific setting here can be overriden only
#with a user specific setting in the subdirectory.
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - a user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open file descriptors
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority
#
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

# End of file

Important : La valeur de la limite peut être un nombre ou le mot unlimited.

Par exemple, si root inscrit les deux ligne suivantes dans le fichier /etc/security/limits.conf :

...
trainee                soft        nofile          1024
trainee                hard        nofile          4096
...

la limite du nombre de fichiers ouverts simultanément par trainee est de 1 024. Par contre, trainee a la possibilité d'augmenter cette limite jusqu'à 4 096 en utilisant la commande suivante :

$ ulimit -n 4096

Pour consulter la liste des limites actuelles, il convient d'utiliser la commande ulimit avec l'option -a :

[root@centos7 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 6929
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6929
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Options de la commande

Les options de ulimit sont :

[root@centos7 ~]# help ulimit
ulimit: ulimit [-SHacdefilmnpqrstuvx] [limit]
    Modify shell resource limits.
    
    Provides control over the resources available to the shell and processes
    it creates, on systems that allow such control.
    
    Options:
      -S	use the `soft' resource limit
      -H	use the `hard' resource limit
      -a	all current limits are reported
      -b	the socket buffer size
      -c	the maximum size of core files created
      -d	the maximum size of a process's data segment
      -e	the maximum scheduling priority (`nice')
      -f	the maximum size of files written by the shell and its children
      -i	the maximum number of pending signals
      -l	the maximum size a process may lock into memory
      -m	the maximum resident set size
      -n	the maximum number of open file descriptors
      -p	the pipe buffer size
      -q	the maximum number of bytes in POSIX message queues
      -r	the maximum real-time scheduling priority
      -s	the maximum stack size
      -t	the maximum amount of cpu time in seconds
      -u	the maximum number of user processes
      -v	the size of virtual memory
      -x	the maximum number of file locks
    
    If LIMIT is given, it is the new value of the specified resource; the
    special LIMIT values `soft', `hard', and `unlimited' stand for the
    current soft limit, the current hard limit, and no limit, respectively.
    Otherwise, the current value of the specified resource is printed.  If
    no option is given, then -f is assumed.
    
    Values are in 1024-byte increments, except for -t, which is in seconds,
    -p, which is in increments of 512 bytes, and -u, which is an unscaled
    number of processes.
    
    Exit Status:
    Returns success unless an invalid option is supplied or an error occurs.

Groupes de Contrôle

Les Groupes de Contrôles (Control Groups) aussi appelés CGroups, sont une nouvelle façon sous RHEL/CentOS 7 de contrôler et de limiter des ressources. Les groupes de contrôle permettent l'allocation de ressources, même d'une manière dynamique pendant que le système fonctionne, telles le temps processeur, la mémoire système, la bande réseau, ou une combinaison de ces ressources parmi des groupes de tâches (processus) définis par l'utilisateur et exécutés sur un système.

Les groupes de contrôle sont organisés de manière hiérarchique, comme des processus. Par contre, la comparaison entre les deux démontre que tandis que les processus se trouvent dans une arborescence unique descandant tous du processus init et héritant de l'environnement de leurs parents, les contrôles groupes peuvent être multiples donnant lieu à des arborescences ou hiérarchies multiples qui héritent de certains attributs de leurs groupes de contrôle parents.

Ces hiérarchies multiples et séparés sont necéssaires parce que chaque hiérarchie est attaché à un ou plusieurs sous-système(s) aussi appelés des Contrôleurs de Ressources ou simplement des Contrôleurs. Les contrôleurs disponibles sous RHEl/CentOS 7 sont :

  • blkio - utilisé pour établir des limites sur l'accès des entrées/sorties à partir et depuis des périphériques blocs,
  • cpu - utilisé pour fournir aux tâches des groupes de contrôle accès au CPU grâce au planificateur,
  • cpuacct - utilisé pour produire des rapports automatiques sur les ressources CPU utilisées par les tâches dans un groupe de contrôle,
  • cpuset - utilisé pour assigner des CPU individuels sur un système multicoeur et des noeuds de mémoire à des tâches dans un groupe de contrôle,
  • devices - utilisé pour autoriser ou pour refuser l'accès des tâches aux périphériques dans un groupe de contrôle,
  • freezer - utilisé pour suspendre ou pour réactiver les tâches dans un groupe de contrôle,
  • memory - utilisé pour établir les limites d'utilisation de la mémoire par les tâches d'un groupe de contrôle et pour génèrer des rapports automatiques sur les ressources rmémoire utilisées par ces tâches,
  • net_cls - utilisé pour repèrer les paquets réseau avec un identifiant de classe (classid) afin de permettre au contrôleur de trafic Linux, tc, d'identifier les paquets provenant d'une tâche particulière d'un groupe de contrôle.
  • perf_event - utilisé pour permettre le monitoring des CGroups avec l'outil perf,
  • hugetlb - utilisé pour limiter des ressources sur des pages de mémoire virtuelle de grande taille.

Pour visualiser les hiérarchies, il convient d'utiliser la commande suivante :

[root@centos7 ~]# lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls /sys/fs/cgroup/net_cls
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb

Sous RHEL/CentOS 7, Systemd organise les processus dans chaque CGroup. Par exemple tous les processus démarrés par le serveur Apache se trouveront dans le même CGroup, y compris les scripts CGI. Ceci implique que la gestion des ressources en utilisant des hiérarchies est couplé avec l'arborescence des unités de Systemd.

En haut de l'arborescence des unités de Systemd se trouve la tranche root - -.slice, dont dépend :

  • le system.slice - l'emplacement des services système,
  • le user.slice - l'emplacement des sessions des utilisateurs,
  • le machine.slice - l'emplacement des machines virtuelles et conteneurs.

En dessous des tranches peuvent se trouver :

  • des scopes - des processus crées par fork,
  • des services - des processus créés par une Unité.

Les slices peuvent être visualisés avec la commande suivante :

[root@centos7 ~]# systemctl list-units --type=slice
UNIT               LOAD   ACTIVE SUB    DESCRIPTION
-.slice            loaded active active Root Slice
system-getty.slice loaded active active system-getty.slice
system.slice       loaded active active System Slice
user-0.slice       loaded active active user-0.slice
user-1000.slice    loaded active active user-1000.slice
user.slice         loaded active active User and Session Slice

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

6 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

L'arborescence des unités de Systemd est la suivante :

[root@centos7 ~]# systemd-cgls
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
├─user.slice
│ └─user-1000.slice
│   └─session-2.scope
│     ├─ 5577 sshd: trainee [priv]
│     ├─ 6004 sshd: trainee@pts/0 
│     ├─ 6167 -bash
│     ├─ 6217 su -
│     ├─ 6245 -bash
│     ├─13457 systemd-cgls
│     └─13459 systemd-cgls
└─system.slice
  ├─upower.service
  │ └─3478 /usr/libexec/upowerd
  ├─polkit.service
  │ └─822 /usr/lib/polkit-1/polkitd --no-debug
  ├─wpa_supplicant.service
  │ └─821 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_suppli
  ├─crond.service
  │ └─793 /usr/sbin/crond -n
  ├─atd.service
  │ └─789 /usr/sbin/atd -f
  ├─tuned.service
  │ └─762 /usr/bin/python -Es /usr/sbin/tuned -l -P
  ├─simplegateway.service
  │ ├─  760 /bin/sh /opt/JWrapper-Remote Access/JWAppsSharedConfig/SimpleGatewayService/service_launch.sh
  │ ├─ 3202 /opt/JWrapper-Remote Access/JWrapper-Linux64JRE-00028603412-complete/bin/Remote Access -cp /opt/JWrapper-Remote Access/JWrapper-JWrapper-00041369502-complet
  │ ├─ 3384 /opt/JWrapper-Remote Access/JWrapper-Linux64JRE-00028603412-complete/bin/Remote Access Monitoring -cp /opt/JWrapper-Remote Access/JWrapper-JWrapper-00041369
  │ ├─13111 /bin/sh /opt/JWrapper-Remote Access/JWAppsSharedConfig/SimpleGatewayService/service_launch.sh
  │ └─13458 sleep 1
  ├─postfix.service
  │ ├─1810 /usr/libexec/postfix/master -w
  │ ├─1833 pickup -l -t unix -u
  │ └─1834 qmgr -l -t unix -u
  ├─cups.service
  │ └─756 /usr/sbin/cupsd -f
  ├─sshd.service
  │ └─755 /usr/sbin/sshd -D
  ├─docker.service
  │ ├─750 /bin/sh -c /usr/bin/docker-current daemon $OPTIONS            $DOCKER_STORAGE_OPTIONS            $DOCKER_NETWORK_OPTIONS            $ADD_REGISTRY            $
  │ ├─753 /usr/bin/docker-current daemon --selinux-enabled
  │ └─754 /usr/bin/forward-journald -tag docker
  ├─NetworkManager.service
  │ ├─ 678 /usr/sbin/NetworkManager --no-daemon
  │ └─1968 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-enp0s3.pid -lf /var/lib/NetworkManager/dhclient-3b386b69-23e8-4940-80e0-e16d346d43
  ├─abrt-xorg.service
  │ └─586 /usr/bin/abrt-watch-log -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrt-oops.service
  │ └─582 /usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG at list_del corruption list_add corruption do_IR
  ├─abrtd.service
  │ └─581 /usr/sbin/abrtd -d -s
  ├─dbus.service
  │ └─513 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  ├─chronyd.service
  │ └─525 /usr/sbin/chronyd
  ├─firewalld.service
  │ └─510 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
  ├─avahi-daemon.service
  │ ├─507 avahi-daemon: running [centos7.local
  │ └─530 avahi-daemon: chroot helpe
  ├─ModemManager.service
  │ └─506 /usr/sbin/ModemManager
  ├─smartd.service
  │ └─505 /usr/sbin/smartd -n -q never
  ├─libstoragemgmt.service
  │ └─494 /usr/bin/lsmd -d
  ├─gssproxy.service
  │ └─517 /usr/sbin/gssproxy -D
  ├─systemd-logind.service
  │ └─492 /usr/lib/systemd/systemd-logind
  ├─rsyslog.service
  │ └─488 /usr/sbin/rsyslogd -n
  ├─alsa-state.service
  │ └─487 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
  ├─auditd.service
  │ ├─463 /sbin/auditd -n
  │ ├─473 /sbin/audispd
  │ └─475 /usr/sbin/sedispatch
  ├─systemd-udevd.service
  │ └─381 /usr/lib/systemd/systemd-udevd
  ├─lvm2-lvmetad.service
  │ └─378 /usr/sbin/lvmetad -f
  ├─systemd-journald.service
  │ └─349 /usr/lib/systemd/systemd-journald
  └─system-getty.slice
    └─getty@tty1.service
      └─798 /sbin/agetty --noclear tty1 linux

En utilisant Systemd, plusieurs ressources peuvent être limitées :

  • CPUShares - par défault 1024,
  • MemoryLimit - limite exprimée en Mo ou en Go. Pas de valeur par défaut,
  • BlockIOWeight - valeur entre 10 et 1000. Pas de valeur par défaut,
  • StartupCPUShares - comme CPUShares mais uniquement appliqué pendant le démarrage,
  • StartupBlockIOWeight - comme BlockIOWeight mais uniquement appliqué pendant le démarrage,
  • CPUQuota - utilisé pour limiter le temps CPU, même quand le système ne fait rien.

Important : Consultez le manuel systemd.resource-control(5) pour voir les paramètres CGroup qui peuvent être passés à systemctl.

LAB #1 - Travailler avec les cgroups sous RHEL/CentOS 7

Créez un service appelé foo :

[root@centos7 ~]# vi /etc/systemd/system/foo.service
[root@centos7 ~]# cat /etc/systemd/system/foo.service
[Unit]
Description=The foo service that does nothing useful
After=remote-fs.target nss-lookup.target

[Service]
ExecStart=/usr/bin/sha1sum /dev/zero 
ExecStop=/bin/kill -WINCH ${MAINPID}

[Install]
WantedBy=multi-user.target

Consultez le statut du service foo :

[root@centos7 ~]# systemctl status foo.service
● foo.service - The foo service that does nothing useful
   Loaded: loaded (/etc/systemd/system/foo.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

Démarrez et actives le service :

[root@centos7 ~]# systemctl start foo.service
[root@centos7 ~]# systemctl enable foo.service
Created symlink from /etc/systemd/system/multi-user.target.wants/foo.service to /etc/systemd/system/foo.service.
[root@centos7 ~]# systemctl status foo.service
● foo.service - The foo service that does nothing useful
   Loaded: loaded (/etc/systemd/system/foo.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2016-06-15 13:13:17 CEST; 24s ago
 Main PID: 22256 (sha1sum)
   CGroup: /system.slice/foo.service
           └─22256 /usr/bin/sha1sum /dev/zero

Jun 15 13:13:17 centos7.fenestros.loc systemd[1]: Started The foo service that does nothing useful.
Jun 15 13:13:17 centos7.fenestros.loc systemd[1]: Starting The foo service that does nothing useful...

Notez que notre service a été placé dans la tranche system.slice :

[root@centos7 ~]# systemctl show -p Slice foo.service
Slice=system.slice

Utilisez ps pour voir le pourcentage du CPU utilisé par ce service :

[root@centos7 ~]# ps -p 22256 -o pid,comm,cputime,%cpu
  PID COMMAND             TIME %CPU
22256 sha1sum         00:00:46 94.8

Fixez maintenant la valeur de CPUShares pour ce service à 250 :

[root@centos7 ~]# systemctl set-property foo.service CPUShares=250

Cette limite est permenante et a été inscrite dans le fichier 50-CPUShares.conf qui se trouve dans le répertoire /etc/systemd/system/foo.service.d :

[root@centos7 ~]# ls /etc/systemd/system/foo.service.d
50-CPUShares.conf
[root@centos7 ~]# cat /etc/systemd/system/foo.service.d/50-CPUShares.conf 
[Service]
CPUShares=250

Important : En utilisant l'option –runtime avec la commande sysetmctl set-property il est possible d'appliquer la limite d'une manière provisoire.

Appliquez cette modification en rechargeant systemd et en re-démarrant le service foo.service :

[root@centos7 ~]# systemctl daemon-reload
[root@centos7 ~]# systemctl restart foo.service

Vérifiez maintenant que la limite a été appliquée :

[root@centos7 ~]# cat /sys/fs/cgroup/cpu/system.slice/foo.service/cpu.shares
250
[root@centos7 ~]# systemctl show -p MainPID foo.service
MainPID=27233
[root@centos7 ~]# cat /proc/27233/cgroup | grep foo
4:cpuacct,cpu:/system.slice/foo.service
1:name=systemd:/system.slice/foo.service

Créez maintenant le service bar :

[root@centos7 ~]# vi /etc/systemd/system/bar.service
[root@centos7 ~]# cat /etc/systemd/system/bar.service
[Unit]
Description=The bar service that does nothing useful
After=remote-fs.target nss-lookup.target

[Service]
ExecStart=/usr/bin/md5sum /dev/zero 
ExecStop=/bin/kill -WINCH ${MAINPID}

[Install]
WantedBy=multi-user.target

Fixez maintenant la limite de CPUShares pour ce service à 2000 :

[root@centos7 ~]# systemctl set-property bar.service CPUShares=2000
Failed to set unit properties on bar.service: Unit bar.service is not loaded.
[root@centos7 ~]# systemctl start bar.service
[root@centos7 ~]# systemctl enable bar.service
Created symlink from /etc/systemd/system/multi-user.target.wants/bar.service to /etc/systemd/system/bar.service.
[root@centos7 ~]# systemctl set-property bar.service CPUShares=2000

Appliquez la limite :

[root@centos7 ~]# systemctl daemon-reload
[root@centos7 ~]# systemctl restart bar.service
[root@centos7 ~]# systemctl status bar.service
● bar.service - The bar service that does nothing useful
   Loaded: loaded (/etc/systemd/system/bar.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/bar.service.d
           └─50-CPUShares.conf
   Active: active (running) since Wed 2016-06-15 13:37:54 CEST; 9s ago
 Main PID: 29515 (md5sum)
   CGroup: /system.slice/bar.service
           └─29515 /usr/bin/md5sum /dev/zero

Jun 15 13:37:54 centos7.fenestros.loc systemd[1]: Started The bar service that does nothing useful.
Jun 15 13:37:54 centos7.fenestros.loc systemd[1]: Starting The bar service that does nothing useful...

Re-démarrer les services foo et bar :

[root@centos7 ~]# systemctl restart foo.service
[root@centos7 ~]# systemctl status foo.service
● foo.service - The foo service that does nothing useful
   Loaded: loaded (/etc/systemd/system/foo.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/foo.service.d
           └─50-CPUShares.conf
   Active: active (running) since Wed 2016-06-15 13:50:08 CEST; 11s ago
 Main PID: 652 (sha1sum)
   CGroup: /system.slice/foo.service
           └─652 /usr/bin/sha1sum /dev/zero

Jun 15 13:50:08 centos7.fenestros.loc systemd[1]: Started The foo service that does nothing useful.
Jun 15 13:50:08 centos7.fenestros.loc systemd[1]: Starting The foo service that does nothing useful...
[root@centos7 ~]# systemctl restart bar.service
[root@centos7 ~]# systemctl status bar.service
● bar.service - The bar service that does nothing useful
   Loaded: loaded (/etc/systemd/system/bar.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/bar.service.d
           └─50-CPUShares.conf
   Active: active (running) since Wed 2016-06-15 13:50:38 CEST; 12s ago
 Main PID: 810 (md5sum)
   CGroup: /system.slice/bar.service
           └─810 /usr/bin/md5sum /dev/zero

Jun 15 13:50:38 centos7.fenestros.loc systemd[1]: Started The bar service that does nothing useful.
Jun 15 13:50:38 centos7.fenestros.loc systemd[1]: Starting The bar service that does nothing useful...

Utilisez ps pour voir le pourcentage du CPU utilisé par les deux services :

[root@centos7 ~]# ps -p 652,810 -o pid,comm,cputime,%cpu
  PID COMMAND             TIME %CPU
  652 sha1sum         00:00:08  9.7
  810 md5sum          00:00:45 78.9

Copyright © 2023 Hugh Norris.

Menu