错误日志

在 OpenMediaVault 中挂载了磁盘,并设置了一个用户主目录在这个磁盘中,执行一个权限为755的 Shell 脚本时遇到问题:

bash: permission denied: ./xxx.sh

分析问题

OpenMediaVault 挂载磁盘默认会使用noexec参数,即不允许执行,所以不管是脚本还是二进制文件即使有正确的权限也会提示没有权限。

解决方案

已挂载的磁盘

  • 打开/etc/openmediavault/config.xml(OpenMediaVault 数据库文件),找到<fstab>部分,如下所示:
<fstab>
...
  <mntent>
    <uuid>f767ee54-eb3a-44c5-b159-1840a289c84b</uuid>
    <fsname>/dev/disk/by-label/VOLUME1</fsname>
    <dir>/srv/dev-disk-by-label-VOLUME1</dir>
    <type>ext4</type>
    <opts>defaults,nofail,user_xattr,noexec,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,acl</opts>
    <freq>0</freq>
    <passno>2</passno>
    <hidden>0</hidden>
  </mntent>
</fstab>
  • 删除<opts>行中的noexec,如下所示:
<opts>defaults,nofail,user_xattr,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,acl</opts>
  • 保存退出,执行omv-salt deploy run fstab命令,使改动同步到/etc/fstab文件中。也可以直接修改/etc/fstab文件删除相关的noexec字段。
  • 最后重启,并检查是否生效。

新挂载的磁盘

TIPS: 官方在 2020 年 9 月 21 日发布的新版本中已不在使用noexec选项。如果你已经更新到最新的版本,那么很大概率就不需要再进行以下操作了。

如果需要新挂载的磁盘也去掉noexec选项,则需要编辑/etc/default/openmediavault文件设置相关的环境变量。默认文件中并没有相关的环境变量,默认值是写在相关的 Web 界面源码中的,以下是默认采用noexec的文件系统的环境变量:

OMV_FSTAB_MNTOPS_EXT2="defaults,nofail,user_xattr,noexec"
OMV_FSTAB_MNTOPS_EXT3="defaults,nofail,user_xattr,noexec,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0"
OMV_FSTAB_MNTOPS_EXT4="defaults,nofail,user_xattr,noexec,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0"
OMV_FSTAB_MNTOPS_JFS="defaults,nofail,noexec,usrquota,grpquota"
OMV_FSTAB_MNTOPS_XFS="defaults,nofail,noexec,usrquota,grpquota"

根据实际需求去掉noexec字段写入到/etc/default/openmediavault文件即可。

参考资料

Why drives are mounted with noexec option

Filesystem Environmental Variables