Installation par les sources

1. Principe

Une installation par les sources est en général documentée par ses auteurs dans un fichier README, docs/INSTALL.txt ou autre. En général, la compilation d’un logiciel consiste à :

  1. Récupérer et décompresser les sources.
  2. Disposer des outils de compilation et des librairies nécessaires.
  3. Configurer la compilation en lançant un programme / commande étendue ou en éditant un fichier configuration
  4. Vérifier les dépendances
  5. Exécuter la compilation dans un dossier temporaire sans droit root.
  6. Placer les binaires compilés (exécutables et librairies) et les fichiers de configuration aux endroits habituels du système.
  7. Eventuellement la compilation a donné lieu à un paquet de distribution à installer.
  8. Enfin, il sera peut être nécessaire de configurer un service qui lance le résultat de la compilation.

2. Installation des outils de compilation

Ces outils sont gcc, c++, make et d’autres.

En RHEL7/Centos 7 :

yum groupinstall "Development Tools"

En Debian / Ubuntu :

apt-get install build-essential

En Arch Linux :

pacman -Sy base-devel

3. Exemples d’installations par les sources

Ce document regorge d’exemples de logiciels compilés et installés de cette manière.

  • John the Ripper sous Centos 7
  • Stress-ng sous Centos 7
  • Apache 2 sous Debian 8
  • Asterisk sous Centos 7
  • Un noyau Linux sous Debian 8

4. Fabrication de paquets

Il pourrait sembler incongru de s’intéresser à la fabrication des paquets. En effet, pourquoi se passer d’un certain support communautaire ou commercial ? Aussi, la tâche de “mainteneur” n’est pas chose aisée. Mais selon la nature, la taille ou la mentalité d’un organisation et de son équipe IT, on imagine qu’une vue sur l’origine des binaires distribués dans une infrastructure soit un avantage de l’Open Source. Il semblerait même qu’il soit fortement conseillé de s’intéresser au sujet, ne fut-ce que pour mieux maîtriser son système et sa sécurité.

On pourrait construire des paquets à partir de deux sources :

  • A partir paquets originaux (dits “sources”)
  • Directement à partir des sources du logiciel lui-même

Quelle est l’utilité de re-construire des paquets à partir des sources de leur fabrication ?

  • Pour re-générer le paquet binaire
  • Pour dépanner des problèmes avec des librairies ou des applications
  • Pour modifier l’application actuelle pour ajouter de la journalisation (logging)
  • Pour confirmer qu’un patch de sécurité a été correctement appliqué dans la source

Quelle est l’utilité de construire un paquet à partir des sources originales ?

  • Le paquet source n’existe pas déjà.
  • On le construit pour un script ou une application “maison”

5. Fabrication de paquets RPM pour Centos 7

En cours de développement.

6. Compilation du noyau (sous forme de paquet .deb)

Cette opération peut prendre plusieurs heures.

L’exercice en Debian 8 propose de :

Récupérer les sources d’une version du noyau Linux, de réaliser la compilation et enfin de fabriquer un paquet à installer.

Les noyaux restant sous le contrôle du système de paquetage, ils peuvent être rapidement supprimés ou déployés sur plusieurs machines. De plus, les scripts associés à ces paquets permettent également une meilleure interaction avec le chargeur de démarrage et le générateur d’images de démarrage (initrd). (Source)[https://debian-handbook.info/browse/fr-FR/stable/sect.kernel-compilation.html#sect.kernel-compilation-prerequisites]

6.1. Récupération des sources

On peut trouver les sources sous forme de paquet qui les placera dans le x. Ces sources ne sont pas exactement celles de kernel.org.

# apt-get update
# apt-cache search ^linux-source
linux-source-3.16 - Linux kernel source for version 3.16 with Debian patches
linux-source - Linux kernel source (meta-package)
# apt-get -y install linux-source-3.16
# ls /usr/src/linux-source*
/usr/src/linux-source-3.16.tar.xz

On peut aussi prendre les sources officielles sur ftp.kernel.org.

Exemple d’époque en Centos7 :

$ ftp ftp.kernel.org
Trying 149.20.4.69...
Connected to ftp.kernel.org (149.20.4.69).
220 Welcome to kernel.org
Name (ftp.kernel.org:francois): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls pub/linux/kernel/v*
227 Entering Passive Mode (149,20,4,69,119,116).
150 Here comes the directory listing.
drwxrwxr-x 2 ftp ftp 4096 Mar 20 2003 v1.0
drwxrwxr-x 2 ftp ftp 36864 Mar 20 2003 v1.1
drwxrwxr-x 2 ftp ftp 12288 Mar 20 2003 v1.2
drwxrwxr-x 2 ftp ftp 69632 Mar 20 2003 v1.3
drwxrwxr-x 3 ftp ftp 32768 Feb 08 2004 v2.0
drwxrwxr-x 2 ftp ftp 98304 Mar 20 2003 v2.1
drwxrwxr-x 3 ftp ftp 20480 Mar 24 2004 v2.2
drwxrwxr-x 2 ftp ftp 36864 Mar 20 2003 v2.3
drwxrwxr-x 5 ftp ftp 36864 May 01 2013 v2.4
drwxrwxr-x 4 ftp ftp 57344 Jul 14 2003 v2.5
drwxrwxr-x 10 ftp ftp 73728 Aug 08 2013 v2.6
lrwxrwxrwx 1 ftp ftp 4 Nov 23 2012 v3.0 -> v3.x
drwxrwxr-x 5 ftp ftp 262144 Aug 23 13:26 v3.x
drwxr-xr-x 5 ftp ftp 36864 Aug 22 21:21 v4.x
226 Directory send OK.
ftp> ls pub/linux/kernel/v4.x/linux-4.7*
227 Entering Passive Mode (149,20,4,69,117,64).
150 Here comes the directory listing.
-rw-r--r-- 1 ftp ftp 137739500 Aug 16 19:59 linux-4.7.1.tar.gz
-rw-r--r-- 1 ftp ftp 819 Aug 16 19:59 linux-4.7.1.tar.sign
-rw-r--r-- 1 ftp ftp 90398912 Aug 16 19:59 linux-4.7.1.tar.xz
-rw-r--r-- 1 ftp ftp 137745639 Aug 20 16:18 linux-4.7.2.tar.gz
-rw-r--r-- 1 ftp ftp 819 Aug 20 16:18 linux-4.7.2.tar.sign
-rw-r--r-- 1 ftp ftp 90408888 Aug 20 16:18 linux-4.7.2.tar.xz
-rw-r--r-- 1 ftp ftp 137727435 Jul 24 20:00 linux-4.7.tar.gz
-rw-r--r-- 1 ftp ftp 473 Jul 24 20:00 linux-4.7.tar.sign
-rw-r--r-- 1 ftp ftp 90412100 Jul 24 20:00 linux-4.7.tar.xz
226 Directory send OK.
ftp> quit
221 Goodbye.

6.2. Exercice de récupération d’un noyau 4.9 en Debian 8

Installation des logiciels pré-requis.

En tant que super-utilisateur.

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc
sudo apt-get install kernel-package

Obtention des sources

A exécuter comme utilisateur non-root.

Téléchargement des sources et décompression de l’archive.

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.8.tar.xz
unxz linux-4.9.8.tar.xz
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.8.tar.sign

Ajout de la clé publique qui de l’auteur des sources

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 38DBBDC86092693E

gpg: key 38DBBDC86092693E: public key "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

Vérification du fichier archive.

gpg2 --verify linux-4.9.8.tar.sign

gpg: assuming signed data in 'linux-4.9.8.tar'
gpg: Signature made Sat 04 Feb 2017 09:47:47 AM CET using RSA key ID 6092693E
gpg: Good signature from "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

Désarchiver les sources.

tar xvf linux-4.9.8.tar

Configuration

Se rendre dans le dossier des sources et copier la configuration courante du noyau.

cd linux-4.9.8/
cp /boot/config-$(uname -r) .config
make menuconfig
.config - Linux/x86 4.9.8 Kernel Configuration
──────────────────────────────────────────────────────────────────────────────
 ┌───────────────── Linux/x86 4.9.8 Kernel Configuration ──────────────────┐
 │  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty │
 │  submenus ----).  Highlighted letters are hotkeys.  Pressing <Y>        │
 │  includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to │
 │  exit, <?> for Help, </> for Search.  Legend: [ ] built-in  [ ]         │
 │ ┌─────────────────────────────────────────────────────────────────────┐ │
 │ │    [ ] 64-bit kernel                                                │ │
 │ │        General setup  --->                                          │ │
 │ │    [ ] Enable loadable module support  --->                         │ │
 │ │    [ ] Enable the block layer  --->                                 │ │
 │ │        Processor type and features  --->                            │ │
 │ │        Power management and ACPI options  --->                      │ │
 │ │        Bus options (PCI etc.)  --->                                 │ │
 │ │        Executable file formats / Emulations  --->                   │ │
 │ │    [ ] Networking support  --->                                     │ │
 │ │        Device Drivers  --->                                         │ │
 │ └────┴(+)─────────────────────────────────────────────────────────────┘ │
 ├─────────────────────────────────────────────────────────────────────────┤
 │        <Select>    < Exit >    < Help >    < Save >    < Load >         │
 └─────────────────────────────────────────────────────────────────────────┘

Choisir < Save > et < Exit >

Compilation

Nettoyer l’arbre des soureces et remettre à zéro le kernel-package.

make-kpkg clean

Compilation croisée.

fakeroot make-kpkg --initrd --revision=1.0.SPEC kernel_image kernel_headers -j2

La commande explicite fakeroot démarre la commande make-kpkg qui fabrique un paquet debian (.deb). Les options choisies sont :

  • --initrd : crée une image initrd.
  • --revision=1.0 : Révsion personnalisée.
  • kernel_image : produit le noyau en format de paquet debian configuré par le fichier de configuration .config.
  • kernel_headers : produit aussi les en-têtes du noyau en format de paquets debian.
  • -j2 : comilation croisée avec 2 CPUs.

Installation

ls  ../*.deb
../linux-headers-4.9.8_1.0.SPEC_amd64.deb  ../linux-image-4.9.8_1.0.SPEC_amd64.deb
sudo dpkg -i linux-image-4.9.8_1.0.SPEC_amd64.deb
sudo dpkg -i linux-headers-4.9.8_1.0.SPEC_amd64.deb

Redémarrage

sudo shutdown -r now

Vérificcation.

uname -a
uname -r
uname -mrs
dmesg | more
dmesg | egrep -i --color 'error|critical|failed'

Script

https://gist.githubusercontent.com/goffinet/559f5e176fc60e14841e6ae033e1ad93/raw/bbd3b0b0d28389e0c83ab18a51e9e3f471f9b27f/kernel.deb.sh

#!/bin/bash
sudo apt update && apt update -yqq && apt dist-upgrade -yqq
sudo apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc -yqq
sudo apt install kernel-package -yqq
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.8.tar.xz
unxz linux-4.9.8.tar.xz
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.8.tar.sign
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 38DBBDC86092693E
gpg2 --verify linux-4.9.8.tar.sign
tar xvf linux-4.9.8.tar
cd linux-4.9.8/
cp /boot/config-$(uname -r) .config
make menuconfig
make-kpkg clean
fakeroot make-kpkg --initrd --revision=1.0.spec kernel_image kernel_headers -j 4
ls ../*.deb