【问题标题】:Mount USB device on router - OpenWrt在路由器上挂载 USB 设备 - OpenWrt
【发布时间】:2017-06-01 04:38:50
【问题描述】:

我是 OpenWrt 和 Linux/Unix shell 的新手。在此之前,使用 dd-wrt ​​已经 2 年了。最近切换到 OpenWrt 并完成了基本设置(wifi/互联网工作)。我需要安装传输我的路由器。但是,USB 设备不会挂载。

路由器的详细信息如下:

路由器型号: 华硕 RT-N13U B1

图像闪烁: chaos_calmer 15.05.1 (openwrt-15.05.1-ramips-rt305x-rt-n13u-squashfs-sysupgrade.bin)

USB 详细信息: Crusier Blade 16GB USB 2.0 使用 GParted 可启动 cd 格式化为 ext4

已安装驱动程序:

  • kmod-usb-core(预装)
  • kmod-usb-dwc2(预装)
  • kmod-usb2
  • kmod-usb-存储
  • kmod-fs-ext4
  • kmod-scsi-core(预装)

这里是 dev/sda、/dev/sda1 和 /mnt 的权限(手动设置 777):

~#ls -l /dev
brwxrwxrwx    1 root     root        8,   0 Jan 17 21:56 sda
brwxrwxrwx    1 root     root        8,   1 Jan 17 21:56 sda1

~#ls -l ..
drwxrwxrwx    2 root     root             0 Jan 16 21:28 mnt

安装时出错:

~# mount -t ext4 /dev/sda1 /mnt
mount: mounting /dev/sda1 on /mnt failed: No such file or directory

echo $?
255

sda1 存在于 dev 中,并且 /mnt 目录存在。仍然显示错误。

我尝试安装/重新安装,然后安装,但结果相同。另外,当我断开 USB 时 sdasda1 文件夹会消失,然后在重新连接 USB 时重新出现,所以我猜该设备已被成功检测到。

我错过了什么?

编辑: 按照 cmets 中的建议添加了编辑。

dmesg output (输出很大所以链接)

编辑 2: 切换到 LEDE 17。更稳定,过去一周出现零问题。

【问题讨论】:

  • 再次检查/mnt是否真的存在。
  • 是的,我什至尝试过 cd /mnt。路径更改为 /mnt#
  • "[11.550000] EXT4-fs (sda1): 无法加载 crc32c 驱动程序。"
  • @IgnacioVazquez-Abrams 那么这是否意味着驱动程序丢失或其他问题。

标签: linux usb mount openwrt


【解决方案1】:

dmesg 输出的关键部分是

[9.410000] mount_root: 从内部覆盖加载 kmods

[9.940000] SCSI 子系统已初始化

[9.960000] ehci_hcd:USB 2.0“增强”主机控制器 (EHCI) 驱动程序

[ 9.980000] ehci-platform:EHCI 通用平台驱动程序 [9.990000] usb-storage 1-1:1.0: no of_node;不解析 pinctrl DT

[9.990000] usb-storage 1-1:1.0:检测到 USB 大容量存储设备

[10.010000] scsi host0:usb-storage 1-1:1.0

[10.020000] usbcore: 注册新的接口驱动usb-storage

[10.100000] 块:尝试加载 /tmp/jffs_cfg/upper/etc/config/fstab

[10.120000] 块:extroot:未配置

[10.130000] mount_root: 切换到 jffs2 覆盖

[10.180000] procd: - 早期 -

[11.020000] scsi 0:0:0:0:直接访问 SanDisk Cruzer Blade 1.27 PQ:0 ANSI:6

[11.030000] sd 0:0:0:0: no of_node;不解析 pinctrl DT

[11.050000] sd 0:0:0:0: [sda] 30529536 512 字节逻辑块:(15.6 GB/14.5 GiB)

[11.070000] sd 0:0:0:0: [sda] 写保护关闭

[11.070000] sd 0:0:0:0: [sda] 模式感知:43 00 00 00

[11.090000] sd 0:0:0:0: [sda] 写入缓存:禁用,读取缓存:启用,不支持 DPO 或 FUA

[11.120000] sda: sda1

[11.130000] sd 0:0:0:0: [sda] 附加的 SCSI 可移动磁盘

[11.550000] EXT4-fs (sda1):无法加载 crc32c 驱动程序

哦不,这似乎是一个错误

Bug#819725:ext4 在 crc32c 模块上缺少 softdep

https://lists.debian.org/debian-kernel/2016/04/msg00013.html

以下解决方法不适用,因为 initramfs 在启动时是本机文件系统 (https://en.wikipedia.org/wiki/Initramfs),并且在系统完全启动时没有影响 (rootfs已安装):

在内核包中修复此问题之前,您可以通过以下方式解决它 要么:

  • 将 base-installer/initramfs-tools/driver-policy 设置为“most”而不是“dep”
  • 将 base-config/late_command 设置为将 crc32c 添加到 /etc/initramfs-tools/modules 的脚本

无论如何发布堆栈跟踪,也许还有另一种解决方法

这太复杂了……

这也许是一个解决方案https://forum.openwrt.org/viewtopic.php?id=69175

下载 kmod-lib-crc32c 和 kmod-crypto-crc32c

如果这不起作用,也许最简单的解决方案是将 USB 堆栈格式化为 VFAT 并等待新内核...


这不是权限错误。权限错误将返回 EPERM -> 错误代码 1 不允许操作

知道mount 返回什么退出代码会很有趣。 '退出行为在几个挂载版本中非常不同'mount(2)mount(8)

为了获得返回值,在shell中输入命令

mount /dev/sda1 /mnt

然后

echo $?

数字是返回的mount 的退出代码(255 表示'退出状态超出范围' 在这种情况下为'-1',@987654324 @)

mount(8) 退出代码的列表在 http://www.stackoverflow.com/questions/33167585/what-are-the-return-codes-values-of-linux-umount

http://www.becane.com/2014/09/02/understanding-exit-codes-and-how-to-use-them-in-a-bash-script

除了返回值 mount(2) 还在errno (http://man7.org/linux/man-pages/man3/errno.3.html) 中设置了一个错误代码。在 shell 中打印 errno 有点困难,更容易获得像 http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html 这样的引用并搜索错误字符串,在这种情况下 没有这样的文件或目录

字符串No such file or directory是系统错误ENOENT

作为系统错误 ENOENT 表示 路径名为空或包含不存在的组件。 (http://man7.org/linux/man-pages/man2/mount.2.html)

试试sudo mount -t ext4 /dev/sda1 /mnt,因为棒子被格式化为ext4

如果这不起作用 dmesg 输出会很有趣

分离 USB 设备,重新连接 USB 设备,输入 dmesg 并查看输出。在dmesg 的输出中,您还可以看到为设备加载了哪些驱动程序

https://wiki.openwrt.org/doc/howto/usb.storage 表示您需要更多驱动程序(block-mountkmod-scsi-core、...),因为 USB 记忆棒(USB 大容量存储类)也是 SCSI 和块设备...

(linux系统错误码在http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html)

打印堆栈跟踪 sudo strace -f mount -t ext4 -o default /dev/sda1 /mnt 并发布

【讨论】:

  • 非常感谢指点,从中学到了很多东西。也尝试了 -t ext4 选项,结果相同。返回的退出代码是 255(我猜这是个坏消息)。也尝试了块安装,即使它不会安装驱动器。 scsi 是预装的。还浏览了权限主题,为 sda、sda1、mnt 设置了 777。
  • 我编辑了答案,因为由于返回值和错误代码,我犯了一个错误。 mount(2) [-1 失败,0 成功,设置 errno] 和 mount(8) [0 成功,...] 的返回值之间存在很大差异。使用sudo strace -f mount -t ext4 -o default /dev/sda1 /mnt 打印堆栈跟踪并发布
  • 我实际上已经安装了 USB 设备。安装了一个名为“kmod-lib-crc32c”的包,不确定这个包的用途是什么。检查 openwrt 的 USB 页面只发现 kmod-crypto-crc32c。现在有很多困惑。一旦我有时间会更新细节。也许,会发布另一个关于 crc32c 包的问题。还为答案中的有用内容点赞。
  • kmod-lib-crc32c 有帮助。这是一个很晚的答案选择,但我自己对我当时正在做的事情感到困惑,并且不想选择错误的答案作为正确的答案。这一定是互联网上最好的回复之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多