автор: t.me/lazba
Инструкция по настройке ARM Arch Linux RootFS¶
Содержание:
Prepare¶
Скачать последнюю сборку Archlinux
curl -LO http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
curl -LO http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz.md5
md5sum -c ArchLinuxARM-aarch64-latest.tar.gz.md5
Создать файл-основу на 10 ГБ для образа
dd if=/dev/zero of=arch-rootfs.img bs=1M count=10240
mkfs.ext4 arch-rootfs.img
Примонтировать файл и распаковать в него базовую систему:
sudo mkdir -p /mnt/archlinux
sudo losetup --find --show arch-rootfs.img
sudo mount /dev/loop0 /mnt/archlinux
sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt/archlinux
Для дальнейшей работы нужны
- Statically-linked QEMU User space emulator for AArch64 + binfmt_misc configurations.
- В ArchLinux host можно установить qemu-user-static qemu-user-static-binfmt.
- arch-install-scripts, а именно arch-chroot.
- Скачать, вызвать make install
chroot в новую систему
sudo arch-chroot /mnt/archlinux /bin/bash
Проверим
# uname -m
aarch64
Initialize the pacman keyring:
pacman-key --init
pacman-key --populate archlinuxarm
Удалим предустановленное ядро и обновим все пакеты, а также установим часть необходимых (можно установить те пакеты что есть на https://archlinuxarm.org/). base-devel и go нужны чтобы позднее установить yay AUR helper.
pacman -Rnd linux-aarch64
pacman -Syyuu git base-devel i2c-tools iputils go python python-setuptools python-wheel python-numpy sudo linux-headers
Зададим пароль пользователя
passwd alarm
Закрываем образ
sudo umount /mnt/archlinux
sudo losetup -d /dev/loop0
QEMU¶
Далее можно настроить оставшиеся пакеты через AUR с помощью полноценной qemu симуляции.
Можно пропустить этот этап, и установить AUR пакеты уже на самом устройстве.
Для запуска системы через QEMU-эмулятор потребуются соответствующие U-Boot, kernel, dtb
./kernel-qemu/build_kernel.sh
#!/bin/bash
KERNEL_REPO=/tools/linux-xlnx
COMPILER_NAME_PREFIX=aarch64-linux-gnu-
CPU_CORES=$(($(nproc) - 1))
# Ensure CORES is at least 1
if [ "$CPU_CORES" -lt 1 ]; then
CPU_CORES=1
fi
make -C $KERNEL_REPO O=$PWD ARCH=arm64 CROSS_COMPILE=$COMPILER_NAME_PREFIX qemu_arm64_defconfig
make -C $KERNEL_REPO O=$PWD ARCH=arm64 CROSS_COMPILE=$COMPILER_NAME_PREFIX nconfig
make -C $KERNEL_REPO -j"$CPU_CORES" O=$PWD ARCH=arm64 CROSS_COMPILE=$COMPILER_NAME_PREFIX
PROJECT_FOLDER=$(dirname $0)
cp -rf $PROJECT_FOLDER/arch/arm64/boot/Image $PROJECT_FOLDER/../Image
./uboot-qemu/build-uboot.sh
#!/bin/bash
UBOOT_REPO=/tools/u-boot-xlnx/
COMPILER_NAME_PREFIX=aarch64-linux-gnu-
CPU_CORES=$(($(nproc) - 1))
# Ensure CORES is at least 1
if [ "$CPU_CORES" -lt 1 ]; then
CPU_CORES=1
fi
make -C $UBOOT_REPO O=$PWD CROSS_COMPILE=$COMPILER_NAME_PREFIX qemu_arm64_defconfig
make -C $UBOOT_REPO O=$PWD CROSS_COMPILE=$COMPILER_NAME_PREFIX -j"$CPU_CORES"
PROJECT_FOLDER=$(dirname $0)
cp -rf $PROJECT_FOLDER/u-boot.bin $PROJECT_FOLDER/../u-boot.bin
генерировать dtb:
qemu-system-aarch64 -machine virt -machine dumpdtb=qemu.dtb
qemu-system-aarch64.sh
qemu-system-aarch64 \
-M virt \
-cpu cortex-a53 \
-smp 4 \
-m 4G \
-nographic \
-bios ./u-boot.bin \
-kernel ./Image \
-drive if=none,file=./arch-rootfs.img,format=raw,id=hd0 \
-append "root=/dev/vda rw console=ttyAMA0 earlycon earlyprintk debug" \
-device virtio-blk-device,drive=hd0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22 \
-device virtio-net-device,netdev=net0 \
-d guest_errors,unimp,cpu_reset \
-D qemu.log
Setup¶
Настроим пользователя alarm и установим оставшиеся пакеты. От root user:
usermod -aG wheel alarm
visudo
ищем строку # %wheel ALL=(ALL:ALL) NOPASSWD: ALL и раскомментируем её убирая символ #. Сохраняем командой :wq
Переходим в пользователя:
cd /home/alarm
su alarm
Устанавливаем yay AUR helper
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
Устанавливаем необходимые приложения
yay -S --noconfirm can-utils python-spidev python-smbus2 python-cantools
Shrink¶
Уменьшим размер .img файла, чтобы ускорить его загрузку на sd карту
# Attach the image to a loop device
LOOP_DEV=$(sudo losetup --find --show arch-rootfs.img)
# Check the filesystem for consistency
sudo e2fsck -f ${LOOP_DEV}
# Determine the minimum size (in blocks)
sudo resize2fs -P ${LOOP_DEV}
The output will give you something like:
Estimated minimum size of the filesystem: 123456 blocks
Note: Each block is usually 4096 bytes. Convert the block count to MB if needed.
Сначала уменьшим файловую систему на образе, затем обрежем (trunc) сам файл.
sudo resize2fs ${LOOP_DEV} 5G
sudo losetup -d ${LOOP_DEV}
truncate -s 5G arch-rootfs.img
Проверим, сколько осталось места
LOOP_DEV=$(sudo losetup --find --show arch-rootfs.img)
sudo mount ${LOOP_DEV} /mnt/archlinux
df -h /mnt/archlinux
output is:
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 4.9G 3.4G 1.3G 74% /mnt/archlinux
Закроем файл
sudo umount /mnt/archlinux
sudo losetup -d ${LOOP_DEV}