Рабочий компьютер «мини» из ТВ-приставки

Продолжая тему «что можно сделать из обычной ТВ-приставки» — можно сделать, например, очень экономичный и компактный десктоп.
В обычной жизни такое может быть никогда и не понадобится, но всякое в жизни бывает…

Питание такого компьютера — всего 5в, его можно подключить к аккумулятору через обычную USB-автозарядку, в сочетании с 12-вольтовым монитором получится этакий «компьютер для автономщика», если конечно вы дружите с Линуксом.

В общем, идея была собрать максимально недорогой и компактный десктоп, с возможностью питания от аккумулятора.
За основу взят TV-box на Андроиде, под названием Z8 — внутри него 64-битный ARM процессор, 4 Гб ОЗУ и 32 Гб «диск». Цена этого девайса на тот момент была в районе 1300 рублей.

12b914670c668597d51bab215465aa5d.png

К нему подошла прошивка Armbian-unofficial_24.5.0-trunk_Transpeed-8k618-t_bookworm_edge_6.7.12_xfce_desktop.img, это основанная на Дебиане ОС, в данном случае с поддержкой Xfce.
Я сейчас специально не уточняю где именно ее можно скачать, потому что китайские ТВ-приставки известны своей непредсказуемостью, и то, что подошло у меня — может не подойти у кого-то другого, тут нужно только понимать направление поисков, а искать все равно придется самому.

Для других моделей, например X88mini13 — соотвественнно, нужна будет другая прошивка, например со словами «Hinlink-h28k» в названии -, но принцип все тот же, внутри АРМ 64-битный с 4 Гб ОЗУ.

Компьютеру нужна клавиатура и мышь. Как оказалось, удобно использовать беспроводную.
У меня когда-то был старый комплект, Genius, с коробочкой-ресивером на проводе, где клавиатура постоянно отваливалась, не хотела работать дальше метра от ресивера, терялись нажатия и т.д., в общем, всё плохо.
Но сейчас появились новые модели, где ресивер — небольшая «заглушка» в USB-порт, дальность до 10 метров, все стабильно и хорошо.
Есть полноразмерные, но поскольку цель «максимально недорого и компактно» — взял вот такую (пульт для сравнения размеров):

3f296e4e8b0fcc6f339c1d3867495eb0.png

Стоимость этой клавиатуры менее 400 р. Работает прекрасно, имеет подсветку кнопок, тачпад, без которого мне уже сложно представить комфортную работу, USB-зарядку.
Хотя, конечно , мелкая -, но так и было задумано.

Остается монитор. Вот тут, к сожалению, у меня ничего подходящего, кроме телевизора, не нашлось. Разрешение экрана 1920×1080, FullHD, вход HDMI.
Пожалуй, в заданной концепции монитор — самая дорогая и самая энергоёмкая деталь, 12-вольтовые модели есть, но их надо будет еще купить.

Ок, устанавливаем прошивку, точнее даже — создаем LiveSD, записывать на внутреннюю память необязательно, флеш-карты на 64Гб сейчас недороги.
И вот на экране — графическая оболочка, Xfce, браузер, можно установить Gimp, Office — в общем всё работает, весь привычный софт. Можно смотреть фильмы — звук идет через HDMI на телевизор, именно поэтому ТВ удобнее. Даже в игры через DOSBOX играть можно.
В целом цель почти достигнута (осталось найти монитор с динамиками или мини-ТВ с хорошим экраном).

А вот дальше — некоторые особенности настройки Xwindow:

Дело в том, что по умолчанию размер экрана, на который настроены там Иксы — 1024×768.
Точнее даже так, они НЕ настроены, этот режим у них идет по умолчанию. А телевизор, как я уже говорил, 1920×1080.
Причем телевизор с претензией на «умность», поэтому пытается адаптироваться, подстраивая свое разрешение, но не всегда — слетает при переключении источников ввода.
По этой причине картинка в разное время то занимает весь экран, то уменьшается и располагается по центру, ну и вообще маловато как-то 1024×768.

Есть как минимум два способа настроить большее разрешение:

Можно использовать команду xrandr.
Если запустить ее без аргументов — она выведет на экран список доступных режимов, можно выбрать нужный, например так:

xrandr -s "1024х768"

Но нам нужен 1920×1080, а его нет. Добавляем, для этого надо доустановить еще одну программу:

apt install xcvt

cvt 1920 1080
Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync

Мы получили строку Modeline, в данном случае »1920×1080_60.00» это название режима, а остальное — описание параметров. Название можно сократить до »1920×1080» для удобства.
Теперь нужно посмотреть, какие устройства вывода есть:

xrandr --listmonitors
0: +HDMI-1 1920/508x1080/286+0+0 HDMI-1

Есть монитор HDMI-1. Запомним, и добавим режим:

xrandr --newmode "1920x1080" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
xrandr --addmode HDMI-1 "1920x1080"
xrandr -s 1920x1080

Создали новый режим, добавили его к монитору HDMI-1 и переключились на него. Всё хорошо, теперь эти команды можно куда-нибудь записать, чтобы они выполнялись при запуске Xwindow.
Например, есть такой каталог /etc/X11/Xsession.d, в нем лежат скрипты, которые выполняются при запуске X-сессии. Если создать там свой скрипт с этими тремя командами — после логина в систему они будут выполняться, создавая нужный режим и переключаясь в него.

Но это не совсем правильно, потому что, во-первых, они будут выполняться при каждом входе в систему, каждый раз создавая режим заново даже если он только что был создан, а во-вторых потому, что есть еще «графический логин», процесс который стартует раньше и выводит окно запроса пароля, display manager — он ничего не знает о новом режиме, и вот тогда-то и будет показывать то на весь экран, то в центре прямоугольником.

В данном случае display manager — lightdm. Это можно увидеть, посмотрев скрипты запуска в /etc/init.d/
Он сам запускает Xorg, который еще ничего не знает про новые режимы и по прежнему работает «по умолчанию».
Поэтому правильный вариант — использование xorg.conf

Файлы конфигураций xorg.conf содержат секции, описывающие устройства ввода-вывода, с которыми работает X-сервер, обычно они лежат где-то в /etc/X11/ или /usr/share/X11/, в данном же случае есть специальные каталоги /etc/X11/xorg.conf.d/, в которых лежат отдельные файлы конфигурации -, но нужного нам там нет, и его надо создать.

Для начала нужно зайти по сети, чтобы спокойно работать, независимо от работы X-сервера.
Затем убить процесс display manager:

/etc/init.d/lightdm stop

При этом выключится X-сервер, на экране будет пустота, а мы будем создавать конфигурационный файл.
Для начала можно попробовать команду:

X -configure :0

В идеале она должна создать в текущем каталоге файл-заготовку, которую затем можно скопировать в /etc/X11/xorg.conf.d/, но в нашем случае оно ругается на ошибку:

List of video drivers:
modesetting
fbdev
No devices to configure. Configuration failed

Это не плохо. Мы получили названия двух имеющихся видеодрайверов, и можем создать конфигурацию вручную:

Section "Device"
        Identifier "dev1"
        Driver "modesetting"
        #Driver "fbdev"
EndSection

Section "Monitor"
        Identifier    "mon1"
        Modeline "1920x1080" 173.00 1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
        #Modeline "1024x768" 60.80  1024 1056 1128 1272   768  768  770  796
        #Modeline "800x600" 38.21 800 832 976 1008 600 612 618 631
        #Modeline "640x480" 24.11 640 672 760 792 480 490 495 50
EndSection

Section "Screen"
        Identifier    "Default Screen"
        Monitor        "mon1"
        Device        "dev1"
        DefaultDepth    24
        Subsection "Display"
                Depth       24
                Modes       "1920x1080" 
                #Modes       "1024x768" "800x600" "640x480"
        EndSubsection
EndSection

Что здесь происходит:
Создаются три секции:

Device — описание видеовыхода, в данном случае два возможных варианта драйверов, один из них закомментирован, и идентификатор.

Monitor — описание монитора. Это именно монитор, с указанием режимов работы которые он поддерживает. Исторически, для CRT-мониторов тут можно было выставлять настройки синхронизации развертки, точно настраивать позицию на экране и прочее — сейчас нам это все не нужно, просто вставляем строку Modeline, полученную ранее (остальные чисто для примера, закомментированы)

Screen — экран, тут указывается, с какой видеокартой и каким монитором он работает, глубина цветности, доступные режимы и т.д.
Нам нужен единственный выдеовыход, единственный монитор и один режим.

Теперь этот файл нужно сохранить в /etc/X11/xorg.conf.d/, и можно проверять.
От рута запускаем:

X :0

Программа запускается, не вылетает, ошибок не пишет, но на экране пустота — так и должно быть.
Вот теперь можно запустить обратно display manager — он должен работать уже в режиме 1920×1080.
Можно перезагружаться — всё должно работать.

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

xrandr

Эта команда должна вывести список доступных режимов, и среди них »1920×1080», отмеченный как текущий.
Кстати, если попробовать выбрать другой драйвер, fbdev — будет доступен единственный режим »1024×768», то есть тот драйвер здесь не подходит.

Ах да, остался русский язык ввода. Это просто — нужно выполнить под юзером команду:

setxkbmap -layout us,ru -option grp:caps_toggle

Теперь Caps_lock переключает клавиатуру Рус/Лат.
А обычное поведение Caps_lock, фиксация БОЛЬШИХ БУКВ — Shift+Caps_lock

Ну, или кто предпочитает другие сочетания — alt_shift_toggle, ctrl_shift_toggle…
Поместить эту команду можно хоть в ~/.profile, хоть в /etc/X11/Xsession.d/xxx
Работает независимо от используемого DE.

Но зачем? Есть же ноутбук!

Конечно есть. Причем работающий от тех же 12 вольт, которые, предположительно, есть от аккумулятора, и с тем же Линуксом.

Просто потому что так — тоже можно. Для чего-то же десктопы используют до сих пор…

© Habrahabr.ru