# Construction d'une Image XEN archlinux {{INLINETOC}} Cet article présente la création d'une image Archlinux (ARM32 ou ARM64) avec un noyau xen. Il s'inspire de https://github.com/dornerworks/xen-rpi4-builder qui propose un ensemble de scripts permettant de produire une image Ubuntu avec XEN pour Raspberry Pi4. Les étapes de construction de l'image sont résumées dans le [[cookbooks:rpi-xen-dom-0|cookbook rpi-xen-dom-0]] et le schéma suivant: .-=----------------------------------------. | hôte | | | | .--------------------------------. | .----------------------------------------. | | Jail CHroot /mnt/lfs | | | Etape 1 Construction des binaire | | | | | .----------------------------------------. | | .----------------------------. | | | | | bootfiles | | | .----------------------------------------. | | | bcm2711-rpi-4-b.dtb | | | | Etape 2 Assemblage du bootfiles | | | | config.txt | | | | | | '-----+ cmdline.txt | | | | | | | | | kernel8.img | | | | | | | | | overlays/pi4-64-xen.dtbo | | | | | | | | .----------------------------. | | | | | | | | | | | | | .--------------------------------. | .----------------------------------------. | | | | | .--------------------------------. | .----------------------------------------. | | | Jail Chroot | | | Etape 3 Chargement de l'image système | | | | /tmp/ramdisk/qemu-arm64-rootfs/| | | | | | | .----------------------------. | | | | | | | | ArchLinuxARM-rpi-aarch64 | | | | | | | | | -prepped.tar.gz | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | .------------+---------------. | | | | | | | | | | | | | | .--------------|-----------------. | .----------------------------------------. | | mount| | | | v | | | .--------------------------------. | .----------------------------------------. | | | chroot /tmp/rpi-arm64-rootfs/ | | | Etape 4 Finalisation de l'image | | | cp| | | | | | '-->| | | | | | | | | | | | .--------------------------------. | .----------------------------------------. | | .------------------------------------------. Il ne faut pas se mélanger dans les chroot, chacun a normalement son propre prompt! ## Etape 1: Construction des binaires Cette section décrit la compilation dans un jail chroot `/mnt/lfs` des binaires: * bcm2711-rpi-4-b.dtb * pi4-xx-xen.dtbo * kernel * xen * xen-tools * modules ### Entrer dans un jail chroot de build Système hôte ``` export LFS=/mnt/lfs sudo mount -v --bind /dev $LFS/dev sudo mount -vt devpts devpts $LFS/dev/pts sudo mount -vt tmpfs shm $LFS/dev/shm sudo mount -vt proc proc $LFS/proc sudo mount -vt sysfs sysfs $LFS/sys sudo mkdir -pv $LFS/build sudo mount -v --bind ./build $LFS/build $ sudo chroot $LFS /usr/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash --login ``` Jail chroot /tmp/lfs ### Préparation de l'environnement de construction ``` export WRKDIR=$(pwd)/ export ARM64_TOOLCHAIN_WRKDIR=$(pwd)/ export ARM64_TOOLCHAIN_SCRIPTDIR=$(cd $(dirname ${BASH_SOURCE}) && pwd)/ ``` #### Installation des paquets requis ``` sudo apt install device-tree-compiler tftpd-hpa flex bison qemu-utils kpartx git curl qemu-user-static binfmt-support parted bc libncurses5-dev libssl-dev pkg-config python acpica-tools wget gettext ``` ``` sudo apt install ccache ``` #### Chargement de la Toolchain arm64 ``` export ARM64_TOOLCHAIN_VERSION="9.2-2019.12" export ARM64_TOOLCHAIN_FILENAME=gcc-arm-${ARM64_TOOLCHAIN_VERSION}-x86_64-aarch64-none-linux-gnu sudo ln -s ../../bin/ccache /usr/lib/ccache/aarch64-none-linux-gnu-gcc sudo ln -s ../../bin/ccache /usr/lib/ccache/aarch64-none-linux-gnu-g++ wget https://developer.arm.com/-/media/Files/downloads/gnu-a/${ARM64_TOOLCHAIN_VERSION}/binrel/${ARM64_TOOLCHAIN_FILENAME}.tar.xz tar -xf ${ARM64_TOOLCHAIN_FILENAME}.tar.xz cd ${ARM64_TOOLCHAIN_WRKDIR} PATH=/usr/lib/ccache:${ARM64_TOOLCHAIN_SCRIPTDIR}${ARM64_TOOLCHAIN_FILENAME}/bin:$(echo ${PATH} | sed 's|/usr/lib/ccache:||g') ``` #### Chargement de la Toolchain arm32 ``` export ARM32_TOOLCHAIN_VERSION="9.2-2019.12" export ARM32_TOOLCHAIN_FILENAME=gcc-arm-${ARM32_TOOLCHAIN_VERSION}-x86_64-arm-none-linux-gnueabihf export ARM32_TOOLCHAIN_WRKDIR=$(pwd)/ export ARM32_TOOLCHAIN_SCRIPTDIR=$(cd $(dirname ${BASH_SOURCE}) && pwd)/ sudo ln -s ../../bin/ccache /usr/lib/ccache/arm-none-linux-gnueabihf-gcc sudo ln -s ../../bin/ccache /usr/lib/ccache/arm-none-linux-gnueabihf-g++ cd ${ARM32_TOOLCHAIN_SCRIPTDIR} wget https://developer.arm.com/-/media/Files/downloads/gnu-a/${ARM32_TOOLCHAIN_VERSION}/binrel/${ARM32_TOOLCHAIN_FILENAME}.tar.xz tar -xf ${ARM32_TOOLCHAIN_FILENAME}.tar.xz cd ${ARM32_TOOLCHAIN_WRKDIR} PATH=/usr/lib/ccache:${ARM32_TOOLCHAIN_SCRIPTDIR}${ARM32_TOOLCHAIN_FILENAME}/bin:$(echo ${PATH} | sed 's|/usr/lib/ccache:||g') ``` ### Chargement des firmware ``` export XEN_ADDR=0x00200000 export DTBFILE=bcm2711-rpi-4-b.dtb if [ "${BUILD_ARCH}" == "arm64" ]; then DTBXENO=pi4-64-xen else source ${SCRIPTDIR}toolchain-arm-linux-gnueabihf.sh DTBXENO=pi4-32-xen fi ``` Cloner les sources ``` if [ ! -d firmware ]; then mkdir -p firmware/boot cd firmware/boot wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup4.dat wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup4cd.dat wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup4db.dat wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup4x.dat wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start4.elf wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start4cd.elf wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start4db.elf wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start4x.elf cd ${WRKDIR} fi ``` ### Récupération des sources Cloner le dépôt xen: ``` if [ ! -d xen ]; then git clone --depth=1 --branch RELEASE-4.15.1 git://xenbits.xen.org/xen.git fi ``` Cloner les sources du noyau (par exemple pour le noyau 5.10.y ``` if [ ! -d linux ]; then git clone --depth 1 --branch rpi-5.10.y https://github.com/raspberrypi/linux.git linux cd linux git am ${SCRIPTDIR}patches/linux/*.patch cd ${WRKDIR} fi ``` From: Corey Minyard Date: Wed, 17 Nov 2021 12:41:32 -0500 Subject: [PATCH] Add Xen overlay for the Pi 4 Signed-off-by: Corey Minyard --- arch/arm/boot/dts/overlays/Makefile | 4 +- .../boot/dts/overlays/pi4-32-xen-overlay.dts | 21 ++++++++++ .../boot/dts/overlays/pi4-64-xen-overlay.dts | 39 +++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 arch/arm/boot/dts/overlays/pi4-32-xen-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/pi4-64-xen-overlay.dts diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile index a6b0d9ea0385..4cfe5885eca1 100644 --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -244,7 +244,9 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ w1-gpio-pullup.dtbo \ w5500.dtbo \ wittypi.dtbo \ - wm8960-soundcard.dtbo + wm8960-soundcard.dtbo \ + pi4-32-xen.dtbo \ + pi4-64-xen.dtbo targets += dtbs dtbs_install targets += $(dtbo-y) diff --git a/arch/arm/boot/dts/overlays/pi4-32-xen-overlay.dts b/arch/arm/boot/dts/overlays/pi4-32-xen-overlay.dts new file mode 100644 index 000000000000..47afa6ac24b7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pi4-32-xen-overlay.dts @@ -0,0 +1,21 @@ +// Xen configuration for Pi 4 +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2711"; + + fragment@0 { + target-path = "/chosen"; + __overlay__ { + #address-cells = <0x1>; + #size-cells = <0x1>; + xen,xen-bootargs = "console=dtuart dtuart=/soc/serial@7e215040 sync_console dom0_mem=512M dom0_max_vcpus=1 bootscrub=0"; + + dom0 { + compatible = "xen,linux-zimage", "xen,multiboot-module"; + reg = <0x00400000 0x01800000>; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlays/pi4-64-xen-overlay.dts b/arch/arm/boot/dts/overlays/pi4-64-xen-overlay.dts new file mode 100644 index 000000000000..6c499a831db6 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pi4-64-xen-overlay.dts @@ -0,0 +1,39 @@ +// Xen configuration for Pi 4 +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2711"; + + fragment@0 { + target-path = "/chosen"; + __overlay__ { + #address-cells = <0x1>; + #size-cells = <0x1>; + xen,xen-bootargs = "console=dtuart dtuart=/soc/serial@7e215040 sync_console dom0_mem=512M bootscrub=0"; + + dom0 { + compatible = "xen,linux-zimage", "xen,multiboot-module"; + reg = <0x00480000 0x01780000>; + }; + }; + }; + + /* Introduce a dummy device node to make Xen map the framebuffer */ + fragment@1 { + target-path = "/"; + __overlay__ { + fb_bus { + compatible = "simple-bus"; + ranges; + #address-cells = <2>; + #size-cells = <1>; + fb_mem { + compatible = "dummy"; + status = "okay"; + reg = <0x0 0x3b400000 0x04c00000>; + }; + }; + }; + }; +}; -- 2.34.0 ### Construction du noyau arm64 En l'absence d'un fichier `${WRKDIR}linux/.build-arm64/.config` on utilise kernel/configs/xen.config fragment ``` cd ${WRKDIR}linux if [ "${BUILD_ARCH}" == "arm64" ]; then if [ ! -s ${WRKDIR}linux/.build-arm64/.config ]; then # utilize kernel/configs/xen.config fragment make O=.build-arm64 ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- bcm2711_defconfig xen.config fi make O=.build-arm64 ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j $(nproc) broadcom/${DTBFILE} make O=.build-arm64 ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j $(nproc) overlays/${DTBXENO}.dtbo if [ ! -s ${WRKDIR}linux/.build-arm64/arch/arm64/boot/Image ]; then echo "Building kernel. This takes a while. To monitor progress, open a new terminal and use \"tail -f buildoutput.log\"" make O=.build-arm64 ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j $(nproc) > ${WRKDIR}buildoutput.log 2> ${WRKDIR}buildoutput2.log fi elif [ "${BUILD_ARCH}" == "armhf" ]; then if [ ! -s ${WRKDIR}linux/.build-arm32/.config ]; then # utilize kernel/configs/xen.config fragment make O=.build-arm32 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- bcm2711_defconfig xen.config fi make O=.build-arm32 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j $(nproc) ${DTBFILE} make O=.build-arm32 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j $(nproc) overlays/${DTBXENO}.dtbo if [ ! -s ${WRKDIR}linux/.build-arm32/arch/arm/boot/zImage ]; then echo "Building kernel. This takes a while. To monitor progress, open a new terminal and use \"tail -f buildoutput.log\"" make O=.build-arm32 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j $(nproc) zImage modules dtbs > ${WRKDIR}buildoutput.log 2> ${WRKDIR}buildoutput2.log fi fi cd ${WRKDIR} ``` ### Construction du noyau Xen ``` if [ ! -s ${WRKDIR}xen/xen/xen ]; then cd ${WRKDIR}xen if [ ! -s xen/.config ]; then cat > xen/arch/arm/configs/rpi4_defconfig << EOF CONFIG_DEBUG=y CONFIG_SCHED_ARINC653=y CONFIG_EARLY_UART_CHOICE_8250=y CONFIG_EARLY_UART_BASE_ADDRESS=0xfe215040 CONFIG_EARLY_UART_8250_REG_SHIFT=2 EOF make -C xen XEN_TARGET_ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- rpi4_defconfig fi make XEN_TARGET_ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- dist-xen -j $(nproc) cd ${WRKDIR} fi ``` ### Construction des outils Xen Cette section présente la construction et l'activation les outils XEN suivants: - **xen-qemu-dom0-disk-backend**: Démarrage de QEMU en tant que backend de disque - **xen-init-dom0.service xen-init-dom0**: initialiser la configuration Dom0 (nœuds xenstore, stub de configuration JSON) - **xenconsoled**: gère la journalisation à partir des consoles invitées et de l'hyperviseur - **xendomains**: démarre et arrête les invités au démarrage et à l'arrêt - **xen-watchdog**: exécute le démon de surveillance xen Retourner dans le répertoire des sources xen: ``` cd ${WRKDIR}xen ``` Déclarer les préfixes utilisés pour la construction ``` if [ "${BUILD_ARCH}" == "arm64" ]; then LIB_PREFIX=aarch64-linux-gnu CROSS_PREFIX=aarch64-none-linux-gnu XEN_ARCH=arm64 elif [ "${BUILD_ARCH}" == "armhf" ]; then LIB_PREFIX=arm-linux-gnueabihf CROSS_PREFIX=arm-none-linux-gnueabihf XEN_ARCH=arm32 fi ``` Modifier les liens symboliques de la bibliothèque partagée en liens relatifs au lieu de liens absolus afin qu'ils fonctionnent bien avec la compilation croisée: ``` sudo chroot ${MNTROOTFS} symlinks -c /usr/lib/${LIB_PREFIX}/ ``` Indiquer au compilateur natif dans quel système il inclut les répertoires qu'il recherche. ``` SYSINCDIRS=$(echo bash -c "echo | gcc -E -Wp,-v -o /dev/null - 2>&1" | grep "^ " | sed "s|^ /| -isystem${MNTROOTFS}|")) SYSINCDIRSCXX=$(echo bash -c "echo | g++ -x c++ -E -Wp,-v -o /dev/null - 2>&1" | grep "^ " | sed "s|^ /| -isystem${MNTROOTFS}|")) CC="${CROSS_PREFIX}-gcc --sysroot=${MNTROOTFS} -nostdinc ${SYSINCDIRS} -B${MNTROOTFS}lib/${LIB_PREFIX} -B${MNTROOTFS}usr/lib/${LIB_PREFIX}" CXX="${CROSS_PREFIX}-g++ --sysroot=${MNTROOTFS} -nostdinc ${SYSINCDIRSCXX} -B${MNTROOTFS}lib/${LIB_PREFIX} -B${MNTROOTFS}usr/lib/${LIB_PREFIX}" LDFLAGS="-Wl,-rpath-link=${MNTROOTFS}lib/${LIB_PREFIX} -Wl,-rpath-link=${MNTROOTFS}usr/lib/${LIB_PREFIX}" ``` Configurer la source des build: ``` PKG_CONFIG_LIBDIR=${MNTROOTFS}usr/lib/${LIB_PREFIX}/pkgconfig:${MNTROOTFS}usr/share/pkgconfig \ PKG_CONFIG_SYSROOT_DIR=${MNTROOTFS} \ LDFLAGS="${LDFLAGS}" \ PYTHON=${MNTROOTFS}/usr/bin/python3 \ ./configure \ --with-system-qemu=/usr/bin/qemu-system-i386 \ --enable-systemd \ --disable-xen \ --enable-tools \ --disable-docs \ --disable-stubdom \ --disable-golang \ --prefix=/usr \ --with-xenstored=xenstored \ --build=x86_64-linux-gnu \ --host=${CROSS_PREFIX} \ CC="${CC}" \ CXX="${CXX}" ``` Construire les binaires dist-tools: ``` PKG_CONFIG_LIBDIR=${MNTROOTFS}usr/lib/${LIB_PREFIX}/pkgconfig:${MNTROOTFS}usr/share/pkgconfig \ PKG_CONFIG_SYSROOT_DIR=${MNTROOTFS} \ LDFLAGS="${LDFLAGS}" \ make dist-tools \ CROSS_COMPILE=${CROSS_PREFIX}- XEN_TARGET_ARCH=${XEN_ARCH} \ CC="${CC}" \ CXX="${CXX}" \ -j $(nproc) ``` Construire les binaires install-tools: ``` sudo --preserve-env PATH=${PATH} \ PKG_CONFIG_LIBDIR=${MNTROOTFS}usr/lib/${LIB_PREFIX}/pkgconfig:${MNTROOTFS}usr/share/pkgconfig \ PKG_CONFIG_SYSROOT_DIR=${MNTROOTFS} \ LDFLAGS="${LDFLAGS}" \ make install-tools \ CROSS_COMPILE=${CROSS_PREFIX}- XEN_TARGET_ARCH=${XEN_ARCH} \ CC="${CC}" \ CXX="${CXX}" \ DESTDIR=${MNTROOTFS} ``` ### Compilation des modules ``` cd ${WRKDIR}linux if [ "${BUILD_ARCH}" == "arm64" ]; then sudo --preserve-env PATH=${PATH} make O=.build-arm64 ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- INSTALL_MOD_PATH=${MNTROOTFS} modules_install > ${WRKDIR}modules_install.log elif [ "${BUILD_ARCH}" == "armhf" ]; then sudo --preserve-env PATH=${PATH} make O=.build-arm32 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- INSTALL_MOD_PATH=${MNTROOTFS} modules_install > ${WRKDIR}modules_install.log fi cd ${WRKDIR} ``` ## Etape 2: Assemblage du bootfiles Cette section décrit l'asssemblage du bootfiles qui contindra: * bootfiles/config.txt * bootfiles/cmdline.txt * bootfiles/kernel8.img * booutfiles/bcm2711-rpi-4-b.dtb * bootfiles/overlays/pi4-xx-xen.dtbo (pi4-32-xen.dtbo pour armhf, pi4-64-xen.dtbo pour aarch64) ### Création du répertoire boot Créer le répertoire nommé bootfiles: ``` cd ${WRKDIR} if [ ! -d bootfiles ]; then mkdir bootfiles fi cp ${WRKDIR}firmware/boot/fixup4*.dat ${WRKDIR}firmware/boot/start4*.elf bootfiles/ mkdir -p bootfiles/overlays ``` Charger dedans les binaires dtb et dtbo: ``` if [ "${BUILD_ARCH}" == "arm64" ]; then cp ${WRKDIR}linux/.build-arm64/arch/arm64/boot/dts/broadcom/${DTBFILE} bootfiles/ cp ${WRKDIR}linux/.build-arm64/arch/arm64/boot/dts/overlays/${DTBXENO}.dtbo bootfiles/overlays elif [ "${BUILD_ARCH}" == "armhf" ]; then cp ${WRKDIR}linux/.build-arm32/arch/arm/boot/dts/${DTBFILE} bootfiles/ cp ${WRKDIR}linux/.build-arm32/arch/arm/boot/dts/overlays/${DTBXENO}.dtbo bootfiles/overlays fi ``` Créer le fichier ` bootfiles/cmdline.txt`: ``` cat > bootfiles/cmdline.txt < bootfiles/config.txt < Système hôte ## Etape 2: Préparation du système Cete section ne couvre que le nécessaire pour avoir un système bootable: - Le chargement du système de base est opéré directement dans le système hôte - La configurtaion est opérée dans un jail chrooté diretctement dans la nouvelle structure de fichier. ### Téléchargement du système de base ``` curl -OLf http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz ``` Il faut créer un dossier où on va décompresser le système de base. On va utiliser une variable pour garder le chemin: ``` export MNTRAMDISK=/tmp/ramdisk/ export MNTROOTFS=${MNTRAMDISK}qemu-arm64-rootfs/ sudo mkdir -p ${MNTRAMDISK} sudo mount -t tmpfs -o size=3g tmpfs ${MNTRAMDISK} ``` ### Chargement du système de fichier Extraire tous les fichiers de l'archive tar dans l'image disque montée: ``` sudo mkdir -p ${MNTROOTFS} sudo tar -C ${MNTROOTFS} -xf ArchLinuxARM-rpi-aarch64-latest.tar.gz ``` ### Entrer dans un jail chroot système Monter les systèmes de fichiers spéciaux dans l'image: ``` sudo mkdir -p ${MNTROOTFS} sudo mount -o bind /proc ${MNTROOTFS}proc sudo mount -o bind /dev ${MNTROOTFS}dev sudo mount -o bind /dev/pts ${MNTROOTFS}dev/pts sudo mount -o bind /sys ${MNTROOTFS}sys sudo mount -o bind /tmp ${MNTROOTFS}tmp ``` La configuration se fait dans un nouveau jail chrooté qui devrait normalement avoir comme prompt : ``` # chroot "${MNTROOTFS}" /bin/bash (installation) / # ``` Jail Chroot /mnt/ramdisk/qemu-arm64-rootfs/ ### Configuration du système de fichier `/etc/resolv.conf` est requis pour la connectivité Internet dans chroot. Il sera écrasé par dhcp, alors il ne faut pas trop s'y attarder: ``` echo "nameserver 8.8.8.8" > /etc/resolv.conf echo "nameserver 2001:4860:4860::8888" >> /etc/resolv.conf ``` Renseigner les partitions composant le nouveau système dans le `/etc/fstab`, exemple : ``` tmpfs /tmp tmpfs nodev,nosuid 0 0 UUID=[…] swap swap defaults 0 0 UUID=[…] / ext4 defaults 0 1 UUID=[…] /home ext4 defaults 0 1 ``` On peut obtenir les UUID en lançant blkid. Renseigner le nom de la machine dans le fichier `/etc/hostname` ainsi que `/etc/hosts`. Éditer le fichier `/etc/vconsole.conf` afin d'y spécifier la disposition du clavier que l'on souhaite utiliser. ``` cat > /etc/vconsole.conf << "EOF" KEYMAP=fr-pc EOF ``` Créer un lien symbolique `/etc/localtime` afin de choisir le fuseau horaire, par exemple: ``` ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime ``` Définir un mot passe pour le root : ``` passwd ``` Comme on n'a pas installer depuis un système Arch Linux, il faut configurer la liste des miroirs ainsi que pacman keyring, éditer le fichier `/etc/pacman.d/mirrorlist` et décommenter les serveurs correspondants à la région: ``` # Any # Server = ftp://mirrors.kernel.org/archlinux/$repo/os/$arch Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch ``` Puis initialiser pacman keyring : ``` pacman-key --init pacman-key --populate archlinux ``` Suite à l’installation, il se peut que l'on rencontre un problème avec pacman et les certificats, pour le régler et avoir un système pleinement opérationnel installer simplement le package ca-certificates-utils ``` pacman -S ca-certificates pacman -S ca-certificates-utils ``` Mettre à jour `/etc/fstab` pour le périphérique de bloc SD différent par rapport au Raspberry Pi 3 : ``` sed -i 's/mmcblk0/mmcblk1/g' racine/etc/fstab ``` Avec ceci, on a un système que l'on peut utiliser de façon autonome. ### Création de l'image prepped ``` sudo tar -czf ArchLinuxARM-rpi-aarch64-prepped.tar.gz -C ${MNTROOTFS} $(ls ${MNTROOTFS}) ``` ### Sortir du jail chroot de build ``` exit sudo umount ${MNTROOTFS}proc || true sudo umount ${MNTROOTFS}dev/pts || true sudo umount ${MNTROOTFS}dev || true sudo umount ${MNTROOTFS}sys || true sudo umount ${MNTROOTFS}tmp || true sudo umount ${MNTBOOT} || true sudo umount ${MNTROOTFS} || true ``` Système Hôte ## Etape 4: Construction de l'image disque du système Cette section décrit l'assemblage du système de fichier issu des précédentes étapes: - le contenu de l'image ArchLinuxARM-rpi-aarch64-prepped.tar.gz - le contenu du dossier bootfiles ### Initialisation des variables ``` export MNTRAMDISK=/tmp/ramdisk/ export MNTROOTFS=/tmp/rpi-arm64-rootfs/ export MNTBOOT=${MNTROOTFS}boot/ export IMGFILE=${MNTRAMDISK}rpixen.img ``` ### Mappage des partitions de prepped **kpartx** lit les tables de partitions sur le périphérique spécifié et créé des maps de périphérique sur les segments de partition détectés dans `/dev/mapper/`: * **-a**: ajoute des mappages de partition * **-s**: mode de synchronisation=attend que les partitions soient créées ``` export LOOPDEVS=$(sudo kpartx -avs ArchLinuxARM-rpi-aarch64-prepped.tar.gz | awk '{print $3}') export LOOPDEVBOOT=/dev/mapper/$(echo ${LOOPDEVS} | awk '{print $1}') export LOOPDEVROOTFS=/dev/mapper/$(echo ${LOOPDEVS} | awk '{print $2}') ``` ### Création d'un chroot spécial ``` sudo mkdir -p ${MNTROOTFS} if ! mount | grep ${LOOPDEVROOTFS}; then sudo mount ${LOOPDEVROOTFS} ${MNTROOTFS} fi sudo mkdir -p ${MNTBOOT} sudo mount ${LOOPDEVBOOT} ${MNTBOOT} sudo mount -o bind /proc ${MNTROOTFS}proc sudo mount -o bind /dev ${MNTROOTFS}dev sudo mount -o bind /dev/pts ${MNTROOTFS}dev/pts sudo mount -o bind /sys ${MNTROOTFS}sys sudo mount -o bind /tmp ${MNTROOTFS}tmp sudo sync sudo mkdir -p ${MNTRAMDISK} sudo mount -t tmpfs -o size=3g tmpfs ${MNTRAMDISK} ``` ### Création de l'image disque Création de l'image disque dans laquelle sera installé le système de base (/mnt/ramdisk/rpixen.img): ``` qemu-img create ${IMGFILE} 2048M /sbin/parted ${IMGFILE} --script -- mklabel msdos MB_TO_SECTOR=2048 /sbin/parted ${IMGFILE} --script -- mkpart primary fat32 $(( 1 * ${MB_TO_SECTOR} ))s $(( 129 * ${MB_TO_SECTOR} - 1 ))s /sbin/parted ${IMGFILE} --script -- mkpart primary ext4 $(( 129 * ${MB_TO_SECTOR} ))s -1025s sudo mkfs.vfat ${LOOPDEVBOOT} sudo mkfs.ext4 ${LOOPDEVROOTFS} sudo fatlabel ${LOOPDEVBOOT} boot sudo e2label ${LOOPDEVROOTFS} RpiUbuntu sudo mount ${LOOPDEVROOTFS} ${MNTROOTFS} cd ${WRKDIR} ``` ### Chargement du boot dans l'image ``` cd ${WRKDIR} sudo cp -r bootfiles/* ${MNTBOOT} ``` ### Configuration de l'image Comme le script de configuration des outils xen sélectionne un trop grand nombre de modules de pilote backend, on le remplace donc par une liste `/usr/lib/modules-load.d/xen.conf` plus réduite: ``` sudo bash -c "cat > ${MNTROOTFS}usr/lib/modules-load.d/xen.conf" < ${MNTROOTFS}etc/hostname" ``` Configuration de `/etc/hosts`: ``` sudo bash -c "cat > ${MNTROOTFS}etc/hosts" < ${MNTROOTFS}etc/fstab" < ${MNTROOTFS}etc/network/interfaces.d/eth0" < ${MNTROOTFS}etc/network/interfaces.d/xenbr0" <> ${MNTROOTFS}lib/systemd/system/ifup@.service" fi ``` Configuration des comptes utilisateurs: ``` sudo chroot ${MNTROOTFS} useradd -s /bin/bash -G adm,sudo -l -m -p ${HASHED_PASSWORD} ${USERNAME} ``` Configuration des sudoers Password-less: ``` sudo chroot ${MNTROOTFS} /bin/bash -euxc "echo \"${USERNAME} ALL=(ALL) NOPASSWD:ALL\" > /etc/sudoers.d/90-${USERNAME}-user" ``` Activer les démons: ``` sudo chroot ${MNTROOTFS} systemctl enable xen-qemu-dom0-disk-backend.service sudo chroot ${MNTROOTFS} systemctl enable xen-init-dom0.service sudo chroot ${MNTROOTFS} systemctl enable xenconsoled.service sudo chroot ${MNTROOTFS} systemctl enable xendomains.service sudo chroot ${MNTROOTFS} systemctl enable xen-watchdog.service cd ${WRKDIR} ``` ### Démontage du chroot ``` sudo umount ${MNTROOTFS}proc || true sudo umount ${MNTROOTFS}dev/pts || true sudo umount ${MNTROOTFS}dev || true sudo umount ${MNTROOTFS}sys || true sudo umount ${MNTROOTFS}tmp || true sudo umount ${MNTBOOT} || true sudo umount ${MNTROOTFS} || true ```