diff --git a/README.md b/README.md index 37018ac..0df515a 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md b/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md new file mode 100644 index 0000000..8e25b60 --- /dev/null +++ b/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.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` (для модуля) — появится `` рядом с пунктом. Это означает, что модуль будет собираться как модуль, + а не встраиваться в ядро. Модуль (iscsi_tcp.ko) проще протестировать без перезагрузки. +4. В нижнем меню выбрать `` и подтвердим сохранение в `.config`. +6. Вернуться в меню выше `SCSI device support` (через нижнее меню ``). +7. Зайти в раздел `SCSI low-level drivers`. +8. Выбрать `iSCSI Initiator over TCP/IP` и нажать `M` (для модуля). +9. Снова сохраняем конфиг в `.config` (через нижнее меню ``). +10. Выйти из `menuconfig` (через нижнее меню ``, три раза). + +Проверим, что 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` +(мы выбрали ``, а не `<*>`). Кроме того, 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`).