Так уж получилось, что, вроде бы, в последних выпусках ядра 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 nixos.org/nix/install) --no-daemon


Что нам сразу установит Nix с нестабильным каналом пакетов.


А чтобы не возиться с nix-env -Ai package вручную, есть Nix 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 = 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-пакетов.


    • Добавьте оверлей для 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.




commagray@Cloudsdale:~$ cat ~/.config/nixpkgs/overlays/emacs.nix 
import (builtins.fetchTarball {
url = github.com/nix-community/emacs-overlay/archive/...;
})



В таком виде у меня практически девственно чистая Ubuntu, коротая вряд ли сломается из-за конфликта установленных пакетов. Такой способ сработает со всеми дистрибутивами и даже macOS. Пользоваться приятно, не говоря уже о таких великих вещах, как nix-shell.


К чему я это всё вообще пишу? Управление программами в Linux в заднице, но компромиссные варианты вроде Flatpak и Nix упрощают жизнь.









 , , , ,






URL записи