Как жить на Ubuntu без программ: пример с Nix и установкой Emacs
Так уж получилось, что, вроде бы, в последних выпусках ядра Linux или в каком-то другом компоненте что-то сломали, из-за чего на последней Fedora с Intel HD 4000 производительность графики просто отвратительная. Мне было влом разбираться, из-за чего такая регрессия на вполне известном старом железе (Thinkpad X230) и поэтому опытным путём было выяснено, что на Ubuntu 20.04 всё в порядке — на ней сейчас и пытаюсь жить.
Я избегаю использование LTS-дистрибутивов на рабочем железе, т.к. понятия не имею, откуда брать для них программы. Для Fedora это практически не является проблемой, т.к. инструменты разработки там поддерживаются хорошо и всё нужное можно найти в основных (или не очень, вроде полуофициального RPM Fusion) репозиториях. С Ubuntu это не так: из-за заморозки пакетов, пожалуйста, ешь устаревшие программы и на каждый чих подключай дополнительный репозиторий/PPA, что на самом деле не очень вариант, т.к. они не всегда есть, а если и есть — поддерживаются какими-то левыми людьми (что не плохо само по себе, просто не ясно, как долго и как качественно оно будет поддерживаться).
Ubuntu неплохой дистрибутив, но управление пакетами с помощью Apt — последнее, чем мне бы хотелось заниматься. Слава Богиням, практически все графические программы поставляются в виде Flatpak/Snap/AppImage, чего не сказать о CLI, демонах и средствах разработки. Но и тут повезло: и эту нишу закрывает ещё один пакетный менеджер — Nix, не заставляя устанавливать целую NixOS, разработчики которой сами признают, что оно пока непригодно для десктопа. Nix прекрасен: опакечено и собрано всё на свете, а чего нет — скорее всего присутствует в оверлеях (практически как в Gentoo!).
Установка буквально в одну команду (в этом примере для единственного пользователя):
sh <(curl -L https://nixos.org/nix/install) --no-daemon
Что нам сразу установит Nix с нестабильным каналом пакетов.
А чтобы не возиться с nix-env -Ai package
вручную, есть Nix Home Manager:
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
nix-channel --update home-manager
nix-shell '<home-manager>' -A install`
После установки которого у нас в $HOME/.config/nixpkgs/home.nix
появляется нечто похожее на configuration.nix
из NixOS, где можно централизованно описать состояние своей домашней директории. Моя свежеустановленная конфигурация выглядит так:
{ config, pkgs, ... }:
let
nixGLIntel = (pkgs.callPackage "${builtins.fetchTarball {
url = https://github.com/guibou/nixGL/archive/master.tar.gz;
}}/nixGL.nix" {}).nixGLIntel;
pkgsNixOS = import <nixos> {};
in
{
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
home.packages = with pkgs; [
youtube-dl
fd
ripgrep
docker-compose
# emacs
];
programs.mpv = {
enable = true;
package =
pkgs.writeShellScriptBin "mpv" ''
#!/bin/sh
${nixGLIntel}/bin/nixGLIntel ${pkgs.mpv}/bin/mpv "$@"
'';
};
programs.emacs = {
enable = true;
package = pkgsNixOS.emacsPgtkGcc;
};
services.syncthing.enable = true;
# Home Manager needs a bit of information about you and the
# paths it should manage.
home.username = "commagray";
home.homeDirectory = "/home/commagray";
# This value determines the Home Manager release that your
# configuration is compatible with. This helps avoid breakage
# when a new Home Manager release introduces backwards
# incompatible changes.
#
# You can update Home Manager without changing this value. See
# the Home Manager release notes for a list of state version
# changes in each release.
home.stateVersion = "21.05";
}
В ней можно отметить несколько моментов.
- Наличие nixGL. К сожалению, Nix всё ещё плохо работает с программами, которым нужно графическое ускорение. Этот небольшой враппер чинит GPU-ускорение, позволяя программам, вроде mpv, корректно использовать GPU и VA-API.
- Странный пакет Emacs под названием emacsPgtkGcc. PGTK и native-comp — это патчи для Emacs, превращающие Emacs в правильную GTK-программу и включающие компилирование Elisp-кода в натив с помощью libgccjit. Мой выбор пал на Nix именно из-за того, что с помощью него можно легко установить данный патчсет, даже ничего не компилируя.
- Установите Cachix — с помощью этой программы можно указать адрес кэша уже собранных Nix-пакетов.
nix-env -iA cachix -f https://cachix.org/api/v1/install
- Добавьте оверлей для Emacs, где хэш — последний удачно собранный коммит.
- Включите нужные репозитории с кэшем пакетов для оверлея.
cachix use nix-community
cachix use mjlbach
- После очередного
home-manager switch
у вас появится Emacs. - Для отображения ярлыков в меню добавьте
export XDG_DATA_DIRS="$HOME/.nix-profile/share:$XDG_DATA_DIRS"
в свой$HOME/.profile
.
- Установите Cachix — с помощью этой программы можно указать адрес кэша уже собранных Nix-пакетов.
commagray@Cloudsdale:~$ cat ~/.config/nixpkgs/overlays/emacs.nix
import (builtins.fetchTarball {
url = https://github.com/nix-community/emacs-overlay/archive/2438466b9a4f496191838457d208c09ebbe97991.tar.gz;
})
- Сервис Syncthing. Home Manager умный и умеет управлять systemd-юнитами. Список поддерживаемых демонов тут.
- Home Manager умеет управлять настройками отдельных программ. Список поддерживаемых программ тут.
В таком виде у меня практически девственно чистая Ubuntu, коротая вряд ли сломается из-за конфликта установленных пакетов. Такой способ сработает со всеми дистрибутивами и даже macOS. Пользоваться приятно, не говоря уже о таких великих вещах, как nix-shell
.
К чему я это всё вообще пишу? Управление программами в Linux в заднице, но компромиссные варианты вроде Flatpak и Nix упрощают жизнь.