golang中syscall.Mount报错:没有这样的设备

5

我正在尝试使用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 作为子进程调用吗? - BMiner
1个回答

6
你没有说明你的操作系统,但我认为这个问题在许多实现中都是相同的。
Linux syscall.Mount上只是包装了mount(2)本身不支持"auto" fstype的概念mount(8)命令之所以可以使用"auto"是因为它有自己的魔力:

如果没有给出-t选项,或者指定了auto类型, 挂载将尝试猜测所需的类型。Mount使用 blkid库来猜测文件系统类型;如果那里没有 找到任何看起来熟悉的东西,mount将尝试 读取文件/etc/filesystems,或者,如果不存在, /proc/filesystems


我明白了,这很有道理,但我希望错误消息不是“没有这样的设备”。 - netbrain
@netbrain 非常明智。但是man页面确实提到mount(2)返回“内核中未配置的文件系统”的ENODEV错误码。 - cnicutar
我以为可以将类型留为空,因为mount(8)是这样工作的...现在我因为你而更加了解!:) 太棒了。 - joonas.fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接