我正在为在嵌入式 Linux 安装中运行的守护进程编写启动脚本。这意味着它chmod
来自 BusyBox v1.24.2。
我不想在闪存介质上造成任何不必要的写入周期。
这就是为什么我想知道在目录上发出chmod 03755
(with ) 是否会导致任何磁盘写入 I/O。umask 022
换句话说,是否需要插入检查目录权限是否已正确设置,并且仅在权限不正确时才执行 chmod?
或者目录权限检查是浪费精力,因为 busyboxchmod
不会导致任何磁盘写入 I/O什么时候权限不需要任何更改?
答案1
chmod 03755
意味着对chmod("file", 03755)
文件执行 a 操作,这反过来会检查您是否有权这样做,并在可能的情况下执行它(如果没有,则返回错误),这反过来至少会更新文件的 ctime,可能会导致要生成的审核记录等
如果 busybox 不遗余力地检查是否有必要,则 ctime 将不会更新,这将是一个错误。它还会消除操作的原子性质,这也将是一个错误。
因此,即使不是立即完成,也会对存储设备进行一些相关的写入。
所以你必须自己做检查。
如果stat
在您的 busybox 版本中启用了该小程序:
[ "$(stat -Lc%a file)" = 3755 ] || chmod 3755 file
答案2
目前我的不太理想的解决方案是打印命令之前和之后的写入次数。
首先,我禁用磁盘写入缓存:
# hdparm -W 0 /dev/sda
然后我尝试通过重复以下操作来排除其他进程的磁盘写入内核磁盘统计命令几次:
# cat /sys/block/sda/stat | awk '{ print $5 }';chmod 03755 /opt/etc/tinydns;cat /sys/block/sda/stat | awk '{ print $5 }'
1725
1725
# cat /sys/block/sda/stat | awk '{ print $5 }';chmod 03755 /opt/etc/tinydns;cat /sys/block/sda/stat | awk '{ print $5 }'
1725
1725
# cat /sys/block/sda/stat | awk '{ print $5 }';chmod 03755 /opt/etc/tinydns;cat /sys/block/sda/stat | awk '{ print $5 }'
1725
1725
我猜想在这种情况下chmod
不会发出任何磁盘输出/写入活动。
答案3
您可以通过在相应的文件上使用“strace chmod 03755”来查找。您可能已将 strace 添加到您的 busybox 映像中。