LFS – Préparation de l’environnement

LFS

Site officiel : Linux From Scratch



Standards à respecter :

Source : http://iv. LFS et les standards


Linux Standard Base (LSB) :

Source : http://iv. LFS et les standards

Coeur (Core) :

At (BLFS)BashBatch
(partie d’At, BLFS)
BcBinutilsCoreutils
Cpio (BLFS)DiffutilsEd (BLFS)
Fcrontab (BLFS)FileFindutils
GawkGrepGzip
Initd-tools (BLFS)Lsb_release (BLFS)M4
Man-DBNcursesNSPR (BLFS)
NSS (BLFS)PAM (BLFS)Pax (BLFS)
ProcpsPsmiscSed
Sendmail
(ou Postfix ou Exim, BLFS)
ShadowTar
Time (BLFS)Util-linuxZlib

Bureau (Desktop) :

Alsa (BLFS)ATK (BLFS)Cairo (BLFS)
Desktop-file-utils (BLFS)Freetype (BLFS)Fontconfig (BLFS)
Gdk-pixbuf (BLFS)Glib2 (BLFS)GTK+2 (BLFS)
Icon-naming-utils (BLFS)Libjpeg-turbo (BLFS)Libpng (BLFS)
Libtiff (BLFS)Libxml2 (BLFS)MesaLib (BLFS)
Pango (BLFS)Qt4 ou Qt5
(ni LFS ni BLFS, but required for LSB)
Xdg-utils (BLFS)
Xorg (BLFS)

Langages à l’exécution (Runtime languages) :

PerlPythonLibxml2 (BLFS)
Libxslt (BLFS)

Impression (Printing) :

CUPS (BLFS)Cups-filters (BLFS)Ghostscript (BLFS)
SANE (BLFS)

Gtk3 et images (Gtk3 and Graphics) :

GTK+3 (BLFS)

Paquets à construire pour générer un système minimal fonctionnel :

Source : v. Raison de la présence des paquets dans le livre

Rmq : Certains paquets viennent s’ajouter à ceux requis par la LSB

AclAttrAutoconf
AutomakeBash (LSB)Bc (LSB)
Binutils (LSB)BisonBzip2
Check (TEMP)Coreutils (LSB)D-Bus
DejaGNU (TEMP)Diffutils (LSB)E2fsprogs
ExpatExpect (TEMP)File (LSB)
Findutils (LSB)FlexGawk (LSB)
GccGDBMGettext
GlibcGMPGperf
Grep (LSB)GroffGRUB
Gzip (LSB)Iana-etcInetutils
IntltoolIProute2Kbd
KmodLessLibcap
LibelfLibffiLibpipeline
LibtoolNoyau LinuxM4 (LSB)
MakeMan-DB (LSB)Man-pages
MesonMPCMPFR
NinjaNcurses (LSB)Openssl
PatchPerl (LSB)Pkg-config
Procps-NG (LSB)Psmisc (LSB)Python 3 (LSB)
ReadlineSed (LSB)Shadow (LSB)
SystemdTar (LSB)Tcl (TEMP)
TexinfoUtil-linux (LSB)Vim
XML::ParserXZ UtilsZlib (LSB)

Paquets prérequis que doit posséder la machine hôte :

Source : 2.2. Prérequis du système hôte

bash
GNU Bourne Again SHell
binutils
GNU assembler, linker and binary utilities
bison
YACC-compatible parser generator
bzip2
High-quality block-sorting file compressor – utilities
coreutils
GNU core utilities
diffutils
File comparison utilities
findutils
Utilities for finding files–find, xargs
gawk
GNU awk, a pattern scanning and processing language
gcc
GNU C compiler
glibc (libc6)
GNU C Library: Shared libraries
grep
GNU grep, egrep and fgrep
gzip
GNU compression utilities
m4
Macro processing language
make
Utility for directing compilation
patch
Apply a diff file to an original
perl
Larry Wall’s Practical Extraction and Report Language
python
Interactive high-level object-oriented language
sed
GNU stream editor for filtering/transforming text
tar
GNU version of the tar archiving utility
texinfo
Documentation system for on-line information and printed output
xz-utils
XZ-format compression utilities

Scripts effectuant la vérification des prérequis de la machine hôte :

#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
    echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
    echo yacc is `/usr/bin/yacc --version | head -n1`
else
    echo "yacc not found"
fi
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -h /usr/bin/awk ]; then
    echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
    echo awk is `/usr/bin/awk --version | head -n1`
else
    echo "awk not found"
fi
gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
    then echo "g++ compilation OK";
    else echo "g++ compilation failed"; fi
rm -f dummy.c dummy

Correctifs personnels apportés à l’hôte pour le rendre compatible avec les prérequis ci-dessus :

rm /bin/sh
ln -s /bin/bash /bin/sh
apt-get install bison m4 texinfo
# bash version-check.sh
bash, version 4.4.12(1)-release
/bin/sh -> /bin/bash
Binutils: (GNU Binutils for Debian) 2.28
bison (GNU Bison) 3.0.4
/usr/bin/yacc -> /usr/bin/bison.yacc
bzip2,  Version 1.0.6, 6-Sept-2010.
Coreutils:  8.26
diff (GNU diffutils) 3.5
find (GNU findutils) 4.7.0-git
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)
/usr/bin/awk -> /usr/bin/gawk
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
(Debian GLIBC 2.24-11+deb9u4) 2.24
grep (GNU grep) 2.27
gzip 1.6
Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13)
m4 (GNU M4) 1.4.18
GNU Make 4.1
GNU patch 2.7.5
Perl version='5.24.1';
sed (GNU sed) 4.4
tar (GNU tar) 1.29
texi2any (GNU texinfo) 6.3
xz (XZ Utils) 5.2.2
g++ compilation OK

Ajout d’un nouveau disque pour héberger LFS :

Sources :
2.4. Créer une nouvelle partition
2.5. Créer un système de fichiers sur la partition

Le nouveau disque (/dev/sdb) aura une capacité de 50 Go et hébergera les partitions suivantes :

POINT DE MONTAGETAILLEPARTITION
/boot100 Mo/dev/sdb1
/30 Go/dev/sdb2
/home10 Go/dev/sdb3
swap2 Go/dev/sdb5
Device     Boot    Start       End  Sectors  Size Id Type
/dev/sdb1  *        2048    206847   204800  100M 83 Linux
/dev/sdb2         206848  63121407 62914560   30G 83 Linux
/dev/sdb3       63121408  84092927 20971520   10G 83 Linux
/dev/sdb4       84092928 104857599 20764672  9.9G  5 Extended
/dev/sdb5       84094976  88289279  4194304    2G 82 Linux swap / Solaris

Formatage des partitions :

mkfs -v -t ext2 /dev/sdb1
mkfs -v -t ext4 /dev/sdb2
mkfs -v -t ext4 /dev/sdb3
mkswap /dev/sdb5
lsblk -o NAME,UUID,FSTYPE,MOUNTPOINT,SIZE /dev/sdb
NAME   UUID                                 FSTYPE MOUNTPOINT  SIZE
sdb                                                             50G
├─sdb1 19d783b0-d5c2-48a8-ae19-00261fbc364c ext2               100M
├─sdb2 e1ad945c-0f19-4e29-ad60-3c3aee173923 ext4                30G
├─sdb3 212ce68d-7257-4f27-b16a-59db4ed4e813 ext4                10G
├─sdb4                                                           1K
└─sdb5 25bc3854-bc60-4627-a4e3-44f7feb81eeb swap                 2G

Définition de la variable $LFS :

Source : 2.6. Définir la variable $LFS

echo "export LFS=/mnt/lfs" >> /etc/bash.bashrc
source /etc/environment
tail -n1 /etc/environment

Monter la nouvelle partition :

Source : 2.7. Monter la nouvelle partition

mkdir -pv $LFS
mount -v -t ext4 /dev/sdb2 $LFS
mkdir -pv $LFS/{boot,home}
mount -v -t ext2 /dev/sdb1 $LFS/boot
mount -v -t ext4 /dev/sdb3 $LFS/home
swapon -v /dev/sdb5
nano /etc/fstab
UUID=e1ad945c-0f19-4e29-ad60-3c3aee173923       /mnt/lfs        ext4    defaults        0       0
UUID=19d783b0-d5c2-48a8-ae19-00261fbc364c       /mnt/lfs/boot   ext2    defaults        0       0
UUID=212ce68d-7257-4f27-b16a-59db4ed4e813       /mnt/lfs/home   ext4    defaults        0       0
UUID=25bc3854-bc60-4627-a4e3-44f7feb81eeb       none            swap    defaults        0       0
lsblk -o NAME,UUID,FSTYPE,MOUNTPOINT,SIZE /dev/sdb
NAME   UUID                                 FSTYPE MOUNTPOINT     SIZE
sdb                                                                50G
├─sdb1 19d783b0-d5c2-48a8-ae19-00261fbc364c ext2   /mnt/lfs/boot  100M
├─sdb2 e1ad945c-0f19-4e29-ad60-3c3aee173923 ext4   /mnt/lfs        30G
├─sdb3 212ce68d-7257-4f27-b16a-59db4ed4e813 ext4   /mnt/lfs/home   10G
├─sdb4                                                              1K
└─sdb5 25bc3854-bc60-4627-a4e3-44f7feb81eeb swap   [SWAP]           2G

Dépôt des sources des paquets à télécharger sur LFS :

Sources :
3.1. Introduction
3.2. Tous les paquets

Index de ftp://ftp.lfs-matrix.net/pub/
GNU Savannah – Downloads/Releases Server
Debian.org – Recherche de paquets

Liste complète des paquets et liens de téléchargement :

wget-list

Empreinte MD5 associées aux paquets précédents :

md5sums

Les paquets sources seront stockés dans le répertoire /mnt/lfs/sources :

mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
wget http://fr.linuxfromscratch.org/view/lfs-systemd-stable/wget-list -P $LFS/sources
wget http://fr.linuxfromscratch.org/view/lfs-systemd-stable/md5sums -P $LFS/sources
wget --input-file=$LFS/sources/wget-list --continue --directory-prefix=$LFS/sources
pushd $LFS/sources
md5sum -c md5sums
popd

Équivalent à :

cd $LFS/sources
md5sum -c md5sums
cd -

Les correctifs :

Par exemple ici : /mnt/lfs/sources/patches

http://www.linuxfromscratch.org/patches/lfs/8.4/bzip2-1.0.6-install_docs-1.patch
http://www.linuxfromscratch.org/patches/lfs/8.4/coreutils-8.30-i18n-1.patch
http://www.linuxfromscratch.org/patches/lfs/8.4/glibc-2.29-fhs-1.patch
http://www.linuxfromscratch.org/patches/lfs/8.4/kbd-2.0.4-backspace-1.patch
http://www.linuxfromscratch.org/patches/lfs/8.4/systemd-240-security_fixes-2.patch

Empreinte des correctifs : /mnt/lfs/sources/patches_md5sums

6a5ac7e89b791aae556de0f745916f7f  bzip2-1.0.6-install_docs-1.patch
a9404fb575dfd5514f3c8f4120f9ca7d  coreutils-8.30-i18n-1.patch
9a5997c3452909b1769918c759eff8a2  glibc-2.29-fhs-1.patch
f75cca16a38da6caa7d52151f7136895  kbd-2.0.4-backspace-1.patch
10abebce8ff5d9fd402623ace39b5ab8  systemd-240-security_fixes-2.patch
wget --input-file=$LFS/sources/patches --continue --directory-prefix=$LFS/sources
pushd $LFS/sources
md5sum -c patches_md5sums
popd

Création du répertoire temporaire de compilation des programmes pour LFS :

Source : 4.2. Créer le répertoire $LFS/tools

mkdir -v $LFS/tools
mkdir: created directory '/mnt/lfs/tools'
ln -sv $LFS/tools /tools
'/tools' -> '/mnt/lfs/tools'

Création de l’utilisateur non privilégié qui compilera les programmes ainsi que son environnement Shell :

Source :
4.3. Ajouter l’utilisateur LFS
4.4. Configurer l’environnement

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
su - lfs
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF
source ~/.bash_profile

Architecture et éditeur de liens dynamiques :

Déterminer le triplet cible à partir des sources d’un paquet (au hasard) :

cd $LFS/sources
tar Jxvf binutils-2.32.tar.xz
cd binutils-2.32/
./config.guess
x86_64-pc-linux-gnu

Déterminer l’éditeur de liens dynamiques à partir d’un binaire (au hasard) :

readelf -l /bin/ls | grep interpreter
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Déterminer l’ordre de recherche des bibliothèques par l’éditeur de liens :

ld --verbose | grep SEARCH
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
cd ..
rm -rf binutils-2.32/

Fermer le menu