Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

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::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\x
ff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register
mount ${1}2 ${CHRT}
mv ${CHRT}/usr/bin/qemu-arm-static_ ${CHRT}/usr/bin/qemu-arm-static
mount ${1}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 и уметь выдать не меньше двух Ампер, иначе на этапе загрузки будут появляться всякие непонятные вещи.
Tags: gentoo, raspberry pi, железяки
Subscribe

  • Релюшки на CAN-шине

    Закончил с прошивкой для новой железяки. Как "наследница" USB-CAN переходника, она умеет все то же самое + несколько специфичных вещей (опрос…

  • Богатство нашего времени

    Вскрыл сегодня вот такой пакетик (лежит на работе уже довольно-таки давно, жрать не просит): Содержимое: Распаял модуль управления…

  • Продолжаю возиться с STM32F303

    Добавил работу с USART'ами: простейший вариант "почти эха" USART1 (чтение с двойной буферизацией в прерывании, блокирующая запись) и работу с тремя…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 30 comments

  • Релюшки на CAN-шине

    Закончил с прошивкой для новой железяки. Как "наследница" USB-CAN переходника, она умеет все то же самое + несколько специфичных вещей (опрос…

  • Богатство нашего времени

    Вскрыл сегодня вот такой пакетик (лежит на работе уже довольно-таки давно, жрать не просит): Содержимое: Распаял модуль управления…

  • Продолжаю возиться с STM32F303

    Добавил работу с USART'ами: простейший вариант "почти эха" USART1 (чтение с двойной буферизацией в прерывании, блокирующая запись) и работу с тремя…