zoukankan      html  css  js  c++  java
  • Linux自动共享USB设备:udev+Samba

    一、概述

      公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\192.168.1.10)访问里面的内容,不需要写入权限。当时听完这需求,我这新人表示惊呆了,立刻上网搜相关文档,并跑去问主管,这功能有人实现了不?主管很肯定地说,必须的。网上搜到的技术文档只有插入USB设备自动挂载,自动共享没搜到,这下只好靠自己了。

      经过一番折腾总算在Ubuntu14.04桌面版实现了该功能,但还不完美,例如:默认只共享出来5个USB设备,USB1~5,拔出后设备还存在。文件系统支持常见的FAT32/NTFS/exFAT格式。好想吐槽,完成后还不知道这奇葩的需求究竟用来做什么...

      实现过程:

      1、插入USB设备,自动挂载(udev规则)

      2、挂载后,使用SMB协议共享到网络上,客户端有读取权限(Samba服务器)

    二、原理

      使用 udev 高效、动态地管理 Linux 设备文件

      用udev自动挂载usb设备

      CentOS 6.3下Samba服务器的安装与配置

    三、配置

    注意:Ubuntu 14.04的Samba安装上后,服务默认开机启动,并且SELinux和防火墙都未影响服务,其他发行版可能需要配置。)

    1、安装exFat包,支持exFAT格式的文件系统

    root@Ubuntu1:~# sudo 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配置文件

    root@Ubuntu1:~# vim /etc/samba/smb.conf 
    [USB1]
        comment = USB1
        path = /media/usb1   #第一个USB挂载路径,对应前面定义的udev规则
        browseable = yes    #浏览权限
        guest ok = yes     #匿名共享
        writeable = yes    #是否可写
    
    [USB2]
        comment = USB2
        path = /media/usb2
        browseable = yes
        guest ok = yes
        writeable = yes
    
    [USB3]
        comment = USB3
        path = /media/usb3
        browseable = yes
        guest ok = yes
        writeable = yes
    
    [USB4]
        comment = USB4
        path = /media/usb4
        browseable = yes
        guest ok = yes
        writeable = yes
    
    [USB5]
        comment = USB5
        path = /media/usb5
        browseable = yes
        guest ok = yes
    writeable
    = yes

    5、重新加载配置文件

    root@Ubuntu1:/etc/samba# /etc/init.d/smbd reload

    四、测试

        U盘1:金士顿 2G、FAT32

        U盘2:SanDisk 8G、FAT32

        U盘3:SanDisk 8G、NTFS

      √  U盘4:读卡器 8G、exFAT

      √  移动硬盘:ZALMAN 60G、NTFS

    效果如下:

    五、现存问题

      ● 只共享5个USB设备,USB1~5,拔出后设备还存在

      ● 共享内容只有读权限,不可写入

      ● udev规则有时不生效,USB设备拔出后设备不卸载,占用设备号。如插入sdb1,拔出后sdb1依旧存在,再次插入变为了sdc1,可用数量会减少

      (可写Shell脚本自动卸载解决)

    本文出自 “运维菜鸟.log” 博客,谢绝转载!

  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/sjy000/p/4638157.html
Copyright © 2011-2022 走看看