每次启动,/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组,自然也就有了读写权限!
