TL;DR: Расскажу про свой опыт перепрошивки телефона и превращения его в маленький домашний сервер. Спойлер: оказалось гораздо проще, чем я сам ожидал.
Для начала представлюсь – я Деревянкин Павел, менеджер продукта электронных визиток MyQRcards, в прошлом мобильный разработчик в этом же продукте.
В последнее время (в эпоху повального увлечения нейросетями) я столкнулся с тем, что API, которые я размещаю для всяких домашних экспериментов и микропроектов, уже не помещаются на крохотном арендованном облаке. Кроме того, пришло письмо о повышении арендной платы. Посмотрев на всё это, я решил, что пора обзавестись домашним сервером, который я уже давно хотел, и перенести на него то, что не требует вечного доступа из внешнего интернета.
Можно было для этой цели взять какой-нибудь из старых ноутбуков, что пылятся у меня за спиной, или купить Raspberry Pi, но я решил, что это будет слишком скучно, потому что, честно говоря, затеял всё это для развлечения, а не для гонки за реальным результатом, этого мне и на работе хватает. Я было полез на всем известный сайт в поисках б/у дешёвого Mac на M1 или чём повкуснее. Искал как сами miniPC, так и ноутбуки со сломанными дисплеями. Но, покопавшись в объявлениях с полчаса, понял, что это не такое дешёвое удовольствие, как хотелось бы. Да и что там будет веселее, кроме повышенной мощности?
И вот в этот момент я подумал: ну я же вырос из мобильной разработки, а M1 – это сильно ушедший вперёд мобильный процессор (не бейте ногами, я сильно упрощаю, да).
Почему бы не поискать возможность накатить сервак на телефон?
Главный минус ПК / ноутбука для меня был в том, что он довольно громоздкий, а зачастую ещё и шумный. Часть miniPC не имеют подобных проблем, но всё равно стоят дороже побитых бэушных смартфонов. Поэтому я решил изучить вопрос, а возможен ли вариант с телефоном.
Небольшой ресёрч привёл меня к проекту Mobian. Думаю, из названия более-менее понятно, что это за зверь. Debian для мобильных устройств, поддерживаемый энтузиастами. В вики проекта я нашёл, что среди аж двух (!) поддерживаемых Android-устройств притаился OnePlus 6. Как гордый и счастливый пользователь OnePlus 8, я решил, что это моя остановочка. Важной причиной, по которой я выбрал этот телефон на самом деле, – он имеет версию с 8 Гб оперативной памяти и накопителем на 128 Гб, при этом под капотом не самый плохой Snapdragon 845, который, хоть и устарел, но имеет 8 ядер и был довольно крут для 2017 года (ох, уже почти десять лет назад).
Телефон на руках, и вот тут-то и начинается моё приключение.
Свой путь я решил опять же начать с известного всем сайта объявлений, где начал искать подходящий девайс. Мне важно было, чтобы он работал и был по низу рынка, а его состояние / батарея / экран меня волновали мало. Да, подобных аппаратов оказалось очень мало: то ли уже слишком много времени прошло и все умерли, то ли всё уже разобрали другие энтузиасты. Но всё-таки я нашёл десяток устройств с 8 Гб оперативной памяти в разном состоянии. Среди них был даже один вариант в заводской упаковке и с полным комплектом дороже, чем за 20 тысяч, но я, естественно, выбрал самый дешёвый рабочий телефон с разбитыми экраном и задней крышкой за 3500. Споткнувшись об отмену первой доставки и доплатив ещё 500 за отправку “СДЭКом”, через неделю я наконец-то дотянулся до своего сокровища. Мне не терпелось начать ковыряться в этом молодце и окунуться в пучину мобильного серверного безумия.
Тот самый страдалец, над которым я решил поставить опыт.
К слову, я никогда до этого не углублялся в работу с Linux. Большую часть жизни я провёл в винде и бед не знал, а всё знакомство было через редкие ноутбуки без винды, куда я её поскорее накатывал, или, собственно, через облачные сервера. Я понимал, что выбранный путь вряд ли будет прост, но останавливаться не хотел. Почему-то у меня было радостное предвкушение предстоящих приключений, масштаб которых мне только предстояло узнать.
Сразу прошу прощения, что по ходу повествования не будет большого количества фото или скринов, так как не подумал об этом заранее. Но всё же постараюсь подробно описать весь процесс накатывания прошивки и подключения.
Подготовка к установке Mobian
Небольшой дисклеймер: я делюсь своим опытом, и ваш, наверное, может отличаться от моего. Ну и важно понимать, что эти действия сотрут все данные с вашего телефона, а если что-то пойдёт не так на любом этапе, то вполне возможно окирпичивание телефона, которое потребует дополнительных «увеселительных» действий. Советую всё же следовать инструкции разработчиков Mobian, а эту статью воспринимать как сопутствующий материал.
Первое, что я сделал, – проверил, что на телефоне стоит последняя версия заводской ОС, потому что Mobian использует обращения к вендерному софту (драйвера и прочее) и, что не менее важно, стандартный bootloader, из которого происходит запуск системы.
Следующий шаг – нужно было разблокировать тот самый bootloader и fastboot OEM unlock, чтобы иметь возможность накатить на телефон стороннее железо. Инструкция для этого была не на сайте Mobian, а на сайте проекта postmarketOS. Чтобы получить доступ к загрузчику, сначала следует разблокировать режим разработчика, для чего достаточно найти номер сборки прошивки в настройках и кликнуть на неё несколько раз. Дальше нужно пойти уже в настройки «для разработчиков» и включить режим «Заводская разблокировка» (или «OEM-разблокировка» / «Enable OEM unlocking» – я смотрел название пункта в своём OnePlus 8, и оно может отличаться от того, что в последней версии OnePlus 6), чтобы разблокировать загрузчик.
После этого я сразу выключил телефон, отключил его от USB и зажал кнопку выключения и кнопку увеличения громкости звука, как говорила инструкция, чтобы попасть в flash mode и разблокировать fastboot.
Если всё сделать правильно, то при зажатых кнопке выключения и увеличения громкости через некоторое время появится надпись «fastboot», а ещё через пару секунд различные разноцветные режимы, которые у меня бесконечно сменялись, из-за неотпущенной кнопки громкости и информацию об устройстве, качелькой громкости нужно выставить режим START (зелёного цвета) и ничего не трогать.
Наконец, можно подключить телефон к компьютеру, чтобы подготовить тот самый fastboot, который и позволит накатить прошивку. Для этого нужно установить на компьютер Android SDK Platform-Tools (это если на Windows / Mac, а на Linux – пакет android-tools). После чего открываем консоль / терминал и пишем команду
fastboot oem unlock
Если вы всё сделали правильно, на экране телефона появится запрос подтверждения. Нужно подтвердить включение fastboot, и устройство сбросится до заводского состояния, но произойдёт OEM unlock, который позволит накатывать сторонние прошивки. Снова выключаем телефон, отключаем USB-кабель, переходим в режим fastboot (снова зажимая увеличение громкости и кнопку выключения), выбираем режим start (не нажимая ничего). Подключаем телефон через USB-кабель. Пора начинать прошивку.
Установка Mobian
Тут уже все действия выполняются через командную строку / терминал.
Нам нужно выполнить следующую последовательность команд:
fastboot --set-active=a – для начала необходимо выбрать, на каком слоте (A или B) установить прошивку. Если вы не знаете, на каком, советую выбрать слот A и не думать об этом. Как я понял, почти всегда прошивки ставятся на слот A.
fastboot flash boot mobian-<processor>-phosh-YYYYMMDD.boot-<model>.img – эта команда прошивает boot-раздел телефона, по сути подменяя ядро Android на ядро Mobian. Для каждого устройства идёт свой образ. Образ, который используется в моей команде выше, следует выгрузить из скачанного архива mobian-sdm845-phosh-13.0.tar.xz, внутри которого на самом деле больше, чем один образ. Для OnePlus 6 требуется именно образ enchilada.
fastboot erase userdata - Полностью очищает раздел пользовательских данных, чтобы данные Андроид не ломали поведение Mobian.
fastboot -S 100M flash userdata mobian-<processor>-phosh-YYYYMMDD.rootfs.img – записывает root filesystem (rootfs) в userdata. rootfs.img – это вся система Mobian (аналог / в Linux). -S 100M — разбивает передачу на куски по 100 Mб (нужно из-за ограничений fastboot).
fastboot erase dtbo – удаляет раздел DTBO (Device Tree Blob Overlay), так как DTBO от Android может конфликтовать с Linux.
fastboot reboot – собственно, перезагрузка устройства. Если все предыдущие шаги были сделаны правильно, то устройство при перезагрузке попытается загрузиться из выбранного слота с новым boot и новым rootfs, что в свою очередь, должно позволить запуститься Mobian.
Первый запуск может занять много времени, потому что под капотом будет происходить подготовка файловой системы. Но вот телефон включается и просит пароль. После установки на устройстве появляется пользователь mobian с паролем 1234. Очевидно, это небезопасно, и нужно подготовить Mobian к реальному использованию.
Ну а пока можно полюбоваться главным экраном устройства.
После загрузки Mobian следующий этап заключался в том, чтобы получить устойчивый удалённый доступ к системе по SSH и не набирать команды вручную на телефоне.
Для начала надо подключить телефон к сети. Пробуем смахнуть сверху вниз, открывается быстрое меню, но Wi-Fi там нет, идём в настройки (Settings) и обнаруживаем, что и там нет такого пункта. Что ж. Открываем консоль (Console) на устройстве и вводим серию команд:
sudo rfkill unblock all
nmcli radio wifi on
nmcli dev wifi list
sudo systemctl restart NetworkManager
После этих действий у меня в меню настроек появился пункт Wi-Fi, и подключиться к нему не составило труда.
Чтобы не мучиться с тем, что каждую минуту телефон уходит в сон, можно сходить в Settings – Power – снизу вкладка Power Saving. Здесь можно настроить Automatic Suspend. Я его просто выключил в режиме работы от сети.
Теперь нам нужно как-то с компьютера подключиться к телефону и настроить SSH. Запрашиваем через консоль на телефоне:
hostname -I
И в ответ получаем два IP:
- 10.66.0.1 — сетевой интерфейс по USB / альтернативному каналу
- 192.168.0.112 — IP телефона в локальной Wi-Fi сети
Наконец, мы можем перестать писать запросы в консоли на телефоне (как же это было неудобно!). Можно подключиться компьютером через SSH, используя ip в локальной сети Wi-Fi и начать настраивать как обычный сервер.
Сначала проверяем обычный вход по рабочему Wi-Fi-адресу телефона:
ssh mobian@192.168.0.112
Если всё в порядке, отключаемся от ssh (или открываем новую консоль на ПК). Подготовим ключи, по которым будем подключаться к устройству:
Проверяем, что старый вход через mobian недоступен:
ssh mobian@192.168.0.112
И, если всё хорошо, можем считать, что базовая настройка уже готова. Доступ к устройству по ssh возможен только через пользователя sshadmin и только по ключу. Пароль выключен. Я не особо разбираюсь в сетевой безопасности, но посчитал, что на этом этапе я базово защитился от внешних угроз. После этого через настройки на устройстве я поменял пароль от основного профиля, чтобы было удобнее заходить в телефон с привычным паролем.
По большей части всё. Устройство подготовлено. Позже я накатил на него docker.io и поместил в него пару своих небольших API для домашних проектов, пересобрав их под arm64-linux, и даже смог настроить CI / CD, который собирает, а затем деплоит эти проекты на телефон. Телефон я подключил к розетке через адаптер на 10 Вт (чтобы не было лишнего нагрева, но питания хватало на всё время использования) и закинул поближе к роутеру. Теперь у меня есть маленький сервер.
Бенчмарки
Говоря про целесообразность этого решения, нельзя не задать вопрос: “А какие мощности оно может дать?”. Этот вопрос я задал Copilot и попросил того провести базовые бенчмарки получившегося сервера. Если кому-то будут интересны дополнительные подробности, спрашивайте в комментариях – может, проведу ещё опыты.
А пока немного голых цифр и интерпретаций от нейросети, так как я, честно скажу, в теме плаваю.
Исходные данные:
Устройство
модель: OnePlus 6;
SoC: Qualcomm Snapdragon 845;
CPU: 8 ядер;
производительные ядра: Kryo 385 Gold до 2.649 ГГц;
энергоэффективные ядра: Kryo 385 Silver до 1.766 ГГц;
доступная системе RAM: 7.4 GiB;
swap: 3.7 GiB через zram.
дистрибутив: Mobian на базе Debian Trixie;
ядро: 6.12-sdm845;
архитектура: aarch64.
Использованные инструменты
- sysbench 1.0.20;
- fio 3.39;
- stress-ng 0.19.02;
Сырые результаты
CPU: sysbench
| Тест | Результат |
| sysbench cpu --threads=1 --time=30 | 2777.18 events/s |
| sysbench cpu --threads=8 --time=30 | 14375.09 events/s |
Дополнительно:
- средняя latency в однопоточном тесте: около 0.36 ms;
- средняя latency в 8-поточном тесте: около 0.56 ms;
- 95-й перцентиль в 8-поточном тесте: около 1.12 ms.
Память: sysbench
| Тест | Результат |
| sysbench memory --threads=8 | 40407.88 MiB/s |
Это примерно 39.46 GiB/s эффективной скорости записи в рамках данного синтетического теста.
Этот тест нельзя напрямую сравнивать с sysbench, но он показывает, что устройство выдержало минутную 8-поточную CPU-нагрузку без сбоев.
Сравнение с прочими решениями для серверов:
Для CPU удобнее всего смотреть на внешний CPU Mark, потому что именно он позволяет свести телефон, Raspberry Pi, серверный x86-хост и мини-PC в одну таблицу.
| Платформа | CPU-референс | CPU Mark | Относительно OnePlus 6 |
- по суммарной CPU-мощности OnePlus 6 заметно сильнее Raspberry Pi 4;
- современный mini-PC на N100 уже быстрее телефона примерно на 44% по агрегированному CPU Mark;
- старый серверный Xeon-хост для выглядит намного сильнее, но маленький VPS получает только долю этого CPU и ещё делит хост с соседями.
По памяти корректнее сравнивать не только объём, но и класс пропускной способности. Для OnePlus 6 у нас есть собственный sysbench memory, для остальных платформ ниже приведён ориентир по типичной памяти и её классу.
| Платформа | Типичный объём RAM | Числовой ориентир по памяти |
| Raspberry Pi 4 | 4-8 GiB | LPDDR4-3200 class, теоретически около 12.8 GiB/s |
| Бюджетный VPS | 2-4 GiB | эффективная bandwidth гостя обычно находится в классе хостовой DDR4, грубо 20-40 GiB/s, но сильно зависит от гипервизора и соседей |
| Мини-PC на N100 | 8-16 GiB | DDR4-3200 / LPDDR5-4800 class, теоретически около 25.6-38.4 GiB/s |
Практический вывод по памяти такой:
- OnePlus 6 не выглядит урезанным по RAM для своей роли;
- против Raspberry Pi 4 телефон обычно имеет и больший объём памяти, и более сильный memory profile;
- против N100 телефон уже не выглядит слабо именно по памяти, там решающим фактором чаще становится не RAM, а диск и общая серверность платформы.
По диску различия ощущаются сильнее всего, поэтому здесь удобнее смотреть на последовательные скорости и random I/O отдельно.
| Платформа | Типичное хранилище | Seq write | Seq read | Random 4K / мелкие записи |
| Raspberry Pi 4 | хорошая microSD UHS-I | 20-50 MiB/s | 40-90 MiB/s | обычно порядка 500-1500 IOPS |
| Бюджетный VPS | SATA SSD class storage | 200-500 MiB/s | 200-550 MiB/s | обычно порядка 5000-20000 IOPS |
| Мини-PC на N100 | локальный NVMe SSD | 1500-3500 MiB/s | 1500-3500 MiB/s | обычно 30000-200000 IOPS |
Из этой таблицы уже видно главное:
против Raspberry Pi 4 на microSD телефон обычно выигрывает по последовательному диску и по общему ощущению от storage;
против обычного SSD-класса VPS телефон уже упирается в random I/O;
против miniPC с NVMe разрыв становится очень большим, особенно для контейнеров, логов и БД.
Короткий итог сравнения
Если свести сравнение к нескольким числам и результатам:
по CPU OnePlus 6 находится выше Raspberry Pi 4, но ниже N100 miniPC;
по RAM OnePlus 6 выглядит нормально и не является главным ограничением;
по диску телефон ещё жизнеспособен для лёгких сервисов, но именно storage сильнее всего отделяет его от VPS на SSD и тем более от miniPC с NVMe.
Заключение
Так стоило ли оно всё того? Для меня – однозначно да. Потому что, потратив четыре часа, получил удовольствие, когда всё заработало, и теперь у меня есть недорогой маленький сервер, с которым я могу делать что хочу. На момент написания этих слов он уже трое суток крутит один маленький API-сервис и не испытывает с этим никаких проблем. Даже во время тестов перегрева не было замечено, максимальная температура была 34 градуса по Цельсию. Думаю, что он может перегреваться, если загрузить его на 100%, но в моём сценарии такая долгосрочная нагрузка не планируется.
Я написал статью, чтобы поделиться с вами своим опытом. Возможно, кому-то ещё это будет интересно. Если есть какие-то вопросы или замечания, пишите, буду рад ответить в комментариях.