Вопрос или проблема
Я озадачен этой проблемой, которая возникла на системе, где всё раньше работало нормально.
У меня есть внутренний диск, который монтируется как /data при запуске (он, конечно, в /etc/fstab).
У меня есть скрипты, которые раньше запускались оттуда, но теперь они все заканчиваются на “отказано в доступе”, если запускать их напрямую, но запускаются нормально, если сначала запустить bash. Например, я создал супер-простой скрипт:
#!/usr/bin/env bash
echo It runs
Когда я размещаю его в любой части файловой системы корня, он работает нормально. Однако, если я помещаю его в каталог /data (на смонтированной файловой системе), он при прямом запуске
./s.sh
вызывает ошибку “отказано в доступе” (частично). Чтобы убедиться в этом, я обнаружил, что могу запустить его как
bash ./s.sh
и он действительно запускается.
Я проверил, что /etc/fstab не содержит “noexec”.
Я проверил файловую систему с помощью fsck -f
Я запускал вышеуказанные примеры как root.
Права доступа к файлам: rwxr-xr-x
Команда /usr/bin/env bash
действительно запускает bash
/etc/fstab содержит следующую строку:
UUID=45e6b118-4a0c-4cf2-b3c2-1509e9026f49 /data ext4 user,acl 0 0
Что мне следует рассмотреть в качестве причины?
Благодаря @steeldriver я теперь знаю о команде findmnt, которая говорит:
root@bubbles:~# findmnt -T /data
TARGET
SOURCE FSTYPE OPTIONS
/data /dev/sda1 ext4 rw,nosuid,nodev,noexec,relatime
root@bubbles:~#
Теперь вопрос: что применяет nosuid, nodev и noexec к этому разделу и почему? Я занимался этим годами на этом компьютере, и это совершенно новое.
Как указано в странице руководства по команде mount, параметр user
подразумевает noexec
, если не переопределен последующим явным exec
:
user Позволяет обычному пользователю монтировать файловую систему. Имя монтирующего пользователя записывается в файл mtab (или в личный файл libmount в /run/mount на системах без обычного mtab), чтобы этот же пользователь мог размонтировать файловую систему снова. Этот параметр подразумевает параметры noexec, nosuid и nodev (если они не переопределены последующими параметрами, как в строке параметров user,exec,dev,suid).
Так что если вы хотите, чтобы скрипты были исполняемыми, вам нужно либо удалить user
из параметров fstab, либо добавить явное exec
:
UUID=45e6b118-4a0c-4cf2-b3c2-1509e9026f49 /data ext4 user,acl,exec 0 0
См. также Мои SSD разделы монтируются как noexec, вопреки fstab.
Ответ или решение
Для решения вопроса о невозможности запуска скриптов с определенного диска в вашей системе, важно понять, что проблема возникает из-за параметров монтирования файловой системы, которые в данном случае предотвращают выполнение скриптов. Давайте разберем ситуацию подробнее с точки зрения теории, примера и применения (TEA).
Теория
Файловые системы в Unix/Linux управляются и конфигурируются через файл /etc/fstab
, который задает параметры монтирования для каждого раздела. Одним из таких параметров является user
, который предполагает несколько ограничений, включая noexec
. Опция noexec
запрещает выполнение любых исполняемых файлов с данного тома, что и приводит к ошибке "permission denied" при попытке запуска скрипта напрямую.
Пример
В вашем конкретном случае, как вы уже заметили, файловая система, монтируемая на /data
, использует следующие параметры:
UUID=45e6b118-4a0c-4cf2-b3c2-1509e9026f49 /data ext4 user,acl 0 0
Параметр user
implicit означает noexec
, nosuid
и nodev
, если они не переопределены явно. Это значит, что хоть вы и не указывали noexec
вручную, данная настройка все равно применена в случае указания user
. Поэтому, когда вы пытаетесь выполнить скрипт через ./s.sh
, система блокирует выполнение из-за этого ограничения. Однако, когда вы запускаете скрипт как bash ./s.sh
, вы явно отдаете команду интерпретатору, что легально с точки зрения текущих настроек.
Применение
Чтобы разрешить выполнение скриптов с вашего диск, необходимо изменить настройки в fstab
, добавив параметр exec
, который позволит выполнение исполняемых файлов:
UUID=45e6b118-4a0c-4cf2-b3c2-1509e9026f49 /data ext4 user,acl,exec 0 0
Если это пространство используется исключительно для данных, и у вас нет нужды в доступе обычных пользователей к монтированию/размонтированию, вы можете также удалить параметр user
, чтобы избежать добавления нежелательных ограничений.
После внесения изменений в fstab
, перезагрузите систему или отмонтируйте и снова замонтируйте ваш раздел, чтобы изменения вступили в силу:
sudo umount /data
sudo mount /data
Это должно решить вашу проблему с исполнением скриптов.
Заключение
Неожиданное изменение в поведении вашего монтированного диска, вероятно, произошло из-за изменения параметров монтирования — возможно, из-за обновления системы или внесения ручных изменений. Понимание отношений между различными параметрами монтирования и их влиянием на поведение системы жизненно важно для любого ИТ-специалиста, особенно при установке или диагностике проблем в Unix/Linux средах. Убедитесь, что все важные изменения в настройках документации протоколируются для облегчения будущего устранения неисправностей. Желаем удачи в решении вашей проблемы!