NixOS + Qtile. Установка системы и конфигурация рабочего окружения. Linux статьи
Написать статью
Войдите, чтобы писать статьи

NixOS + Qtile. Установка системы и конфигурация рабочего окружения

18

NixOS и Qtile

Материал написан пользователем сайта.

Вместо предисловия

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:
Кто будет ставить в legacy-mode, не забудьте раскомментировать и подправить строку установки загрузчика на ваш диск, типа "boot.loader.grub.device = "/dev/sda"; # (for BIOS systems only)"
  • В конце установки, если все прошло успешно, появится запрос на изменение пароля root и можно перезагружать систему:
# >> reboot
  • Авторизуемся после загрузки под root, добавляем пользователя системы и устанавливаем для него пароль:
# >> useradd -m as
# >> passwd as
   > пароль
   > подтверждаем пароль
#
  • Открываем файл конфигурации < nano /etc/nixos/configuration.nix > и редактируем его. По окончании, — сохраняем файл и запускаем команду сборки системы с новыми параметрами:
Добавлены только необходимые пакеты программ и шрифтов для простой установки и настройки оконного менеджера qtile. Желательно добавить строку: < programs.dconf.enable = true; >. Вообще можно добавить на ваш вкус и цвет все, что угодно. Поиск пакетов тут: https://search.nixos.org/packages
  • Перезагружаем систему и, вас уже встречает знакомый менеджер дисплея lightdm, после авторизации в котором откроется графическая среда qtile с дефолтным конфигом.
Выглядит простенько, разрешение экрана не соответствует нашему, на панели - выбор рабочих столов, кнопка выхода, да виджет часов и информация о том, что загружена конфигурация по-умолчанию. Вызов терминала осуществляется комбинацией клавиш [win] + [enter]. Вызов строки запуска программ - [win] + [r]. Не густо конечно, но жить можно.

Настройка 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 >. Далее остается только его настроить по своему желанию (прозрачность окон, оформление углов, различные графические эффекты...) Перезагружаемся и в итоге… брюки превращаются… брюки превращаются…
Для gtk-приложений потребуется настройка параметров; в качестве меню можно выбрать rofi, дополнив его пакетом иконок; уведомления - dunst; cliphist - клипборд ну и т.д. и т.п. Кто заинтересован в файловом менеджере (отличном от консольного ranger), например популярном thunar, установить его можно, добавив следующую строку в файл конфигурации configuration.nix >> programs.thunar.enable = true; Полная инструкция тут: https://nixos.wiki/wiki/Thunar

Если что-то пошло не так, сделали ошибку в синтаксисе конфигурации 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
Лайков: +18
войдите, чтобы ставить лайки
18
  • Опубликовано: 22.02.2024
  • scorpii

Комментарии

igorborisov
Активный пользователь
Активный
22.02.2024
11:13
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+1
войдите, чтобы ставить лайки
Скоро будут дистрибутивы, где придется свой оконный менеджер с нуля писать, а вместо файла конфигурации будет dockerfile
alexal9
Активный пользователь
Активный
22.02.2024
12:57
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+2
войдите, чтобы ставить лайки
УРА!!! Автор scorpii ! А то прочитал заголовок, думал: "Опять ВАНТИКИ..." (это шутка, если что. Как по мне, пускай пишет. ;) )
Ставил я никсос попробовать. Ничего так. Пакетный менеджер примечательный. Но места требует порядочно.
vantiki
Активный пользователь
Активный
22.02.2024
14:25
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийalexal9Родительский комментарий
+2
войдите, чтобы ставить лайки
Согласен, тоже этот Вантики поднадоел, давайте новых авторов! Ни дня покоя :)
LexD
Активный пользователь
Активный
24.02.2024
12:37
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийvantikiРодительский комментарий
0
войдите, чтобы ставить лайки
Что так набросились? Пусть пишет, вполне читабельно. И информативно.
scorpii
Активный пользователь
Активный
24.02.2024
11:35
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийalexal9Родительский комментарий
+1
войдите, чтобы ставить лайки
Согласен, места "жрет" много. По началу даже обиделся на него, когда выделенные 20Гиб в виртуалке, как для всех, закончились на этапе сборки системы с моими дот-файлами hyprland. Уже потом отдал "зверюге" в 2 раза больше и дело пошло. Далее пришлось попотеть, решая проблему вывода на экран, функциональный язык Никс тот ещё "товарищ". Но все это не отпугнуло меня от тестов и появилась данная статья. Кстати qtile очень нравится и система с ним все ещё жива и активно тестируется мной.
alexal9
Активный пользователь
Активный
24.02.2024
13:27
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
+1
войдите, чтобы ставить лайки
"...очень нравится..."
Да, мне WMы тоже по душе. Тем более, что вкупе с SSD, дополнительными планками RAM и лёгкой ОС (linux) они позволяют возродить практически умершее допотопное железо. Пользуюсь IceWM на Fedora, Enlightenment на OpenSUSE и i3wm на Manjaro. Весьма доволен! :)
vantiki
Активный пользователь
Активный
22.02.2024
14:19
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+2
войдите, чтобы ставить лайки
Спасибо, интересно было почитать. За настройку Qtile особенно, давно хочу его попробовать, да вот руки всё не дойдут. NixOS тоже интересно, надо бы углубиться в него, да попробовать что да как. Уверен, не зря его все так любят, есть за что несомненно.
Evg197
Активный пользователь
Активный
22.02.2024
16:57
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
Извините за занудство, а откуда у вас lightdm появился? Его же нужно в configuration.nix прописать:
services.xserver.displayManager.lightdm.enable = true;
xKDE
Активный пользователь
Активный
22.02.2024
17:27
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийEvg197Родительский комментарий
0
войдите, чтобы ставить лайки
В никсе lightdm по умолчанию, а вот если захотите отличный от него (gdm, например), то да, нужно явно прописать.
Evg197
Активный пользователь
Активный
22.02.2024
17:30
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийxKDEРодительский комментарий
0
войдите, чтобы ставить лайки
По умолчанию он - false.

https://search.nixos.org/options?channel=unstable&show=services.xserver.displayManager.lightdm.enable&from=0&size=50&sort=relevance&type=packages&query=lightdm
scorpii
Активный пользователь
Активный
22.02.2024
18:27
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийEvg197Родительский комментарий
0
войдите, чтобы ставить лайки
да что Вы говорите? видимо у Вас устаревшая информация.
Сейчас он включается при включении опции
services.xserver.enable = true
scorpii
Активный пользователь
Активный
22.02.2024
18:32
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
ссыль на пакет xserver.nix, надеюсь найдете там строки, где включается lightdm:
https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/x11/xserver.nix
PedroAmor
Активный пользователь
Активный
23.02.2024
00:08
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
+2
войдите, чтобы ставить лайки
Никогда не буду это ставить, А за реальные труды жирн. +
QUWALENTNOST
23.02.2024
09:30
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
Такое чувство что тайловых становится всё больше и больше... Скоро и на вале,расте, и джаваскрипте появятся.
LexD
Активный пользователь
Активный
24.02.2024
12:41
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
Один вопрос.
Почему установка на виртуальную машину?
Тем более: "так как на виртуальной машине будут сильные фризы".

qtile показался сложным (мне) уже на уровне чтения обзоров. Вероятно, из-за фразы "написан программистами для программистов".
scorpii
Активный пользователь
Активный
24.02.2024
13:01
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийLexDРодительский комментарий
0
войдите, чтобы ставить лайки
Ну а где ещё тестировать? У меня места более нет. Под Арч всего 50Гиб смог отрезать. Если только снести Винду, ее и так уже урезал или удалять в ней софт, собранный за много лет и тогда появится ещё что забрать. А для тестов виртуалка вполне сойдёт, есть нюансы с видео конечно.

Qtile вполне съедобен и совсем несложный. Для меня гораздо муторнее ковыряться в конфигах какого-нибудь rofi или polybar. У qtile свой бар, не так кастомизируемый конечно. И там все на python, что в этом пугающего?
LexD
Активный пользователь
Активный
24.02.2024
13:04
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийscorpiiРодительский комментарий
0
войдите, чтобы ставить лайки
Я к тому, что это только тест, проба? Использовать ОС на постоянной основе не планируется?
scorpii
Активный пользователь
Активный
24.02.2024
13:07
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийLexDРодительский комментарий
0
войдите, чтобы ставить лайки
Нет, Никс не моя тема, для меня более интересен сам менеджер, с ним и развлекаюсь на базе никсос. Для меня в принципе не важно какая база, удобней и привычней конечно Арч или дебиан. А тут можно и то и другое пощупать в одном флаконе :))

Написать комментарий

Ваше имя:
Текст комментария:
  • Уважать других.
  • Не ругаться.
  • Без оскорблений.
  • Без грубости.
  • Не переходить на личности.
  • Писать на русском языке.
  • Без политики.
  • Без флуда.
Правила