使用udev实现显示器的热插拔和usb的自动挂载
udev:用来监听硬件设备是否发生改变,并可以给硬件设备命名 ,也可以在硬件发生改变之后执行脚本
使用udev检测显示器是否发生变化,然后执行脚本,解决linux显示器热插拔问题
先补充一点:
[root@localhost ~]# cat /sys/class/drm/card0-VGA-1/status
connected
connectd 表示VGA口处于连接状态
拔掉则显示disconnected 脚本里面可以通过这来判断显示器是否连接
vim /etc/udev/rules.d/99-monitor-watch.rules
ACTION=="change", SUBSYSTEM=="drm", RUN+="/usr/local/bin/watch_monitor.sh" #当显示器发生改变的时候执行脚本
vim /usr/local/bin/watch_monitor.sh
#!/bin/bash DEVICES=$(find /sys/class/drm/*/status) while read l do dir=$(dirname $l); status=$(cat $l); dev=$(echo $dir | cut -d\- -f 2-); if [ $(expr match $dev "HDMI") != "0" ] then #REMOVE THE -X- part from HDMI-X-n dev=HDMI${dev#HDMI-?-} else dev=$(echo $dev | tr -d '-') fi if [ "connected" == "$status" ] then echo $dev "connected" DP1=$dev fi done <<< "$DEVICES" function dp_connect(){ ps aux |grep Xorg|grep tty1|awk '{print $2}'|xargs -x kill # xrandr --output $DP1 --auto echo "dp_connect" } function dp_disconnect(){ echo "dp_disconnect" } test $DP1 &> /dev/null && dp_connect || dp_disconnect
chmod +x /usr/local/bin/watch_monitor.sh
缺点:每次插上显示器 都会回到登录页面,
2,使用xrandr的方式实现热插拔
vim /etc/udev/rules.d/99-monitor-watch.rules
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", RUN+="/usr/bin/xrandr --output VGA1 --auto"
udevadm control --reload-rules
可以使用xrandr的方式来显示。这样就不会回到登录页面
二: 使用udev解决usb自动挂载
vim /etc/udev/rules.d/100-mountsda.rules
1 KERNEL=="sd[b-z]?",SUBSYSTEM=="block",RUN+="/usr/local/src/mountusb.sh %k $env{ACTION}" 2 KERNEL=="sd[b-z]",SUBSYSTEM=="block",RUN+="/usr/local/src/mountusb.sh %k $env{ACTION}"
因为本地磁盘是sda 所以从b开始
支持ntfs格式需要安装ntfs-3g 包存在扩展源,所以要先安装epel-release,然后编写自动挂载脚本
1 yum install epel-release -y 2 yum install ntfs-3g -y 3 4 vim /usr/local/src/mountusb.sh 5 6 #!/bin/sh 7 DEV_NODE="/dev/"$1 8 MOUNT_NODE="/mnt/"$1 9 echo -e "$(date) \n $2 " >> /tmp/mount.txt 10 if [ $2 == "add" ]; then 11 test ! -e $MOUNT_NODE && mkdir $MOUNT_NODE 12 ntfs-3g -o sync $DEV_NODE $MOUNT_NODE || mount -o sync -o iocharset=utf8 $DEV_NODE $MOUNT_NODE 13 #fi 14 elif [ $2 == "remove" ]; then 15 umount -l $MOUNT_NODE 16 rm -fr $MOUNT_NODE 17 fi
centos7的udev有时候mount不成功
原因:默认是slave
MountFlags=
需要挂载传播标志: shared
,slave
或者 private
,它控制在文件系统命名空间中建立了本单位的坐骑流程是否接收或传播的挂载或卸载。见 安装(2) 了解详细信息。默认为shared
。使用 shared
以确保挂载和卸载从主机到容器,反之亦然传播。使用 slave
运行流程,使他们没有装载和卸载的将传播到主机。使用 private
也确保没有从主机装载和卸载将传播到本机的进程“的命名空间。请注意,slave
是指安装在主机上的文件系统可能保持持续固定在该单位的命名空间,从而保持该设备忙。请注意,文件系统命名空间相关的选项(PrivateTmp=
, PrivateDevices=
, ProtectSystem=
, ProtectHome=
, ReadOnlyPaths=
,InaccessiblePaths=
和 ReadWritePaths=
)要求安装,并从单位的文件系统命名空间卸载传播被禁止,因此降级shared
到 slave
。
解决方法:
cp /usr/lib/systemd/system/systemd-udevd.service /etc/systemd/system
sed -i 's/MountFlags=*.$/MountFlags=shared/g' /etc/systemd/system/systemd-udevd.service