LinuxFAQ.ru

Refusing to operate on linked unit — устранение ошибки и удаление symlink-юнитов

В этой статье мы рассмотрим, как устранить ошибку “Refusing to operate on linked unit” в Linux при работе с systemd unit-файлами. Если вы столкнулись с проблемой невозможности удалить или изменить сервис, связанный через символическую ссылку (symlink), это руководство поможет как новичкам, так и администраторам среднего уровня быстро решить проблему.

Почему появляется ошибка “refusing to operate on linked unit”

  • Попытка удалить или изменить unit-файл, который является символической ссылкой, а не обычным файлом.
  • Работа с системными сервисами через systemctl или user-команды без учёта реального расположения unit-файлов.
  • Некорректное ручное удаление или изменение unit-файлов без учёта зависимости от symlink.
  • Использование systemctl disable <unit>.service вместо правильного удаления символической ссылки вручную.

Пошаговое решение

  1. Определите расположение unit-файла и проверьте, что это символическая ссылка
    Выполните команду:

    systemctl status <имя_юнита>.service

    В разделе «Loaded» вы увидите путь к unit-файлу. Если рядом с ним указано “(symlink)”, значит, это символическая ссылка.

    ls -l /etc/systemd/system/<имя_юнита>.service

    Эта команда покажет, куда именно указывает symlink.

  2. Отключите unit с помощью systemctl (если он ещё не отключён)

    sudo systemctl disable <имя_юнита>.service

    Эта команда удалит symlink, созданный при включении сервиса. Если unit-файл всё ещё существует, переходите к следующему шагу.

  3. Удалите ошибочный symlink вручную

    Внимание: Не используйте rm -rf без крайней необходимости. Сначала убедитесь, что файл — именно символическая ссылка:

    ls -l /etc/systemd/system/<имя_юнита>.service

    Если вывод начинается с буквы l (например, lrwxrwxrwx), это значит, что файл является symlink. Для удаления выполните:

    sudo rm /etc/systemd/system/<имя_юнита>.service

    Далее обновите конфигурацию systemd:

    sudo systemctl daemon-reload

    Важно: не удаляйте файлы из /lib/systemd/system или /usr/lib/systemd/system, если не уверены в последствиях. Обычно достаточно работать с файлами в /etc/systemd/system.

  4. Проверьте наличие других символических ссылок на юниты

    Просмотрите все symlink’и в директории:

    ls -l /etc/systemd/system/ | grep '^l'

    Удаляйте только те ссылки, которые точно не нужны или были созданы ошибочно. Если сомневаетесь — обратитесь к документации сервиса или задайте вопрос сообществу.

  5. Перезагрузите systemd и проверьте, исчезла ли ошибка

    sudo systemctl daemon-reload
    sudo systemctl reset-failed

    Эти команды обновят кэш systemd и сбросят статусы неудачных юнитов.

Альтернативные методы

  • Если symlink защищён (например, создан от имени root), убедитесь, что используете sudo для выполнения команд.
  • Если путь к unit-файлу необычный, найдите все symlink’и, связанные с юнитом, командой:
    sudo find /etc/systemd/system/ -lname '*<имя_юнита>*'

    Так вы обнаружите все символические ссылки на данный unit.

  • Если юнит был создан автоматически пакетом, удалите соответствующий пакет:
    sudo apt remove <имя_пакета>

    Для просмотра файлов пакета используйте:

    dpkg -L <имя_пакета>

    Это поможет понять, создаёт ли пакет нужный unit-файл.

Проверка результата

  • Убедитесь, что symlink удалён:

    ls -l /etc/systemd/system/<имя_юнита>.service

    Вы должны увидеть сообщение “No such file or directory”.

  • Проверьте статус unit’а:

    systemctl status <имя_юнита>.service

    Если systemd выдает, что unit не найден, значит проблема решена. Если ошибка осталась, повторно проверьте наличие других symlink.

Как избежать ошибки в будущем

  • Используйте команды systemctl enable и disable для управления сервисами, избегая ручного создания и удаления symlink.
  • Не редактируйте и не удаляйте напрямую файлы в /etc/systemd/system без понимания их роли.
  • Всегда выполняйте systemctl daemon-reload после изменений в unit-файлах.
  • Храните резервные копии ваших кастомных unit-файлов для восстановления в случае ошибок.

FAQ

Что произойдет, если случайно удалить основной unit-файл, а не symlink?
Сервис перестанет работать. В таком случае восстановите файл через переустановку соответствующего пакета или из резервной копии.

Обязательно ли запускать daemon-reload после удаления symlink?
Да, это необходимо, иначе systemd может не заметить изменения и продолжит работать с устаревшим кешем.

Как узнать, какой пакет создал unit-файл?
В Debian/Ubuntu используйте команду:

dpkg -S /etc/systemd/system/<имя_юнита>.service

Это поможет определить исходный пакет.

Теперь вы знаете, почему возникает ошибка “Refusing to operate on linked unit” и как её безопасно устранить.

Смотрите также

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

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

Свежие материалы