From f7d067c6d1d5f276fc20314c67ead1eaa8224304 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: Thu, 8 Aug 2024 03:17:18 +0000 Subject: [PATCH] =?UTF-8?q?exec=E6=9B=BF=E6=8D=A2=E4=B8=BA=E6=A0=87?= =?UTF-8?q?=E5=87=86=E5=BA=93=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 61 +++++++++++++++-------------------------------------- 1 file changed, 17 insertions(+), 44 deletions(-) diff --git a/src/main.rs b/src/main.rs index f9efb1b..5984274 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,13 +4,13 @@ use std::fs::File; use std::io::Read; use std::os::fd::{AsFd, AsRawFd}; use std::os::unix::fs::PermissionsExt; +use std::os::unix::process::CommandExt; use nix::libc::{self, setgid, CLONE_NEWCGROUP, MS_NODEV, MS_NOSUID}; use nix::sched::{clone, CloneCb, CloneFlags, setns}; use nix::sys::signal::{kill, Signal}; use nix::sys::wait::{wait, waitpid, waitid, WaitPidFlag}; use nix::unistd::{chdir, chroot, dup2, execv, pivot_root, setuid, sleep, Gid, Pid, Uid, User, setgroups}; -use nix::mount::{mount, MntFlags, MsFlags, umount2, umount}; -use nix::env::clearenv; +use nix::mount::{mount, MntFlags, MsFlags, umount2}; use std::path::{Path, PathBuf}; use clap::Parser; use error::{Result, RockerError}; @@ -226,7 +226,7 @@ fn init_container_pivot>(merged_path: P) -> Result<()> { mount(None::<&str>, "/", None::<&str>, MsFlags::MS_PRIVATE | MsFlags::MS_REC, None::<&str>)?; // 修改overlayfs 为rootfs - chdir(merged_path.as_ref())?; + std::env::set_current_dir(merged_path)?; let pwd_path = std::env::current_dir()?; let pwd_str = pwd_path.to_string_lossy().to_string(); @@ -241,7 +241,7 @@ fn init_container_pivot>(merged_path: P) -> Result<()> { pivot_root(pwd_str.as_str(), pivot_root_dir.as_str())?; // 修改当前进程工作目录(注意我们之前已经到rootfs内, 并且把根目录设置完毕了) - chdir("/")?; + std::env::set_current_dir("/")?; // 卸载 old_root, 并删除临时文件 umount2(".pivot_root", MntFlags::MNT_DETACH).unwrap(); @@ -296,17 +296,7 @@ fn create_dir>(path: P, is_any:bool) -> Result<()> { fn parse_cmd(run: &String) -> Vec{ let args= run .split(" ") - .filter_map(|s| { - match CString::new(s) { - Ok(cs) => { - Some(cs) - } - Err(e) => { - println!("{e:?}"); - None - } - } - }) + .filter_map(|s| CString::new(s).ok()) .collect::>(); args } @@ -393,13 +383,11 @@ fn run_container(_container_id: &String, cmd: &String, args: &RockerArgs, volume init_container_env(None).unwrap(); init_container_user(rocker_uid, rocker_gid).unwrap(); - let cmd_vec = parse_cmd(cmd); - match execv(&cmd_vec[0], &cmd_vec) { - Err(e) => { - println!("execv {cmd_vec:?}失败: {e:?}"); - } - _ => {}, - }; + let cmd_vec = cmd.split(" ").collect::>(); + let err = std::process::Command::new(cmd_vec[0]) + .args(&cmd_vec[1..]) + .exec(); + println!("execv {cmd_vec:?}失败: {err:?}"); 0isize }; @@ -425,17 +413,14 @@ fn run_container(_container_id: &String, cmd: &String, args: &RockerArgs, volume init_container_mount().unwrap(); init_container_log(args.log).unwrap(); init_container_user(rocker_uid, rocker_gid).unwrap(); - - let cmd_vec = parse_cmd(cmd); - match execv(&cmd_vec[0], &cmd_vec) { - Err(e) => { - println!("execv {cmd_vec:?}失败: {e:?}"); - } - _ => {}, - }; + + let cmd_vec = cmd.split(" ").collect::>(); + let err = std::process::Command::new(cmd_vec[0]) + .args(&cmd_vec[1..]) + .exec(); + println!("execv {cmd_vec:?}失败: {err:?}"); 0isize }; - clone_flags = CloneFlags::from_bits_truncate(CLONE_FLAG); Box::new(_cb) as CloneCb }; @@ -615,7 +600,7 @@ fn main() -> Result<()>{ Err(e) => { println!("run_container失败: {e}"); } - } + } save_container_info(&args, &container_id, pid)?; // todo 无论出不错, 都要保存一个信息, 后面需要删除用清理 } else if args.ps || args.psa { // --ps @@ -629,18 +614,6 @@ fn main() -> Result<()>{ } else if let (Some(cmd), Some(container_id)) = (&args.run, &args.exec) { run_container(container_id, &cmd, &args, &Default::default(), true).unwrap(); } - // } else if let Some(containers_id) = &args.start { - // // --start - // start_container(containers_id)?; - // } else if let Some(containers_id) = &args.exec { - // // --exec - // exec_container(containers_id, &cmd, &args)?; - // } - - // exec - - // logs - Ok(()) } \ No newline at end of file