【问题标题】:How to get the file system type for syscall.Mount() programmatically如何以编程方式获取 syscall.Mount() 的文件系统类型
【发布时间】:2020-10-26 18:39:53
【问题描述】:

函数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 失败。已经描述了here Linux 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 文件系统类型。

在Go中用ext4替换auto会解决问题,但是我感兴趣的是,如何使用Go获取文件系统类型,例如@ 987654337@?

有没有类似blkidfile的函数可以显示设备的文件系统类型?

【问题讨论】:

  • 这能回答你的问题吗? Get BLKID of an unmounted volume in go
  • 好吧,5 年前有人问过这个问题,我希望有人已经“搜索 libblkid 源并在 go 中重新实现它”,所以让我们拭目以待,看看是否有人知道更好的方法,我会的检查我是否可以根据源代码重新实现它。
  • 很公平。我无法通过快速搜索找到任何内容,但如果您找到了,请使用信息更新链接的问题。

标签: linux bash go filesystems mount


【解决方案1】:

您尝试过使用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 结构包含与默认 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 实用程序,即 - dfdmidecodeetcfstabetchostsetcserviceetcshadowetcuserhpmdnmappartedscsismartctltgtd。见module github.com/LDCS/qslinux

【讨论】:

  • 是的,它可以工作,唯一的问题是 Go BLKID 正在使用 linux 命令 blkid (github.com/LDCS/qslinux/blob/…),我可以在没有这个库的情况下直接使用它。我会给它一个机会,看看我是否能理解blkid 正在做的“魔法”是什么,如果我找不到,我会接受它作为答案。感谢您提供信息丰富的答案:)
  • @E235:当然,如果你不能使用这个,那么你就只能在 cmets 中执行链接问题的第 2) 点。在 blkid 模块上编写 cgo 包装器
  • 我只想提一下blkid的原始函数可以在这里找到:github.com/karelzak/util-linux/blob/…,它正在被这个函数调用:github.com/karelzak/util-linux/blob/…
猜你喜欢
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
相关资源
最近更新 更多