Processus et démarrage

Objectifs de certification

Linux Essentials

RHCSA EX200

  • 2.Utiliser des systèmes en cours d'exécution
  • 2.1. Démarrer, redémarrer et éteindre un système normalement
  • 2.2. Démarrer des systèmes dans différentes cibles manuellement
  • 2.3. Interrompre le processus de démarrage afin d'obtenir l'accès à un système
  • 2.4. Identifier les processus exigeants en processeur/mémoire, ajuster la priorité des processus à l'aide de la commande renice et arrêter des processus
  • 5.Déployer, configurer et gérer des systèmes
  • 5.3. Démarrer et arrêter des services, et configurer des services pour qu'ils se lancent automatiquement au démarrage
  • 5.4. Configurer des systèmes pour démarrer automatiquement dans une cible spécifique
  • 5.9. Configurer des services réseau afin qu'ils se lancent automatiquement au démarrage
  • 5.11. Installer et mettre à jour des paquetages logiciels depuis Red Hat Network, un dépôt distant, ou depuis le système de fichiers local
  • 5.13. Modifier le chargeur de démarrage du système

RHCE EX300

  1. System configuration and management
  2. 1.5. Use /proc/sys and sysctl to modify and set kernel runtime parameters.
  3. 1.8. Produce and deliver reports on system utilization (processor, memory, disk, and network).

LPIC 1

LPIC 2

1. Noyau Linux

1.1. Généralités

Source : https://fr.wikipedia.org/wiki/Noyau_Linux

Le noyau Linux est un noyau de système d'exploitation de type UNIX. Le noyau Linux est un logiciel libre développé essentiellement en langage C par des milliers de bénévoles et salariés communiquant par Internet.

Le noyau est le cœur du système, c'est lui qui s'occupe de fournir aux logiciels une interface pour utiliser le matériel. Le noyau Linux a été créé en 1991 par Linus Torvalds pour les compatibles PC construits sur l'architecture processeur x86. Depuis, il a été porté sur nombre d'architectures dont m68k, PowerPC, StrongARM, Alpha, SPARC, MIPS, etc. Il s'utilise dans une très large gamme de matériel, des systèmes embarqués aux superordinateurs, en passant par les ordinateurs personnels.

Ses caractéristiques principales sont d'être multitâche et multi-utilisateur. Il respecte les normes POSIX ce qui en fait un digne héritier des systèmes UNIX. Au départ, le noyau a été conçu pour être monolithique. Ce choix technique fut l'occasion de débats enflammés entre Andrew S. Tanenbaum, professeur à l'université libre d'Amsterdam qui avait développé Minix, et Linus Torvalds. Andrew Tanenbaum arguant que les noyaux modernes se devaient d'être des micro-noyaux et Linus répondant que les performances des micronoyaux n'étaient pas bonnes. Depuis sa version 2.0, le noyau, bien que n'étant pas un micro-noyau, est modulaire, c'est-à-dire que certaines fonctionnalités peuvent être ajoutées ou enlevées du noyau à la volée (en cours d'utilisation). (Source : https://fr.wikipedia.org/wiki/Noyau_Linux).

1.2. Développement du noyau Linux

Si au début de son histoire le développement du noyau Linux était assuré par des développeurs bénévoles, les principaux contributeurs sont aujourd'hui un ensemble d'entreprises, souvent concurrentes, comme Red Hat, Novell, IBM ou Intel.

La licence du noyau Linux est la licence publique générale GNU dans sa version 2. Cette licence est libre, ce qui permet d'utiliser, copier et modifier le code source selon ses envies ou ses besoins. Ainsi, quiconque a les connaissances nécessaires peut participer aux tests et à l'évolution du noyau.

Linus Torvalds, créateur du noyau Linux, est le mainteneur officiel depuis le début en 1991. Il est une sorte de « dictateur bienveillant », l'autorité en termes de choix techniques et organisationnels. Les différentes versions du noyau publiées par Linus Torvalds s'appellent « mainline » ou « vanilla » en anglais. Ce sont les noyaux vanilla qui sont intégrés par les distributeurs, avec parfois l'addition de quelques patchs de sécurité, de corrections de bogue ou d'optimisations.

Linus Torvalds a apporté un changement radical dans la façon dont les systèmes d'exploitation sont développés, en utilisant pleinement la puissance du réseau Internet.

Le processus de développement de Linux est public sur Internet : les sources du noyau y sont visibles par tous, les modifications de ces sources sont publiées et revues sur Internet et sont également visibles de tous. Un cycle de développement incrémental et rapide a été adopté depuis le début (aujourd'hui une nouvelle version est publiée toutes les 9 semaines environ), qui a permis de construire autour de Linux et d'Internet par couches successives une communauté dynamique composée de développeurs, de sociétés et d'utilisateurs.

Les numéros de version du noyau sont composés de trois nombres : le premier est le numéro majeur, le second le numéro mineur. Avant l'apparition des versions 2.6.x, les numéros mineurs pairs indiquaient une version stable et les numéros mineurs impairs une version de développement. Ainsi, les versions 2.2, 2.4 sont stables, les versions 2.3 et 2.5 sont des versions de développement. Cependant, depuis la version 2.6 du noyau, ce modèle de numérotation stable/développement a été abandonné et il n'y a donc plus de signification particulière aux numéros mineurs pairs ou impairs. Le troisième nombre indique une révision, ce qui correspond à des corrections de bogues, de sécurité ou un ajout de fonctionnalité, par exemple 2.2.26, 2.4.30 ou 2.6.11. Le passage à la version 3.0 fut décidé par Linus Torvalds à l'occasion des 20 ans du noyau Linux, même si la véritable raison fut plutôt arbitraire. La dernière version stable en mai 2017 est 4.11.1.

Cette page https://fr.wikipedia.org/wiki/Noyau_Linux#Chronologie donne une idée de l'évolution des intégrations au noyau.

1.3. Version courante du noyau

La commande uname permet de connaître la version courante du noyau, mais aussi le type d'architecture et le nom de l'ordinateur.

Par exemple, sur une Centos 7 :

uname -a
Linux srv.linuxlab.be 3.10.0-327.18.2.el7.x86_64 #1 SMP Thu May 12 11:03:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
uname -r
3.10.0-327.18.2.el7.x86_64
uname -m
x86_64
uname -n
srv.linuxlab.be
uname -p
x86_64
uname -s
Linux
uname -i
x86_64
uname -o
GNU/Linux
uname -v
#1 SMP Thu May 12 11:03:55 UTC 2016

Le fichier /proc/cmdline informe notamment du noyau utilisé par le système.

cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-327.18.2.el7.x86_64 root=/dev/md1 ro net.ifnames=0 rd.md.uuid=c2dd5ffb:ee7dff79:a4d2adc2:26fd5302 kvm-intel.nested=1

1.4. Messages du noyau

Le noyau écrit ses événements dans et via dmesg qui sont consultés après une nouvelle installation.

# head /var/log/messages
Aug 26 11:01:32 sb1 rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="594" x-info="http://www.rsyslog.com"] start
Aug 26 11:01:25 sb1 journal: Runtime journal is using 6.2M (max allowed 49.6M, trying to leave 74.4M free of 490.3M available → current limit 49.6M).
Aug 26 11:01:25 sb1 journal: Runtime journal is using 6.2M (max allowed 49.6M, trying to leave 74.4M free of 490.3M available → current limit 49.6M).
Aug 26 11:01:25 sb1 kernel: Initializing cgroup subsys cpuset
Aug 26 11:01:25 sb1 kernel: Initializing cgroup subsys cpu
Aug 26 11:01:25 sb1 kernel: Initializing cgroup subsys cpuacct
Aug 26 11:01:25 sb1 kernel: Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015
Aug 26 11:01:25 sb1 kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos_tmp--30faa133-root ro crashkernel=auto rd.lvm.lv=centos_tmp-30faa133/root rd.lvm.lv=centos_tmp-30faa133/swap console=ttyS0,115200n8 LANG=en_US.UTF-8
Aug 26 11:01:25 sb1 kernel: e820: BIOS-provided physical RAM map:
Aug 26 11:01:25 sb1 kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable

dmesg (pour l'anglais "display message", "afficher message" en français) est une commande sur les systèmes d'exploitation de type Unix qui affiche la mémoire tampon de message du noyau. Elle permet de vérifier le comportement du noyau, notamment le sort réservé aux pilotes de périphérique (modules du noyau). On trouvera le contenu dans le fichier /var/log/dmesg ou encore dans /var/log/kern.log (Debian/Ubuntu) .

# dmesg

Peut donner :

[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos_tmp--30faa133-root ro crashkernel=auto rd.lvm.lv=centos_tmp-30faa133/root rd.lvm.lv=centos_tmp-30faa133/swap console=ttyS0,115200n8 LANG=en_US.UTF-8
[ 0.000000] e820: BIOS-provided physical RAM map
...

Pour une recherche plus précise, par exemple :

# dmesg | grep vda
[ 1.938760] vda: vda1 vda2
[ 8.081330] XFS (vda1): Mounting V4 Filesystem
[ 8.343152] XFS (vda1): Ending clean mount
[ 8.345418] SELinux: initialized (dev vda1, type xfs), uses xattr
# dmesg | grep kvm
[ 0.000000] kvm-clock: Using msrs 4b564d01 and 4b564d00
[ 0.000000] kvm-clock: cpu 0, msr 0:3ff87001, primary cpu clock
[ 0.000000] kvm-clock: using sched offset of 5508623650 cycles
[ 0.000000] kvm-stealtime: cpu 0, msr 3fc0d240
[ 0.746986] Switching to clocksource kvm-clock
[ 1.426438] systemd[1]: Detected virtualization kvm.

1.5. Documentation du noyau

Sous Centos/RHEL, l'accès local à la documentation nécessite l'installation du paquet kernel-doc. Selon la version du système, les fichiers de documentation seront copiés dans un répertoire du type /usr/share/doc/kernel-doc-3.10.0/Documentation/.

Sous Debian/Ubuntu, la documentation accompagne d'emblée le noyau. Elle se situe dans le répertoire Documentation du noyau. /usr/src/linux-headers-$(uname -r)/Documentation

La documentation Web se trouve sur http://www.kernel.org/doc.

1.6. Configuration de paramètres du noyau

On peut changer les paramètres du noyau à chaud en écrivant directement les valeurs dans les fichiers adéquats (/proc/sys/) ou en utilisant le binaire sysctl.

Par exemple, on peut vérifier si le routage IPv4 est activé :

# cat /proc/sys/net/ipv4/ip_forward
0

Il suffit de placer la valeur à 1 dans ce fichier pour activer le routage :

# echo 1 > /proc/sys/net/ipv4/ip_forward
# cat /proc/sys/net/ipv4/ip_forward
1

On aurait pu exécuter la même opération avec sysctl.

1.7. Sysctl

sysctl est le programme qui permet de modifier à chaud les paramètres du noyau.

# 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).
  • sysctl -a affiche toutes les variables avec leur valeur
  • sysctl -n [variable] affiche valeur d'une variable comme par exemple sysctl -n net.ipv4.ip_forward.

Pour modifier un paramètre du noyau avec sysctl :

# sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Enfin, pour rendre ces paramétrages permanents :on peut valoriser ces variables dans le fichiers /etc/sysctl.conf.

Ici un exemple Ubuntu 12.04 par défaut :

# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3

##############################################################3
# Functions previously found in netbase
#

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1


###################################################################
# Additional settings - these settings can improve the network
# security of the host and prevent against some network attacks
# including spoofing attacks and man in the middle attacks through
# redirection. Some network environments, however, require that these
# settings are disabled so review and enable them as needed.
#
# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
#net.ipv4.conf.all.send_redirects = 0
#
# Do not accept IP source route packets (we are not a router)
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#

2. Configuration matérielle

2.1. Le système de fichiers virtuel /proc

  • /proc n'existe pas sur le disque dur, il est fournit dynamiquement par le noyau, d'où le nom de virtuel.
  • Il permet de fournir des informations sur ce que voit le noyau.
  • En outre pour accéder à certains renseignements il sera nécessaire de monter obligatoirement /proc :
# mount | grep \/proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
  • Les commandes ps, top, uptime (et bien d'autres) utilisent /proc pour récupérer des informations du système.

2.2. Informations de bas niveau

cat /proc/interrupts
cat /proc/dma; cat /proc/ioports
cat /proc/devices

2.3. Information sur les bus

# lspci
# lsusb -t

2.4. Informations CPU, mémoires, RAM, etc.

cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/loadavg
cat /proc/partitions
cat /proc/version
cat /proc/mounts
cat /proc/stat
cat /proc/uptime
cat /proc/swaps

mais aussi,

lscpu
free -m
vmstat -s

2.5. Fichier /proc/$PID

  • /proc contient aussi les numéros des processus et les informations les concernant, par exemple sur un processus SSHD :
ps aux | grep sshd
root 1204 0.0 0.0 61364 3080 ? Ss 2014 0:00 /usr/sbin/sshd -D
root 25741 0.0 0.1 105632 4264 ? Ss 10:06 0:00 sshd: francois [priv]
francois 25840 0.0 0.0 105632 2168 ? S 10:07 0:02 sshd: francois@pts/5
root 25986 0.0 0.0 11768 916 pts/5 S+ 11:27 0:00 grep --color=auto sshd
cat /proc/1204/status
Name:   sshd
State:  S (sleeping)
Tgid:   1204
Ngid:   0
Pid:    1204
PPid:   1
...

2.6. Périphériques /dev

  • Linux accède aux périphériques à partir de fichiers situés dans /dev.

  • Les disques durs :

ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 déc 15 23:40 /dev/sda
brw-rw---- 1 root disk 8, 1 déc 15 23:40 /dev/sda1
brw-rw---- 1 root disk 8, 2 déc 15 23:40 /dev/sda2
brw-rw---- 1 root disk 8, 5 déc 15 23:40 /dev/sda5
brw-rw---- 1 root disk 8, 16 déc 15 23:40 /dev/sdb

Où nous avons des fichiers de type block (b) avec un numéro primaire 8 et un numéro secondaire qui identifie la partitions pour le noyau.

  • La commande blkid permet d’identifier les périphériques block par leur UUID :
blkid
/dev/sda1: UUID="67407b6c-4bbc-4b52-b071-fee802cfbf2b" TYPE="xfs"
/dev/sda2: UUID="2e468ba5-a730-4988-b8e6-3073a048227f" TYPE="swap"

2.7. Tous les autres périphériques /dev

  • Ce dossier contient tous les périphériques matériels comme un lecteur cdrom, une carte son, une carte réseau, etc...
  • Il contient également les pseudo-périphériques. Quelques exemples :
  • /dev/zero génére des zéros
  • /dev/random génère de l'aléatoire
  • /dev/null constitue un trou noir à octets, et notamment utilisé pour se débarrasser des fichiers et des affichages
  • /dev/loop0 permet de créer de faux périphériques de type block (stockage) à partir de fichiers créés avec la commande dd
  • Si on liste le contenu de /dev :
# ls -l /dev | more

Exercices pratiques : se connecter en console sur un routeur, un commutateur, un ordinateur embarqué. Indications : commande screen, vitesse, /dev/ttyS0, /dev/ttyUSB0. Comment connecter deux ordinateurs Linux via leur port série ou USB ?

2.8. Sysfs

  • Sysfs est un système de fichiers virtuel introduit par le noyau Linux 2.6. Sysfs permet d'exporter depuis l'espace noyau vers l'espace utilisateur des informations sur les périphériques du système et leurs pilotes, et est également utilisé pour configurer certaines fonctionnalités du noyau.

3. Modules et fichiers du noyau

3.1. Modules du noyau

  • Un module du noyau est un pilote de périphérique utilisé par le noyau pour utiliser le matériel et les logiciels.
  • lsmod permet de voir les modules chargés dans le noyau :
lsmod
  • Emplacements des modules du noyau (Centos 7 noyau 3.10.0-327.*el7.x86_64)
ls /lib/modules
3.10.0-327.18.2.el7.x86_64 3.10.0-327.el7.x86_64
ls -l /lib/modules/3.10.0-327.18.2.el7.x86_64/
total 2704
lrwxrwxrwx. 1 root root 43 11 jun 16:53 build -> /usr/src/kernels/3.10.0-327.18.2.el7.x86_64
drwxr-xr-x. 2 root root 6 12 mai 13:15 extra
drwxr-xr-x. 11 root root 4096 11 jun 16:53 kernel
-rw-r--r--. 1 root root 706371 11 jun 16:53 modules.alias
-rw-r--r--. 1 root root 682782 11 jun 16:53 modules.alias.bin
-rw-r--r--. 1 root root 1288 12 mai 13:16 modules.block
-rw-r--r--. 1 root root 5995 12 mai 13:13 modules.builtin
-rw-r--r--. 1 root root 7744 11 jun 16:53 modules.builtin.bin
-rw-r--r--. 1 root root 218218 11 jun 16:53 modules.dep
-rw-r--r--. 1 root root 316220 11 jun 16:53 modules.dep.bin
-rw-r--r--. 1 root root 339 11 jun 16:53 modules.devname
-rw-r--r--. 1 root root 108 12 mai 13:16 modules.drm
-rw-r--r--. 1 root root 100 12 mai 13:16 modules.modesetting
-rw-r--r--. 1 root root 1522 12 mai 13:16 modules.networking
-rw-r--r--. 1 root root 84666 12 mai 13:13 modules.order
-rw-r--r--. 1 root root 89 11 jun 16:53 modules.softdep
-rw-r--r--. 1 root root 311931 11 jun 16:53 modules.symbols
-rw-r--r--. 1 root root 387108 11 jun 16:53 modules.symbols.bin
lrwxrwxrwx. 1 root root 5 11 jun 16:53 source -> build
drwxr-xr-x. 2 root root 6 12 mai 13:15 updates
drwxr-xr-x. 2 root root 91 11 jun 16:53 vdso
drwxr-xr-x. 2 root root 6 12 mai 13:15 weak-updates
ls /lib/modules/3.10.0-327.18.2.el7.x86_64/kernel/fs
binfmt_misc.ko ceph dlm fat gfs2 lockd nfs_common overlayfs udf
btrfs cifs exofs fscache isofs mbcache.ko nfsd pstore xfs
cachefiles cramfs ext4 fuse jbd2 nfs nls squashfs
  • Dépendances des modules entre eux :
depmod 3.10.0-327.18.2.el7.x86_64
head /lib/modules/3.10.0-327.18.2.el7.x86_64/modules.dep
kernel/arch/x86/kernel/cpu/mcheck/mce-inject.ko:
kernel/arch/x86/kernel/test_nx.ko:
kernel/arch/x86/crypto/ablk_helper.ko: kernel/crypto/cryptd.ko
kernel/arch/x86/crypto/glue_helper.ko:
kernel/arch/x86/crypto/camellia-x86_64.ko: kernel/crypto/xts.ko kernel/crypto/lrw.ko kernel/crypto/gf128mul.ko kernel/arch/x86/crypto/glue_helper.ko
kernel/arch/x86/crypto/blowfish-x86_64.ko: kernel/crypto/blowfish_common.ko
kernel/arch/x86/crypto/twofish-x86_64.ko: kernel/crypto/twofish_common.ko
kernel/arch/x86/crypto/twofish-x86_64-3way.ko: kernel/arch/x86/crypto/twofish-x86_64.ko kernel/crypto/twofish_common.ko kernel/crypto/xts.ko kernel/crypto/lrw.ko kernel/crypto/gf128mul.ko kernel/arch/x86/crypto/glue_helper.ko
kernel/arch/x86/crypto/salsa20-x86_64.ko:
kernel/arch/x86/crypto/serpent-sse2-x86_64.ko: kernel/crypto/xts.ko kernel/crypto/serpent_generic.ko kernel/crypto/lrw.ko kernel/crypto/gf128mul.ko kernel/arch/x86/crypto/glue_helper.ko kernel/arch/x86/crypto/ablk_helper.ko kernel/crypto/cryptd.ko

3.2. Charger / décharger un module

On peut charger un pilote de périphérique. Toute une série sont déjà pour les cartes réseau dans /lib/modules/$(uname -r)/kernel/drivers/net :

ls /lib/modules/$(uname -r)/kernel/drivers/net
appletalk dummy.ko geneve.ko ipvlan mii.ko plip sungem_phy.ko vrf.ko xen-netback
arcnet eql.ko hamradio irda netconsole.ko ppp team vxlan.ko
bonding ethernet hyperv macvlan.ko nlmon.ko rionet.ko usb wan
caif fddi ieee802154 macvtap.ko ntb_netdev.ko sb1000.ko veth.ko wimax
can fjes ifb.ko mdio.ko phy slip vmxnet3 wireless

Sous Ubuntu 14.04 dans une machine virtuelle VMWare, on peut par exemple tenter de charger le pilote d'une carte vmxnet3 :

$ sudo insmod /proc/lib/modules/4.4.0-31-generic/kernel/drivers/net/vmxnet3/vmxnet3.ko
$ modprobe vmxnet3
$ lsmod | grep vmxnet3
vmxnet3 57344 0
$ sudo rmmod vmxnet3

  • On peut charger ou décharger un module du noyau avec modprobe au lieu de la commande insmod :
# modprobe msdos
# lsmod | grep msdos
msdos 17332 0
fat 65913 1 msdos
# rmmod msdos
# lsmod | grep msdos

3.3. UDEV

3.4. Fichiers du noyau

Les fichiers de démarrage du système se trouvent dans /boot (ici une Centos7) :

# ls -lah /boot
total 72M
dr-xr-xr-x. 4 root root 4.0K Aug 28 15:53 .
dr-xr-xr-x. 17 root root 4.0K Aug 26 11:00 ..
-rw-r--r--. 1 root root 124K Nov 19 2015 config-3.10.0-327.el7.x86_64
drwxr-xr-x. 2 root root 26 Aug 26 10:56 grub
drwx------. 6 root root 104 Aug 26 10:59 grub2
-rw-r--r--. 1 root root 42M Aug 26 10:58 initramfs-0-rescue-9504b93066e14193b0bd32e69e26e75d.img
-rw-------. 1 root root 17M Aug 26 11:01 initramfs-3.10.0-327.el7.x86_64kdump.img
-rw-r--r--. 1 root root 589K Aug 26 10:57 initrd-plymouth.img
-rw-r--r--. 1 root root 247K Nov 19 2015 symvers-3.10.0-327.el7.x86_64.gz
-rw-------. 1 root root 2.9M Nov 19 2015 System.map-3.10.0-327.el7.x86_64
-rwxr-xr-x. 1 root root 5.0M Aug 26 10:58 vmlinuz-0-rescue-9504b93066e14193b0bd32e69e26e75d
-rwxr-xr-x. 1 root root 5.0M Nov 19 2015 vmlinuz-3.10.0-327.el7.x86_64
-rw-r--r--. 1 root root 166 Nov 19 2015 .vmlinuz-3.10.0-327.el7.x86_64.hmac
  • Fichier /boot/vmlinuz-* est le noyau Linux compressé qui sera utilisé après démarrage :
# ls -lh /boot/vmlinuz-*
-rwxr-xr-x. 1 root root 5.0M Aug 26 10:58 vmlinuz-0-rescue-9504b93066e14193b0bd32e69e26e75d
-rwxr-xr-x. 1 root root 5.0M Nov 19 2015 vmlinuz-3.10.0-327.el7.x86_64
  • Fichier initrd (INITial RamDisk) est une image d'un système d'exploitation minimal initialisé au démarrage du système.
# mkdir /tmp/initrd
# cd /tmp/initrd/
# cp /boot/initramfs-3.10.0-327.el7.x86_64.img /tmp/initrd/initramfs-3.10.0-327.el7.x86_64.gz
# gunzip initramfs-3.10.0-327.el7.x86_64.gz
# cpio -id < initramfs-3.10.0-327.el7.x86_64

On peut vérifier les fichiers :

ls -l /tmp/initrd/
total 43016
lrwxrwxrwx. 1 root root 7 Aug 28 15:54 bin -> usr/bin
drwxr-xr-x. 2 root root 42 Aug 28 15:54 dev
drwxr-xr-x. 12 root root 4096 Aug 28 15:54 etc
lrwxrwxrwx. 1 root root 23 Aug 28 15:54 init -> usr/lib/systemd/systemd
-rw-------. 1 root root 44039680 Aug 26 10:59 initramfs-3.10.0-327.el7.x86_64
lrwxrwxrwx. 1 root root 7 Aug 28 15:54 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Aug 28 15:54 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Aug 28 15:54 proc
drwxr-xr-x. 2 root root 6 Aug 28 15:54 root
drwxr-xr-x. 2 root root 6 Aug 28 15:54 run
lrwxrwxrwx. 1 root root 8 Aug 28 15:54 sbin -> usr/sbin
-rwxr-xr-x. 1 root root 3041 Aug 28 15:54 shutdown
drwxr-xr-x. 2 root root 6 Aug 28 15:54 sys
drwxr-xr-x. 2 root root 6 Aug 28 15:54 sysroot
drwxr-xr-x. 2 root root 6 Aug 28 15:54 tmp
drwxr-xr-x. 7 root root 61 Aug 28 15:54 usr
drwxr-xr-x. 2 root root 27 Aug 28 15:54 var
  • On trouvera aussi le fichier System.map qui contient une table avec les symboles et leur adresse mémoire. Un symbole peut être le nom d'une variable ou d'une fonction. Cette table peut être utile pour le "crash" du noyau.
# head /boot/System.map-3.10.0-327.el7.x86_64
0000000000000000 A VDSO32_PRELINK
0000000000000000 D __per_cpu_start
0000000000000000 D irq_stack_union
0000000000000000 A xen_irq_disable_direct_reloc
0000000000000000 A xen_save_fl_direct_reloc
0000000000000040 A VDSO32_vsyscall_eh_frame_size
00000000000001e9 A kexec_control_code_size
00000000000001f0 A VDSO32_NOTE_MASK
0000000000000400 A VDSO32_sigreturn
0000000000000410 A VDSO32_rt_sigreturn
  • Un fichier de configuration de compilation du noyau actuel est aussi présent dans le répertoire /boot.
# head /boot/config-3.10.0-327.el7.x86_64
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 3.10.0-327.el7.x86_64 Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

4. Démarrage du système

4.1. Processus de démarrage

Source : https://commons.wikimedia.org/wiki/File:Linux_startup_process_wip.svg

4.2. Le BIOS

Le BIOS - Basic Input Output System (système d'entrée sortie de base) est essentiel à tout PC, il se trouve généralement dans une mémoire morte ou ROM qui est directement implantée sur la carte mère du PC. Il est associé à une mémoire sauvegardée par une petite pile bouton sur la carte mère (le “setup” qui est la sauvegarde de la configuration).

Si votre PC ne démarre pas (ou ne boot pas) c'est à cause du BIOS et de sa configuration (le setup). On peut accéder au setup et le modifier en pressant une touche dès la mise sous tension du PC. Selon les fabricants, cette touche est Suppr, F2, F10 … (la touche à utiliser est très brièvement affichée au tout début du démarrage).

Mais quelle est donc sa fonction ?

Le BIOS teste le matériel et y applique les réglages mémorisés dans le setup, tout en s'assurant qu'il n'existe pas de dis-fonctionnement matériel et que tout est présent dans la machine, mémoire CPU principalement. Ensuite il regarde la présence des périphériques nécessaires au boot : lecteur de disquette, cd rom, dvd rom, clef usb, mais surtout disque dur. Si vous avez installé un système d'exploitation Linux ou Windows, le BIOS est normalement configuré pour activer le MBR de celui ci, les étapes du démarrage peuvent alors commencer ... (http://www.linuxpedia.fr/doku.php/util/boot)

4.3. Le MBR ( Boot Primaire )

Le Master Boot Record ou MBR (parfois aussi appelé “Zone amorce”) est le nom donné au premier secteur adressable d'un disque dur (cylindre 0, tête 0 et secteur 1, ou secteur 0 en adressage logique) dans le cadre d'un partitionnement Intel. Sa taille est de 512 octets. Le MBR contient la table des partitions (les 4 partitions primaires) du disque dur. Il contient également une routine d'amorçage dont le but est de charger le système d'exploitation (ou le boot loader/chargeur d'amorçage s'il existe) présent sur la partition active.

Mais quelle est donc sa fonction ?

Il s'agit du boot primaire , la taille du MBR étant limitée à 512 octets, ce petit programme n'a pour fonction que de lancer le boot secondaire qui occupe un plus gros espace ailleurs sur le disque.

4.4. Le Boot Secondaire

Il a pour fonction d'activer le système d'exploitation, c'est à dire d'activer le noyau. Les boot primaire et secondaire constituent ce qu'on appelle le chargeur ou loader tel que Lilo ou plus fréquemment Grub.

5. Chargeur de démarrage Grub2

  • GNU GRUB (acronyme signifiant en anglais « GRand Unified Bootloader ») est un programme d’amorçage GNU qui gère la gestion du chargement des systèmes d’exploitation disponibles sur le système. Il permet à l'utilisateur de choisir quel système démarrer. Il intervient après allumage de l'ordinateur et avant le chargement du système d'exploitation.
  • GRUB dans sa version 2 (entièrement réécrite) est un chargeur de démarrage libre au même titre que Das U-Boot ou Barebox pour du matériel embarqué.
  • Ses nombreux avantages, son histoire et son fonctionnement sont décrits dans la page : http://doc.fedora-fr.org/wiki/GRUB2_:_Les_bases_pour_Fedora

5.1. Fichiers Grub2

La configuration de GRUB2 est composé de trois principales dans des fichiers inclus :

  1. /etc/default/grub - le fichier contenant les paramètres du menu de GRUB 2,
  2. /etc/grub.d/ - le répertoire contenant les scripts de création du menu GRUB 2, permettant notamment de personnaliser le menu de démarrage,
  3. /boot/grub2/grub.cfg - le fichier de configuration final de GRUB 2, non modifiable. (/boot/grub/grub.cfg sous Debian).

Ce dernier fichier est généré automatiquement par le programme grub2-mkconfig à partir des scripts /etc/default/grubet /etc/grub.d/ :

Voici le contenu du fichier /etc/default/grub avec les principales variables d'environnement :

# 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="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
  • Sous Debian/Ubuntu pour générer le fichier de configuration de GRUB2 :
update-grub
  • Sous Centos 7 :
grub2-mkconfig -o /boot/grub2/grub.cfg

5.2. Gestion

  • Obtenir la version du noyau courant :
# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
  • Pour connaître la liste des entrées du menu :
# grep ^menu /boot/grub2/grub.cfg
menuentry 'CentOS Linux (3.10.0-327.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-d83f59c0-e642-4682-87d4-de2c290a6484' {
menuentry 'CentOS Linux (0-rescue-647df4ed1d8e48c48d765271858a9a93) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-647df4ed1d8e48c48d765271858a9a93-advanced-d83f59c0-e642-4682-87d4-de2c290a6484' {

7.3. Exemple de modification de grub2

Le script ubuntu-grub-console.sh configure Grub en activant une console texte.

#!/bin/bash
# Works with Kali latest releases
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi
cat << EOF > /etc/default/grub
# grub-mkconfig -o /boot/grub/grub.cfg
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0,115200"
GRUB_CMDLINE_LINUX="initrd=/install/initrd.gz"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
EOF
grub-mkconfig -o /boot/grub/grub.cfg
reboot

5.4. Mettre à zéro grub2

# rm /etc/grub.d/*
# rm /etc/sysconfig/grub
# yum reinstall grub2-tools
# grub2-mkconfig -o /boot/grub2/grub.cfg

5.5. Réinstaller grub2

# grub2-install /dev/sda1

La protection de Grub2 est vue plus bas.

6. init et systemd

La procédure de démarrage d'un ordinateur Linux peut se résumer de la manière suivante :

  • Le chargeur d'amorçage (GRUB2 a priori) charge le noyau, ensuite le noyau monte le système de fichier racine (le « / »), puis il initialise la console initiale :
  • init (abréviation de "initialization") est le programme sous Unix qui lance ensuite toutes les autres tâches (sous forme de scripts). Il s'exécute comme un démon informatique. Son identifiant de processus (PID) est 1.
  • systemd est une alternative au démon init de System V. Il est spécifiquement conçu pour le noyau Linux. Il a pour but d'offrir un meilleur cadre pour la gestion des dépendances entre services, de permettre le chargement en parallèle des services au démarrage, et de réduire les appels aux scripts shell.

6.1. Systemd

Source : https://commons.wikimedia.org/wiki/File:Linux_kernel_unified_hierarchy_cgroups_and_systemd.svg Systemd est le système d'initialisation installé par défaut avec les distributions Arch Linux, Centos 7, Debian 8 et à partir d'Ubuntu 15.04.

6.2. Niveaux d'exécution (run levels)

Le run level, ou niveau de fonctionnement, est un chiffre ou une lettre utilisé par le processus init des systèmes de type Unix pour déterminer les fonctions activées du système.

Dans cette organisation héritée de UNIX System V, les scripts de lancement des applications sont regroupés dans un répertoire commun /etc/init.d. Ces scripts reçoivent un paramètre qui peut être start, stop, restart, etc.

À chaque niveau correspond un répertoire (typiquement /etc/rc.d/rc2.d pour le niveau 2) de liens symboliques vers des fichiers de /etc/init.d. Ces liens symboliques portent des noms commençant par la lettre S ou K, suivi d'un numéro sur deux chiffres.

Lors d'un changement de run level :

  • les scripts dont le nom commence par un K dans le répertoire correspondant au niveau actuel sont lancés (dans l'ordre des numéros) avec le paramètre stop, ce qui a normalement pour effet d'arrêter le service correspondant,
  • les scripts du nouveau niveau qui commencent par S sont appelés successivement avec le paramètre start.

Avec init, les niveaux d'exécutions servent à ces usages :

  • Niveau 1. Mode mono-utilisateur ou maintenance
  • Niveau 2. mode multi-utilisateur sans ressources réseaux (NFS, etc)
  • Niveau 3. mode multi-utilisateur sans serveur graphique
  • Niveau 5. mode multi-utilisateur avec serveur graphique

Le niveau 0 arrête le système.

Le niveau 6 redémarre le système.

Sous Debian/Ubuntu, le Niveau 2 est le seul niveau fonctionnel avec réseau et serveur graphique. Les niveaux 3, 4 et 5 ne sont pas utilisés.

Pour mémoire, les niveaux d'exécution avec init System V sont définis dans /etc/inittab (RHEL7, Debian 7). Upstart est une alternative jusque Ubuntu 16.04 LTS.

  • Pour vérifier le niveau d'exécution courant :
# runlevel
N 5
  • Pour se placer dans un des niveaux d'exécution (x) :
# init x

Systemctl dispose de ses propres commandes pour les niveaux d'exécution :

  • Obtenir le niveaux d'éxécution par défaut :
# systemctl get-default
graphical.target
  • Pour fixer le niveau d'exécution par défaut en mode multi-utilisateur avec serveur graphique :
systemctl set-default graphical.target
  • Pour passer mode maintenance avec un système de fichier local monté
systemctl rescue
  • Passer en mode maintenace avec seulement /root monté
systemctl emergency
  • Pour passer en mode multi-utilisateur sans serveur graphique (N 3)
systemctl isolate multi-user.target
  • Pour passer en mode multi-utilisateur avec serveur graphique (N 5)
systemctl isolate graphical.target

6.3. Scripts de démarrage de service

Dans les distributions antérieures à 2016, on retrouvera les scripts de démarrage dans le dossier /etc/init.d/ (System V / Upstart). Pour qu'ils soient liés à un niveau d'exécution, il sont présentés dans les dossier /etc/rc5/ par exemple sous forme de lien symbolique.

Pour activer ces services au démarrage du système, on utilise soit la commande update-rc.d ou chkconfig.

En Debian (Wheezy et antérieures) / Ubuntu, pour activer le service Web Apache :

update-rc.d apache2 defaults

Pour le désactiver :

update-rc.d apache2 remove

En Centos ⅚, pour activer le service Web Apache :

chkconfig --add httpd

Pour le désactiver :

chkconfig --del httpd

De manière simplifiée, il s'agit de scripts qui comportent au moins deux arguments possibles : start et stop. D'autres arguments sont souvent développés comme restart ou status. Aussi, les dépendances d'un service sont gérées à partir d'une séquence ordonnées de scripts dans le dossier /etc/rc* du niveau de service. Cette procédure n'est pas des plus robustes, car les événements pour un service ne sont pas gérés par System V, contrairement à Upstart et Systemd.

Voici un modèle formel de script :

#!/bin/bash

case $1 in
start)
# commande qui démarre le service
;;
stop)
# commande qui arrête le service
;;
esac

6.4. Commandes systemctl

On ira s’informer au préalable sur les systèmes de gestion de service et plus particulièrement systemd sur http://doc.fedora-fr.org/wiki/Systemd.

Il comporte de nombreux avantages. Selon moi, une simplicité d'utilisation et de configuration et un e gestion unifiée comme par exemple la possibilité de contôler des machines distantes voire des containers ou des machines virtuelles via les outils systemd ...

  • systemctl list-units
  • systemctl
  • systemctl status unit
  • systemctl enable | disable unit
  • systemctl start | stop | restart unit
  • systemctl kill unit
  • systemctl kill -s SIGKILL unit
  • /lib/systemd/system est le dossier où se situent les fichiers de configuration des services. Par exemple :
cat /lib/systemd/system/sshd.*

Autre exemple, service firewalld :

$ ls /etc/systemd/system/*.service
/etc/systemd/system/dbus-org.bluez.service
/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service
$ cat /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service
[Unit]
Description=firewalld - dynamic firewall daemon
Before=network.target
Before=libvirtd.service
Before=NetworkManager.service
Conflicts=iptables.service ip6tables.service ebtables.service

[Service]
EnvironmentFile=-/etc/sysconfig/firewalld
ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
# supress to log debug and error output also to /var/log/messages
StandardOutput=null
StandardError=null
Type=dbus
BusName=org.fedoraproject.FirewallD1

[Install]
WantedBy=basic.target
Alias=dbus-org.fedoraproject.FirewallD1.service

Dernier exemple du service httpd :

# cat /lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

6.5. Exercice démarrage des services avec systemctl

  • Vérifier l'installation du serveur SSH
  • Vérifier son état
  • Le désactiver au démarrage
  • Arrêter le service
  • Réactiver le service au démarrage
  • Vérifier l'état du service
  • Obtenir des journaux plus détaillés
  • Démarrer le service
  • Vérifier l'état du service
  • Relancer le service
  • Vérifier l'état du service

# yum -y install openssh-server
# systemctl status sshd
 sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since mer. 2016-02-17 22:14:57 CET; 6 days ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 830 (sshd)
CGroup: /system.slice/sshd.service
└─830 /usr/sbin/sshd -D

févr. 17 22:14:57 c7li systemd[1]: Started OpenSSH server daemon.
févr. 17 22:14:57 c7li systemd[1]: Starting OpenSSH server daemon...
févr. 17 22:14:57 c7li sshd[830]: Server listening on 0.0.0.0 port 22.
févr. 17 22:14:57 c7li sshd[830]: Server listening on :: port 22.
# systemctl disable sshd
Removed symlink /etc/systemd/system/multi-user.target.wants/sshd.service.
# systemctl stop sshd
# systemctl enable sshd
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.
# systemctl status sshd
 sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:sshd(8)
man:sshd_config(5)

févr. 17 22:14:57 c7li systemd[1]: Started OpenSSH server daemon.
févr. 17 22:14:57 c7li systemd[1]: Starting OpenSSH server daemon...
févr. 17 22:14:57 c7li sshd[830]: Server listening on 0.0.0.0 port 22.
févr. 17 22:14:57 c7li sshd[830]: Server listening on :: port 22.
févr. 24 21:41:31 c7cli systemd[1]: Stopping OpenSSH server daemon...
févr. 24 21:41:31 c7cli systemd[1]: Stopped OpenSSH server daemon.
# journalctl -xn
# systemctl start sshd
# systemctl status sshd
 sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since mer. 2016-02-24 21:44:48 CET; 2s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 17318 (sshd)
CGroup: /system.slice/sshd.service
└─17318 /usr/sbin/sshd -D

févr. 24 21:44:48 c7cli systemd[1]: Started OpenSSH server daemon.
févr. 24 21:44:48 c7cli systemd[1]: Starting OpenSSH server daemon...
févr. 24 21:44:48 c7cli sshd[17318]: Server listening on 0.0.0.0 port 22.
févr. 24 21:44:48 c7cli sshd[17318]: Server listening on :: port 22.
# systemctl restart sshd
# systemctl status sshd
 sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since mer. 2016-02-24 21:44:56 CET; 2s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 17454 (sshd)
CGroup: /system.slice/sshd.service
└─17454 /usr/sbin/sshd -D

févr. 24 21:44:56 c7cli systemd[1]: Started OpenSSH server daemon.
févr. 24 21:44:56 c7cli systemd[1]: Starting OpenSSH server daemon...
févr. 24 21:44:56 c7cli sshd[17454]: Server listening on 0.0.0.0 port 22.
févr. 24 21:44:56 c7cli sshd[17454]: Server listening on :: port 22.

7. Démarrer, redémarrer et éteindre un système normalement

Sur une machine locale ou virtuelle ou un serveur distant.

7.1. Redémarrer le système

On peut procéder de différentes manières :

# systemctl reboot
# shutdown -r now
# reboot
# init 6

7.2. Arrêter le système

On peut choisir :

# systemctl halt
# shutdown -h now
# halt
# init 0

7.3. Eteindre le système :

# poweroff
# systemctl poweroff

7.4. Suspendre le système

# systemctl suspend

7.5. Hibernation

# systemctl hibernate

7.6. Entre hibernation et suspension

# systemctl hybrid-sleep

8. Password recovery

8.1. Méthode 1 (RHEL7, Debian 8)

  1. Au redémarrage de l’ordinateur, on peut interrompre grub en appuyant sur la touche «e» pour "edit"/éditer.
  2. A la ligne qui commence par «linux16» ou «linuxefi», effacer rhgb et quiet pour désactiver le démarrage graphique silencieux.
  3. Placer l’occurence init=/bin/bash à la fin de la ligne (CTRL-E) qui va démarrer une session bash sans démarrer le démon init.
  4. "CTRL-X" pour redémarrer.
  5. Remonter la racine pour accéder en lecture/écriture au système de fichier.mount -o remount,rw /
  6. Modifier / lire le mot de passe
  7. Replacer les contextes SELinux sur les fichiers via la commande touch /.autorelabel (si RHEL7)
  8. Redémarrer l’ordinateur : exec /sbin/reboot (peut nécessiter un redémarrage

8.2. Méthode 2 (RHEL7)

  1. Une méthode alternative plus sûre et plus simple consiste à placer rd.break au lieu de init=/bin/bash dans la ligne de démarrage de grub2 (voir première méthode). La procédure est la suivante :
  2. mount –o remount,rw /sysroot
  3. chroot /sysroot
  4. passwd
  5. touch /.autorelabel
  6. exit
  7. exit

8.3. Protections grub2

Mot de passe chiffré sur le menu grub2

Pour un utilisateur, pour toutes les entrées du menu.

Génération du mot de passe

# grub-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.B1EB4DABDA2BC3A2243772405831E0F78BBF6F27A291E875478DAC4AD3FC7F0D402A7B976D65BF9A8ECA051ABA998956CE10217C10EB021A2F60E9025B4049C5.A14C5A56B96E8CD12437088F52A06EA1F37AB74AD365DDCA151CF8339B468FBF0A8BC113FFAE2C583E74E269CD69B279BD754350CDFCDDE6BC1756F23918F81B

Ajout d'un compte et d'un mot de passe dans /etc/grub.d/40_custom

#!/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.

# define superusers
set superusers="francois"

#define users
password_pbkdf2 francois grub.pbkdf2.sha512.10000.B1EB4DABDA2BC3A2243772405831E00
F78BBF6F27A291E875478DAC4AD3FC7F0D402A7B976D65BF9A8ECA051ABA998956CE10217C10EB022
1A2F60E9025B4049C5.A14C5A56B96E8CD12437088F52A06EA1F37AB74AD365DDCA151CF8339B4688
FBF0A8BC113FFAE2C583E74E269CD69B279BD754350CDFCDDE6BC1756F23918F81B

Installation de la configuration

# grub-mkconfig -o /boot/grub/grub.cfg
# reboot

A redémarrage, il faudra entrer un nom d'utillisateur et un mot de passe. En ajoutant --unrestricted à la fin de la ligne de chargement du noyau, tous les utilisateurs pourront charger une ligne sans pouvoir l'éditer sauf un super-utilisateur.

Désactivation du mode recovery

  • Désactivation du mode recovery : vérifier la valeur de la variable GRUB_DISABLE_RECOVERY.
  • Mettre à zéro la variable GRUB_TIMEOUT

Exercice de sécurisation

Comment peut-on automatiser la sécurisation d'une configuration de grub ?

9. Processus

9.1. Visualisation des processus en cours

Les processus sont référencés par un identifiant unique, le PID. Ce nombre peut être utilisé pour changer la priorité d'un processus ou pour l'arrêter.

Un processus correspond à n'importe quel exécutable exécuté. Si le processus 2 a été lancé par le processus 1, on l'appelle un processus fils. Le processus qui l'a lancé est appelé processus parent.

9.2. L'arborescence des processus

La commande pstree donne une bonne illustration de la hiérarchie des processus parents et fils.

Par exemple, sous debian 7 :

$ pstree
init─┬─acpid
     ├─atd
     ├─cron
     ├─dbus-daemon
     ├─dhclient
     ├─docker.io─┬─bash
     │           ├─controller───9*[{controller}]
     │           ├─rethinkdb─┬─rethinkdb
     │           │           └─69*[{rethinkdb}]
     │           └─12*[{docker.io}]
     ├─7*[getty]
     ├─irqbalance
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───sshd───bash───pstree

Par exemple, sous Centos 7 :

$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─alsactl
        ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
        │                 └─3*[{at-spi-bus-laun}]
        ├─at-spi2-registr───{at-spi2-registr}
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─caribou───2*[{caribou}]
        ├─chronyd
        ├─colord───2*[{colord}]
        ├─crond
        ├─cupsd
        ├─2*[dbus-daemon───{dbus-daemon}]
        ├─dbus-launch
        ├─dconf-service───2*[{dconf-service}]
        ├─firewalld───{firewalld}
        ├─gdm─┬─Xorg───2*[{Xorg}]
        │     ├─gdm-session-wor─┬─gnome-session─┬─gnome-settings-───4*[{gnome-settings-}]
        │     │                 │               ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │     │                 │               │             │             ├─ibus-engine-sim───2*[{ibus-engine-sim}]
        │     │                 │               │             │             └─2*[{ibus-daemon}]
        │     │                 │               │             └─8*[{gnome-shell}]
        │     │                 │               └─3*[{gnome-session}]
        │     │                 └─2*[{gdm-session-wor}]
        │     └─3*[{gdm}]
        ├─goa-daemon───3*[{goa-daemon}]
        ├─goa-identity-se───2*[{goa-identity-se}]
        ├─gssproxy───5*[{gssproxy}]
        ├─gvfs-afc-volume───2*[{gvfs-afc-volume}]
        ├─gvfs-goa-volume───{gvfs-goa-volume}
        ├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
        ├─gvfs-mtp-volume───{gvfs-mtp-volume}
        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        ├─gvfsd───{gvfsd}
        ├─ibus-x11───2*[{ibus-x11}]
        ├─irqbalance
        ├─login───bash───su───bash───pstree
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mission-control───2*[{mission-control}]
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───5*[{polkitd}]
        ├─pulseaudio───2*[{pulseaudio}]
        ├─qemu-ga
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─smartd
        ├─spice-vdagentd
        ├─sshd
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─wpa_supplicant
        └─x2gocleansessio

Les options les plus courantes de pstree sont -p pour afficher les PIDs et -h pour faire ressortir (en gras) les processus utilisateurs.

9.3. Recherche des processus en cours d'exécution

Une méthode plus directe pour déterminer les processus en cours d'exécution est d'utiliser la commande ps avec une combinaison d'options.

Tentez les différentes commandes :

$ ps
$ ps a
$ ps ax
$ ps aux
$ ps ax | grep cron
Exemples tirés de la page man de ps (en)

  • Tous les processus sur le système en syntaxe standard.
ps -e
ps -ef
ps -eF
ps -ely
  • Tous les processus sur le système en syntaxe BSD.
ps ax
ps axu
  • Impression d'un arbre de processus.
ps -ejH
ps axjf
  • Obtenir des informations sur les "threads".
ps -eLf
ps axms
  • Obtenir des informations de sécurité.
ps -eo euser,ruser,suser,fuser,f,comm,label

Description des champs (page man de ps (fr)

  1. PRI Il s'agit d'un compteur dans la structure représentant la tâche. C'est la fréquence, en HZ des activations possibles du processus.
  2. NI Valeur standard Unix de gentillesse (nice). Une valeur positive signifie un accès moindre au CPU.
  3. SIZE Taille virtuelle de l'image du processus (code + données + pile).
  4. RSS Taille résidente de l'image du processus. Nombre de kilo-octets se trouvant en mémoire.
  5. WCHAN Nom de la fonction du noyau dans laquelle le processus est endormi.
  6. STAT État du processus.

Le premier champ PRI correspond à :

  • R (runnable) prêt à être exécuté,
  • S (sleeping) endormi,
  • D sommeil ininterruptible,
  • T (traced) arrêté ou suivi,
  • Z (zombie).

Le second champ contient W si le processus n'a pas de pages résidentes.

Le troisième NI champ contient N si le processus a une valeur de gentillesse positive (nice, champ NI).

  • TT terminal de contrôle
  • PAGEIN Nombre de fautes de pages majeures (où l'on doit lire des pages sur le disque, y compris dans le buffer cache).
  • TRS Taille de code résident en mémoire.
  • SWAP Nombre de kilo-octets (ou de pages si l'option -p est utilisée) sur le périphérique de swap.
  • SHARE Mémoire partagée.

9.4. Lancer une tâche dans la console

Pour ces exercices on n'hésitera pas à lire la section intitulé "PROCESS STATE CODES" de la page de la commande ps.

On peut créer un processus :

tail -f /var/log/messages
^Z

[1]+  Stopped                 tail -f /var/log/syslog

et l’arrêter :

ps aux | grep tail
francois 23704  0.0  0.0   7256   620 pts/5    T    14:08   0:00 tail -f /var/log/messages

On peut relancer le processus en tâche de fond avec bg :

bg
[1]+ tail -f /var/log/messages &

On peut reprendre le processus en premier plan dans la console avec fg :

fg
tail -f /var/log/messages
^C

9.5. Gestion de tâches

On peut lancer directement une tâche en arrière plan en ajoutant & à la commande :

tail -f /var/log/messages &
Pour visualiser les tâches (jobs) :

$ jobs
[1]+  Stopped                 tail -f /var/log/syslog
[2]-  Running                 tail -f /var/log/syslog &
Pour reprendre une tâche en premier plan :

$ fg 2
tail -f /var/log/messages

9.6. Arrêter un processus

On utilise la commande kill pour envoyer des signaux aux processus. Il existe 63 signaux. Le signal par défaut, nommé SIGTERM, termine le processus et a pour valeur numérique 15.

kill SIGNAL PID

Chaque processus peut choisir ou non de détecter un signal, à l'exception de SIGKILL qui est directement géré par le noyau. On peut également arrêter un processus sans connaître son PID avec la commande killall.

killall SIGNAL NOM_PROCESSUS

On trouve la liste des signaux sous le titre `Standard Signals" de la page man 7 signal

man 7 signal

9.7. nohup

Nohup est une commande Unix permettant de lancer un processus qui restera actif même après la déconnexion de l'utilisateur l'ayant initiée. Combiné à l’esperluette (&) qui permet le lancement en arrière-plan, nohup permet donc de créer des processus s'exécutant de manière transparente sans être dépendants de l’utilisateur.

Par exemple :

# nohup tail -f /var/log/messages &

9.8. Priorité des processus

Les valeurs de nice (NI pour nice indice) modifient la priorité pour le processeur et sont utilisées pour adapter la charge du processeur dans un environnement multi-utilisateur. Chaque processus est lancé avec la valeur de nice par défaut : 0. Ces valeurs sont comprises entre 19 (la plus petite) et -20 (la plus importante). (moins un processus est gentil, plus il consomme de puissance).

Seul le super-utilisateur root peut diminuer la valeur nice d'un processus. En conséquence, tous les processus étant lancés par défaut avec un nice à 0, seul le root peut définir des valeurs de nice négatives !

9.9. nice / renice

On utilise la commande renice pour modifier la priorité d'un processus en cours d'exécution, et la commande nice pour définir la priorité d'un processus à son lancement.

nice –<NI>  <processus>
renice  <+/-NI>  -p <PID>

renice utilise les PID et peut gérer une liste de processus à la fois. L'option -u affecte tous les processus d'un utilisateur peut être très utile.

Exemples :

  • passage des valeurs de nice à 1 pour les processus 234 et 765
renice +1  -p 234 765
  • lancer xclock avec une valeur de nice à -5
nice  --5  xclock

Pour vérifier les valeurs nice :

ps -lax | head

9.10. Mesure de l'utilisation des ressources et résolution de problèmes

Objectif LPIC 200.1

  • Ajout des dépôts EPEL et RPMFORGE : https://gist.github.com/goffinet/4332ae9486345c2bf623
  • uptime : 1, 5, 15 minutes sur tous les CPUs
  • Installation de iostat sous Centos 7 : yum install sysstat
  • Sortie iostat : avg-cpu: %user %nice %system %iowait %steal %idle
  • iostat -c: CPU / iostat -d : disques
  • sar à la manière de iostat offre un historique dans une cadence de 10 minutes
sar | tail
  • stress (EPEL) à installer (ici, 2 CPU, 1 VM, 1 IO)
uptime
stress -c 2 -i 1 -m 1 --vm-bytes 128M -t 10s
uptime

#!/bin/bash
yum -y install git || apt-get install git
yum -y groupinstall 'Development Tools' || apt-get install build-essential git
cd /tmp
git clone git://kernel.ubuntu.com/cking/stress-ng.git
cd stress-ng
make
cp stress-ng /usr/bin
rm -rf /tmp/stress-*
* free -h, vmstat * iostat -d : bi et bo, lsblk, blkid * lsof -u ^root, lsof -i TCP:22, lsof -p 100 * lsof /usr/ bin/bash * option netstat: -l (listening), -lu (listening UDP sockets), -lt (listening TCP sockets), -p (PID), -n (numérique), -c (continu), -r (table de routage) * ps -fe, pstree, top, htop * Commande w

9.11. Prévision des besoins en ressources

Objectif LPIC 200.2

$ top
$ htop
yum install collectd-web
systemctl enable collectd
systemctl enable httpd
systemctl start collectd
systemctl start httpd
firewall-cmd --add-service=http --permanent
firewall-cmd --reload

cat /etc/httpd/conf.d/collectd.conf
Configuration for collectd.

Alias /collectd/ /usr/share/collectd/collection3/

<Directory "/usr/share/collectd/collection3/">
    Require local
    # Require all granted
    DirectoryIndex bin/index.cgi
    DirectoryIndexRedirect on
</Directory>

<Directory "/usr/share/collectd/collection3/etc/">
    Require all denied
</Directory>

<Directory "/usr/share/collectd/collection3/lib/">
    Require all denied
</Directory>

<Directory "/usr/share/collectd/collection3/share/">
    Require local
    # Require all granted
</Directory>

<Directory "/usr/share/collectd/collection3/bin/">
    Options ExecCGI
    AddHandler cgi-script .cgi
    Require local
    # Require all granted
</Directory>

cat /etc/collectd.conf | wc -l

9.12. Cgroups, cpulimit

En cours de développemnt.

10. Consoles virtuelles avec screen

1.1. Logiciel screen

Screen (GNU Screen) est un «multiplexeur de terminaux» permettant d'ouvrir plusieurs terminaux dans une même console, de passer de l'un à l'autre et de les récupérer plus tard.

Vérifiez la présence du logiciel sur votre système avec la commande which :

$ sudo which screen
$ sudo apt-get install screen || sudo yum install screen

1.2. Créer un terminal, s’en détacher, s’y rattacher

Créer un nouveau screen en nommant la session :

$ screen -S nom_de_la_session

Un message annonçant la version utilisée et indiquant que ce programme est publié sous licence GPL s'affiche à l'écran. Il ne reste plus qu'à presser la touche [ESPACE].

Pour se détacher de la session du screen : * Saisir la suite de touche clavier suivante : [CTRL]+[a] suivi de [d] * OU fermer le terminal et/ou ouvrir un autre terminal

Pour se rattacher à la session du screen :

$ screen -r nom_de_la_session

1.3. Gérer les terminaux

Connaître les terminaux existants :

$ screen -ls

Rattacher un screen existant :

$ screen -r

Tuer un screen :

$ exit

1.4. Raccourcis screen

  1. Créer un nouveau terminal :
  2. Saisir la suite de touche clavier suivante : [CTRL]+[a] suivi de [c]
  3. Si vous avez auparavant exécuté une commande, le contenu du terminal devrait visiblement changer : vous êtes dans le nouveau terminal dont vous venez de demander la création.
  4. Naviguer entre les terminaux du screen :
  5. [CTRL]+[a] suivi de [n]: pour «next», aller au terminal suivant.
  6. [CTRL]+[a] suivi de [p]: pour «previous», aller au terminal précédent.
  7. [CTRL]+[a] suivi de [0]..[9]: aller au terminal n.
  8. [CTRL]+[a] suivi de [']: saisir dans le prompt le numéro du terminal.
  9. [CTRL]+[a] suivi de ["]: lister des différents terminaux, avec la possibilité d'en choisir un.
  10. [CTRL]+[a] suivi de [w]: lister les terminaux actuels avec leur nom.
  11. [CTRL]+[a] suivi de [a]: retourner au terminal d'où l'on vient.
  12. [CTRL]+[a] suivi de [A]: nommer les terminaux et s'y rendre par la suite plus aisément.
  13. « Tuer » un terminal screen. Lorsque on est logué sur un terminal screen, pour le « tuer » (kill) :
  14. exit
  15. [CTRL]+[D] : équivalent à exit. Lorsqu’il n’y a plus qu’une seule console quitte screen.
  16. Détacher screen
  17. [CTRL]+[a] suivi de [d]: pour détacher screen
  18. [CTRL]+[a] suivi de [DD]: pour détacher screen et fermer la session

1.5. Screen comme émulateur de terminal (câble console/null modem)

On désigne le port console (/dev/ttyS0, /dev/ttyUSB0, ...) avec screen :

# screen <console port> <speed>

Pour une connexion sur un routeur Cisc* à partir d'un convertisseur usb-to-serial :

# screen /dev/ttyUSB0 9600

Pour une connexion sur Raspberry Pi 3 à partir du port COM1 du PC :

# screen /dev/ttyS0 115200

Références

Commentaires