Noyau Linux

Ce chapitre est une introduction au noyau Linux. On expliquera ici comment interroger et configurer un noyau Linux courant.

1. Noyau Linux

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

1.1. Généralités

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).

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="https://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 https://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

1.8. Persistence des paramètres du noyau

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 https://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"