Linux-десктоп своими руками: Make Computers Fast Again
Уже говорил как-то, что в свое время перешел с Windows на FreeBSD в том числе из-за того, что FreeBSD работала быстрее на том же железе, и не требовалось плясок с бубнами, потому что в общем-то всё что нужно — настраивалось от и до.
Потом Linux — потому что лучше поддержка железа, ну и, в общем, никакого желания возвращаться на Windows уже не возникало.
Но время идёт, и вот последние версии Ubuntu до боли напоминают Windows своей неспешностью и сложнопредсказуемостью. А тут еще желание сделать удобный для работы десктоп из TV-бокса…
В принципе, нашлась уже готовая Armbian-сборка под мой TV-бокс, с уже настроенным десктопом XFCE -, но несмотря на то, что XFCE считается «легковесной» — она оказалась недостаточно легковесная, не настолько насколько мне бы хотелось.
Заметно подтормаживали окошки, всё в целом как-то не так…
А ведь несмотря на свою «маленьковость» — компьютер-то должен быть неплохим: 4Гб RAM, 4 ядра по 1.5ГГц, когда-то подобные были вообще за пределами доступности, и ведь тогда «всё работало», и работало быстро, на гораздо более медленном железе.
Что же не так, неужели ARM в принципе тормозные процессоры?
В общем, решил собрать «десктоп» с нуля. Ну, почти.
(всё дальше — за исключением сугубо «железячной» части вполне применимо для любых компьютеров и ноутбуков)
Требования простые:
— большой экран
— минимум занимаемого места
— беспроводное примерно всё, кроме сети
— многооконная среда
— эмулятор терминала (shell, vim, MidnightCommander)
— немного графики (Gimp)
— ардуино-софт
— Офис
— печать на принтер
— браузер
— софт для рисования печатных плат (Fritzing)
— видеоплеер, музыка, наушники — вот это всё
Буду сразу говорить про итоговые варианты — потому что промежуточные не подходили по разным причинам и были отбракованы.
Аппаратная часть:
За основу взят TV-бокс Z8, на базе процесора H618. Для сравнения — аналогичная процедура делалась на других устройства, на H616 и rk3528: забегая вперед, наилучшие результаты по графике показал именно H618, чуть хуже H616, а вот rk3528 отрисовывал графику хуже всего. Это при том, что с точки зрения «машинки для расчётов» именно rk3528 работает быстрее всех. То есть, он хорош для сервера, но не для десктопа.
Экран — 22» телевизор с разрешением экрана 1920×1080. Почему именно телевизор — потому что он умеет воспроизводить звук по HDMI. За последние годы сильно отвык от того, что пиксели можно увидеть глазом, и как только раньше работали за такими мониторами?
Проблему места на столе удалось решить с помощью поворотного кронштейна для монитора — из тех, что крепятся на край стола, и позволяют крутить экран как угодно, при этом сам стол свободен, на нём ничего не громоздится.
Надо же, раньше такого не было.
Беспроводная полноразмерная клавиатура с тачпадом легко убирается в сторону, не загораживая пространство.
На удивление, батареек хватает надолго.
USB-порт на боксе заработал только один — можно было конечно поковыряться в DTB и попробовать включить второй -, но было лень, оказалось проще взять плоский USB-хаб, и прилепить его, и «системный блок», к самому монитору.
Получился аккуратный «моноблок».
Встроенного WiFi и Bluetooth в этой модели нет, но сейчас есть масса разнообразных USB-донглов, которые легко решают эту проблему.
Система:
За основу взята сборка Armbian-unofficial_24.5.0-trunk_Transpeed-8k618-t_bookworm_edge_6.7.12.img.xz. По умолчанию сразу после установки она занимает всего около 2Гб места (как корректно назвать то, что не RAM, не ROM, но и не диск?).
Строка ввода логина-пароля, текстовый режим, хорошо для сервера, но мне нужен десктоп для работы за ним. При этом задача в том, чтобы максимально избегать любых «десктопных сред», прежде всего из-за интегрированности: когда работа одной программы зависит от работы другой, и замена одной из них может приводить к сложнопредсказуемым последствиям.
Ну и конечно по причине того, что современные DE тащат за собой кучу разнообразного хлама, из которого нужны бывают одна-две программы. А место на «диске» emmc — не резиновое.
Однако, отказ от «единой интегрированной системы» может приводить к интересным глюкам, поэтому сразу отключаем всё лишнее. Например, пришлось полностью отключить systemd.
В Debian это делается примерно так: Очищаем кеш пакетов:
apt clean
Скачиваем нужные для перевода системы в SystemV mode
apt --download-only install sysvinit-core isc-dhcp-client
Переходим в single-user mode:
systemctl rescue
Устанавливаем скачанное:
apt install /var/cache/apt/archives/*.deb
И перезагружаемся. В результате получаем старый добрый SystemV режим с runlevels, и скриптами запуска-останова сервисов.
Почему старый добрый?
Дело в том, что запуск разных демонов и скриптов становится более предсказуемым и прозрачным: есть определенный список скриптов, которые запускаются в определенной последовательности — причем именно вы определяете, что и когда запускать, или не запускать, и находятся они в одном месте — /etc/init.d, откуда уже идут симлинки для запуска-останова для различных runlevels: /etc/rcX.d
То, чего там нет — не будет запускаться, а если не запустилось то, что там есть — всегда можно посмотреть почему.
Заодно и логи нормальные, вместо единой логопомойки с фильтрами — всё по своим местам.
(хотя есть любители и обратного…)
Однако теперь, например, для запуска работы сети нужно чуть-чуть приложить руки и написать
/etc/network/interfaces:
...
auto end0
iface end0 inet dhcp
...
или добавить в /etc/rc.local команду типа
dhclient end0
В общем, самому принять какое-то решение и указать компьютеру, что именно он должен сделать.
Это может показаться более сложным -, но зато он не будет заниматься самодеятельностью когда не надо.
Установка Иксов (X-window)
От графической системы мне требуется только показывать окошки и запускать программы, поэтому достаточно будет простейшего оконного менеджера. Если на пальцах: X-сервер рисует что-то на экране, программы рисуют в своих окошках, а окнами управляет оконный менеджер: создает, двигает и закрывает. Больше ничего особенного он не делает, а потому и практически не тормозит.
В качестве такого оконного менеджера неплохо себя показал WindowMaker — минималистичный оконный менеджер, с встроенным меню, настраиваемыми хоткеями и возможностью запуска любой программы по имени.
Разумеется, есть и еще более минималистичные, вообще в этом плане у Иксов очень неплохое поле для экспериментов.
Но для нормальной работы нужен еще эмулятор терминала:
фактически стандарт — xterm, но забегая вперед — лучшим оказался терминал sakura, который его прекрасно замещает.
По умолчанию ни того, ни другого нет, поэтому устанавливаю sakura.
Для запуска Иксов из командной строки нужен пакет xinit, включающий в себя скрипты запуска.
И конечно, нужен сам X-сервер со всеми своими стандартными модулями. Поэтому устанавливается это всё вместе так:
apt install xserver-xorg xinit wmaker sakura
Проверяем работу X-сервера, запуская из-под рута:
X:0
должен показать черный экран, это значит всё успешно заработало. Заходим в другую консоль (Ctrl-Alt-Fx или по ssh) и прибиваем процесс Xorg.
Либо не заработает, и напишет, что ошибки можно посмотреть в логе типа /tmp/.X0/log — тогда надо смотреть что ему не понравилось…
Теперь заходим обычным юзером, создаем в своем каталоге файл .xinitrc с единственной строкой:
wmaker
И пробуем запустить:
startx
Должен запуститься WindowMaker.
Вызов меню — F12, в меню есть пункт Run — нажимаем, пишем sakura, и открывается терминал.
В меню «по умолчанию» скорее всего терминалом будет указан xterm, но мы его не ставили, поэтому пока вот так, теперь надо всё настраивать.

Вид «по умолчанию», конечно, так себе -, но это настраивается, чуть позже.
В левом верхнем (обычно) углу экрана — иконка программы настройки. Программа реально древняя, поэтому к интерфейсу есть много вопросов -, но пользоваться им придется примерно один раз. Несмотря на древность — всё работает. По сути нужно только меню для запуска основных программ и настройки хоткеев.
Поддерживается много «экранов», подобие тайлинга (размещение двух окон рядом вертикально или горизонтально), максимизация-минимизация и так далее.
Остается настроить фон, цвет и вид меню, шрифты поприятнее — и в общем-то всё. Свои задачи управления окнами он выполняет, и выполняет хорошо, а большего от него и не требуется. Всё нужное — настраивается отдельно.
Настройки WindowMaker — в каталоге ~/GNUstep/Defaults, файл WindowMaker и WMRootMenu.
Простые текстовые файлы, которые можно править вручную, например для массовой замены шрифтов или корректировки списка программ.
Некоторые вещи так делать просто проще, чем тыкать в иконки «программы настройки».
{
FTitleColor = "#ffffff";
FrameBorderColor = "#b6b6b3";
LTCMaximizeKey = None;
CycleIgnoreMinimized = NO;
MenuDisabledColor = gray60;
LastWorkspaceKey = None;
MoveToWorkspace9Key = None;
IconTitleBack = "#4c6b88";
FTitleBack = (hgradient, "rgb:79/a2/cf", "rgb:20/34/41");
MoveToPrevWorkspaceLayerKey = None;
ClipTitleFont = "LXGW WenKai TC Light:slant=0:weight=50:width=100:pixelsize=12";
MiniwindowPreviewBalloons = YES;
MaximizeKey = F11;
HideKey = "Mod4+H";
MouseForwardButtonAction = None;
MoveToWorkspace7Key = None;
IconTitleFont = "LXGW WenKai TC Light:slant=0:weight=50:width=100:pixelsize=11";
LargeDisplayFont = "LXGW WenKai TC Light,serif:pixelsize=20";
RBCMaximizeKey = None;
IconificationStyle = none;
WindowShortcut10Key = None;
MoveToWorkspace2Key = None;
MouseWheelTiltAction = None;
MenuTitleColor = "#ffffff";
WindowShortcut3Key = None;
ClipAutolowerDelay = "";
MenuTitleFont = "LXGW WenKai TC Light:slant=0:weight=50:width=100:pixelsize=18";
EnableWorkspacePager = YES;
SmoothWorkspaceBack = YES;
WindowRelaunchKey = None;
MoveTo6to12Head = None;
WindowShortcut4Key = None;
NoWindowOverDock = YES;
OmnipresentKey = None;
WorkspaceBack = (tpixmap, ".local/share/pictures/BlueImage.jpeg", black);
SnapEdgeDetect = 1;
LBCMaximizeKey = None;
HighlightTextColor = "#000000";
ClipAutoexpandDelay = "";
WindowShortcut9Key = None;
EnforceIconMargin = NO;
HelpBalloons = NO;
WindowSnapping = NO;
KeepAtBottomKey = None;
MoveResizeKey = None;
KeepOnTopKey = None;
ClipTitleColor = "rgb:79/96/cf";
AppIconBalloons = NO;
MoveHalfMaximizedWindowsBetweenScreens = NO;
MoveTo12to6Head = None;
WorkspaceBorder = None;
FrameFocusedBorderColor = "#b6b6b3";
WindowTitleFont = "LXGW WenKai TC Light:slant=0:weight=80:width=100:pixelsize=18";
MoveToWorkspace8Key = None;
WrapAppiconsInDock = YES;
RunKey = "Mod4+F2";
LHMaximizeKey = "Mod4+Left";
MoveToPrevWorkspaceKey = "Control+Shift+Mod1+Left";
MoveToWorkspace6Key = None;
ResizebarBack = (hgradient, "rgb:49/5d/7e", "rgb:10/20/20");
MiniPreviewSize = 56;
MoveToWorkspace10Key = None;
DisplayFont = "LXGW WenKai TC Light:slant=0:weight=80:width=100:pixelsize=18";
KbdModeLock = YES;
MouseBackwardButtonAction = None;
BHMaximizeKey = "Mod4+Down";
WorkspaceBorderSize = 0;
OpenTransientOnOwnerWorkspace = YES;
CycleActiveHeadOnly = NO;
MenuTitleExtendSpace = 0;
MoveToWorkspace1Key = None;
DockRaiseLowerKey = None;
IgnoreGtkHints = NO;
ShowClipTitle = YES;
WindowShortcut1Key = None;
RHMaximizeKey = "Mod4+Right";
FrameSelectedBorderColor = "#ffffff";
ClipAutocollapseDelay = "";
THMaximizeKey = "Mod4+Up";
AlternativeHalfMaximized = NO;
MiniaturizeKey = "Mod4+M";
WindowShortcut2Key = None;
MoveToNextWorkspaceLayerKey = None;
WorkspaceMapKey = "Control+Mod1+Up";
ToggleKbdModeKey = None;
DragMaximizedWindow = Move;
DoNotMakeAppIconsBounce = NO;
MiniwindowTitleBalloons = NO;
MaximusKey = "Mod1+F11";
WindowShortcut7Key = None;
OpaqueResize = NO;
MenuTextBack = (hgradient, "rgb:49/5d/7e", "rgb:10/20/20");
RaiseAppIconsWhenBouncing = NO;
ResizeIncrement = 0;
DisableAnimations = YES;
WindowShortcut8Key = None;
OpaqueMoveResizeKeyboard = NO;
MoveToLastWorkspaceKey = None;
GroupNextKey = None;
Attraction = NO;
SingleClickLaunch = NO;
MenuTextColor = white;
IconBack = (mdgradient, "rgb:28/44/54", "rgb:38/55/79", "rgb:10/20/20");
AntialiasedText = YES;
DisableBlinking = NO;
MoveToWorkspace5Key = None;
WindowTitleExtendSpace = 0;
NormalCursor = (builtin, left_ptr);
WorkspaceNameDisplayPosition = center;
WindowListKey = "Mod4+F12";
MenuTextFont = "LXGW WenKai TC Light:slant=0:weight=50:width=100:pixelsize=18";
ScreenSwitchKey = None;
MenuTitleBack = (hgradient, "rgb:79/a2/cf", "rgb:20/34/41");
DisableMiniwindows = YES;
SnapCornerDetect = 10;
MoveToNextWorkspaceKey = "Control+Shift+Mod1+Right";
HMaximizeKey = None;
SnapToTopMaximizesFullscreen = NO;
HighlightColor = "#ffe0ac";
GroupPrevKey = None;
PointerWithHalfMaxWindows = NO;
MinimizeAllKey = None;
MoveToWorkspace3Key = None;
DisableDrawers = NO;
CClipTitleColor = "rgb:61/61/61";
WindowShortcut5Key = None;
HideOthersKey = None;
ClipAutoraiseDelay = "";
PTitleBack = (hgradient, "rgb:70/82/af", "rgb:10/20/20");
MenuTextExtendSpace = 0;
WindowShortcut6Key = None;
SaveSessionOnExit = YES;
BounceAppIconsWhenUrgent = NO;
ViKeyMenus = NO;
UTitleColor = gray;
UTitleBack = (hgradient, "rgb:49/5d/7e", "rgb:10/20/20");
HighlightActiveApp = YES;
CirculateRaise = YES;
PTitleColor = "#ffffff";
MoveToWorkspace4Key = None;
RTCMaximizeKey = None;
}
Конечно писать это с нуля глупо, но вот если надо подправить только шрифты или цвета — то почему бы и не поправить в тексте?
Заливку фонов можно задавать сплошным цветом, двух- и трех-точечными градиентами, сами цвета — как конструкцией «rgb:70/82/af» так и »#7082af»
Модификаторы кнопок: Control, Shift, Mod1 (Alt), Mod4 (Win, Super).

Шрифты
Иксы поддерживают шрифты ttf. Достаточно скачать их, например, с Google Fonts, и распаковать в каталог .local/share/fonts, затем обновить кеш:
fc-cache -r
Посмотреть список имеющегося:
fc-list
Есть еще настройки сглаживания — по умолчанию сейчас сглаживание включено, но если нет — можно включить вручную:
Создать файл .config/fontconfig/fonts.conf:
true
true
hintslight
rgb
false
lcddefault
96
В нем включаем в явном виде антиалиасинг, отключаем автохинтинг (он может работать плохо на некоторых шрифтах), и включаем хинтинг для тех шрифтов которые это умеют.
Параметр DPI тут влияет на расчет размеров отрисовки шрифта, соотношение между «пунктами» и «пикселями» (и размеры элементов интерфейса в некоторых программах).
В настройках одних программ размер указывается просто цифрой, скажем »16» — это в пунктах, а в других — в пикселях,»16 px»
Раскладка клавиатуры
Клавиатура настраивается стандартно, через Xkb. В стартовом скрипте .xinitrc перед запуском wmaker установить раскладки:
setxkbmap -layout us, ru -option grp: caps_toggle, grp_led: caps
Это даёт переключение раскладки клавишей CapsLock, с отображением состояния лампочкой caps
При этом стандартное поведение CapsLock (прописные-строчные) — через Shift-CapsLock.
Возможны и другие кобинации, типа ctrl_alt_toggle, ctrl_shift_toggle и т.д., кто как привык.
Звук
Некоторые приложения умеют работать напрямую через ALSA, для них не требуется ничего особенного.
Проверка:
aplay /usr/share/sounds/alsa/Front_Center.wav
Если звука нет — стоит проверить права:
ls -l /dev/snd drwxr-xr-x 2 root root 60 Mar 10 21:04 by-path crw-rw---- 1 root audio 116, 4 Mar 10 21:04 controlC0 crw-rw---- 1 root audio 116, 3 Mar 10 21:04 pcmC0D0c crw-rw---- 1 root audio 116, 2 Mar 10 21:04 pcmC0D0p crw-rw---- 1 root audio 116, 1 Mar 10 21:04 seq crw-rw---- 1 root audio 116, 33 Mar 10 21:04 timer
То есть пользователь должен быть в группе audio.
Его можно туда добавить разными способами, но можно и напрямую — просто вписать в /etc/group
audio: x:?: username
После перелогина права применятся. Проверка — команда id, в groups должна быть группа audio
Для некоторых приложений, например браузеров, нужен pulseaudio. Установка:
apt install pulseaudio pavucontrol
В .xinitrс внести изменения:
...
pulseaudio --start
wmaker
pulseaudio --kill
...
Заходим в графику startx, запускаем терминал, проверяем:
paplay /usr/share/sounds/alsa/Front_Center.wav
Можно еще отключить гашение экрана, если оно не нужно. В тот же самый .xinitrc перед запуском wmaker добавить:
xset s off -dpms
В общем, можно сказать что первоначальная настройка завершена, остается установить программы и настроить меню. Но уже видно, что всё работает достаточно быстро.
Несколько утилит: — блокировка экрана — xsecurelock — скриншоты — maim — часы — wmclock — забавный индикатор загрузки процессора — wmfire
Wayland
Иксы хороши тем что работают практически на любом железе. Но сейчас в моде Wayland — что ж, он тоже здесь работает.
Если не вдаваться в подробности — тут логика такая: используется «композитор», совмещающий функции «графического сервера» и «оконного менеджера», поэтому задача сводится к запуску этого самого «композитора».
В отичии от Иксов — тут вариантов не так много: образцово-показательный Weston, тайловый Sway, Compiz-подобный Wayfire, однозадачный Kiosk и всё те же монстры Gnome/KDE.
Вроде есть что-то еще -, но там всё экспериментально-самосборное.
Для поддержки чисто X-приложений — нужен еще Xwayland, которые работает внутри Wayland-композитора.
Монстров мы избегаем, тайловые менеджеры — на любителей, у Weston был какой-то глюк с x-приложениями — так что ставим Wayfire.
По факту, если кто помнит Compiz — вот почти то же самое, только быстрее.
И еще один нюанс: Wayfire требует для работы «управление сессиями», которым обычно занимается logind, который завязан на работу systemd.
Тут его нет, поэтому нужен еще seatd — легковесная замена logind.
Поэтому установка будет выглядеть так:
apt install wayfire seatd xwayland
Для работы wayland-систем нужно определить переменную XDG_RUNTIME_DIR, указывающую на католог с данными сессии пользователя.
Поскольку не используется logind, который бы ее создавал — создадим вручную, записав всё это в скрипт startw (по аналогии с startx):
#!/bin/sh
myid=$(id -u)
dir="user${myid}"
mkdir -p /tmp/${dir}
XDG_RUNTIME_DIR=/tmp/${dir} ; export XDG_RUNTIME_DIR
export XDG_SCREENSHOTS_DIR=Pictures/Screenshots
pulseaudio --start
wayfire :0
pulseaudio --kill
Здесь создается нужный каталог, а также по аналогии с .xinitrc запускается pulseaudio
(на самом деле такой скрипт — это скорее хорошо, т.к. ПОТОМ нам понадобится установка некоторых переменных, например таких как XDG_SCREENSHOTS_DIR для grimshot — это удобно делать как раз здесь)
Еще нюанс: нужно проверить каталог /dev/dri
ls -l /dev/dri total 0 drwxr-xr-x 2 root root 100 Mar 19 09:04 by-path crw-rw---- 1 root video 226, 0 Mar 19 09:04 card0 crw-rw---- 1 root video 226, 1 Mar 18 23:17 card1 crw-rw---- 1 root render 226, 128 Mar 18 23:17 renderD128
Пользователь, под которым работаем, должен состоять в группах video и render.
Делается по аналогии с /dev/snd
Вот теперь можно запускать, если всё ОК — получим «черный экран».
Выход — Ctrl-Alt-BS
Просто по умолчанию там предполагается запуск программ, которые еще не установлены — поэтому на экране ничего нет.
Настроечный файл — .config/wayfire.conf, и его нужно создать:
[input]
# поддержка языка - как и в Иксах
xkb_layout = us,ru
xkb_options = grp:caps_toggle,grp_led:caps
[output:HDMI-A-1]
# разрешение экрана и отключение энергосбережения
# энергосбережение сбивает расположение окон
mode = 1920x1080@60
position = 0,0
transform = normal
scale = 1
dpms = off
[core]
xwayland = true
no_dynamic_outputs = true
[command]
# запуск терминала Win + T, как в WindowMaker
binding_terminal = KEY_T
command_terminal = sakura
# по умолчанию запускается alacritty, но
# в Иксах с ним могут быть проблемы - не ставили
# запуск программ через wofi
binding_launcher = KEY_F2
command_launcher = wofi
# Screen locker
binding_lock = KEY_L
command_lock = swaylock -f -c 002020
# это команды которые не делают ничего.
# блокировка ненужных реакций на скролл
binding_sc1 = SCROLL_UP
command_sc1 = true
binding_sc2 = SCROLL_DOWN
command_sc2 = true
binding_sc3 = SCROLL_RIGHT
command_sc3 = true
binding_sc4 = SCROLL_LEFT
command_sc4 = true
# Screenshots
# SYSRQ - это кнопка PrintScreen
binding_screenshot = KEY_SYSRQ
command_screenshot = /usr/bin/grimshot save area
binding_screenshot_interactive = KEY_SYSRQ
command_screenshot_interactive = /usr/bin/grimshot save screen
Это просто небольшой кусок с достаточно важными настройками: установка раскладки клавиатуры, выхода на экран, запуска терминала — как и какого, ну и несколько нюансов типа нестандартного названия кнопки PrintScreen или способа блокировать нежелательные реакции (смена окон вместо прокрутки содержимого в них, например).
Детальное описание: https://github.com/WayfireWM/wayfire/wiki/Configuration
Также можно посмотреть файлы /usr/share/wayfire/metadata/*xml, в них несложно разобраться — какие именно плагины поддерживаются и с какими настройками/
Если коротко — установлены такие же точно хоткеи как в WindowMaker, запускается тот же терминал sakura, такой же фон «рабочего стола».
Сокращены периоды анимации — оно только при демонстрации выглядит красиво, а вот работа от этого торозит. Но и совсем убирать не обязательно.
Строка состояний — waybar, меню — wofi, установка фона — swaybg, блокировка экрана — swaylock, скриншоты — grimshot.
Установим это всё:
apt install waybar wifi swaybg swaylock grimshot
Теперь можно запускать любую среду:
Иксы — startx

Wayland — startw

И та и другая работают на этом железе достаточно быстро, а с одинаковыми настройками хоткеев и программ разницы почти нет.
В Wayfire вроде бы поприятнее переключение окон, явно задействовано GPU.
В следующей части: установка рабочих программ, приведение их внешнего вида к единому стилю, некоторые нюансы и баги.