mod: типограф и беджики

This commit is contained in:
2026-03-07 11:43:26 +03:00
parent 9b825186d5
commit 583b6943c8
3 changed files with 242 additions and 253 deletions

View File

@@ -1,8 +1,11 @@
# Прозрачный прокси контейнера через Shadowsocks и tun2socks
[![Static Badge](https://img.shields.io/badge/ПОЛЕЗНО-99.9%-blue)](#)
[![Static Badge](https://img.shields.io/badge/СЛОЖНОСТЬ-7/10-orange)](#)
[![Static Badge](https://img.shields.io/badge/ОРИГИНАЛ-git.cube2.ru-green)](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md)
[![Static Badge](https://img.shields.io/badge/ТИПОГРАФИКА-etpgrf-green)](https://typograph.cube2.ru/)
У меня есть Docker-контейнер Audiobookshelf, в котором я слушаю аудиокниги и подкасты. Он сам скачивает подкасты
из интернета, и это очень удобно (все нужные мне подкасты в одном месте). Работал контейнер на домашнем NAS Synology
(в нем есть Docker Station с веб-интерфейсом). Книг у меня в «библиотеке» уже более тысячи, а подкастов и того больше,

View File

@@ -1,38 +1,41 @@
# Orange Pi 5 Plus: установка (перенос) системы на eMMC или SSD NVMe (M.2)
# Orange Pi 5 Plus: установка (перенос) системы на eMMC или SSD NVMe (M.2)
По правде сказать, приведенный ниже рецепт не только для переноса системы с MicroSD (она же MicroSDHC или MicroSDXC) на
eMMC-носитель или SSD-накопитель NVMe. Он отлично сработает и для установки чистой системы на eMMC или SSD. Причем,
установка чистой системы будет намного проще и быстрее.
[![Static Badge](https://img.shields.io/badge/ПОЛЕЗНО-99.9%-blue)](#)
[![Static Badge](https://img.shields.io/badge/СЛОЖНОСТЬ-6/10-orange)](#)
[![Static Badge](https://img.shields.io/badge/ОРИГИНАЛ-git.cube2.ru-green)](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/raspberry-and-orange-pi/opi5plus-move-system-to-nvme-or-emmc.md)
[![Static Badge](https://img.shields.io/badge/ТИПОГРАФИКА-etpgrf-green)](https://typograph.cube2.ru/)
Процедура немного напоминает магию, но это результат глубокого заныривания в интернет, и проверено срабатывает и для
SSD NVMe, и для eMMC. Но, как и всякая магия, она может не сработать, и тогда придется начинать все сначала и повторить.
По правде сказать, приведенный ниже рецепт не только для переноса системы с MicroSD (она же MicroSDHC или MicroSDXC) на eMMC-носитель или SSD-накопитель NVMe. Он отлично сработает и для установки чистой системы на eMMC или SSD. Причем
установка чистой системы будет намного проще и быстрее.
Процедура немного напоминает магию, но это результат глубокого заныривания в интернет, и проверено срабатывает и для SSD NVMe, и для eMMC. Но, как и всякая магия, она может не сработать, и тогда придется начинать все сначала и повторить.
## Установка накопителей
Выключим Orange Pi 5 Plus и установим в него eMMC-носитель…
Выключим Orange Pi 5 Plus и установим в него eMMC-носитель…
| Фото до и после установки eMMC. Внимание, устанавливайте до щелчка с обоих сторон! |
|:-------------------------------------------------------------------------------------|
| ![Orange Pi 5 Plus без eMMC](../images/orange-pi--photo--without-emmc.webp) |
| ![Orange Pi 5 Plus c установленным eMMC](../images/orange-pi--photo--with-emmc.webp) |
| Фото до и после установки eMMC. Внимание, устана­вливайте до щелчка с обеих сторон! |
|:--------------------------------------------------------------------------------------|
| ![Orange Pi 5 Plus без eMMC](../images/orange-pi--photo--without-emmc.webp) |
| ![Orange Pi 5 Plus c установленным eMMC](../images/orange-pi--photo--with-emmc.webp) |
…и/или SSD-накопитель NVMe
| Фото до и после установки NVMe. Более просто в установке. Для надёжности закрепить винтиком. |
|:---------------------------------------------------------------------------------------------------|
| ![Orange Pi 5 Plus без SSD eMMC (m.2)](../images/orange-pi--photo--without-ssd-nvme.webp) |
| ![Orange Pi 5 Plus с установленным SSD eMMC (m.2)](../images/orange-pi--photo--with-ssd-nvme.webp) |
| Фото до и после установки NVMe. Более просто в установке. Для надёжности закрепить винтом. |
|:----------------------------------------------------------------------------------------------------|
| ![Orange Pi 5 Plus без SSD eMMC (m.2)](../images/orange-pi--photo--without-ssd-nvme.webp) |
| ![Orange Pi 5 Plus с установленным SSD eMMC (m.2)](../images/orange-pi--photo--with-ssd-nvme.webp) |
Кстати, производительность (скорость чтения и записи) eMMC-носителей и SSD-накопителей NVMe может сильно отличаться.
Лично мой выбор — SSD-накопитель NVMe. По опыту он в пять-шесть раз быстрее eMMC.
Вот специальная заметка [как замерить производительность накопителя](measuring-performance-storage-devices.md).
Кстати, произво­дитель­ность (скорость чтения и записи) eMMC-носителей и SSD-накопителей NVMe может сильно отличаться. Лично мой выбор — SSD-накопитель NVMe. По опыту он в пять-шесть раз быстрее eMMC.
Вот специальная заметка [как замерить произво­дитель­ность накопителя](measuring-performance-storage-devices.md).
После этого включим Orange Pi 5 Plus. И после того как он загрузится, посмотрим какие устройства и тома есть в системе:
После этого включим Orange Pi 5 Plus. И после того как он загрузится, посмотрим какие устройства и тома есть в системе:
```shell
sudo lsblk
```
Увидим что-то подобное:
Увидим что-то подобное:
```text
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mtdblock0 31:0 0 16M 0 disk
@@ -48,39 +51,39 @@ zram0 254:0 0 7.7G 0 disk [SWAP]
zram1 254:1 0 200M 0 disk /var/log
```
Важно обратить внимание на объемы накопителей. В данном случае, у нас есть MicroSD-носитель `mmcblk1` (59.7G — это
64Gb флешка) и eMMC-носитель `mmcblk0` (233G — это 256Gb eMMC). У вас могут быть другие объемы и другие имена
устройств. Так же обратите внимание, ещё у нас есть `mtdblock0` — это внутренняя SPI-флеш, которая
используется для загрузки системы. Если у вас есть SSD-накопитель NVMe, он будет иметь имя вроде `nvme0n1`.
Важно обратить внимание на объемы накопителей. В данном случае, у нас есть MicroSD-носитель `mmcblk1` (59.7G — это
64Gb флешка) и eMMC-носитель `mmcblk0` (233G — это 256Gb eMMC). У вас могут быть другие объемы и другие имена
устройств. Так же обратите внимание, ещё у нас есть `mtdblock0` — это внутренняя SPI-флеш, которая
используется для загрузки системы. Если у вас есть SSD-накопитель NVMe, он будет иметь имя вроде `nvme0n1`.
На этом этапе, если мы хотим именно перенести систему, самое время сделать образ нашей MicroSD на внешний
носитель (например, на USB-диск или сетевое хранилище). Смонтируем внешний накопитель, например для сетевого
хранилища c Samba:
На этом этапе, если мы хотим именно перенести систему, самое время сделать образ нашей MicroSD на внешний
носитель (например, на USB-диск или сетевое хранилище). Смонтируем внешний накопитель, например для сетевого
хранилища с Samba:
```shell
mount -t cifs -o username=NAS_USERNAME,password=SECRET //xxx.xxx.xxx.xxx/путь-к-месту-для-сохранения-образа /media/backup/
```
Где:
- `NAS_USERNAME` — имя пользователя для доступа к сетевому хранилищу;
- `SECRET` — пароль для доступа к сетевому хранилищу;
- `xxx.xxx.xxx.xxx` — IP-адрес сетевого хранилища;
- `путь-к-каталогу-для-сохраненияь-обраа` — путь к каталогу на сетевом хранилище, куда будет сохранен образ;
- `/media/backup/` — точка монтирования сетевого хранилища.
- `NAS_USERNAME` — имя пользователя для доступа к сетевому хранилищу;
- `SECRET` — пароль для доступа к сетевому хранилищу;
- `xxx.xxx.xxx.xxx` — IP-адрес сетевого хранилища;
- `путь-к-каталогу-для-сохраненияь-обраа` — путь к каталогу на сетевом хранилище, куда будет сохранен образ;
- `/media/backup/` — точка монтирования сетевого хранилища.
Сделаем образ MicroSD в файл `flash-disk.img` на этом внешнем накопителе:
Сделаем образ MicroSD в файл `flash-disk.img` на этом внешнем накопителе:
```shell
sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress
```
Это займет некоторое время (и иногда, в зависимости от скорости внешнего накопителя и размера MicroSD, довольно
продолжительное). После того как образ будет готов, установим в систему `gdisk` — утилиту для работы
с таблицами разделов:
Это займет некоторое время (и иногда, в зависимости от скорости внешнего накопителя и размера MicroSD, довольно
продолжи­тельное). После того как образ будет готов, установим в систему `gdisk` — утилиту для работы
с таблицами разделов:
```shell
sudo apt install gdisk
```
## Очистим разделы на SPI-флеш (внутренней флеш-памяти с загрузчиками)
Запустим `gdisk` для работы с заделами на SPI `mtdblock0` (загрузчиками):
Запустим `gdisk` для работы с заделами на SPI `mtdblock0` (загрузчиками):
```shell
sudo gdisk /dev/mtdblock0
@@ -101,7 +104,7 @@ Found valid GPT with protective MBR; using GPT.
Command (? for help):
```
Если введем `?` и нажмем Enter, увидим список команд:
Если введем `?` и нажмем Enter, увидим список команд:
```text
b back up GPT data to a file
c change a partition's name
@@ -121,7 +124,7 @@ x extra functionality (experts only)
? print this menu
```
Выполним команду `p` и Enter, чтобы увидеть список разделов:
Выполним команду `p` и Enter, чтобы увидеть список разделов:
```text
Disk /dev/mtdblock0: 32768 sectors, 16.0 MiB
Sector size (logical/physical): 512/512 bytes
@@ -139,23 +142,23 @@ Number Start (sector) End (sector) Size Code Name
Command (? for help):
```
Как видим, у нас есть два раздела: `idbloader` и `uboot`. Нам нужно удалить их. Для этого выполним команду `d` и Enter.
Как видим, у нас есть два раздела: `idbloader` и `uboot`. Нам нужно удалить их. Для этого выполним команду `d` и Enter.
Увидим:
```text
Partition number (1-2):
```
Введем номер раздела `1` и Enter. Раздел будет удален. Повторим для раздела `2`. Снова выполним команду `d` и Enter.
Теперь нас не спросят номер раздела, оставшийся раздел будет удален без лишних вопросов. Если у вас, вдруг, было
больше двух разделов, надо последовательно удалить их все.
Введем номер раздела `1` и Enter. Раздел будет удалён. Повторим для раздела `2`. Снова выполним команду `d` и Enter.
Теперь нас не спросят номер раздела, оставшийся раздел будет удален без лишних вопросов. Если у вас, вдруг, было
больше двух разделов, надо последо­вательно удалить их все.
Теперь нам нужно сохранить изменения. Для этого выполним команду `w` и Enter. Увидим:
Теперь нам нужно сохранить изменения. Для этого выполним команду `w` и Enter. Увидим:
```text
Warning! Secondary header is placed too early on the disk! Do you want to
correct this problem? (Y/N):
```
Подтверждаем наше намерения перезаписать таблицу разделов. Вводим введя `y` и Enter. Увидим:
Подтверждаем наше намерения перезаписать таблицу разделов. Вводим введя `y` и Enter. Увидим:
```text
Have moved second header and partition table to correct location.
@@ -165,7 +168,7 @@ PARTITIONS!!
Do you want to proceed? (Y/N):
```
Еще раз подтверждаем наше намерение перезаписать таблицу разделов. Вводим `y` и Enter. Увидим:
Еще раз подтверждаем наше намерение перезаписать таблицу разделов. Вводим `y` и Enter. Увидим:
```text
OK; writing new GUID partition table (GPT) to /dev/mtdblock0.
Warning: The kernel is still using the old partition table.
@@ -174,26 +177,24 @@ run partprobe(8) or kpartx(8)
The operation has completed successfully.
```
## Очистим разделы на целевом eMMC (или SSD NVMe)
## Очистим разделы на целевом eMMC (или SSD NVMe)
Теперь нам нужно очистить разделы на целевом накопителе. Для этого запустим `gdisk` для работы с разделами на eMMC
(в нашем случае это `mmcblk0`):
Теперь нам нужно очистить разделы на целевом накопителе. Для этого запустим `gdisk` для работы с разделами на eMMC (в нашем случае это `mmcblk0`):
```shell
sudo gdisk /dev/mmcblk0
```
Проделаем те же операции, что и с SPI-флешем. Не буду повторяться, так как процедура аналогична. Важно помнить, что
нам нужно удалить все(!) разделы.
Проделаем те же операции, что и с SPI-флешем. Не буду повторяться, так как процедура аналогична. Важно помнить, что нам нужно удалить все(!) разделы.
## Выравняем разделы на eMMC (или SSD NVMe)
## Выравняем разделы на eMMC (или SSD NVMe)
Выравнивание секторов eMMC гарантирует правильное распознавание загрузочного диска. Снова запустим `gdisk` для нашего
Выравнивание секторов eMMC гарантирует правильное распо­знавание загрузочного диска. Снова запустим `gdisk` для нашего
eMMC:
```shell
sudo gdisk /dev/mmcblk0
```
Дадим команду `p` и Enter, чтобы, чтобы увидеть список разделов, и обратим внимание, на текст над таблицей разделов:
Дадим команду `p` и Enter, чтобы, чтобы увидеть список разделов, и обратим внимание, на текст над таблицей разделов:
```text
Disk /dev/mmcblk0: 488570880 sectors, 233.0 GiB
Sector size (logical/physical): 512/512 bytes
@@ -205,13 +206,11 @@ Partitions will be aligned on 2048-sector boundaries
Total free space is 4974559 sectors (2.4 GiB)
```
В данном случае все нормально: как видим выше, основная таблицы разделов начинается с сектора 2 и заканчивается на 33,
а первый используемый сектор — это любое число, кроме 34 (в нашем случае 2048). Можно пропустить следующие шаги. Но
если у вас нет так, то необходимо переформатировать сектора перед записью новой таблицы разделов на диск.
В данном случае все нормально: как видим выше, основная таблицы разделов начинается с сектора 2 и заканчи­вается на 33, а первый используемый сектор — это любое число, кроме 34 (в нашем случае 2048). Можно пропустить следующие шаги. Но если у вас нет так, то необходимо переформа­тировать сектора перед записью новой таблицы разделов на диск.
Для этого выполним следующие шаги:
Для этого выполним следующие шаги:
Вводим команду `x` и Enter, чтобы перейти в экспертный режими. В режиме доступны следующие команды:
Вводим команду `x` и Enter, чтобы перейти в экспертный режими. В режиме доступны следующие команды:
```text
a set attributes
b byte-swap a partition's name
@@ -239,100 +238,92 @@ z zap (destroy) GPT data structures and exit
? print this menu
```
Переместите основную таблицу разделов. Для этого введите `j` и Enter. Будет предложено задать сектор для расположения
начала основной таблицы разделов:
Переместите основную таблицу разделов. Для этого введите `j` и Enter. Будет предложено задать сектор для расположения начала основной таблицы разделов:
```text
Currently, main partition table begins at sector 2 and ends at sector 33
Enter new starting location (2 to 61408; default is 2; 1 to abort):
```
Вводим `2` и Enter. Затем сохраняем изменения, выполнив команду `w` и Enter. И пройдя два подтвер­ждения (`y` и Enter) выходим из `gdisk`.
Вводим `2` и Enter. Затем сохраняем изменения, выполнив команду `w` и Enter. И пройдя два подтверждения (`y` и Enter)
выходим из `gdisk`.
## Перезаписываем загрузчик
## Переза­писываем загрузчик
Несколькими попытками проверено, что только такой порядок действий (обновление загрузчика) гарантирует, что
Orange Pi 5 будет загружаться с eMMC. Надо запустить встроенное приложение конфигурации Orange Pi 5:
Orange Pi 5 будет загружаться с eMMC. адо запустить встроенное приложение конфигурации Orange НPi Н5:
```shell
sudo orangepi-config
```
Панель orangepi-config на Orange Pi 5 выглядит так:
Панель orangepiconfig на Orange Pi 5 выглядит так:
![Панель orangepi-config на Orange Pi 5 выглядит так](../images/orange--orange-config.gif)
![Панель orangepiconfig на Orange Pi 5 выглядит так](../images/orangeorange-config.gif)
Выбираем пункт '**System: System and security settings**' и заходим в панель '**System Settings**'. Выбираем в ней
Выбираем пункт '**System: System and security settings**' и заходим в панель '**System Settings**'. Выбираем в ней
пункт '**Install: Install to/update boot loader**':
![В orangepi-config заходим в панель 'System Settings' и выбираем 'Install: Install to/update boot loader](../images/orange--orange-config--system-setting--install-update-boot-loader.png)
![В orangepiconfig заходим в панель 'System Settings' и выбираем 'Install: Install to/update boot loader](../images/orangeorange-configsystem-settinginstall-update-boot-loader.png)
Выбираем последний пункт '**Install/Update the bootloader on SPI Flash**':
Выбираем последний пункт '**Install/Update the bootloader on SPI Flash**':
![Выбираем пункт 'Install/Update the bootloader on SPI Flash'](../images/orange--orange-config--system-setting--install-update-boot-loader--install-update-bootloader-spi-slash.png)
![Выбираем пункт 'Install/Update the bootloader on SPI Flash'](../images/orangeorange-configsystem-settinginstall-update-boot-loaderinstall-update-bootloader-spi-slash.png)
Подтверждаем наше намерение обновить загрузчик:
![orange-pi--003.png](../images/orange--orange-config--system-setting--install-update-boot-loader--warning.png)
![orange-pi003.png](../images/orangeorange-configsystem-settinginstall-update-boot-loaderwarning.png)
Спустя несколько минут мы снова увидим панель '**System Settings**' приложения `orangepi-config`. На этом этапе
можно обновить пакеты системы, выбрав пункт '**Firmware: Run apt update & apt upgrade**'. Но это не обязательно,
можно просто выйти из `orangepi-config`.
Спустя несколько минут мы снова увидим панель '**System Settings**' приложения `orangepiconfig`. На этом этапе
можно обновить пакеты системы, выбрав пункт '**Firmware: Run apt update & apt upgrade**'. Но это не обязательно,
можно просто выйти из `orangepiconfig`.
Перезагружаем наш Orange Pi 5. Все еще не извлекая MicroSD:
Переза­гружаем наш Orange Pi 5. Все еще не извлекая MicroSD:
```shell
sudo reboot
```
| Важно! |
|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Возможно Orange Pi не загрузится. Просто извлеките MicroSD, перезапишите не неё образ системы (лучше чистой, [с официального сайта произво­дителя](http://www.orangepi.org/html/serviceAn­dSupport/index.html)), загрузитесь снова и проделайте все вышепере­численное ещё раз. |
| Важно! |
|:-------|
| Возможно Orange Pi не загрузится. Просто извлеките MicroSD, перезапишите не неё образ системы (лучше чистой, [с официального сайта производителя](http://www.orangepi.org/html/serviceAndSupport/index.html)), загрузитесь снова и проделайте все вышеперечисленное ещё раз. |
## Записываем образ чистой системы на eMMC
## Записываем образ чистой системы на eMMC
Самый простой, быстрый и проверенный способ — записать на eMMC образ чистой системы, скаченный с официального сайта. К слову сказать, образы официальных сборок для Orannge Pi лежать на Goolge Drive, так что самое оптимальное скачать образ на каком-нибудь другом компьютере и перенести его на Orange Pi с помощью USB-накопителя или NAS.
Самый простой, быстрый и проверенный способ — записать на eMMC образ чистой системы, скаченный с официального сайта.
К слову сказать, образы официальных сборок для Orannge Pi лежать на Goolge Drive, так что самое оптимальное скачать
образ на каком-нибудь другом компьютере и перенести его на Orange Pi с помощью USB-накопителя или NAS.
Записываем файл с образом на eMMC:
Записываем файл с образом на eMMC:
```shell
sudo dd bs=1M if=Orangepi5plus_1.0.8_ubuntu_jammy_server_linux6.1.43.img of=/dev/mmcblk0 status=progress
```
Все. Можно выключить Orange Pi 5 Plus:
Все. Можно выключить Orange Pi 5 Plus:
```shell
sudo shutdown 0
```
Извлекаем MicroSD и включаем Orange Pi 5. Он должен загрузиться с eMMC.
Извлекаем MicroSD и включаем Orange Pi 5. Он должен загрузиться с eMMC.
## Перенос системы с MicroSD (или с резервной копии) на eMMC
## Перенос системы с MicroSD (или с резервной копии) на eMMC
Если установка чистой системы на eMMC не подходит (наприер, если на MicroSD уже настроена и отлажена система), то
можно перенести систему с MicroSD на eMMC. Правда это не сработает, если размер eMMC меньше размера MicroSD (1), а
если сработает (размер eMMC больше размера MicroSD), то на eMMC, после копирования, будут созданы тома и разделы
ровно такого же размера, как на MicroSD (2).
Если установка чистой системы на eMMC не подходит (наприер, если на MicroSD уже настроена и отлажена система), то можно перенести систему с MicroSD на eMMC. Правда это не сработает, если размер eMMC меньше размера MicroSD (1), а если сработает (размер eMMC больше размера MicroSD), то на eMMC, после копирования, будут созданы тома и разделы
ровно такого же размера, как на MicroSD (2).
Для копирования раздела с MicroSD на eMMC:
Для копирования раздела с MicroSD на eMMC:
```shell
sudo dd bs=1M if=/dev/mmcblk1 of=/dev/mmcblk0 status=progress
```
а для восстановления из резервной копии (не забываем смонтировать внешний накопитель с резервными копиями) что-то типа:
а для восста­новления из резервной копии (не забываем смонтировать внешний накопитель с резервными копиями) что-то типа:
```shell
sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress
```
Это займет продолжительное время. Если мы делали восстановление из резервной копии, то можно будет сразу извлечь
MicroSD и перезагрузиться. Но если мы копировали с MicroSD на eMMC, то нам надо будет еще расширить раздел на eMMC
на весь объем накопителя, и расширить файловую систему. Так как она еще не смонтирована, то сделать это не сложно.
Это займет продолжи­тельное время. Если мы делали восста­новление из резервной копии, то можно будет сразу извлечь
MicroSD и переза­грузиться. Но если мы копировали с MicroSD на eMMC, то нам надо будет еще расширить раздел на eMMC
на весь объем накопителя и расширить файловую систему. Так как она еще не смонтирована, то сделать это несложно.
Установим в систему пакет утилит `cloud-guest-utils`. Из ее состава нас интересует утилита `growpart`
для автоматического увеличения размеров разделов на диске.
Установим в систему пакет утилит `cloud-guest-utils`. Из ее состава нас интересует утилита `growpart`
для автома­тического увеличения размеров разделов на диске.
```shell
sudo apt install cloud-guest-utils
```
Увеличиваем второй раздел на eMMC (на первом у нас загрузчик):
Увеличиваем второй раздел на eMMC (на первом у нас загрузчик):
```shell
sudo growpart /dev/mmcblk0 2
```
@@ -342,7 +333,7 @@ sudo growpart /dev/mmcblk0 2
CHANGED: partition=2 start=2158592 old: size=121737216 end=123895808 new: size=486412255 end=488570847
```
Теперь нужно "растянуть" файловую систему на этом разделе. Но для начала проведем проверки файловой системы раздела:
Теперь нужно «растянуть» файловую систему на этом разделе. Но для начала проведем проверки файловой системы раздела:
```shell
sudo e2fsck -f /dev/mmcblk0p2
```
@@ -365,8 +356,8 @@ opi_root: ***** FILE SYSTEM WAS MODIFIED *****
opi_root: 48812/3779520 files (0.2% non-contiguous), 1711779/15217152 blocks
```
Как видим, нам показали две ошибки и предложили их исправить, и мы согласились (`y`). Теперь, после проверок
и исправлений, "растянем" файловую систему:
Как видим, нам показали две ошибки и предложили их исправить, и мы согласились (`y`). Теперь, после проверок
и исправлений, «растянем» файловую систему:
```shell
sudo resize2fs /dev/mmcblk0p2
```
@@ -378,18 +369,17 @@ Resizing the filesystem on /dev/mmcblk0p2 to 60801531 (4k) blocks.
The filesystem on /dev/mmcblk0p2 is now 60801531 (4k) blocks long.
```
Все. Раздел на eMMC увеличен на весь объем накопителя, и файловая система на нем тоже "растянута". Теперь можно
выключить Orange Pi:
Все. Раздел на eMMC увеличен на весь объем накопителя, и файловая система на нем тоже «растянута». Теперь можно
выключить Orange Pi:
```shell
sudo shutdown 0
```
Извлекаем MicroSD и включаем Orange Pi снова. Он должен загрузиться уже с eMMC.
Извлекаем MicroSD и включаем Orange Pi снова. Он должен загрузиться уже с eMMC.
## PS
В составлении этой заметки большую помощь оказала инструкция [Kaveh Kaviani](
В составлении этой заметки большую помощь оказала инструкция [Kaveh Kaviani](
https://github.com/kaveh-kaviani/Tutorials/blob/main/content/sbc/orange-pi/orange-pi-5/boot-linux-from-emmc/README.md).
Большое спасибо ему.

View File

@@ -1,50 +1,55 @@
# Сборка ядра Linux для Orange Pi 5 Plus (и других устройств на Rockchip RK3588) с поддержкой iSCSI
# Сборка ядра Linux для Orange Pi 5 Plus (и других устройств на Rockchip RK3588) с поддержкой iSCSI
Для моего проекта (k3s на Orange Pi 5 Plus) потребовалась поддержка система управления блочным хранилищем 'longhorn'
(longhorn.io). _Longhorn_ позволяет создавать надёжные тома для контейнеров, автоматически реплицируя их между узлами
и обеспечения высокую доступности приложений (если один узел выходит из строя, данные остаются доступны на репликах
на других узлах).
[![Static Badge](https://img.shields.io/badge/ПОЛЕЗНО-99.9%-blue)](#)
[![Static Badge](https://img.shields.io/badge/СЛОЖНОСТЬ-8/10-orange)](#)
[![Static Badge](https://img.shields.io/badge/ОРИГИНАЛ-git.cube2.ru-green)](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md)
[![Static Badge](https://img.shields.io/badge/ТИПОГРАФИКА-etpgrf-green)](https://typograph.cube2.ru/)
Для _longhorn_ нужен `iSCSI` (**Internet Small Computer System Interface**) — сетевой протокол, который по TCP/IP
подсоединяет удалённые диски так, будто они подключены физически. Longhorn через iSCSI обеспечивает передачу
данных между узлами по сети.
Для моего проекта (k3s на Orange Pi 5 Plus) потре­бовалась поддержка система управления блочным хранилищем 'longhorn'
(longhorn.io). _Longhorn_ позволяет создавать надёжные тома для контейнеров, автома­тически реплицируя их между узлами
и обеспечения высокую доступности приложений (если один узел выходит из строя, данные остаются доступны на репликах
на других узлах).
В ядре Linux поддержка _iSCSI_ реализована через модули, такие как `iscsi_tcp` и `scsi_transport_iscsi`. Однако,
в большинстве дистрибутивов для одноплатных компьютеров, включая и Orange Pi 5 Plus, эти модули отключены. Это делают
для экономии ресурсов, да и в целом, это нетипичный сценарий использования Orange Pi. В версии Ubuntu 22.04
для Orange Pi 5 Plus (в ядре от Xunlong), поддержка iSCSI тоже отключена, и это делает невозможным запуск Longhorn
из коробки.
Для _longhorn_ нужен `iSCSI` (**Internet Small Computer System Interface**) — сетевой протокол, который по TCP/IP
подсоединяет удалённые диски так, будто они подключены физически. 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`), и cможем настроить
ядро под свои задачи. Однако компиляция и его замена требует осторожности и внимательности, ошибка в процессе может
привести к тому, что система не загрузится (но мы сделаем резервную копию текущего ядра, загрузчика, чтобы можно
**А значит нужно компиляция ядра (сбока)**
Мы вручную включим поддержку _iSCSI_ (модули `iscsi_tcp` и `scsi_transport_iscsi`), и ожем настроить
ядро под свои задачи. Однако компиляция и его замена требует осторожности и вниматель­ности, ошибка в процессе может
привести к тому, что система не загрузится (но мы сделаем резервную копию текущего ядра, загрузчика, чтобы можно
было восстановить систему).
Обновления системы (например, через `apt`) с новым ядром будет проходить, как обычно: пакеты, утилиты и приложения
обновятся без проблем. Однако пересобранное ядро больше не будет автоматически обновляться через стандартные средства
дистрибутива. Если выйдет новая версия ядра, то придётся вручную повторить процесс компиляции. К счастью,
поставщик (это Xunlong) обновляет ядро не часто.
Обновления системы (например, через `apt`) с новым ядром будет проходить, как обычно: пакеты, утилиты и приложения
обновятся без проблем. Однако пересо­бранное ядро больше не будет автома­тически обновляться через стандартные средства
дистрибутива. Если выйдет новая версия ядра, то придётся вручную повторить процесс компиляции. К счастью,
поставщик (это Xunlong) обновляет ядро не часто.
| ✎ Заметка |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Orange Pi 5 Plus использует процессор **Rockchip RK3588** (как и многие другие устройства под брендом Orange). Процесс компиляции ядра для всех RK35xx почти идентичен, и базируется на одном и том же дистрибутиве. Однако, разные периферийные устройства: например, GPIO, USB или Ethernet-контроллеры могут отличаться. Мы будем использовать `.config` от текущего, рабочего ядра, так что настройки будут актуальны. Но следует иметь в виду, что возможно, в будущем могут появиться изменения в конфигурации, дистрибутива и т.п. Следует учитывать, это и **никто ничего не гарантирует**. |
| ✎ Заметка |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Orange Pi 5 Plus использует процессор **Rockchip RK3588** (как и многие другие устройства под брендом Orange). Процесс компиляции ядра для всех RK35xx почти идентичен, и базируется на одном и том же дистрибутиве. Однако, разные периферийные устройства: например, GPIO, USB или Ethernet-контроллеры могут отличаться. Мы будем использовать `.config` от текущего, рабочего ядра, так что настройки будут актуальны. Но следует иметь в виду, что возможно, в будущем могут появиться изменения в конфигурации, дистрибутива и т.п. Следует учитывать, это и **никто ничего не гарантирует**. |
## План сборки ядра с iSCSI
## План сборки ядра с iSCSI
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
* Установить инструментарий для настройки и компиляции ядра
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
* Установить инстру­ментарий для настройки и компиляции ядра
* Скачать исходники.
* Настроить конфиг для включения модулей iSCSI (и мониторинга NVMe).
* Скомпилировать ядро и модули.
* Настроить конфиг для включения модулей iSCSI (и мониторинга NVMe).
* Скомпи­лировать ядро и модули.
* Установить новое ядро.
* Перезагрузиться в новое ядро.
* Переза­грузиться в новое ядро.
* Проверка.
## Резервное копирование текущего ядра и /boot
## Резервное копирование текущего ядра и /boot
Архивируем том `/boot` на нашем Orange Pi 5 Plus во временный каталог `/tmp`:
Архивируем том `/boot` на нашем Orange Pi 5 Plus во временный каталог `/tmp`:
```bash
sudo tar -czf /tmp/boot-backup.tar.gz /boot
```
@@ -59,19 +64,18 @@ ls -al /tmp/boot-backup.tar.gz
-rw-r--r-- 1 root root 62116591 мар 23 20:33 /tmp/boot-backup.tar.gz
```
Теперь нам нужно скопировать его на какой-нибудь внешний хост (или носитель, но я буду копировать на хост другого
компьютера). Если что-то пойдёт не так (например, после обновления ядра система не загрузится) можно будет восстановить
файлы из этого архива. Мой Orange Pi 5 Plus, на котором я буду компилировать ядро имеет хост `opi5plus-3` (замени
на свой хост), а имя пользователя от которого я работаю `opi` (замени на свой). На рабочем компьютере, с которого
я захожу по SSH на Orange, у меня есть папка `~/backup/` (`mkdir -p ~/backup`). Скачиваю в неё архив:
Теперь нам нужно скопировать его на какой-нибудь внешний хост (или носитель, но я буду копировать на хост другого
компьютера). Если что-то пойдёт не так (например, после обновления ядра система не загрузится) можно будет восстановить
файлы из этого архива. Мой Orange Pi 5 Plus, на котором я буду компи­лировать ядро имеет хост `opi5plus-3` (замени
на свой хост), а имя пользователя от которого я работаю `opi` (замени на свой). На рабочем компьютере, с которого
я захожу по SSH на Orange, у меня есть папка `~/backup/` (`mkdir -p ~/backup`). Скачиваю в неё архив:
```bash
scp opi@opi5plus-3.local:/tmp/boot-backup.tar.gz ~/backup/opi5plus-3-boot-backup.tar.gz
```
### Что в архиве?
Если что-то пойдет не так, нам надо знать какие файлы в `/boot` важны и для чего предназначены. Вот список файлов
('ls -al /boot'):
Если что-то пойдет не так, нам надо знать какие файлы в `/boot` важны и для чего предна­значены. Вот список файлов ('ls -al /boot'):
```text
drwxr-xr-x 4 root root 4096 янв 1 1970 ./
drwxr-xr-x 19 root root 4096 фев 16 19:59 ../
@@ -93,42 +97,40 @@ drwxr-xr-x 3 root root 4096 ноя 21 09:55 dtb-6.1.43-rockchip-rk3588/
```
Ключевые файлы:
* `Image` — собственно ядро Linux (в данном случае версия 6.1.43 для Rockchip RK3588). При старте компьютера загрузчик
U-Boot загрузит его в память и передаст ему управление. Без этого файла система не запустится.
* `vmlinuz-6.1.43-rockchip-rk3588` — копия ядра (в системе уже есть резервная копия).
* `Image` — собственно ядро Linux (в данном случае версия 6.1.43 для Rockchip RK3588). При старте компьютера загрузчик
U-Boot загрузит его в память и передаст ему управление. Без этого файла система не запустится.
* `vmlinuz-6.1.43-rockchip-rk3588` — копия ядра (в системе уже есть резервная копия).
* `dtb/` — Каталог файлами **Device Tree Blob** (`DTB`). Это бинарные файлы, описывающие аппаратное обеспечение устройства.
Для Orange Pi 5 Plus используется файл вроде `rk3588-orangepi-5-plus.dtb` (находится в подкаталоге `dtb/rockchip/`).
DTB передаётся ядру, чтобы оно знало, как работать с процессором (количество ядер, частоты), памятью (RAM, её объём
и адреса), периферией (UART, I2C, SPI, Ethernet, USB, GPIO, прерывания и тому подобное). На ARM-устройствах
отличие от x86, где есть ACPI) нет стандартного способа обнаружения оборудования. DTB решает эту проблему,
предоставляя ядру "карту" железа. U-Boot загружает DTB из `/boot/dtb/ `и передаёт его ядру при старте. Кстати,
в подкаталоге dtb/rockchip/ есть `overlay/` — это дополнительные файлы, которые могут использоваться для добавления
и/или изменения функциональности устройства. Например, можно добавить поддержку новых периферийных устройств (камеру,
дисплей и т.п.).
* `uInitrd` — Начальный RAM-диск (initrd), адаптированный для U-Boot. Содержит модули и скрипты, необходимые для
пред-загрузки (выбор накопителя, монтирование корневой файловой системы и т.п.). Если он повреждён или несовместим
с ядром, загрузка может упасть на этапе инициализации.
* `orangepiEnv.txt` — Конфигурационный файл для U-Boot. Здесь задаются параметры загрузки, такие как путь расположение
дерева DTB, UUID корневой файловой системы, тип файловой системы… Без правильных настроек в этом файле U-Boot не
найдёт нужные для загрузки файлы.
* `boot.scr` — Скрипт загрузки для U-Boot. Содержит команды для загрузки ядра, initrd и DTB. U-Boot выполняет его
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
U-Boot не сможет загрузить систему.
* `dtb-6.1.43-rockchip-rk3588/` — Копия каталога `dtb/`, обычно появляется, когда ядро устанавливается или обновляется
через пакетный менеджер (например, `apt`). Она привязана к конкретной версии ядра — в данном случае
`6.1.43-rockchip-rk3588`, для того, чтобы: Хранить DTB-файлы, соответствующие этой версии ядра и избегать конфликты
между DTB от разных версий ядра (если используется несколько ядер на одной системе).
Для Orange Pi 5 Plus используется файл вроде `rk3588-orangepi-5-plus.dtb` (находится в подкаталоге `dtb/rockchip/`).
DTB передаётся ядру, чтобы оно знало, как работать с процессором (количество ядер, частоты), памятью (RAM, её объём
и адреса), периферией (UART, I2C, SPI, Ethernet, USB, GPIO, прерывания и тому подобное). На ARM-устройствах
 отличие от x86, где есть ACPI) нет стандартного способа обнаружения оборудования. DTB решает эту проблему,
предоставляя ядру «карту» железа. U-Boot загружает DTB из `/boot/dtb/ `и передаёт его ядру при старте. Кстати,
в подкаталоге dtb/rockchip/ есть `overlay/` — это дополни­тельные файлы, которые могут исполь­зоваться для добавления
и/или изменения функциональ­ности устройства. Например, можно добавить поддержку новых периферийных устройств (камеру,
дисплей и т.п.).
* `uInitrd` — Начальный RAM-диск (initrd), адапти­рованный для U-Boot. Содержит модули и скрипты, необходимые для пред-загрузки (выбор накопителя, монтирование корневой файловой системы и т. п.). Если он повреждён или несовместим
с ядром, загрузка может упасть на этапе инициа­лизации.
* `orangepiEnv.txt` — Конфигу­рационный файл для U-Boot. Здесь задаются параметры загрузки, такие как путь расположение
дерева DTB, UUID корневой файловой системы, тип файловой системы… Без правильных настроек в этом файле U-Boot не найдёт нужные для загрузки файлы.
* `boot.scr` — Скрипт загрузки для U-Boot. Содержит команды для загрузки ядра, initrd и DTB. U-Boot выполняет его
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
U-Boot не сможет загрузить систему.
* `dtb-6.1.43-rockchip-rk3588/` — Копия каталога `dtb/`, обычно появляется, когда ядро устана­вливается или обновляется
через пакетный менеджер (например, `apt`). Она привязана к конкретной версии ядра — в данном случае
`6.1.43-rockchip-rk3588`, для того, чтобы: Хранить DTB-файлы, соответ­ствующие этой версии ядра и избегать конфликты
между DTB от разных версий ядра (если используется несколько ядер на одной системе).
Менее критичные, но полезные файлы:
* `config-6.1.43-rockchip-rk3588` — Конфигурация ядра, использованная при его сборке (он нам понадобится, чтобы
пересобрать ядро с iSCSI).
* `System.map-6.1.43-rockchip-rk3588` — Карта меток (символов) ядра, полезна для отладки.
* `initrd.img-6.1.43-rockchip-rk3588` — Обычный initrd, из которого генерируется uInitrd.
* `boot.bmp` и `logo.bmp` — Изображения для экрана загрузки (не влияют на работу системы).
Менее критичные, но полезные файлы:
* `config-6.1.43-rockchip-rk3588` — Конфигурация ядра, исполь­зованная при его сборке (он нам понадобится, чтобы
пересобрать ядро с iSCSI).
* `System.map-6.1.43-rockchip-rk3588` — Карта меток (символов) ядра, полезна для отладки.
* `initrd.img-6.1.43-rockchip-rk3588` — Обычный initrd, из которого генерируется uInitrd.
* `boot.bmp` и `logo.bmp` — Изображения для экрана загрузки (не влияют на работу системы).
## Устанавливать инструменты для сборки ядра
## Устана­вливать инструменты для сборки ядра
Обновим репозитории и установим минимальный инструментарий для сборки ядра:
Обновим репозитории и установим минимальный инстру­ментарий для сборки ядра:
```bash
sudo apt update
sudo apt install -y build-essential bc flex bison libssl-dev libncurses-dev git
@@ -136,26 +138,26 @@ sudo apt install -y build-essential bc flex bison libssl-dev libncurses-dev git
Нам понадобятся следующие пакеты:
* `build-essential` — Включает `gcc` (для ARM64, make и другие базовые инструменты компиляции.
* `bc` — Утилита для точных математических вычислений в командной строке. Используется для вычислений в скриптах сборки ядра.
* `flex` и `bison` — генератор лексических анализаторов и парсер. Нужны для обработки конфигурационных файлов ядра.
* `libssl-dev` — Для поддержки криптографии в ядре и `OpenSSL`.
* `libncurses-dev` — Библиотека для создания текстовых интерфейсов в терминале. Необходимо для работы интерфейса
`menuconfig` при настройке параметров ядра.
* `git` — Для клонирования исходного кода ядра из репозитория Xunlong.
* `build-essential` — Включает `gcc` (для ARM64, make и другие базовые инструменты компиляции.
* `bc` — Утилита для точных матема­тических вычислений в командной строке. Используется для вычислений в скриптах сборки ядра.
* `flex` и `bison` — генератор лексических анализаторов и парсер. Нужны для обработки конфигу­рационных файлов ядра.
* `libssldev` — Для поддержки криптографии в ядре и `OpenSSL`.
* `libncurses-dev` — Библиотека для создания текстовых интерфейсов в терминале. Необходимо для работы интерфейса
`menuconfig` при настройке параметров ядра.
* `git` — Для клонирования исходного кода ядра из репозитория Xunlong.
> **Примечание:** Если вы хотите собрать ядро на x86-системе, установите кросс-компилятор `gcc-aarch64-linux-gnu` (`sudo apt install gcc-aarch64-linux-gnu`) и используйте его вместо обычного gcc в командах сборки. Он позволит собрать ядро для ARM64-архитектуры на x86-системе.
> **Примечание:** Если вы хотите собрать ядро на x86-системе, установите кросс-компилятор `gcc-aarch64-linux-gnu` (`sudo apt install gcc-aarch64-linux-gnu`) и используйте его вместо обычного gcc в командах сборки. Он позволит собрать ядро для ARM64-архитектуры на x86-системе.
## Скачивание и подготавливаем исходники ядра
## Скачивание и подгота­вливаем исходники ядра
Клонируем репозиторий Orange Pi для ядра 6.1 из репозитория Xunlong. Мы будем брать ветку (branch)
`orange-pi-6.1-rk35xx`. Это ветка с исходниками для всех устройств на базе Rockchip RK35xx (включая Orange Pi 5 Plus):
Клонируем репозиторий Orange Pi для ядра 6.1 из репозитория Xunlong. Мы будем брать ветку (branch)
`orange-pi-6.1-rk35xx`. Это ветка с исходниками для всех устройств на базе Rockchip RK35xx (включая Orange Pi 5 Plus):
```bash
git clone --depth 1 https://github.com/orangepi-xunlong/linux-orangepi -b orange-pi-6.1-rk35xx ~/linux-orangepi
```
После клонирования репозитория, переходим в каталог с ним:
После клонирования репозитория, переходим в каталог с ним:
```bash
cd ~/linux-orangepi
```
@@ -165,7 +167,7 @@ cd ~/linux-orangepi
uname -r
```
Я на своем Orange Pi 5 Plus вижу (у вас может быть другая версия):
Я на своем Orange Pi 5 Plus вижу (у вас может быть другая версия):
```text
6.1.43-rockchip-rk3588
```
@@ -175,42 +177,41 @@ uname -r
nano Makefile
```
И устанавливаем модификатор версии ядра, строку `XTRAVERSION =` (у меня это пятая строчка):
И устана­вливаем модификатор версии ядра, строку `XTRAVERSION =` (у меня это пятая строчка):
```text
EXTRAVERSION = -rockchip-rk3588
```
Затем копируем конфиг текущего ядра в конфиг для сборки.
Затем копируем конфиг текущего ядра в конфиг для сборки.
```bash
zcat /proc/config.gz > .config
```
`.config` содержит все текущие настройки ядра. Это очень удобно, так как нужно добавить только поддержку нужных модулей
нашем случае `iSCSI`), а не настраивать всё с нуля.
`.config` содержит все текущие настройки ядра. Это очень удобно, так как нужно добавить только поддержку нужных модулей
 нашем случае `iSCSI`), а не настраивать всё с нуля.
## Настройка конфига с iSCSI
## Настройка конфига с iSCSI
Теперь нужно отредактировать, `.config` чтобы включить `iSCSI`. Заходим в интерфейс конфигуратора ядра `menuconfig`:
Теперь нужно отреда­ктировать, `.config` чтобы включить `iSCSI`. Заходим в интерфейс конфи­гуратора ядра `menuconfig`:
```bash
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
```
Используя стрелки на клавиатуре, чтобы двигаться по пунктам меню.
1. Перейди в `Device Drivers` → `SCSI device support` → `SCSI Transports`.
2. Найти внутри `iSCSI Transport Attributes`, с помощью стрелок выбрать его.
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>`, три раза).
Используя стрелки на клавиатуре, чтобы двигаться по пунктам меню.
1. Перейди в `Device Drivers` → `SCSI device support` → `SCSI Transports`.
2. Найти внутри `iSCSI Transport Attributes`, с помощью стрелок выбрать его.
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>`, три раза).
| ✎ Может быть полезно: |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| На моём Orange Pi 5 Plus загрузка идет с NVMe диска ([см. как настроить](opi5plus-move-system-to-nvme-or-emmc.md)), и мне было полезно так же включить ещё и систему мониторинга NVMe: `Device Drivers` → `NVME Support`, найти пункт `SNVMe hardware monitoring` и включить его. В нижнем меню выбрать `<Save>` и подтвердим сохранение в `.config`. Выйти из `menuconfig` (через нижнее меню `<Exit>`, три раза). Теперь у меня будет возможность отслеживать состояние NVMe-диска (температуру, износ и т.д.) через инструменты вроде `nvme-cli`. |
| ✎ Может быть полезно: |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| На моём Orange Pi 5 Plus загрузка идет с NVMe диска ([см. как настроить](opi5plus-move-system-to-nvme-or-emmc.md)), и мне было полезно так же включить ещё и систему мониторинга NVMe: `Device Drivers` → `NVME Support`, найти пункт `SNVMe hardware monitoring` и включить его. В нижнем меню выбрать `<save>` и подтвердим сохранение в `.config`. Выйти из `menuconfig` (через нижнее меню `<exit>`, три раза). Теперь у меня будет возможность отслеживать состояние NVMe-диска (температуру, износ и т.д.) через инструменты вроде `nvme-cli`.</exit></save> |
Проверим, что iSCSI включён:
```bash
@@ -235,21 +236,18 @@ CONFIG_ISCSI_TCP=m
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
```
`-j8` — это количество потоков, используем столько, сколько у нас ядер. На Orange Pi 5 Plus восемь ядер. Но, например,
если у вас четыре ядра, то `-j4`.
`-j8` — это количество потоков, используем столько, сколько у нас ядер. На Orange Pi 5 Plus восемь ядер. Но, например,
если у вас четыре ядра, то `-j4`.
Компиляция займёт 20-40 минут (Orange Pi 5 Plus).
Компиляция займёт 2040 минут (Orange Pi 5 Plus).
Установим модули ядра:
```bash
sudo make modules_install
```
После завершения ядро будет находиться в каталоге `~/linux-orangepi/arch/arm64/boot/` (файл `Image`), а дерево описания
устройства в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/` (наш файл для Orange Pi 5 Plus --
`rk3588-orangepi-5-plus.dtb`, дле версий 5, 5 Max, AI, Ultra соответствующие файлы там же).
Проверим, что ядро скомпилировалось:
После завершения ядро будет находиться в каталоге `~/linux-orangepi/arch/arm64/boot/` (файл `Image`), а дерево описания
устройства в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/` (наш файл для Orange Pi 5 Plus  `rk3588-orangepi-5-plus.dtb`, дле версий 5, 5 Max, AI, Ultra соответ­ствующие файлы там же).
```bash
ls -l arch/arm64/boot/Image
```
@@ -259,7 +257,7 @@ ls -l arch/arm64/boot/Image
-rw-rw-r-- 1 opi opi 40579584 Mar 22 19:09 arch/arm64/boot/Image
```
Размер должен почти совпасть (или полностью совпадать) с размером текущего ядра:
Размер должен почти совпасть (или полностью совпадать) с размером текущего ядра:
```bash
ls -l /boot/Image
```
@@ -267,60 +265,58 @@ ls -l /boot/Image
-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`) почти не увеличивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали `<M>`,
а не `<*>`). Кроме того, Linux выравнивает размеры файлов по блокам (например, 4 Кб), и добавление
пары небольших модулей могут не повлиять на итоговый размер.
И это не ошибка. Мы добавили только `CONFIG_ISCSI_TCP=m` и `CONFIG_SCSI_ISCSI_ATTRS=m`. Это подключит модули (`iscsi_tcp.ko`),
но само ядро (`Image`) почти не увели­чивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали `<m>`,
а не `&lt;*&gt;`). Кроме того, Linux выравнивает размеры файлов по блокам (например, 4 Кб), и добавление
пары небольших модулей могут не повлиять на итоговый размер.
## Устанавливаем новое ядро рядом со старым
## Устана­вливаем новое ядро рядом со старым
Мы должны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и оно скомпилировалось в каталог
`~/linux-orangepi/arch/arm64/boot/`. Второй файл — это `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`, а вы можете
взять другой, для своей модели.
Мы должны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и оно скомпили­ровалось в каталог
`~/linux-orangepi/arch/arm64/boot/`. Второй файл — это `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`, а вы можете
взять другой, для своей модели.
Копируем новые файлы в `/boot` с уникальными именами (с суффиксом `-iscsi`):
Копируем новые файлы в `/boot` с уникальными именами (с суффиксом `-iscsi`):</m>
```bash
sudo cp ~/linux-orangepi/arch/arm64/boot/Image /boot/Image-iscsi
sudo cp ~/linux-orangepi/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dtb /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-iscsi
```
Старое ядро и дерево описания переименуем (это будет резервная копия, с суффиксом `-original`):
Старое ядро и дерево описания переименуем (это будет резервная копия, с суффиксом `-original`):
```bash
sudo mv /boot/Image /boot/Image-original
sudo mv /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-original
```
Устанавливаем новые ядро и дерево:
Устана­вливаем новые ядро и дерево:
```bash
sudo cp /boot/Image-iscsi /boot/Image
sudo cp /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-iscsi /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb
```
> **Важно**: Не обновляйте `uInitrd`, если текущий работает, его замена может сломать загрузку системы.
> **Важно**: Не обновляйте `uInitrd`, если текущий работает, его замена может сломать загрузку системы.
Все готово.
## Перезагрузка в новое ядро
## Перезагрузка в новое ядро
Тут все просто:
```bash
sudo reboot
```
#### Если что-то пошло не так и система не загрузилась
#### Если что-то пошло не так и система не загрузилась
Если вы все делали правильно, то такого быть не должно. Но, тем не менее, если загрузка не произошла, то это может
Если вы все делали правильно, то такого быть не должно. Но, тем не менее, если загрузка не произошла, то это может
выглядеть двумя способами:
* Система зависает на этапе загрузки: синенький огонек на Orange Pi не загорается и Ethernet тоже не мигает
_вы неправильно собрали ядро или испортили загрузчик.
* Система, вроде как, грузится, но все никак… огоньки весело мигают, но не получается подключиться ни по SSH, ни
другим способом, пинги на IP-адрес не проходят — вы забыли подключить модули, накосячили с конфигом или с `.dtb`_.
* Система зависает на этапе загрузки: синенький огонек на Orange Pi не загорается и Ethernet тоже не мигает — _вы неправильно собрали ядро или испортили загрузчик.
* Система, вроде как, грузится, но все никак… огоньки весело мигают, но не получается подключиться ни по SSH, ни другим способом, пинги на IP-адрес не проходят — вы забыли подключить модули, накосячили с конфигом или с `.dtb`_.
Чтобы починить, загружайтесь с MicroSD-карты (не забудьте отключить питание перед тем как вставить MicroSD-карту).
Затем смонтируйте, в зависимости где у вас система, eMMC:
Чтобы починить, загружайтесь с MicroSD-карты (не забудьте отключить питание перед тем как вставить MicroSD-карту).
Затем смонтируйте, в зависимости где у вас система, eMMC:
```bash
mkdir -p /mnt/emmc
mount /dev/mmcblk2p1 /mnt/emmc
@@ -334,7 +330,7 @@ mount /dev/nvme0n1p1 /mnt/nvme
cd /mnt/nvme
```
И восстанавливаем старое ядро и дерево описания:
И восста­навливаем старое ядро и дерево описания:
```bash
sudo cp Image-original Image
sudo cp dtb/rockchip/rk3588-orangepi-5-plus.dtb-original dtb/rockchip/rk3588-orangepi-5-plus.dtb
@@ -345,21 +341,21 @@ sudo cp dtb/rockchip/rk3588-orangepi-5-plus.dtb-original dtb/rockchip/rk3588-ora
sudo poweroff
```
Вынимаем MicroSD-карту, включаем, и загрузиться старая система.
Вынимаем MicroSD-карту, включаем, и загрузиться старая система.
## Проверка нового ядра
Если же иситма поле обновления ядра загрузилась, проверим текущую версию ядра:
Если же иситма поле обновления ядра загрузилась, проверим текущую версию ядра:
```bash
uname -r
```
Она должна остаться той же:
Она должна остаться той же:
```text
6.1.43-rockchip-rk3588
```
Проверим, работает ли iSCSI:
Проверим, работает ли iSCSI:
```bash
sudo systemctl status iscsid
```
@@ -389,11 +385,11 @@ TriggeredBy: ● iscsid.socket
| ✎ Заметка |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Если вы включили мониторинг NVMe, то проверим и его. Установим nvme-cli: `sudo apt install nvme-cli` и проверим состояние нашего накопителя `sudo nvme smart-log /dev/nvme0n1`. |
| Если вы включили мониторинг NVMe, то проверим и его. Установим nvme-cli: `sudo apt install nvme-cli` и проверим состояние нашего накопителя `sudo nvme smart-log /dev/nvme0n1`. |
**ВСË!**
А, да, не забудьте удалить репозиторий с исходниками ядра, если он вам больше не нужен:
А, да, не забудьте удалить репозиторий с исходниками ядра, если он вам больше не нужен:
```bash
rm -rf ~/linux-orangepi
```