功能更新

main
阳光少年 1 year ago
parent ec7af3ee22
commit 229b994d26

1
.gitignore vendored

@ -1 +1,2 @@
target/
images/

319
rm.log

@ -1,144 +1,175 @@
卸载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 成功
____ __
/\ _`\ /\ \
\ \ \L\ \ ___ ___\ \ \/'\ __ _ __
\ \ , / / __`\ /'___\ \ , < /'__`\/\`'__\
\ \ \\ \ /\ \L\ \/\ \__/\ \ \\`\ /\ __/\ \ \/
\ \_\ \_\ \____/\ \____\\ \_\ \_\ \____\\ \_\
\/_/\/ /\/___/ \/____/ \/_/\/_/\/____/ \/_/
卸载overlayfs卷: "/home/rocker/containers/60bbdd19/merged"
停止容器: "60bbdd19"
删除容器 60bbdd19 成功
卸载overlayfs卷: "/home/rocker/containers/c3bb5209/merged"
停止容器: "c3bb5209"
删除容器 c3bb5209 成功
卸载overlayfs卷: "/home/rocker/containers/25bedba6/merged"
停止容器: "25bedba6"
删除容器 25bedba6 成功
卸载overlayfs卷: "/home/rocker/containers/31fcc385/merged"
停止容器: "31fcc385"
删除容器 31fcc385 成功
卸载overlayfs卷: "/home/rocker/containers/b4711ba2/merged"
停止容器: "b4711ba2"
删除容器 b4711ba2 成功
snat 本身不存在,不需要删除
卸载overlayfs卷: "/home/rocker/containers/b4b96e96/merged"
停止容器: "b4b96e96"
删除容器 b4b96e96 成功
卸载overlayfs卷: "/home/rocker/containers/bc62a919/merged"
停止容器: "bc62a919"
删除容器 bc62a919 成功
卸载overlayfs卷: "/home/rocker/containers/48907d87/merged"
停止容器: "48907d87"
删除容器 48907d87 成功
卸载overlayfs卷: "/home/rocker/containers/cfcf19aa/merged"
停止容器: "cfcf19aa"
删除容器 cfcf19aa 成功
卸载overlayfs卷: "/home/rocker/containers/0c481e98/merged"
停止容器: "0c481e98"
删除容器 0c481e98 成功
卸载overlayfs卷: "/home/rocker/containers/fa053a04/merged"
停止容器: "fa053a04"
删除容器 fa053a04 成功
卸载overlayfs卷: "/home/rocker/containers/b2e17d40/merged"
停止容器: "b2e17d40"
删除容器 b2e17d40 成功
卸载overlayfs卷: "/home/rocker/containers/51543892/merged"
停止容器: "51543892"
删除容器 51543892 成功
卸载overlayfs卷: "/home/rocker/containers/879f3d80/merged"
停止容器: "879f3d80"
删除容器 879f3d80 成功
卸载overlayfs卷: "/home/rocker/containers/3bf74ac7/merged"
停止容器: "3bf74ac7"
删除容器 3bf74ac7 成功
卸载overlayfs卷: "/home/rocker/containers/7342405b/merged"
停止容器: "7342405b"
删除容器 7342405b 成功
卸载overlayfs卷: "/home/rocker/containers/a8a7baaa/merged"
停止容器: "a8a7baaa"
删除容器 a8a7baaa 成功
卸载overlayfs卷: "/home/rocker/containers/57aa56ba/merged"
停止容器: "57aa56ba"
删除容器 57aa56ba 成功
卸载overlayfs卷: "/home/rocker/containers/c147bb9c/merged"
停止容器: "c147bb9c"
删除容器 c147bb9c 成功
卸载overlayfs卷: "/home/rocker/containers/468fb8e0/merged"
停止容器: "468fb8e0"
删除容器 468fb8e0 成功
卸载overlayfs卷: "/home/rocker/containers/eb09e4e2/merged"
停止容器: "eb09e4e2"
删除容器 eb09e4e2 成功
卸载overlayfs卷: "/home/rocker/containers/c6bab945/merged"
停止容器: "c6bab945"
删除容器 c6bab945 成功
卸载overlayfs卷: "/home/rocker/containers/3e23fad7/merged"
停止容器: "3e23fad7"
删除容器 3e23fad7 成功
卸载overlayfs卷: "/home/rocker/containers/f2c486ae/merged"
停止容器: "f2c486ae"
删除容器 f2c486ae 成功
卸载overlayfs卷: "/home/rocker/containers/1c7dd8fd/merged"
停止容器: "1c7dd8fd"
删除容器 1c7dd8fd 成功
卸载overlayfs卷: "/home/rocker/containers/2b40bc78/merged"
停止容器: "2b40bc78"
删除容器 2b40bc78 成功
卸载overlayfs卷: "/home/rocker/containers/f1c11033/merged"
停止容器: "f1c11033"
删除容器 f1c11033 成功
卸载overlayfs卷: "/home/rocker/containers/6fc7c8cc/merged"
停止容器: "6fc7c8cc"
删除容器 6fc7c8cc 成功
卸载overlayfs卷: "/home/rocker/containers/8dd99d30/merged"
停止容器: "8dd99d30"
删除容器 8dd99d30 成功
snat 本身不存在,不需要删除
卸载overlayfs卷: "/home/rocker/containers/f34209cc/merged"
停止容器: "f34209cc"
删除容器 f34209cc 成功
snat 本身不存在,不需要删除
卸载overlayfs卷: "/home/rocker/containers/fa2609e8/merged"
停止容器: "fa2609e8"
删除容器 fa2609e8 成功
卸载overlayfs卷: "/home/rocker/containers/47532c7c/merged"
停止容器: "47532c7c"
删除容器 47532c7c 成功
卸载overlayfs卷: "/home/rocker/containers/315ded1f/merged"
停止容器: "315ded1f"
删除容器 315ded1f 成功
卸载overlayfs卷: "/home/rocker/containers/c1478dd1/merged"
停止容器: "c1478dd1"
删除容器 c1478dd1 成功
卸载overlayfs卷: "/home/rocker/containers/2e8086c2/merged"
停止容器: "2e8086c2"
删除容器 2e8086c2 成功
卸载overlayfs卷: "/home/rocker/containers/f10c68f9/merged"
停止容器: "f10c68f9"
删除容器 f10c68f9 成功
卸载overlayfs卷: "/home/rocker/containers/015042bd/merged"
停止容器: "015042bd"
删除容器 015042bd 成功
卸载overlayfs卷: "/home/rocker/containers/a991b149/merged"
停止容器: "a991b149"
删除容器 a991b149 成功
卸载overlayfs卷: "/home/rocker/containers/586b8109/merged"
停止容器: "586b8109"
删除容器 586b8109 成功
snat 本身不存在,不需要删除
卸载overlayfs卷: "/home/rocker/containers/de3f7b1a/merged"
停止容器: "de3f7b1a"
删除容器 de3f7b1a 成功
卸载overlayfs卷: "/home/rocker/containers/9e15011d/merged"
停止容器: "9e15011d"
删除容器 9e15011d 成功
卸载overlayfs卷: "/home/rocker/containers/fa6437d0/merged"
停止容器: "fa6437d0"
删除容器 fa6437d0 成功
卸载overlayfs卷: "/home/rocker/containers/670fed27/merged"
停止容器: "670fed27"
删除容器 670fed27 成功
卸载overlayfs卷: "/home/rocker/containers/e99ed601/merged"
停止容器: "e99ed601"
删除容器 e99ed601 成功
卸载overlayfs卷: "/home/rocker/containers/c3ef2b65/merged"
停止容器: "c3ef2b65"
删除容器 c3ef2b65 成功
卸载overlayfs卷: "/home/rocker/containers/a85169b8/merged"
停止容器: "a85169b8"
删除容器 a85169b8 成功
卸载overlayfs卷: "/home/rocker/containers/01baecba/merged"
停止容器: "01baecba"
删除容器 01baecba 成功
卸载overlayfs卷: "/home/rocker/containers/b19f7cda/merged"
停止容器: "b19f7cda"
删除容器 b19f7cda 成功
卸载overlayfs卷: "/home/rocker/containers/779bc707/merged"
停止容器: "779bc707"
删除容器 779bc707 成功
卸载overlayfs卷: "/home/rocker/containers/848e6120/merged"
停止容器: "848e6120"
删除容器 848e6120 成功
卸载overlayfs卷: "/home/rocker/containers/790450b9/merged"
停止容器: "790450b9"
删除容器 790450b9 成功
卸载overlayfs卷: "/home/rocker/containers/70fcced3/merged"
停止容器: "70fcced3"
删除容器 70fcced3 成功
卸载overlayfs卷: "/home/rocker/containers/4af42669/merged"
停止容器: "4af42669"
删除容器 4af42669 成功
卸载overlayfs卷: "/home/rocker/containers/16908f10/merged"
停止容器: "16908f10"
删除容器 16908f10 成功

@ -1,5 +1,4 @@
use std::{io, fs, fmt, os, path, process, time};
use io::Read;
use fmt::Display;
use os::fd::{AsFd, AsRawFd};
use os::unix::{fs::PermissionsExt, process::CommandExt};
@ -25,8 +24,8 @@ static USER_NAME: &str = "rocker";
static INFO_FILE: &str = "info.toml";
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<time::Instant> = OnceLock::new();
static LOGO: &str = r#"
____ __
/\ _`\ /\ \
@ -86,6 +85,13 @@ struct RockerArgs {
}
macro_rules! rocker_println {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
println!($($arg)*);
}
};
}
/// 从images解压到volumes
fn extend_image(image_name: &String) -> Result<PathBuf> {
@ -116,12 +122,11 @@ fn extend_image(image_name: &String) -> Result<PathBuf> {
if out.status.success() {
println!("解压缩完毕: {image_name:?}");
// 把解压缩后的文件全部给 rocker:rocker
let out = process::Command::new("chown")
let _ = process::Command::new("chown")
.arg("-R")
.arg("rocker:rocker")
.arg(volume_path_str)
.output()?;
println!("{out:?}");
Ok(volume_path)
} else {
// 删除 volume_path
@ -138,7 +143,6 @@ fn init_container_overlay<P: AsRef<Path>>(volume_path: P, upper_path: P, merged_
let merged_dir = merged_path.as_ref().to_string_lossy().to_string();
let dirs = format!("lowerdir={lower_dir},upperdir={upper_dir},workdir={merged_dir}");
println!("dirs: {dirs:?}");
let out = process::Command::new("mount")
.arg("-t")
.arg("overlay")
@ -215,9 +219,11 @@ fn init_container_env(env: &String) -> Result<()>{
if item_env_v.len() == 2 {
std::env::set_var(item_env_v[0], item_env_v[1])
} else {
if item_env.len() > 0 {
println!("env 格式不正确: {item_env}")
}
}
}
Ok(())
}
@ -328,7 +334,7 @@ fn create_pause(container_root_pause_path: &Path) -> Result<()> {
fn start(container_info: &ContainerInfo, cb: CloneCb, clong_flags: CloneFlags, container_merged_pause_path: &PathBuf) -> Result<i32>{
match unsafe {clone(cb, STACK.as_mut_slice(), clong_flags, None)} {
Ok(child_pid) => {
{
{ // 执行成功就保存吧~
let mut _container_info = container_info.clone();
_container_info.pid = child_pid.as_raw();
let _ = _container_info.flush();
@ -337,31 +343,28 @@ fn start(container_info: &ContainerInfo, cb: CloneCb, clong_flags: CloneFlags, c
// exec之前的步骤
create_network(&container_info.id, child_pid.as_raw());
// 删除 pause标志文件, 解开阻塞, 使其执行exec
while std::fs::remove_file(container_merged_pause_path).is_err(){
for _ in 0..500 {
std::thread::sleep(std::time::Duration::from_millis(10));
if std::fs::remove_file(container_merged_pause_path).is_ok() {
break;
}
}
// 检查是否执行exec了
let mut cnt = 0;
let main_exe = std::env::current_exe()?;
while let Ok(running) = check_container_is_running(&child_pid, &main_exe) {
cnt += 1;
for _ in 0..500 {
std::thread::sleep(std::time::Duration::from_millis(10));
if running {
break;
}
if cnt > 1000 {
println!("{child_pid} 启动 超时");
if let Ok(true) = check_container_is_running(&child_pid, &main_exe) {
break;
}
}
println!("启动用时: {}ms", START_T.get().unwrap().elapsed().as_millis());
println!("{} 启动用时: {}ms", container_info.id, START_T.get().unwrap().elapsed().as_millis());
// wait
if container_info.wait {
match waitpid(child_pid, Some(WaitPidFlag::WUNTRACED)) {
Ok(status) => {
println!("{child_pid:?} exit: {status:?}");
println!("exit: {status:?}");
}
Err(e) => {
println!("{child_pid} wait err: {e}");
@ -416,7 +419,7 @@ fn run_container(container_info: &ContainerInfo, is_exec_cmd: Option<&String>) -
let err = process::Command::new(cmd_vec[0])
.args(&cmd_vec[1..])
.exec();
println!("execv {cmd_vec:?}失败: {err:?}");
println!("🔴 execv {cmd_vec:?}失败: {err:?}");
0isize
};
clone_flags = CloneFlags::empty();
@ -429,9 +432,7 @@ fn run_container(container_info: &ContainerInfo, is_exec_cmd: Option<&String>) -
init_container_custom_volume(&container_merged_path, &container_info.volume).unwrap();
}
sethostname(USER_NAME).unwrap();
if container_info.env.len() > 0 {
init_container_env(&container_info.env).unwrap();
}
init_container_pivot(&container_merged_path).unwrap();
init_container_mount().unwrap();
init_container_log(container_info.log).unwrap();
@ -446,7 +447,7 @@ fn run_container(container_info: &ContainerInfo, is_exec_cmd: Option<&String>) -
let err = process::Command::new(cmd_vec[0])
.args(&cmd_vec[1..])
.exec();
println!("execv {cmd_vec:?}失败: {err:?}");
println!("🔴 execv {cmd_vec:?}失败: {err:?}");
0isize
};
clone_flags = CloneFlags::from_bits_truncate(CLONE_FLAG);
@ -620,8 +621,8 @@ fn stop_container(containers_id: &str, is_remove: bool) -> Result<()> {
// 删除容器目录
if is_remove {
match fs::remove_dir_all(container_work_path) {
Ok(_) => println!("删除容器 {container_id} 成功"),
Err(e) => println!("删除容器失败: {e:?}"),
Ok(_) => println!("🟢 删除容器 {container_id} 成功"),
Err(e) => println!("🔴 删除容器失败: {e:?}"),
}
}
} else {
@ -672,12 +673,17 @@ fn main() -> Result<()>{
};
match run_container(&container_info, None) {
Ok(child_pid) => {
println!("容器 {} 启动成功, pid: {child_pid}", container_info.id);
Ok(_) => {
if container_info.wait {
println!("🟢 容器 {} 运行完毕", container_info.id);
} else {
println!("🟢 主进程退出");
}
}
Err(e) => {
// clone 之后的错误 这里已经无法捕获了
println!("run_container失败: {e}");
// clone 之前出错, 清理工作目录
println!("🔴 run_container失败: {e}");
let is_remove = args.restart.is_none();
stop_container(&container_info.id, is_remove)?;
}

@ -395,7 +395,6 @@ pub fn create_network(uuid_name: &str, pid: i32) -> bool {
}
};
println!("{network}");
all_network.push(network.clone());
// 写入到文件中
write_network_info(all_network);
@ -421,7 +420,7 @@ pub fn create_network(uuid_name: &str, pid: i32) -> bool {
set_iptables_forward() &&
// 设置snat
set_snat(&network.gateway_addr, &network.bridge_name, "-A") {
println!("create_network success");
println!("网络设备创建完成");
true
} else {
println!("create_network failed");

1275
test.log

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save