使用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=

需要掛載傳播標志: sharedslave或者 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM