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