mod: типограф и беджики
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
# Прозрачный прокси контейнера через Shadowsocks и tun2socks
|
||||
|
||||
[](#)
|
||||
[](#)
|
||||
[](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md)
|
||||
[](https://typograph.cube2.ru/)
|
||||
|
||||
|
||||
У меня есть Docker-контейнер Audiobookshelf, в котором я слушаю аудиокниги и подкасты. Он сам скачивает подкасты
|
||||
из интернета, и это очень удобно (все нужные мне подкасты в одном месте). Работал контейнер на домашнем NAS Synology
|
||||
(в нем есть Docker Station с веб-интерфейсом). Книг у меня в «библиотеке» уже более тысячи, а подкастов и того больше,
|
||||
|
||||
@@ -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. Причем,
|
||||
установка чистой системы будет намного проще и быстрее.
|
||||
[](#)
|
||||
[](#)
|
||||
[](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/raspberry-and-orange-pi/opi5plus-move-system-to-nvme-or-emmc.md)
|
||||
[](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. Внимание, устанавливайте до щелчка с обоих сторон! |
|
||||
|:-------------------------------------------------------------------------------------|
|
||||
|  |
|
||||
|  |
|
||||
| Фото до и после установки eMMC. Внимание, устанавливайте до щелчка с обеих сторон! |
|
||||
|:--------------------------------------------------------------------------------------|
|
||||
|  |
|
||||
|  |
|
||||
|
||||
…и/или SSD-накопитель NVMe
|
||||
|
||||
| Фото до и после установки NVMe. Более просто в установке. Для надёжности закрепить винтиком. |
|
||||
|:---------------------------------------------------------------------------------------------------|
|
||||
|  |
|
||||
|  |
|
||||
| Фото до и после установки NVMe. Более просто в установке. Для надёжности закрепить винтом. |
|
||||
|:----------------------------------------------------------------------------------------------------|
|
||||
|  |
|
||||
|  |
|
||||
|
||||
Кстати, производительность (скорость чтения и записи) 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 выглядит так:
|
||||
Панель orangepi–config на Orange Pi 5 выглядит так:
|
||||
|
||||

|
||||

|
||||
|
||||
Выбираем пункт '**System: System and security settings**' и заходим в панель '**System Settings**'. Выбираем в ней
|
||||
Выбираем пункт '**System: System and security settings**' и заходим в панель '**System Settings**'. Выбираем в ней
|
||||
пункт '**Install: Install to/update boot loader**':
|
||||
|
||||

|
||||

|
||||
|
||||
Выбираем последний пункт '**Install/Update the bootloader on SPI Flash**':
|
||||
Выбираем последний пункт '**Install/Update the bootloader on SPI Flash**':
|
||||
|
||||

|
||||

|
||||
|
||||
Подтверждаем наше намерение обновить загрузчик:
|
||||
|
||||

|
||||

|
||||
|
||||
Спустя несколько минут мы снова увидим панель '**System Settings**' приложения `orangepi-config`. На этом этапе
|
||||
можно обновить пакеты системы, выбрав пункт '**Firmware: Run apt update & apt upgrade**'. Но это не обязательно,
|
||||
можно просто выйти из `orangepi-config`.
|
||||
Спустя несколько минут мы снова увидим панель '**System Settings**' приложения `orangepi–config`. На этом этапе
|
||||
можно обновить пакеты системы, выбрав пункт '**Firmware: Run apt update & apt upgrade**'. Но это не обязательно,
|
||||
можно просто выйти из `orangepi–config`.
|
||||
|
||||
Перезагружаем наш Orange Pi 5. Все еще не извлекая MicroSD:
|
||||
Перезагружаем наш Orange Pi 5. Все еще не извлекая MicroSD:
|
||||
```shell
|
||||
sudo reboot
|
||||
```
|
||||
| Важно! |
|
||||
|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Возможно Orange Pi не загрузится. Просто извлеките MicroSD, перезапишите не неё образ системы (лучше чистой, [с официального сайта производителя](http://www.orangepi.org/html/serviceAndSupport/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).
|
||||
Большое спасибо ему.
|
||||
|
||||
@@ -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_ позволяет создавать надёжные тома для контейнеров, автоматически реплицируя их между узлами
|
||||
и обеспечения высокую доступности приложений (если один узел выходит из строя, данные остаются доступны на репликах
|
||||
на других узлах).
|
||||
[](#)
|
||||
[](#)
|
||||
[](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md)
|
||||
[](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`), и cможем настроить
|
||||
ядро под свои задачи. Однако компиляция и его замена требует осторожности и внимательности, ошибка в процессе может
|
||||
привести к тому, что система не загрузится (но мы сделаем резервную копию текущего ядра, загрузчика, чтобы можно
|
||||
было восстановить систему).
|
||||
|
||||
Обновления системы (например, через `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` — генератор лексических анализаторов и парсер. Нужны для обработки конфигурационных файлов ядра.
|
||||
* `libssl–dev` — Для поддержки криптографии в ядре и `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).
|
||||
Компиляция займёт 20–40 минут (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>`,
|
||||
а не `<*>`). Кроме того, 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
|
||||
```
|
||||
Reference in New Issue
Block a user