Cette page n'a pas encore d'étiquettes.
Apportez votre aide…

Ceci est une ancienne révision du document !


Comment patcher son noyau pour activer l'hibernation ?

Qu'est-ce que l'hibernation ?

Il existe plusieurs types de mise en veille: - La mise en veille classique ou Suspend To Ram, qui coupe le disque, où l'ordinateur continue à utiliser de la batterie pour alimenter la mémoire vive, la ram.

- Le Suspend To Disk ou hibernation est le fait de sauvegarder le contenu de la mémoire vive sur le disque dur. Le disque dur étant une mémoire non volatile, l'alimentation se coupe complétement. Au redémarrage, on charge l'image depuis le disque dur dans la mémoire vive, et l'on retrouve son ordinateur dans l'état où on l'avait laissé.

Quelles solutions existe-t-il sous linux ?

Le noyau Linux inclut par défaut une fonction d'hibernation (suspend to disk) qui est assez longue. Il existe une autre solution, plus performante, pour mettre son ordinateur en hibernation : SWSUSP2.

SWSUSP2, est un patch à appliquer au noyau. Il permet de compresser l'image de la ram avant de l'écrire sur le disque ce qui permet de faire une hibernation en environ 6s.

Dans ce tutoriel je vais vous expliquer comment appliquer le patch au noyau afin d'obtenir cette fonctionnalité.

Télécharger les paquets

La première chose à faire est de récupérer les paquets nécessaires à la compilation de son noyau:

sudo apt-get install build-essential bin86 libncurses-dev alien kernel-package
sudo apt-get -y install linux-tree-2.6.12
cd /usr/src

Puis on récupère le patch swsusp2:

sudo wget http://ubuntu.griffin3.com/software-suspend-2.1.9.9-for-2.6.12-ubuntu5.10.tar.bz2
sudo wget http://www.suspend2.net/downloads/all/hibernate-1.12-1.i386.rpm
sudo wget http://www.suspend2.net/downloads/all/suspend2-userui-0.5.1.tar.gz

Ensuite, pour compiler le noyau, nous allons installer gcc-3.4 (par défaut Ubuntu Breezy installe gcc 4.0):

sudo apt-get install gcc-3.4 

Nous allons indiquer au système l'utilisation de gcc-3.4 pour la compilation, en exportant la variable CC:

export CC=gcc-3.4

Il ne reste plus qu'à décompresser le patch et le noyau fraîchement téléchargé:

sudo tar -xjf software-suspend-2.1.9.9-for-2.6.12-ubuntu5.10.tar.bz2
sudo tar -zxf suspend2-userui-0.5.1.tar.gz
sudo tar -xjf linux-source-2.6.12.tar.bz2
sudo ln -s linux-source-2.6.12 linux
cd /usr/src/linux

Application du patch

Avant d'appliquer le patch au noyau, nous allons récupérer notre configuration noyau par défaut lors de l'installation de Ubuntu:

sudo cp /boot/config-2.6.12-9-386 .config
sudo make oldconfig

Maintenant, nous appliquons le patch :

sudo ../software-suspend-2.1.9.9-for-2.6.12-ubuntu5.10/apply

Notre noyau est maintenant patché.

Configuration du noyau

Par défaut, Ubuntu démarre avec un initramfs, nous n'aborderons pas la manière d'utiliser swsups2 avec initramfs, ce qui est en soit assez compliqué. Mais sachez qu'il est tout à fait possible de l'utiliser, j'expliquerai plus tard comment faire.

Afin d'accélérer swsusp2, il va falloir compiler le pilote du chipset en dur dans le noyau. Pour connaitre le chipset IDE de votre machine:

sudo lspci | grep IDE

Dans mon cas, cette commande donne:

0000:00:1f.1 IDE interface: Intel Corp. 82801DBM (ICH4) Ultra ATA Storage Controller (rev 03)

Ce qui signifie que je possède un chipset Intel qu'il faudra que je compile en dur dans le noyau, ce qui permettra d'accélérer par 5 ou 6 la mise en hibernation.

Pour pouvoir activer l'hibernation, il vous faut savoir quel est votre partition swap. En effet, lors de la mise en hibernation, swsusp2 va recopier le contenu de la RAM dans la swap. A la sortie de l'hibernation, le contenu de la swap sera copié en RAM pour retrouver le système tel qu'il était avant l'hibernation.

Pour connaître le nom de la partition swap sur votre système, il vous suffit d'entrer la commande suivante :

sudo cat /etc/fstab | grep swap

Dans mon cas, cette commande donne

/dev/hda7       none            swap    sw              0       0

Ce qui signifie que j'utilise la partition hda7 comme partition de swap.

Passons à la configuration:

sudo make menuconfig

Voici les modifications à apporter. C'est la partie la plus délicate, mais très instructive, de ce tutorial:

#    General setup --->
#        (-hibernate) Local version - append to kernel release
#    Power management options (ACPI, APM) --->
#        [ ]   Software Suspend (EXPERIMENTAL)
#        <*> Software Suspend 2 --->
#            <*> Swap Writer
#            (swap:/dev/hda7) La partition par défaut qu'utilisera swsups2, mettez la votre
#    Device Drivers --->
#        ATA/ATAPI/MFM/RLL support ---> On compile en dur la gestion des disques, car on n'utilisera pas initramfs
#            <*> ATA/ATAPI/MFM/RLL support
#            <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
#            <*> Include IDE/ATA-2 DISK support
#            <*> generic/default IDE chipset support
#=== Son chipset ide, chez moi: (cela permet d'accélérer par 5-7 fois la mise en hibernation
#            <*> Intel PIIXn chipsets support #===votre chipset IDE
#    File systems --->
#        <*> Ext3 journalling file system support #==== en dur votre file system, moi c ext3
#    Cryptographic options  --->
#        <*>   LZF compression algorithm #==== On va utiliser la compression LZF, pour la mise en hibernation
#===Maintenant le type de processeur que vous utilisez.
#    Processor type and features  --->
#        Processor family (Athlon/Duron/K7) #===your processor

Ne compilez pas le noyau, nous le ferons plus tard en créant un paquet .deb.

Swsusp2 fournit deux interfaces affichant une barre de progression lors de l'hibernation et lors du réveil:

  • Une interface texte
  • Une interface graphique utilisant le frame buffer

Je n'utilise pas l'interface frame buffer qui ralentit considérablement la mise en veille. Donc je n'expliquerais ici que la manière installer l'UI text.

Compilation et installation :

cd /usr/src/suspend2-userui-0.5.1
sudo make suspend2ui_text
sudo cp -p suspend2ui_text /usr/local/sbin

Nous avons déjà téléchargé le paquet rpm du dernier script. Nous allons donc le convertir en paquet deb puis l'installer:

cd /usr/src
sudo alien -d hibernate-1.12-1.i386.rpm 
sudo dpkg -i hibernate_1*.deb

Maintenant, passons à la configuration:

sudo gedit /etc/hibernate/hibernate.conf

Rendez-vous aux lignes suivantes, et effectuez les opérations indiquées:

ImageSizeLimit nocache # Décommentez et ajouter "nocache"
ProcSetting expected_compression 50 # Décommentez

# Ajouter cette ligne
ProcSetting userui_program /usr/local/sbin/suspend2ui_text
SwitchToTextMode no # Décommentez

Nous sommes maintenant prêts à compiler notre noyau:

cd /usr/src/linux
sudo make-kpkg --append-to-version=swsusp2 kernel_image

Vous pouvez maintenant aller prendre un café, car cette opération nécessite un certain temps… Une fois fini, ré-installez votre nouveau noyau en installant le paquet généré:

cd /usr/src
sudo dpkg -i kernel-image-2.6.12swsusp2*.deb

Redémarrez pour utiliser votre nouveau noyau.

Après tous ces efforts, nous sommes prêts à effectuer notre première hibernation:

sudo hibernate

Stats

Après votre première hibernation, vous pouvez récupérer quelques statistiques sur l'hibernation en entrant:

sudo cat /proc/software_suspend/debug_info |grep 'compression\|speed'

Dans mon cas, cela donne:

- Overall expected compression percentage: 50.
  Compressed 283107328 bytes into 144722852 (48 percent compression).
- I/O speed: Write 45 MB/s, Read 41 MB/s.

Ce qui est important, c'est la vitesse I/O. Si cette vitesse avoisine 5, c'est que vous n'avez pas compilé le bon module de gestion de votre chipset IDE.

Linux Restricted Module

Quand vous recompilez votre noyau, vous ne pouvez plus utiliser les paquets officiels pour les modules propriétaires. Mais ce n'est pas dramatique, effectuez les commandes suivantes :

cd /usr/src
sudo module-assistant

Et suivez le guide pour réinstaller les modules propriétaires: nvidia, madwifi, etc…

Il existe des problèmes avec les drivers proprios fglrx et nvidia, moi je ne m'en sers pas. Si vous avez des problèmes, utilisez les drivers radeon et nv.

Problèmes éventuels avec FAT32 et Windows

Si vous avez des partitions FAT32 montées et que vous utilisez le script hibernate sur un ordinateur multi-boot, vous aurez peut-être des problèmes de corruption de système de fichiers si vous lancez Windows depuis grub au boot suivant (en réalité, vous ne le verrez qu'après avoir rebooté sous Linux).

Pour résoudre ce problème, il suffit de taper

sudo gedit /etc/hibernate/hibernate.conf

et de rajouter, à la section ### filesystem, la ligne suivante:

UnmountFSTypes vfat 

(Pour les autres types de systèmes de fichiers Windows, remplacez vfat par fat ou msdos selon votre cas.)

Les partitions seront ainsi démontées automatiquement à chaque lancement du script et vous éviterez les conflits.

Problèmes de compilation avec Ndiswrapper

La compilation en dur de Ndiswrapper semble provoquer des erreurs au moment de la recompilation du kernel. Si c'est le cas réessayez en décochant Ndiswrapper au moment de la configuration avec make menuconfig.

Noyaux "prêts à l'emploi" pour Dapper

  • tutoriel/comment_patcher_son_noyau_pour_activer_hibernation.1165234532.txt.gz
  • Dernière modification: Le 18/04/2011, 14:50
  • (modification externe)