Вместо предисловия
NixOS - самобытный дистрибутив Linux, построенный на базе одноименного менеджера пакетов Nix, использующего собственный функциональный язык программирования. NixOS применяет базовые принципы Nix ко всей системе. Прежде всего - это управление зависимостями (при обновлении пакета менеджер следит за обновлением всех его зависимостей), а поскольку пакеты в NixOS хранятся изолированно друг от друга, то допускается использование разных версий одного и того же пакета на одной рабочей станции, при этом каждая версия пакета будет использовать свои версии зависимостей. Такой подход позволяет легко воспроизводить систему, выполнять атомарные обновления и откаты. Помимо самой системы Nix контролирует пользовательскую среду. Единственный нюанс, который может вызывать вопросы - это синтаксис функционального языка NixOS; можно было не "изобретать велосипед", а предложить пользователю уже готовое решение на базе любого популярного варианта.
Qtile - тайловый оконный менеджер, который написан на языке программирования Python. Это небольшая, простая и легко расширяемая среда, которая позволяет пользователю писать свои собственные команды, виджеты, встраиваемые модули. Общепринято считать, что qtile - оконный менеджер, который написан программистами для программистов.
Установка базовой системы
- Качаем minimal ISO image NixOS с официального сайта любым удобным для вас способом.
- Готовим загрузочный диск, опять же любым удобным для вас способом. Мне симпатизирует ventoy, статья про который есть на нашем сайте: https://pingvinus.ru/program/ventoy
- Необходимо определиться с типом установки… О чем это я? choice постоянно ругает меня за выбор legacy mode, поэтому выбора никакого не будет: uefi и точка! Пришлось поменять настройки виртуальной машины ради такого случая.
- Загружаемся с live-образа NixOS и следуем шагам установки системы. В документации NixOS manual все подробно расписано. Установка крайне простая и не вызовет сложностей. Далее, пошагово покажу этапы установки системы из консоли.
- После загрузки live-образа NixOS, откроется консоль tty с уже авторизованным дефолтным пользователем (nixos), ожидая ввода команд. Для выполнения основных операций по подготовке файловой системы и установке NixOS потребуются привилегированные права, для этого просто введите команду: < sudo -i >. Первым делом необходимо подготовить дисковое пространство. В примере используется утилита fdisk, с помощью которой создаем таблицу разделов GPT, загрузочный EFI-раздел и основной раздел Linux. Все команды представлены на скриншоте:
- Форматируем созданные разделы и монтируем их. Генерируем файл конфигурации будущей системы. Открываем его для редактирования. Все команды — на скриншоте ниже:
- По-минимуму редактируем файл конфигурации, как показано на скриншоте ниже (обязательно раскомментируйте строку «networking.networkmanager.enable = true;» и, при необходимости, строку включения беспроводной сети) и запускаем скрипт установки системы NixOS:
- В конце установки, если все прошло успешно, появится запрос на изменение пароля root и можно перезагружать систему:
- Авторизуемся после загрузки под root, добавляем пользователя системы и устанавливаем для него пароль:
# >> useradd -m as
# >> passwd as
> пароль
> подтверждаем пароль
#
- Открываем файл конфигурации < nano /etc/nixos/configuration.nix > и редактируем его. По окончании, — сохраняем файл и запускаем команду сборки системы с новыми параметрами:
- Перезагружаем систему и, вас уже встречает знакомый менеджер дисплея lightdm, после авторизации в котором откроется графическая среда qtile с дефолтным конфигом.
Настройка Qtile
- Файл конфигурации qtile по-умолчанию загружен в каталог пользователя: < ~/.config/qtile/config.py >. Его и будем редактировать. Открываем в редакторе и добавляем в него необходимые системные параметры и определения:
import os
import subprocess
from subprocess import Popen
from libqtile import hook
from pathlib import Path
- Добавим определения путей основных файлов конфигурации (если этого не сделать, то python не поймет путей к скриптам, типа таких: ~/.config/qtile/autostart.sh и они просто не будут работать)
home = str(Path.home())
qconf = home + "/.config/qtile/"
astart = qconf + "autostart.sh"
- Добавим переключение раскладок клавиатуры по нажатию комбинации клавиш [win] + [space] в секцию конфигурации keys
Key([mod], "space", lazy.widget["keyboardlayout"].next_keyboard(), desc="Next keyboard layout"),
- В секции groups можно настроить действие при перемещении окна приложения на другой рабочий стол. По умолчанию, фокус переместится вместе с окном на новый рабочий стол, но можно оставить фокус неизменным на том рабочем столе, с которого производилась операция. Для этого нужно закомментировать одни строки конфигурации и раскомментировать другие, как показано ниже:
# mod1 + shift + letter of group = switch to & move focused window to group
# Key(
# [mod, "shift"],
# i.name,
# lazy.window.togroup(i.name, switch_group=True),
# desc="Switch to & move focused window to group {}".format(i.name),
# ),
Key([mod, "shift"], i.name, lazy.window.togroup(i.name),
desc="move focused window to group {}".format(i.name)),
- Добавим свою тему для оформления рамок и выберем схему расположения окон на экране. Для этого добавим секцию layout_theme и модифицируем секцию layouts:
layout_theme = {
"border_width": 2,
"margin": 5,
"border_focus": "8ABEB7",
"border_normal": "555555",
}
layouts = [
# layout.Columns(border_focus_stack=["#d75f5f", "#8f3d3d"], border_width=4),
# layout.Max(),
# Try more layouts by unleashing below layouts.
# layout.Stack(num_stacks=2),
# layout.Bsp(),
# layout.Matrix(),
layout.MonadTall(**layout_theme),
# layout.MonadWide(),
# layout.RatioTile(),
# layout.Tile(),
# layout.TreeTab(),
# layout.VerticalTile(),
# layout.Zoomy(),
]
- Меняем шрифт виджетов панели на свой:
widget_defaults = dict(
font="Noto Sans SemiBold",
fontsize=14,
padding=5,
)
- Меняем положение панели с нижнего на верхнее и и определяем свой состав, содержание и оформление виджетов:
screens = [
Screen(
top=bar.Bar(
[
widget.GroupBox(),
widget.Sep(
padding=10,
linewidth=5,
size_percent=50,
),
widget.Prompt(),
widget.WindowName(),
widget.Chord(
chords_colors={
"launch": ("#ff0000", "#ffffff"),
},
name_transform=lambda name: name.upper(),
),
widget.OpenWeather(
location='Moscow',
format='{location_city}> {main_temp}°{units_temperature} {humidity}% {icon}',
language='ru',
),
widget.Spacer(),
widget.KeyboardLayout(configured_keyboards=['us','ru']),
widget.Sep(
padding=10,
linewidth=3,
size_percent=10,
),
widget.PulseVolume(),
widget.Sep(
padding=10,
linewidth=3,
size_percent=10,
),
widget.Systray(),
widget.Clock(format="%d-%b %p %a %p %H:%M"),
widget.Sep(
padding=10,
linewidth=3,
size_percent=10,
),
widget.QuickExit(
default_text=' ',
countdown_start=2,
),
],
32,
border_width=[2, 2, 2, 2],
border_color=["555555", "000000", "555555", "000000"]
),
),
]
- Прописываем хук для запуска скрипта автостарта и на этом заканчиваем редактирование и сохраняем файл:
@hook.subscribe.startup_once
def autostart():
Popen([astart])
- Создаем скрипт автозапуска < ~/.config/qtile/autostart.sh > следующего содержания:
#!/bin/sh
#xrandr --output Virtual-1 --mode 1920x1080
nitrogen --restore &
picom &
xautolock -time 10 -locker "~/.config/qtile/lock.sh" &
- Делаем его исполняемым:
$ >> chmod +x ~/.config/qtile/autostart.sh
Для указания qtile использовать правильную конфигурацию экрана, раскомментируйте строку xrandr... в скрипте автозапуска, поменяв в ней параметры для своего экрана! Эти настройки можно применить глобально, не прописывая их в скрипт автозапуска. В таком случае окно менеджера дисплея lightdm будет использовать их, также как и рабочий стол qtile:
Сначала определим параметры экрана, выполнив следующую команду:
$ >> xrandr -q
Создадим файл конфигурации /etc/X11/xorg.conf.d/52-resolution-fix.conf
------------------------------------------
Section "Monitor"
Identifier "Virtual-1"
Option "PreferredMode" "1920x1080"
Option "Primary" "1"
EndSection
------------------------------------------
- Практически все готово, осталось только скачать свою обоину, задать ее в настройках nitrogen ( помним, что в qtile вызвать программу можно сочетанием клавиш [win] + [r] и набрав ее после двоеточия: nitrogen). Для использования красивой блокировки экрана пакетом i3lock-color, можно скачать со страницы разработчика готовый скрипт lock.sh, переместить файл в директорию конфигурации qtile (~/.config/qtile), сделав файл исполняемым (chmod +x ~/.config/qtile/lock.sh). Композитор picom в данном примере я не настраивал, так как на виртуальной машине будут сильные фризы; в реальности можно (и нужно) скачать конфигурационный файл по-умолчанию со страницы разработчика picom.sample.conf и скопировать его в новую директорию с новым именем по адресу: < ~/.config/picom/picom.conf >. Далее остается только его настроить по своему желанию (прозрачность окон, оформление углов, различные графические эффекты...) Перезагружаемся и в итоге… брюки превращаются… брюки превращаются…
Если что-то пошло не так, сделали ошибку в синтаксисе конфигурации qtile (пропустили кавычку, не закрыли скобку, неправильно указали переменные и т.д и т.п.), - при загрузке системы будет использоваться конфиг-файл по-умолчанию; по внешнему виду рабочего стола сразу поймете.
В принципе это все, что хотел рассказать про установку NixOS, начальную настройку и конфигурацию графического окружения Qtile. Ничего сложного в этом нет, система вообще ставится очень быстро, а настройка qtile может быть полезна с точки зрения практики с python, + сам менеджер очень простой и легко поддается конфигурации (к тому же есть поддержка wayland). В качестве послесловия добавлю несколько пользовательских команд для управления и обслуживания NixOS:
Любое изменение конфигурационного файла configuration.nix должно заканчиваться командой:
# >> nixos-rebuild switch
* если будут ошибки, система об этом предупредит, протестировать можно набрав test вместо switch
Очистка всех старых конфигураций, кроме текущей:
# >> nix-env --delete-generations old
Поиск "мусора" и полная его очистка:
# >> nix-collect-garbage -d
Глобальное обновление системы:
# >> nixos-rebuild switch --upgrade
Комментарии
11:13
12:57
Ставил я никсос попробовать. Ничего так. Пакетный менеджер примечательный. Но места требует порядочно.
14:25
12:37
11:35
13:27
Да, мне WMы тоже по душе. Тем более, что вкупе с SSD, дополнительными планками RAM и лёгкой ОС (linux) они позволяют возродить практически умершее допотопное железо. Пользуюсь IceWM на Fedora, Enlightenment на OpenSUSE и i3wm на Manjaro. Весьма доволен! :)
14:19
16:57
services.xserver.displayManager.lightdm.enable = true;
17:27
17:30
https://search.nixos.org/options?channel=unstable&show=services.xserver.displayManager.lightdm.enable&from=0&size=50&sort=relevance&type=packages&query=lightdm
18:27
Сейчас он включается при включении опции
services.xserver.enable = true
18:32
https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/x11/xserver.nix
00:08
09:30
12:41
Почему установка на виртуальную машину?
Тем более: "так как на виртуальной машине будут сильные фризы".
qtile показался сложным (мне) уже на уровне чтения обзоров. Вероятно, из-за фразы "написан программистами для программистов".
13:01
Qtile вполне съедобен и совсем несложный. Для меня гораздо муторнее ковыряться в конфигах какого-нибудь rofi или polybar. У qtile свой бар, не так кастомизируемый конечно. И там все на python, что в этом пугающего?
13:04
13:07