Orange Pi Zero 3 - микрокомпьютер на микропроцессоре Allwinner H618. Orange Pi Zero 3 выпускают с 1Gb, 1.5Gb, 2Gb и 4Gb оперативной памяти. В качестве постоянного запоминающего устройства используется micro SD Flash карта.

Опишем процесс установки операционной системы Linux Debian Bookworm (12) server и desktop на Orange Pi Zero 3.

Установка Debian server на Orange Pi Zero3. Используем файл образа Debian 12 Bookworm server с сайта orangepi.org. Файлы образов можно выбрать на странице этого сайта serviceAndSupport и скачать через Google disk.

Архив с образом необходимо распаковать и проверить на целостность.

sha256sum -c *.sha
Orangepizero3_1.0.4_debian_bookworm_server_linux6.1.31.img: ЦЕЛ

Для записи образа операционной системы на micro SD Flash карту используем программу balenaEtcher. Ссылка для скачивания balenaEtcher. Программу balenaEtcher устанавливать не надо, по ссылке загружается архив программы. Скачиваем, разархивируем и запускаем двойным щелчком. BalenaEtcher работает на Linux, Windows и macOS.

При первом старте сервера происходит подготовка SD карты к использованию.

  ___  ____ ___   _____             _____ 
 / _ \|  _ \_ _| |__  /___ _ __ ___|___ / 
| | | | |_) | |    / // _ \ '__/ _ \ |_ \ 
| |_| |  __/| |   / /|  __/ | | (_) |__) |
 \___/|_|  |___| /____\___|_|  \___/____/ 
                                          
Welcome to Orange Pi 1.0.4 Bookworm with Linux 6.1.31-sun50iw9

System load:   32%           	Up time:       3 min	Local users:   2            	
Memory usage:  4% of 3.84G  	IP:	       192.168.1.12
CPU temp:      42°C           	Usage of /:    4% of 58G 

Используйте login root или orangepi, пароль orangepi.

Рекомендуется использовать micro SD Flash карту с торговой маркой SanDisk class 10.

Обновите операционную систему.

sudo apt update
sudo apt upgrade -y

Настройки в orangepi-config

Некоторые настройки можно сделать с помощью утилиты orangepi-config

sudo orangepi-config

Утилита orangepi-config предлагает диалоговый режим:

Рис. 1. Orangepi-config.

В разделе Personal настроим часовой пояс, язык системы, раскладку клавиатуры.

Рис. 1. Orangepi-config personal settings.

Добавляем пользователя

groups
orangepi tty disk dialout sudo audio video plugdev games users input netdev docker systemd-journal

Лист. 1.

sudo adduser newuser

Лист. 2.

sudo usermod -a -G orangepi,tty,disk,dialout,sudo,audio,video,plugdev,games,users,netdev,input,docker,systemd-journal newuser

Лист. 3.

Отключаем автоматический вход пользователя orangepi в систему

sudo systemctl disable orangepi-disable-autologin.service
sudo systemctl stop orangepi-disable-autologin.service

Лист. 1. Отключите сервис автовхода Orange Pi

sudo rm /lib/systemd/system/getty@.service.d/override.conf
sudo rm /lib/systemd/system/serial-getty@.service.d/override.conf

Лист. 2. Удаляем проблемные конфигурационные файлы автоматического входа в систему.

sudo cp /lib/systemd/system/getty@.service /etc/systemd/system/getty@.service

Лист. 3. Копируем стандартные настройки Getty

sudo systemctl daemon-reload
sudo systemctl restart getty@tty1

Лист. 4. Перезагружаем системные сервисы.

Удаляем пользователя orangepi

Проверим, с чем связан пользователь orengepi в системе.

sudo systemctl --all | grep orangepi
  orangepi-firstrun-config.service                                                            loaded    inactive dead      Orange Pi first run optional user configuration
  orangepi-hardware-monitor.service                                                           loaded    active   exited    Orange Pi hardware monitoring
  orangepi-hardware-optimize.service                                                          loaded    active   exited    Orange Pi hardware optimization
  orangepi-ramlog.service                                                                     loaded    active   exited    Orange Pi memory supported logging
  orangepi-zram-config.service                                                                loaded    active   exited    Orange Pi ZRAM config
● orangepi-hardware-monitor.target                                                            not-found inactive dead      orangepi-hardware-monitor.target
● orangepi-ramlog.target                                                                      not-found inactive dead      orangepi-ramlog.target

Лист. 1. Пользователь orangepi в службе systemctl.

Мы видим, что слово "orangepi" связано с несколькими системными службами. Но, это просто системные утилиты. Будем удалять пользователя и его домашнюю папку.

sudo userdel -r orangepi

Лист. 2. Удаляем пользователя "orangepi".

Проверяем наличие ошибок в системе.

sudo systemctl list-units --state=failed
  UNIT                  LOAD   ACTIVE SUB    DESCRIPTION                                            
● smartmontools.service loaded failed failed Self Monitoring and Reporting Technology (SMART) Daemon

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
1 loaded units listed.

Лист. 1. Запуск службы smartmontools.service завершился с ошибкой.

sudo systemctl stop smartmontools.service

Лист. 2. Останавливаем службу smartmontools.service

sudo systemctl disable smartmontools.service

Лист. 3. Запрещаем автозагрузку службы smartmontools.service

sudo systemctl reset-failed smartmontools.service

Лист. 4. Убираем службу smartmontools.service из списка сбоев.

sudo systemctl list-units --state=failed
[sudo] пароль для user: 
  UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.

Лист. 5. Результат.

Наcтроим bash подсказки

grep ^$(whoami) /etc/passwd | cut -d: -f7
/bin/bash

Лист. 1. Настроен командный интерпретатор bash.

Лист. 2.

Установка рабочего стола

sudo apt install xorg lxqt-core sddm openbox obconf lxqt-config --no-install-recommends

Лист. 1. Установка графической подсистемы.

mkdir -p ~/.config/openbox
cp /etc/xdg/openbox/rc.xml ~/.config/openbox/
cp /etc/xdg/openbox/menu.xml ~/.config/openbox/

Лист. 2. Создание файлов минимальной конфигурации OpenBox для пользователя.

Установка программ

sudo apt install firefox-esr

Лист.

#!/bin/bash

# Выходим при любой ошибке (строгий режим)
set -e

# Проверяем, запущен ли скрипт на Raspberry Pi
if grep -q Raspberry /proc/cpuinfo; then
    echo "Running on a Raspberry Pi"
else
    echo "Not running on a Raspberry Pi. Use at your own risk!"
    SKIP_UART=1  # Пропускать настройку UART на не-RPi системах
fi

# Количество ядер для параллельной сборки (make -j)
JNUM=4

# Выходная директория для всех файлов
OUTDIR="$(pwd)/pico"

# Зависимости:
GIT_DEPS="git git-lfs"  # Инструменты контроля версий
SDK_DEPS="cmake gcc-arm-none-eabi gcc g++ ninja-build"  # Базовый тулчейн
OPENOCD_DEPS="gdb-multiarch automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev libjim-dev pkg-config libgpiod-dev"  # Для отладки
VSCODE_DEPS="code"  # Редактор кода (не используется)
UART_DEPS="minicom"  # Терминал для UART

# Формируем общий список зависимостей
DEPS="$GIT_DEPS $SDK_DEPS"

# Проверяем, нужно ли пропускать установку OpenOCD
if [[ "$SKIP_OPENOCD" == 1 ]]; then
    echo "Skipping OpenOCD (debug support)"
else
    DEPS="$DEPS $OPENOCD_DEPS"  # Добавляем отладочные зависимости
fi

# Установка всех зависимостей
echo "Installing Dependencies"
sudo apt update
sudo apt install -y $DEPS

# Создаем рабочую директорию
echo "Creating $OUTDIR"
mkdir -p $OUTDIR
cd $OUTDIR

# Настройки для клонирования репозиториев
GITHUB_PREFIX="https://github.com/raspberrypi/"
GITHUB_SUFFIX=".git"
SDK_BRANCH="master"  # Ветка для SDK

# Клонируем основные репозитории
for REPO in sdk examples extras playground
do
    DEST="$OUTDIR/pico-$REPO"

    if [ -d $DEST ]; then
        echo "$DEST already exists so skipping"  # Пропускаем если уже существует
    else
        # Формируем URL репозитория
        REPO_URL="${GITHUB_PREFIX}pico-${REPO}${GITHUB_SUFFIX}"
        echo "Cloning $REPO_URL"
        git clone -b $SDK_BRANCH $REPO_URL  # Клонируем указанную ветку

        # Инициализируем подмодули
        cd $DEST
        git submodule update --init
        cd $OUTDIR

        # Добавляем переменные окружения в .bashrc
        VARNAME="PICO_${REPO^^}_PATH"  # Формируем имя переменной (PICO_SDK_PATH и т.д.)
        echo "Adding $VARNAME to ~/.bashrc"
        echo "export $VARNAME=$DEST" >> ~/.bashrc
        export ${VARNAME}=$DEST  # Устанавливаем для текущей сессии
    fi
done

cd $OUTDIR

# Применяем изменения .bashrc
source ~/.bashrc

# Сборка вспомогательных инструментов
for REPO in picotool debugprobe
do
    DEST="$OUTDIR/$REPO"
    REPO_URL="${GITHUB_PREFIX}${REPO}${GITHUB_SUFFIX}"
    
    # Для picotool используем специальную ветку
    if [[ "$REPO" == "picotool" ]]; then
      git clone -b $SDK_BRANCH $REPO_URL
    else
      git clone $REPO_URL  # Обычное клонирование
    fi

    # Сборка инструментов
    cd $DEST
    git submodule update --init  # Инициализация подмодулей
    mkdir build
    cd build
    cmake ../  # Генерация Makefile
    make -j$JNUM  # Параллельная сборка

    # Установка picotool в систему
    if [[ "$REPO" == "picotool" ]]; then
        echo "Installing picotool"
        sudo make install  # Установка системных бинарников
    fi

    cd $OUTDIR
done

# Сборка примеров для разных платформ
cd pico-examples
for board in pico pico_w pico2 pico2_w  # Поддерживаемые платы
do
    build_dir=build_$board  # Директория для сборки
    # Конфигурация CMake для конкретной платы
    cmake -S . -B $build_dir -GNinja -DPICO_BOARD=$board -DCMAKE_BUILD_TYPE=Debug
    
    # Примеры для сборки
    examples="blink hello_serial hello_usb"
    echo "Building $examples for $board"
    cmake --build $build_dir --target $examples  # Сборка через Ninja
done

cd $OUTDIR

# Проверка необходимости сборки OpenOCD
if [ -d openocd ]; then
    echo "openocd already exists so skipping"
    SKIP_OPENOCD=1
fi

# Сборка и установка OpenOCD
if [[ "$SKIP_OPENOCD" == 1 ]]; then
    echo "Won't build OpenOCD"
else
    echo "Building OpenOCD"
    cd $OUTDIR
    # Параметры конфигурации OpenOCD
    OPENOCD_CONFIGURE_ARGS="--enable-ftdi --enable-sysfsgpio --enable-bcm2835gpio --disable-werror --enable-linuxgpiod"

    # Клонирование и сборка
    git clone "${GITHUB_PREFIX}openocd${GITHUB_SUFFIX}" --depth=1  # Неглубокое клонирование
    cd openocd
    ./bootstrap  # Подготовка системы сборки
    ./configure $OPENOCD_CONFIGURE_ARGS  # Конфигурация
    make -j$JNUM  # Сборка
    sudo make install  # Установка
fi

cd $OUTDIR

# Настройка UART (только для Raspberry Pi)
if [[ "$SKIP_UART" == 1 ]]; then
    echo "Skipping uart configuration"
else
    sudo apt install -y $UART_DEPS  # Установка minicom
    echo "Disabling Linux serial console (UART) so we can use it for pico"

    # Настройка UART через raspi-config
    sudo raspi-config nonint do_serial_hw 0  # Включение аппаратного UART
    sudo raspi-config nonint do_serial_cons 1  # Отключение консоли через UART

    echo "You must run sudo reboot to finish UART setup"  # Требуется перезагрузка
fi

Лист. скрипт для настройки среды разработки Raspberry Pi Pico на Raspberry Pi.