mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-08-12 13:22:28 +00:00
Merge pull request #6993 from zvonkok/kata-agent-init-mount
agent: Ignore already mounted dev/fs/pseudo-fs
This commit is contained in:
commit
25d80fcec2
1
src/agent/Cargo.lock
generated
1
src/agent/Cargo.lock
generated
@ -842,6 +842,7 @@ dependencies = [
|
|||||||
"slog",
|
"slog",
|
||||||
"slog-scope",
|
"slog-scope",
|
||||||
"slog-stdlog",
|
"slog-stdlog",
|
||||||
|
"slog-term",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"test-utils",
|
"test-utils",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
@ -43,6 +43,7 @@ ipnetwork = "0.17.0"
|
|||||||
logging = { path = "../libs/logging" }
|
logging = { path = "../libs/logging" }
|
||||||
slog = "2.5.2"
|
slog = "2.5.2"
|
||||||
slog-scope = "4.1.2"
|
slog-scope = "4.1.2"
|
||||||
|
slog-term = "2.9.0"
|
||||||
|
|
||||||
# Redirect ttrpc log calls
|
# Redirect ttrpc log calls
|
||||||
slog-stdlog = "4.0.0"
|
slog-stdlog = "4.0.0"
|
||||||
|
@ -36,6 +36,7 @@ use crate::Sandbox;
|
|||||||
use crate::{ccw, device::get_virtio_blk_ccw_device_name};
|
use crate::{ccw, device::get_virtio_blk_ccw_device_name};
|
||||||
use anyhow::{anyhow, Context, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
use slog::Logger;
|
use slog::Logger;
|
||||||
|
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
pub const TYPE_ROOTFS: &str = "rootfs";
|
pub const TYPE_ROOTFS: &str = "rootfs";
|
||||||
@ -145,6 +146,11 @@ pub const STORAGE_HANDLER_LIST: &[&str] = &[
|
|||||||
DRIVER_WATCHABLE_BIND_TYPE,
|
DRIVER_WATCHABLE_BIND_TYPE,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
#[instrument]
|
||||||
|
pub fn get_mounts() -> Result<String, std::io::Error> {
|
||||||
|
fs::read_to_string("/proc/mounts")
|
||||||
|
}
|
||||||
|
|
||||||
#[instrument]
|
#[instrument]
|
||||||
pub fn baremount(
|
pub fn baremount(
|
||||||
source: &Path,
|
source: &Path,
|
||||||
@ -168,6 +174,31 @@ pub fn baremount(
|
|||||||
return Err(anyhow!("need mount FS type"));
|
return Err(anyhow!("need mount FS type"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let destination_str = destination.to_string_lossy();
|
||||||
|
let mounts = get_mounts().unwrap_or_else(|_| String::new());
|
||||||
|
let already_mounted = mounts
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.split_whitespace().collect::<Vec<&str>>())
|
||||||
|
.filter(|parts| parts.len() >= 3) // ensure we have at least [source}, destination, and fs_type
|
||||||
|
.any(|parts| {
|
||||||
|
// Check if source, destination and fs_type match any entry in /proc/mounts
|
||||||
|
// minimal check is for destination an fstype since source can have different names like:
|
||||||
|
// udev /dev devtmpfs
|
||||||
|
// dev /dev devtmpfs
|
||||||
|
// depending on which entity is mounting the dev/fs/pseudo-fs
|
||||||
|
parts[1] == destination_str && parts[2] == fs_type
|
||||||
|
});
|
||||||
|
|
||||||
|
if already_mounted {
|
||||||
|
slog_info!(
|
||||||
|
logger,
|
||||||
|
"{:?} is already mounted at {:?}",
|
||||||
|
source,
|
||||||
|
destination
|
||||||
|
);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
logger,
|
logger,
|
||||||
"baremount source={:?}, dest={:?}, fs_type={:?}, options={:?}, flags={:?}",
|
"baremount source={:?}, dest={:?}, fs_type={:?}, options={:?}, flags={:?}",
|
||||||
@ -1102,6 +1133,7 @@ fn parse_options(option_list: Vec<String>) -> HashMap<String, String> {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use protocols::agent::FSGroup;
|
use protocols::agent::FSGroup;
|
||||||
|
use slog::Drain;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::fs::OpenOptions;
|
use std::fs::OpenOptions;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
@ -1112,6 +1144,31 @@ mod tests {
|
|||||||
skip_if_not_root, skip_loop_by_user, skip_loop_if_not_root, skip_loop_if_root,
|
skip_if_not_root, skip_loop_by_user, skip_loop_if_not_root, skip_loop_if_root,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_already_baremounted() {
|
||||||
|
let plain = slog_term::PlainSyncDecorator::new(std::io::stdout());
|
||||||
|
let logger = Logger::root(slog_term::FullFormat::new(plain).build().fuse(), o!());
|
||||||
|
|
||||||
|
let test_cases = [
|
||||||
|
("dev", "/dev", "devtmpfs"),
|
||||||
|
("udev", "/dev", "devtmpfs"),
|
||||||
|
("proc", "/proc", "proc"),
|
||||||
|
("sysfs", "/sys", "sysfs"),
|
||||||
|
];
|
||||||
|
|
||||||
|
for &(source, destination, fs_type) in &test_cases {
|
||||||
|
let source = Path::new(source);
|
||||||
|
let destination = Path::new(destination);
|
||||||
|
let flags = MsFlags::MS_RDONLY;
|
||||||
|
let options = "mode=755";
|
||||||
|
println!(
|
||||||
|
"testing if already mounted baremount({:?} {:?} {:?})",
|
||||||
|
source, destination, fs_type
|
||||||
|
);
|
||||||
|
assert!(baremount(source, destination, fs_type, flags, options, &logger).is_ok());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_mount() {
|
fn test_mount() {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
Loading…
Reference in New Issue
Block a user