在 Linux 上自动检测/安装 SDCard 并为其运行脚本

在 Linux 上自动检测/安装 SDCard 并为其运行脚本

我目前正在运行 SME 服务器,需要在将 SD 卡连接到服务器时运行一个脚本。脚本本身运行良好(它会复制卡中的内容),但脚本的自动安装和执行是我遇到的问题。

我有一个由 10 个 USB 端口组成的 USB 集线器;显示为:

[root@server ~]# lsusb 

Bus 004 Device 002: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  
Bus 003 Device 001: ID 0000:0000  
Bus 002 Device 001: ID 0000:0000  
Bus 001 Device 055: ID 1a40:0101 TERMINUS TECHNOLOGY INC.  
Bus 001 Device 051: ID 1a40:0101 TERMINUS TECHNOLOGY INC.  
Bus 001 Device 050: ID 1a40:0101 TERMINUS TECHNOLOGY INC. 
Bus 001 Device 001: ID 0000:0000  

(中心是 TERMINUS TECHNOLOGY INC 条目)


由于我无法将 SD 卡直接插入服务器;我使用插入集线器的 USB 转 SD 卡附件(共 10 个)来读取卡。将 10 个附件(不带卡)插入集线器后;lsusb 产生以下内容:

[root@server ~]# lsusb 

Bus 004 Device 002: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  
Bus 003 Device 001: ID 0000:0000    
Bus 002 Device 001: ID 0000:0000    
Bus 001 Device 073: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 072: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 071: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 070: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 069: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 068: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 067: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 066: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 065: ID 05e3:0723 Genesys Logic, Inc.   
Bus 001 Device 064: ID 05e3:0723 Genesys Logic, Inc. 
Bus 001 Device 055: ID 1a40:0101 TERMINUS TECHNOLOGY INC.   
Bus 001 Device 051: ID 1a40:0101 TERMINUS TECHNOLOGY INC.   
Bus 001 Device 050: ID 1a40:0101 TERMINUS TECHNOLOGY INC.   
Bus 001 Device 001: ID 0000:0000  

如您所见,读者是“Gensys Logic, Inc”条目。

将 SD 卡插入读卡器不会影响 lsusb(读取内容与上文完全相同),但我的系统可以正常识别卡;如 dmesg 所示:

Attached scsi generic sg11 at scsi54, channel 0, id 0, lun 0,  type 0  
USB Mass Storage device found at 73  
SCSI device sdd: 31388672 512-byte hdwr sectors (16071 MB)  
sdd: Write Protect is on  
sdd: Mode Sense: 03 00 80 00  
sdd: assuming drive cache: write through  
SCSI device sdd: 31388672 512-byte hdwr sectors (16071 MB)  
sdd: Write Protect is on  
sdd: Mode Sense: 03 00 80 00  
sdd: assuming drive cache: write through  
 sdd: sdd1  
SCSI device sdd: 31388672 512-byte hdwr sectors (16071 MB)  
sdd: Write Protect is on  
sdd: Mode Sense: 03 00 80 00  
sdd: assuming drive cache: write through  
SCSI device sdd: 31388672 512-byte hdwr sectors (16071 MB)  
sdd: Write Protect is on  
sdd: Mode Sense: 03 00 80 00  
sdd: assuming drive cache: write through  
 sdd: sdd1  
SCSI device sdd: 31388672 512-byte hdwr sectors (16071 MB)  
sdd: Write Protect is on  
sdd: Mode Sense: 03 00 80 00  
sdd: assuming drive cache: write through  
SCSI device sdd: 31388672 512-byte hdwr sectors (16071 MB)  
sdd: Write Protect is on  
sdd: Mode Sense: 03 00 80 00  
sdd: assuming drive cache: write through  
 sdd: sdd1  

如果我手动挂载 sdd1(mount /dev/sdd1 /somedirectory/),这就可以正常工作。

我真正想要的是一种解决方案,可以在将每张卡输入读卡器时自动安装它们;并为它们执行脚本(这将涉及将其内容复制到另一个目录)。

我的问题是我不知道该怎么做;我不认为 udev 会工作,因为 USB 设备不会改变;如果我能以某种方式让 udev 与/dev/disk/按路径/不过我认为这是可行的(它似乎保持了恒定的条目)。

ls /dev/disk 返回:

pci-0000:00:1d.7-usb-0:4.1.1.1:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.1.1.2:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.1.1.3:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.1.1.4:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.1.2:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.1.3:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.1.4:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.2:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.3:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.4:1.0-scsi-0:0:0:0  
pci-0000:00:1d.7-usb-0:4.4:1.0-scsi-0:0:0:0-part1  
pci-0000:0b:01.0-scsi-0:0:1:0  
pci-0000:0b:01.0-scsi-0:0:1:0-part1  
pci-0000:0b:01.0-scsi-0:0:1:0-part2  

从上面我们可以看到我只有一张卡插在读卡器上(pci-0000:00:1d.7-usb-0:4.4:1.0-scsi-0:0:0:0-part1)。

mount /dev/disk/by-path/pci-0000\:00\:1d.7-usb-0\:4.4\:1.0-scsi-0\:0\:0\:0-part1 

可以工作并将卡放置在 /media/usbdisk/ 下,但是:

mount /dev/disk/by-path/pci-0000\:00\:1d.7-usb-0\:4.4\:1.0-scsi-0\:0\:0\:0-part1 slot1/

不起作用,并返回“mount:无法获取 /dev/disk/by-path/pci-0000 的地址”

任何想法和解决方案都很好,我之前已经看到过这里很多人的知识,所以我希望有人可以帮助我。

谢谢

答案1

我遇到了同样的问题,花了 3 天时间试图让 @#$%! SME 安装 USB HDD。我想做一个外部 USB 备份,但它拒绝正确安装。它给出了与你指出的类似的错误。问题本身并不完全相同,因为它是 HDD 而不是 SD 卡,但肯定是相似的。

如果您执行 cat /proc/mdstat,您将看到 RAID 配置中列出的硬盘,但它还会显示还有另一个驱动器(当前未安装)作为可添加到 RAID 的可选驱动器。在我的情况下,它是 sdc,因为 sda 和 sdb 组成了 RAID。

然后我使用 fdisk /dev/sdc 删除了 sdc 上的分区,添加了一个新的主分区并保存了它。mkfs.ext3 -L MyLabel /dev/sdc1(给它一个标签名)mkdir -p /media/usbdevice

将其移除,等待几秒钟然后重新插入。egrep "(kernel|fstab|scsi).*(usb|USB)" /var/log/messages 现在应该会显示它已使用标签安装了 USB 驱动器。

viola fstab-sync 完成了它的工作,您可以开始了。

答案2

由于 SME 服务器有 hal 和 udev,因此您可以编写一个小的 Python 脚本/守护进程(该链接谈论的是 USB 设备,但您可以将其修改为任何存储类型)检测媒体插入并执行操作。

答案3

您正在寻找一个名为 的程序halevt。请注意,您需要熟悉编辑 XML 才能让它执行您想要的操作。

相关内容