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

标签 linux bash go filesystems mount

函数Linux syscall.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)
    }
}

它将失败,no such device .已经描述了hereLinux syscall.Mount 只是包装mount(2) , which doesn't itself support the concept of an "auto" fstype .
我知道如何使用 bash 找到它:
root@ubuntu:~/go/src# blkid /dev/sda1
/dev/sda1: UUID="527c895c-864e-4f4c-8fba-460754181173" TYPE="ext4" PARTUUID="db5c2e63-01"
或者
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)

在这两种情况下,您都会得到 ext4文件系统类型。
更换autoext4在 Go 中将解决问题,但是 我感兴趣的是,如何使用 Go 获取文件系统类型,例如 /dev/sda1 ?
有没有类似blkid的功能或 file可以显示设备的文件系统类型?

最佳答案

您是否尝试使用 package 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_)
}
Blkiddata struct 包含与默认 Linux 版本一样的所有信息
type Blkiddata struct {
    Devname_   string
    Uuid_      string
    Uuidsub_   string
    Type_      string
    Label_     string
    Parttype_  string
    Partuuid_  string
    Partlabel_ string
}
只需使用模块
go get github.com/LDCS/qslinux/blkid
它还实现了另一个 Linux 实用程序系列,即 - df , dmidecode , etcfstab , etchosts , etcservice , etcshadow , etcuser , hp , md , nmap , parted , scsi , smartctltgtd .见 module github.com/LDCS/qslinux

关于linux - 如何以编程方式获取 syscall.Mount() 的文件系统类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62759448/

相关文章:

python - 在 Ubuntu 终端中,我怎样才能让 python 程序继续运行?

linux - 如何保存来自 telnet 脚本的响应?

linux - 如何使用 hexdump 显示前 x 个字节?

go - 访问 C 联合字段时出现问题

go - Golang解压缩可变参数

php - exec 退出代码 11 的含义

linux - 是否可以使用 Linux 的 clone() 系统调用在同一地址空间中运行多个应用程序?

python - 是否可以使用 argparse 将正则表达式字符串作为参数传递给 Python CLI 工具?

go - 移位导致零,而它不应该

linux - 使用epoll检测网线拔出错误