一、概述
公司最近要我實現USB設備插入Ubuntu後,自動共享到網絡上,能像Windows共享一樣(如\\192.168.1.10)訪問裏面的內容,不需要寫入權限。當時聽完這需求,我這新人表示驚呆了,立刻上網搜相關文檔,並跑去問主管,這功能有人實現了不?主管很肯定地說,必須的。網上搜到的技術文檔只有插入USB設備自動掛載,自動共享沒搜到,這下只好靠自己了。
經過一番折騰總算在Ubuntu14.04桌面版實現了該功能。本文檔默認共享5個USB設備,USB1~5;USB設備插入自動共享到「\\主機IP\Share」目錄下,拔出時共享目錄即時消失;文件系統支持常見的FAT32/NTFS/exFAT格式。
實現過程:
1、插入USB設備,自動掛載(udev規則)
2、掛載後,使用SMB協議共享到網絡上,客戶端有讀取權限(Samba服務器)
3、後臺自動執行卸載設備腳本
二、原理
三、配置
(注意:Ubuntu 14.04的Samba安裝上後,服務默認開機啓動,並且SELinux和防火牆都未影響服務,其他發行版可能需要配置。)
1、安裝exFat包,支持exFAT格式的文件系統
root@Ubuntu1:~# apt-get install exfat-utils
2、定義udev規則,實現USB設備自動掛載
root@Ubuntu1:~# cd /etc/udev/rules.d/#udev規則目錄 root@Ubuntu1:/etc/udev/rules.d# vim 70-persistent-net.rules#編輯規則文件 KERNEL!="sdb?", GOTO="automount_exit" ACTION=="add", SUBSYSTEM=="block", RUN+="/bin/mkdir /media/usb1", RUN+="/bin/mount -o uid=1000,user,codepage=936,utf8 $root/%k /media/usb1" ACTION=="remove", SUBSYSTEM=="block", RUN+="/bin/umount /media/usb1", RUN+="/bin/rmdir /media/usb1" LABEL="automount_exit" #當檢測到sdb的設備,執行創建目錄並掛載;設備刪除後,卸載並刪除目錄 KERNEL!="sdc?", GOTO="automount_exit" ACTION=="add", SUBSYSTEM=="block", RUN+="/bin/mkdir /media/usb2", RUN+="/bin/mount -o uid=1000,user,codepage=936,utf8 $root/%k /media/usb2" ACTION=="remove", SUBSYSTEM=="block", RUN+="/bin/umount /media/usb2", RUN+="/bin/rmdir /media/usb2" LABEL="automount_exit" KERNEL!="sdd?", GOTO="automount_exit" ACTION=="add", SUBSYSTEM=="block", RUN+="/bin/mkdir /media/usb3", RUN+="/bin/mount -o uid=1000,user,codepage=936,utf8 $root/%k /media/usb3" ACTION=="remove", SUBSYSTEM=="block", RUN+="/bin/umount /media/usb3", RUN+="/bin/rmdir /media/usb3" LABEL="automount_exit" KERNEL!="sde?", GOTO="automount_exit" ACTION=="add", SUBSYSTEM=="block", RUN+="/bin/mkdir /media/usb4", RUN+="/bin/mount -o uid=1000,user,codepage=936,utf8 $root/%k /media/usb4" ACTION=="remove", SUBSYSTEM=="block", RUN+="/bin/umount /media/usb4", RUN+="/bin/rmdir /media/usb4" LABEL="automount_exit" KERNEL!="sdf?", GOTO="automount_exit" ACTION=="add", SUBSYSTEM=="block", RUN+="/bin/mkdir /media/usb5", RUN+="/bin/mount -o uid=1000,user,codepage=936,utf8 $root/%k /media/usb5" ACTION=="remove", SUBSYSTEM=="block", RUN+="/bin/umount /media/usb5", RUN+="/bin/rmdir /media/usb5" LABEL="automount_exit" root@Ubuntu1:/etc/udev/rules.d# shutdown -r now#重啓系統
3、安裝Samba
root@Ubuntu1:~# apt-get install samba samba-common
4、編輯Samba配置文件,共享/media目錄
root@Ubuntu1:~# vim /etc/samba/smb.conf [Share] comment = Share path = /media#共享路徑 browseable = yes guest ok = yes#匿名共享 writeable = yes root@Ubuntu1:/etc/samba# /etc/init.d/smbd reload#重新加載
5、編寫腳本,防止系統BUG不自動卸載設備
root@Ubuntu1:~# vim usb.sh #!/bin/bash usb1=/dev/sdb? usb2=/dev/sdc? usb3=/dev/sdd? usb4=/dev/sde? usb5=/dev/sdf?#變量賦值 while true;#無限循環 do if ! [ -e $usb1 ] && ! [ -e $usb2 ] && ! [ -e $usb3 ] && ! [ -e $usb4 ] && ! [ -e $usb5 ] #如果不存在USB1~5的設備文件 then /bin/umount /media/usb* 2>/dev/null /bin/rmdir /media/usb* 2>/dev/null#執行卸載和刪除目錄操作 else exit fi sleep 1#每秒執行一次 done root@Ubuntu1:~# chmod +x usb.sh#執行權限
6、移動腳本到/Shell目錄
root@Ubuntu1:~# mkdir /Shell root@Ubuntu1:~# mv usb.sh /Shell
7、腳本開機自啓
root@Ubuntu1:~# vim /etc/rc.local nohup /Shell/usb.sh &#腳本後臺執行
四、測試
√ U盤1:金士頓 2G、FAT32
√ U盤2:SanDisk 8G、FAT32
√ U盤3:SanDisk 8G、NTFS
√ U盤4:讀卡器 8G、exFAT
√ 移動硬盤:ZALMAN 60G、NTFS
效果如下: