mirror of
https://github.com/vhaudiquet/ecrou.git
synced 2026-11-12 22:22:44 +00:00
fix(error): name the KVM module per compile target
The remediation hard-coded kvm_intel, wrong on arm64 and riscv64 which the snap now ships. x86_64 keeps the vendor split (kvm_intel, kvm_amd) and the nested-virt parameter file; everywhere else KVM is one module and the nested pointer is not actionable.
This commit is contained in:
1 parent
3d86f30dd3
commit
2132a8262d
1 file changed
+22
-4
@@ -13,6 +13,25 @@
|
|||||||
//! exactly that, so the type a consumer matches on survives every `?`
|
//! exactly that, so the type a consumer matches on survives every `?`
|
||||||
//! between the producer and the public API.
|
//! between the producer and the public API.
|
||||||
|
|
||||||
|
/// The KVM module hint, per compile target: the module layout differs
|
||||||
|
/// across architectures, and the snap ships arm64 and riscv64 next to
|
||||||
|
/// amd64. (x86_64 splits KVM per vendor; everywhere else it is one
|
||||||
|
/// module.)
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
const KVM_MODULE_HINT: &str = "sudo modprobe kvm_intel (or kvm_amd on AMD)";
|
||||||
|
#[cfg(not(target_arch = "x86_64"))]
|
||||||
|
const KVM_MODULE_HINT: &str = "sudo modprobe kvm";
|
||||||
|
|
||||||
|
/// The nested-virtualization hint: a VM inside a VM needs nested virt
|
||||||
|
/// enabled on the outer hypervisor, and on x86_64 that is also where
|
||||||
|
/// the parameter file lives. Other architectures have nothing
|
||||||
|
/// actionable to check.
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
const KVM_NESTED_HINT: &str =
|
||||||
|
"enable it on the hypervisor, then cat /sys/module/kvm_intel/parameters/nested";
|
||||||
|
#[cfg(not(target_arch = "x86_64"))]
|
||||||
|
const KVM_NESTED_HINT: &str = "only actionable on x86_64 hosts";
|
||||||
|
|
||||||
/// Errors returned by the ecrou library API.
|
/// Errors returned by the ecrou library API.
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
@@ -24,9 +43,8 @@ pub enum Error {
|
|||||||
"KVM is not available\n\n\
|
"KVM is not available\n\n\
|
||||||
ecrou boots microVMs and needs /dev/kvm:\n\
|
ecrou boots microVMs and needs /dev/kvm:\n\
|
||||||
\x20 check the module: lsmod | grep kvm\n\
|
\x20 check the module: lsmod | grep kvm\n\
|
||||||
\x20 load it: sudo modprobe kvm_intel (or kvm_amd)\n\
|
\x20 load it: {KVM_MODULE_HINT}\n\
|
||||||
\x20 nested virt (in a VM): enable it on the hypervisor, then\n\
|
\x20 nested virt (in a VM): {KVM_NESTED_HINT}\n\
|
||||||
\x20 cat /sys/module/kvm_intel/parameters/nested\n\
|
|
||||||
\x20 access: sudo usermod -aG kvm $USER (re-login)"
|
\x20 access: sudo usermod -aG kvm $USER (re-login)"
|
||||||
)]
|
)]
|
||||||
KvmUnavailable(#[source] std::io::Error),
|
KvmUnavailable(#[source] std::io::Error),
|
||||||
@@ -65,7 +83,7 @@ mod tests {
|
|||||||
let msg =
|
let msg =
|
||||||
Error::KvmUnavailable(std::io::Error::from_raw_os_error(libc::EACCES)).to_string();
|
Error::KvmUnavailable(std::io::Error::from_raw_os_error(libc::EACCES)).to_string();
|
||||||
assert!(msg.contains("KVM is not available"));
|
assert!(msg.contains("KVM is not available"));
|
||||||
assert!(msg.contains("modprobe kvm_intel"));
|
assert!(msg.contains("modprobe kvm"));
|
||||||
assert!(msg.contains("usermod -aG kvm"));
|
assert!(msg.contains("usermod -aG kvm"));
|
||||||
// The open(2) detail stays reachable for {err:#} printing,
|
// The open(2) detail stays reachable for {err:#} printing,
|
||||||
// which the CLI does over an anyhow wrapping of this error.
|
// which the CLI does over an anyhow wrapping of this error.
|
||||||
|
|||||||
Reference in new issue
Block a user