{"record":{"id":"8bf46b68646a96b0","repo":"prometheus/node_exporter","slug":"couldn-t-get-kvm-w","errorCode":null,"errorMessage":"couldn't get kvm: %w","messagePattern":"couldn't get kvm: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/memory_bsd.go","lineNumber":169,"sourceCode":"\t\t\treturn fmt.Errorf(\"couldn't get memory: %w\", err)\n\t\t}\n\n\t\t// Most are gauges.\n\t\tif m.valueType == 0 {\n\t\t\tm.valueType = prometheus.GaugeValue\n\t\t}\n\n\t\tch <- prometheus.MustNewConstMetric(\n\t\t\tprometheus.NewDesc(\n\t\t\t\tprometheus.BuildFQName(namespace, memorySubsystem, m.name),\n\t\t\t\tm.description,\n\t\t\t\tnil, nil,\n\t\t\t), m.valueType, v)\n\t}\n\n\tswapUsed, err := c.kvm.SwapUsedPages()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"couldn't get kvm: %w\", err)\n\t}\n\n\tch <- prometheus.MustNewConstMetric(\n\t\tprometheus.NewDesc(\n\t\t\tprometheus.BuildFQName(namespace, memorySubsystem, \"swap_used_bytes\"),\n\t\t\t\"Currently allocated swap\",\n\t\t\tnil, nil,\n\t\t), prometheus.GaugeValue, float64(swapUsed*c.pageSize))\n\n\treturn nil\n}\n","sourceCodeStart":151,"sourceCodeEnd":181,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/memory_bsd.go#L151-L181","documentation":"After emitting sysctl-based memory metrics, Update uses the kvm library (c.kvm.SwapUsedPages()) to read swap usage from the kernel swap device list. If that kvm read fails, the scrape aborts with this wrapped error. It indicates node_exporter could not access kernel memory/swap information via /dev/kvm (kvm_getswapinfo).","triggerScenarios":"A scrape when kvm_openfiles/kvm_getswapinfo fails — typically /dev/mem or /dev/kdevfs access problems, wrong kvm symbol tables after a kernel upgrade, or running without sufficient privileges.","commonSituations":"Running node_exporter in a jail without /dev/mem access; kernel world mismatch (userland kvm lib can't read the running kernel); permission denied on kvm device nodes.","solutions":["Ensure node_exporter runs with permission to open kvm (usually root, or group access to /dev/mem)","Verify /dev/mem and swap device nodes exist inside the environment (mount devfs in jails)","Rebuild/redeploy node_exporter matching the running kernel version to fix kvm symbol mismatch","As a workaround, disable/monitor swap metrics or run the exporter outside the restricted jail"],"exampleFix":"// before\nswapUsed, err := c.kvm.SwapUsedPages()\nif err != nil {\n\treturn fmt.Errorf(\"couldn't get kvm: %w\", err)\n}\n// after (deployment fix, run exporter with kvm access, e.g. in rc.d/Monitoring)\n// pkg add node_exporter && service node_exporter enable  # runs as root by default\n// or grant: pw groupmod kvm -m exporter-user  (if using a kvm group setup)","handlingStrategy":"try-catch","validationCode":"// deployment-time check: kvm_openfiles must succeed\n// test -r /dev/mem && echo 'kvm access ok' || echo 'grant /dev/mem access'","typeGuard":null,"tryCatchPattern":"if err := c.Update(ch); err != nil {\n\tif strings.Contains(err.Error(), \"couldn't get kvm\") {\n\t\tlogger.Warn(\"swap metrics unavailable (kvm access failed)\", \"err\", err)\n\t\treturn nil // drop swap metrics, keep memory metrics\n\t}\n\treturn err\n}","preventionTips":["Run node_exporter as root or with /dev/mem read access","Keep the exporter binary in sync with kernel version (kvm symbol tables)","Mount devfs with mem device in jails"],"tags":["freebsd","kvm","swap","memory","scrape"],"backgroundTag":"kvm-access-denied","analyzedSha":"17ddd77c59ba27e1508e9f7894b1e55b44d6aed3","analyzedAt":"2026-09-07T17:54:06.211Z","contentChangedAt":"2026-09-07T17:54:06.211Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}