Вопрос или проблема
Много информации, краткий вывод внизу
Я использую NixOS, и в стремлении сделать мою систему декларативной, я связал ~/.config/monitors.xml
с файлом, который храню в своей конфигурации, вот так:
systemd.tmpfiles.rules = [ "L /home/thomas/.config/monitors.xml - - - - ${pkgs.writeText "thomas_monitors.xml" "${builtins.readFile ./monitors.xml}"}" ];
Этот атрибут добавляет правило tmpfiles.d
для связывания /home/thomas/.config/monitors.xml
с файлом, хранящимся в хранилище Nix, содержащим содержимое <мой каталог конфигурации nixos>/monitors.xml
.
Однако, просматривая свой каталог .config
, я заметил, что monitors.xml
является обычным файлом, а не ссылкой.
Службы systemd-tmpfiles-setup.service
и systemd-tmpfiles-clean.service
запускаются при каждой загрузке согласно systemctl status
, так что я знаю, что они, должно быть, пытаются создать символическую ссылку, даже если она не создается.
Когда я сравниваю ~/.config/monitors.xml
с monitors.xml
в моей конфигурации, разницы нет, так что я думаю, что Gnome как-то обнаруживает, когда ссылка создана, и заменяет ее файлом, на который она ссылается?
Или, возможно, systemd-tmpfiles
не создает ссылку, и monitors.xml
, который там находится, создаётся Gnome и просто совпадает с тем, что я определил в моей конфигурации? Если это так, могу ли я каким-то образом заставить systemd-tmpfiles
создать эту ссылку?
У меня также есть два других правила tmpfiles.d
для monitors.xml
: одно для ссылки на /run/gdm/.config/monitors.xml
и другое для ссылки на /root/.config/monitors.xml
, которые оба работают корректно. Единственное, что не работает, это ~/.config
.
Также, /home/thomas
— это моя домашняя директория, так что /home/thomas/.config
— это ~/.config
. Я знаю, что это не является проблемой.
Краткий вывод:
Почему ~/.config/monitors.xml
не связана символической ссылкой с файлом, который я хочу? Gnome удаляет ссылку? Или, если systemd-tmpfiles
по какой-то причине не создает ссылку, как я могу его заставить это сделать?
Ответ или решение
Теория
Проблема, описанная в вашем вопросе, связана с использованием symlink (символической ссылки) для файла monitors.xml
в конфигурации NixOS. Вы настроили systemd.tmpfiles.rules
для создания symlink в вашей домашней директории ~/.config
, чтобы файл monitors.xml
использовался как из вашей NixOS конфигурации. Однако на практике вы обнаружили, что этот файл не представлен как ссылка, а является обычным файлом. Это создает ряд вопросов, касающихся компонентов системы, таких как systemd-tmpfiles
и DE (Desktop Environment), в данном случае Gnome.
Пример
Ваше текущее конфигурирование systemd.tmpfiles.rules
выглядит следующим образом:
systemd.tmpfiles.rules = [
"L /home/thomas/.config/monitors.xml - - - - ${pkgs.writeText "thomas_monitors.xml" "${builtins.readFile ./monitors.xml}"}"
];
Эта строка должна создать символическую ссылку от ~/.config/monitors.xml
к файлу, хранящемуся в Nix Store, который содержит ваш конфигурационный файл. Однако, при проверке, файл оказывается не символической ссылкой, а обычным файлом. В других местах система корректно обрабатывает такие ссылки, например, в /run/gdm/.config
и /root/.config
, что указывает на возможность специфического взаимодействия с ~/
.
Применение
Несколько теорий могут объяснить вашу ситуацию. Нужно рассмотреть их по отдельности, чтобы определить источник проблемы и предложить способы ее решения:
-
Gnome может переписывать файл: Gnome активно использует
monitors.xml
для управления конфигурацией дисплея. В зависимости от настроек и версий, возможно, что при старте или изменении конфигурации дисплея Gnome может генерировать свой собственныйmonitors.xml
и переписывать существующий файл, даже если он был символической ссылкой. -
Сценарий
systemd-tmpfiles
: Этот компонент запускается при старте системы и отвечает за создание временных файлов и символических ссылок на основе правил. Вы можете вручную проверить его работу, выполнив командуsystemd-tmpfiles --create
. Это может помочь выявить, происходит ли ошибка при создании symlink. Также можно проверить логиjournalctl
на наличие ошибок, связанных сsystemd-tmpfiles
. -
Проблемы с правами и доступом: Особое внимание стоит уделить правам доступа к файлу и директории
~/.config
. Процесс, создающий symlink, должен обладать соответствующими правами, чтобы осуществить запись. -
Поведение других сервисов: Убедитесь, что нет других сервисов или скриптов, работающих в вашей системе, которые могут интерферировать с процессами tmpfiles. Например, приложения и утилиты, которые настраивают или модифицируют графические параметры при старте или обновлении.
Способы решения
-
Использование dconf и GSettings: Проверить наличие настроек в dconf, которые могли бы определить поведение Gnome относительно
monitors.xml
. Вы можете воспользоватьсяdconf-editor
для просмотра и изменения таких настроек. -
Ручное вмешательство в процессы Gnome: Попробуйте заблокировать редактирование
monitors.xml
через настройки атрибутов файла, используяchattr
(если файловая система это поддерживает), чтобы обеспечить защиту от изменений приложения. -
Отладка systemd-tmpfiles: Создайте и протестируйте уменьшенный сценарий внутри
tmpfiles
, который обрабатывает толькоmonitors.xml
, для облегчения поиска ошибки. Также полезно прописать отладочные сообщения в конфигурации systemd для большего понимания.
Таким образом, системный анализ и диагностика являются ключевыми элементами в решении проблемы с использованием symlink для такого важного файла конфигурации в NixOS и Gnome. Рассматривая эти аспекты, вы сможете найти точку отказа в цепочке и исправить возникшую проблему, обеспечив тем самым бесперебойную работу вашего рабочего окружения.