Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

golang no such device in syscall.Mount

I'm trying to use the syscall.Mount function to mount a usb pendrive and autodetect the filesystem to some folder. I fetch the device path from the kernel's netlink socket and try to mount it to /tmp/+devicename, in my instance /dev/sdd1 should be mounted to /tmp/sdd1

I have the following lines of code in a go program

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)
}

Output:

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

I'm running the application with root privileges with "sudo", however it seems unable to mount using the syscall package. If i however in the terminal type sudo mount /dev/sdd1 /tmp/sdd1 then that works fine.

What is the issue here? Is the device path somehow different when using the system call?

Any help is appreciated. Cheers

like image 744
netbrain Avatar asked Feb 18 '16 13:02

netbrain


1 Answers

You didn't specify your OS but I think the problem is the same on many implementations.

On Linux syscall.Mount just wraps mount(2) which doesn't itself support the concept of an "auto" fstype.

The reason the mount(8) command works with "auto" is because it does its own magic:

If no -t option is given, or if the auto type is specified, mount will try to guess the desired type. Mount uses the blkid library for guessing the filesystem type; if that does not turn up anything that looks familiar, mount will try to read the file /etc/filesystems, or, if that does not exist, /proc/filesystems.

like image 188
cnicutar Avatar answered Sep 20 '22 00:09

cnicutar