Dernière mise-à-jour : 2020/01/30 03:27

Gestion du Démarrage et de l'Arrêt du Système

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 gestionnaire d'amorçage du système d'exploitation en utilisant le bootstrap loader.

Gestionnaire d'amorçage

La première partie du gestionnaire d'amorçage est en règle générale placé dans le MBR du disque. Le format du MBR est le suivant :

  • 446 octets pour le gestionnaire d'amorçage,
  • 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.

Important : Il est à noter que la première partie du gestionnaire d'amorçage peut également être installé dans un PBR.

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.

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.

Grub 2

Ubuntu utilise le gestionnaire d'amorçage Grub2. Grub2 est le successeur de Grub mais ne garde que le nom de ce dernier. En effet, Grub2 est une ré-écriture complète de Grub.

Dans le cas où le gestionnaire d'amorçage Grub2 n'est pas installé, il convient de saisir la commande suivante :

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

périphérique est le nom du périphérique ou grub doit s'installer dans le MBR.

Dans le cas où le gestionnaire d'amorçage est Grub il est possible de passer à Grub2 en utilisant la commande suivante :

# upgrade-from-grub-legacy [Entrée]

Les fichiers de modules de Grub2, lui permettant de de gérer le démarrage sur un nombre important de système de fichiers, se trouvent dans le répertoire /boot/grub/i386-pc :

root@ubuntu:~# ls /boot/grub
fonts  gfxblacklist.txt  grub.cfg  grubenv  i386-pc  locale
root@ubuntu:~# ls /boot/grub/i386-pc/
915resolution.mod     datetime.mod         gdb.mod                   mdraid1x.mod         pbkdf2.mod          tftp.mod
acpi.mod              diskfilter.mod       geli.mod                  memdisk.mod          pbkdf2_test.mod     tga.mod
adler32.mod           disk.mod             gettext.mod               memrw.mod            pcidump.mod         time.mod
affs.mod              div_test.mod         gfxmenu.mod               minicmd.mod          pci.mod             trig.mod
afs.mod               dm_nv.mod            gfxterm_background.mod    minix2_be.mod        plan9.mod           tr.mod
ahci.mod              drivemap.mod         gfxterm_menu.mod          minix2.mod           play.mod            truecrypt.mod
all_video.mod         echo.mod             gfxterm.mod               minix3_be.mod        png.mod             true.mod
aout.mod              efiemu32.o           gptsync.mod               minix3.mod           priority_queue.mod  udf.mod
archelp.mod           efiemu64.o           gzio.mod                  minix_be.mod         probe.mod           ufs1_be.mod
ata.mod               efiemu.mod           halt.mod                  minix.mod            procfs.mod          ufs1.mod
at_keyboard.mod       ehci.mod             hashsum.mod               mmap.mod             progress.mod        ufs2.mod
backtrace.mod         elf.mod              hdparm.mod                moddep.lst           pxechain.mod        uhci.mod
bfs.mod               eval.mod             hello.mod                 modinfo.sh           pxe.mod             usb_keyboard.mod
biosdisk.mod          exfat.mod            help.mod                  morse.mod            raid5rec.mod        usb.mod
bitmap.mod            exfctest.mod         hexdump.mod               mpi.mod              raid6rec.mod        usbms.mod
bitmap_scale.mod      ext2.mod             hfs.mod                   msdospart.mod        read.mod            usbserial_common.mod
blocklist.mod         extcmd.mod           hfspluscomp.mod           multiboot2.mod       reboot.mod          usbserial_ftdi.mod
boot.img              fat.mod              hfsplus.mod               multiboot.mod        regexp.mod          usbserial_pl2303.mod
boot.mod              file.mod             http.mod                  nativedisk.mod       reiserfs.mod        usbserial_usbdebug.mod
bsd.mod               font.mod             hwmatch.mod               net.mod              relocator.mod       usbtest.mod
btrfs.mod             freedos.mod          iorw.mod                  newc.mod             romfs.mod           vbe.mod
bufio.mod             fshelp.mod           iso9660.mod               nilfs2.mod           scsi.mod            verify.mod
cat.mod               fs.lst               jfs.mod                   normal.mod           search_fs_file.mod  vga.mod
cbfs.mod              functional_test.mod  jpeg.mod                  ntfscomp.mod         search_fs_uuid.mod  vga_text.mod
cbls.mod              gcry_arcfour.mod     keylayouts.mod            ntfs.mod             search_label.mod    video_bochs.mod
cbmemc.mod            gcry_blowfish.mod    keystatus.mod             ntldr.mod            search.mod          video_cirrus.mod
cbtable.mod           gcry_camellia.mod    ldm.mod                   odc.mod              sendkey.mod         video_colors.mod
cbtime.mod            gcry_cast5.mod       legacycfg.mod             offsetio.mod         serial.mod          video_fb.mod
chain.mod             gcry_crc.mod         legacy_password_test.mod  ohci.mod             setjmp.mod          videoinfo.mod
cmdline_cat_test.mod  gcry_des.mod         linux16.mod               part_acorn.mod       setjmp_test.mod     video.lst
cmosdump.mod          gcry_dsa.mod         linux.mod                 part_amiga.mod       setpci.mod          video.mod
cmostest.mod          gcry_idea.mod        loadenv.mod               part_apple.mod       sfs.mod             videotest_checksum.mod
cmp.mod               gcry_md4.mod         loopback.mod              part_bsd.mod         signature_test.mod  videotest.mod
command.lst           gcry_md5.mod         lsacpi.mod                part_dfly.mod        sleep.mod           xfs.mod
configfile.mod        gcry_rfc2268.mod     lsapm.mod                 part_dvh.mod         sleep_test.mod      xnu.mod
core.img              gcry_rijndael.mod    lsmmap.mod                part_gpt.mod         spkmodem.mod        xnu_uuid.mod
cpio_be.mod           gcry_rmd160.mod      ls.mod                    partmap.lst          squash4.mod         xnu_uuid_test.mod
cpio.mod              gcry_rsa.mod         lspci.mod                 part_msdos.mod       syslinuxcfg.mod     xzio.mod
cpuid.mod             gcry_seed.mod        luks.mod                  part_plan.mod        tar.mod             zfscrypt.mod
crc64.mod             gcry_serpent.mod     lvm.mod                   part_sun.mod         terminal.lst        zfsinfo.mod
cryptodisk.mod        gcry_sha1.mod        lzopio.mod                part_sunpc.mod       terminal.mod        zfs.mod
crypto.lst            gcry_sha256.mod      macbless.mod              parttool.lst         terminfo.mod
crypto.mod            gcry_sha512.mod      macho.mod                 parttool.mod         test_blockarg.mod
cs5536.mod            gcry_tiger.mod       mda_text.mod              password.mod         testload.mod
datehook.mod          gcry_twofish.mod     mdraid09_be.mod           password_pbkdf2.mod  test.mod
date.mod              gcry_whirlpool.mod   mdraid09.mod              pata.mod             testspeed.mod

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

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

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  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="0"
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 recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; 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
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_msdos
insmod ext2
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  70eb8bc5-1759-433d-9797-9342a7b82cb2
else
  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=fr_FR
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=-1
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=hidden
    set timeout=0
  # Fallback hidden-timeout code in case the timeout_style feature is
  # unavailable.
  elif sleep --interruptible 0 ; then
    set timeout=0
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
	if [ "${1}" = "keep" ]; then
		set vt_handoff=vt.handoff=7
	else
		set vt_handoff=
	fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-70eb8bc5-1759-433d-9797-9342a7b82cb2' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	insmod part_msdos
	insmod ext2
	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  70eb8bc5-1759-433d-9797-9342a7b82cb2
	else
	  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
	fi
	linux	/boot/vmlinuz-3.13.0-32-generic root=UUID=70eb8bc5-1759-433d-9797-9342a7b82cb2 ro  quiet splash $vt_handoff
	initrd	/boot/initrd.img-3.13.0-32-generic
}
submenu 'Options avancées pour Ubuntu' $menuentry_id_option 'gnulinux-advanced-70eb8bc5-1759-433d-9797-9342a7b82cb2' {
	menuentry 'Ubuntu, avec Linux 3.13.0-32-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-32-generic-advanced-70eb8bc5-1759-433d-9797-9342a7b82cb2' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		insmod part_msdos
		insmod ext2
		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  70eb8bc5-1759-433d-9797-9342a7b82cb2
		else
		  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
		fi
		echo	'Chargement de Linux 3.13.0-32-generic…'
		linux	/boot/vmlinuz-3.13.0-32-generic root=UUID=70eb8bc5-1759-433d-9797-9342a7b82cb2 ro  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-3.13.0-32-generic
	}
	menuentry 'Ubuntu, with Linux 3.13.0-32-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-32-generic-recovery-70eb8bc5-1759-433d-9797-9342a7b82cb2' {
		recordfail
		load_video
		insmod gzio
		insmod part_msdos
		insmod ext2
		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  70eb8bc5-1759-433d-9797-9342a7b82cb2
		else
		  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
		fi
		echo	'Chargement de Linux 3.13.0-32-generic…'
		linux	/boot/vmlinuz-3.13.0-32-generic root=UUID=70eb8bc5-1759-433d-9797-9342a7b82cb2 ro recovery nomodeset 
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-3.13.0-32-generic
	}
}

### 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_memtest86+ ###
menuentry 'Memory test (memtest86+)' {
	insmod part_msdos
	insmod ext2
	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  70eb8bc5-1759-433d-9797-9342a7b82cb2
	else
	  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
	fi
	knetbsd	/boot/memtest86+.elf
}
menuentry 'Memory test (memtest86+, serial console 115200)' {
	insmod part_msdos
	insmod ext2
	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  70eb8bc5-1759-433d-9797-9342a7b82cb2
	else
	  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
	fi
	linux16	/boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

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

### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###

### 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 ###

Notez que ce fichier ne doit pas être modifié manuellement. En effet, il est généré par la commande update-grub.

Lors de l'exécution de la commande update-grub, plusieurs fichiers sont lus :

Le fichier /etc/default/grub

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

root@ubuntu:~# cat /etc/default/grub 
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
[3]+  Fini                    nice -n 19 sleep 5678

Notez que toute modification de ce fichier nécessite l'exécution de la commande update-grub 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 Grub2
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 Grub2 :

root@ubuntu:~# ls -l /etc/grub.d
total 76
-rwxr-xr-x 1 root root  9424 mai   15 21:01 00_header
-rwxr-xr-x 1 root root  6058 mai    8 14:08 05_debian_theme
-rwxr-xr-x 1 root root 11608 mai   15 21:01 10_linux
-rwxr-xr-x 1 root root 10412 mai   15 21:01 20_linux_xen
-rwxr-xr-x 1 root root  1992 mars  12  2014 20_memtest86+
-rwxr-xr-x 1 root root 11692 mai   15 21:01 30_os-prober
-rwxr-xr-x 1 root root  1416 mai   15 21:01 30_uefi-firmware
-rwxr-xr-x 1 root root   214 mai   15 21:01 40_custom
-rwxr-xr-x 1 root root   216 mai   15 21:01 41_custom
-rw-r--r-- 1 root root   483 mai   15 21:01 README
Le fichier /etc/grub.d/10_Linux

Le fichier 10_Linux contient des boucles pour rechercher des noyaux Linux :

root@ubuntu:~# cat /etc/grub.d/10_linux 
#! /bin/sh
set -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="1"
quiet_boot="1"
quick_boot="1"
gfxpayload_dynamic="1"
vt_handoff="1"

. "${datarootdir}/grub/grub-mkconfig_lib"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"

CLASS="--class gnu-linux --class gnu --class os"

if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=GNU/Linux
else
  case ${GRUB_DISTRIBUTOR} in
    Ubuntu|Kubuntu)
      OS="${GRUB_DISTRIBUTOR}"
      ;;
    *)
      OS="${GRUB_DISTRIBUTOR} GNU/Linux"
      ;;
  esac
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi

# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
  /dev/loop/*|/dev/loop[0-9])
    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
    # We can't cope with devices loop-mounted from files here.
    case ${GRUB_DEVICE} in
      /dev/*) ;;
      *) exit 0 ;;
    esac
  ;;
esac

if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
    || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
    || uses_abstraction "${GRUB_DEVICE}" lvm; then
  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
else
  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi

case x"$GRUB_FS" in
    xbtrfs)
	rootsubvol="`make_system_path_relative_to_its_root /`"
	rootsubvol="${rootsubvol#/}"
	if [ "x${rootsubvol}" != x ]; then
	    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
	fi;;
    xzfs)
	rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
	bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
	LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}"
	;;
esac

title_correction_code=

if [ -x /lib/recovery-mode/recovery-menu ]; then
    GRUB_CMDLINE_LINUX_RECOVERY=recovery
else
    GRUB_CMDLINE_LINUX_RECOVERY=single
fi
if [ "$ubuntu_recovery" = 1 ]; then
    GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY nomodeset"
fi

if [ "$vt_handoff" = 1 ]; then
  for word in $GRUB_CMDLINE_LINUX_DEFAULT; do
    if [ "$word" = splash ]; then
      GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT \$vt_handoff"
    fi
  done
fi

linux_entry ()
{
  os="$1"
  version="$2"
  type="$3"
  args="$4"

  if [ -z "$boot_device_id" ]; then
      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
  fi
  if [ x$type != xsimple ] ; then
      case $type in
	  recovery)
	      title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;;
	  *)
	      title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;;
      esac
      if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
	  replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
	  quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
	  title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
	  grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
      fi
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi      
  if [ "$quick_boot" = 1 ]; then
      echo "	recordfail" | sed "s/^/$submenu_indentation/"
  fi
  if [ x$type != xrecovery ] ; then
      save_default_entry | grub_add_tab
  fi

  # Use ELILO's generic "efifb" when it's known to be available.
  # FIXME: We need an interface to select vesafb in case efifb can't be used.
  if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
      echo "	load_video" | sed "s/^/$submenu_indentation/"
  else
      if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
	  echo "	load_video" | sed "s/^/$submenu_indentation/"
      fi
  fi
  if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
     ([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
      echo "	gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
  fi

  echo "	insmod gzio" | sed "s/^/$submenu_indentation/"

  if [ x$dirname = x/ ]; then
    if [ -z "${prepare_root_cache}" ]; then
      prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)"
    fi
    printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/"
  else
    if [ -z "${prepare_boot_cache}" ]; then
      prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
    fi
    printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
  fi
  if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
    message="$(gettext_printf "Loading Linux %s ..." ${version})"
    sed "s/^/$submenu_indentation/" << EOF
	echo	'$(echo "$message" | grub_quote)'
EOF
  fi
  if test -d /sys/firmware/efi && test -e "${linux}.efi.signed"; then
    sed "s/^/$submenu_indentation/" << EOF
	linux	${rel_dirname}/${basename}.efi.signed root=${linux_root_device_thisversion} ro ${args}
EOF
  else
    sed "s/^/$submenu_indentation/" << EOF
	linux	${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
  fi
  if test -n "${initrd}" ; then
    # TRANSLATORS: ramdisk isn't identifier. Should be translated.
    if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
      message="$(gettext_printf "Loading initial ramdisk ...")"
      sed "s/^/$submenu_indentation/" << EOF
	echo	'$(echo "$message" | grub_quote)'
EOF
    fi
    sed "s/^/$submenu_indentation/" << EOF
	initrd	${rel_dirname}/${initrd}
EOF
  fi
  sed "s/^/$submenu_indentation/" << EOF
}
EOF
}

machine=`uname -m`
case "x$machine" in
    xi?86 | xx86_64)
	list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
                  if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
              done` ;;
    *) 
	list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
                  if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
	     done` ;;
esac

case "$machine" in
    i?86) GENKERNEL_ARCH="x86" ;;
    mips|mips64) GENKERNEL_ARCH="mips" ;;
    mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
    arm*) GENKERNEL_ARCH="arm" ;;
    *) GENKERNEL_ARCH="$machine" ;;
esac

prepare_boot_cache=
prepare_root_cache=
boot_device_id=
title_correction_code=

cat << 'EOF'
function gfxmode {
	set gfxpayload="${1}"
EOF
if [ "$vt_handoff" = 1 ]; then
  cat << 'EOF'
	if [ "${1}" = "keep" ]; then
		set vt_handoff=vt.handoff=7
	else
		set vt_handoff=
	fi
EOF
fi
cat << EOF
}
EOF

# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; then
  echo "set linux_gfx_mode=$GRUB_GFXPAYLOAD_LINUX"
else
  cat << EOF
if [ "\${recordfail}" != 1 ]; then
  if [ -e \${prefix}/gfxblacklist.txt ]; then
    if hwmatch \${prefix}/gfxblacklist.txt 3; then
      if [ \${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
EOF
fi
cat << EOF
export linux_gfx_mode
EOF

# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""

is_top_level=true
while [ "x$list" != "x" ] ; do
  linux=`version_find_latest $list`
  case $linux in
    *.efi.signed)
      # We handle these in linux_entry.
      list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
      continue
      ;;
  esac
  gettext_printf "Found linux image: %s\n" "$linux" >&2
  basename=`basename $linux`
  dirname=`dirname $linux`
  rel_dirname=`make_system_path_relative_to_its_root $dirname`
  version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
  alt_version=`echo $version | sed -e "s,\.old$,,g"`
  linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"

  initrd=
  for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
	   "initrd-${version}" "initramfs-${version}.img" \
	   "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
	   "initrd-${alt_version}" "initramfs-${alt_version}.img" \
	   "initramfs-genkernel-${version}" \
	   "initramfs-genkernel-${alt_version}" \
	   "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
	   "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do
    if test -e "${dirname}/${i}" ; then
      initrd="$i"
      break
    fi
  done

  config=
  for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
    if test -e "${i}" ; then
      config="${i}"
      break
    fi
  done

  initramfs=
  if test -n "${config}" ; then
      initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"`
  fi

  if test -n "${initrd}" ; then
    gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2
  elif test -z "${initramfs}" ; then
    # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs.  Since there's
    # no initrd or builtin initramfs, it can't work here.
    linux_root_device_thisversion=${GRUB_DEVICE}
  fi

  if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
    linux_entry "${OS}" "${version}" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"

    submenu_indentation="$grub_tab"
    
    if [ -z "$boot_device_id" ]; then
	boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
    fi
    # TRANSLATORS: %s is replaced with an OS name
    echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
    is_top_level=false
  fi

  linux_entry "${OS}" "${version}" advanced \
              "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
  if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
    linux_entry "${OS}" "${version}" recovery \
                "${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
  fi

  list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
done

# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
  echo '}'
fi

echo "$title_correction_code"
Le fichier /etc/grub.d/30_os-prober

Ce fichier recherche des éventuels systèmes d'exploitation autre que Linux :

root@ubuntu:~# cat /etc/grub.d/30_os-prober
#! /bin/sh
set -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
quick_boot="1"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"

. "${datarootdir}/grub/grub-mkconfig_lib"

found_other_os=

adjust_timeout () {
  if [ "$quick_boot" = 1 ] && [ "x${found_other_os}" != "x" ]; then
    cat << EOF
set timeout_style=menu
if [ "\${timeout}" = 0 ]; then
  set timeout=10
fi
EOF
  fi
}

if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
  exit 0
fi

if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then
  # missing os-prober and/or linux-boot-prober
  exit 0
fi

OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
if [ -z "${OSPROBED}" ] ; then
  # empty os-prober output, nothing doing
  exit 0
fi

osx_entry() {
    found_other_os=1
    if [ x$2 = x32 ]; then
        # TRANSLATORS: it refers to kernel architecture (32-bit)
	bitstr="$(gettext "(32-bit)")"
    else
        # TRANSLATORS: it refers to kernel architecture (64-bit)
	bitstr="$(gettext "(64-bit)")"
    fi
    # TRANSLATORS: it refers on the OS residing on device %s
    onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
        cat << EOF
menuentry '$(echo "${LONGNAME} $bitstr $onstr" | grub_quote)' --class osx --class darwin --class os \$menuentry_id_option 'osprober-xnu-$2-$(grub_get_device_id "${DEVICE}")'  {
EOF
	save_default_entry | grub_add_tab
	prepare_grub_to_access_device ${DEVICE} | grub_add_tab
	cat << EOF
        load_video
        set do_resume=0
        if [ /var/vm/sleepimage -nt10 / ]; then
           if xnu_resume /var/vm/sleepimage; then
             set do_resume=1
           fi
        fi
        if [ \$do_resume = 0 ]; then
           xnu_uuid ${OSXUUID} uuid
           if [ -f /Extra/DSDT.aml ]; then
              acpi -e /Extra/DSDT.aml
           fi
           if [ /kernelcache -nt /System/Library/Extensions ]; then
              $1 /kernelcache boot-uuid=\${uuid} rd=*uuid
           else
              $1 /mach_kernel boot-uuid=\${uuid} rd=*uuid
              if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
                xnu_mkext /System/Library/Extensions.mkext
              else
                xnu_kextdir /System/Library/Extensions
              fi
           fi
           if [ -f /Extra/Extensions.mkext ]; then
              xnu_mkext /Extra/Extensions.mkext
           fi
           if [ -d /Extra/Extensions ]; then
              xnu_kextdir /Extra/Extensions
           fi
           if [ -f /Extra/devprop.bin ]; then
              xnu_devprop_load /Extra/devprop.bin
           fi
           if [ -f /Extra/splash.jpg ]; then
              insmod jpeg
              xnu_splash /Extra/splash.jpg
           fi
           if [ -f /Extra/splash.png ]; then
              insmod png
              xnu_splash /Extra/splash.png
           fi
           if [ -f /Extra/splash.tga ]; then
              insmod tga
              xnu_splash /Extra/splash.tga
           fi
        fi
}
EOF
}

used_osprober_linux_ids=

wubi=

for OS in ${OSPROBED} ; do
  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
  BOOT="`echo ${OS} | cut -d ':' -f 4`"
  if UUID="`${grub_probe} --target=fs_uuid --device ${DEVICE%@*}`"; then
    EXPUUID="$UUID"

    if [ x"${DEVICE#*@}" != x ] ; then
      EXPUUID="${EXPUUID}@${DEVICE#*@}"
    fi

    if [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" -a "x`echo ${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b'`" != "x" ] ; then
      echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2
      continue
    fi
  fi

  BTRFS="`echo ${OS} | cut -d ':' -f 5`"
  if [ "x$BTRFS" = "xbtrfs" ]; then
	BTRFSuuid="`echo ${OS} | cut -d ':' -f 6`"
	BTRFSsubvol="`echo ${OS} | cut -d ':' -f 7`"
  fi

  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi

  gettext_printf "Found %s on %s\n" "${LONGNAME}" "${DEVICE}" >&2

  case ${BOOT} in
    chain)

      case ${LONGNAME} in
	Windows*)
	  if [ -z "$wubi" ]; then
	    if [ -x /usr/share/lupin-support/grub-mkimage ] && \
	       /usr/share/lupin-support/grub-mkimage --test; then
	      wubi=yes
	    else
	      wubi=no
	    fi
	  fi
	  if [ "$wubi" = yes ]; then
	    echo "Skipping ${LONGNAME} on Wubi system" >&2
	    continue
	  fi
	  ;;
      esac

      found_other_os=1
	  onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
      cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {
EOF
      save_default_entry | grub_add_tab
      prepare_grub_to_access_device ${DEVICE} | grub_add_tab

      if [ x"`${grub_probe} --device ${DEVICE} --target=partmap`" = xmsdos ]; then
	  cat << EOF
	parttool \${root} hidden-
EOF
      fi

      case ${LONGNAME} in
	Windows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*)
	;;
	*)
	  cat << EOF
	drivemap -s (hd0) \${root}
EOF
	;;
      esac

      cat <<EOF
	chainloader +1
}
EOF
    ;;
    efi)

	found_other_os=1
	EFIPATH=${DEVICE#*@}
	DEVICE=${DEVICE%@*}
	onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
      cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' {
EOF
      save_default_entry | sed -e "s/^/\t/"
      prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"

      cat <<EOF
	chainloader ${EFIPATH}
}
EOF
    ;;
    linux)
      if [ "x$BTRFS" = "xbtrfs" ]; then
         LINUXPROBED="`linux-boot-prober btrfs ${BTRFSuuid} ${BTRFSsubvol}  2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
      else
         LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
      fi
      prepare_boot_cache=
      boot_device_id=
      is_top_level=true
      title_correction_code=
      OS="${LONGNAME}"

      for LINUX in ${LINUXPROBED} ; do
        LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
        LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"
        LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"
        LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"
        LINITRD="`echo ${LINUX} | cut -d ':' -f 5`"
        LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"

        if [ -z "${LLABEL}" ] ; then
          LLABEL="${LONGNAME}"
        fi

	if [ "${LROOT}" != "${LBOOT}" ]; then
	  LKERNEL="${LKERNEL#/boot}"
	  LINITRD="${LINITRD#/boot}"
	fi

	if [ -z "${prepare_boot_cache}" ]; then
	  prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | grub_add_tab)"
	  [ "${prepare_boot_cache}" ] || continue
	fi

	found_other_os=1
	onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
	recovery_params="$(echo "${LPARAMS}" | grep 'single\|recovery')" || true
	counter=1
	while echo "$used_osprober_linux_ids" | grep 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id' > /dev/null; do
	    counter=$((counter+1));
	done
	if [ -z "$boot_device_id" ]; then
	    boot_device_id="$(grub_get_device_id "${DEVICE}")"
	fi
	used_osprober_linux_ids="$used_osprober_linux_ids 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id'"

	if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
            cat << EOF
menuentry '$(echo "$OS $onstr" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-simple-$boot_device_id' {
EOF
	    save_default_entry | grub_add_tab
	    printf '%s\n' "${prepare_boot_cache}"
	    cat <<  EOF
	linux ${LKERNEL} ${LPARAMS}
EOF
            if [ -n "${LINITRD}" ] ; then
          cat << EOF
	initrd ${LINITRD}
EOF
            fi
        cat << EOF
}
EOF
	    echo "submenu '$(gettext_printf "Advanced options for %s" "${OS} $onstr" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {"
	    is_top_level=false
	fi
	title="${LLABEL} $onstr"
        cat << EOF
	menuentry '$(echo "$title" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' {
EOF
	save_default_entry | sed -e "s/^/$grub_tab$grub_tab/"
	printf '%s\n' "${prepare_boot_cache}" | grub_add_tab
	cat <<  EOF
		linux ${LKERNEL} ${LPARAMS}
EOF
        if [ -n "${LINITRD}" ] ; then
            cat << EOF
		initrd ${LINITRD}
EOF
        fi
        cat << EOF
	}
EOF
	if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
	    replacement_title="$(echo "Advanced options for ${OS} $onstr" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
	    quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
	    title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
	    grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
	fi
      done
      if [ x"$is_top_level" != xtrue ]; then
	  echo '}'
      fi
      echo "$title_correction_code"
    ;;
    macosx)
      if [ "${UUID}" ]; then
	OSXUUID="${UUID}"
	osx_entry xnu_kernel 32
	osx_entry xnu_kernel64 64
      fi
    ;;
    hurd)
      found_other_os=1
      onstr="$(gettext_printf "(on %s)" "${DEVICE}")"
      cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' {
EOF
      save_default_entry | grub_add_tab
      prepare_grub_to_access_device ${DEVICE} | grub_add_tab
      grub_device="`${grub_probe} --device ${DEVICE} --target=drive`"
      mach_device="`echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/\1s\2/'`"
      grub_fs="`${grub_probe} --device ${DEVICE} --target=fs`"
      case "${grub_fs}" in
	*fs)	hurd_fs="${grub_fs}" ;;
	*)	hurd_fs="${grub_fs}fs" ;;
      esac
      cat << EOF
	multiboot /boot/gnumach.gz root=device:${mach_device}
	module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\
			--multiboot-command-line='\${kernel-command-line}' \\
			--host-priv-port='\${host-port}' \\
			--device-master-port='\${device-port}' \\
			--exec-server-task='\${exec-task}' -T typed '\${root}' \\
			'\$(task-create)' '\$(task-resume)'
	module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)'
}
EOF
    ;;
    minix)
	  cat << EOF
menuentry "${LONGNAME} (on ${DEVICE}, Multiboot)" {
EOF
         save_default_entry | sed -e "s/^/\t/"
         prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
	 cat << EOF
	multiboot /boot/image_latest
}
EOF
    ;;
    *)
      echo -n "  "
      # TRANSLATORS: %s is replaced by OS name.
      gettext_printf "%s is not yet supported by grub-mkconfig.\n" "${LONGNAME}" >&2
    ;;
  esac
done

adjust_timeout
Les fichiers /etc/grub.d/40_custom et /etc/grub.d/41_custom

Ces deux fichiers sont fournis en tant que modèles à personnaliser :

root@ubuntu:~# cat /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.

La personnalisation d'un fichier Grub2 est couverte dans la section Initramfs ce cet unité.

Initramfs

Initrd INITial Ram File System est une image d'un système minimal initialisé 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 l’image existante, il convient d'abord de la copier vers /tmp et de la décompresser :

root@ubuntu:~# cp /boot/initrd.img-3.13.0-32-generic /tmp/custom.gz
root@ubuntu:~# cd /tmp
root@ubuntu:/tmp# gunzip custom.gz

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

root@ubuntu:/tmp# mkdir initrd
root@ubuntu:/tmp# cd initrd
root@ubuntu:/tmp/initrd# cpio -idvB < ../custom
...

Installez maintenant le paquet tree :

root@ubuntu:/tmp/initrd# apt-get install tree
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
  tree
0 mis à jour, 1 nouvellement installés, 0 à enlever et 171 non mis à jour.
Il est nécessaire de prendre 36,7 ko dans les archives.
Après cette opération, 112 ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://fr.archive.ubuntu.com/ubuntu/ trusty/universe tree i386 1.6.0-1 [36,7 kB]
36,7 ko réceptionnés en 0s (260 ko/s)
Sélection du paquet tree précédemment désélectionné.
(Lecture de la base de données... 168406 fichiers et répertoires déjà installés.)
Préparation du décompactage de .../archives/tree_1.6.0-1_i386.deb ...
Décompactage de tree (1.6.0-1) ...
Traitement déclenché pour  man-db (2.6.7.1-1) ...
Paramétrage de tree (1.6.0-1) ...

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

root@ubuntu:/tmp/initrd# tree | more
.
├── bin
│   ├── busybox
│   ├── cpio
│   ├── date
│   ├── dd
│   ├── dmesg
│   ├── fstype
│   ├── halt
│   ├── insmod
│   ├── ipconfig
│   ├── kbd_mode
│   ├── kmod
│   ├── loadkeys
│   ├── losetup
│   ├── mount -> busybox
│   ├── nfsmount
│   ├── ntfs-3g
│   ├── pivot_root
│   ├── poweroff
│   ├── reboot
│   ├── resume
│   ├── run-init
│   ├── setfont
│   ├── sh -> busybox
│   ├── sleep -> busybox
│   └── udevadm
├── conf
│   ├── arch.conf
│   ├── conf.d
│   │   └── resume
│   └── initramfs.conf
├── etc
│   ├── console-setup
--Plus--

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

root@ubuntu:/tmp/initrd# ls
bin  conf  etc  init  lib  run  sbin  scripts

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@ubuntu:/tmp/initrd# more init
#!/bin/sh

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc
# Some things don't work properly without /etc/mtab.
ln -sf /proc/mounts /etc/mtab

grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."

# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
if ! mount -t devtmpfs -o mode=0755 udev /dev; then
	echo "W: devtmpfs not available, falling back to tmpfs for /dev"
	mount -t tmpfs -o mode=0755 udev /dev
	[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
	[ -e /dev/null ] || mknod /dev/null c 1 3
fi
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
mkdir /run/initramfs
# compatibility symlink for the pre-oneiric locations
ln -s /run/initramfs /dev/.initramfs

# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf

--Plus--(16%)

Passez en revue le contenu du script.

La commande mkinitramfs

La commande mkinitramfs permet de créer facilement une image initramfs.

Afin d'inclure des modules supplémentaires dans un nouveau fichier initramfs, il convient d'éditer le fichier /etc/initramfs-tools/modules :

/etc/initramfs-tools/modules
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
ehci-hcd
uhci-mod
ohci-mod
usb-storage
scsi-mod
sd-mod

Exécutez ensuite la commande suivante :

# mkinitramfs -o usbinitramfs-`uname -r`.img [Entrée]

Notez la présence de votre nouvelle image /tmp/initrd/usbinitramfs-3.13.0-32-generic.img.

Déplacez votre fichier usbinitramfs-3.13.0-32-generic.img au répertoire /boot :

root@ubuntu:/tmp/initrd# mv usbinitramfs-3.13.0-32-generic.img /boot
root@ubuntu:/tmp/initrd# cd /boot
root@ubuntu:/boot# ls 
abi-3.13.0-32-generic     grub                          memtest86+.bin  memtest86+_multiboot.bin      usbinitramfs-3.13.0-32-generic.img
config-3.13.0-32-generic  initrd.img-3.13.0-32-generic  memtest86+.elf  System.map-3.13.0-32-generic  vmlinuz-3.13.0-32-generic

Créez maintenant le fichier /etc/grub.d/09_usbubuntu :

#!/bin/sh -e
cat << EOF
menuentry 'Ubuntu avec USB' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-70eb8bc5-1759-433d-9797-9342a7b82cb2' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	insmod part_msdos
	insmod ext2
	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  70eb8bc5-1759-433d-9797-9342a7b82cb2
	else
	  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
	fi
	linux	/boot/vmlinuz-3.13.0-32-generic root=UUID=70eb8bc5-1759-433d-9797-9342a7b82cb2 ro  quiet splash $vt_handoff
	initrd	/boot/usbinitramfs-3.13.0-32-generic.img
}
EOF

Rendez ce fichier exécutable :

root@ubuntu:/boot# cd /etc/grub.d
root@ubuntu:/etc/grub.d# chmod +x 09_usbubuntu

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

root@ubuntu:/etc/grub.d# update-grub
Création du fichier de configuration GRUB…
Attention : Définir GRUB_TIMEOUT à une valeur non nulle si GRUB_HIDDEN_TIMEOUT est définie n’est plus possible.
Image Linux trouvée : /boot/vmlinuz-3.13.0-32-generic
Image mémoire initiale trouvée : /boot/initrd.img-3.13.0-32-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
fait

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

...
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/09_usbubuntu ###
menuentry 'Ubuntu avec USB' --class ubuntu --class gnu-linux --class gnu --class os  'gnulinux-simple-70eb8bc5-1759-433d-9797-9342a7b82cb2' {
	recordfail
	load_video
	gfxmode 
	insmod gzio
	insmod part_msdos
	insmod ext2
	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  70eb8bc5-1759-433d
-9797-9342a7b82cb2
	else
	  search --no-floppy --fs-uuid --set=root 70eb8bc5-1759-433d-9797-9342a7b82cb2
	fi
	linux	/boot/vmlinuz-3.13.0-32-generic root=UUID=70eb8bc5-1759-433d-9797-9342a7b82cb2 ro  quiet splash 
	initrd	/boot/usbinitramfs-3.13.0-32-generic.img
}
### END /etc/grub.d/09_usbubuntu ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
...

Processus de Démarrage de Linux

Le processus de démarrage de Linux peut être divisé en 6 étapes :

Etape Description
Chargement, configuration et exécution du chargeur du noyau Le fichier bootsect.s est chargé en mémoire par le BIOS. Une fois configuré celui-ci charge le reste du noyau en mémoire
Configuration des paramètres et bascule vers le mode 32 bits Le fichier boot.s met en place un IDT (Interrupt Descriptor Table) temporaire et GDT (Global Descriptor Table) temporaire et gère le basculement vers le mode 32 bits
Décompression du Noyau Le fichier head.s décompresse le noyau
Initialisation du noyau et de la mémoire Le fichier head.s crée un GDT et IDT définitif
Configuration du noyau Le fichier main.c met en place les contraintes de mémoire et configure la mémoire virtuelle
Création du processus Init Le fichier main.c crée le processus init

La fonction init_post() essaie ensuite d'exécuter un des processus suivant dans l'ordre :

  • /sbin/init
  • /etc/init
  • /bin/init
  • /bin/sh

Dans le cas d'un échec à ce stade le message Kernel Panic sera afficher.

Processus Init

Le premier processus lancé par le noyau est Init. L'exécutable lancé est /sbin/init. Son rôle est de d'initialiser le système et de lancer certains autres services. Les tâches accomplies par init sont :

  • le montage de /proc et de /sys
  • configuration des paramètres du noyau présents dans /etc/sysctl.conf,
  • l'activation de SELinux,
  • la mise à l'heure du système,
  • la définition des consoles textes,
  • la définition du nom de la machine,
  • la détection des périphériques USB,
  • la mise en place du support RAID et LVM,
  • l'activation des quotas de disque,
  • le montages des systèmes de fichiers,
  • le re-montage du système de fichiers racine en lecture/écriture,
  • l'activation du swap,
  • le lancement de syslog,
  • le chargement des modules du noyau,
  • le nettoyage des fichiers temporaires,
  • la définition des variables d'environnement tels PATH et RUNLEVEL

Niveaux d'exécution

Il existe 8 niveaux d'exécution ou RUNLEVELS sous Linux. Quatre des 8 sont réservés :

RUNLEVEL Description
0 Arrêt de la machine
1 Mode mono-utilisateur pour la maintenance
6 Redémarrage de la machine
S ou s Mode mono-utilisateur avec seul la partition racine montée

Les autres quatre RUNLEVELS sont définis par chaque distribution. Par exemple, sous Ubuntu, ils sont :

RUNLEVEL Description
2 Mode multi-utilisateur
3 Mode multi-utilisateur - Non-utilisé
4 Mode multi-utilisateur - Non-utilisé
5 Mode multi-utilisateur - Non-utilisé

Il existe aussi 3 pseudo-niveaux d'exécution a, b et c. Ces pseudo-niveaux permettent à init de faire quelquechose sans changer de niveau d'exécution.

Pour connaître le niveau d'exécution actuel de la machine, saisissez la commande suivante :

root@ubuntu:~# runlevel
N 2

La lettre N indique que le système n'a pas changé de niveau d'exécution depuis son démarrage.

Pour modifier le niveau d'exécution courant, il convient d'utiliser la commande init ou telinit suivie du numéro du nouveau niveau d'exécution. Ces commandes peuvent prendre plusieurs options :

Option Description
Q ou q Demande à Init de relire le fichier /etc/inittab
-t Permet de modifier le temps accordé par Init aux processus entre l'envoi du signal SIGTERM et l'envoi du signal SIGKILL

Le Système de Démarrage Unix SysV

Répertoire init.d

Le répertoire /etc/init.d contient les scripts permettant de lancer les services du système :

root@ubuntu:~# cd /etc/init.d
root@ubuntu:/etc/init.d# ls
acpid          friendly-recovery  rc                 sudo
anacron        grub-common        rc.local           udev
apparmor       halt               rcS                umountfs
apport         irqbalance         README             umountnfs.sh
avahi-daemon   kerneloops         reboot             umountroot
bluetooth      killprocs          resolvconf         unattended-upgrades
brltty         kmod               rsync              urandom
console-setup  lightdm            rsyslog            vboxadd
cron           networking         saned              vboxadd-service
cups           ondemand           sendsigs           vboxadd-x11
cups-browsed   pppd-dns           single             x11-common
dbus           procps             skeleton
dns-clean      pulseaudio         speech-dispatcher

Le script rc.S

D'après l'étude du fichier inittab, nous savons que le script /etc/init.d/rcS est exécuté en premier. Ce script appelle tous les scripts dans /etc/init.d qui sont référencés par les liens dans /etc/rcS.d/ et ceci dans un ordre numérique/alphabétique :

root@ubuntu:/etc/init.d# cat /etc/init.d/rcS
#! /bin/sh
#
# rcS
#
# Call all S??* scripts in /etc/rcS.d/ in numerical/alphabetical order
#

exec /etc/init.d/rc S

Répertoires rcx.d

Les répertoires /etc/rc0.d à /etc/rc6.d contiennent des liens vers les scripts du répertoire init.d.

Pour mieux comprendre, saisissez les commandes suivantes :

root@ubuntu:/etc/init.d# for rep in /etc/rc[2345].d; do echo "dans $rep : "; ls $rep/S*; done
dans /etc/rc2.d : 
/etc/rc2.d/S20kerneloops         /etc/rc2.d/S30vboxadd          /etc/rc2.d/S50saned      /etc/rc2.d/S99grub-common
/etc/rc2.d/S20rsync              /etc/rc2.d/S30vboxadd-x11      /etc/rc2.d/S70dns-clean  /etc/rc2.d/S99ondemand
/etc/rc2.d/S20speech-dispatcher  /etc/rc2.d/S35vboxadd-service  /etc/rc2.d/S70pppd-dns   /etc/rc2.d/S99rc.local
dans /etc/rc3.d : 
/etc/rc3.d/S20kerneloops         /etc/rc3.d/S30vboxadd          /etc/rc3.d/S50saned      /etc/rc3.d/S99grub-common
/etc/rc3.d/S20rsync              /etc/rc3.d/S30vboxadd-x11      /etc/rc3.d/S70dns-clean  /etc/rc3.d/S99ondemand
/etc/rc3.d/S20speech-dispatcher  /etc/rc3.d/S35vboxadd-service  /etc/rc3.d/S70pppd-dns   /etc/rc3.d/S99rc.local
dans /etc/rc4.d : 
/etc/rc4.d/S20kerneloops         /etc/rc4.d/S30vboxadd          /etc/rc4.d/S50saned      /etc/rc4.d/S99grub-common
/etc/rc4.d/S20rsync              /etc/rc4.d/S30vboxadd-x11      /etc/rc4.d/S70dns-clean  /etc/rc4.d/S99ondemand
/etc/rc4.d/S20speech-dispatcher  /etc/rc4.d/S35vboxadd-service  /etc/rc4.d/S70pppd-dns   /etc/rc4.d/S99rc.local
dans /etc/rc5.d : 
/etc/rc5.d/S20kerneloops         /etc/rc5.d/S30vboxadd          /etc/rc5.d/S50saned      /etc/rc5.d/S99grub-common
/etc/rc5.d/S20rsync              /etc/rc5.d/S30vboxadd-x11      /etc/rc5.d/S70dns-clean  /etc/rc5.d/S99ondemand
/etc/rc5.d/S20speech-dispatcher  /etc/rc5.d/S35vboxadd-service  /etc/rc5.d/S70pppd-dns   /etc/rc5.d/S99rc.local

Notez que chaque répertoire correspondant à un niveau d'exécution contient des liens pointant vers un script dans le répertoire /etc/init.d. La lettre S indique au script rc que le script dans /etc/init.d doit être exécuté avec l'option start. De cette façon les processus sont lancés dans le niveau d'exécution spécifié. Le numéro qui suit la lettre S indique l'ordre de lancement par le script rc. Si deux scripts dans un répertoire /etc/rcX.d ont le même numéro, l'ordre alphabétique prime. Notez aussi la présence du lien S99rc.local qui lance le script rc.local en dernier. Ce script peut contenir des commandes spécifées par root à lancer lors du démarrage de la machine.

Rappellez la commande précédente et modifiez la lettre S en K :

root@ubuntu:/etc/init.d# for rep in /etc/rc[016].d; do echo "dans $rep :"; ls $rep/K*; done
dans /etc/rc0.d :
/etc/rc0.d/K10unattended-upgrades  /etc/rc0.d/K20rsync              /etc/rc0.d/K65vboxadd-service  /etc/rc0.d/K70vboxadd-x11
/etc/rc0.d/K20kerneloops           /etc/rc0.d/K20speech-dispatcher  /etc/rc0.d/K70vboxadd
dans /etc/rc1.d :
/etc/rc1.d/K20kerneloops  /etc/rc1.d/K20saned              /etc/rc1.d/K65vboxadd-service  /etc/rc1.d/K70vboxadd-x11
/etc/rc1.d/K20rsync       /etc/rc1.d/K20speech-dispatcher  /etc/rc1.d/K70vboxadd
dans /etc/rc6.d :
/etc/rc6.d/K10unattended-upgrades  /etc/rc6.d/K20rsync              /etc/rc6.d/K65vboxadd-service  /etc/rc6.d/K70vboxadd-x11
/etc/rc6.d/K20kerneloops           /etc/rc6.d/K20speech-dispatcher  /etc/rc6.d/K70vboxadd

Ici le principe est le même sauf que la lettre K indique au script rc que le script dans /etc/init.d doit être lancé avec l'option stop.

rc.local

Le script rc.local est lancé dans les niveaux d'exécution 2, 3, 4 et 5. C'est dans ce script que root peut ajouter des commandes.

La commande update-rc.d

La commande update-rc.d est utilisée pour gérer les liens dans les répertoires rc[x].d. Cette commande permet d'insérer les liens vers un script dans /etc/init.d et prend la forme suivante :

update-rc.d <service> start <priorité de démarrage> <runlevels de démarrage> . stop <priorité d'arrêt> <runlevels d'arrêt> .

Par exemple la commande suivante crée les liens S dans rc2.d à rc5.d avec une priorité de 20 et les liens K dans rc0.d, rc1.d et rc6.d avec une priorité de 20 pour le script /etc/init.d/ssh :

# update-rc.d ssh start 20 2 3 4 5 . stop 20 0 1 6 . [Entrée]

Il existe aussi un mot clef : default. Ce mot clef indique à update-rc.d d'utiliser les valeurs spécifiées dans la command précédente.

Pour supprimer les liens il convient d'utiliser la commande suivante :

# update-rc.d -f ssh remove [Entrée]

Cette commande laisse le script ssh dans le répertoire /etc/init.d.

Options de la commande

Les options de cette commande sont :

root@debian:/etc/init.d# update-rc.d --help
update-rc.d: using dependency based boot sequencing
update-rc.d: error: --help
usage: update-rc.d [-n] [-f] <basename> remove
       update-rc.d [-n] <basename> defaults [NN | SS KK]
       update-rc.d [-n] <basename> start|stop NN runlvl [runlvl] [...] .
       update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
		-n: not really
		-f: force

The disable|enable API is not stable and might change in the future.

Le Système de Démarrage Upstart

Ubuntu utilise actuellement le système de démarrage Upstart qui remplace progressivement le système de démarrage SysV. La configuration du démarrage se trouvent dans les nombreux fichiers du répertoire /etc/init/ :

root@ubuntu:/etc/init.d# cd /etc/init
root@ubuntu:/etc/init# ls 
acpid.conf                   lightdm.conf                      pulseaudio.conf
alsa-restore.conf            modemmanager.conf                 rc.conf
alsa-state.conf              mountall-bootclean.sh.conf        rcS.conf
alsa-store.conf              mountall.conf                     rc-sysinit.conf
anacron.conf                 mountall-net.conf                 resolvconf.conf
apport.conf                  mountall-reboot.conf              rfkill-restore.conf
avahi-cups-reload.conf       mountall.sh.conf                  rfkill-store.conf
avahi-daemon.conf            mountall-shell.conf               rsyslog.conf
bluetooth.conf               mountdevsubfs.sh.conf             setvtrgb.conf
bootmisc.sh.conf             mounted-debugfs.conf              shutdown.conf
checkfs.sh.conf              mounted-dev.conf                  startpar-bridge.conf
checkroot-bootclean.sh.conf  mounted-proc.conf                 systemd-logind.conf
checkroot.sh.conf            mounted-run.conf                  tty1.conf
console.conf                 mounted-tmp.conf                  tty2.conf
console-font.conf            mounted-var.conf                  tty3.conf
console-setup.conf           mountkernfs.sh.conf               tty4.conf
container-detect.conf        mountnfs-bootclean.sh.conf        tty5.conf
control-alt-delete.conf      mountnfs.sh.conf                  tty6.conf
cron.conf                    mtab.sh.conf                      udev.conf
cups-browsed.conf            networking.conf                   udev-fallback-graphics.conf
cups.conf                    network-interface.conf            udev-finish.conf
dbus.conf                    network-interface-container.conf  udevmonitor.conf
dmesg.conf                   network-interface-security.conf   udevtrigger.conf
failsafe.conf                network-manager.conf              ufw.conf
failsafe-x.conf              passwd.conf                       upstart-file-bridge.conf
flush-early-job-log.conf     plymouth.conf                     upstart-socket-bridge.conf
friendly-recovery.conf       plymouth-log.conf                 upstart-udev-bridge.conf
gpu-manager.conf             plymouth-ready.conf               ureadahead.conf
hostname.conf                plymouth-shutdown.conf            ureadahead-other.conf
hwclock.conf                 plymouth-splash.conf              usb-modeswitch-upstart.conf
hwclock-save.conf            plymouth-stop.conf                wait-for-state.conf
irqbalance.conf              plymouth-upstart-bridge.conf      whoopsie.conf
kmod.conf                    procps.conf

Initialisation du Système

L'initialisation du système est configurée dans le fichier /etc/init/rc-sysinit.conf :

root@ubuntu:/etc/init# cat /etc/init/rc-sysinit.conf 
# rc-sysinit - System V initialisation compatibility
#
# This task runs the old System V-style system initialisation scripts,
# and enters the default runlevel when finished.

description	"System V initialisation compatibility"
author		"Scott James Remnant <scott@netsplit.com>"

start on (filesystem and static-network-up) or failsafe-boot
stop on runlevel

# Default runlevel, this may be overriden on the kernel command-line
# or by faking an old /etc/inittab entry
env DEFAULT_RUNLEVEL=2

emits runlevel

# There can be no previous runlevel here, but there might be old
# information in /var/run/utmp that we pick up, and we don't want
# that.
#
# These override that
env RUNLEVEL=
env PREVLEVEL=

console output
env INIT_VERBOSE

task

script
    # Check for default runlevel in /etc/inittab
    if [ -r /etc/inittab ]
    then
	eval "$(sed -nre 's/^[^#][^:]*:([0-6sS]):initdefault:.*/DEFAULT_RUNLEVEL="\1";/p' /etc/inittab || true)"
    fi

    # Check kernel command-line for typical arguments
    for ARG in $(cat /proc/cmdline)
    do
	case "${ARG}" in
	-b|emergency)
	    # Emergency shell
	    [ -n "${FROM_SINGLE_USER_MODE}" ] || sulogin
	    ;;
	[0123456sS])
	    # Override runlevel
	    DEFAULT_RUNLEVEL="${ARG}"
	    ;;
	-s|single)
	    # Single user mode
	    [ -n "${FROM_SINGLE_USER_MODE}" ] || DEFAULT_RUNLEVEL=S
	    ;;
	esac
    done

    # Run the system initialisation scripts
    [ -n "${FROM_SINGLE_USER_MODE}" ] || /etc/init.d/rcS

    # Switch into the default runlevel
    telinit "${DEFAULT_RUNLEVEL}"
end script

Dans ce fichier on constate la présence d'une ligne qui vérifie la présence du fichier /etc/inittab :

...
    # Check for default runlevel in /etc/inittab
    if [ -r /etc/inittab ]
    then
	eval "$(sed -nre 's/^[^#][^:]*:([0-6sS]):initdefault:.*/DEFAULT_RUNLEVEL="\1";/p' /etc/inittab || true)"
    fi
...

Ce fichier était utilisé par le système de démarrage SysV pour configurer le démarrage du système. Se trouvait notamment dans ce fichier le niveau d'exécution par défaut dans lequel le système va être mis à la fin du démarrage. Ce niveau d'exécution est appelé le niveau d'exécution par défaut. Si ce fichier existe et s'il contient une ligne de type id:2:initdefault:, le niveau d'exécution par défaut est fixé à 2. Dans le cas inverse le niveau d'exécution par défaut est fixé par la directive env DEFAULT_RUNLEVEL=2. Notez qu'à la fin du fichier, l'exécution du script /etc/init/rcS.conf est appelée :

root@ubuntu:/etc/init# cat /etc/init/rc.conf
# rc - System V runlevel compatibility
#
# This task runs the old System V-style rc script when changing between
# runlevels.

description	"System V runlevel compatibility"
author		"Scott James Remnant <scott@netsplit.com>"

emits deconfiguring-networking
emits unmounted-remote-filesystems

start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]

export RUNLEVEL
export PREVLEVEL

console output
env INIT_VERBOSE

task

script
if [ "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" -o "$RUNLEVEL" = "6" ]; then
    status plymouth-shutdown 2>/dev/null >/dev/null && start wait-for-state WAITER=rc WAIT_FOR=plymouth-shutdown || :
fi
/etc/init.d/rc $RUNLEVEL
end script

Runlevels

La gestion des Runlevels est configurée dans le fichier /etc/init/rc.conf :

root@ubuntu:/etc/init# cat /etc/init/rc.conf
# rc - System V runlevel compatibility
#
# This task runs the old System V-style rc script when changing between
# runlevels.

description	"System V runlevel compatibility"
author		"Scott James Remnant <scott@netsplit.com>"

emits deconfiguring-networking
emits unmounted-remote-filesystems

start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]

export RUNLEVEL
export PREVLEVEL

console output
env INIT_VERBOSE

task

script
if [ "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" -o "$RUNLEVEL" = "6" ]; then
    status plymouth-shutdown 2>/dev/null >/dev/null && start wait-for-state WAITER=rc WAIT_FOR=plymouth-shutdown || :
fi
/etc/init.d/rc $RUNLEVEL
end script

[CTL]-[ALT]-[DEL]

Le comportement associé avec la combinaison de touches [CTL]-[ALT]-[DEL] est configuré dans le fichier /etc/init/control-alt-delete.conf :

root@ubuntu:/etc/init# cat /etc/init/control-alt-delete.conf
# control-alt-delete - emergency keypress handling
#
# This task is run whenever the Control-Alt-Delete key combination is
# pressed, and performs a safe reboot of the machine.

description	"emergency keypress handling"
author		"Scott James Remnant <scott@netsplit.com>"

start on control-alt-delete

task
exec shutdown -r now "Control-Alt-Delete pressed"

Configuration des Services Upstart

La configuration des services Upstart peut être visualisée en utilisant la commande initctl :

root@ubuntu:~# initctl show-config
avahi-daemon
  start on (filesystem and started dbus)
  stop on stopping dbus
mountnfs-bootclean.sh
  start on virtual-filesystems
rsyslog
  start on filesystem
  stop on runlevel [06]
tty4
  start on (runlevel [23] and ((not-container or container CONTAINER=lxc) or container CONTAINER=lxc-libvirt))
  stop on runlevel [!23]
udev
  start on virtual-filesystems
  stop on runlevel [06]
upstart-udev-bridge
  emits *-device-added
  emits *-device-removed
  emits *-device-changed
  emits *-device-online
  emits *-device-offline
  start on starting udev
  stop on stopped udev
whoopsie
  start on runlevel [2345]
  stop on runlevel [!2345]
avahi-cups-reload
  start on started avahi-daemon
mountall-net
  start on net-device-up
passwd
  start on filesystem
rc
  emits deconfiguring-networking
  emits unmounted-remote-filesystems
  start on runlevel [0123456]
  stop on runlevel [!$RUNLEVEL]
startpar-bridge
  start on (started JOB!=startpar-bridge or stopped JOB!=startpar-bridge)
ureadahead-other
  start on mounted DEVICE=[/UL]* MOUNTPOINT=/?*
apport
  start on runlevel [2345]
  stop on runlevel [!2345]
systemd-logind
  start on started dbus
  stop on stopping dbus
tty5
  start on (runlevel [23] and not-container)
  stop on runlevel [!23]
console-setup
  start on ((virtual-filesystems or starting rcS) or starting mountall-shell)
gpu-manager
  start on (((starting lightdm or starting kdm) or starting xdm) or starting lxdm)
hwclock-save
  start on runlevel [06]
irqbalance
  start on runlevel [2345]
  stop on runlevel [!2345]
plymouth-log
  start on filesystem
mountall.sh
  start on local-filesystems
failsafe
  emits failsafe-boot
  start on (filesystem and net-device-up IFACE=lo)
  stop on (static-network-up or starting rc-sysinit)
rfkill-store
  start on runlevel [016]
modemmanager
  start on starting network-manager
  stop on stopped network-manager
dbus
  start on local-filesystems
  stop on deconfiguring-networking
resolvconf
  start on mounted MOUNTPOINT=/run
  stop on runlevel [06]
failsafe-x
  start on (stopped lightdm EXIT_STATUS=[!0] or stopped gdm EXIT_STATUS=[!0])
  stop on runlevel [06]
mounted-var
  start on mounted MOUNTPOINT=/var
plymouth-shutdown
  start on (runlevel [016] and (stopped xdm or stopped uxlaunch))
plymouth
  start on starting mountall
udev-fallback-graphics
  start on (startup and (((graphics-device-added PRIMARY_DEVICE_FOR_DISPLAY=1 or drm-device-added PRIMARY_DEVICE_FOR_DISPLAY=1) or stopped udevtrigger) or container))
usb-modeswitch-upstart
  start on usb-modeswitch-upstart
checkroot.sh
  start on mounted MOUNTPOINT=/
control-alt-delete
  start on control-alt-delete
hwclock
  start on starting mountall
mounted-proc
  start on mounted MOUNTPOINT=/proc TYPE=proc
network-manager
  start on ((local-filesystems and started dbus) and static-network-up)
  stop on stopping dbus
cups-browsed
  start on (filesystem and (started cups or runlevel [2345]))
  stop on runlevel [016]
alsa-store
  start on runlevel [!2345]
setvtrgb
  start on (started plymouth-splash or started tty1)
shutdown
  start on power-status-changed
cron
  start on runlevel [2345]
  stop on runlevel [!2345]
lightdm
  emits login-session-start
  emits desktop-session-start
  emits desktop-shutdown
  start on ((((filesystem and runlevel [!06]) and started dbus) and plymouth-ready) or runlevel PREVLEVEL=S)
  stop on runlevel [016]
mountkernfs.sh
  start on virtual-filesystems
alsa-restore
  start on runlevel [2345]
mountall
  emits virtual-filesystems
  emits local-filesystems
  emits remote-filesystems
  emits all-swaps
  emits filesystem
  emits mounting
  emits mounted
  start on startup
  stop on starting rcS
mounted-debugfs
  start on mounted MOUNTPOINT=/sys/kernel/debug TYPE=debugfs
console
  start on (stopped rc RUNLEVEL=[2345] and container CONTAINER=lxc)
  stop on runlevel [!2345]
mounted-run
  start on mounted MOUNTPOINT=/run TYPE=tmpfs
acpid
  start on runlevel [2345]
  stop on runlevel [!2345]
bluetooth
  start on started dbus
  stop on stopping dbus
checkfs.sh
  start on mounted MOUNTPOINT=/
checkroot-bootclean.sh
  start on mounted MOUNTPOINT=/
mountnfs.sh
  start on remote-filesystems
ufw
  start on ((starting network-interface or starting network-manager) or starting networking)
  stop on runlevel [!023456]
kmod
  start on (startup and started udev)
plymouth-stop
  start on ((((((((((starting gdm or starting kdm) or starting xdm) or starting lxdm) or starting lightdm) or starting uxlaunch) or starting ubiquity) or starting oem-config) or stopped rc RUNLEVEL=[2345]) or starting rcS) or starting mountall-shell)
  stop on stopped plymouth
rcS
  start on runlevel S
  stop on runlevel [!S]
wait-for-state
  stop on (started $WAIT_FOR or stopped $WAIT_FOR)
bootmisc.sh
  start on virtual-filesystems
flush-early-job-log
  start on filesystem
friendly-recovery
  emits recovery
  emits startup
  emits mounted
  start on recovery
rc-sysinit
  emits runlevel
  start on ((filesystem and static-network-up) or failsafe-boot)
  stop on runlevel
upstart-socket-bridge
  emits socket
  start on net-device-up IFACE=lo
  stop on runlevel [!2345]
cups
  start on (filesystem and (started dbus or runlevel [2345]))
  stop on runlevel [016]
pulseaudio
  stop on runlevel [016]
mountdevsubfs.sh
  start on virtual-filesystems
tty2
  start on (runlevel [23] and ((not-container or container CONTAINER=lxc) or container CONTAINER=lxc-libvirt))
  stop on runlevel [!23]
upstart-file-bridge
  emits file
  start on filesystem
  stop on runlevel [!2345]
udevtrigger
  start on ((startup and started udev) and not-container)
anacron
  start on runlevel [2345]
  stop on runlevel [!2345]
mtab.sh
  start on virtual-filesystems
tty3
  start on (runlevel [23] and ((not-container or container CONTAINER=lxc) or container CONTAINER=lxc-libvirt))
  stop on runlevel [!23]
container-detect
  emits container
  emits not-container
  start on mounted MOUNTPOINT=/run
mounted-dev
  start on mounted MOUNTPOINT=/dev
udev-finish
  start on ((((startup and filesystem) and started udev) and stopped udevtrigger) and stopped udevmonitor)
alsa-state
  start on runlevel [2345]
hostname
  start on startup
mountall-reboot
  start on stopped mountall EXIT_STATUS=4
network-interface
  emits net-device-up
  emits net-device-down
  emits static-network-up
  start on net-device-added
  stop on net-device-removed INTERFACE=$INTERFACE
plymouth-ready
  emits plymouth-ready
  start on (startup or started plymouth-splash)
tty1
  start on (stopped rc RUNLEVEL=[2345] and ((not-container or container CONTAINER=lxc) or container CONTAINER=lxc-libvirt))
  stop on runlevel [!2345]
mountall-shell
  start on (stopped mountall EXIT_STATUS=[!4] or stopped mountall EXIT_SIGNAL=?*)
  stop on runlevel [06]
mounted-tmp
  start on (mounted MOUNTPOINT=/tmp or mounted MOUNTPOINT=/usr)
plymouth-splash
  start on (started plymouth and ((graphics-device-added PRIMARY_DEVICE_FOR_DISPLAY=1 or drm-device-added PRIMARY_DEVICE_FOR_DISPLAY=1) or stopped udev-fallback-graphics))
plymouth-upstart-bridge
  start on (startup or runlevel [06])
  stop on (stopping plymouth or stopping plymouth-shutdown)
udevmonitor
  start on (startup and starting udevtrigger)
  stop on stopped udevtrigger
mountall-bootclean.sh
  start on virtual-filesystems
network-interface-security
  start on ((starting network-interface or starting network-manager) or starting networking)
  stop on ((stopped network-interface JOB=$JOB INTERFACE=$INTERFACE or stopped network-manager JOB=$JOB) or stopped networking JOB=$JOB)
networking
  emits static-network-up
  emits net-device-up
  emits deconfiguring-networking
  start on (((local-filesystems and (stopped udevtrigger or container)) or runlevel [2345]) or stopped networking RESULT=failed PROCESS=post-stop EXIT_STATUS=100)
  stop on unmounted-remote-filesystems
tty6
  start on (runlevel [23] and not-container)
  stop on runlevel [!23]
dmesg
  start on runlevel [2345]
procps
  start on (virtual-filesystems or static-network-up)
rfkill-restore
  start on local-filesystems
console-font
  start on starting plymouth-splash
network-interface-container
  emits net-device-added
  start on container
ureadahead
  start on starting mountall
  stop on stopped rc

Rappelez-vous que les services Upstart sont configurés par des fichiers dans /etc/init :

root@ubuntu:~# ls /etc/init/
acpid.conf                   lightdm.conf                      pulseaudio.conf
alsa-restore.conf            modemmanager.conf                 rc.conf
alsa-state.conf              mountall-bootclean.sh.conf        rcS.conf
alsa-store.conf              mountall.conf                     rc-sysinit.conf
anacron.conf                 mountall-net.conf                 resolvconf.conf
apport.conf                  mountall-reboot.conf              rfkill-restore.conf
avahi-cups-reload.conf       mountall.sh.conf                  rfkill-store.conf
avahi-daemon.conf            mountall-shell.conf               rsyslog.conf
bluetooth.conf               mountdevsubfs.sh.conf             setvtrgb.conf
bootmisc.sh.conf             mounted-debugfs.conf              shutdown.conf
checkfs.sh.conf              mounted-dev.conf                  startpar-bridge.conf
checkroot-bootclean.sh.conf  mounted-proc.conf                 systemd-logind.conf
checkroot.sh.conf            mounted-run.conf                  tty1.conf
console.conf                 mounted-tmp.conf                  tty2.conf
console-font.conf            mounted-var.conf                  tty3.conf
console-setup.conf           mountkernfs.sh.conf               tty4.conf
container-detect.conf        mountnfs-bootclean.sh.conf        tty5.conf
control-alt-delete.conf      mountnfs.sh.conf                  tty6.conf
cron.conf                    mtab.sh.conf                      udev.conf
cups-browsed.conf            networking.conf                   udev-fallback-graphics.conf
cups.conf                    network-interface.conf            udev-finish.conf
dbus.conf                    network-interface-container.conf  udevmonitor.conf
dmesg.conf                   network-interface-security.conf   udevtrigger.conf
failsafe.conf                network-manager.conf              ufw.conf
failsafe-x.conf              passwd.conf                       upstart-file-bridge.conf
flush-early-job-log.conf     plymouth.conf                     upstart-socket-bridge.conf
friendly-recovery.conf       plymouth-log.conf                 upstart-udev-bridge.conf
gpu-manager.conf             plymouth-ready.conf               ureadahead.conf
hostname.conf                plymouth-shutdown.conf            ureadahead-other.conf
hwclock.conf                 plymouth-splash.conf              usb-modeswitch-upstart.conf
hwclock-save.conf            plymouth-stop.conf                wait-for-state.conf
irqbalance.conf              plymouth-upstart-bridge.conf      whoopsie.conf
kmod.conf                    procps.conf

Prenons comme exemple le fichier network-manager.conf :

root@ubuntu:~# cat /etc/init/network-manager.conf 
# network-manager - network connection manager
#
# The Network Manager daemon manages the system's network connections,
# automatically switching between the best available.

description	"network connection manager"

start on (local-filesystems
	  and started dbus
	  and static-network-up)
stop on stopping dbus

expect fork
respawn

script
	# set $LANG so that messages appearing on the GUI will be translated. See LP: 875017
	if [ -r /etc/default/locale ]; then
		. /etc/default/locale
		export LANG LANGUAGE LC_MESSAGES LC_ALL
	fi

	exec NetworkManager
end script

Le statut actuel des services Upstart peut être visualisé en utilisant la commande suivante :

root@ubuntu:~# initctl list
avahi-daemon start/running, process 691
mountnfs-bootclean.sh start/running
rsyslog start/running, process 614
tty4 start/running, process 744
udev start/running, process 272
upstart-udev-bridge start/running, process 267
whoopsie start/running, process 1009
avahi-cups-reload stop/waiting
mountall-net stop/waiting
passwd stop/waiting
rc stop/waiting
startpar-bridge stop/waiting
ureadahead-other stop/waiting
apport start/running
systemd-logind start/running, process 670
tty5 start/running, process 748
console-setup stop/waiting
gpu-manager stop/waiting
hwclock-save stop/waiting
irqbalance stop/waiting
plymouth-log stop/waiting
mountall.sh start/running
failsafe stop/waiting
rfkill-store stop/waiting
modemmanager stop/waiting
dbus start/running, process 555
resolvconf start/running
failsafe-x stop/waiting
mounted-var stop/waiting
plymouth-shutdown stop/waiting
plymouth stop/waiting
udev-fallback-graphics stop/waiting
usb-modeswitch-upstart stop/waiting
checkroot.sh start/running
control-alt-delete stop/waiting
hwclock stop/waiting
mounted-proc stop/waiting
network-manager stop/waiting
cups-browsed start/running, process 921
alsa-store stop/waiting
setvtrgb stop/waiting
shutdown stop/waiting
cron start/running, process 897
lightdm start/running, process 891
mountkernfs.sh start/running
alsa-restore stop/waiting
mountall stop/waiting
mounted-debugfs stop/waiting
console stop/waiting
mounted-run stop/waiting
acpid start/running, process 801
bluetooth start/running, process 681
checkfs.sh start/running
checkroot-bootclean.sh start/running
mountnfs.sh start/running
ufw start/running
kmod stop/waiting
plymouth-stop stop/waiting
rcS stop/waiting
wait-for-state stop/waiting
bootmisc.sh start/running
flush-early-job-log stop/waiting
friendly-recovery stop/waiting
rc-sysinit stop/waiting
upstart-socket-bridge start/running, process 401
cups start/running, process 4826
pulseaudio stop/waiting
mountdevsubfs.sh start/running
tty2 start/running, process 754
upstart-file-bridge start/running, process 612
udevtrigger stop/waiting
anacron stop/waiting
mtab.sh start/running
tty3 start/running, process 755
container-detect stop/waiting
mounted-dev stop/waiting
udev-finish stop/waiting
alsa-state stop/waiting
hostname stop/waiting
mountall-reboot stop/waiting
network-interface (lo) start/running
network-interface (eth0) start/running
plymouth-ready (started) start/running, process 963
tty1 start/running, process 1072
mountall-shell stop/waiting
mounted-tmp stop/waiting
plymouth-splash stop/waiting
plymouth-upstart-bridge stop/waiting
udevmonitor stop/waiting
mountall-bootclean.sh start/running
network-interface-security (network-interface/eth0) start/running
network-interface-security (network-interface/lo) start/running
network-interface-security (networking) start/running
networking start/running
tty6 start/running, process 758
dmesg stop/waiting
procps stop/waiting
rfkill-restore stop/waiting
console-font stop/waiting
network-interface-container stop/waiting
ureadahead stop/waiting

Arrêt du Système

La commande shutdown

Lors de l'arrêt de la machine, Linux procède, entre autre, aux tâches suivantes :

  • Il previent les utilisateurs,
  • Il arrête tous les services,
  • Il inscrit toutes les données sur disque,
  • Il démonte les systèmes de fichiers.

La commande utilisée pour arrêter le système est la commande shutdown :

shutdown [-t sec] [-akrhHPfnc] heure [message]

Options de la commande

Les options de cette commande sont :

root@ubuntu:/etc/init.d# shutdown --help
Utilisation: shutdown [OPTION]... TEMPS [MESSAGE]
Permet d'éteindre ou de redémarrer l'ordinateur.

Options:
  -r                          reboot after shutdown
  -h                          halt or power off after shutdown
  -H                          halt after shutdown (implies -h)
  -P                          power off after shutdown (implies -h)
  -c                          cancel a running shutdown
  -k                          only send warnings, don't shutdown
  -q, --quiet                 reduce output to errors only
  -v, --verbose               increase output to include informational messages
      --help                  display this help and exit
      --version               output version information and exit

TEMPS peut avoir différents formats, le plus commun étant simplement le mot 'now' qui va éteindre le système immédiatement. Les autres
formats valides sont +m, où m est le nombre de minutes à attendre avant d'éteindre et hh:mm qui spécifie l'heure d'extinction (sur 24
heures).

Les utilisateurs connectés sont avertis par un message envoyé sur leurs terminaux, que vous pouvez compléter par un MESSAGE optionnel. Les
messages peuvent être envoyé sans éteindre effectivement le système en utilisant l'option -k.

Si TEMPS est spécifié, la commande restera au premier plan jusqu'à ce que l'arrêt se produise. Elle peut être annulée par Ctrl-C, ou par
un autre utilisateur en utilisant l'option -c.

Par défaut, le système passe en mode mono-utilisateur (niveau d'exécution 1). Vous pouvez changer ce comportement avec les options -r ou -h,
qui indiquent respectivement que l'on souhaite redémarrer ou éteindre l'ordinateur. L'option -h peut être précisée avec -H ou -P pour soit
aller à l'état "Halt", soit aller jusqu'à mettre le système hors tension. L'option par défaut dépend des scripts d'arrêt.

Report bugs to <upstart-devel@lists.ubuntu.com>

Parmi les options les plus importantes, on note :

Option Description
-h Arrêter le système
-r Re-démarrer le système
-c Annuler l'opération shutdown en cours
-f Re-démarrer rapidement sans vérifier les systèmes de fichiers
-F Forcer la vérification des systèmes de fichiers lors du prochain démarrage

L'option time peut prendre plusieurs valeurs :

Valeur Description
hh:mm L'heure à laquelle l'opération aura lieu
+m Nombre de minutes avant que l'opération aura lieu
now L'opération est immédiate

Si l'opération est programmée pour dans moins de 5 minutes, les connexions supplémentaires sont interdites, y comprises les tentatives de connexion de root.

L'utilisation de la commande shutdown peut être accordée à d'autres utilisateurs de root en utilisant le fichier /etc/shutdown.allow

La commande reboot

Cette commande redémarre le système. Quand le système fonctionne normalement, l'exécution de reboot appelle la commande shutdown -r.

Options de la commande

Les options de cette commande sont :

root@ubuntu:/etc/init.d# reboot --help
Utilisation: reboot [OPTION]...
Redémarrer le système.

Options:
  -n, --no-sync               don't sync before reboot or halt
  -f, --force                 force reboot or halt, don't call shutdown(8)
  -p, --poweroff              switch off the power when called as halt
  -w, --wtmp-only             don't actually reboot or halt, just write wtmp record
  -q, --quiet                 reduce output to errors only
  -v, --verbose               increase output to include informational messages
      --help                  display this help and exit
      --version               output version information and exit

Cette commande permet de demander au noyau de redémarrer ou d'arrêter le système; lorsqu'elle est exécutée sans l'option -f, ou si le
niveau d'exécution du système est différent de 0 ou 6, c'est la commande /sbin/shutdown qui est lancée.


Report bugs to <upstart-devel@lists.ubuntu.com>

La commande halt

Cette commande arrête le système. Quand le système fonctionne normalement, l'exécution de halt appelle la commande shutdown -h.

Options de la commande

Les options de cette commande sont :

root@ubuntu:/etc/init.d# halt --help
Utilisation: halt [OPTION]...
Arrêter le système.

Options:
  -n, --no-sync               don't sync before reboot or halt
  -f, --force                 force reboot or halt, don't call shutdown(8)
  -p, --poweroff              switch off the power when called as halt
  -w, --wtmp-only             don't actually reboot or halt, just write wtmp record
  -q, --quiet                 reduce output to errors only
  -v, --verbose               increase output to include informational messages
      --help                  display this help and exit
      --version               output version information and exit

Cette commande permet de demander au noyau de redémarrer ou d'arrêter le système; lorsqu'elle est exécutée sans l'option -f, ou si le
niveau d'exécution du système est différent de 0 ou 6, c'est la commande /sbin/shutdown qui est lancée.


Report bugs to <upstart-devel@lists.ubuntu.com>

La commande poweroff

Cette commande arrête le système et coupe l'alimentation électrique. Elle est l'équivalente de la commande halt -p. Quand le système fonctionne normalement, l'exécution de poweroff appelle la commande shutdown -hP.

Options de la commande

Les options de cette commande sont :

root@ubuntu:/etc/init.d# poweroff --help
Utilisation: poweroff [OPTION]...
Éteindre le système.

Options:
  -n, --no-sync               don't sync before reboot or halt
  -f, --force                 force reboot or halt, don't call shutdown(8)
  -p, --poweroff              switch off the power when called as halt
  -w, --wtmp-only             don't actually reboot or halt, just write wtmp record
  -q, --quiet                 reduce output to errors only
  -v, --verbose               increase output to include informational messages
      --help                  display this help and exit
      --version               output version information and exit

Cette commande permet de demander au noyau de redémarrer ou d'arrêter le système; lorsqu'elle est exécutée sans l'option -f, ou si le
niveau d'exécution du système est différent de 0 ou 6, c'est la commande /sbin/shutdown qui est lancée.


Report bugs to <upstart-devel@lists.ubuntu.com>

<html> <center> Copyright © 2004-2016 Hugh Norris.<br><br> <a rel=“license” href=“http://creativecommons.org/licenses/by-nc-nd/3.0/fr/”><img alt=“Licence Creative Commons” style=“border-width:0” src=“http://i.creativecommons.org/l/by-nc-nd/3.0/fr/88x31.png” /></a><br />Ce(tte) oeuvre est mise à disposition selon les termes de la <a rel=“license” href=“http://creativecommons.org/licenses/by-nc-nd/3.0/fr/”>Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France</a>. </center> </html>


Menu