news 2026/7/28 18:30:51

每次启动,/dev/ada1 的权限都会重置,有什么办法让它权限固定住吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
每次启动,/dev/ada1 的权限都会重置,有什么办法让它权限固定住吗?

在VirtualBox虚拟机启动的时候,碰到报错,发现没有对直通硬盘的读写权限。原来硬盘的默认权限是640 。于是提出问题:

FreeBSD每次启动,/dev/ada1 的权限都会重置,有什么办法让它权限固定住吗?

一言给的答案:

在 FreeBSD 系统中,/dev 目录下的设备节点是由 devfs(设备文件系统)动态管理的。每次系统启动或重新探测硬件时,devfs 会根据默认规则重新创建设备节点,因此你手动使用 chmod 修改的权限会在重启后丢失。

要永久固定 /dev/ada1 的权限,最标准且推荐的方法是配置 ‌devfs.rules‌。

方法一:使用 devfs.rules(推荐)
这是 FreeBSD 管理设备权限的标准方式。你可以创建一个自定义规则集,专门针对 ada1 设备设置权限。

1. 编辑规则文件
打开或创建 /etc/devfs.rules 文件:

bash
sudo vi /etc/devfs.rules
添加以下内容。这里我们创建一个名为 [local_rules=10] 的规则集(数字可以是 1-999,建议选一个未被使用的数字,如 10):

ini
[local_rules=10]
add path 'ada1' mode 0666
add path 'ada1p*' mode 0666
add path 'ada1':匹配设备名 ada1。
mode 0666:设置权限为 crw-rw-rw-(即所有用户可读可写)。
add path 'ada1p*':同时匹配该磁盘下的所有分区(如 ada1p1, ada1p2),确保分区也具有相同权限。如果你只需要磁盘本身,可以省略这一行。
注意‌:如果你希望更安全的权限控制,建议不要使用 0666,而是将特定用户加入 operator 组,然后设置 mode 0660 并保持 group operator。但鉴于你之前遇到 VirtualBox 权限问题,0666 是最直接的解决方案。

2. 启用规则集
编辑 /etc/rc.conf 文件,告诉系统在启动时加载这个规则集:

bash
sudo vi /etc/rc.conf
添加或修改以下行:

ini
devfs_system_ruleset="local_rules"
这里的 local_rules 对应你在 devfs.rules 中定义的方括号内的名字(去掉等号和后面的数字)。

3. 立即应用规则(无需重启)
为了让更改立即生效,你可以重新加载 devfs 规则:

bash
sudo service devfs restart
或者手动应用规则集:

bash
sudo devfs rule -s 10 applyset
(假设你的规则集编号是 10)

4. 验证权限
再次检查 /dev/ada1 的权限:

bash
ls -la /dev/ada1
你应该看到权限已经变为 crw-rw-rw-,并且即使重启后也会保持不变。

方法二:将用户加入 operator 组(更安全)
如果出于安全考虑,不希望所有用户都能读写磁盘,可以将你的用户 skywalk 加入 operator 组,因为默认情况下 /dev/ada* 的组所有权是 operator,且权限是 0660(组可读写)。

1. 将用户加入 operator 组
bash
sudo pw groupmod operator -m skywalk
2. 重新登录
注销并重新登录,或者使用 newgrp operator 使组变更在当前终端生效。

3. 验证
此时,skywalk 用户应该能够直接读写 /dev/ada1,而无需将其权限改为 0666。这是更符合 Unix 安全模型的做法。

为什么之前的 chmod 无效?
devfs 动态性‌:/dev 不是普通的磁盘文件系统,它是一个内存中的虚拟文件系统。设备节点是在内核探测到硬件时动态创建的。
重启重置‌:每次启动时,内核重新探测硬盘,devfs 根据默认模板(通常是 root:operator 0660)重新创建节点,覆盖了你之前的手动修改。
总结
如果你需要‌快速解决‌ VirtualBox 直通权限问题,且不介意安全性稍低,使用 ‌方法一(devfs.rules + mode 0666)‌。
如果你追求‌最佳实践和安全性‌,使用 ‌方法二(加入 operator 组)‌,并确保 devfs.rules 中没有覆盖默认的 0660 权限。
对于 VirtualBox 直通场景,通常推荐‌方法一‌,因为 VirtualBox 进程可能需要以当前用户身份直接访问设备节点,而 operator 组的权限有时仍会受到其他安全策略的影响。确保在 /etc/devfs.rules 中同时设置了磁盘和分区的权限,以避免后续访问分区时出现类似问题。

实践

在FreeBSD15.1系统中,我发现磁盘的权限是640,所以只把用户放入Operate组是不行的。

skywalk@fb98:~ $ ls -la /dev/ad* crw-r----- 1 root operator 0x6f 7月 28 17:38 /dev/ada0 crw-r----- 1 root operator 0x71 7月 28 17:38 /dev/ada0p1 crw-r----- 1 root operator 0x73 7月 28 17:38 /dev/ada0p2 crw-r----- 1 root operator 0x75 7月 29 01:38 /dev/ada0p3 crw-r----- 1 root operator 0x77 7月 28 17:38 /dev/ada0p4 crw-r----- 1 root operator 0x79 7月 28 17:38 /dev/ada1 crw-r----- 1 root operator 0x85 7月 28 17:38 /dev/ada1p1 crw-r----- 1 root operator 0x88 7月 28 17:38 /dev/ada1p2 skywalk@fb98:~ $ sudo chmod 666 /dev/ada1 密码: skywalk@fb98:~ $ ls -la /dev/ad* crw-r----- 1 root operator 0x6f 7月 28 17:38 /dev/ada0 crw-r----- 1 root operator 0x71 7月 28 17:38 /dev/ada0p1 crw-r----- 1 root operator 0x73 7月 28 17:38 /dev/ada0p2 crw-r----- 1 root operator 0x75 7月 29 01:38 /dev/ada0p3 crw-r----- 1 root operator 0x77 7月 28 17:38 /dev/ada0p4 crw-rw-rw- 1 root operator 0x79 7月 28 17:38 /dev/ada1 crw-r----- 1 root operator 0x85 7月 28 17:38 /dev/ada1p1 crw-r----- 1 root operator 0x88 7月 28 17:38 /dev/ada1p2

设置开机后磁盘权限

编辑文件sudo vi /etc/devfs.rules,写入

[local_rules=10] add path 'ada1' mode 0660
启用规则集

编辑/etc/rc.conf文件,告诉系统在启动时加载这个规则集:

devfs_system_ruleset="local_rules"

这样系统启动就会默认给ada1硬盘660权限,而我们的用户已经放入了Operator组,自然也就有了读写权限!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 18:27:40

TTS-Backup终极指南:守护你的桌游模拟器珍贵数据

TTS-Backup终极指南:守护你的桌游模拟器珍贵数据 【免费下载链接】tts-backup Backup Tabletop Simulator saves and assets into comprehensive Zip files. 项目地址: https://gitcode.com/gh_mirrors/tt/tts-backup 还在为Tabletop Simulator(T…

作者头像 李华
网站建设 2026/7/28 18:26:22

Shell - 文件引入

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间有一空格 或 source filename案例:vi /home/shell/1.sh #!/bin/b…

作者头像 李华
网站建设 2026/7/28 18:25:29

docker安装shipyard

shipyard是什么 Shipyard(github)是建立在docker集群管理工具Citadel之上的可以管理容器、主机等资源的web图形化工具,包括core和extension两个版本,core即shipyard主要是把多个 Docker host上的 containers 统一管理(支持跨越多个host),extension即shipyard-extensions…

作者头像 李华
网站建设 2026/7/28 18:24:58

折扣卡分销小程序开发,高峰期核销接口限流优化思路

折扣卡分销小程序开发,高峰期核销接口限流优化思路折扣卡分销小程序依托社交裂变、社群推广、短视频引流实现用户快速增长,在节假日优惠、平台秒杀活动、渠道集中推广时段,会瞬间涌入大量卡券核销请求。核销接口作为核心高频接口,…

作者头像 李华
网站建设 2026/7/28 18:18:24

iOS虚拟定位终极指南:免费修改iPhone位置跨平台工具完整教程

iOS虚拟定位终极指南:免费修改iPhone位置跨平台工具完整教程 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation 想要在几分钟内将你的iPhone位置从…

作者头像 李华