remove system archive feature
Just compress the initrd with zstd. Remove rsmount dependency, mtab is easy enough to parse.
This commit is contained in:
@ -62,24 +62,6 @@ pub async fn run() {
|
||||
log::set_max_level(log::LevelFilter::Debug);
|
||||
}
|
||||
|
||||
// extract system archive
|
||||
retry_or_ignore(async || {
|
||||
if fs::try_exists("system.azstd").await? {
|
||||
info!("unpacking system.azstd");
|
||||
let zarch = fs::read("system.azstd").await?;
|
||||
let arch = zstd::Decoder::new(zarch.as_slice())?;
|
||||
extract_cpio(arch).await
|
||||
} else if fs::try_exists("system.alz4").await? {
|
||||
info!("unpacking system.alz4");
|
||||
let zarch = fs::read("system.alz4").await?;
|
||||
let arch = lz4::Decoder::new(zarch.as_slice())?;
|
||||
extract_cpio(arch).await
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
})
|
||||
.await;
|
||||
|
||||
// load config
|
||||
let cfg: Config = retry(async || {
|
||||
let cfg = (fs::read("config.yaml").await)
|
||||
@ -190,72 +172,6 @@ async fn chmod(path: impl AsRef<Path>, mode: u32) -> std::io::Result<()> {
|
||||
fs::set_permissions(path, perms).await
|
||||
}
|
||||
|
||||
async fn extract_cpio(mut arch: impl std::io::Read) -> Result<()> {
|
||||
loop {
|
||||
let rd = cpio::NewcReader::new(&mut arch)?;
|
||||
let entry = rd.entry();
|
||||
if entry.is_trailer() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let path = entry.name().to_string();
|
||||
|
||||
if let Err(e) = extract_cpio_entry(rd, &path).await {
|
||||
return Err(format_err!("failed to extract {path}: {e}"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn extract_cpio_entry<R: std::io::Read>(
|
||||
rd: cpio::NewcReader<R>,
|
||||
path: impl AsRef<Path>,
|
||||
) -> Result<()> {
|
||||
use std::os::unix::fs::chown;
|
||||
use unix_mode::Type;
|
||||
|
||||
let entry = rd.entry();
|
||||
let path = path.as_ref();
|
||||
|
||||
if let Some(parent) = path.parent() {
|
||||
fs::create_dir_all(parent).await?;
|
||||
}
|
||||
|
||||
let _ = fs::remove_file(path).await;
|
||||
|
||||
let mode = entry.mode();
|
||||
let uid = entry.uid();
|
||||
let gid = entry.gid();
|
||||
|
||||
match Type::from(mode) {
|
||||
Type::Dir => {
|
||||
fs::create_dir_all(path).await?;
|
||||
}
|
||||
Type::File => {
|
||||
let mut data = vec![];
|
||||
rd.to_writer(&mut data)?;
|
||||
|
||||
fs::write(path, data).await?;
|
||||
}
|
||||
Type::Symlink => {
|
||||
let mut data = vec![];
|
||||
rd.to_writer(&mut data)?;
|
||||
let target = &Path::new(std::str::from_utf8(&data)?);
|
||||
|
||||
tokio::fs::symlink(target, path).await?;
|
||||
return Ok(());
|
||||
}
|
||||
_ => {
|
||||
warn!("{path:?}: unknown file type: {:?}", Type::from(mode));
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
chmod(path, mode).await?;
|
||||
chown(path, Some(uid), Some(gid))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn mount(src: Option<&str>, dst: &str, fstype: &str, opts: Option<&str>) {
|
||||
if let Err(e) = fs::create_dir_all(dst).await {
|
||||
error!("failed to create dir {dst}: {e}");
|
||||
|
@ -180,8 +180,8 @@ async fn mount_system(cfg: &dkl::Config, bs_dir: &str, verifier: &Verifier) {
|
||||
for layer in &cfg.layers {
|
||||
let src = retry(async || {
|
||||
if layer == "modules" {
|
||||
(fs::read("/modules.sqfs").await)
|
||||
.map_err(|e| format_err!("read /modules.sqfs failed: {e}"))
|
||||
let src = "/modules.sqfs";
|
||||
(fs::read(src).await).map_err(|e| format_err!("read {src} failed: {e}"))
|
||||
} else {
|
||||
verifier.verify_path(&format!("{bs_dir}/{layer}.fs")).await
|
||||
}
|
||||
|
Reference in New Issue
Block a user