Skip to content

Commit

Permalink
[disk][linux] add HOST_PROC_MOUNTINFO, closes #1271
Browse files Browse the repository at this point in the history
The changes to gopsutil for reading /proc/1/mountinfo affected
applications running under restricted environments that disallows access
to /proc/1/mountinfo. #1159 was filed for android but other restricted
environments are also affected (eg, snaps)). The fix for #1159 addressed
the application behavior to work under confinement for non-android as
well. However, depending on the system, the attempt to read
/proc/1/mountinfo could cause a sandbox denial in the logs which can be
quite noisy if using gopsutil as part of a monitoring solution that
polls often.

This introduces HOST_PROC_MOUNTINFO to force reading from the parent dir
of the specified path instead of first trying /proc/1. When unset,
retain the current behavior with fallback. This allows people, for
example, to set HOST_PROC_MOUNTINFO=/proc/self/mountinfo when gopsutil
is running under these restricted environments.

This change updates the private readMountFile() to use a root path
instead of a root subpath, and adjusts PartitionsWithContext() to set
the root path to /proc/1 initially and falling back to /proc/self. When
HOST_PROC_MOUNTINFO is not empty, set the root path to the parent
directory of HOST_PROC_MOUNTINFO.
  • Loading branch information
jdstrand committed Mar 29, 2022
1 parent 78577a7 commit 9e6e627
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ environment variable.
You can set an alternative location to `/dev` by setting the `HOST_DEV`
environment variable.

You can set an alternative location to `/proc/N/mountinfo` by setting the
`HOST_PROC_MOUNTINFO` environment variable.

## Documentation

see http://godoc.org/github.com/shirou/gopsutil
Expand Down
25 changes: 19 additions & 6 deletions disk/disk_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,10 @@ var fsTypeMap = map[int64]string{
ZFS_SUPER_MAGIC: "zfs", /* 0x2FC12FC1 local */
}

// readMountFile reads mountinfo or mounts file under /proc/1 or /proc/self
// readMountFile reads mountinfo or mounts file under the specified root path
// (eg, /proc/1, /proc/self, etc)
func readMountFile(root string) (lines []string, useMounts bool, filename string, err error) {
filename = common.HostProc(path.Join(root, "mountinfo"))
filename = path.Join(root, "mountinfo")
lines, err = common.ReadLines(filename)
if err != nil {
var pathErr *os.PathError
Expand All @@ -246,7 +247,7 @@ func readMountFile(root string) (lines []string, useMounts bool, filename string
}
// if kernel does not support 1/mountinfo, fallback to 1/mounts (<2.6.26)
useMounts = true
filename = common.HostProc(path.Join(root, "mounts"))
filename = path.Join(root, "mounts")
lines, err = common.ReadLines(filename)
if err != nil {
return
Expand All @@ -257,10 +258,22 @@ func readMountFile(root string) (lines []string, useMounts bool, filename string
}

func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, error) {
lines, useMounts, filename, err := readMountFile("1")
// by default, try "/proc/1/..." first
root := common.HostProc(path.Join("1"))

// force preference for dirname of HOST_PROC_MOUNTINFO, if set #1271
hpmPath := os.Getenv("HOST_PROC_MOUNTINFO")
if hpmPath != "" {
root = filepath.Dir(hpmPath)
}

lines, useMounts, filename, err := readMountFile(root)
if err != nil {
// fallback to "/proc/self/mountinfo" #1159
lines, useMounts, filename, err = readMountFile("self")
if hpmPath != "" { // don't fallback with HOST_PROC_MOUNTINFO
return nil, err
}
// fallback to "/proc/self/..." #1159
lines, useMounts, filename, err = readMountFile(common.HostProc(path.Join("self")))
if err != nil {
return nil, err
}
Expand Down

0 comments on commit 9e6e627

Please sign in to comment.