Void Linux Послеустановочные шаги

2020-02-18

Для своего нетбука Asus 1215n я выбрал дистрибутив Void Linux с libc-библиотекой, так как для дистрибутива с musl-библиотекой не будет доступна установка проприетарных драйверов для видеокарты "Nvidia ION".

Установка с флэшки быстра и незатейлива и здесь приведена не будет. Отмечу только, что для корневой ФС выбираю BtrFS.

Обновление и подключение дополнительных репо

После перезагрузки выполняем два обновления системы:

# xbps-install -Su
# xbps-install -Su
# reboot

Удаляем старые ядра Linux, кроме последнего:

# vkpurge rm all

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

# xbps-query -Rs void-repo
[-] void-repo-debug-9_4            Void Linux drop-in file for the debug repository
[-] void-repo-multilib-6_3         Void Linux drop-in file for the multilib repository
[-] void-repo-multilib-nonfree-6_3 Void Linux drop-in file for the multilib/nonfree repository
[-] void-repo-nonfree-9_4          Void Linux drop-in file for the nonfree repository

# xbps-install -Su void-repo-multilib void-repo-multilib-nonfree void-repo-nonfree

Безопасность SSH

В Void Linux по умолчанию устанавливается демон sshd с настройками, позволяющими авторизоваться root по паролю. В современных условиях это потенциальная дыра в безопасности системы. Без промедления исправляем:
- останавливаем демон sshd:
# sv stop sshd;
- при необходимости запрещаем запуск демона sshd:
# rm /var/service/sshd;
- комментируем все host-ключи, кроме /etc/ssh/ssh_host_ed25519_key;
- запрещаем вход для root'а:
PermitRootLogin no;
- разрешаем вход по открытому ключу:
PubkeyAuthentication yes;
- запрещаем вход по паролю:
PasswordAuthentication no.

Включение Firewall

Firewall Configuration
По умолчанию в Void Linux установлен iptables. Как обычно, правила храняться в /etc/iptables/iptables.rules и /etc/iptables/ip6tables.rules.

Пример iptables.rules :

*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
#-A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "IPV4 INVALID packets: "
-A INPUT -m conntrack --ctstate INVALID -j DROP
# incoming ping & traceroute
#-A INPUT -p icmp -m icmp --icmp-type echo-request -m conntrack --ctstate NEW -j ACCEPT
#-A INPUT -p udp -m udp --dport 33434:33534 -m conntrack --ctstate NEW -j ACCEPT
# ssh
#-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# logging drop packets
#-A INPUT -j LOG --log-prefix "IPV4 DROP packets: "
-A INPUT -j DROP
COMMIT

*nat
:PREROUTING ACCEPT
:INPUT ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
COMMIT

*mangle
:PREROUTING ACCEPT
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
COMMIT

*raw
:PREROUTING ACCEPT
:OUTPUT ACCEPT
COMMIT

Пример ip6tables.rules :

*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
#-A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "IPV6 INVALID packets: "
-A INPUT -m conntrack --ctstate INVALID -j DROP
# icmpv6
-A INPUT -p icmpv6 --icmpv6-type router-advertisement -m conntrack --ctstate UNTRACKED -m hl --hl-eq 255 -j ACCEPT
-A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m conntrack --ctstate UNTRACKED -m hl --hl-eq 255 -j ACCEPT
-A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m conntrack --ctstate UNTRACKED -m hl --hl-eq 255 -j ACCEPT
# incoming ping traceroute
#-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -m conntrack --ctstate NEW -j ACCEPT -m limit --limit 5/second
#-A INPUT -p udp -m udp --dport 33434:33534 -m conntrack --ctstate NEW -j ACCEPT
# ssh
#-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# logging drop packets
#-A INPUT -j LOG --log-prefix "IPV6 DROP packets: "
-A INPUT -j DROP
COMMIT

*nat
:PREROUTING ACCEPT
:INPUT ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
COMMIT

*mangle
:PREROUTING ACCEPT
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
COMMIT

*raw
:PREROUTING ACCEPT
:OUTPUT ACCEPT
COMMIT


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

ln -s /etc/sv/iptables /var/service/
ln -s /etc/sv/ip6tables /var/service/

Служба времени

# xbps-install -S chrony
# ln -s /etc/sv/chronyd/ /var/service/

chronyc makestep – для немедленной синхронизации.

Локализация и русификация консоли

Подправляем локаль для правильной работы программ, в частности mosh, gnome-terminal, клиента NextCloud. Также русифицируем консоль с переключением клавиатурных раскладок по "Alt+Shift".

В /etc/default/libc-locales раскомментируем необходимые нам локали и запускаем их генерацию (для ru_RU.UTF-8):

# sed -i -e "s|#ru_RU.UTF-8|ru_RU.UTF-8|" /etc/default/libc-locales
# xbps-reconfigure -f glibc-locales

Задаём локаль по умолчанию:

# echo "LANG=ru_RU.UTF-8" > /etc/locale.conf

Выбираем консольный шрифт Terminus размером 24 и полужирным начертанием, и добавляем в консоль переключение между языками по "Alt+Shift". Для этого изменяем соответствующие строки в /etc/rc.conf:

KEYMAP="ruwin_alt_sh-UTF-8"
FONT="ter-v24b"

Изменения вступят в силу после перезагрузки.

Шрифты хранятся в /usr/share/kbd/consolefonts. Сверяясь с этим каталогом и переключившись в консоль, подбираем шрифты командой setfont, например:

$ setfont /usr/share/kbd/consolefonts/UniCyrExt_8x16.psf.gz
$ setfont /usr/share/kbd/consolefonts/ruscii_8x16
$ setfont ter-v24n

Logging

По умолчанию в Void Linux отсутствует логгирование. При необходимости в нём, на странице Logging in Void Linux, предлагается установить socklog:

# xbps-install -S socklog-void
# ln -s /etc/sv/socklog-unix /var/service/
# ln -s /etc/sv/nanoklogd /var/service/

Запись логов ведётся в /var/log/socklog/. Для их чтения добавляем себя в группу socklog:

$ sudo usermod -aG socklog $USER

Добавление часто используемого ПО

Устанавливаем часто используемые пакеты:

$ sudo xbps-install -Su unzip atom vscode mosh mc chromium opera torbrowser-launcher keepassxc encfs libreoffice tint2 stellarium net-tools NetworkManager-openvpn wireshark-qt zenmap tcpdump calibre atril file-roller gnome-calculator clamav rkhunter chkrootkit smartmontools parted remmina telegram-desktop cool-retro-term font-3270 ntfs-3g attr-progs acl-progs libcap-ng-progs
$ sudo usermod -a -G wireshark $USER

nvidia340

Так как мой старенький нетбук имеет дополнительный видеочип на "Nvidia ION", а его поддержка закончилась на 340-ой версии драйверов от Nvidia, то устанавливаем соответствующий драйвер; добавляем свой логин в группу пользователей этого видеочипа, и добавляем демон bumblebeed в автозагрузку:

$ sudo xbps-install -Su nvidia340 bumblebee bbswitch
$ sudo usermod -a -G bumblebee $USER
$ sudo ln -s /etc/sv/bumblebeed /var/service

После ближайшей перезагрузки запускаем различные тесты для проверки работы bumblebee и изменяем пункты меню тех приложений, которым требуется для запуска GLX:

$ optirun glxgears -info
$ optirun glxspheres64
$ optirun stellarium
$ optirun cool-retro-term

Wifi adapter Broadcom BCM4313

Ищем подходящие проприетарные драйвера в репозиториях и устанавливаем:

# xbps-query -Rs broadcom
[-] b43-fwcutter-019_3                 Firmware extraction tool for Broadcom wireless driver
[-] broadcom-bt-firmware-12.0.1.1011_1 Broadcom Bluetooth firmware for Linux kernel
[-] broadcom-wl-dkms-6.30.223.271_8    Broadcom proprietary wireless drivers for Linux - DKMS kernel module

# xbps-install -Su broadcom-wl-dkms

Интересно, что после установки проприетарных драйверов, соединение с базовой станцией (Mikrotik) происходит не с первой попытки. Иногда только после закрытия/открытия крышки нетбука, то есть через спящий режим. Позже попробуем разобраться в причинах такого поведения, а пока нащупал костыль: # rmmod wl cfg80211 && sleep 1 && modprobe wl, после применения которого происходит мгновенное подключение.

NextCloud

# xbps-install -Su nextcloud-client libgnome-keyring
...
========================================================================
To actually use qtkeychain-qt5 you need to either have kwallet or
libgnome-keyring installed.
========================================================================
qtkeychain-qt5-0.9.1_1: installed successfully.
nextcloud-client-2.6.0_1: configuring ...
Updating GTK+ icon cache for /usr/share/icons/hicolor...
Updating MIME database...
nextcloud-client-2.6.0_1: post-install message:
========================================================================
NextCloud client end-to-end encryption (e2e) is currently unavailable
(LibreSSL 2.9.2 does not provide EVP_PKEY_CTX_set_rsa_oaep_md primitive)

libgnome-keyring – для подавления запроса авторизации в браузере.

Timeshift

По умолчанию в Void Linux не предусмотрен какой-нибудь планировщик задач, поэтому устанавливаем его для обеспечения запуска задач из timeshift-gtk:

# xbps-install -Su timeshift cronie libgee
# ln -s /etc/sv/crond /var/service/

Void Linux устанавливается в btrfs-раздел без использования подтомов, тогда как Timeshift нацелен на их использование в стиле Ubuntu, когда система размещена в подтоме @, а /home в подтоме @home. Для соблюдения этих условий необходимо:

  1. загрузиться с live-флэшки, например voidlinux
  2. примонтировать системный раздел к, например, /mnt/3:
    $ sudo mkdir /mnt/3
    $ sudo mount /dev/sda3 /mnt/3
  3. создать здесь снимок корня в подтом с названием @:
    $ sudo btrfs subvolume snapshot /mnt/3 /mnt/3/@
  4. удалить содержимое корневого тома, кроме подтома @:
    $ cd /mnt/3
    $ sudo find -maxdepth 1 ! -name @ -exec rm -rf {} \;
  5. в файле /mnt/3/@/etc/fstab, в строке монтирования системного раздела, после defaults через запятую, добавить опцию [email protected] (здесь приведён результат работы через vi):
    $ sudo vi /mnt/3/@/etc/fstab
    UUID=b8d4b8a5-0392-41e4-ad14-1255f12321b6 / btrfs defaults,[email protected] 0 1
  6. примонтировать к /mnt/@ только что созданный подтом @:
    $ sudo mkdir /mnt/@
    $ sudo mount -o [email protected] /dev/sda3 /mnt/@
  7. делаем chroot в /mnt/@ и обновляем загрузчик установленной системы:
    $ sudo mount -t proc /proc /mnt/@/proc
    $ sudo mount --bind /dev /mnt/@/dev
    $ sudo mount --bind /sys /mnt/@/sys
    $ sudo mount --bind /run /mnt/@/run
    $ sudo chroot /mnt/@ /bin/bash
    # update-grub
    # grub-install /dev/sda
    # exit
    $ sudo reboot

При наличии UEFI, перед выполнением chroot, необходимо дополнительно примонтировать efi-раздел, например:
sudo mount /dev/sda2 /mnt/@/boot/efi. И при установке загрузчика не указывать устройство: grub-install.

Если есть необходимость делать снэпшоты для /home, то повторяем вышеприведённые операции для соответствующего btrfs-раздела.

powertop

# xbps-install -Su powertop xset
# echo "powertop --auto-tune" >> /etc/rc.local

Добавление МФУ HP LaserJet Pro 200 MFP M276nw

SANE - Void Linux Wiki
Установил необходимые пакеты:

# xbps-install -Su sane xsane simple-scan hplip gnupg

Запустил процедуру установки МФУ:

# hp-setup -i 192.168.120.10

Добавил в /etc/sane.d/dll.conf строку hpaio:

# echo "hpaio" >> /etc/sane.d/dll.conf

Проверка сканера:

$ scanimage -L
device `hpaio:/net/HP_LaserJet_200_colorMFP_M276nw?ip=192.168.120.10' is a Hewlett-Packard HP_LaserJet_200_colorMFP_M276nw all-in-one

TeamViewer

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

# xbps-install -Su qt5-webkit qt5-quickcontrols

Скачиваем teamviewer for linux и распаковываем в, например, /opt. Запуск teamviewer производим под обычным пользователем $ /opt/teamviewer/teamviewer. В случае неудачи можем проверить наличие в системе требуемых библиотек $ /opt/teamviewer/tv-setup checklibs.

Прочее

Настройку NetworkManager, Tint2 и прочее здесь описывать не буду.