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” 博客,谢绝转载!

  • 相关阅读:
    技术必备:推荐一款接口自动化测试数据校验神器
    提高GUI自动化测试稳定性解决方案
    新特性,推荐一款超强接口管理神器 Apifox
    测试开发:从0到1学习如何测试API网关
    接口自动化测试,一键快速校验接口返回值全部字段
    测试工程师必学:测试人员如何深入了解项目
    Django+Vue+Docker搭建接口测试平台实战
    如何开展线上全链路压测思路分享
    刚转行1年测试新手:学习Python编程经验实战分享
    测开新手:从0到1,自动化测试接入Jenkins学习
  • 原文地址:https://www.cnblogs.com/sjy000/p/4638157.html
Copyright © 2011-2022 走看看