如何以编程方式获取 syscall.Mount() 的文件系统类型

E23*_*235 8 linux filesystems bash mount go

Linuxsyscall.Mount函数需要一个文件系统类型。

如果您尝试使用文件系统运行它auto,如下所示:

func main(){
    if err := syscall.Mount("/dev/sda1", "/mnt1", "auto", 0, "w"); err != nil {
        log.Printf("Mount(\"%s\", \"%s\", \"auto\", 0, \"rw\")\n","/dev/sda1","/mnt1")
        log.Fatal(err)
    }
}

Run Code Online (Sandbox Code Playgroud)

它将失败no such device。这已经说明这里Linux的syscall.Mount只是包装mount(2)其本身不支持“自动”文件系统类型的概念

我知道如何使用 bash 找到它:

root@ubuntu:~/go/src# blkid /dev/sda1
/dev/sda1: UUID="527c895c-864e-4f4c-8fba-460754181173" TYPE="ext4" PARTUUID="db5c2e63-01"
Run Code Online (Sandbox Code Playgroud)

或者

root@ubuntu:~/go/src# file -sL /dev/sda1
/dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID=527c895c-864e-4f4c-8fba-460754181173 (needs journal recovery) (extents) (large files) (huge files)

Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都会获得ext4文件系统类型。

更换autoext4在围棋会解决这个问题,我感兴趣的是什么,我该如何使用去得到的文件系统类型,例如,/dev/sda1

是否有类似blkidfile可以显示设备文件系统类型的功能?

Ini*_*ian 6

您是否尝试使用blkid 包?它似乎是开箱即用的,因为它在内部实现了blkid下面的shell 命令(参见blkid.go#L101)。您只需获取从Blkid()函数返回的地图的键名,然后在您的 API 中重用它

package main

import (
    "fmt"
    blkid "github.com/LDCS/qslinux/blkid"
)

func main() {
    rmap := blkid.Blkid(false)
    var key string
    var result *blkid.Blkiddata

    for key, result = range rmap {
        fmt.Printf("Devname: %q\n", key)
    }

    fmt.Printf("Uuid_=%q\n", result.Uuid_)
    fmt.Printf("Uuidsub_=%q\n", result.Uuidsub_)
    fmt.Printf("Type_=%q\n", result.Type_)
    fmt.Printf("Label_=%q\n", result.Label_)
    fmt.Printf("Parttype_=%q\n", result.Parttype_)
    fmt.Printf("Partuuid_=%q\n", result.Partuuid_)
    fmt.Printf("Partlabel_ =%q\n", result.Partlabel_)
}
Run Code Online (Sandbox Code Playgroud)

Blkiddata结构包含与默认 Linux 版本相同的所有信息

type Blkiddata struct {
    Devname_   string
    Uuid_      string
    Uuidsub_   string
    Type_      string
    Label_     string
    Parttype_  string
    Partuuid_  string
    Partlabel_ string
}
Run Code Online (Sandbox Code Playgroud)

只需使用模块即可

go get github.com/LDCS/qslinux/blkid
Run Code Online (Sandbox Code Playgroud)

它还实现了其他家庭的Linux即utils的- ,dfdmidecodeetcfstabetchostsetcserviceetcshadowetcuserhpmdnmap,,和。参见模块 github.com/LDCS/qslinuxpartedscsismartctltgtd