runtime-rs: Add erofs rootfs handling logic in handler_rootfs

Add handling for multi-layer EROFS rootfs in RootFsResource
handler_rootfs method. It will correctly handle the multi-layers
erofs rootfs.

Signed-off-by: Alex Lyn <alex.lyn@antgroup.com>
This commit is contained in:
Alex Lyn
2026-03-31 17:22:32 +08:00
committed by Fabiano Fidêncio
parent 620849fb34
commit e01963471c

View File

@@ -11,6 +11,7 @@ use anyhow::{anyhow, Context, Result};
use async_trait::async_trait;
use kata_types::mount::Mount;
mod block_rootfs;
mod erofs_rootfs;
pub mod virtual_volume;
use hypervisor::{device::device_manager::DeviceManager, Hypervisor};
@@ -19,8 +20,11 @@ use virtual_volume::{is_kata_virtual_volume, VirtualVolume};
use std::{collections::HashMap, sync::Arc, vec::Vec};
use tokio::sync::RwLock;
use self::{block_rootfs::is_block_rootfs, nydus_rootfs::NYDUS_ROOTFS_TYPE};
use crate::share_fs::ShareFs;
use self::{
block_rootfs::is_block_rootfs, erofs_rootfs::ErofsMultiLayerRootfs,
nydus_rootfs::NYDUS_ROOTFS_TYPE,
};
use crate::{rootfs::erofs_rootfs::is_erofs_multi_layer, share_fs::ShareFs};
use oci_spec::runtime as oci;
const ROOTFS: &str = "rootfs";
@@ -90,9 +94,26 @@ impl RootFsResource {
Err(anyhow!("share fs is unavailable"))
}
}
mounts_vec if is_single_layer_rootfs(mounts_vec) => {
_ if is_erofs_multi_layer(rootfs_mounts) => {
info!(
sl!(),
"handling multi-layer erofs rootfs with {} mounts",
rootfs_mounts.len()
);
let multi_layer =
ErofsMultiLayerRootfs::new(device_manager, sid, cid, rootfs_mounts, share_fs)
.await
.context("new multi-layer erofs rootfs")?;
let ret = Arc::new(multi_layer);
let mut inner = self.inner.write().await;
inner.rootfs.push(ret.clone());
Ok(ret)
}
_ if is_single_layer_rootfs(rootfs_mounts) => {
// Safe as single_layer_rootfs must have one layer
let layer = &mounts_vec[0];
let layer = &rootfs_mounts[0];
let mut inner = self.inner.write().await;
if is_guest_pull_volume(share_fs, layer) {