Поиск

Gentoo на Raspberry Pi


Так как Raspbian подает все «надежды» к скатыванию (вот-вот добавят всякие systemd и прочий поцтерошлак), я решил на «малинку» накатить Gentoo.
Надо сказать, что потратил я на это 4 дня. И 3 из них — из-за собственной невнимательности. Даже тему на SO создал.

Итак, если не быть ССЗБ, то разворачивание генты занимает совсем немного времени. Больше уйдет потом на доустановку нужных пакетов.

Для начала нужно открыть FAQ по генте на «малинке». Разбиваем, как там написано, флешку (я сделал 2 раздела: 200МБ vfat для /boot + остаток — корень, на нелюбимой мною ext4). Далее — самое долгое — скачивание и компиляция ядра. Так как я сделал

git clone https://github.com/raspberrypi/linux.git


ждать пришлось долго. Надо было указывать --depth 1.
Заодно нужно скачать свежий stage3.

Чтобы ядро собралось правильно (я еще и на сборку потратил достаточно времени, указав неправильную архитектуру), лучше сразу сказать

make ARCH=arm CROSS_COMPILE=/usr/bin/arm-none-eabi- bcmrpi_defconfig


а потом уже вызывать

make ARCH=arm CROSS_COMPILE=/usr/bin/arm-none-eabi- menuconfig


для «юстировки» ядра. Ну, а дальше собираем ядро и модули (сначала: mkdir Modules):

make -j4 ARCH=arm CROSS_COMPILE=/usr/bin/arm-none-eabi- Image modules dtbs
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-none-eabi- INSTALL_MOD_PATH=Modules modules_install


Пока оно компилируется, нужно еще содрать firmware:

git clone --depth 1 https://github.com/raspberrypi/firmware.git


По-сути, нам нужна оттуда лишь boot-директория. Почти все файлы оттуда (в принципе, можно и все, а можно лишь те, что указаны в руководстве) нужно скопировать в /boot раздел (который vfat).

После сборки ядра по инструкции распихиваем dtb-файлы, модули, преобразуем ядро из arch/arm/boot/Image при помощи утилиты imagetool-uncompressed.py (https://github.com/raspberrypi/tools.git) в понятный для «малинки» образ. Затем этот образ отправляем в /boot, попутно правя конфигурацию из /boot/config.txt. В файл /boot/cmdline.txt заносим:

ipv6.disable=0 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 roo
tfstype=ext4 elevator=noop rootwait

Для того, чтобы генту можно было собирать на хосте, а не ждать веками, пока она на «малинке» соберется, в /usr/bin генты нужно добавить файл qemu-arm-static (я его выдрал из распбиана). Естественно, этот файл нужно как-то иначе переименовывать при запуске непосредственно на «малинке». Это делают скрипты монтирования/размонтирования, которые я приведу ниже.

После того, как все скопировано, нужно сделать chroot в корень генты и провести окончательную настройку. Для монтирования нужных файлов у меня есть скрипт:

#!/bin/bash
CHRT="ROOT"
if [ $# != 1 ]; then
    echo "usage: $0 /dev/sdb"
    exit 1
fi

function mnt(){
    mount --rbind $1 ${CHRT}$1
}
[ -f /proc/sys/fs/binfmt_misc/arm ] || echo ':arm:M::x7fELFx01x01x01x00x00x00x00x00x00x00x00x00x02x00x28x00:xffxffxffxffxffxffxffx00xffxffx
ffxffxffxffxffxffxfexffxffxff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register
mount 2 ${CHRT}
mv ${CHRT}/usr/bin/qemu-arm-static_ ${CHRT}/usr/bin/qemu-arm-static
mount 1 ${CHRT}/boot
mount -o bind linux ${CHRT}/usr/src/linux
#mount -o loop,offset=4194304 $1 chrt_vfat
mnt /dev
mnt /sys
mount -t proc none ${CHRT}/proc
mnt /run
mount -o bind portage ${CHRT}/usr/portage
chroot ${CHRT}


Понятно, что нужно заранее создать директории ROOT (корень для чрута) и portage (там будут лежать portage-файлы, чтобы не засорять флешку). Заодно для сборки некоторых пакетов нам могут понадобиться исходники скомпилированного ядра. Они лежат в директории linux здесь же.

Все, делаем команду ./Chroot (название вышеприведенного скрипта) и попадаем в нашу генту. Дальше — обычные emerge-webrsync, emerge eix, eix-update и emerge -uDN world, после которых нужно доустановить все остальное.
Кстати, не натыкайтесь на пройденные мною грабли: ни в коем случае нельзя менять профиль. Я по-дурости сменил профиль на default/linux/arm/13.0/armv6j/developer и очередной emerge предложил мне установить 177 совершенно ненужных на «малинке» пакетов вроде иксов, культей и прочей дряни.

После обновления и установки (или в процессе) нужно настроить сеть, ntpd. В /etc/fstab написать:

/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2


Добавить настройки прокси в /etc/profile.d, задать пароль руту и добавить нужное количество пользователей.

По мере установки софта будут вноситься разные изменения в /etc/portage/make.conf и другие файлы. Скажем, вот так выглядит сейчас мой package.accept_keywords:

sys-boot/raspberrypi-firmware ~arm
net-libs/libwebsockets **

После того, как все готово, выходим из чрута и отмонтируем всē скопом:

#!/bin/bash
CHRT="ROOT"
mv ${CHRT}/usr/bin/qemu-arm-static ${CHRT}/usr/bin/qemu-arm-static_
umount ${CHRT}/boot
umount ${CHRT}/usr/portage/
umount ${CHRT}/usr/src/linux
umount ${CHRT}/proc
umount ${CHRT}/run
umount ${CHRT}/sys
umount ${CHRT}/dev/pts
umount ${CHRT}/dev/shm
umount ${CHRT}/dev
umount ${CHRT}

Вставляем флешку в «малинку» и грузимся. В качестве консоли на первое время я использую долларовый переходничок USB<->UART, подключенный к UART на разъеме GPIO, далее доступ только по сети, а обновления — в чруте.
Здесь тоже есть тонкий момент: БП, которым питаем «малинку», должен быть подключен к ногам питания на разъеме GPIO и уметь выдать не меньше двух Ампер, иначе на этапе загрузки будут появляться всякие непонятные вещи.

eddy-em.livejournal.com

Добавить комментарий