11个版本
0.2.1 | 2024年6月30日 |
---|---|
0.2.0 | 2024年6月21日 |
0.1.8 | 2024年2月7日 |
0.1.1 | 2024年1月31日 |
#570 in 文件系统
49 每月下载次数
44KB
1K SLoC
sbox
微型的Linux容器实现。
用法
use std::fs::create_dir_all;
use std::path::PathBuf;
use nix::unistd::{getgid, getuid};
use sbox::{BaseMounts, BinNewIdMapper, Cgroup, Container, InitProcess, OverlayMount};
fn main() {
// Create user namespace mapper for current user with subuids and subgids.
let user_mapper = BinNewIdMapper::new_root_subid(getuid(), getgid()).unwrap();
// Create cgroup for container.
let cgroup = Cgroup::new("/sys/fs/cgroup", "sbox").unwrap();
// Path to rootfs for container image.
let image_dir = PathBuf::from("/tmp/sbox-image");
// Path to container state dir.
let state_dir = PathBuf::from("/tmp/sbox-state");
create_dir_all(state_dir.join("upper")).unwrap();
create_dir_all(state_dir.join("work")).unwrap();
// Create container.
let container = Container::options()
.cgroup(cgroup)
.add_mount(OverlayMount::new(
vec![image_dir],
state_dir.join("upper"),
state_dir.join("work"),
))
.add_mount(BaseMounts::new())
.rootfs(state_dir.join("rootfs"))
.user_mapper(user_mapper.clone())
.create()
.unwrap();
// Start container.
InitProcess::options()
.command(vec![
"/bin/sh".into(),
"-c".into(),
"echo 'Hello, World' && id && cat /proc/self/cgroup".into(),
])
.start(&container)
.unwrap()
.wait()
.unwrap();
}
许可证
sbox 在MIT许可证和Apache 2.0许可证的条款下分发。
依赖项
~1.5MB
~35K SLoC