Gentoo на Raspberry Pi
Dec. 28th, 2015 06:15 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Так как Raspbian подает все "надежды" к скатыванию (вот-вот добавят всякие systemd и прочий поцтерошлак), я решил на "малинку" накатить Gentoo.
Надо сказать, что потратил я на это 4 дня. И 3 из них — из-за собственной невнимательности. Даже тему на SO создал.
Итак, если не быть ССЗБ, то разворачивание генты занимает совсем немного времени. Больше уйдет потом на доустановку нужных пакетов.
Для начала нужно открыть FAQ по генте на "малинке". Разбиваем, как там написано, флешку (я сделал 2 раздела: 200МБ vfat для /boot + остаток — корень, на нелюбимой мною ext4). Далее — самое долгое — скачивание и компиляция ядра. Так как я сделал
ждать пришлось долго. Надо было указывать --depth 1.
Заодно нужно скачать свежий stage3.
Чтобы ядро собралось правильно (я еще и на сборку потратил достаточно времени, указав неправильную архитектуру), лучше сразу сказать
а потом уже вызывать
для "юстировки" ядра. Ну, а дальше собираем ядро и модули (сначала: mkdir Modules):
Пока оно компилируется, нужно еще содрать firmware:
По-сути, нам нужна оттуда лишь boot-директория. Почти все файлы оттуда (в принципе, можно и все, а можно лишь те, что указаны в руководстве) нужно скопировать в /boot раздел (который vfat).
После сборки ядра по инструкции распихиваем dtb-файлы, модули, преобразуем ядро из arch/arm/boot/Image при помощи утилиты imagetool-uncompressed.py (https://github.com/raspberrypi/tools.git) в понятный для "малинки" образ. Затем этот образ отправляем в /boot, попутно правя конфигурацию из /boot/config.txt. В файл /boot/cmdline.txt заносим:
Для того, чтобы генту можно было собирать на хосте, а не ждать веками, пока она на "малинке" соберется, в /usr/bin генты нужно добавить файл qemu-arm-static (я его выдрал из распбиана). Естественно, этот файл нужно как-то иначе переименовывать при запуске непосредственно на "малинке". Это делают скрипты монтирования/размонтирования, которые я приведу ниже.
После того, как все скопировано, нужно сделать chroot в корень генты и провести окончательную настройку. Для монтирования нужных файлов у меня есть скрипт:
Понятно, что нужно заранее создать директории 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 написать:
Добавить настройки прокси в /etc/profile.d, задать пароль руту и добавить нужное количество пользователей.
По мере установки софта будут вноситься разные изменения в /etc/portage/make.conf и другие файлы. Скажем, вот так выглядит сейчас мой package.accept_keywords:
После того, как все готово, выходим из чрута и отмонтируем всē скопом:
Вставляем флешку в "малинку" и грузимся. В качестве консоли на первое время я использую долларовый переходничок USB<->UART, подключенный к UART на разъеме GPIO, далее доступ только по сети, а обновления — в чруте.
Здесь тоже есть тонкий момент: БП, которым питаем "малинку", должен быть подключен к ногам питания на разъеме GPIO и уметь выдать не меньше двух Ампер, иначе на этапе загрузки будут появляться всякие непонятные вещи.
Надо сказать, что потратил я на это 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 и уметь выдать не меньше двух Ампер, иначе на этапе загрузки будут появляться всякие непонятные вещи.
no subject
Date: 2015-12-29 12:26 am (UTC)no subject
Date: 2015-12-29 05:36 am (UTC)no subject
Date: 2015-12-29 05:39 am (UTC)no subject
Date: 2016-01-02 11:16 pm (UTC)no subject
Date: 2016-01-03 03:19 am (UTC)