Настройка monitors.xml в NixOS: Почему Gnome игнорирует симлинки и как это исправить

Вы когда-нибудь сталкивались с тем, что ваши аккуратно настроенные симлинки внезапно превращаются в обычные файлы? В NixOS это особенно раздражает, ведь вся идея декларативности – держать контроль над конфигурацией. Давайте разберёмся, почему Gnome может “перебивать” ваш monitors.xml и как заставить systemd-tmpfiles работать так, как нужно.

Почему симлинк не создаётся, хотя службы systemd запускаются

Сначала кажется, что всё настроено правильно: файл monitors.xml добавлен через systemd.tmpfiles.rules, службы systemd-tmpfiles-setup и systemd-tmpfiles-clean активны. Но при проверке вместо символической ссылки в ~/.config/ лежит обычный файл. В чём подвох?

Основная причина – разница между правилами L и L+ в systemd-tmpfiles.

  • L создаёт симлинк только если файла нет в целевой папке.
  • L+ принудительно заменяет существующий файл на ссылку (даже если он уже есть).

Если Gnome (или другой компонент) создаёт monitors.xml раньше, чем срабатывает tmpfiles, правило с L просто проигнорируется. Отсюда и “обычный” файл вместо ссылки. Кстати, именно поэтому другие ваши правила для /run/gdm/ и /root/.config/ работают – там файлы изначально отсутствуют.

Проверьте журналы через journalctl -u systemd-tmpfiles-setup – если видите строку типа «File exists», проблема именно в этом.

Как заставить systemd-tmpfiles перезаписать файл

Решение требует минимальных изменений, но важно понять нюансы:

1. Замените L на L+ в правиле:

systemd.tmpfiles.rules = [ 
  "L+ /home/thomas/.config/monitors.xml - - - - ${pkgs.writeText "thomas_monitors.xml" "${builtins.readFile ./monitors.xml}"}"
];

Здесь L+ гарантирует, что файл будет заменён ссылкой при каждой загрузке, даже если Gnome уже успел его создать.

2. Проверьте порядок запуска служб. Иногда проблема возникает из-за того, что Gnome инициализирует мониторы раньше, чем выполняется tmpfiles. Попробуйте:

systemd.services.systemd-tmpfiles-setup.before = [ "display-manager.service" ];

Это заставит tmpfiles отработать до запуска графической оболочки.

3. Убедитесь, что права совпадают. Если monitors.xml создаётся с особыми правами (например, от пользователя gdm), добавьте соответствующие параметры в правило:

"L+ /home/thomas/.config/monitors.xml thomas users - - ${...}"

(где thomas – пользователь, users – группа).

Совет: если после изменений файл всё равно не становится ссылкой, удалите его вручную и перезагрузитесь. Это поможет проверить, не блокирует ли его какой-то процесс.

Дополнительные тонкости: когда Gnome всё портит

Даже после всех настроек может возникнуть ситуация, когда Gnome перезаписывает monitors.xml после создания симлинка. Такое случается, например, при изменении разрешения через настройки или подключении нового монитора.

Что делать:

  • Отключите автообновление monitors.xml в Gnome через dconf-editor (ключ /org/gnome/desktop/display/auto-monitors).
  • Используйте incron или inotifywait для отслеживания изменений файла и автоматического восстановления ссылки.
  • Если вариант выше слишком сложен, просто добавьте скрипт восстановления в автозагрузку:
ln -sf ${pkgs.writeText "..."} ~/.config/monitors.xml

Кстати, не путайте monitors.xml с xorg.conf – первый относится именно к Gnome и может не влиять на другие окружения. Если используете Wayland, проверьте актуальность методов (там логика работы с мониторами меняется).

И последнее: если вы вдруг заметили, что файл monitors.xml всё равно “не слушается”, проверьте – а тот ли путь указан в правиле? Случайный пробел или опечатка в имени пользователя (например, /home/tomas вместо /home/thomas) сведут все усилия на нет.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное