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
- 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