跳转到内容

环境变量:调整界面里没有的选项 ​

OMV 的界面只覆盖了常用设置,但很多服务的细节参数,例如 SSH 允许哪些组登录、文件系统创建时的 mkfs 选项、告警阈值,都可以用环境变量调整。读完这一篇,你能查到有哪些变量,修改并让它生效,出问题时还原,并且知道不同变量要用不同的生效步骤。

开始之前 ​

  • 命令在 OMV 的 shell(root 身份)里执行。
  • 环境变量比界面选项更靠近底层,改错会让服务起不来。动手前先在测试机验证,并保证有另一种方式能登录 NAS(例如本机控制台)。
  • 本文的变量名和默认值来自 OMV 8.5.x 源码。OMV 版本变化后可能增减,先用 omv-env list 确认变量在你的系统上存在。

环境变量会改变服务的配置并触发重新部署

影响范围:变量生效时,相关服务的配置文件会被重新生成并重启(例如 SSH、SMB、Web 界面),已有连接会短暂中断。有些变量只对「之后新创建」的对象有效(例如新建文件系统)。

前置条件:界面里没有待应用的更改;已经备份系统盘或至少备份了 /etc/default/openmediavault;知道要改的变量由谁读取(见下表),以便选对生效步骤。

怎么回退:omv-env unset <变量名> 删除这个变量,再重复一遍生效步骤,服务就回到内置默认值。

环境变量是什么 ​

所有变量保存在 /etc/default/openmediavault,格式是一行一个:

sh
OMV_SSHD_ALLOWGROUPS="root _ssh"

这个文件装机时就带有一批内部路径变量,例如 OMV_CONFIG_FILE、OMV_MOUNT_DIR、OMV_WEBGUI_ADMINUSER_NAME,它们告诉 OMV 各种文件放在哪里,不要修改。你要改的是另外那些「有内置默认值、文件里没写」的变量:只有你设置了,才会覆盖默认值。

四类程序会读取它,所以生效步骤不同:

读取方例子什么时候读取
Salt 状态(生成配置文件)OMV_SSHD_*、OMV_SAMBA_*、OMV_NGINX_*、OMV_MONIT_*部署时,通过 Salt 的 pillar 数据读取
PHP(omv-engined 与 Web 后台)OMV_MKFS_OPTIONS_*、OMV_FSTAB_MNTOPS_*omv-engined 启动时读取一次
脚本(cron、omv-upgrade、omv-btrfs-scrub)OMV_BTRFS_SCRUB_*、OMV_UPGRADE_APT_ARGS每次脚本运行时读取
udev 规则OMV_MD_STRIPE_CACHE_SIZERAID 设备出现或变化的事件发生时

查看与修改 ​

命令行 ​

sh
omv-env list                      # 所有可用的变量名
omv-env get                       # 当前文件里已设置的变量
omv-env get <变量名>              # 看某个变量
omv-env set -- <变量名> <值>      # 设置,值里有空格要加引号
omv-env unset <变量名>            # 删除
  • list 的内容来自三处:文件里已有的变量、Salt 状态里用到的变量、几个 cron 和 shell 脚本里用到的变量。只在 PHP 里读取的变量不在其中,例如 OMV_MKFS_OPTIONS_EXT4。但 omv-env set 接受任何以 OMV_ 开头的名字。
  • set 后面的 -- 不能省,因为值常常以 - 开头,例如 -b 4096。
  • 变量名只能是大写字母、数字和下划线;值里不能有双引号。含 $ 或反引号的值会被 shell 脚本在读取这个文件时展开,尽量避免。
  • set、unset 会重写整个文件,只保留 OMV_ 开头的行并按名称排序,你手写的注释会丢失。

envvars 插件 ​

官方插件 openmediavault-envvars 提供了图形界面,入口是 系统 → 环境变量(System → Environment Variables)。它是一个表格,列是名称和值,工具栏有创建、编辑、删除,最右边有一个播放形状的应用(Apply)按钮。插件的概况见 小工具合集。

  • 创建时,名称是从下拉列表里选的,列表内容来自 omv-env list。不在这个列表里的变量(例如只在 PHP 里读取的 OMV_MKFS_OPTIONS_EXT4),界面里可能选不到,改用命令行。
  • 点应用会依次执行 omv-salt stage run prepare、omv-salt stage run deploy 和 monit restart omv-engined,也就是重新生成所有服务的配置,耗时较长,期间服务会重启。只想影响一个服务时,用命令行更精细。

让改动生效 ​

按变量由谁读取,选下面的步骤:

Salt 读取的变量(大多数):先重新生成 pillar,再部署受影响的模块。

sh
omv-salt stage run prepare
omv-salt deploy run <模块>

prepare 会根据 /etc/default/openmediavault 重新写出 Salt 使用的 pillar 数据,不运行它,deploy run 读到的还是旧值。模块名见 Salt 部署与自定义配置。也可以用 omv-salt stage run deploy 部署所有模块,影响范围大得多。

PHP 读取的变量:重启 RPC 守护进程。

sh
monit restart omv-engined

重启后 Web 界面会短暂报错,几秒后刷新即可。

脚本读取的变量:不需要任何操作,下次脚本运行就生效。

udev 读取的变量:下次 RAID 设备触发 add 或 change 事件时生效,重启后一定生效。

官方文档给出的完整顺序是 monit restart omv-engined、omv-salt stage run prepare、omv-salt stage run deploy,三步都做总是安全的。

示例:让另一个组也能 SSH 登录 ​

OMV 默认只允许 root 和 _ssh 组的成员通过 SSH 登录,写在变量 OMV_SSHD_ALLOWGROUPS 里。想让名为 ops 的组也能登录:

sh
omv-env get OMV_SSHD_ALLOWGROUPS          # 没设置过时没有输出,默认值是 root _ssh
omv-env set -- OMV_SSHD_ALLOWGROUPS "root _ssh ops"
omv-salt stage run prepare
omv-salt deploy run ssh

注意保持当前这个 SSH 会话不要关,另开一个终端测试新的登录,确认没问题后再退出旧会话。要还原:

sh
omv-env unset OMV_SSHD_ALLOWGROUPS
omv-salt stage run prepare
omv-salt deploy run ssh

先看有没有扩展选项

SSH 的页面(服务 → SSH,Services → SSH)里有扩展选项(Extra options),能直接追加 sshd_config 的指令。能用扩展选项解决的,不必设环境变量。

常用变量表 ​

下表的默认值是内置默认值,也就是变量没设置时的取值。「来源」是读取它的文件,Salt 状态相对于 /srv/salt/omv/deploy/。

文件系统:创建与挂载 ​

来源:默认值定义在 /usr/share/php/openmediavault/globals.inc,由 .../system/filesystem/backend/ 下的 PHP 文件读取。只影响之后新建、新挂载的文件系统,已经挂载的不受影响。读取方是 PHP,生效步骤是 monit restart omv-engined。

变量默认值作用
OMV_MKFS_OPTIONS_EXT4-b 4096 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 -O quota创建 EXT4 时传给 mkfs 的参数
OMV_MKFS_OPTIONS_XFS-f创建 XFS 时的参数
OMV_MKFS_OPTIONS_BTRFS-O skinny-metadata,^mixed-bg创建 Btrfs 时的参数
OMV_FSTAB_MNTOPS_EXT4defaults,nofail,user_xattr,usrquota,grpquotaEXT4 的挂载选项
OMV_FSTAB_MNTOPS_XFSdefaults,nofail,usrquota,grpquotaXFS 的挂载选项
OMV_FSTAB_MNTOPS_BTRFSdefaults,nofailBtrfs 的挂载选项
OMV_FSTAB_MNTOPS_NTFSdefaults,nofail,big_writesNTFS 的挂载选项
OMV_FSTAB_MNTOPS_EXFATdefaults,nofailexFAT 的挂载选项
OMV_FSTAB_MNTOPS_VFATdefaults,nofailFAT32 等 VFAT 的挂载选项

官方文档里的旧默认值

官方文档的 fs_env_vars 页面里,EXT4 的默认挂载选项还是旧写法 usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0。OMV 7.4.6 起,新建的 EXT4 文件系统改用内部配额,源码里的默认值已经是 usrquota,grpquota。官方文档里 NTFS 是 defaults,nofail,源码里还带着 big_writes,exFAT 则在官方文档里没有列出。上表以源码(globals.inc)为准。

已经挂载的文件系统,挂载选项保存在配置数据库里,改变量不会影响它们。要改已有文件系统的选项,见 文件系统挂载选项与 fstab。

另有 OMV_FSTAB_MNTOPS_NONROTATIONAL,默认 noatime,nodiratime:系统盘是固态盘时,初始化阶段会把它加到根分区的挂载选项里,只运行一次(来源 setup/fstab/default.sls)。

Web 管理界面(nginx) ​

来源:deploy/nginx/files/ 下的 site-webgui.j2、headers.conf.j2、security.conf.j2。生效:prepare,再 omv-salt deploy run nginx。

变量默认值作用
OMV_NGINX_SITE_WEBGUI_CLIENT_MAX_BODY_SIZE25M通过界面上传文件的大小上限
OMV_NGINX_SITE_WEBGUI_FASTCGI_READ_TIMEOUT60s后端响应的超时时间
OMV_NGINX_SITE_WEBGUI_LISTEN_IPV4_ADDRESS*监听的 IPv4 地址
OMV_NGINX_SITE_WEBGUI_LISTEN_IPV6_ADDRESS::监听的 IPv6 地址
OMV_NGINX_SITE_WEBGUI_SSL_PROTOCOLSTLSv1.2 TLSv1.3允许的 TLS 版本
OMV_NGINX_SITE_WEBGUI_SECURITY_XFRAMEOPTIONS_ENABLEyes是否发送 X-Frame-Options 头
OMV_NGINX_SITE_WEBGUI_SECURITY_XFRAMEOPTIONSSAMEORIGIN该头的取值
OMV_NGINX_SITE_WEBGUI_SECURITY_CSP_ENABLEyes是否发送内容安全策略头
OMV_NGINX_SITE_WEBGUI_SECURITY_HSTSmax-age=15768000; includeSubDomainsHSTS 头的取值
OMV_NGINX_SITE_WEBGUI_INCLUDE_DIR/etc/nginx/openmediavault-webgui.dnginx 额外包含的配置目录,放进去的 *.conf 会被加载

想把 OMV 界面嵌进导航页的 iframe,需要放宽 X-Frame-Options,这会削弱防点击劫持的保护,只在内网、可信的页面里这样做。

SSH、SMB 与 NFS ​

SSH 来源 deploy/ssh/files/sshd_config.j2,SMB 来源 deploy/samba/files/global.j2 与 shares.j2,NFS 来源 deploy/nfs/files/etc-exports.j2。生效:prepare,再部署 ssh、samba 或 nfs。

变量默认值作用
OMV_SSHD_ALLOWGROUPSroot _ssh允许 SSH 登录的组
OMV_SSHD_LOGLEVELINFOsshd 的日志级别
OMV_SSHD_LOGINGRACETIME120登录宽限时间(秒)
OMV_SSHD_X11FORWARDINGyes是否允许 X11 转发
OMV_SSHD_SUBSYSTEM_SFTP/usr/lib/openssh/sftp-serverSFTP 子系统的程序
OMV_SAMBA_SOCKETOPTIONSTCP_NODELAY IPTOS_LOWDELAYSamba 的 socket options
OMV_SAMBA_AIOREADSIZE、OMV_SAMBA_AIOWRITESIZE1启用「异步 I/O」时,异步读写的大小门限
OMV_SAMBA_SHARE_CREATEMASK、OMV_SAMBA_SHARE_FORCECREATEMODE0664共享里新建文件的权限掩码
OMV_SAMBA_SHARE_DIRECTORYMASK、OMV_SAMBA_SHARE_FORCEDIRECTORYMODE0775共享里新建目录的权限掩码
OMV_SAMBA_SHARE_RECYCLE_REPOSITORY.recycle/%U回收站目录,%U 是用户名
OMV_SAMBA_SHARE_AUDIT_SUCCESSmkdirat renameat unlinkat pwrite启用「审核文件操作」后,记录哪些成功的操作
OMV_WSDD_ENABLED1SMB 启用时是否启动 wsdd,让 Windows 在「网络」里发现 NAS。1、yes、on、true 算真,设成 0 之后 OMV 不再启动 wsdd-server,已经在运行的实例不会被这一步停掉(按 Salt 状态推断)。来源 deploy/samba/default.sls
OMV_WSDD_PARAMS空追加给 wsdd 的命令行参数。OMV 把 WSDD_PARAMS="--workgroup='<工作组>' <这个变量的值>" 写进 /etc/wsdd-server/defaults,参数写法以 wsdd 项目文档为准。来源 deploy/samba/50wsdd.sls,部署模块 samba。用法见 局域网发现:为什么在网络里看不到 NAS
OMV_NFSD_V4_PSEUDO_ROOT_OPTIONSro,fsid=0,root_squash,subtree_check,secureNFSv4 伪文件系统根目录的导出选项

监测告警阈值(monit) ​

来源:deploy/monit/services/files/ 下的模板和 deploy/monit/files/etc-monit-monitrc.j2。生效:prepare,再 omv-salt deploy run monit。邮件由 配置邮件通知 里的设置发出,哪些事件会发由 系统 → 通知 → 事件(System → Notification → Events)决定。

变量默认值作用
OMV_MONIT_CHECK_INTERVAL30检查周期(秒),下面的「周期数」按它计算
OMV_MONIT_SERVICE_FILESYSTEM_ROOT_USAGEWARNTHRESHOLD85系统盘(/)使用率告警阈值(%)
OMV_MONIT_SERVICE_SYSTEM_MEMORYUSAGE90内存使用率告警阈值(%)
OMV_MONIT_SERVICE_SYSTEM_CPUUSAGE_USER、_SYSTEM、_WAIT95CPU 用户态、内核态、I/O 等待占用的告警阈值(%)
OMV_MONIT_SERVICE_SYSTEM_CPUUSAGE_CYCLES2CPU 超过阈值持续多少个周期才告警
OMV_MONIT_SERVICE_SYSTEM_LOADAVG_1MIN_MULT、_5MIN_MULT2、11 分钟、5 分钟平均负载的阈值是「CPU 核数乘以这个倍数」
OMV_MONIT_SERVICE_SYSTEM_LOADAVG_1MIN_CYCLES、_5MIN_CYCLES3负载超过阈值持续多少个周期才告警

数据盘的使用率阈值不用环境变量,在 存储器 → 文件系统(Storage → File Systems)里编辑文件系统,用用量警告阈值(Usage Warning Threshold)设置,默认 85%。

系统、电源与内核参数 ​

变量默认值作用与来源
OMV_CPUPOWER_FREQ、OMV_CPUPOWER_MINFREQ、OMV_CPUPOWER_MAXFREQ、OMV_CPUPOWER_PERFBIAS空在界面设置了CPU 频率调节后,进一步限制频率范围或设置性能偏好,来源 deploy/cpupower/files/etc-cpupower-service_conf.j2
OMV_SYSCTL_DEV_RAID_SPEEDLIMITMIN10000写入内核参数 dev.raid.speed_limit_min,决定 RAID 重建和同步的最低速度,单位 KiB/s,来源 deploy/sysctl/mdadm.sls
OMV_MD_STRIPE_CACHE_SIZE8192RAID5/6 阵列的 stripe_cache_size,来源 udev 规则 /etc/udev/rules.d/99-openmediavault-md-raid.rules,8.0.4 起提供
OMV_SYSTEMD_JOURNALD_SYSTEMMAXUSE1Gsystemd 日志占用磁盘的上限,来源 deploy/systemd-journald/10default.sls

OMV_CPUPOWER_GOVERNOR 已经不再使用

OMV 8.0.9 的更新记录曾说,可以用环境变量 OMV_CPUPOWER_GOVERNOR 修改 CPU 调节策略。8.1.0-2 的更新记录要求改在 系统 → 电源管理 → 设置(System → Power Management → Settings)里配置,也就是 CPU 频率调节(CPU frequency scaling)字段。8.5.x 源码里,cpupower 的 Salt 模板读的是这个界面字段,已经没有这个变量,设了也不会有效果。上表里的四个变量才是现在还在用的。

系统盘是固态盘(非旋转设备)时,OMV 还会写入一组减少磁盘写入的内核参数,来源 deploy/sysctl/nonrot.sls,对应的变量都以 OMV_SYSCTL_VM_ 开头:DIRTYBACKGROUNDRATIO(1)、DIRTYRATIO(20)、DIRTYWRITEBACKCENTISECS(12000)、DIRTYEXPIRECENTISECS(12000)、LAPTOPMODE(5)、SWAPPINESS(1)、VFSCACHEPRESSURE(50)。这些参数是整个内核的,数据盘也受影响。

脚本读取的变量 ​

来源:/etc/cron.*/ 下的 openmediavault-* 脚本和 /usr/sbin/ 下的命令。改完立刻生效,不需要部署。

变量默认值作用
OMV_BTRFS_SCRUB_ENABLEDyes是否自动对 Btrfs 做 scrub
OMV_BTRFS_SCRUB_PERIODmonthly自动 scrub 的周期,monthly 或 weekly
OMV_BTRFS_SCRUB_PRIORITY-c 2 -n 4scrub 的 I/O 优先级参数
OMV_BTRFS_SCRUB_READONLYnoscrub 只检查不修复
OMV_BTRFS_ERROR_CHECK_ENABLEDyes是否每天检查 Btrfs 设备错误计数
OMV_SSL_CERTIFICATE_CHECK_EXPIRY_ENABLEDyes是否每天检查证书是否快到期
OMV_SSL_CERTIFICATE_CHECK_EXPIRY_DAYS7到期前多少天开始告警
OMV_SMARTMONTOOLS_UPDATE_DRIVEDB_ENABLEDyes是否每周更新 smartmontools 的硬盘数据库
OMV_UPGRADE_APT_ARGS--yes --allow-downgrades --allow-change-held-packages --fix-missing --fix-broken --auto-remove --allow-unauthenticated --option DPkg::Options::=--force-confoldomv-upgrade 传给 apt-get 的参数

不要随意改 OMV_UPGRADE_APT_ARGS

这组参数决定了系统更新时如何处理依赖和冲突,改错可能让更新卸载关键软件包。除非你清楚每个参数的含义,否则保持默认。

插件相关变量 ​

插件也用同样的机制:变量写在插件自己的 Salt 状态(或 PHP 代码)里,装了插件才有意义,卸载插件后就没有作用了。生效方式和核心变量一样:Salt 读取的变量先 prepare,再部署表里写的模块;PHP 读取的变量重启 omv-engined。

变量默认值来自哪个插件作用
OMV_PROFTPD_UMASK000 000官方 openmediavault-ftp,部署模块 proftpd,来源 deploy/proftpd/modules/files/mod_core.j2写进 proftpd.conf 里每个共享文件夹目录和匿名目录的 Umask 指令,两个数依次是新建文件和新建目录的掩码。按 ProFTPD 的规则,000 000 会让新文件是 666、新目录是 777,谁能访问由共享文件夹的权限(<Limit> 规则)决定。想收紧可以改成例如 002 002,上传之后用 ls -l 确认实际权限。见 FTP 与 FTPS(官方插件)
OMV_RSNAPSHOT_STARTING_HOUR2omv-extras openmediavault-rsnapshot,部署模块 rsnapshot,来源 deploy/rsnapshot/default.sls备份任务的起始小时,写进 /etc/cron.d/openmediavault-rsnapshot:每月(1 日)和每年(1 月 1 日)的任务用它,每日和每周(周一)的任务用它加 1,每小时任务固定在每小时的第 5 分钟。默认的 2 对应每月 02:30、每年 02:00、每日 03:30、每周一 03:00。取 0 到 22,23 加 1 会得到不合法的 24 点。安装插件时,安装脚本会把它写进 /etc/default/openmediavault。见 rsnapshot:轮转快照式备份
OMV_RSNAPSHOT_DISABLE_CRON0同上设为 1 时,OMV 不再生成上面的 cron 文件,并删除已有的,插件就不会再按计划自动备份。除非你打算自己调度,否则不要设
OMV_RSNAPSHOT_LOGFILE/var/log/rsnapshot.log同上rsnapshot 的日志文件
OMV_RSNAPSHOT_VERBOSE_LO、OMV_RSNAPSHOT_VERBOSE_HI、OMV_RSNAPSHOT_LOG_LEVEL2、3、2同上写进每个任务的 rsnapshot 配置:任务设为只输出错误时,verbose 取 _LO,否则取 _HI;loglevel 取 _LOG_LEVEL
OMV_RSNAPSHOT_DIRS_MASK、OMV_RSNAPSHOT_SCRIPTS_MASK2775、755同上前者是备份时对目标目录链执行 chmod 用的权限,后者是插件生成的 rsnapshot 配置文件和脚本的权限
OMV_MDMGMT_ALLOW_USB_DEVICES未设置,相当于否官方 openmediavault-md,由 PHP 读取(8.1.2 起)设为 yes 后,创建软 RAID 的候选磁盘列表才包含 USB 设备,官方默认不支持这样做。它只在 PHP 里读取,不在 omv-env list 里,用命令行设置,改完 monit restart omv-engined。见 软件 RAID:用 md 插件组阵列、外接 USB 硬盘的正确用法

rsnapshot 插件还有 OMV_RSNAPSHOT_CONFS_DIR 和 OMV_RSNAPSHOT_CRONSCRIPT,是插件内部使用的路径,不要改。

其他插件的变量写在各自的文章里:ClamAV 病毒扫描(OMV_CLAMAV_CLAMD_*)、用 Fail2ban 封禁暴力破解(OMV_FAIL2BAN_CHAIN)、内核插件(OMV_KERNEL_BOOT_ISO_SUBDIR)、FileBrowser、PhotoPrism、音乐服务:OwnTone 与 Shairport、同步 OneDrive,omv-extras 的软件源变量见 软件源、国内镜像与第一次更新。

找到你要的变量 ​

不知道某项行为能不能用变量调整时,在 OMV 的 shell 里搜源码,这些都是只读命令:

sh
omv-env list | grep -i <关键词>
grep -rn "OMV_<关键词>" /srv/salt/omv /usr/share/php/openmediavault /usr/share/openmediavault /etc/cron.daily 2>/dev/null

找到变量后,看它所在的文件是怎样读取的:pillar.get('default:OMV_...', 默认值) 表示 Salt 读取,Environment::get("OMV_...") 表示 PHP 读取,OMV_...=${OMV_...:-"默认值"} 表示脚本读取。

检查结果 ​

用只读命令确认变量已经生效:

sh
omv-env get <变量名>                          # 文件里的值
grep -A1 "<变量名>" /srv/pillar/omv/default.sls  # prepare 之后 Salt 看到的值
omv-salt deploy list-dirty                    # 没有遗留的待应用模块

再检查生成的配置确实变了,例如 SSH 用 sshd -T | grep -i allowgroups。

常见问题 ​

omv-env set 没有报错,但行为没变。 九成是没有执行生效步骤,或者执行了 deploy run 却没有先运行 prepare。按上面的步骤从头做一遍。

envvars 插件的下拉列表里找不到我要的变量。 列表只包含 omv-env list 找到的变量。改用命令行 omv-env set。

改了变量之后,界面提示有待应用的更改吗? 不会。环境变量不经过配置数据库,所以没有黄色提示条,需要你手动执行生效步骤。

升级之后某个变量失效。 OMV 的变量名和默认值会随版本变化。升级后重新核对,并阅读 OMV 8.1–8.5 更新要点 里和你用到的功能相关的条目。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。