使用k8s.io/utils/mount包时,如何从/proc/mounts获取挂载源值
如何通过k8s.io/utils/mount获取完整挂载源信息
k8s.io/utils/mount默认依赖/proc/mounts确实会丢失部分挂载源细节,你可以通过以下两种方式解决:
1. 自定义挂载信息读取逻辑,解析/proc/self/mountinfo
工具包核心是MountInterface接口,你可以基于现有实现扩展,替换读取/proc/mounts的逻辑,改为解析/proc/self/mountinfo——该文件的第9个字段(按空格分割)就是完整的挂载源信息。
示例代码如下:
import ( "bufio" "os" "strings" "k8s.io/utils/mount" ) // 自定义Mount实现,读取/proc/self/mountinfo type customMount struct { mount.Interface } func (m *customMount) List() ([]mount.MountPoint, error) { file, err := os.Open("/proc/self/mountinfo") if err != nil { return nil, err } defer file.Close() var mps []mount.MountPoint scanner := bufio.NewScanner(file) for scanner.Scan() { fields := strings.Fields(scanner.Text()) if len(fields) < 10 { continue } mp := mount.MountPoint{ Path: fields[4], // 挂载点路径 Source: fields[9], // 完整挂载源 FsType: fields[8], // 文件系统类型 // 按需补充Options等其他字段 } mps = append(mps, mp) } return mps, scanner.Err() } // 使用自定义实现 func main() { mounter := &customMount{mount.New("")} mounts, err := mounter.List() if err != nil { // 处理错误逻辑 } for _, mp := range mounts { // 通过mp.Source获取对应挂载点的完整源信息 } }
2. 针对特定挂载点单独解析/proc/self/mountinfo
如果仅需获取某个特定挂载点的源,无需替换整个List逻辑,可以结合工具包的IsMountPoint方法定位后读取:
func getMountSource(mounter mount.Interface, targetPath string) (string, error) { isMount, err := mounter.IsMountPoint(targetPath) if err != nil || !isMount { return "", err } file, err := os.Open("/proc/self/mountinfo") if err != nil { return "", err } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fields := strings.Fields(scanner.Text()) if len(fields) < 10 { continue } if fields[4] == targetPath { return fields[9], nil } } return "", os.ErrNotExist }
关键提示
/proc/self/mountinfo相比/proc/mounts,能准确提供绑定挂载、tmpfs等场景下的挂载源细节,不会出现/proc/mounts中源信息缺失或模糊的情况。
内容的提问来源于stack exchange,提问作者codego123
相关产品推荐
相关产品推荐

