Ошибка «su файл занят»: почему возникает и как её устранить

Ошибка su: файл занят (в английской локали — device or resource busy либо text file busy) появляется при попытке заменить, удалить или перезаписать исполняемый файл su, который в этот момент используется запущенным процессом. Чаще всего с ней сталкиваются при обновлении бинарника суперпользователя на Android-устройстве с root-доступом или при ручной правке системных файлов в Linux. Пока хотя бы один процесс держит файл открытым или выполняет его, ядро блокирует запись — это штатный защитный механизм, а не признак поломки.

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

Почему система сообщает, что файл su занят

Ядро Linux не позволяет изменять исполняемый файл, пока он загружен в память как работающая программа или открыт другим процессом. Это касается и бинарника su, который на рутированном Android постоянно задействован фоновыми службами: демоном суперпользователя, приложениями с root-правами, скриптами инициализации.

Типичные ситуации, приводящие к ошибке:

  • 🔒 Запущенный демон su — фоновый процесс суперпользователя удерживает бинарник в памяти, и любая попытка перезаписи блокируется ядром.
  • 📱 Активное приложение с root-доступом — файловый менеджер, терминал или твикер выполняет команду через su прямо в момент замены файла.
  • 🛡️ Системный монт в режиме только для чтения — раздел /system или /system/xbin смонтирован как ro, и запись невозможна независимо от занятости файла.
  • ⚙️ Ограничения SELinux — принудительный режим (enforcing) запрещает изменение системных исполняемых файлов даже при наличии root-прав.

Важно различать две похожие ошибки. Сообщение text file busy (код ETXTBSY) означает именно выполнение файла процессом, а device or resource busy (EBUSY) чаще указывает на занятую точку монтирования или открытый дескриптор. Диагностика в обоих случаях схожая, но второй вариант иногда требует перемонтирования раздела.

Как определить, какой процесс удерживает файл

Прежде чем что-либо менять, нужно выяснить, кто именно держит бинарник. Для этого в Linux и Android (через эмулятор терминала или adb shell) есть штатные инструменты. Работать с ними безопасно — команды только читают информацию о процессах.

Основная команда для поиска процессов, открывших файл:

fuser -v /system/xbin/su

Путь может отличаться в зависимости от устройства и способа получения root: встречаются варианты /system/bin/su, /system/xbin/su, /sbin/su или расположение внутри структуры менеджера root-доступа. Уточнить фактическое расположение помогает команда which su, выполненная в терминале с правами суперпользователя.

Если утилита fuser недоступна (на «голом» Android её часто нет), альтернативой служит просмотр открытых дескрипторов через lsof либо ручной поиск по каталогу /proc. Также полезно проверить список процессов командой ps и найти в нём демоны с упоминанием su или daemonsu.

Безопасный порядок действий при замене бинарника su

Универсального скрипта не существует: расположение файлов, названия демонов и структура разделов зависят от версии Android, прошивки и используемого решения для root (Magisk, SuperSU и их аналоги работают по-разному). Поэтому ниже — общий безопасный алгоритм, который нужно адаптировать под конкретное устройство по официальной документации вашего root-решения.

☑️ Порядок замены бинарника su

Выполнено: 0 / 6

Логика каждого шага такова. Сначала вы локализуете файл и выясняете, кто его использует — это исключает действия вслепую. Затем корректно останавливаете демон суперпользователя: у большинства менеджеров root есть штатный способ перезапуска службы, описанный в их документации. Грубое принудительное завершение через kill — крайняя мера, так как обрыв демона на полуслове может оставить систему без работающего root до перезагрузки.

Далее проверяется режим монтирования раздела. Если раздел смонтирован только для чтения, его необходимо перемонтировать с правом записи:

mount -o remount,rw /system
⚠️ Внимание: на современных версиях Android с динамическими разделами и механизмом AVB/dm-verity прямая запись в системный раздел может быть заблокирована на уровне загрузчика, а её принудительный обход способен нарушить целостность проверки и привести к невозможности загрузки устройства. Предпочтительный путь — использовать штатные механизмы обновления вашего root-решения, которые работают через systemless-подход и не изменяют системный раздел.

После успешной замены обязательно проверьте результат: выполните в терминале команду su -c id и убедитесь, что в ответ приходит строка с uid=0. Если ответа нет или появляется новая ошибка — немедленно верните резервную копию файла на место.

📊 В какой ситуации вы столкнулись с ошибкой «su файл занят»?
При обновлении бинарника su вручную
При работе root-приложения или скрипта
При прошивке или изменении системного раздела
В обычном Linux-дистрибутиве

Особенности ошибки в настольных Linux-дистрибутивах

В обычных дистрибутивах Linux бинарник su поставляется пакетом (как правило, из состава util-linux) и обновляется штатно через пакетный менеджер. Ошибка занятости здесь возникает реже и почти всегда означает, что в момент обновления или ручной замены файла кто-то выполняет su — например, открыта сессия с повышенными правами в другом терминале или работает скрипт.

Диагностика стандартная: fuser или lsof по пути /bin/su (либо /usr/bin/su — зависит от дистрибутива) покажут номера процессов. Завершите открытые su-сессии командой exit в соответствующих терминалах и повторите операцию. Если процесс завис и не завершается штатно, его можно завершить по PID, но сначала убедитесь, что это не критичная системная задача.

Отдельный случай — обновление пакета, содержащего su, через пакетный менеджер. Здесь не нужно ничего удалять вручную: менеджер пакетов сам корректно заменяет файлы. Если обновление прерывается ошибкой занятости, достаточно закрыть активные su-сессии и запустить обновление повторно.

Частые ошибки, которые усугубляют проблему

Пытаясь быстро избавиться от сообщения, пользователи нередко предпринимают действия, которые превращают легко решаемую ситуацию в потерю root-доступа или нестабильную систему. Ниже — то, чего делать не стоит.

ДействиеЧем грозитПравильная альтернатива
Принудительное удаление занятого suПотеря root-доступа до восстановления файлаСначала завершить процессы, потом заменять
Убийство всех процессов подряд через kill -9Зависание системы, повреждение данныхТочечное завершение по PID из fuser
Перезапись файла без резервной копииНевозможность отката при неудачеКопия исходника в пользовательский раздел
Игнорирование режима монтирования roПовторная ошибка записи, путаница в причинахПроверка mount и перемонтирование в rw
Отключение SELinux ради одной операцииСнижение защиты всей системыИспользование штатных механизмов root-решения
⚠️ Внимание: никогда не удаляйте бинарник su «чтобы потом поставить новый». Если установка нового файла по какой-то причине не завершится (сбой записи, разряд батареи, ошибка в скрипте), устройство останется без работающего суперпользователя, и восстановление может потребовать перепрошивки. Замену выполняйте атомарно: сначала положите новый файл рядом под другим именем, проверьте его, и только затем переименуйте.

Если ошибка возникает внутри root-приложения или скрипта

Иногда сообщение о занятом файле выдаёт не терминал, а приложение с root-правами — файловый менеджер, бэкап-утилита или скрипт автоматизации. В этом случае конфликт обычно происходит между самим приложением и демоном su: программа пытается модифицировать системный файл, который в этот момент обслуживает её же root-запросы.

Порядок действий здесь мягче. Закройте все приложения, которым выданы root-права, затем в настройках вашего менеджера root-доступа перезапустите его службу, если такая функция предусмотрена. После этого повторите операцию в одном приложении, не запуская параллельно другие root-инструменты. Одновременная работа двух программ, конкурирующих за один и тот же системный файл, — частый, но редко озвучиваемый источник ошибки.

Если ошибка воспроизводится стабильно при одном и том же действии, проверьте логи: на Android их можно посмотреть через logcat, в Linux — через journalctl или системный журнал. Записи рядом с моментом ошибки часто указывают конкретный процесс или запрет SELinux, который её вызвал.

Что означает код ETXTBSY и почему ядро блокирует запись

Код ошибки ETXTBSY («text file busy») возвращается системным вызовом, когда процесс пытается открыть на запись файл, который в данный момент выполняется как программа. Исторически «text» здесь означает сегмент кода исполняемого файла. Ядро удерживает страницы памяти работающей программы связанными с файлом на диске; если разрешить запись в этот файл, выполняющийся код изменится прямо во время работы, что привело бы к падению процесса или непредсказуемому поведению. Поэтому блокировка — осознанная мера защиты, и обходить её нужно через корректное завершение процесса, а не через обходные трюки.

Восстановление, если замена прошла неудачно

Если после манипуляций команда su перестала работать — не запускается, выдаёт ошибку сегментации или отказывает в правах, — первым делом верните резервную копию. Если копия сохранялась в пользовательском разделе, потребуется любой способ записи в системный раздел: работающий root из другого источника, кастомное рекавери (если оно установлено и поддерживает монтирование разделов) или перепрошивка root-решения заново.

Когда root утерян полностью и ни один способ записи недоступен, наиболее надёжный путь — повторная установка вашего root-решения по его официальной инструкции: для Magisk это, как правило, прошивка пропатченного образа загрузки, для других решений — их штатные процедуры. Конкретные шаги зависят от модели устройства и версии прошивки, поэтому сверяйтесь с документацией именно вашего устройства.

Часто задаваемые вопросы

Можно ли удалить занятый файл su принудительно?

Технически удаление (unlink) иногда возможно, даже когда запись заблокирована, но делать этого не стоит: запущенные процессы продолжат использовать старый файл из памяти, а новый root-доступ вы не получите до установки рабочего бинарника. Если установка сорвётся, устройство останется без su. Правильный путь — завершить удерживающие процессы и выполнить замену корректно.

Почему ошибка возникает сразу после перезагрузки?

Демон суперпользователя и root-приложения с автозапуском стартуют вместе с системой и сразу «захватывают» бинарник. Если вы заменяете su сразу после загрузки, дождитесь полного завершения автозапуска и закройте все приложения с root-правами перед операцией.

Ошибка «файл занят» и «только для чтения» — это одно и то же?

Нет. Read-only file system означает, что раздел смонтирован без права записи — решается перемонтированием в режим rw (если это позволяет конфигурация устройства). File busy означает, что файл используется процессом — решается завершением процесса. Возможна и комбинация обеих проблем, тогда устранять их нужно последовательно.

Как узнать точный путь к бинарнику su на моём устройстве?

Выполните в терминале команду which su от имени суперпользователя. Также можно проверить типичные расположения: /system/bin, /system/xbin, /sbin. У systemless-решений файл может находиться в виртуальной структуре, создаваемой менеджером root, — в этом случае ориентируйтесь на документацию вашего решения.

Поможет ли сброс устройства до заводских настроек?

Сброс данных (factory reset) не восстанавливает системный раздел и не вернёт повреждённый или удалённый бинарник su — он лишь очищает пользовательские данные. Для восстановления системных файлов требуется перепрошивка или переустановка root-решения по официальной инструкции для вашей модели.