一、概述

  公司最近要我实现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 -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” 博客,谢绝转载!

Linux自动共享USB设备:udev+Samba的更多相关文章

  1. 查看Linux系统的USB设备

    查看Linux系统的USB设备 lsusb (centos没有该命令) dmesg (内核日志会输出) 执行dmesg

  2. Virtualbox使用点滴(共享USB设备,Linux下我的用户没有加到vboxuser中去)

    由于网银客户端的问题,只能够在windows环境下支付,所以一直保存着一个激活的virtualbox下的windows,用来完成在线支付. 过去这个激活的windows是安装在ubuntu 10.10 ...

  3. 虚拟机下Linux读取USB设备的问题虚拟机下Linux无法读取USB设备的解决方案

    我们在虚拟机中识别USB设备有三种情况导致Linux系统不能读取到USB设备: 1. .当虚拟机的USB服务没有开启的时候 2. 若虚拟机的USB连接的设置选项没有设置好 3. Widows抢先一步, ...

  4. Linux下查看USB设备信息

    首先需要将usbfs挂载一下,然后才能查看.$ mount -t usbfs none /proc/bus/usb$ cat  /proc/bus/usb/devices或者在文件(/etc/fsta ...

  5. Linux下复位USB设备

    有时候USB设备出错,这时我们希望通过软件复位一下USB设备,可以参考下面这段代码: #include <stdio.h> #include <unistd.h> #inclu ...

  6. Linux网络共享管理(ssh,nfs,samba)

    OpenSSH服务器: ssh协议:提供安全的ssh环境用于远程管理,默认端口:22: 服务名称:sshd openssh-server包的安装文件: 使用ssh客户端程序: 连接目标主机: ssh ...

  7. Linux下查看USB设备的VID、PID命令

    Linux下查看PID命令 cat /proc/bus/usb/devices 或 lsusb 方法一:在/etc/init.d/rcS中添加mount -t usbfs none /proc/bus ...

  8. Linux下的硬件驱动——USB设备(转载)

    usb_bulk_msg函数 当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当你需要连续地对设备进行读/写时,建议你建立一个自己的urbs,同时将urbs 提 ...

  9. Linux主机共享目录给Windows主机的方法

    Linux主机共享目录可以通过samba来实现 首先,来看下百科上关于samba的介绍: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Ser ...

随机推荐

  1. 对抗密码破解 —— Web 前端慢 Hash

    (更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...

  2. C#中如何创建PDF网格并插入图片

    这篇文章我将向大家演示如何以编程的方式在PDF文档中创建一个网格,并将图片插入特定的网格中. 网上有一些类似的解决方法,在这里我选择了一个免费版的PDF组件.安装控件后,创建新项目,添加安装目录下的d ...

  3. VS2015使用scanf报错的解决方案

    1.在程序最前面加: #define _CRT_SECURE_NO_DEPRECATE 2.在程序最前面加: #pragma warning(disable:4996) 3.把scanf改为scanf ...

  4. ASP.NET MVC——模型绑定

    这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不 ...

  5. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  6. Android—应用程序开机自启

    android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...

  7. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  8. Linux网络属性配置

    目录 IP地址分类 如何将Linux主机接入到网络中 网络接口的命名方式 ifcfg系列命令 如何配置主机名 如何配置DNS服务器指向 iproute2系列命令 Linux管理网络服务 永久生效配置路 ...

  9. 支付宝web支付

    过程 1. 用户下单 2. 商户后台产生订单 3. 请求支付宝web支付页面(将订单信息返回给用户---放在form里面---隐藏起来-----并通过脚本自动提交此form到支付宝web支付页) 4. ...

  10. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...