add: сборка ядра Linux для opi5plus (.1)
This commit is contained in:
parent
0a6c1591ab
commit
7b0853da9c
@ -24,7 +24,7 @@
|
||||
* [Резервное копирование и восстановление](raspberry-and-orange-pi/backup-restore.md)
|
||||
* [k8s (кubernetes) на Orange Pi (драфт...)](raspberry-and-orange-pi/k8s.md)
|
||||
* [k3s (кubernetes) на Orange Pi](raspberry-and-orange-pi/k3s.md)
|
||||
*
|
||||
* [Перекомпиляция ядра Linux (включение пподдержки iSCSI в Orange Pi 5 Plus](raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md)
|
||||
|
||||
## Nginx / Apache
|
||||
* [Ограничение доступа по User-Agent (на примере GPTBot)](nginx/nginx-ban-user-agent.md)
|
||||
|
@ -0,0 +1,154 @@
|
||||
# Сборка ядра Linux для Orange Pi 5 Plus (и других устройств на Rockchip RK3588) с поддержкой iSCSI
|
||||
|
||||
Для моего проекта (k3s на Orange Pi 5 Plus) потребовалась поддержка система управления блочным хранилищем 'longhorn'
|
||||
(longhorn.io). _Longhorn_ позволяет создавать надёжные тома для контейнеров, автоматически реплицируя их между узлами
|
||||
и обеспечения высокую доступности приложений: если один узел выходит из строя, данные остаются доступны на репликах
|
||||
на других узлах.
|
||||
|
||||
Для _longhorn_ нужен `iSCSI` (**Internet Small Computer System Interface**) — сетевой протокол, который позволяет
|
||||
подключать удалённые диски так, будто они подключены физически. Longhorn через iSCSI обеспечивает передачу данных между
|
||||
узлами через сеть.
|
||||
|
||||
В ядре Linux поддержка _iSCSI_ реализована через модули, такие как 'iscsi_tcp' и 'scsi_transport_iscsi'. Однако,
|
||||
в большинстве дистрибутивов для одноплатных компьютеров, включая Orange Pi 5 Plus, эти модули отключены. Это делают
|
||||
для экономии ресурсов, да и в целом, это нетипичный сценарий использования Orange Pi. В версии Ubuntu 22.04
|
||||
для Orange Pi 5 Plus (в ядре от Xunlong), поддержка iSCSI тоже отключена, и это делает невозможным запуск Longhorn.
|
||||
|
||||
**А значит нужна пересборка ядра (компиляция)**
|
||||
|
||||
Таким образом, мы вручную включим поддержку iSCSI (модули iscsi_tcp и scsi_transport_iscsi), и в целом можем настроить
|
||||
ядро под свои задачи. Однако компиляция и замена требует осторожности — ошибка в процессе может привести к тому, что
|
||||
система не загрузится (но мы сделаем резервную копию текущего ядра, загрузчика, чтобы можно было восстановить систему).
|
||||
|
||||
Обновления системы (например, через `apt`) с новым ядром будет работать как обычно: пакеты, утилиты и приложения
|
||||
обновляются без проблем. Однако пересобранное ядро больше не будет автоматически обновляться через стандартные средства
|
||||
дистрибутива. Если выйдет новая версия ядра от Xunlong, придётся вручную повторить процесс компиляции. К счастью,
|
||||
Xunlong обновляет ядро не часто.
|
||||
|
||||
| Заметка |
|
||||
|-----------------------------------------------------------------------------------------------|
|
||||
| Orange Pi 5 Plus использует процессор Rockchip RK3588, как и другие устройства под брендом Orange. Процесс компиляции ядра для всех RK35xx почти идентичным, и базируется на одном и том же дистрибутиве. Однако, разные периферийные устройства: например, GPIO, USB или Ethernet-контроллеры могут отличаться. Мы будем использовать `.config` от текущего, рабочего ядра, так что настройки будут актуальны. Но следует иметь в виду, что возможно, в будущем могут появиться изменения в конфигурации, дистрибутива и т.п. Следует учитывать, это и **никто ничего не гарантирует**. |
|
||||
|
||||
## План сборки ядра с iSCSI
|
||||
|
||||
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
|
||||
* Устанавливать инструменты.
|
||||
* Скачивать исходники.
|
||||
* Настраивать конфиг с iSCSI.
|
||||
* Компилировать ядро и модули.
|
||||
* Устанавливать новое ядро рядом.
|
||||
* Тестировать без перезагрузки.
|
||||
* Заменять ядро и перезагружать.
|
||||
|
||||
|
||||
## Резервное копирование текущего ядра и /boot
|
||||
|
||||
|
||||
## Устанавливать инструменты для сборки ядра
|
||||
|
||||
Установи всё необходимое:
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y build-essential bc flex bison libssl-dev libncurses-dev gcc-aarch64-linux-gnu git
|
||||
```
|
||||
|
||||
Проверь, что gcc-aarch64-linux-gnu установлен:
|
||||
```bash
|
||||
aarch64-linux-gnu-gcc --version
|
||||
```
|
||||
|
||||
результат должен быть примерно таким:
|
||||
```text
|
||||
aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
|
||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
```
|
||||
|
||||
## Скачивание исходников ядра
|
||||
|
||||
Клонируем репозиторий Orange Pi для ядра 6.1:
|
||||
```bash
|
||||
git clone --depth 1 https://github.com/orangepi-xunlong/linux-orangepi -b orange-pi-6.1-rk35xx ~/linux-orangepi
|
||||
```
|
||||
|
||||
После того, как клонировали репозиторий, переходим в него:
|
||||
```bash
|
||||
cd ~/linux-orangepi
|
||||
```
|
||||
|
||||
Копируем конфиг текущего ядра в конфиг для сборки:
|
||||
```bash
|
||||
zcat /proc/config.gz > .config
|
||||
```
|
||||
|
||||
## Настройка конфига с iSCSI
|
||||
|
||||
Теперь его нужно отредактировать, `.config` чтобы включить `iSCSI`. Заходим в кофигуратор ядра `menuconfig`:
|
||||
```bash
|
||||
ake ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
|
||||
```
|
||||
|
||||
Используя стрелки на клавиатуре, чтобы двигаться по пунктам меню.
|
||||
1. Перейди в `Device Drivers` → `SCSI device support` → `SCSI Transports`.
|
||||
2. Найти внутри `iSCSI Initiator over TCP/IP`, с помощью стрелок выбрать его.
|
||||
3. Нажимает `M` (для модуля) — появится `<M>` рядом с пунктом. Это означает, что модуль будет собираться как модуль,
|
||||
а не встраиваться в ядро. Модуль (iscsi_tcp.ko) проще протестировать без перезагрузки.
|
||||
4. В нижнем меню выбрать `<Save>` и подтвердим сохранение в `.config`.
|
||||
6. Вернуться в меню выше `SCSI device support` (через нижнее меню `<Exit>`).
|
||||
7. Зайти в раздел `SCSI low-level drivers`.
|
||||
8. Выбрать `iSCSI Initiator over TCP/IP` и нажать `M` (для модуля).
|
||||
9. Снова сохраняем конфиг в `.config` (через нижнее меню `<Save>`).
|
||||
10. Выйти из `menuconfig` (через нижнее меню `<Exit>`, три раза).
|
||||
|
||||
Проверим, что iSCSI включён:
|
||||
```bash
|
||||
grep -E "ISCSI_TCP|SCSI_ISCSI_ATTRS|ISCSI_BOOT" .config
|
||||
```
|
||||
|
||||
Должны увидеть что-то типа:
|
||||
```text
|
||||
CONFIG_SCSI_ISCSI_ATTRS=m
|
||||
CONFIG_ISCSI_TCP=m
|
||||
# CONFIG_ISCSI_BOOT_SYSFS is not set
|
||||
```
|
||||
|
||||
## Компиляция ядра и модулей
|
||||
|
||||
Запускаем компиляцию ядра и модулей:
|
||||
```bash
|
||||
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
|
||||
```
|
||||
|
||||
`-j8` — это количество потоков, используй столько, сколько у тебя ядер. Например, если 4 ядра, то `-j4`.
|
||||
|
||||
Компиляция займёт 20-40 минут (Orange Pi 5 Plus). После завершения проверим, что ядро скомпилировалось:
|
||||
```bash
|
||||
ls -l arch/arm64/boot/Image
|
||||
```
|
||||
Ожидаемый размер: около 40 МБ:
|
||||
```text
|
||||
-rw-rw-r-- 1 opi opi 40579584 Mar 22 19:09 arch/arm64/boot/Image
|
||||
```
|
||||
|
||||
Размер должен почти совпать (или полностью совпадать) с размером текущего ядра:
|
||||
```bash
|
||||
ls -l /boot/Image
|
||||
```
|
||||
```text
|
||||
-rwxr-xr-x 1 root root 40579584 Nov 21 07:08 /boot/Image
|
||||
```
|
||||
|
||||
Это не ошибка. Мы добавили только `CONFIG_ISCSI_TCP=m` и `CONFIG_SCSI_ISCSI_ATTRS=m`. Это добавляет модули (`iscsi_tcp.ko`),
|
||||
но само ядро (`Image`) почти не увеличивается, так как iSCSI идёт как отдельный файл `.ko`, а не встраивается в `Image`
|
||||
(мы выбрали `<M>`, а не `<*>`). Кроме того, Linux выравнивает размер файла по блокам (например, 4 Кб), и добавление
|
||||
пары модулей могут не повлиять на итоговый размер. Разные даты файлов и права пользователей подтверждают,
|
||||
что файл новый — компиляция прошла, и `Image` обновился.
|
||||
|
||||
## Устанавливаем новое ядро рядом со старым
|
||||
|
||||
Мы доджны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и скомпилированное нами ядро
|
||||
скомпилиролось в каталог `~/linux-orangepi/arch/arm64/boot/`.Оно универсальное для всех микрокомпьютеров на базе
|
||||
Rockchip RK3588. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`
|
||||
Это дерево описания оборудования (Device Tree Blob), и этот файл нужен для загрузки ядра. При сборке мы получили `.dtb`
|
||||
для всех моделей Orange Pi 5 (5, 5 Plus, 5 Max, AI, Ultra), но нам нужен только для Orange Pi 5 Plus (`rk3588-orangepi-5-plus.dtb`).
|
Loading…
x
Reference in New Issue
Block a user