В этой статье мы рассмотрим, как устранить ошибку “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вместо правильного удаления символической ссылки вручную.
Пошаговое решение
- Определите расположение unit-файла и проверьте, что это символическая ссылка
Выполните команду:systemctl status <имя_юнита>.serviceВ разделе «Loaded» вы увидите путь к unit-файлу. Если рядом с ним указано “(symlink)”, значит, это символическая ссылка.
ls -l /etc/systemd/system/<имя_юнита>.serviceЭта команда покажет, куда именно указывает symlink.
- Отключите unit с помощью systemctl (если он ещё не отключён)
sudo systemctl disable <имя_юнита>.serviceЭта команда удалит symlink, созданный при включении сервиса. Если unit-файл всё ещё существует, переходите к следующему шагу.
- Удалите ошибочный 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. - Проверьте наличие других символических ссылок на юниты
Просмотрите все symlink’и в директории:
ls -l /etc/systemd/system/ | grep '^l'Удаляйте только те ссылки, которые точно не нужны или были созданы ошибочно. Если сомневаетесь — обратитесь к документации сервиса или задайте вопрос сообществу.
- Перезагрузите 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” и как её безопасно устранить.