【问题标题】:golang no such device in syscall.Mountgolang 在 syscall.Mount 中没有这样的设备
【发布时间】:2016-05-30 16:42:56
【问题描述】:

我正在尝试使用 syscall.Mount 函数来挂载 USB 随身碟并将文件系统自动检测到某个文件夹。我从内核的 netlink 套接字获取设备路径并尝试将其挂载到 /tmp/+devicename,在我的实例中,/dev/sdd1 应该挂载到 /tmp/sdd1

我在 go 程序中有以下几行代码

if err := syscall.Mount(src, target, "auto", 0, "ro"); err != nil {
    log.Printf("Mount(\"%s\", \"%s\", \"auto\", 0, \"ro\")\n",src,target)
    log.Fatal(err)
}

输出:

main.go:47: Mount("/dev/sdd1", "/tmp/sdd1", "auto", 0, "ro")
main.go:48: no such device

我正在使用“sudo”以 root 权限运行应用程序,但它似乎无法使用 syscall 包进行挂载。但是,如果我在终端类型 sudo mount /dev/sdd1 /tmp/sdd1 中,则可以正常工作。

这里有什么问题?使用系统调用时设备路径是否有所不同?

感谢任何帮助。 干杯

【问题讨论】:

  • 您对此有什么解决方法?只需将mount 作为子进程调用?

标签: go system-calls mount


【解决方案1】:

您没有指定您的操作系统,但我认为问题在许多实现上都是相同的。

Linux syscall.Mount 上只是包裹mount(2) which doesn't itself support the concept of an "auto" fstype

mount(8) 命令"auto" 一起使用的原因是因为it does its own magic

如果没有给出 -t 选项,或者如果指定了自动类型, mount 将尝试猜测所需的类型。 安装使用 用于猜测文件系统类型的 blkid 库;如果确实如此 不要出现任何看起来熟悉的东西,mount 会尝试 读取文件 /etc/filesystems,或者,如果不存在, /proc/filesystems.

【讨论】:

  • 我明白了,这是有道理的,但是我希望错误消息不是“没有这样的设备”。
  • @netbrain 这很明智。但是手册页确实提到了mount(2) 返回ENODEV 用于“内核中未配置的文件系统”。
  • 我认为我可以将类型保留为 "" 因为 mount(8) 以这种方式工作.. 现在我知道了更多感谢你! :) 太棒了。
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2017-03-07
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多