Bootstrap

OnePlus One как сервер: Nura (postmarketOS) + Docker + SSH

OnePlus One как сервер: Nura (postmarketOS) + Docker + SSH

OnePlus One как сервер: Nura (postmarketOS) + Docker + SSH

Зачем менять Ubuntu Touch на Nura

Это продолжение статьи про Ubuntu Touch на OnePlus One. Там телефон превратился в рабочий Linux-смартфон с SSH и apt, но поставить на него Docker не получится: Ubuntu Touch на bacon работает на Android-ядре 3.4, а Docker нужно ядро новее, с полноценными cgroups и namespaces. Ветка 20.04 (devel) здесь не помогает: у неё то же ядро 3.4.113.

Решение — Nura, бывший postmarketOS. В конце сентября 2026 года проект сменил название, сайт переехал на nura.eco, но в утилитах, пакетах и документации пока встречается старое имя. Nura основана на Alpine Linux и для OnePlus One может работать на основном (mainline) ядре Linux. А в нём есть всё, что нужно контейнерам.

Чего не будет ни в одной ОС. OnePlus One — 32-битный телефон: ядра Krait 400 в Snapdragon 801 имеют архитектуру ARMv7, и это ограничение самого чипа. Система будет armv7, Docker тоже. Для Docker это не проблема, но образы нужны со сборкой linux/arm/v7.

Состояние порта. По данным вики Nura, bacon находится в категории testing, mainline-ядро поддерживается (пакет linux-postmarketos-qcom-msm8974). Прошивка через pmbootstrap, экран, сенсор, зарядка и индикация батареи работают. Пакет устройства обновлялся в феврале 2026 года, у него есть сопровождающий. Категория testing означает, что готовых образов для скачивания нет: образ собирается на компьютере утилитой pmbootstrap, это займёт около часа.

Что работает, а что нет. По вики Nura>), на mainline-ядре 6.16 у bacon:

КомпонентСтатус
Экран, сенсор, зарядка, батареяРаботает
Wi-Fi, BluetoothРаботает, но мало протестировано
SMS, мобильные данныеРаботает
3D-ускорениеЧастично
ЗвонкиНе работает
Камера, звукНе работает
GPS, датчикиНе работает

Для сервера это не помеха: Wi-Fi и USB-сеть работают. Среди владельцев bacon на вики есть те, кто держит его как маленький сервер, сервер Minecraft и сервер для Docker.

Ubuntu Touch 16.04Nura (mainline)
ЯдроAndroid 3.4Основное ядро Linux
DockerНе запускаетсяРаботает
Звонки, SMS, камераРаботаютSMS и данные работают, звонки и камера — нет
Пакетыapt, корень только для чтенияapk, вся система доступна для записи
СлужбыupstartOpenRC
НазначениеТелефонСервер, эксперименты

> Внимание: установка Nura полностью стирает Ubuntu Touch и все данные на телефоне. Скопируйте нужное заранее. Загрузчик у нас уже разблокирован (см. первую статью), без этого дальше не пройти.

Подготовка MX Linux

Образ системы собирает pmbootstrap — официальная утилита проекта. Она работает внутри собственных chroot-окружений с Alpine Linux и почти ничего не ставит в вашу систему. Нужны Python 3, git, openssl и sudo, а также около 10 ГБ свободного места на диске.

1. Зависимости и fastboot

☯

Terminal:

⌕

≡

✕
sudo apt update
sudo apt install git python3 openssl fastboot adb android-sdk-platform-tools-common

Если вы ставили Ubuntu Touch по первой статье, fastboot и udev-правила у вас уже есть.

2. pmbootstrap из git

В репозиториях Debian (на нём основан MX Linux) есть пакет pmbootstrap, но его версия заморожена и может оказаться слишком старой. Надёжнее взять свежую из git:

☯

Terminal:

⌕

≡

✕
cd ~
git clone --depth=1 https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
mkdir -p ~/.local/bin
ln -s "$PWD/pmbootstrap/pmbootstrap.py" ~/.local/bin/pmbootstrap
pmbootstrap --version

Если в ответ пришло command not found, добавьте ~/.local/bin в PATH:

☯

Terminal:

⌕

≡

✕
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Обновлять pmbootstrap потом можно командой git -C ~/pmbootstrap pull.

> Особенность MX Linux. По умолчанию MX загружается с sysvinit, а не systemd. pmbootstrap это не мешает, но если при сборке появится ошибка про binfmt_misc, смонтируйте его вручную: sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc. Через binfmt\_misc компьютер на x86 запускает ARM-программы внутри сборочного окружения.

Сборка образа: pmbootstrap init и install

1. Настройка

☯

Terminal:

⌕

≡

✕
pmbootstrap init

Утилита задаст серию вопросов. Для сервера на OnePlus One отвечаем так:

ВопросОтветЗачем
Work pathEnter (по умолчанию)Папка для chroot и кэша, нужно около 10 ГБ
ChanneledgeУстройства категории testing надёжнее всего собираются в edge
Vendoroneplus
Device codenamebacon
Kernel (если спросит)mainlineТолько на нём работает Docker
Usernameсвоё имя, например userПользователь системы
User interfaceconsoleСерверу графика не нужна, экономим память
Additional packagesdocker,docker-cli-compose,nano,htopDocker сразу попадёт в образ
Copy SSH public keysyВаш ключ из ~/.ssh/*.pub сразу окажется на телефоне
Timezone, locale, hostnameна ваш вкус

Консольный интерфейс оставляет на экране только текстовую консоль. Если хочется видеть состояние сервера на экране, позже можно поставить лёгкую графику, но для Docker лучше сохранить память.

Канал edge — это ветка разработки: в ней свежие пакеты, но иногда случаются поломки. Для устройства из категории testing это нормальный выбор.

2. Сборка

☯

Terminal:

⌕

≡

✕
pmbootstrap install

pmbootstrap скачает пакеты, соберёт систему и попросит дважды ввести пароль пользователя — он понадобится для sudo на телефоне. Первая сборка идёт 20–60 минут: всё зависит от скорости интернета и компьютера.

Если что-то пошло не так, подробный лог смотрите командой pmbootstrap log. Начать сборку с нуля помогает pmbootstrap zap.

Прошивка телефона

1. Переведите телефон в режим fastboot

Выключите телефон, зажмите Громкость вверх + Питание и держите до надписи Fastboot Mode. Если на телефоне ещё работает Ubuntu Touch с режимом разработчика, можно и с компьютера: adb reboot bootloader.

Проверьте связь:

☯

Terminal:

⌕

≡

✕
fastboot devices

2. Прошейте систему и ядро

☯

Terminal:

⌕

≡

✕
pmbootstrap flasher flash_rootfs --partition userdata
pmbootstrap flasher flash_kernel
fastboot reboot

Обязательно указывайте --partition userdata. Без этого ключа система запишется в раздел system, где всего около 1,4 ГБ: она загрузится, но место быстро закончится. Раздел userdata на 64-гигабайтной модели — около 55 ГБ.

flash_kernel записывает ядро в раздел boot, а он у bacon всего 16 МБ. Новые ядра крупнее, но, по вики, начиная с 6-й ревизии пакета ядра это учтено, и обновления ставятся нормально. Если хочется сначала проверить, что ядро вообще загружается, выполните pmbootstrap flasher boot: ядро загрузится один раз, ничего не записывая.

Запись системы занимает несколько минут: не отключайте кабель.

При первой загрузке на экране сначала появится логотип OnePlus, затем текстовая консоль. Если экран остался тёмным или застрял на логотипе, не спешите: сервер может уже работать, проверьте подключение по USB-сети из следующего раздела.

3. Запасной путь: если запись прерывается ошибкой

На вики описан случай, когда flash_rootfs заканчивался ошибкой FAILED (remote: Unknown chunk type). Это значит, что заводской загрузчик не принимает формат образа. Обходной путь — дополнительный загрузчик lk2nd: он загружается штатным загрузчиком и даёт собственный, более современный fastboot.

  1. Скачайте lk2nd для чипсета MSM8974 со страницы релизов lk2nd.
  2. Выгрузите собранные образы: pmbootstrap export (pmbootstrap покажет, куда их положил).
  3. Прошейте lk2nd в раздел boot из режима fastboot: fastboot flash boot lk2nd.img.
  4. Перезагрузите телефон и, как только появится экран lk2nd, зажмите Громкость вниз — откроется меню lk2nd с его собственным fastboot.
  5. Повторите шаг 2 (flash_rootfs, затем flash_kernel) уже через fastboot lk2nd.

Порядок действий для lk2nd может меняться от версии к версии, поэтому перед этим шагом сверьтесь со страницей устройства в вики>).

4. Если систему записали не в тот раздел

Если забыли --partition userdata, система окажется в маленьком разделе system и быстро упрётся в нехватку места. Исправляется так: очистите system, чтобы телефон не пытался грузиться оттуда, и перепрошейте систему в userdata.

☯

Terminal:

⌕

≡

✕
fastboot format system
pmbootstrap flasher flash_rootfs --partition userdata
pmbootstrap flasher flash_kernel
fastboot reboot

Первое подключение: USB-сеть, Wi-Fi и SSH

1. Вход по USB-сети

Nura поднимает сеть прямо по USB-кабелю, без настроек. Телефон получает адрес 172.16.42.1, компьютер — адрес из той же сети. На MX Linux в списке сетевых интерфейсов появится новый проводной (обычно usb0 или enx…), NetworkManager подключит его сам.

☯

Terminal:

⌕

≡

✕
ssh user@172.16.42.1

Вместо user подставьте имя, заданное в pmbootstrap init. Поскольку при init вы скопировали публичный ключ, пароль не спросят.

Если подключения нет, проверьте интерфейс командой ip addr и, если адреса на нём нет, получите его вручную: sudo dhclient usb0.

2. Wi-Fi

В Nura сетью управляет NetworkManager, как и на настольном Linux:

☯

Terminal:

⌕

≡

✕
sudo nmcli device wifi list
sudo nmcli device wifi connect "ИмяСети" password "пароль"
ip addr show wlan0

Адрес из вывода последней команды — для подключения по SSH уже по Wi-Fi. Чтобы адрес не менялся, закрепите его за телефоном в настройках DHCP роутера. Настройка Wi-Fi запоминается и после перезагрузки поднимается сама.

Если Wi-Fi не работает

По вики, Wi-Fi и Bluetooth на bacon работают, но протестированы слабо, а у одного из владельцев Wi-Fi периодически отваливается. Проверьте по порядку.

1. Прошивка Wi-Fi. На вики сказано, что прошивка не упакована и её нужно извлечь из разделов самого телефона. При этом в репозитории уже есть пакет firmware-oneplus-bacon, так что сначала попробуйте поставить его:

☯

Terminal:

⌕

≡

✕
sudo apk search firmware-oneplus-bacon
sudo apk add firmware-oneplus-bacon
sudo reboot

Если пакета нет, извлеките прошивку по инструкции на странице устройства.

2. Нулевой MAC-адрес. Если интерфейс wlan0 есть, но сети не видны, проверьте его MAC:

☯

Terminal:

⌕

≡

✕
ip link show wlan0

Если там 00:00:00:00:00:00, задайте любой другой адрес, уникальный в вашей сети, и перезапустите NetworkManager:

☯

Terminal:

⌕

≡

✕
sudo ip link set dev wlan0 address 02:00:00:12:34:56
sudo rc-service networkmanager restart

Адрес, начинающийся с 02:, — «локально назначенный», он не совпадёт с адресом реального устройства. Чтобы MAC задавался при каждой загрузке, создайте службу OpenRC (вариант с вики):

☯

Terminal:

⌕

≡

✕
sudo tee /etc/init.d/wlanhwaddr << 'EOF'
#!/sbin/openrc-run
command=/sbin/ip
command_args="link set dev wlan0 address 02:00:00:12:34:56"
description="WLAN hw-addr setter"

depend() {
  before networkmanager
}
EOF
sudo chmod 755 /etc/init.d/wlanhwaddr
sudo rc-update add wlanhwaddr

3. Если MAC в порядке, но связи нет, перезапустите NetworkManager: sudo rc-service networkmanager restart.

4. Если интерфейса wlan0 нет вовсе, Wi-Fi на вашей сборке не работает. Сервер всё равно доступен по USB-кабелю.

Bluetooth для сервера обычно не нужен. Если понадобится, поставьте bluez и включите службу: sudo apk add bluez && sudo rc-update add bluetooth default && sudo rc-service bluetooth start.

3. Только вход по ключу

SSH-сервер в Nura включён по умолчанию и запускается при загрузке, никаких override, как в Ubuntu Touch, нет. Убедившись, что вход по ключу работает, отключите пароли:

☯

Terminal:

⌕

≡

✕
echo "PasswordAuthentication no" | sudo tee /etc/ssh/sshd_config.d/50-no-password.conf
sudo rc-service sshd restart
sudo sshd -T | grep -i passwordauthentication

Последняя команда должна показать passwordauthentication no. Если папки sshd_config.d нет, впишите ту же строку прямо в /etc/ssh/sshd_config.

> Про sudo. Nura по умолчанию использует doas, но команда sudo обычно тоже доступна. Если её нет, пишите doas вместо sudo — синтаксис тот же.

4. Обновление системы

В отличие от Ubuntu Touch, здесь вся система доступна для записи и обновляется штатно:

☯

Terminal:

⌕

≡

✕
sudo apk update
sudo apk upgrade

Никаких remount,rw, Libertine и нехватки места в корне: системе доступна вся память телефона.

Docker

1. Установка и автозапуск

Если вы добавили docker в дополнительные пакеты при pmbootstrap init, он уже стоит. Иначе:

☯

Terminal:

⌕

≡

✕
sudo apk add docker docker-cli-compose

В Nura службами управляет OpenRC. Включаем Docker при загрузке, запускаем его и даём своему пользователю права на работу с ним:

☯

Terminal:

⌕

≡

✕
sudo rc-update add docker default
sudo rc-service docker start
sudo addgroup $USER docker

После addgroup выйдите из SSH и зайдите снова, чтобы группа применилась.

2. Проверка

☯

Terminal:

⌕

≡

✕
docker info
docker run --rm hello-world
docker run --rm alpine uname -m

Последняя команда должна вывести armv7l: контейнер работает на 32-битном ARM.

3. Если Docker не запускается: проверка ядра

На mainline-ядре Docker работает, но в конкретной сборке ядра могут быть выключены отдельные нужные опции, чаще всего модули сетевого фильтра (netfilter). Проверьте ядро скриптом из проекта Moby:

☯

Terminal:

⌕

≡

✕
wget https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh
sh check-config.sh

Скрипт читает конфигурацию ядра из /proc/config.gz. Всё, что в разделе «Generally Necessary» помечено как missing, нужно включить. Делается это на компьютере, через pmbootstrap:

☯

Terminal:

⌕

≡

✕
pmbootstrap kconfig edit linux-postmarketos-qcom-msm8974
pmbootstrap build --force linux-postmarketos-qcom-msm8974
pmbootstrap sideload linux-postmarketos-qcom-msm8974

kconfig edit открывает меню настройки ядра, build пересобирает его, а sideload ставит собранный пакет на телефон по SSH. Параметры подключения смотрите в pmbootstrap sideload --help. Если конфигурацию на телефоне прочитать не удалось, проверьте её на компьютере: pmbootstrap kconfig check.

4. Образы: только arm/v7

Docker на телефоне скачивает образы для своей архитектуры. Многие официальные образы её поддерживают: alpine, nginx, redis, postgres, python и другие. Но часть проектов сборку для 32-битного ARM уже не выпускает. Перед тем как планировать сервис, откройте образ на Docker Hub и проверьте, есть ли в списке архитектур linux/arm/v7.

Если образа под arm/v7 нет, Docker сообщит no matching manifest for linux/arm/v7. В таком случае ищите альтернативный образ или собирайте свой из Dockerfile прямо на телефоне.

5. Первый сервис через Compose

Создайте папку и файл compose.yaml:

☯

Terminal:

⌕

≡

✕
mkdir -p ~/web && cd ~/web
cat > compose.yaml << 'EOF'
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    restart: unless-stopped
EOF
docker compose up -d

restart: unless-stopped вернёт контейнер после перезагрузки телефона, ведь Docker сам стартует при загрузке.

6. Файрвол

В Nura по умолчанию включён файрвол nftables, который пропускает входящие подключения только к нужным системе службам, например SSH. Если curl localhost:8080 на телефоне работает, а с компьютера страница не открывается, откройте порт:

☯

Terminal:

⌕

≡

✕
sudo nft list ruleset | less

Найдите имя таблицы и цепочки для входящего трафика (обычно inet filter и input) и добавьте правило в отдельный файл:

☯

Terminal:

⌕

≡

✕
echo 'add rule inet filter input tcp dport 8080 accept comment "docker web"' | sudo tee /etc/nftables.d/60_docker-ports.nft
sudo rc-service nftables restart
sudo rc-service docker restart

Docker перезапускается вслед за файрволом, потому что при перезапуске nftables его собственные правила сбрасываются.

Эксплуатация, проблемы и итог

Как жить с сервером на телефоне

  • Память. 2–3 ГБ хватит на несколько лёгких контейнеров: веб-сервер, бот, небольшая база, мониторинг. Следите за free -h и docker stats, тяжёлым сервисам ставьте лимит mem_limit в compose-файле.
  • Место. Данные Docker лежат в /var/lib/docker на разделе userdata, это почти вся память телефона. Периодически чистите неиспользуемые образы: docker system prune.
  • Экран. Подсветка на mainline-ядре до конца не гаснет, но в ядро включён патч, который её выключает. Для сервера без экрана: echo 0 | sudo tee /sys/class/backlight/lcd-backlight/brightness.
  • Встроенная память. Один из владельцев на вики пишет, что после нескольких дней работы сервера файловая система у него уходила в режим только для чтения. Телефону 10 лет, его флеш-память изношена. Делайте резервные копии важных томов Docker на другую машину и иногда проверяйте dmesg на ошибки mmc.
  • Аккумулятор. При круглосуточной зарядке литий-ионный аккумулятор со временем вздувается. Держите телефон без чехла, на открытом месте, и периодически осматривайте корпус.
  • Обновления. Канал edge — ветка разработки. Перед apk upgrade убедитесь, что под рукой есть USB-кабель: если после обновления пропадёт Wi-Fi, сервер останется доступен по USB-сети.

Частые проблемы

ПроблемаЧто сделать
pmbootstrap: command not foundДобавить ~/.local/bin в PATH
Ошибка про binfmt_misc при сборкеsudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
FAILED (remote: Unknown chunk type) при прошивкеПрошить через lk2nd (раздел «Прошивка телефона»)
Система быстро упёрлась в нехватку местаПрошили без --partition userdata: fastboot format system и перепрошить
Экран тёмный после загрузкиПроверить SSH по адресу 172.16.42.1: система могла загрузиться без вывода на экран
wlan0 есть, но сети не видныПроверить прошивку и MAC-адрес; при 00:00:00:00:00:00 задать свой
Wi-Fi периодически отваливаетсяsudo rc-service networkmanager restart, держать USB-кабель как запасной канал
Нет wlan0Работать по USB-сети
Docker не стартуетcheck-config.sh, включить недостающие опции ядра
no matching manifest for linux/arm/v7Образа под 32-битный ARM нет: искать другой или собрать свой
Порт контейнера не открывается снаружиДобавить правило nftables, перезапустить nftables и Docker
Файловая система ушла в режим только для чтенияПроверить dmesg на ошибки mmc, восстановить данные из резервной копии

Как вернуться на Ubuntu Touch

Переведите телефон в fastboot (Громкость вверх + Питание) и запустите UBports Installer, как в первой статье. Он сам перепрошьёт recovery и систему. Если прошивали lk2nd, установщик перезапишет и его, потому что lk2nd лежит в разделе boot.

Итог

OnePlus One 2014 года получает основное ядро Linux, обновляемую систему на базе Alpine и Docker с Compose. Это не замена мини-ПК, но для домашних сервисов, ботов, мониторинга и экспериментов с контейнерами его хватает. Главные условия — образы под linux/arm/v7 и разумные ожидания по памяти.

Источники

Копирование материалов разрешается только с указанием автора Roman Sakhno и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.