Portfolio Обо мне Блог
10 November 2022
LINUX

Тут опишу что можно сделать, для того чтобы накатить Debian и как ее правильно настроить для работы.

Установка минимальной Debian

Для начала берем последнюю версию установщика Debian отсюда либо сборку с закрытыми прошивками отсюда. Подробнее про установку можно прочесть в официальной инструкции (по поводу закрытых микропрограмм написано в пункте 6.4.1).

Во время установки есть следующие интересные моменты:

  • Доступна обычная и экспертная установка. Вторая позволит выбрать конкретные лакали для установки, и не устанавливать загрузчик. Не особо полезно, поэтому я всегда ставлю систему в обычном режиме.
  • В меню ввода пароля для root ничего не вводим, это установит sudo и запретит вход в систему из под root.
  • При разметке диска нужно будет создать 2 раздела, под систему и своп, второй обязателен, даже если у вас большое количество оперативной памяти т.к он нужен для корректной работы системы, подробнее про это тут.
  • Если уже установлена windows efi раздел не нужен, grab2 встанет на efi раздел Windows.
  • Когда появится пункт меню Выбор программного беспечения нужно будет снять все галочки кроме последней —`стандартные системные утилиты, когда на выходе получится максимально чистый дистрибутив.

После этого грузимся в голую консоль. И логинимся. Интернет работать не будет. Для того чтобы подключится к кабелю нужно вручную получить ip от роутера:

sudo dhclient

Подключится к wifi не выйдет, т.к. для работы с ним нужен дополнительный софт (network-manager), а для его установки нужен интернет. Так что сначала подключаемся кабелем, потом до устанавливаем софт для вафли.

Теперь я предлагаю перейти на нестабильную ветку репозиториев - SID, чтобы получить некий аналог rolling релизов. Если вы не хотите использовать сырое ПО, то можете пропустить этот шаг. Я столкнулся с проблемами только 1 раз, когда qtcreator обновился до 8.0.0, это обновление сломало мне сборку проектов. Однако уже на следующий день обновление все исправило.

Для переключения на нестабильную ветку SID делаем следующее:

sudo nano /etc/apt/sources.list 

Заменяем его содержимое на:

deb http://deb.debian.org/debian/ sid main contrib non-free
deb-src http://deb.debian.org/debian/ sid main contrib non-free

Потом необходимо обновить систему:

sudo apt update
sudo apt dist-upgrade
sudo apt autoremove

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

Далее нужно накатить DE (я выбирал для себя BSPWM, не зря она в названии), иксы, терминал и браузер, чтобы было откуда и куда копировать команды:

sudo apt install bspwm xorg kitty firefox htop curl

Далее необходимо добавить шаблоны дефолтных настроек для bspwm и sxhkd, и добавить bspwm в xinitrc:

mkdir -p ~/.config/bspwm/
mkdir -p ~/.config/sxhkd/
cp /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm/
cp /usr/share/doc/bspwm/examples/sxhkdrc ~/.config/sxhkd/
chmod +x ~/.config/bspwm/bspwmrc

cp /etc/X11/xinit/xinitrc ~/.xinitrc
echo "sxhkd &" >> ~/.xinitrc
echo "exec bspwm" >> ~/.xinitrc

Также нужно добавить эмулятор терминала в ~/.config/sxhkd/sxhkdrc, чтобы получить возможность его запустить:

...
# terminal emulator
super + Return
        kitty       # <- add you'r terminal
...

Далее запускаем Xserver:

startx

После этого появится черный экран, далее можно запустить терминал комбинацией super+enter.

Раскладка клавиатуры

Для добавления других раскладок нужно отредактировать файл /etc/default/keyboard, причем эти изменения будут работать как в иксах, так и в консоли.

XKBMODEL="pc105"
XKBLAYOUT="us, ru"
XKBVARIANT=""
XKBOPTIONS="grp:alt_shift_toggle,terminate:ctrl_alt_bksp"
...

Для примера у меня us и ru раскладки, переключение через alt + shift. Комбинация ctrl + alt + backspace убьет иксы. Для того чтобы применить изменения, необходимо:

sudo udevadm trigger --subsystem-match=input --action=change

Подробнее можно посмотреть через man keyboard.

Настройка X-ов и DE

Дальше было бы неплохо разобраться с видеокартой, у меня их 2 nvidia и intel, поэтому придется использовать NVIDIA Optimus. Для начала нужно установить пакет с драйверами, необходимую версию драйверов поможет определить nvidia-detect, его можно установить из apt. Для меня это nvidia-driver поэтому я делаю:

sudo apt install nvidia-driver

Во время установки вам скажут, что установлен драйвер nouveau который конфликтует с тем что мы пытаемся установить. Для решения нужно перезагрузить систему.

sudo reboot now

Для проверки правильности установки драйверов можно запустить nvidia-smi, что покажет версию драйверов и название карточки.

Современные драйвера не дают явно переключать видеокарту, по умолчанию всегда работает карта intel. Для того чтобы запустить программу с видеокартой nvidia нужно добавить 2 параметра:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%

Проверить работу можно с помощью этой программы.

Для работы с несколькими мониторами можно использовать GUI программу - arandr.

Boot

В этом моменте можно поменять загрузчик с GRAB2 на что-то более современное, вроде rEFInd нацеленного на работу только с EFI. Сделать это достаточно просто:

sudo apt install refind
# Соглашаемся на автоматическую установку

sudo su
rm -r /boot/efi/EFI/debian/
exit

Далее нужно добавить параметр ядру, для того чтобы логи не затирали окно логина:

sudo su
nano /boot/refind_linux.conf
# Туда пишем
"Default"       "ro root=UUID=7bed2127-be1b-49b6-a76f-ef4d7e2ec409 quiet"
"Clean"         "ro root=UUID=7bed2127-be1b-49b6-a76f-ef4d7e2ec409"
# Узнать UUID диска можно с помощью 
cat /proc/cmdline

Или можно становить кастомную сборку ядра с большей отзывчивостью интерфейса и решённой проблемой с логированием:

curl 'https://liquorix.net/install-liquorix.sh' | sudo bash

Terminal

В реле эмулятора терминала уже выбран kitty. Как shell будем использовать zsh.

sudo apt install zsh git unzip fonts-noto-core

Следующее, что нужно сделать это подобрать основной шрифт. Нужен шрифт с иконками, чтобы его можно было использовать в доке. Я предлагаю использовать что-то отсюда. Для себя я выберу DejaVu Sans Mono Nerd Font.

mkdir dejavu
cd dejavu
wget https://github.com/ryanoasis/nerd-fonts/releases/download/v2.2.2/DejaVuSansMono.zip
unzip DejaVuSansMono.zip
mkdir ~/.fonts
cp DejaVu*.ttf ~/.fonts  
cd .. && rm -r dejavu

Посмотреть какие шрифты есть в системе, и как в них выглядят конкретные символы можно с помощью программы gucharmap, коды символов Nerd Fonts лежат тут.

Далее нужно настроить kitty. Документация находится тут. Для копирования дефолтного конфига нужно нажать ctrl+shift+F2 после чего редактируем ~/.config/kitty/kitty.conf. Нужно изменить шрифт, отключить звонок, сделать окно прозрачным:

...
 font_family      DejaVuSansMono Nerd Font
 bold_font        auto
 italic_font      auto
 bold_italic_font auto
 ...
 enable_audio_bell no
 ...
 background_opacity 0.5
 ...

Данный терминал поддерживает окна и вкладки. Также перечислю основные горячие клавиши:

Command Hotkey
New Window Ctrl+Shift+Enter
Close Window Ctrl+Shift+W
Next Window Ctrl+Shift+]
Previous Window Ctrl+Shift+[
New Tab Ctrl+Shift+T
Close Tab Ctrl+Shift+Q
Next Tab Ctrl+Shift+Right
Previous Tab Ctrl+Shift+Left
Resize Tabs Ctrl+Shift+R
Line Up Ctrl+Shift+Up
Line Down Ctrl+Shift+Down

!> Менее полезные комбинации

Command Hotkey
Page Up Ctrl+Shift+Page_Up
Page Down Ctrl+Shift+Page_Down
Top Ctrl+Shift+Home
Bottom Ctrl+Shift+End
Command Hotkey
Copy to Clipboard Ctrl+Shift+C
Paste from Clipboard Ctrl+Shift+V
Paste from Selection Ctrl+Shift+S
Increase Font Size Ctrl+Shift+Equal
Decrease Font Size Ctrl+Shift+Minus
Toggle Fullscreen Ctrl+Shift+F11

!@

Для zsh я предлагаю установить Oh my ZsH:

sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

В процессе на все соглашаемся, далее изменим тему:

nano ~/.zshrc
# меняем параметр
ZSH_THEME="agnoster"

BSPWM

Для коретрой работы WM необходимо до установить некоторое по:

sudo apt install compton lxappearance qt5ct arc-theme qt5-style-kvantum papirus-icon-theme breeze-cursor-theme nitrogen polybar psmisc 
  • compton - композитный менеджер
  • lxappearance - выбор темы gtk
  • qt4ct - выбор темы qt
  • arc-theme - красивая тема gtk
  • qt5-style-kvantum - движок для тем qt содержащий в себе arc тему (как в gtk)
  • papirus-icon-theme - набор неплохих иконок
  • breeze-cursor-theme - набор курсоров из KDE
  • nitrogen - выбор заставки
  • polybar - док, настройка которого будет в сл. пункте
  • psmisc - для работы killall

Для настойки gtk приложений необходимо запустить lxappearance - выбрать там Arc-Darck, Papirus-Darck и Breeze в разных вкладках. Для настройки qt нужно запустить kvantummanager и во второй вкладке выбрать KvArcDark после чего нажать Use this theme. Далее запускаем qt5ct и выбираем kvantum-dark и Papirus-Darck в разных вкладках. Также для работы тем qt нужно прописать переменную окружения в ~/.profile:

...
export QT_QPA_PLATFORMTHEME=qt5ct

Для выбора изображения на рабочем столе запускаем nitrogen.

Для настройки WM под себя необходимо править дефолтные конфиги записанные нами ранее ~/.config/bspwm/bspwmrc и ~/.config/sxhkd/sxhkdrc. Более подробно про настройку можно посмотреть тут, тут. Я приведу ниже мои конфиги с комментариями:

#! /bin/sh

pgrep -x sxhkd > /dev/null || sxhkd &

bspc monitor -d I II III IV V VI VII VIII IX X

bspc config border_width         2
bspc config window_gap           6

bspc config split_ratio          0.52
bspc config borderless_monocle   true
bspc config gapless_monocle      true

# --- my autorun ---
export TERM=screen
compton &
nitrogen --restore &
wmname compiz
~/.config/polybar/vpn_check.sh &
~/.config/bspwm/batt_check.sh &
sleep 2
~/.config/polybar/launch.sh &

Для работы с 2-мя мониторами можно посмотреть тут и тут.

Для sxhkd я оставил все дефолтное, добавил только клавиши специфичные для моей модели ноутбука, а так-же нужные мне хоткеи. Так-же для того чтобы узнать код клавишы можно использовать xev | grep XL.

#MY_KEY bind AW17R3 Only

XF86AudioRaiseVolume 
    pactl set-sink-volume @DEFAULT_SINK@ +2%
XF86AudioLowerVolume
    pactl set-sink-volume @DEFAULT_SINK@ -2%
XF86AudioMute
    pactl set-sink-mute @DEFAULT_SINK@ toggle
XF86AudioMicMute
    pactl set-source-mute @DEFAULT_SOURCE@ toggle
Print
    flameshot gui

super + m 
    xrandr --output eDP-1 --mode 1920x1080 --pos 0x0 --output HDMI-1-3  --mode 1920x1080 --pos 0x0

super + {equal, minus}
    echo $((`cat /sys/class/backlight/intel_backlight/brightness` {+,-} 100)) > /sys/class/backlight/intel_backlight/brightness

super + shift + {equal, minus}
    echo $((`cat /sys/class/backlight/intel_backlight/brightness` {+,-} 500)) > /sys/class/backlight/intel_backlight/brightness

super + v
    /home/zen/.config/sxhkd/vpn.sh

Polybar

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

mkdir ~/.config/polybar/
nano ~/.config/polybar/launch.sh

Добавить туда скрипт запуска:

#!/usr/bin/env bash

# Terminate already running bar instances
killall -q polybar

# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done

# Launch mybar
polybar mybar

echo "Bars launched..."

после чего:

chmod +x ~/.config/polybar/launch.sh

Также необходимо создать ~/.config/polybar/config и добавить в него конфиги для дока.

!> ~/.config/polybar/config

[bar/mybar]
;monitor = ${env:MONITOR:eDP-1}
width = 100%
height = 20
radius = 0.0
fixed-center = false

background = ${colors.background}
foreground = ${colors.foreground}

line-size = 1
border-size = 0
padding-left = 0
padding-right = 0
module-margin = 2

font-0 = NotoSans-Regular:size=10;0
font-1 = DejaVuSansMono Nerd Font:size=10;0

modules-left = bspwm
modules-center = filesystem memory cpu temperature
modules-right = nextcloud_sinc site_check vpn_check vpn wlan_usb wlan eth1 eth2 backlight-acpi pulseaudio battery xkeyboard date

[colors]
background = #50000000
background-alt = #b0000000
foreground = #ffffff
foreground-alt = #c4feff
primary = #00bfff
secondary = #0cf93b
orange = #ef640e
alert = #ff0000

;---------- MODULE -----------------------------------------------

;---------- LEFT -------------------------------------------------

[module/bspwm]
type = internal/bspwm

label-focused = %index%
label-focused-background = ${colors.background-alt}
label-focused-underline= ${colors.primary}
label-focused-padding = 2

label-occupied = %index%
label-occupied-padding = 2

label-urgent = %index%!
label-urgent-background = ${colors.alert}
label-urgent-padding = 2

label-empty = %index%
label-empty-foreground = ${colors.foreground-alt}
label-empty-padding = 2

;---------- CENTER -------------------------------------------------

[module/filesystem]
type = internal/fs

mount-0 = /
label-mounted =    %used% / %total%
label-mounted-underline = ${colors.secondary}

[module/memory]
type = internal/memory
interval = 1

format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-prefix-underline = ${colors.secondary}

format = <label>
format-underline = ${colors.secondary}
label = %gb_used%

[module/cpu]
type = internal/cpu
interval = 1
format-underline = ${colors.secondary}
format = <ramp-coreload> <label>  
label = " %percentage%%"

format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-prefix-underline = ${colors.secondary}

ramp-coreload-0 = ▁
ramp-coreload-1 = ▂
ramp-coreload-2 = ▃
ramp-coreload-3 = ▄
ramp-coreload-4 = ▅
ramp-coreload-5 = ▆
ramp-coreload-6 = ▇
ramp-coreload-7 = █

[module/temperature]
type = internal/temperature
interval = 1
thermal-zone = 8
warn-temperature = 70

format = "<ramp>  <label>"
format-underline = ${colors.secondary}
label = %temperature-c%

format-warn = "<ramp>  <label-warn>"
format-warn-underline = ${colors.alert}
label-warn = %temperature-c%

ramp-0 = 
ramp-1 = 
ramp-2 = 
ramp-3 = 
ramp-4 = 
ramp-foreground = ${colors.foreground-alt}

;---------- RIGHT --------------------------------------------------

[module/nextcloud_sinc]
type = custom/script
interval = 3600
exec = ~/.config/polybar/nextcloud_sinc.sh
click-left = ~/.config/polybar/nextcloud_sinc.sh
format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-underline = ${colors.orange}

[module/site_check]
type = custom/script
interval = 1800
exec = ~/.config/polybar/site_check.sh
click-left = ~/.config/polybar/site_check.sh
format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-underline = ${colors.orange}

[module/vpn]
type = custom/script
exec-if = ip l | grep wg | grep -q UP
interval = 3
exec = echo " "
format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-underline = ${colors.orange}

[module/vpn_check]
type = custom/script
interval = 1
exec = cat /tmp/vpn_state
click-left = touch /tmp/vpn_check
format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-underline = ${colors.orange}

[module/eth1]
type = internal/network
interface = enp59s0
interval = 3
format-connected-underline = ${colors.primary}
format-connected-prefix = "    "
format-connected-prefix-foreground = ${colors.foreground-alt}
label-connected = "%local_ip%    %upspeed%   %downspeed% "

[module/eth2]
type = internal/network
interface = enx98fc84e967a8
interval = 3
format-connected-underline = ${colors.primary}
format-connected-prefix = "    "
format-connected-prefix-foreground = ${colors.foreground-alt}
label-connected = "%local_ip%    %upspeed%   %downspeed% "

[module/wlan]
type = internal/network
interface = wlp60s0
interval = 3
format-connected-underline = ${colors.primary}
format-connected-prefix = " 直   "
format-connected-prefix-foreground = ${colors.foreground-alt}
label-connected = "%signal%%  %local_ip%    %upspeed%   %downspeed% "

[module/wlan_usb]
type = internal/network
interface = wlx98ded01b9620
interval = 3
format-connected-underline = ${colors.primary}
format-connected-prefix = "      直   "
format-connected-prefix-foreground = ${colors.foreground-alt}
label-connected = "%signal%%  %local_ip%    %upspeed%   %downspeed% "

[module/backlight-acpi]
type = internal/backlight
card = intel_backlight
format = <label>
label = %percentage%%
format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-underline = ${colors.primary}

[module/pulseaudio]
type = internal/pulseaudio
use-ui-max = true
interval = 5

format-volume = <label-volume>
label-volume = %percentage%%
format-volume-prefix = "    "
format-volume-prefix-foreground = ${colors.foreground-alt}
label-volume-foreground = ${root.foreground}
format-volume-underline = ${colors.orange}

label-muted =   OFF
label-muted-foreground = ${colors.alert}
format-muted-underline = ${colors.orange}

[module/battery]
type = internal/battery
battery = BAT1
adapter = ACAD
full-at = 100
low-at = 30

format-full = <label-full>
label-full = %percentage%%
format-full-prefix = "   "
format-full-prefix-foreground = ${colors.foreground-alt}
format-full-underline = ${self.format-charging-underline}

format-discharging = "<ramp-capacity>  <label-discharging>"
label-discharging = %percentage%%
format-discharging-underline = ${self.format-charging-underline}
ramp-capacity-foreground = ${colors.foreground-alt}
ramp-capacity-0 = 
ramp-capacity-1 = 
ramp-capacity-2 = 
ramp-capacity-3 = 
ramp-capacity-4 = 
ramp-capacity-5 = 
ramp-capacity-6 = 
ramp-capacity-7 = 
ramp-capacity-8 = 
ramp-capacity-9 = 

format-charging = "<animation-charging>  <label-charging>"
label-charging = %percentage%%
format-charging-underline = ${colors.orange}
animation-charging-foreground = ${colors.foreground-alt}
animation-charging-0 = 
animation-charging-1 = 
animation-charging-2 = 
animation-charging-3 = 
animation-charging-4 = 
animation-charging-5 = 
animation-charging-6 = 
animation-charging-framerate = 500

format-low = "<animation-low>  <label-low>"
label-low = %percentage%%
animation-low-0 = 
animation-low-1 = 
animation-low-framerate = 500
format-low-underline = ${colors.orange}
animation-low-foreground = ${colors.foreground-alt}

[module/xkeyboard]
type = internal/xkeyboard
blacklist-0 = num lock
blacklist-1 = scroll lock
blacklist-2 = caps lock

format-prefix = "     "
format-prefix-foreground = ${colors.foreground-alt}
format-prefix-underline = ${colors.orange}

label-layout = "%layout% "
label-layout-underline = ${colors.orange}

[module/date]
type = internal/date
label = %time% %date%

time = " %H:%M:%S "
time-alt = " %H:%M:%S"
date-alt = " %d-%m-%Y "

format-prefix = "   "
format-prefix-foreground = ${colors.foreground-alt}
format-underline = ${colors.orange}

!@

Для проверки работы запускаем бар:

~/.config/polybar/launch.sh

После чего в консоли отбразатся ошибки в случае их появления.

Display Manager

В качестве Display Manager я предлагаю использовать Ly - терминальный менеджер входа. Его нужно будет собрать из исходников:

sudo apt install build-essential libpam0g-dev libxcb-xkb-dev
git clone --recurse-submodules https://github.com/fairyglade/ly
cd ly
make
make run # проверить работу
sudo make install installsystemd # установка
sudo systemctl enable ly.service
sudo systemctl disable getty@tty2.service
cd .. && rm -rf ly

Конфиг находится в /etc/ly/config.ini. Можно включить анимацию на заднем плане, а так все по умолчанию вполне хорошо. Единственное, в менеджере нужно выбрать xinitrc, а не bspwm, иначе не будет работать часть функций.

Устройства

Bluetooth

Для работы с BT необходим bluetoothctl. Рассмотрим пример с контроллером от PS4:

bluetoothctl

[bluetooth]#agent on
[bluetooth]#default-agent 
[bluetooth]#power on
[bluetooth]#discoverable on
[bluetooth]#pairable on 
[bluetooth]#scan on
# Ждем
[bluetooth]#devices
# Последняя команда покажет устройства и их MAC
# Ищем Wireless Controller и запоминаем MAC
[bluetooth]# scan off
[bluetooth]# pair A4:AE:11:75:75:85 # You'r MAC
# Соглашаемся на авторизацию и Dualshock 4 подключен
[bluetooth]#trust A4:AE:11:75:75:85 # You'r MAC
# Для автоматической авторизации
[bluetooth]#quit

После этого на duashock заработает сенсорная панель как тачпад.

Audio

sudo apt install alsa-utils pulseaudio

Для работы необходимо будет указать входы и выходы по умолчанию:

# Смотрим названия устройств
pacmd list-sources | grep -e 'name:' -e 'index:'
pacmd list-sinks | grep -e 'name:' -e 'index:'

sudo nano /etc/pulse/default.pa
# тут меням устройства по умолчанию на необходимые, для меня это
...
### Make some devices default
set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
set-default-source alsa_input.pci-0000_00_1f.3.analog-stereo
....

Для управления аудио можно использовать следующие команды, в том числе в SXHKD, названия те которые использовали для конфига:

# Номер устройства может меняться, нужно проверять
pactl set-sink-volume @DEFAULT_SINK@ +2%        # Увеличение громкости на 2%
pactl set-sink-volume @DEFAULT_SINK@ -2%        # Уменьшение громкости на 2%
pactl set-sink-mute @DEFAULT_SINK@ toggle   # Включение/отключение выхода
pactl set-source-mute @DEFAULT_SOURCE@ toggle   # Включение/отключение входа

Также у меня есть плеер Fiio X5, который я иногда использую в качестве внешней аудио карты. Для автоматического переключения необходимо создать правило udev которое будет срабатывать при подключении или отключении устройства.

  • Смотрим события:
sudo udevadm monitor
sudo udevadm monitor --property
  • Создаем правило /lib/udev/rules.d/85-Fiio-X5.rules срабатывающее по событиям выше: sudo apt install nala

    SUBSYSTEM=="sound", ATTR{id}=="X5", ACTION=="add", RUN+="/usr/bin/systemctl start Fiio-X5.service"
    ENV{ID_USB_SERIAL}=="FiiO_X5_X5", ACTION=="remove", RUN+="/usr/bin/systemctl start Fiio-X5.service"
  • Udev исполняется от рута, а pulseaudio от нашего пользователя, поэтому мы не можем дергать скрипт на прямую, а создаем сервис /etc/systemd/system/Fiio-X5.service:

[Unit]
Description=Fiio X5 III player connect

[Service]
Type=simple
RemainAfterExit=no
ExecStart=/usr/local/bin/Fiio-X5.sh

[Install]
WantedBy=multi-user.target
  • Уже сервис дергает скрипт, который подключает плеер, если аудио карта найдена и подключает внутреннюю аудио карту если плеер отключен - /usr/local/bin/Fiio-X5.sh:
#!/bin/bash
USER_NAME=$(w -hs | awk -v vt=tty$(fgconsole) '$0 ~ vt {print $1}')
USER_ID=$(id -u "$USER_NAME")
X5_STATUS=$(lsusb | grep -e '2972:0027 FiiO Electronics Technology X5')

export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"

if [[ $X5_STATUS ]]
then
    sudo -u "$USER_NAME" pactl --server "$PULSE_SERVER" set-default-sink alsa_output.usb-FiiO_X5_X5-00.analog-stereo
else
    sudo -u "$USER_NAME" pactl --server "$PULSE_SERVER" set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
fi

Далее нужно сделать скрипт исполняемым и обновить правила udev вместе с сервисами:

sudo chmod +x /usr/local/bin/Fiio-X5.sh
sudo udevadm control --reload-rules
sudo systemctl daemon-reload

ТАЧПАД

sudo apt install xserver-xorg-input-synaptics

Для настройки нужно редактировать конфиг /usr/share/X11/xorg.conf.d/70-synaptics.conf. Добавляем свои параметры в первую секцию InputClass:

Section "InputClass"
        Identifier "touchpad catchall"
        Driver "synaptics"
        MatchIsTouchpad "on"
        # Ниже наши параметры
        Option "TapButton1" "1"
        Option "TapButton2" "2"
        Option "TapButton3" "3"
        Option "VertEdgeScroll" "on"
        Option "VertTwoFingerScroll" "on"
        Option "HorizEdgeScroll" "on"
        Option "HorizTwoFingerScroll" "on"
        Option "CircularScrolling" "on"
        Option "CircScrollTrigger" "2"
        Option "EmulateTwoFingerMinZ" "40"
        Option "EmulateTwoFingerMinW" "8"
        Option "CoastingSpeed" "0"
        Option "FingerLow" "35"
        Option "FingerHigh" "40"
EndSection

Подробнее про настройку тачпада написано тут а пункты меню описаны тут, либо в man.

Подсветка

Для управления подсветкой нужно записать определенные значения в файл. Однако данный файл по умолчанию не доступен для редактирования, поэтому нужно создать правило udev /etc/udev/rules.d/backlight.rules:

RUN+="/bin/chgrp video /sys/class/backlight/intel_backlight/brightness"
RUN+="/bin/chmod g+w /sys/class/backlight/intel_backlight/brightness"

Для увеличения или уменьшения яркости можно использовать следующик команды:

echo $((`cat /sys/class/backlight/intel_backlight/brightness` + 100)) > /sys/class/backlight/intel_backlight/brightness
echo $((`cat /sys/class/backlight/intel_backlight/brightness` - 100)) > /sys/class/backlight/intel_backlight/brightness

Батарея

Для работы с батарей я предлагаю использовать простенький скрипт ~/.config/bspwm/batt_check.sh, который будет показывать уведомления (с помощью dunst) когда заряд ниже определенного уровня:

#!/bin/bash
low_power=20

while [ true ]
do
    if (( `cat /sys/class/power_supply/BAT1/capacity` <= $low_power )) \
    && [[ `cat /sys/class/power_supply/BAT1/status` == Discharging ]]
    then
        notify-send -u critical -i computer-fail "System" "Battery empty."
    fi
    sleep 30
done

Для работы данного скрипта его нужно добавить в автозагрузку, например в ~/.config/bspwm/bspwmrc.

Прочий софт и улучшения

VsCode

В основном я использую данный редактор кода в своей работе, для его установки нужно:

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/microsoft-archive-keyring.gpg
sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt-get update
sudo apt-get install code # or code-insiders

Flameshot

Это удобное приложение для скриншотов с возможностью рисовать поверх изображения.

sudo apt install flameshot
flameshot gui       # Для окна скриншота

Rofi

Это программа для отображения меню приложений системы.

sudo apt install rofi

Далее можно установить темы:

git clone https://github.com/lr-tech/rofi-themes-collection.git
cd rofi-themes-collection
mkdir -p ~/.local/share/rofi/themes/
cp themes/* ~/.local/share/rofi/themes/
cd .. && rm -rf rofi-themes-collection
# Выбираем понравившуюся тему в
rofi-theme-selector
# я выбрал Rounded red dark

Запускаем меню с помощью команды:

rofi -show run

И добовляем в ~/.config/sxhkd/sxhkdrc:

...
# program launcher
super + @space
        rofi -show run
...

Ranger

Консольный файловый менеджер который умеет отображать картинки и pdf.

sudo apt install ranger python3-pypillowfight
ranger --copy-config=all

Для отображения картинок нужно поменять конфиг ~/.config/ranger/rc.conf:

set preview_images true
set preview_images_method kitty

Для того чтобы заработал предпросмотр SVG, нужно установить пакет librsvg2-bin и изменить стандартное поведение для файла SVG. Для этого нужно отредактировать файл ~/.config/ranger/scope.sh

## SVG
image/svg+xml|image/svg)
    rsvg-convert --keep-aspect-ratio --width "${DEFAULT_SIZE%x*}" "${FILE_PATH}" -o "${IMAGE>
        && mv "${IMAGE_CACHE_PATH}.png" "${IMAGE_CACHE_PATH}" \
        && exit 6
    exit 1;; 

Dunst

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

sudo apt-get install dunst libnotify-bin
cp -r /etc/xdg/dunst ~/.config/dunst

Для того чтобы получить сообщение, необходимо просто вызвать notify-send, например так:

notify-send -u low  "System" "Something notise."
notify-send -u normal  "System" "Something ended."
notify-send -u critical  "System" "Something bad happened."
notify-send -h int:value:50 Test

Скорее всего иконки не отобразились. Для того чтобы все заработало, изменим конфиг ~/.config/dunst/dunstrc, а за одно и придадим сообщения вид похожий на док.

[global]
    monitor = 0
    follow = none

    ### Geometry ###
    width = 300
    height = 300
    origin = top-right
    offset = 13x39
    scale = 0
    notification_limit = 15

    ### Progress bar ###
    progress_bar = true
    progress_bar_height = 10
    progress_bar_frame_width = 1
    progress_bar_min_width = 150
    progress_bar_max_width = 280

    indicate_hidden = yes
    transparency = 0
    separator_height = 2
    padding = 10
    horizontal_padding = 10
    text_icon_padding = 10
    frame_width = 2
    frame_color = "#888888"
    separator_color = frame
    sort = yes
    idle_threshold = 120

    ### Text ###
    font = DejaVuSansMono Nerd 10
    line_height = 4
    markup = full
    format = "<b>%s</b>\n%b"
    alignment = left
    vertical_alignment = center
    show_age_threshold = 60
    ellipsize = middle
    ignore_newline = no
    stack_duplicates = false
    hide_duplicate_count = false
    show_indicators = yes

    ### Icons ###
    icon_position = left
    min_icon_size = 0
    max_icon_size = 32
    icon_path = /usr/share/icons/Papirus/32x32/status/:/usr/share/icons/Papirus/32x32/devices/:/usr/share/icons/Papirus/32x32/emblems/

    ### History ###
    sticky_history = yes
    history_length = 20

    ### Misc/Advanced ###
    browser = /usr/bin/xdg-open
    always_run_script = true
    title = Dunst
    class = Dunst
    corner_radius = 10
    ignore_dbusclose = false

    ### Wayland ###
    force_xwayland = false

    ### Legacy
    force_xinerama = false

    ### mouse
    mouse_left_click = close_current
    mouse_middle_click = do_action, close_current
    mouse_right_click = close_all

[experimental]
    per_monitor_dpi = false

[urgency_low]
    background = "#000000CC"
    foreground = "#ffffff"
    frame_color = "#00ff0040"
    timeout = 2

[urgency_normal]
    background = "#000000CC"
    foreground = "#ffffff"
    timeout = 4

[urgency_critical]
    background = "#000000CC"
    foreground = "#ffffff"
    frame_color = "#ff000090"
    timeout = 0

Подробнее про каждый из пунктов можно прочесть в man 5 dunst. После редактирования конфига необходимо перезапустить сервис.

systemctl restart --user dunst.service

В данном конфиге оспользуется тема иконок Papirus, которая была установленна вместе с оконным менеджером выше. Для того чтобы отобразить любой значёк из этой темы, достаточно использовать флаг -i. Изображения будут братся из папок указанных в параметре icon_path.

notify-send -i encrypted  "System" "Something bad happened."

APT -> Nala

Для apt я предлагаю использовать обертку - Nala. Она выводит информацию более красово, а так-же автоматически делает autoremove.

sudo apt install nala
echo "alias sudo='sudo '" >> .zshrc
echo "alias apt='nala'" >> .zshrc

Пободный алиас может быть опасен, если apt используется в каких-то скриптах, так что удалите ее в случае появления каких-то проблем. Первый алиас нужен для того, чтобы проверять слова после sudo на наличие псевданимов.

Veracrypt

Для шифрования личных данных я предлагаю использовать программу Veracrypt. Сначала нужно скачать deb пакет версии для терминала с сайта и установить. Для удобного взаимодействия с программой нужно создать папки для монтирования и разрешить запуск программы от sudo без запроса пароля:

sudo mkdir /media/data /media/doc /media/img
# меняем user на своего
echo "user ALL=(ALL:ALL) NOPASSWD: /bin/veracrypt" | sudo tee -a /etc/sudoers

Далее для удобства использования создадим алиасы:

alias veracrypt_data='echo -n "Password: ";sudo veracrypt -k "" --pim=0 --protect-hidden=no -p "`read -s s;echo $s`" /dev/sda /media/data'
alias veracrypt_doc='echo -n "Password: ";sudo veracrypt -k "" --pim=0 --protect-hidden=no -p "`read -s s;echo $s`" /media/data/doc /media/doc'
alias veracrypt_img='echo -n "Password: ";sudo veracrypt -k "" --pim=0 --protect-hidden=no -p "`read -s s;echo $s`" /media/data/img /media/img'
alias veracrypt_un='echo -n "Unmount all drive.";sudo veracrypt -d'

Дополнительные функции дока

Проверка доступности сайтов

Для того чтобы видеть доступность своих сайтов в сети я предлагаю использовать простенький скрипт и кастомный модуль для polybar, который уже описан в приведенном конфиге выше. В нем используется скрипт ~/.config/polybar/site_check.sh:

#!/bin/bash

sites=(zenembed.com work.zenembed.com cloud.zenembed.com git.zenembed.com)

for site in ${sites[@]}
do
    if $(ping -c 1 $site | grep -q "1 received, 0% packet loss")
    then
        echo -en " "
    else
        echo -en "  "
    fi
done
echo -en "   "

Вместо моих вы можете написать свои адреса.

Синхронизация Next cloud.

В качестве файловой помойки я использую Next cloud. Для синхронизации папки на сервере и на компьютере можно использовать nextcloud-desktop-cmd. Обернув ее в простой скрипт(~/.config/polybar/nextcloud_sinc.sh), и добавив еще один виджет на бар, получим простенькое средство синхронизации.

#! /bin/bash

adr=cloud.zenembed.com
login=<your_login>
pass=<your_pass>

if $(nextcloudcmd --path nextcloud ~/nextcloud https://$login:$pass@$adr &> /dev/null)
then
    echo -en "    "
else
    echo -en "     "
fi

Еще я устанавливаю в систему:

sudo apt install thunar thunar-\*-plugin  smplayer gucharmap photoqt qml-module-qt-labs-platform
  • thunar - файловый менеджер из xfce.
  • thunar-\*-plugin - набор плагинов для ФМ.
  • smplayer - плеер который может подключить отдельную аудио дорожку.
  • gucharmap - проверка юникод символов
  • photoqt - минималистичный просмотрщик фото, qml-module-qt-labs-platform недостающая либа для его работы.