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服务器)
二、原理
三、配置
(注意: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的更多相关文章
- 查看Linux系统的USB设备
查看Linux系统的USB设备 lsusb (centos没有该命令) dmesg (内核日志会输出) 执行dmesg
- Virtualbox使用点滴(共享USB设备,Linux下我的用户没有加到vboxuser中去)
由于网银客户端的问题,只能够在windows环境下支付,所以一直保存着一个激活的virtualbox下的windows,用来完成在线支付. 过去这个激活的windows是安装在ubuntu 10.10 ...
- 虚拟机下Linux读取USB设备的问题虚拟机下Linux无法读取USB设备的解决方案
我们在虚拟机中识别USB设备有三种情况导致Linux系统不能读取到USB设备: 1. .当虚拟机的USB服务没有开启的时候 2. 若虚拟机的USB连接的设置选项没有设置好 3. Widows抢先一步, ...
- Linux下查看USB设备信息
首先需要将usbfs挂载一下,然后才能查看.$ mount -t usbfs none /proc/bus/usb$ cat /proc/bus/usb/devices或者在文件(/etc/fsta ...
- Linux下复位USB设备
有时候USB设备出错,这时我们希望通过软件复位一下USB设备,可以参考下面这段代码: #include <stdio.h> #include <unistd.h> #inclu ...
- Linux网络共享管理(ssh,nfs,samba)
OpenSSH服务器: ssh协议:提供安全的ssh环境用于远程管理,默认端口:22: 服务名称:sshd openssh-server包的安装文件: 使用ssh客户端程序: 连接目标主机: ssh ...
- Linux下查看USB设备的VID、PID命令
Linux下查看PID命令 cat /proc/bus/usb/devices 或 lsusb 方法一:在/etc/init.d/rcS中添加mount -t usbfs none /proc/bus ...
- Linux下的硬件驱动——USB设备(转载)
usb_bulk_msg函数 当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当你需要连续地对设备进行读/写时,建议你建立一个自己的urbs,同时将urbs 提 ...
- Linux主机共享目录给Windows主机的方法
Linux主机共享目录可以通过samba来实现 首先,来看下百科上关于samba的介绍: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Ser ...
随机推荐
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- C#中如何创建PDF网格并插入图片
这篇文章我将向大家演示如何以编程的方式在PDF文档中创建一个网格,并将图片插入特定的网格中. 网上有一些类似的解决方法,在这里我选择了一个免费版的PDF组件.安装控件后,创建新项目,添加安装目录下的d ...
- VS2015使用scanf报错的解决方案
1.在程序最前面加: #define _CRT_SECURE_NO_DEPRECATE 2.在程序最前面加: #pragma warning(disable:4996) 3.把scanf改为scanf ...
- ASP.NET MVC——模型绑定
这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不 ...
- Android Socket连接PC出错问题及解决
最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.
- Android—应用程序开机自启
android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...
- JAVA 设计模式之策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...
- Linux网络属性配置
目录 IP地址分类 如何将Linux主机接入到网络中 网络接口的命名方式 ifcfg系列命令 如何配置主机名 如何配置DNS服务器指向 iproute2系列命令 Linux管理网络服务 永久生效配置路 ...
- 支付宝web支付
过程 1. 用户下单 2. 商户后台产生订单 3. 请求支付宝web支付页面(将订单信息返回给用户---放在form里面---隐藏起来-----并通过脚本自动提交此form到支付宝web支付页) 4. ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...