Gnome 47 не уважает symlinked monitors.xml

Вопрос или проблема

Много информации, краткий вывод внизу

Я использую 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, что указывает на возможность специфического взаимодействия с ~/.

Применение

Несколько теорий могут объяснить вашу ситуацию. Нужно рассмотреть их по отдельности, чтобы определить источник проблемы и предложить способы ее решения:

  1. Gnome может переписывать файл: Gnome активно использует monitors.xml для управления конфигурацией дисплея. В зависимости от настроек и версий, возможно, что при старте или изменении конфигурации дисплея Gnome может генерировать свой собственный monitors.xml и переписывать существующий файл, даже если он был символической ссылкой.

  2. Сценарий systemd-tmpfiles: Этот компонент запускается при старте системы и отвечает за создание временных файлов и символических ссылок на основе правил. Вы можете вручную проверить его работу, выполнив команду systemd-tmpfiles --create. Это может помочь выявить, происходит ли ошибка при создании symlink. Также можно проверить логи journalctl на наличие ошибок, связанных с systemd-tmpfiles.

  3. Проблемы с правами и доступом: Особое внимание стоит уделить правам доступа к файлу и директории ~/.config. Процесс, создающий symlink, должен обладать соответствующими правами, чтобы осуществить запись.

  4. Поведение других сервисов: Убедитесь, что нет других сервисов или скриптов, работающих в вашей системе, которые могут интерферировать с процессами tmpfiles. Например, приложения и утилиты, которые настраивают или модифицируют графические параметры при старте или обновлении.

Способы решения

  1. Использование dconf и GSettings: Проверить наличие настроек в dconf, которые могли бы определить поведение Gnome относительно monitors.xml. Вы можете воспользоваться dconf-editor для просмотра и изменения таких настроек.

  2. Ручное вмешательство в процессы Gnome: Попробуйте заблокировать редактирование monitors.xml через настройки атрибутов файла, используя chattr (если файловая система это поддерживает), чтобы обеспечить защиту от изменений приложения.

  3. Отладка systemd-tmpfiles: Создайте и протестируйте уменьшенный сценарий внутри tmpfiles, который обрабатывает только monitors.xml, для облегчения поиска ошибки. Также полезно прописать отладочные сообщения в конфигурации systemd для большего понимания.

Таким образом, системный анализ и диагностика являются ключевыми элементами в решении проблемы с использованием symlink для такого важного файла конфигурации в NixOS и Gnome. Рассматривая эти аспекты, вы сможете найти точку отказа в цепочке и исправить возникшую проблему, обеспечив тем самым бесперебойную работу вашего рабочего окружения.

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

Капча загружается...