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 [email protected] 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.