From 8b6762dab0dcb7a6d74442320e5c74d8f7246dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=B3=E5=85=89=E5=B0=91=E5=B9=B4?= <849317537@qq.com> Date: Sat, 10 Aug 2024 07:09:17 +0000 Subject: [PATCH] =?UTF-8?q?=E5=87=86=E5=A4=87=E6=94=B9=E9=80=A0=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E7=8A=B6=E6=80=81=E8=AE=B0=E5=BD=95=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rm.log | 144 ++++++++++++++++++ src/main.rs | 55 +++++-- src/network.rs | 119 ++++++++++----- test.log | 398 +++++++++++++++++++++++++++++++++++++++++++++++++ test.sh | 5 + 5 files changed, 676 insertions(+), 45 deletions(-) create mode 100644 rm.log create mode 100644 test.log create mode 100644 test.sh diff --git a/rm.log b/rm.log new file mode 100644 index 0000000..d99f805 --- /dev/null +++ b/rm.log @@ -0,0 +1,144 @@ +卸载overlayfs卷 +停止容器: "694ff469" +删除容器 694ff469 成功 +卸载overlayfs卷 +停止容器: "48bb03e4" +删除容器 48bb03e4 成功 +卸载overlayfs卷 +停止容器: "d682590f" +删除容器 d682590f 成功 +卸载overlayfs卷 +停止容器: "1fb07eeb" +删除容器 1fb07eeb 成功 +卸载overlayfs卷 +停止容器: "2115f7bc" +删除容器 2115f7bc 成功 +卸载overlayfs卷 +停止容器: "67852dcf" +删除容器 67852dcf 成功 +卸载overlayfs卷 +停止容器: "070a42d6" +删除容器 070a42d6 成功 +卸载overlayfs卷 +停止容器: "6ec7154f" +删除容器 6ec7154f 成功 +卸载overlayfs卷 +停止容器: "f05e5556" +删除容器 f05e5556 成功 +卸载overlayfs卷 +停止容器: "e6fde771" +删除容器 e6fde771 成功 +卸载overlayfs卷 +停止容器: "9e891ecb" +删除容器 9e891ecb 成功 +卸载overlayfs卷 +停止容器: "1300f1b0" +删除容器 1300f1b0 成功 +卸载overlayfs卷 +停止容器: "3b33eda3" +删除容器 3b33eda3 成功 +卸载overlayfs卷 +停止容器: "aad0cad3" +删除容器 aad0cad3 成功 +卸载overlayfs卷 +停止容器: "c24f4ef6" +删除容器 c24f4ef6 成功 +卸载overlayfs卷 +停止容器: "56434f7c" +删除容器 56434f7c 成功 +卸载overlayfs卷 +停止容器: "a1fd36eb" +删除容器 a1fd36eb 成功 +卸载overlayfs卷 +停止容器: "25a974a4" +删除容器 25a974a4 成功 +卸载overlayfs卷 +停止容器: "3cee3156" +删除容器 3cee3156 成功 +卸载overlayfs卷 +停止容器: "07e9b8d3" +删除容器 07e9b8d3 成功 +卸载overlayfs卷 +停止容器: "093c1f19" +删除容器 093c1f19 成功 +卸载overlayfs卷 +停止容器: "39c10d1e" +删除容器 39c10d1e 成功 +卸载overlayfs卷 +停止容器: "21ee50a6" +删除容器 21ee50a6 成功 +卸载overlayfs卷 +停止容器: "5c2d8295" +删除容器 5c2d8295 成功 +卸载overlayfs卷 +停止容器: "24f0ffde" +删除容器 24f0ffde 成功 +卸载overlayfs卷 +停止容器: "002d9bf9" +删除容器 002d9bf9 成功 +卸载overlayfs卷 +停止容器: "afeac42b" +删除容器 afeac42b 成功 +卸载overlayfs卷 +停止容器: "2debe50b" +删除容器 2debe50b 成功 +卸载overlayfs卷 +停止容器: "f1405d92" +删除容器 f1405d92 成功 +卸载overlayfs卷 +停止容器: "f7ced84a" +删除容器 f7ced84a 成功 +卸载overlayfs卷 +停止容器: "11fd79cc" +删除容器 11fd79cc 成功 +卸载overlayfs卷 +停止容器: "5062e991" +删除容器 5062e991 成功 +卸载overlayfs卷 +停止容器: "6b83b453" +删除容器 6b83b453 成功 +卸载overlayfs卷 +停止容器: "e6e73543" +删除容器 e6e73543 成功 +卸载overlayfs卷 +停止容器: "f04dd225" +删除容器 f04dd225 成功 +卸载overlayfs卷 +停止容器: "e6e748bf" +删除容器 e6e748bf 成功 +卸载overlayfs卷 +停止容器: "6d64ac98" +删除容器 6d64ac98 成功 +卸载overlayfs卷 +停止容器: "e48e570e" +删除容器 e48e570e 成功 +卸载overlayfs卷 +停止容器: "2c8745c3" +删除容器 2c8745c3 成功 +卸载overlayfs卷 +停止容器: "67a8123f" +删除容器 67a8123f 成功 +卸载overlayfs卷 +停止容器: "9142fcdc" +删除容器 9142fcdc 成功 +卸载overlayfs卷 +停止容器: "6179827e" +删除容器 6179827e 成功 +卸载overlayfs卷 +停止容器: "792cd124" +删除容器 792cd124 成功 +卸载overlayfs卷 +停止容器: "284b1e41" +删除容器 284b1e41 成功 +卸载overlayfs卷 +停止容器: "3c14dbc2" +删除容器 3c14dbc2 成功 +卸载overlayfs卷 +停止容器: "ebe8e61e" +删除容器 ebe8e61e 成功 +卸载overlayfs卷 +停止容器: "d73241d5" +删除容器 d73241d5 成功 +卸载overlayfs卷 +停止容器: "8cadde8e" +删除容器 8cadde8e 成功 diff --git a/src/main.rs b/src/main.rs index 204e35d..45f4f9b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ use clap::Parser; use error::{Result, RockerError}; mod error; -use network::create_network; +use network::{create_network, remove_network}; mod network; static WORKSPACE: &str = "/home/rocker"; @@ -27,6 +27,7 @@ static mut STACK: [u8; 1024*1024*1] = [0; 1024*1024*1]; static CLONE_FLAG: i32 = 0b1101100000000100000000000000000; // CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWIPC | CLONE_NEWNET; static START_T: OnceLock = OnceLock::new(); +static CONTAINER_INFO: OnceLock = OnceLock::new(); #[derive(Parser, Debug)] #[command(version, about, long_about = None)] @@ -246,7 +247,7 @@ fn init_container_pivot>(merged_path: P) -> Result<()> { std::env::set_current_dir("/")?; // 卸载 old_root, 并删除临时文件 - umount2(".pivot_root", MntFlags::MNT_DETACH).unwrap(); + umount2(".pivot_root", MntFlags::MNT_FORCE).unwrap(); std::fs::remove_dir(".pivot_root").unwrap(); Ok(()) } @@ -367,6 +368,7 @@ fn start(is_wait: bool, cb: CloneCb, clong_flags: CloneFlags, container_id: &Str Ok(child_pid.as_raw()) } Err(e) => { + Err(RockerError::OtherError(format!("clone err: {e}"))) } } @@ -470,12 +472,23 @@ impl Display for ContainerStatus { struct ContainerInfo { id: String, pid: i32, + status: ContainerStatus, + run: String, // /bin/bash image: String, // busybox volume: String, // /root/tmp:/root/tmp,/root/tmp1:/root/tmp1 env: String, // a=1,b=2,c=3 或者 env文件路径 - status: ContainerStatus, - log: bool + log: bool, + wait: bool, +} + +impl ContainerInfo { + fn flush(&self) -> Result<()>{ + let container_info_path = Path::new(WORKSPACE).join("containers").join(&self.id).join(INFO_FILE); + let toml_str = toml::to_string(&self)?; + fs::write(container_info_path, toml_str)?; + Ok(()) + } } impl Display for ContainerInfo { @@ -497,6 +510,7 @@ fn save_container_info(args: &RockerArgs, container_id: &String, pid: i32) -> Re env: args.env.clone().unwrap_or("".to_string()), status: ContainerStatus::READY, log: args.log, + wait: args.wait, }; let toml_str = toml::to_string(&container_info)?; fs::write(container_info_path, toml_str)?; @@ -549,15 +563,17 @@ fn show_containers(is_show_all: bool) -> Result<()> { Ok(()) } -fn stop_container(containers_id: &str, is_remove: bool) -> Result<()> { +fn stop_container(containers_id: &str, is_remove: bool) -> Result<()> { + let containers_path = Path::new(WORKSPACE).join("containers"); if containers_id == "all" { for container_info in get_all_container_info()?{ stop_container(container_info.id.as_str(), is_remove)? } + // return Ok(()) } for container_id in containers_id.split(" ") { - let container_work_path = Path::new(WORKSPACE).join("containers").join(container_id); + let container_work_path = containers_path.join(container_id); let container_merged_path = container_work_path.join("merged"); if let Ok(container_info) = get_container_info(container_id) { // 正在运行中的需要 kill @@ -581,15 +597,15 @@ fn stop_container(containers_id: &str, is_remove: bool) -> Result<()> { } }) .for_each(|s| { - match umount2(s.as_str(), MntFlags::MNT_DETACH) { + match umount2(s.as_str(), MntFlags::MNT_FORCE) { Ok(_) => println!("卸载自定卷{s}"), Err(e) => println!("卸载卷{s}失败: {e:?}"), } }); } // 卸载overlayfs - match umount2(container_merged_path.to_str().unwrap(), MntFlags::MNT_DETACH) { - Ok(_) => println!("卸载overlayfs卷"), + match umount2(container_merged_path.to_str().unwrap(), MntFlags::MNT_FORCE) { + Ok(_) => println!("卸载overlayfs卷: {container_merged_path:?}"), Err(e) => println!("卸载overlayfs失败: {e:?}"), } @@ -609,6 +625,9 @@ fn stop_container(containers_id: &str, is_remove: bool) -> Result<()> { Err(e) => println!("删除容器失败: {e:?}"), } } + + // 容器网络删除 + remove_network(container_id); } Ok(()) } @@ -618,6 +637,7 @@ fn main() -> Result<()>{ START_T.get_or_init(|| { time::Instant::now() }); + let mut args = RockerArgs::parse(); if args.image.is_some() || args.restart.is_some() { let volume_path; @@ -649,9 +669,24 @@ fn main() -> Result<()>{ unreachable!() } } + + CONTAINER_INFO.get_or_init(||{ + ContainerInfo { + id: container_id.clone(), + pid: -1, + run: args.run.as_ref().unwrap().clone(), + image: args.image.as_ref().unwrap().clone(), + volume: args.volume.clone().unwrap_or_default(), + env: args.env.clone().unwrap_or_default(), + status: ContainerStatus::READY, + log: args.log, + wait: args.wait + } + }); + let container_info = CONTAINER_INFO.get().unwrap(); match run_container(&container_id, &cmd, &args, &volume_path, false) { Ok(child_pid) => { - save_container_info(&args, &container_id, child_pid)?; + // save_container_info(&args, &container_id, child_pid)?; } Err(e) => { // clone 之后的错误 这里已经无法捕获了 diff --git a/src/network.rs b/src/network.rs index 5733179..bea51f8 100644 --- a/src/network.rs +++ b/src/network.rs @@ -1,4 +1,4 @@ -use std::{fmt::{Display, Formatter}, fs::OpenOptions, io::{Read, Write}}; +use std::{fmt::{Display, Formatter}, fs::OpenOptions, io::{stdout, Read, Write}}; use rand::Rng; static NETWORK_FILE: &str = "/home/rocker/network"; @@ -53,6 +53,22 @@ fn set_slave_ip(slave_veth_name: &str, addr: &str, pid: &str) -> bool { } fn set_snat(gateway_addr: &str, bridge_name: &str, action: &str) -> bool { + // 检查是否存在 iptables -t nat -L POSTROUTING -n + let args = ["-t", "nat", "-L", "POSTROUTING", "-n"]; + let out = std::process::Command::new("iptables") + .args(args) + .output() + .unwrap(); + + let is_some = String::from_utf8_lossy(&out.stdout).contains(gateway_addr); + if is_some && action == "-A" { + println!("snat 已经存在, 无法再次创建"); + return false; + } else if is_some == false && action == "-D" { + println!("snat 本身不存在,不需要删除"); + return true; + } + // sudo iptables -t nat -A POSTROUTING -s 172.18.0.0/24 ! -o br0 -j MASQUERADE let args = ["-t", "nat", action, "POSTROUTING", "-s", &format!("{gateway_addr}/24"), "!", "-o", bridge_name, "-j", "MASQUERADE"]; let out = std::process::Command::new("iptables") @@ -215,17 +231,35 @@ fn set_net(bridge_name: &str, addr: &str){ } } -fn del_bridge(bridge_name: &str) { - // sudo brctl delbr br0 - let args = ["delbr", bridge_name]; - println!("del_bridge: {args:?}"); - let out = std::process::Command::new("brctl") +fn del_bridge(bridge_name: &str) -> bool { + // 是否还存在设备 + let args = ["link", "show", bridge_name]; + let out = std::process::Command::new("ip") .args(args) .output() .unwrap(); - if !out.status.success() { - println!("{:?}", out); + + if out.status.success() { + // 下线 + let args = ["link", "set", bridge_name, "down"]; + let _ = std::process::Command::new("ip") + .args(args) + .output() + .unwrap(); + + // brctl delbr br0 + let args = ["delbr", bridge_name]; + let out = std::process::Command::new("brctl") + .args(args) + .output() + .unwrap(); + if !out.status.success() { + println!("del_bridge: {args:?}"); + println!("{:?}", out); + return false; + } } + true } @@ -309,6 +343,7 @@ fn write_network_info(all_network: Vec) { let mut f = OpenOptions::new() .write(true) .create(true) + .truncate(true) .open(NETWORK_FILE) .unwrap(); for n in all_network { @@ -365,7 +400,6 @@ pub fn create_network(uuid_name: &str, pid: i32) -> bool { // 写入到文件中 write_network_info(all_network); - // 系统中创建桥 if create_bridge_dev(&network.bridge_name) && // 给桥分配ip @@ -397,7 +431,40 @@ pub fn create_network(uuid_name: &str, pid: i32) -> bool { } -fn remove_network(uuid_name: &str) { +fn del_dev(dev_name: &str) -> bool { + // 先检查是否还有该设备 + let args = ["link", "show", dev_name]; + let out = std::process::Command::new("ip") + .args(args) + .output() + .unwrap(); + + if out.status.success() { + // 下线 + let args = ["link", "set", dev_name, "down"]; + let _ = std::process::Command::new("ip") + .args(args) + .output() + .unwrap(); + + // ip link delete dev_name + let args = ["link", "delete", dev_name]; + let out = std::process::Command::new("ip") + .args(args) + .output() + .unwrap(); + if !out.status.success() { + println!("del_dev: {args:?}"); + println!("{:?}", out); + return false; + } + } + + true +} + + +pub fn remove_network(uuid_name: &str) { let mut all_network = get_all_network(); let mut network = None; all_network = all_network.into_iter() @@ -411,36 +478,18 @@ fn remove_network(uuid_name: &str) { }).collect::>(); if let Some(network) = network { - + del_dev(&network.bridge_name); + del_dev(&network.master_veth_name); + set_snat(&network.gateway_addr, &network.bridge_name, "-D"); } - - - // todo 回写到文件中 - // write_network_info(all_network); + // 回写到文件中 + write_network_info(all_network); } fn main(){ let container_id = uuid::Uuid::new_v4().to_string()[0..8].to_string(); - // create_network(&container_id, 17543); - remove_network("ac1aca8d"); - return; - - let addr = "192.168.124.1"; - let bridge_name = &format!("rocker_{}", addr[8..].replace(".", "_")); - - println!("{bridge_name}"); - println!("{addr}"); - - create_bridge_dev(&bridge_name); - set_bridge_ip(&bridge_name, &addr); - set_up(&bridge_name); - // 我们在 ip addr add 172.18.0.1/24 dev br0 的时候补全了网段信息 /24, 所以在 ip link set br0 up的时候, - // 会自动配置路由表配置路由表 192.168.0.0/24 转发到这 bridge_name 的网络接口上 - // set_route(bridge_name, addr); - set_net(bridge_name, addr); - - let veth_name = "yanguang"; - // connect(bridge_name, veth_name); + // create_network(&container_id, 2084); + remove_network("c3a20664"); } diff --git a/test.log b/test.log new file mode 100644 index 0000000..593da10 --- /dev/null +++ b/test.log @@ -0,0 +1,398 @@ +解压缩完毕: "busybox" +Output { status: ExitStatus(unix_wait_status(0)), stdout: "", stderr: "" } +clone ok: Pid(2310) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/3c14dbc2/upper,workdir=/home/rocker/containers/3c14dbc2/merged" +10.183.130.0,10.183.130.1,10.183.130.3,ro_3c14dbc2_1,ro_3c14dbc2_2,ro_3c14dbc2_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:32 UTC 2024 +启动用时: 452ms +Pid(2310) exit: Exited(Pid(2310), 0) +clone ok: Pid(2370) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/67852dcf/upper,workdir=/home/rocker/containers/67852dcf/merged" +10.61.127.0,10.61.127.1,10.61.127.3,ro_67852dcf_1,ro_67852dcf_2,ro_67852dcf_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:32 UTC 2024 +启动用时: 209ms +Pid(2370) exit: Exited(Pid(2370), 0) +clone ok: Pid(2403) +10.69.151.0,10.69.151.1,10.69.151.3,ro_aad0cad3_1,ro_aad0cad3_2,ro_aad0cad3_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/aad0cad3/upper,workdir=/home/rocker/containers/aad0cad3/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:33 UTC 2024 +启动用时: 411ms +Pid(2403) exit: Exited(Pid(2403), 0) +clone ok: Pid(2453) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/56434f7c/upper,workdir=/home/rocker/containers/56434f7c/merged" +10.222.111.0,10.222.111.1,10.222.111.3,ro_56434f7c_1,ro_56434f7c_2,ro_56434f7c_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:33 UTC 2024 +启动用时: 475ms +Pid(2453) exit: Exited(Pid(2453), 0) +clone ok: Pid(2486) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/a1fd36eb/upper,workdir=/home/rocker/containers/a1fd36eb/merged" +10.190.95.0,10.190.95.1,10.190.95.3,ro_a1fd36eb_1,ro_a1fd36eb_2,ro_a1fd36eb_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:34 UTC 2024 +启动用时: 575ms +Pid(2486) exit: Exited(Pid(2486), 0) +clone ok: Pid(2529) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/3b33eda3/upper,workdir=/home/rocker/containers/3b33eda3/merged" +10.121.6.0,10.121.6.1,10.121.6.3,ro_3b33eda3_1,ro_3b33eda3_2,ro_3b33eda3_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:35 UTC 2024 +启动用时: 666ms +Pid(2529) exit: Exited(Pid(2529), 0) +clone ok: Pid(2579) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/2115f7bc/upper,workdir=/home/rocker/containers/2115f7bc/merged" +10.80.42.0,10.80.42.1,10.80.42.3,ro_2115f7bc_1,ro_2115f7bc_2,ro_2115f7bc_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:35 UTC 2024 +启动用时: 565ms +Pid(2579) exit: Exited(Pid(2579), 0) +clone ok: Pid(2612) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/d682590f/upper,workdir=/home/rocker/containers/d682590f/merged" +10.201.68.0,10.201.68.1,10.201.68.3,ro_d682590f_1,ro_d682590f_2,ro_d682590f_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:36 UTC 2024 +启动用时: 476ms +Pid(2612) exit: Exited(Pid(2612), 0) +clone ok: Pid(2657) +10.122.151.0,10.122.151.1,10.122.151.3,ro_694ff469_1,ro_694ff469_2,ro_694ff469_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/694ff469/upper,workdir=/home/rocker/containers/694ff469/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:37 UTC 2024 +启动用时: 608ms +Pid(2657) exit: Exited(Pid(2657), 0) +clone ok: Pid(2692) +10.0.63.0,10.0.63.1,10.0.63.3,ro_39c10d1e_1,ro_39c10d1e_2,ro_39c10d1e_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/39c10d1e/upper,workdir=/home/rocker/containers/39c10d1e/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:38 UTC 2024 +启动用时: 578ms +Pid(2692) exit: Exited(Pid(2692), 0) +clone ok: Pid(2725) +10.9.56.0,10.9.56.1,10.9.56.3,ro_3cee3156_1,ro_3cee3156_2,ro_3cee3156_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/3cee3156/upper,workdir=/home/rocker/containers/3cee3156/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:38 UTC 2024 +启动用时: 466ms +Pid(2725) exit: Exited(Pid(2725), 0) +clone ok: Pid(2758) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/284b1e41/upper,workdir=/home/rocker/containers/284b1e41/merged" +10.44.177.0,10.44.177.1,10.44.177.3,ro_284b1e41_1,ro_284b1e41_2,ro_284b1e41_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:39 UTC 2024 +启动用时: 593ms +Pid(2758) exit: Exited(Pid(2758), 0) +clone ok: Pid(2791) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/792cd124/upper,workdir=/home/rocker/containers/792cd124/merged" +10.38.118.0,10.38.118.1,10.38.118.3,ro_792cd124_1,ro_792cd124_2,ro_792cd124_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:39 UTC 2024 +启动用时: 551ms +Pid(2791) exit: Exited(Pid(2791), 0) +clone ok: Pid(2824) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/d73241d5/upper,workdir=/home/rocker/containers/d73241d5/merged" +10.101.187.0,10.101.187.1,10.101.187.3,ro_d73241d5_1,ro_d73241d5_2,ro_d73241d5_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:40 UTC 2024 +启动用时: 491ms +Pid(2824) exit: Exited(Pid(2824), 0) +clone ok: Pid(2857) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/070a42d6/upper,workdir=/home/rocker/containers/070a42d6/merged" +容器文件系统创建完成 +10.148.131.0,10.148.131.1,10.148.131.3,ro_070a42d6_1,ro_070a42d6_2,ro_070a42d6_3 +create_network success +Sat Aug 10 06:43:41 UTC 2024 +启动用时: 646ms +Pid(2857) exit: Exited(Pid(2857), 0) +clone ok: Pid(2890) +10.76.168.0,10.76.168.1,10.76.168.3,ro_25a974a4_1,ro_25a974a4_2,ro_25a974a4_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/25a974a4/upper,workdir=/home/rocker/containers/25a974a4/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:41 UTC 2024 +启动用时: 678ms +Pid(2890) exit: Exited(Pid(2890), 0) +clone ok: Pid(2925) +10.80.199.0,10.80.199.1,10.80.199.3,ro_11fd79cc_1,ro_11fd79cc_2,ro_11fd79cc_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/11fd79cc/upper,workdir=/home/rocker/containers/11fd79cc/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:42 UTC 2024 +启动用时: 510ms +Pid(2925) exit: Exited(Pid(2925), 0) +clone ok: Pid(2958) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/07e9b8d3/upper,workdir=/home/rocker/containers/07e9b8d3/merged" +10.27.84.0,10.27.84.1,10.27.84.3,ro_07e9b8d3_1,ro_07e9b8d3_2,ro_07e9b8d3_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:43 UTC 2024 +启动用时: 442ms +Pid(2958) exit: Exited(Pid(2958), 0) +clone ok: Pid(2991) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/ebe8e61e/upper,workdir=/home/rocker/containers/ebe8e61e/merged" +10.208.41.0,10.208.41.1,10.208.41.3,ro_ebe8e61e_1,ro_ebe8e61e_2,ro_ebe8e61e_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:43 UTC 2024 +启动用时: 508ms +Pid(2991) exit: Exited(Pid(2991), 0) +clone ok: Pid(3024) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/24f0ffde/upper,workdir=/home/rocker/containers/24f0ffde/merged" +10.58.133.0,10.58.133.1,10.58.133.3,ro_24f0ffde_1,ro_24f0ffde_2,ro_24f0ffde_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:44 UTC 2024 +启动用时: 620ms +Pid(3024) exit: Exited(Pid(3024), 0) +clone ok: Pid(3057) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/1300f1b0/upper,workdir=/home/rocker/containers/1300f1b0/merged" +10.226.251.0,10.226.251.1,10.226.251.3,ro_1300f1b0_1,ro_1300f1b0_2,ro_1300f1b0_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:45 UTC 2024 +启动用时: 377ms +Pid(3057) exit: Exited(Pid(3057), 0) +clone ok: Pid(3090) +10.69.252.0,10.69.252.1,10.69.252.3,ro_9e891ecb_1,ro_9e891ecb_2,ro_9e891ecb_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/9e891ecb/upper,workdir=/home/rocker/containers/9e891ecb/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:45 UTC 2024 +启动用时: 475ms +Pid(3090) exit: Exited(Pid(3090), 0) +clone ok: Pid(3123) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/002d9bf9/upper,workdir=/home/rocker/containers/002d9bf9/merged" +10.120.13.0,10.120.13.1,10.120.13.3,ro_002d9bf9_1,ro_002d9bf9_2,ro_002d9bf9_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:46 UTC 2024 +启动用时: 492ms +Pid(3123) exit: Exited(Pid(3123), 0) +clone ok: Pid(3156) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/2c8745c3/upper,workdir=/home/rocker/containers/2c8745c3/merged" +10.251.224.0,10.251.224.1,10.251.224.3,ro_2c8745c3_1,ro_2c8745c3_2,ro_2c8745c3_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:46 UTC 2024 +启动用时: 515ms +Pid(3156) exit: Exited(Pid(3156), 0) +clone ok: Pid(3189) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/9142fcdc/upper,workdir=/home/rocker/containers/9142fcdc/merged" +10.66.217.0,10.66.217.1,10.66.217.3,ro_9142fcdc_1,ro_9142fcdc_2,ro_9142fcdc_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:47 UTC 2024 +启动用时: 563ms +Pid(3189) exit: Exited(Pid(3189), 0) +clone ok: Pid(3222) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/e6e73543/upper,workdir=/home/rocker/containers/e6e73543/merged" +10.190.88.0,10.190.88.1,10.190.88.3,ro_e6e73543_1,ro_e6e73543_2,ro_e6e73543_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:48 UTC 2024 +启动用时: 512ms +Pid(3222) exit: Exited(Pid(3222), 0) +clone ok: Pid(3255) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/21ee50a6/upper,workdir=/home/rocker/containers/21ee50a6/merged" +10.13.215.0,10.13.215.1,10.13.215.3,ro_21ee50a6_1,ro_21ee50a6_2,ro_21ee50a6_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:48 UTC 2024 +启动用时: 521ms +Pid(3255) exit: Exited(Pid(3255), 0) +clone ok: Pid(3288) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/e48e570e/upper,workdir=/home/rocker/containers/e48e570e/merged" +10.15.233.0,10.15.233.1,10.15.233.3,ro_e48e570e_1,ro_e48e570e_2,ro_e48e570e_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:49 UTC 2024 +启动用时: 475ms +Pid(3288) exit: Exited(Pid(3288), 0) +clone ok: Pid(3321) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/5c2d8295/upper,workdir=/home/rocker/containers/5c2d8295/merged" +10.74.225.0,10.74.225.1,10.74.225.3,ro_5c2d8295_1,ro_5c2d8295_2,ro_5c2d8295_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:49 UTC 2024 +启动用时: 294ms +Pid(3321) exit: Exited(Pid(3321), 0) +clone ok: Pid(3354) +10.84.36.0,10.84.36.1,10.84.36.3,ro_afeac42b_1,ro_afeac42b_2,ro_afeac42b_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/afeac42b/upper,workdir=/home/rocker/containers/afeac42b/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:50 UTC 2024 +启动用时: 526ms +Pid(3354) exit: Exited(Pid(3354), 0) +clone ok: Pid(3387) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/e6e748bf/upper,workdir=/home/rocker/containers/e6e748bf/merged" +10.36.211.0,10.36.211.1,10.36.211.3,ro_e6e748bf_1,ro_e6e748bf_2,ro_e6e748bf_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:51 UTC 2024 +启动用时: 519ms +Pid(3387) exit: Exited(Pid(3387), 0) +clone ok: Pid(3420) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/67a8123f/upper,workdir=/home/rocker/containers/67a8123f/merged" +10.37.116.0,10.37.116.1,10.37.116.3,ro_67a8123f_1,ro_67a8123f_2,ro_67a8123f_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:51 UTC 2024 +启动用时: 535ms +Pid(3420) exit: Exited(Pid(3420), 0) +clone ok: Pid(3453) +10.84.228.0,10.84.228.1,10.84.228.3,ro_f05e5556_1,ro_f05e5556_2,ro_f05e5556_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/f05e5556/upper,workdir=/home/rocker/containers/f05e5556/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:52 UTC 2024 +启动用时: 377ms +Pid(3453) exit: Exited(Pid(3453), 0) +clone ok: Pid(3486) +10.48.72.0,10.48.72.1,10.48.72.3,ro_f04dd225_1,ro_f04dd225_2,ro_f04dd225_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/f04dd225/upper,workdir=/home/rocker/containers/f04dd225/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:52 UTC 2024 +启动用时: 518ms +Pid(3486) exit: Exited(Pid(3486), 0) +clone ok: Pid(3519) +10.172.213.0,10.172.213.1,10.172.213.3,ro_8cadde8e_1,ro_8cadde8e_2,ro_8cadde8e_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/8cadde8e/upper,workdir=/home/rocker/containers/8cadde8e/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:53 UTC 2024 +启动用时: 503ms +Pid(3519) exit: Exited(Pid(3519), 0) +clone ok: Pid(3552) +10.80.0.0,10.80.0.1,10.80.0.3,ro_bf8cdb88_1,ro_bf8cdb88_2,ro_bf8cdb88_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/bf8cdb88/upper,workdir=/home/rocker/containers/bf8cdb88/merged" +容器文件系统创建完成 +clone ok: Pid(3568) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/093c1f19/upper,workdir=/home/rocker/containers/093c1f19/merged" +10.89.140.0,10.89.140.1,10.89.140.3,ro_093c1f19_1,ro_093c1f19_2,ro_093c1f19_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:54 UTC 2024 +启动用时: 221ms +Pid(3568) exit: Exited(Pid(3568), 0) +clone ok: Pid(3593) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/6179827e/upper,workdir=/home/rocker/containers/6179827e/merged" +10.44.164.0,10.44.164.1,10.44.164.3,ro_6179827e_1,ro_6179827e_2,ro_6179827e_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:55 UTC 2024 +启动用时: 807ms +Pid(3593) exit: Exited(Pid(3593), 0) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/6b83b453/upper,workdir=/home/rocker/containers/6b83b453/merged" +clone ok: Pid(3649) +10.46.208.0,10.46.208.1,10.46.208.3,ro_6b83b453_1,ro_6b83b453_2,ro_6b83b453_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:56 UTC 2024 +启动用时: 846ms +Pid(3649) exit: Exited(Pid(3649), 0) +clone ok: Pid(3692) +10.250.88.0,10.250.88.1,10.250.88.3,ro_c24f4ef6_1,ro_c24f4ef6_2,ro_c24f4ef6_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/c24f4ef6/upper,workdir=/home/rocker/containers/c24f4ef6/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:56 UTC 2024 +启动用时: 619ms +Pid(3692) exit: Exited(Pid(3692), 0) +clone ok: Pid(3729) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/f7ced84a/upper,workdir=/home/rocker/containers/f7ced84a/merged" +10.105.50.0,10.105.50.1,10.105.50.3,ro_f7ced84a_1,ro_f7ced84a_2,ro_f7ced84a_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:57 UTC 2024 +启动用时: 987ms +Pid(3729) exit: Exited(Pid(3729), 0) +clone ok: Pid(3764) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/d04f59ab/upper,workdir=/home/rocker/containers/d04f59ab/merged" +10.50.187.0,10.50.187.1,10.50.187.3,ro_d04f59ab_1,ro_d04f59ab_2,ro_d04f59ab_3 +容器文件系统创建完成 +clone ok: Pid(3770) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/1fb07eeb/upper,workdir=/home/rocker/containers/1fb07eeb/merged" +10.79.109.0,10.79.109.1,10.79.109.3,ro_1fb07eeb_1,ro_1fb07eeb_2,ro_1fb07eeb_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:58 UTC 2024 +启动用时: 249ms +Pid(3770) exit: Exited(Pid(3770), 0) +clone ok: Pid(3806) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/e6fde771/upper,workdir=/home/rocker/containers/e6fde771/merged" +10.149.254.0,10.149.254.1,10.149.254.3,ro_e6fde771_1,ro_e6fde771_2,ro_e6fde771_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:43:59 UTC 2024 +启动用时: 609ms +Pid(3806) exit: Exited(Pid(3806), 0) +clone ok: Pid(3839) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/48bb03e4/upper,workdir=/home/rocker/containers/48bb03e4/merged" +10.120.228.0,10.120.228.1,10.120.228.3,ro_48bb03e4_1,ro_48bb03e4_2,ro_48bb03e4_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:44:00 UTC 2024 +启动用时: 499ms +Pid(3839) exit: Exited(Pid(3839), 0) +clone ok: Pid(3887) +10.71.60.0,10.71.60.1,10.71.60.3,ro_f1405d92_1,ro_f1405d92_2,ro_f1405d92_3 +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/f1405d92/upper,workdir=/home/rocker/containers/f1405d92/merged" +容器文件系统创建完成 +create_network success +Sat Aug 10 06:44:00 UTC 2024 +启动用时: 487ms +Pid(3887) exit: Exited(Pid(3887), 0) +clone ok: Pid(3920) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/6d64ac98/upper,workdir=/home/rocker/containers/6d64ac98/merged" +10.204.39.0,10.204.39.1,10.204.39.3,ro_6d64ac98_1,ro_6d64ac98_2,ro_6d64ac98_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:44:01 UTC 2024 +启动用时: 770ms +Pid(3920) exit: Exited(Pid(3920), 0) +clone ok: Pid(3963) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/6ec7154f/upper,workdir=/home/rocker/containers/6ec7154f/merged" +10.64.80.0,10.64.80.1,10.64.80.3,ro_6ec7154f_1,ro_6ec7154f_2,ro_6ec7154f_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:44:02 UTC 2024 +启动用时: 556ms +Pid(3963) exit: Exited(Pid(3963), 0) +clone ok: Pid(3996) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/2debe50b/upper,workdir=/home/rocker/containers/2debe50b/merged" +10.129.22.0,10.129.22.1,10.129.22.3,ro_2debe50b_1,ro_2debe50b_2,ro_2debe50b_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:44:02 UTC 2024 +启动用时: 363ms +Pid(3996) exit: Exited(Pid(3996), 0) +clone ok: Pid(4029) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/5062e991/upper,workdir=/home/rocker/containers/5062e991/merged" +10.34.167.0,10.34.167.1,10.34.167.3,ro_5062e991_1,ro_5062e991_2,ro_5062e991_3 +容器文件系统创建完成 +create_network success +Sat Aug 10 06:44:03 UTC 2024 +启动用时: 609ms +Pid(4029) exit: Exited(Pid(4029), 0) +clone ok: Pid(4060) +dirs: "lowerdir=/home/rocker/volumes/busybox,upperdir=/home/rocker/containers/f240853a/upper,workdir=/home/rocker/containers/f240853a/merged" +10.185.55.0,10.185.55.1,10.185.55.3,ro_f240853a_1,ro_f240853a_2,ro_f240853a_3 +容器文件系统创建完成 diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..5f3023a --- /dev/null +++ b/test.sh @@ -0,0 +1,5 @@ +while true; do + # 两个线程 + sudo ./target/release/rocker --image busybox --run "/bin/date" --wait +done +