我有一堆 USB 端口和集线器。当您连接 USB 拇指驱动器时,Linux 会按照先到先得的原则将它们分配给虚拟块设备。无论我将驱动器插入哪个端口,它都会创建 sdd、sde、sdf 等。我们将文件复制到这些驱动器上,当出现错误时,我无法判断错误发生在哪个驱动器上。
我想做的是配置 udev 以便它将物理硬件设备/端口映射到特定的虚拟设备。也就是说,端口 1 => sdd、端口 2 => sde、端口 3 => sdf 等。这可以让我知道错误发生在哪个拇指驱动器上。
我找到了一些资源(例如http://reactivated.net/writing_udev_rules.html),从中我可以看出这是可以做到的。但是我没有这种低级配置的经验。他们让我感到困惑。
有没有其他参考可以让事情更清楚?或者也许是一些为我做的软件?或者一个使它更容易的图书馆?
我们正在小型嵌入式设备上进行开发。该设备是一个运行 OpenEmbedded linux 的 gunstix overo 板。我们的开发几乎已经完成,并且遇到了我们无法弄清楚的最奇怪的错误。
我们有一个 USB 设备(分光光度计),它有一个 USB2.0 连接和一个用于光源的外部电源。典型的行为是插入电源,然后通过 USB 连接到主机。当设备检测到 USB 连接时,设备启动并启用光源和风扇。然后该设备可以被主机系统使用。
问题是,如果在我们打开 Gumstix 之前将设备插入 Gumstix,USB 设备显然没有被系统探测到(因此不会打开)。在正常情况下,当通过插入 USB 电缆初始化连接时,光谱会自行打开并可供系统使用(这通常可以通过“lsusb”看到)。这些事情都没有发生。没有通过“lsusb”检测到设备,也没有我们可以看到的任何类型的 dmesg 错误。 就好像设备没有插入一样。
如果我们拔下 USB 电缆并在系统启动后将其重新插入,该设备确实会显示并正常工作。它打开并显示在 USB 总线上,我们可以通过我们的驱动程序访问它。
在任何其他台式机或笔记本电脑上,当我们插入光谱仪时,主机系统是打开还是关闭都没有关系。这种行为是我认为是“正常的”——USB 系统在启动时被探测和初始化,并且 USB 设备上线。换句话说,只要我们在系统启动后插入 USB 设备,我们的系统就可以正常运行。不幸的是,这在我们的最终产品中是不可能的——一切都是同时发生的。
附加信息:1) 我们尝试在系统关闭时将闪存驱动器连接到系统。正如预期的那样,启动系统会使闪存驱动器联机 2) 没有关于光谱或 USB 设备的消息(使用 dmesg)。“lsusb”仅列出 USB 集线器/控制器。从字面上看,就好像设备不存在且未插入。 3) 我们尝试了来自gumstix 的全新图像和去年的旧图像。两张图都有这个问题。我们使用的所有 3 种 gunstix 设备都存在此问题。
有没有人有什么建议?据我所知,完全模拟 USB 设备的“拔出”和“重新插入”是不可能完全“重新启动”USB 系统的。我觉得正在发生的事情是 USB 总线上没有初始探测会触发 USB 握手,但这在某种程度上特定于光谱。这似乎是内核问题,或者至少是内核如何初始化 USB 子系统的问题。我不太确定。
我已经尝试过gumstix 邮件列表,但之前似乎没有人见过这个问题。关于从哪里开始寻找的任何建议或建议都会很棒。
谢谢!布莱恩
output etc.
$ uname -a
Linux overo 2.6.33 #1 Tue …Run Code Online (Sandbox Code Playgroud) 这是对这个问题的跟进。
我正在组装带有 14 个 SATA 驱动器的存储服务器。
我不想“浪费”操作系统系统的驱动器,所以我想我可以不安装并从 USB 记忆棒运行操作系统。该系统将非常精简(只有一个网络服务器和 ssh 守护进程以及一些自定义脚本)。
有什么理由我不应该这样做吗?像 USB 记忆棒耐用性等?您有使用 U 盘运行服务器系统的经验吗?
我注意到 FreeNAS 建议从 U 盘运行它。
为什么 USB 集线器最多只能使用 7 个端口?有什么技术可以阻止这种情况吗?我认为 USB 寻址允许连接 127 个 USB 设备,但事实并非如此。
编辑:感谢具有更多端口的集线器的链接。有很多有 7 个端口,我从未见过有更多端口的。我不认为 7 是技术限制,我只是想知道为什么 7 看起来如此普遍。
这是我插入 USB 的东西:
我有一个 USB 驱动器安装到 Ubuntu 9.04 服务器安装的文件夹中。挂载选项存储在 /etc/fstab 中,以便于挂载/卸载:
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdb1 /media/backup ntfs nouser,auto,sync 0 3
Run Code Online (Sandbox Code Playgroud)
(我已经将部分更改为 UUID 以查看它是否有助于解决问题)。备份每天早上都在将文件复制到磁盘,没有问题。刚才我试图将其中一个文件复制到另一个文件夹,结果出现错误:
cp: reading `ts01-even.tgz': Input/output error
Run Code Online (Sandbox Code Playgroud)
我发现问题发生是因为/dev/sdb 已更改为/dev/sdc。如果我挂载 /dev/sdc 并尝试再次复制该文件,驱动器将变回 /dev/sdb。将 fstab 文件系统从 /dev/sdX1 更改为 UUID 后,行为没有区别。此外,我曾经能够列出 tarball 的文件内容,但现在尝试这样做会导致上述行为。有任何想法吗?
更新:
运行备份脚本并将备份存储在 USB HD 上不会产生问题,但在 tarball 中列出文件会产生问题。这是 tarball 命令“tar -ztf FILENAME”期间系统日志的输出:
Jul 3 15:09:14 ts01 kernel: [308398.446893] Buffer I/O error on device sdc1, logical block 786433
Jul 3 15:09:28 ts01 ntfs-3g[7468]: ntfs_attr_pread_i: ntfs_pread failed: Input/output error …Run Code Online (Sandbox Code Playgroud) 如果使用 RAID 1 并且发现两个磁盘之间存在任何不一致,则数据将从主磁盘(最有可能是端口号较低的磁盘)复制到辅助磁盘。
1)但是如果主盘损坏,因此两个盘之间的数据差异仅由于主盘的硬件故障而存在怎么办?那么故障数据是否会同步到辅助磁盘?现代硬盘驱动器上是否有校验和以确保不会发生这样的事情?
2) 如果我用 2 个 U 盘构建 RAID 1 会怎样?USB 记忆棒上是否有任何机制来检测读取问题,以便 RAID 不会将损坏的数据同步到另一个 USB 记忆棒,甚至可能覆盖正常的数据?USB 记忆棒的 RAID 1(用于嵌入式系统)是否有意义,或者由于写入耐久性有限,它们可能会在大约同一时间失败?
我正在尝试编辑 Fedora 19 DVD ISO 以添加 kickstart 文件。然后我需要将此 ISO 刻录到 USB 记忆棒上以进行灌输。
启动时我得到的错误是
Warning: Could not boot.
Warning: /dev/root does not exist
Run Code Online (Sandbox Code Playgroud)
为了尝试确定流程的哪一部分失败,我将流程分解为不同的阶段。
第1步:
将原始 ISO“Fedora-19-x86_64-DVD.iso”(可用 ->此处)刻录到 U 盘,看看它是否会安装。
dd if=/path/to/iso of=/dev/sdc
Run Code Online (Sandbox Code Playgroud)
刻录此映像成功,并且安装没有问题。
第2步:
解压 ISO,重新打包并将其刻录到 U 盘,看看是否会安装。请注意:为了便于阅读,本节中的最后一条命令已分解为多行,实际上它是作为一行上的单个命令运行的。
mkdir -p /mnt/linux
mount -o loop /tmp/linux-install.iso /mnt/linux
cd /mnt/
tar -cvf - linux | (cd /var/tmp/ && tar -xf - )
cd /var/tmp/linux
xorriso -as mkisofs -R -J -V "NewFedoraImage" -o ouput/file.iso
-b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 …Run Code Online (Sandbox Code Playgroud) 我的 Linux 服务器(Centos 7.5)的 USB 驱动器处于奇怪的状态。当我尝试将 USB 驱动器上的分区安装到新创建的安装点时,出现错误
\n\nmount: /dev/sdd1 is already mounted or /mnt/foo busy.\nRun Code Online (Sandbox Code Playgroud)\n\n/mnt/foo是一个新创建的挂载点,所以它不应该很忙。这意味着/dev/sdd1已经安装了。但是,当我尝试卸载它时,出现错误
umount: /dev/sdd1: not mounted\nRun Code Online (Sandbox Code Playgroud)\n\n系统似乎处于某种混乱状态,我无法安装或卸载 USB 驱动器?
\n\n我可以运行一些命令来使事情正确,以便我可以安装 USB 驱动器吗?我不想重新启动系统。详细信息如下所示。谢谢
\n\n# lsblk\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\n...\nsdd 8:48 1 29.8G 0 disk\n\xe2\x94\x94\xe2\x94\x80sdd1 8:49 1 29.8G 0 part\n# mkdir /mnt/foo\n# mount /dev/sdd1 /mnt/foo\nmount: /dev/sdd1 is already mounted or /mnt/foo busy\n# umount /dev/sdd1\numount: /dev/sdd1: not mounted\nRun Code Online (Sandbox Code Playgroud)\n\n更新:USB 存储子系统似乎处于不良状态。当 USB 驱动器被移除时,“lsusb”输出仍然显示该设备。当插入其他 USB 驱动器时,它们根本不显示。我尝试卸载并重新加载“usb-storage”内核模块,但由于它正在使用中,因此不会卸载它。
\n\n …我有 Ubuntu 16.04,并插入了 USB 现金设备。我想通过 USBIP 共享此现金设备。所以我插入这个设备并
usbip list --local
Run Code Online (Sandbox Code Playgroud)
然后我看到我的设备(以粗体强调)
Busid 3-1 (09da:f613) 未知供应商:未知产品 (09da:f613)
busid 3-2 (1532:0216) 未知供应商:未知产品 (1532:0216)
-busid 1-1.3.1 (2912:0005) 未知供应商:未知产品 (2912:0005)
busid 1-1.3.2 (13fe:4200) 未知供应商:未知产品 (13fe:4200)
Busid 1-1.3.4 (0cf3:9271) 未知供应商:未知产品 (0cf3:9271) 所以我想绑定它并收到错误:
root@xxxxx:~# usbip -d 绑定 -b 1-1.3.1
输出是
usbip: debug: usbip.c:141:[run_command] running command: `bind'
usbip: debug: sysfs_utils.c:18:[write_sysfs_attribute] error opening
attribute /sys/bus/usb/drivers/usbip-host/match_busid
usbip: debug: utils.c:50:[modify_match_busid] failed to write match_busid: No such file or directory
usbip: error: unable to bind device on 1-1.3.1
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?