compilation du noyau Linux

Transcription

compilation du noyau Linux
Compilation d'un noyau
adapté à son matériel
Ou comment faire maigrir son noyau
Stéphane Téletchéa
stephane.teletchea@univ-nantes.fr
http://steletch.free.fr
Démarche de déploiement d'un noyau « maison »
Pour mettre en place un nouveau noyau adapté à ses besoins, il faut dans un premier
temps faire l'inventaire des capacités du matériel et des services que l'on veut qu'il nous
rende :
(1) Il faut que le noyau démarre l'ordinateur
(2) Il faut que les périphériques soient correctement initialisés
(3) Il faut que les interfaces d'interaction avec l'utilisateur fonctionnent (clavier, souris,
écran, lecteur d'empreinte digitale, touches de fonction, ...)
(4) Il faut que l'environnement en espace utilisateur soit présent (udev, hal, …)
(5) Il faut que l'interface graphique soit fonctionnelle (ou tout du moins l'affichage)
(6) Il faut que le système d'authentification fonctionne (réseau, matériel)
(7) Il faut que le système « survive » à une mise à jour ...
Analyse du matériel fourni par l'Université de Angers
Pour que le noyau prenne en charge correctement le matériel dans son ensemble, il faut
que chaque composant soit pris en charge par le noyau, soit compilé au sein du noyau
lui-même, soit par un module qui sera chargé au moment du démarrage ou de l'utilisation
du matériel.
Afin de lister les composants nécessaires au bon fonctionnement de l'ordinateur portable,
nous allons explorer les composants matériels présents au sein de l'ordinateur :
●
Type de processeur
●
Chipsets (northbridge / southbridge)
●
Ports USB
●
Composants réseau (ethernet, WiFi, bluetooth)
●
Carte (s) graphique (s), écran, clavier, souris
●
Autres composants (son, carte PCMCIA, webcam, firewire ...)
Interaction du noyau avec le matériel et l'utilisateur
●
●
●
●
●
●
Chaque composant matériel est géré par un module du noyau ou directement
intégré dans le noyau monolithique
Certains modules sont dépendants de composants de plus haut niveau pour
fonctionner
Certains matériels ont besoin de « firmwares » pour fonctionner (puce WiFi), en
dehors de l'arborescence standard du noyau
L'interaction espace noyau – espace utilisateur nécessite une couche d'abstraction
générique qui évolue dans le temps, par exemple la migration de « hal » vers
« udev », et maintenant vers « systemd » …
Certaines interactions du système nécessitent plusieurs « couches » logicielles pour
une bonne interaction entre deux matériels (par exemple pour communiquer en
bluetooth avec son téléphone portable)
Pour répondre à toutes ces contraintes, les noyaux des distributions sont très/trop
complets, il faut donc restreindre leurs possibilités
Étudier la configuration matérielle de l'ordinateur
Le rôle et le fonctionnement du noyau étant complexe, il est plus simple de découvrir ce qui
est utilisé par le noyau en étudiant le fonctionnement du noyau fourni par la distribution (voir
aussi http://wiki.debian.org/fr/HowToIdentifyADevice/)
●
lspci
●
lsusb
●
lspcmcia
●
lscgroup
●
lsubsys
●
lstopo
●
cat /proc/cpuinfo
●
lshal
●
udevadm monitor
Carte mère, image issue de http://www.choixpc.com/cartemer.htm, 12 nov 2012
Étudier la configuration matérielle de l'ordinateur (lspci)
00:00.0 Host bridge: Intel Corporation Core Processor DRAM Controller (rev 02)
00:01.0 PCI bridge: Intel Corporation Core Processor PCI Express x16 Root Port (rev 02)
00:16.0 Communication controller: Intel Corporation 5 Series/3400 Series Chipset HECI Controller (rev 06)
00:16.3 Serial controller: Intel Corporation 5 Series/3400 Series Chipset KT Controller (rev 06)
00:19.0 Ethernet controller: Intel Corporation 82577LM Gigabit Network Connection (rev 05)
00:1a.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 05)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 1 (rev 05)
00:1c.1 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 2 (rev 05)
00:1c.3 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 4 (rev 05)
00:1c.7 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 8 (rev 05)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation Mobile 5 Series Chipset LPC Interface Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 6 port SATA AHCI Controller (rev 05)
00:1f.6 Signal processing controller: Intel Corporation 5 Series/3400 Series Chipset Thermal Subsystem (rev 05)
01:00.0 VGA compatible controller: NVIDIA Corporation GT216 [Quadro FX 880M] (rev a2)
01:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
44:00.0 Network controller: Intel Corporation Centrino Ultimate-N 6300 (rev 35)
45:00.0 USB controller: NEC Corporation uPD720200 USB 3.0 Host Controller (rev 04)
46:06.0 FireWire (IEEE 1394): Ricoh Co Ltd R5C832 IEEE 1394 Controller (rev 06)
46:06.1 SD Host controller: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 25)
46:06.2 System peripheral: Ricoh Co Ltd R5C592 Memory Stick Bus Host Adapter (rev 14)
46:06.3 System peripheral: Ricoh Co Ltd xD-Picture Card Controller (rev 14)
46:06.4 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev bb)
ff:00.0 Host bridge: Intel Corporation Core Processor QuickPath Architecture Generic Non-core Registers (rev 02)
ff:00.1 Host bridge: Intel Corporation Core Processor QuickPath Architecture System Address Decoder (rev 02)
ff:02.0 Host bridge: Intel Corporation Core Processor QPI Link 0 (rev 02)
ff:02.1 Host bridge: Intel Corporation Core Processor QPI Physical 0 (rev 02)
ff:02.2 Host bridge: Intel Corporation Core Processor Reserved (rev 02)
ff:02.3 Host bridge: Intel Corporation Core Processor Reserved (rev 02)
Configuration matérielle de l'ordinateur (pcmcia, usb)
lspcmcia
Socket 0 Bridge:
Socket 0 Device 0:
[yenta_cardbus]
[pata_pcmcia]
(bus ID: 0000:46:06.4)
(bus ID: 0.0)
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 03f0:231d Hewlett-Packard
Bus 001 Device 004: ID 138a:0007 Validity Sensors, Inc. VFS451 Fingerprint Reader
Bus 001 Device 005: ID 04f2:b15e Chicony Electronics Co., Ltd
Les modules présents avec le noyau générique
Module
Size Used by
pci_stub
12550 1
vboxpci
22882 0
vboxnetadp
13328 0
vboxnetflt
27211 0
vboxdrv
252188 3 vboxpci,vboxnetadp,vboxnetflt
pata_pcmcia
16938 1
bnep
17830 2
rfcomm
38139 12
tpm_infineon
17296 0
snd_hda_codec_hdmi
31775 4
uvcvideo
67203 0
videodev
86588 1 uvcvideo
btusb
17912 2
bluetooth
158438 23 bnep,rfcomm,btusb
nvidia
10962318 42
pcmcia
39791 1 pata_pcmcia
arc4
12473 2
ppdev
12849 0
joydev
17393 0
mxm_wmi
12859 0
snd_hda_codec_idt
60251 1
libcrc32c
12543 1 btrfs
hp_wmi
13652 0
sparse_keymap
13658 1 hp_wmi
parport_pc
32114 1
video
19068 0
tpm_tis
18308 0
r852
17901 0
sm_common
16737 1 r852
nand
49667 2 r852,sm_common
nand_ids
8547 1 nand
mtd
35584 2 sm_common,nand
nand_bch
13003 1 nand
bch
21757 1 nand_bch
nand_ecc
13070 1 nand
yenta_socket
27465 0
pcmcia_rsrc
18367 1 yenta_socket
pcmcia_core
21511 3
pcmcia,yenta_socket,pcmcia_rsrc
snd_hda_intel
32765 5
snd_hda_codec
109562 3 snd_hda_codec_hdmi,snd_hda_codec_idt,snd_hda_intel
snd_hwdep
13276 1 snd_hda_codec
r592
17808 0
memstick
15857 1 r592
hp_accel
25728 0
lis3lv02d
19268 1 hp_accel
input_polldev
13648 1 lis3lv02d
snd_pcm
80845 3 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec
wmi
18744 2 mxm_wmi,hp_wmi
snd_seq_midi
13132 0
snd_rawmidi
25424 1 snd_seq_midi
snd_seq_midi_event
14475 1 snd_seq_midi
snd_seq
51567 2 snd_seq_midi,snd_seq_midi_event
iwlwifi
291907 0
mac_hid
13077 0
snd_timer
28931 2 snd_pcm,snd_seq
snd_seq_device
14172 3 snd_seq_midi,snd_rawmidi,snd_seq
mac80211
436455 1 iwlwifi
psmouse
72919 0
intel_ips
17822 0
serio_raw
13027 0
mei
36570 0
snd
62064 20
snd_hda_codec_hdmi,snd_hda_codec_idt,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,
snd_rawmidi,snd_seq,snd_timer,snd_seq_device
cfg80211
178679 2 iwlwifi,mac80211
lp
17455 0
soundcore
14635 1 snd
parport
40930 3 ppdev,parport_pc,lp
snd_page_alloc
14108 2 snd_hda_intel,snd_pcm
firewire_ohci
40172 0
firewire_core
56906 1 firewire_ohci
crc_itu_t
12627 1 firewire_core
sdhci_pci
18324 0
sdhci
28241 1 sdhci_pci
e1000e
140005 0
btrfs
638208 0
zlib_deflate
26622 1 btrfs
Récupérer l'archive et la décompresser
wget ftp://ftp.free.fr/mirrors/ftp.kernel.org/linux/kernel/v3.x/linux-3.6.6.tar.xz
tar -Jxvf linux-3.6.6.tar.xz
[stephane@presquelabo linux-3.6.3]$ ls -1
arch
block
COPYING
CREDITS
crypto
Documentation
drivers
firmware
fs
include
init
ipc
Kbuild
Kconfig
Kernel
lib
MAINTAINERS
Makefile
mm
net
README
REPORTING-BUGS
samples
scripts
security
sound
tools
usr
virt
Also note that the only valid version of the GPL as far as the kernel
is concerned is _this_ particular version of the license (ie v2, not
v2.2 or v3.x or whatever), unless explicitly otherwise stated.
Linus Torvalds
---------------------------------------GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Linux kernel release 3.x <http://kernel.org/>
These are the release notes for Linux version 3. Read them carefully,
as they tell you what this is all about, explain how to install the
kernel, and what to do if something goes wrong.
WHAT IS LINUX?
Linux is a clone of the operating system Unix, written from scratch by
Linus Torvalds with assistance from a loosely-knit team of hackers across
the Net. It aims towards POSIX and Single UNIX Specification compliance.
It has all the features you would expect in a modern fully-fledged Unix,
including true multitasking, virtual memory, shared libraries, demand
loading, shared copy-on-write executables, proper memory management,
and multistack networking including IPv4 and IPv6.
Préparer l'environnement de compilation
Pour utiliser l'interface « Gtk » de configuration des paramètres du noyau :
sudo apt-get install libgtk2.0-dev libglade2-dev libglib2.0-dev
Préparer le code du noyau pour la compilation
cd linux-3.6.6
make mrproper
"make gconfig"
X windows (Gtk) based configuration tool.
Paramétrer les options du noyau à configurer
Version locale du noyau
Type de processeur
Support des boutons tactiles
Réseau sans fil
Système de fichiers pour le système
Système de fichiers pour Windows
Utilisation des « control groups »
Utilisation de périphériques « exotiques »
Prise en charge de l'USB 3.0
Prise en charge de l'€uro
Gérer la sécurité du système : selinux / apparmor, ...
Gérer la sécurité du système
Pour en savoir plus : https://help.ubuntu.com/community/AppArmor
Compiler son (premier) noyau !!!
etudiant@ZYZ:~/compilation/linux-3.6.3$ time make -j 5
…
Setup is 15200 bytes (padded to 15360 bytes).
System is 5472 kB
CRC f678266f
Kernel: arch/x86/boot/bzImage is ready (#1)
real
4m32.077s
user
15m16.053s
sys
0m56.232s
Compiler et installer les modules
sudo time make modules_install
INSTALL arch/x86/kernel/test_nx.ko
INSTALL drivers/bluetooth/btusb.ko
INSTALL drivers/net/wireless/iwlwifi/dvm/iwldvm.ko
INSTALL drivers/net/wireless/iwlwifi/iwlwifi.ko
INSTALL net/netfilter/xt_LOG.ko
INSTALL net/netfilter/xt_mark.ko
DEPMOD 3.6.6-master2SILI
0.12user 0.16system 0:00.59elapsed 49%CPU (0avgtext+0avgdata 23200maxresident)k
0inputs+1144outputs (0major+86435minor)pagefaults 0swaps
Les modules sont installés dans le répertoire /lib/modules
Mise en place du noyau pour un redémarrage
sudo cp arch/x86/boot/bzImage /boot/vmlinuz-3.6.6-master2SILI
sudo cp System.map /boot/System.map-3.6.6-master2SILI
sudo cp .config /boot/config-3.6.6master-2SILI
Il faut aussi créer l'image de démarrage 'initramfs' qui va servir à charger le SE après la décompression du noyau :
sudo dracut -v /boot/initrd.img-3.6.6-master2SILI 3.6.6-master2SILI
...
I: Wrote /boot/initrd.img-3.6.6-master-2SILI:
I: -rw-r--r-- 1 root root 4734667 oct. 24 22:59 /boot/initrd.img-3.6.6-master2SILI
Ajout de l'entrée du noyau dans le menu de GRUB
sudo gedit /boot/grub/grub.cfg
etudiant@ZYZ:/boot/grub$ diff -Naup grub.cfg~ grub.cfg
--- grub.cfg~ 2012-10-24 22:20:20.702075287 +0200
+++ grub.cfg 2012-10-24 23:03:03.898140918 +0200
@@ -90,6 +90,16 @@ menuentry 'Ubuntu 12.04 LTS' --class ubu
linux /vmlinuz root=/dev/sda5 ro quiet splash
initrd /initrd.img
}
+menuentry 'Ubuntu 12.04 LTS menu MASTER 2 SILI' --class ubuntu --class gnu-linux --class gnu --class os {
+
recordfail
+
gfxmode
+
insmod gzio
+
insmod part_msdos
+
insmod ext2
+
set root='(hd0,msdos5)'
+
linux /boot/vmlinuz-3.6.6-master2SILI root=/dev/sda5 ro quiet splash
+
initrd /boot/initrd.img-3.6.6-master2SILI
+}
menuentry "Microsoft Windows 7" --class windows --class os {
insmod part_msdos
insmod ntfs
Et on redémarre sur le nouveau noyau ...
Les problèmes commencent ...
Affichage graphique non pris en charge ...
Problème : l'affichage graphique avec le pilote « nouveau » n'est pas suffisant pour prendre en compte la
résolution de l'écran avec la carte graphique fournie de l'ordinateur portable.
Il faut installer le pilote de nvidia (le plus récent qui prend en charge le noyau 3.6.6).
1 – basculer en mode « console » avec ctrl+alt+F1
2 – arrêter le serveur d'affichage : sudo service lightdm stop
3 – télécharger le dernier pilote chez NVIDIA :
wget http://us.download.nvidia.com/XFree86/Linux-x86/304.64/NVIDIA-Linux-x86-304.64.run
4 – installer le pilote : sudo su ./NVIDIA-Linux-x86-304.64.run en suivant les étapes de l'assistant :
→ Accept
→ Yes (pre-install script failed)
→ Yes (register the kernel module sources with DKMS)
→ Yes (run the nvidia-xconfig utility)
→ OK.
5 – relancer le serveur graphique : sudo service lightdm start
6 – se connecter à son compte comme d'habitude
Et le reste ?
Il faut vérifier si l'ensemble du matériel est bien reconnu (a minima les ports USB, le réseau, les boutons du
clavier, le son, …).
Parfois, c'est à l'usage que l'on se rend compte qu'il manque quelque chose :
etudiant@ZYZ:~$ sudo iotop
Could not run iotop as some of the requirements are not met:
- Linux >= 2.6.20 with
- I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT,
CONFIG_TASK_IO_ACCOUNTING)
etudiant@ZYZ:/lib/modules$ grep TASK /boot/config-3.6.6-master2SILI
# CONFIG_TASKSTATS is not set
# CONFIG_DETECT_HUNG_TASK is not set
Virtualbox ne fonctionne plus …
Le module pour virtualbox a été construit avec le mécanisme « dkms », cependant il ne supporte pas la
version de notre noyau, il faut mettre à jour VirtualBox et les modules associés, au moins à la version 4.1.20,
délivrée le 20 août 2012.
Quel intérêt au final ?
Le noyau est plus « petit », mieux adapté au matériel, plus spécifique de la configuration, et il occupe moins de
place :
Ls -hl /boot
-rw-r--r-- 1 root root 144K sept. 27 01:04 config-3.2.0-32-generic-pae
-rw-r--r-- 1 root root 77K nov. 13 00:41 config-3.6.6-master2SILI
-rw-r--r-- 1 root root 21M oct. 24 22:20 initrd.img-3.2.0-32-generic-pae
-rw-r--r-- 1 root root 4,6M nov. 13 00:42 initrd.img-3.6.6-master2SILI
-rw------- 1 root root 2,3M sept. 27 01:04 System.map-3.2.0-32-generic-pae
-rw-r--r-- 1 root root 2,1M nov. 13 00:41 System.map-3.6.6-master2SILI
-rw------- 1 root root 4,8M sept. 27 01:04 vmlinuz-3.2.0-32-generic-pae
-rw-r--r-- 1 root root 4,3M nov. 13 00:41 vmlinuz-3.6.6-master2SILI
etudiant@ZYZ:/lib/modules$ du -hs *
109M 3.2.0-32-generic-pae
12M 3.6.6-master2SILI
Il doit être possible de faire encore beaucoup plus restreint, à vous de jouer !
Compiler son kernel à la « debian-way », pour aller plus loin
http://doc.ubuntu-fr.org/kernel
http://doc.ubuntu-fr.org/tutoriel/compiler_linux
http://doc.ubuntu-fr.org/tutoriel/tout_savoir_sur_les_modules_linux
http://doc.ubuntu-fr.org/tutoriel/comment_compiler_un_kernel_de_kernel.org
http://www.howtoforge.com/kernel_compilation_ubuntu_p2
http://wiki.debian.org/fr/HowToIdentifyADevice/
https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks
http://ck.kolivas.org/patches/bfs/bfs-faq.txt
Beaucoup de liens intéressants dans ~/linux-x.y.z/Documentation/kernel-docs.txt
A me rendre ...
Une archive contenant (à déposer sur un système de transfert de fichiers).
/boot
/lib/modules/<kernel name>
lsmod (sur le noyau compilé à façon)
Une explication sur la compilation du noyau, les périphériques pris en charge par les modules, les problèmes
rencontrés.