当前位置: 技术问答>linux和unix
linux下USB问题急!!
来源: 互联网 发布时间:2016-06-04
本文导语: 小弟最近在做linux下的usb存储。用的是2.6.14的内核。主要实现USB的热插拔。 现在小弟是这么做的。做一个监控线程,如果发现有文件 /dev/scsi/host0/bus0/target0/lun0/part1说明USB设备被插上了。然后mount /../../../part1 /mnt/usb/ ...
小弟最近在做linux下的usb存储。用的是2.6.14的内核。主要实现USB的热插拔。
现在小弟是这么做的。做一个监控线程,如果发现有文件 /dev/scsi/host0/bus0/target0/lun0/part1说明USB设备被插上了。然后mount /../../../part1 /mnt/usb/
现在在芯片外做了一个umount的检测管脚。如果检测到管脚为低电平执行umount /mnt/usb 然后拔出USB设备。
这样就不会造成强行拔插对文件系统造成损坏。
但是现在的问题是:如果再次插上USB设备时在/dev/scsi/目录下会出现这样两个文件夹 host0 和host1但是host0里已经没有东西了。文件夹又删除不了。如果再次插拔的话又会出现host2 , host3等。只有重新启动设备这些没有用的host才会消除。这让我很是郁闷。检测的时候不知道检测哪一个。
现在小弟是这么做的。做一个监控线程,如果发现有文件 /dev/scsi/host0/bus0/target0/lun0/part1说明USB设备被插上了。然后mount /../../../part1 /mnt/usb/
现在在芯片外做了一个umount的检测管脚。如果检测到管脚为低电平执行umount /mnt/usb 然后拔出USB设备。
这样就不会造成强行拔插对文件系统造成损坏。
但是现在的问题是:如果再次插上USB设备时在/dev/scsi/目录下会出现这样两个文件夹 host0 和host1但是host0里已经没有东西了。文件夹又删除不了。如果再次插拔的话又会出现host2 , host3等。只有重新启动设备这些没有用的host才会消除。这让我很是郁闷。检测的时候不知道检测哪一个。
|
你是想要检测某个正在存取某一文件或者是设备的进程,用fuser检测吧。。。。
fuser
取得一个正在存取某个或某些文件(或目录)的进程ID. 使用-k 选项将会杀掉这些进程. 对于系统安全来说, 尤其是在脚本中想阻止未被授权的用户存取系统服务的时候, 这个命令就显得很有用了.
bash$ fuser -u /usr/bin/vim
/usr/bin/vim: 3207e(bozo)
bash$ fuser -u /dev/null
/dev/null: 3009(bozo) 3010(bozo) 3197(bozo) 3199(bozo)
当正常的插入或删除保存的媒体, 比如CD ROM 或者USB 闪存设备的时候, fuser 的应用也显得特别重要. 有时候当你想umount 一个设备失败的时候(出现设备忙的错误消息), 这意味着某些用户或进程正在存取这个设备. 使用fuser -um /dev/device_name 可以搞定这些,这样你就可以杀掉所有相关的进程.
bash$ umount /mnt/usbdrive
umount: /mnt/usbdrive: device is busy
bash$ fuser -um /dev/usbdrive
/mnt/usbdrive: 1772c(bozo)
bash$ kill -9 1772
bash$ umount /mnt/usbdrive
fuser 的-n 选项可以获得正在存取某一端口的进程. 当和nmap 命令组合使用的时候尤其有用.
root# nmap localhost.localdomain
PORT STATE SERVICE
25/tcp open smtp
root# fuser -un tcp 25
25/tcp: 2095(root)
root# ps ax | grep 2095 | grep -v grep
2095 ? Ss 0:00 sendmail: accepting connections
fuser
取得一个正在存取某个或某些文件(或目录)的进程ID. 使用-k 选项将会杀掉这些进程. 对于系统安全来说, 尤其是在脚本中想阻止未被授权的用户存取系统服务的时候, 这个命令就显得很有用了.
bash$ fuser -u /usr/bin/vim
/usr/bin/vim: 3207e(bozo)
bash$ fuser -u /dev/null
/dev/null: 3009(bozo) 3010(bozo) 3197(bozo) 3199(bozo)
当正常的插入或删除保存的媒体, 比如CD ROM 或者USB 闪存设备的时候, fuser 的应用也显得特别重要. 有时候当你想umount 一个设备失败的时候(出现设备忙的错误消息), 这意味着某些用户或进程正在存取这个设备. 使用fuser -um /dev/device_name 可以搞定这些,这样你就可以杀掉所有相关的进程.
bash$ umount /mnt/usbdrive
umount: /mnt/usbdrive: device is busy
bash$ fuser -um /dev/usbdrive
/mnt/usbdrive: 1772c(bozo)
bash$ kill -9 1772
bash$ umount /mnt/usbdrive
fuser 的-n 选项可以获得正在存取某一端口的进程. 当和nmap 命令组合使用的时候尤其有用.
root# nmap localhost.localdomain
PORT STATE SERVICE
25/tcp open smtp
root# fuser -un tcp 25
25/tcp: 2095(root)
root# ps ax | grep 2095 | grep -v grep
2095 ? Ss 0:00 sendmail: accepting connections
|
用udev 096版本,需要更改内核支持,自行编写rules文件。
|
如何在不进入桌面的情况下实现U盘自动挂载?
在 /etc/udev/rules.d 目录下创建文件 10_usbkey.rules, 其内容如下
KERNEL=="sda1", SUBSYSTEM=="block", RUN+="/root/usbmount.sh"
然后, 在 /root 目录中创建文件 usbmount.sh, 其内容为
#!/bin/bash
LOG=/var/log/usb-hotplug.log
lap=$(date --rfc-3339=ns)
echo "$lap: $DEVPATH requesting $ACTION" >> $LOG
if [ $ACTION == "add" ]
then
mount -t vfat -o umask=000,noatime,async,codepage=936,iocharset=gb2312
/dev/sda1 /media/usbkey
elif [ $ACTION == "remove" ]
then
umount -l /media/usbkey
fi
并把该文件属性设置为可执行, chmod a+x usbmount.sh
注意, 如果你的 linux 上 locale 是 zh_CN.utf-8, 需要把上面的 iocharset=gb2312 改成 iocharset=utf8
在 /etc/udev/rules.d 目录下创建文件 10_usbkey.rules, 其内容如下
KERNEL=="sda1", SUBSYSTEM=="block", RUN+="/root/usbmount.sh"
然后, 在 /root 目录中创建文件 usbmount.sh, 其内容为
#!/bin/bash
LOG=/var/log/usb-hotplug.log
lap=$(date --rfc-3339=ns)
echo "$lap: $DEVPATH requesting $ACTION" >> $LOG
if [ $ACTION == "add" ]
then
mount -t vfat -o umask=000,noatime,async,codepage=936,iocharset=gb2312
/dev/sda1 /media/usbkey
elif [ $ACTION == "remove" ]
then
umount -l /media/usbkey
fi
并把该文件属性设置为可执行, chmod a+x usbmount.sh
注意, 如果你的 linux 上 locale 是 zh_CN.utf-8, 需要把上面的 iocharset=gb2312 改成 iocharset=utf8
|
0. 参考Linux内核源代码下 Documentation/udev.txt ,具体文件名忘了,到Documentation下查 udev 文件吧。goolge udev的相关概念。
1. 下载UDEV 096版本,根据手册进行编译;注意要编译 usb_id ,具体方法为根据Makefile中的说明,make extras="usb_id " ...
2. 配置内核,支持hotplug;
3. 将内核更新到系统,将udev安装到系统,根据udev源代码下的 udev.7 (这个我也忘了),编写udev的rules文件。
步骤很多,我就不详细展开了,我想我说了这么多,你可以通过自己动手做搞定这个问题。来论坛提问,得到了思路要努力去尝试。扯远了。
|
直接用if [ -e ...]检测里面有没有东西。。。然后再用ls -tl或者是find . -ctime去寻找最后一个生成的文件行不行啊、、、、????