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.04 | Nura (mainline) | |
| Ядро | Android 3.4 | Основное ядро Linux |
| Docker | Не запускается | Работает |
| Звонки, SMS, камера | Работают | SMS и данные работают, звонки и камера — нет |
| Пакеты | apt, корень только для чтения | apk, вся система доступна для записи |
| Службы | upstart | OpenRC |
| Назначение | Телефон | Сервер, эксперименты |
> Внимание: установка 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 path | Enter (по умолчанию) | Папка для chroot и кэша, нужно около 10 ГБ |
| Channel | edge | Устройства категории testing надёжнее всего собираются в edge |
| Vendor | oneplus | |
| Device codename | bacon | |
| Kernel (если спросит) | mainline | Только на нём работает Docker |
| Username | своё имя, например user | Пользователь системы |
| User interface | console | Серверу графика не нужна, экономим память |
| Additional packages | docker,docker-cli-compose,nano,htop | Docker сразу попадёт в образ |
| Copy SSH public keys | y | Ваш ключ из ~/.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.
- Скачайте lk2nd для чипсета MSM8974 со страницы релизов lk2nd.
- Выгрузите собранные образы:
pmbootstrap export(pmbootstrap покажет, куда их положил). - Прошейте lk2nd в раздел boot из режима fastboot:
fastboot flash boot lk2nd.img. - Перезагрузите телефон и, как только появится экран lk2nd, зажмите Громкость вниз — откроется меню lk2nd с его собственным fastboot.
- Повторите шаг 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 wlanhwaddr3. Если 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 -drestart: 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 и разумные ожидания по памяти.
Источники
- OnePlus One (oneplus-bacon), вики Nura>)
- Пакет device-oneplus-bacon
- Документация pmbootstrap: установка
- lk2nd на GitHub
- Скрипт проверки ядра check-config.sh
- Скрипт быстрой настройки postmarketOS под Docker (ссылка со страницы устройства)
- Notebookcheck: postmarketOS is now Nura
- Habr: PostmarketOS на OnePlus One как сервер
-
Создано 18.10.2026 18:28:00
-
Roman Sakhno

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