我有一台运行 CentOS 7 的计算机。我试图设置一个 udev 规则,以便在连接 USB 驱动器(名为“sdb1”)时自动将其安装到 /mnt/flash。
udev 脚本不起作用(见下文),因此我将命令放入 bash 脚本中,并让 udev 运行 bash 脚本,以便我可以看到发生了什么。
问题#1: 如果我尝试从 bash 脚本直接创建 /mnt/flash,由于根文件系统是只读的,它会失败。我可以确认根文件系统不是只读的。我的系统已经启动了。但是,如果我插入 USB 驱动器,让 udev 运行我的脚本,当我运行“mount | ”时就足够了。我的脚本中的 logger' 显示 root 是只读的。
我通过在脚本顶部运行“mount -o remount,rw /”解决了这个问题。
问题#2: 我能够成功创建 /mnt/flash 并将 /dev/sdb1 挂载到 /mnt/flash 。我运行'安装|执行此操作后,查看它安装在 /var/log/messages 中。然而,归根结底,/dev/sdb1 并未挂载。我什至在脚本中延迟了 5 秒并运行“mount |”第二次记录。两次都显示 /dev/sdb1 已安装到 /mnt/flash。但是,如果我在所有这一切发生时从不同的终端运行“mount”,我永远不会看到 /dev/sdb1 安装在任何地方。
我是不是疯了,或者 udev 在运行时对文件系统做了一些奇怪的事情?
udev 脚本:/etc/udev/rules.d/99-usb-automount.rules
#Only operate on sdb1
KERNEL!="sdb1", GOTO="usb-automount-end"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="usb-automount-end"
#import useful variables from blkid program
IMPORT{program}="/sbin/blkid -o udev -p %N"
#ignore anything other than vfat filesystems
ACTION=="add", ENV{ID_FS_TYPE}!="vfat", GOTO="usb-automount-end"
#remount root as read-write. Not sure why we have to do this!
#ACTION=="add", RUN+="/bin/mount -o remount,rw /"
#mount to /mnt/flash
#ACTION=="add", RUN+="/bin/mkdir -p /mnt/flash"
#ACTION=="add", RUN+="/bin/mount -t vfat -o dmask=000,fmask=111 /dev/%k /mnt/flash"
ACTION=="add", RUN+="/root/test_run.sh", OPTIONS="last_rule"
#clean up after removal
#ACTION=="remove", RUN+="/bin/umount -l /mnt/flash"
#label for goto end
LABEL="usb-automount-end"
这是/root/test_run.sh:
#!/bin/bash -x
logger "running mount"
mount | logger
logger "remounting root"
mount -o remount,rw / 2>&1 | logger
logger "remount done"
mount | logger
logger "Running script. Adding dir"
mkdir -p /mnt/flash2 2>&1 | logger
logger "Directory added... mounting."
mount -t vfat -o dmask=000,fmask=111 /dev/sdb1 /mnt/flash2 2>&1 | logger
logger "Mounted"
mount | logger
logger "Sleeping 5 then re-checking"
sleep 5
mount | logger
编辑1:禁用 SELinux 修复了问题#1。但是,我仍然无法让 /dev/sdb1 在 udev 之后保持挂载状态。看起来仍然有几乎第二个挂载表是从 udev 上下文中维护的。
答案1
问题#1是由 SELinux 引起的。由于我的系统不需要它,所以我只是将其禁用。
问题#2是由 udev 设置(在 systemd 脚本中指定)引起的,该设置使 udev 命名空间保留安装标志的“从属”副本。将其更改为“共享”解决了问题。在这里查看更详细的答案:https://unix.stackexchange.com/a/154318/41988