Skip to content

Commit 10ba81f

Browse files
committed
feat(kata): expose nested KVM to sandboxes
1 parent 740502d commit 10ba81f

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

‎rock/deployments/docker.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ def _build_runtime_args(self) -> list[str]:
180180
if self._config.use_kata_runtime:
181181
return [
182182
"--cap-add=ALL",
183+
"--device-cgroup-rule",
184+
"c 10:232 rwm",
183185
"--security-opt",
184186
"seccomp=unconfined",
185187
"--runtime=io.containerd.kata.v2",

‎rock/rocklet/local_files/docker_run.sh‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ is_nix() {
2828
fi
2929
}
3030

31+
# Kata guest KVM is a misc character device. Its number belongs to the guest
32+
# kernel and can differ from the outer host's /dev/kvm device number.
33+
setup_kata_guest_kvm() {
34+
local kvm_major=10
35+
local kvm_minor=232
36+
local registered_minor
37+
38+
if [ ! -r /proc/misc ]; then
39+
echo "Kata guest KVM setup failed: /proc/misc is unavailable." >&2
40+
return 1
41+
fi
42+
registered_minor=$(awk '$2 == "kvm" { print $1; exit }' /proc/misc)
43+
if [ "${registered_minor}" != "${kvm_minor}" ]; then
44+
echo "Kata guest KVM setup failed: expected misc device ${kvm_major}:${kvm_minor}, found minor ${registered_minor:-none}." >&2
45+
return 1
46+
fi
47+
48+
rm -f /dev/kvm
49+
mknod -m 600 /dev/kvm c "${kvm_major}" "${kvm_minor}"
50+
}
51+
3152
# Kata DinD: set up loop device and mount disk image for Docker storage
3253
setup_kata_dind() {
3354
local docker_root="/var/lib/docker"
@@ -79,7 +100,8 @@ if [ "$(is_nix)" = "true" ]; then
79100
fi
80101

81102
if [ "${ROCK_KATA_RUNTIME}" = "true" ]; then
82-
echo "Kata runtime detected, setting up DinD disk..."
103+
echo "Kata runtime detected, setting up guest KVM and DinD disk..."
104+
setup_kata_guest_kvm
83105
setup_kata_dind
84106
fi
85107

‎tests/unit/deployments/test_docker_env_injection.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,22 @@ def test_kata_runtime_env_absent_when_disabled(self):
9999
mock_env.ROCK_TIME_ZONE = "UTC"
100100
args = deployment._build_env_args()
101101
assert "ROCK_KATA_RUNTIME=true" not in args
102+
103+
104+
class TestBuildRuntimeArgs:
105+
def test_kata_runtime_grants_guest_kvm_device_number(self):
106+
deployment = _make_deployment(use_kata_runtime=True)
107+
108+
args = deployment._build_runtime_args()
109+
110+
rule_index = args.index("--device-cgroup-rule")
111+
assert args[rule_index + 1] == "c 10:232 rwm"
112+
assert "--device=/dev/kvm" not in args
113+
114+
def test_default_runtime_does_not_grant_guest_kvm_device(self):
115+
deployment = _make_deployment(use_kata_runtime=False)
116+
117+
args = deployment._build_runtime_args()
118+
119+
assert args == ["--privileged"]
120+
assert "--device-cgroup-rule" not in args

0 commit comments

Comments
 (0)