Création d'un environnement chroot Arch Linux

Un tutoriel existe déjà sur le wiki français de la communauté Arch Linux mais j'ai voulu le simplifier pour le mettre en œuvre plus rapidement.

  1. Pré-requis
  2. Création de l'archive chroot
  3. Références et remerciements

1. Pré-requis

  • Arch Linux à jour, si possible minimale sinon le script risque de créer beaucoup de dépendances et alourdir l'archive
  • Un script qu'on nommera chroot.sh disponible ci-dessous :

chroot.sh :

#!/bin/bash
# Utilisation: $0 <chroot_path> <program list>
rep="$1"
shift

# Copie $1 vers $2 en créant les répertoires parents.
copie_dir ()
{
    [ -e "${2}" ] && return
    rep_base=$(dirname "${2}")
    [ -d "${rep_base}" ] || {
        echo "++ mkdir -p ${rep_base}"
        mkdir -p "${rep_base}"
    }
    echo "+ cp -a $1 $2"
    cp -a "$1" "$2"
}

# Copie $1 vers $2 + copie des bibliothèques utilisées.
copie_ldd ()
{
    local src dest file f f_link
    src="$1"
    dest="$2"
    [ -e "${dest}" ] && return
    file=( $(ldd "$src" | awk '{print $3}' | grep '^/') )
    file=( "${file[@]}" $(ldd "$src" | grep '/' | grep -v '=>' | awk '{print $1}') )
    for f in "${file[@]}"
    do
        f_link=$(readlink -f "$f")
        copie_dir "$f_link" "${rep}${f}"
    done
    copie_dir "$src" "${dest}"
}

for prog in "$@"
do
    prog=$(which "$prog")
    prog_real=$(readlink -f "$prog")
    copie_ldd "$prog_real" "${rep}${prog}"
done

2. Création de l'archive chroot

Il ne nous reste plus qu'à créer notre archive en root :

cd ~
./chroot.sh chroot bash /lib/libnss_* blkid bsdtar cat cp env ex ls mkdir more mount mv nano pacman ping sh touch umount vi
cd chroot
mkdir -p dev etc/pacman.d mnt proc root sys tmp var/cache/pacman/pkg var/lib/pacman var/log
chmod 0555 proc sys
chmod 1777 tmp
chmod 0750 root
mv lib/* usr/lib
mv lib64/* usr/lib
mv usr/lib64/* usr/lib
rm -r lib lib64 usr/lib64
ln -s /proc/self/mounts etc/mtab
ln -s usr/bin bin
ln -s usr/bin sbin
ln -s usr/lib lib
ln -s usr/lib lib64
cd usr
ln -s bin sbin
ln -s lib lib64
cd ..
echo 'PS1="(Arch mini) \w \\$ "' > root/.bashrc
echo 'Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch' > etc/pacman.d/mirrorlist
echo 'Server = http://mirror.archlinux.ikoula.com/archlinux/$repo/os/$arch' >> etc/pacman.d/mirrorlist
echo 'Server = http://mir.archlinux.fr/$repo/os/$arch' >> etc/pacman.d/mirrorlist
cat > etc/pacman.conf << EOF
[options]
Architecture = auto
SigLevel = Never
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
#[multilib]
#Include = /etc/pacman.d/mirrorlist
EOF
bsdtar -Jcvf ../archlinux.chroot.$(uname -m).txz *

Vous devriez avoir une archive nommée archlinux.chroot.i686.txz ou archlinux.chroot.x86_64.txz avec comme contenu quelque chose ressemblant à ceci :

├── bin -> usr/bin
├── dev
├── etc
│   ├── mtab -> /proc/self/mounts
│   ├── pacman.conf
│   └── pacman.d
│       └── mirrorlist
├── lib -> usr/lib
├── lib64 -> usr/lib
├── mnt
├── proc
├── root
├── sbin -> usr/bin
├── sys
├── tmp
├── usr
│   ├── bin
│   │   ├── bash
│   │   ├── blkid
│   │   ├── bsdtar
│   │   ├── cat
│   │   ├── cp
│   │   ├── env
│   │   ├── ex
│   │   ├── ls
│   │   ├── mkdir
│   │   ├── more
│   │   ├── mount
│   │   ├── mv
│   │   ├── nano
│   │   ├── pacman
│   │   ├── ping
│   │   ├── sh
│   │   ├── touch
│   │   ├── umount
│   │   └── vi
│   ├── lib
│   │   ├── ld-linux-x86-64.so.2
│   │   ├── libacl.so.1
│   │   ├── libalpm.so.8
│   │   ├── libarchive.so.13
│   │   ├── libassuan.so.0
│   │   ├── libattr.so.1
│   │   ├── libblkid.so.1
│   │   ├── libbz2.so.1.0
│   │   ├── libc.so.6
│   │   ├── libcap.so.2
│   │   ├── libcrypto.so.1.0.0
│   │   ├── libcurl.so.4
│   │   ├── libdl.so.2
│   │   ├── libexpat.so.1
│   │   ├── libgpg-error.so.0
│   │   ├── libgpgme.so.11
│   │   ├── liblzma.so.5
│   │   ├── liblzo2.so.2
│   │   ├── libmount.so.1
│   │   ├── libncursesw.so.5
│   │   ├── libnsl.so.1
│   │   ├── libnss_compat-2.17.so
│   │   ├── libnss_compat.so
│   │   ├── libnss_compat.so.2
│   │   ├── libnss_db-2.17.so
│   │   ├── libnss_db.so
│   │   ├── libnss_db.so.2
│   │   ├── libnss_dns-2.17.so
│   │   ├── libnss_dns.so
│   │   ├── libnss_dns.so.2
│   │   ├── libnss_files-2.17.so
│   │   ├── libnss_files.so
│   │   ├── libnss_files.so.2
│   │   ├── libnss_hesiod-2.17.so
│   │   ├── libnss_hesiod.so
│   │   ├── libnss_hesiod.so.2
│   │   ├── libnss_myhostname.so.2
│   │   ├── libnss_nis-2.17.so
│   │   ├── libnss_nis.so
│   │   ├── libnss_nis.so.2
│   │   ├── libnss_nisplus-2.17.so
│   │   ├── libnss_nisplus.so
│   │   ├── libnss_nisplus.so.2
│   │   ├── libpthread.so.0
│   │   ├── libreadline.so.6
│   │   ├── libresolv.so.2
│   │   ├── librt.so.1
│   │   ├── libssh2.so.1
│   │   ├── libssl.so.1.0.0
│   │   ├── libuuid.so.1
│   │   └── libz.so.1
│   ├── lib64 -> lib
│   └── sbin -> bin
└── var
        ├── cache
        │   └── pacman
        │       └── pkg
        ├── lib
        │   └── pacman
        └── log

3. Références et remerciements