我正在使用嵌入式设备的Buildroot构建Linux Kernel 3.14.28。
在/dev/
中,所有的tty都是root:root
的,不像标准的Linux那样root:dialout
。因此,如果不记录为root
,就无法访问任何ttyX。
如何将 tty 组永久更改为root:dialout
?我尝试使用 chown 命令更改它,但它在重新启动时再次变得root:root
。
TL;DR:选择mdev
作为设备管理器,并使用tty
组而不是dialout
。
内核devtmpfs
创建具有默认名称、所有者和权限的设备节点。它还会在创建节点时发出uevent
,这允许 uevent 处理程序更改名称、所有权或权限,或执行它想要的任何其他操作。以前这被称为热插拔系统,但现在它更加通用。
Buildroot 提供了三个 uevent 处理程序之间的选择:mdev
,它是 busybox 的一部分,eudev
它是一个独立的udev
分支,udev
是 systemd
init 系统的一部分。这些处理程序配置了规则文件,这些文件指定在特定类型的设备出现时如何处理该设备。
对于您的特定需求,mdev
是最佳选择,因为它非常简单,易于理解,不占用太多空间,并且默认配置就足够了。在 Buildroot 的 menuconfig 中,转到 System Configuration → /dev management,然后选择使用 mdev 动态。然后重建根文件系统。现在,它将填充mdev
二进制文件(busybox
的一部分),用于启动它的初始化脚本以及/etc/mdev.conf
中的默认规则文件。此默认文件包含:
tty[0-9]* root:tty 660
这意味着tty
设备将其组更改为tty
,并具有组读取和写入的权限。因此,您可以确保登录用户属于tty
组,而Bob是您的叔叔。
如果默认的mdev.conf
文件对您来说是不够的(例如,如果您确实需要dialout
组),那么您可以创建一个文件系统覆盖,复制package/busybox/mdev.conf
/etc/mdev.conf
并根据需要进行修改。有关mdev.conf
格式的完整文档可以在 busybox 源代码中找到。
devtmpfs
总是设置0600
的权限,并使其达到udev
(或之后运行的任何内容)来维护它们。它的来源确认无法显式覆盖它(在某些情况下tty
设备驱动程序无条件覆盖mode
)。
假设您使用 Buildroot 的默认busybox
作为init
,有一种方法可以在 busybox
的inittab
中使用以下附加行来做到这一点(additional=必须存在于没有inittab
时暗示的基本行(或其替换)之外 - 因为它们不再暗示然后存在):
::sysinit:<path_to_your_script>
脚本调用chown
和循环chmod
。
但是,最好在现有/etc/init.d/rcS
内处理此问题(默认情况下,它也由BusyBox的init
在sysinit
运行)。
正如你从股票构建根的/etc/init.d/rcS
中看到的,你需要做的就是用你的命令创建一个脚本/etc/init.d/S<whatever>.sh
(其中"任何"把它放在/etc/init.d/S??*
输出中的所需位置):
for tty in /dev/tty*; do
chown root:dialout "$tty"
chmod ug+rw "$tty" #do not touch other bits
done
unset tty