mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-01 21:13:09 +00:00
Feature/new registry (#2612)
* wip * overhaul boot process * wip: new registry * wip * wip * wip * wip * wip * wip * os registry complete * ui fixes * fixes * fixes * more fixes * fix merkle archive
This commit is contained in:
@@ -11,17 +11,21 @@ use crate::disk::mount::guard::{GenericMountGuard, MountGuard, TmpMountGuard};
|
||||
use crate::prelude::*;
|
||||
use crate::util::io::TmpDir;
|
||||
|
||||
struct OverlayFs<P0: AsRef<Path>, P1: AsRef<Path>> {
|
||||
pub struct OverlayFs<P0: AsRef<Path>, P1: AsRef<Path>, P2: AsRef<Path>> {
|
||||
lower: P0,
|
||||
upper: P1,
|
||||
work: P2,
|
||||
}
|
||||
impl<P0: AsRef<Path>, P1: AsRef<Path>> OverlayFs<P0, P1> {
|
||||
pub fn new(lower: P0, upper: P1) -> Self {
|
||||
Self { lower, upper }
|
||||
impl<P0: AsRef<Path>, P1: AsRef<Path>, P2: AsRef<Path>> OverlayFs<P0, P1, P2> {
|
||||
pub fn new(lower: P0, upper: P1, work: P2) -> Self {
|
||||
Self { lower, upper, work }
|
||||
}
|
||||
}
|
||||
impl<P0: AsRef<Path> + Send + Sync, P1: AsRef<Path> + Send + Sync> FileSystem
|
||||
for OverlayFs<P0, P1>
|
||||
impl<
|
||||
P0: AsRef<Path> + Send + Sync,
|
||||
P1: AsRef<Path> + Send + Sync,
|
||||
P2: AsRef<Path> + Send + Sync,
|
||||
> FileSystem for OverlayFs<P0, P1, P2>
|
||||
{
|
||||
fn mount_type(&self) -> Option<impl AsRef<str>> {
|
||||
Some("overlay")
|
||||
@@ -33,24 +37,20 @@ impl<P0: AsRef<Path> + Send + Sync, P1: AsRef<Path> + Send + Sync> FileSystem
|
||||
[
|
||||
Box::new(lazy_format!("lowerdir={}", self.lower.as_ref().display()))
|
||||
as Box<dyn Display>,
|
||||
Box::new(lazy_format!(
|
||||
"upperdir={}/upper",
|
||||
self.upper.as_ref().display()
|
||||
)),
|
||||
Box::new(lazy_format!(
|
||||
"workdir={}/work",
|
||||
self.upper.as_ref().display()
|
||||
)),
|
||||
Box::new(lazy_format!("upperdir={}", self.upper.as_ref().display())),
|
||||
Box::new(lazy_format!("workdir={}", self.work.as_ref().display())),
|
||||
]
|
||||
}
|
||||
async fn pre_mount(&self) -> Result<(), Error> {
|
||||
tokio::fs::create_dir_all(self.upper.as_ref().join("upper")).await?;
|
||||
tokio::fs::create_dir_all(self.upper.as_ref().join("work")).await?;
|
||||
tokio::fs::create_dir_all(self.upper.as_ref()).await?;
|
||||
tokio::fs::create_dir_all(self.work.as_ref()).await?;
|
||||
Ok(())
|
||||
}
|
||||
async fn source_hash(
|
||||
&self,
|
||||
) -> Result<GenericArray<u8, <Sha256 as OutputSizeUser>::OutputSize>, Error> {
|
||||
tokio::fs::create_dir_all(self.upper.as_ref()).await?;
|
||||
tokio::fs::create_dir_all(self.work.as_ref()).await?;
|
||||
let mut sha = Sha256::new();
|
||||
sha.update("OverlayFs");
|
||||
sha.update(
|
||||
@@ -77,6 +77,18 @@ impl<P0: AsRef<Path> + Send + Sync, P1: AsRef<Path> + Send + Sync> FileSystem
|
||||
.as_os_str()
|
||||
.as_bytes(),
|
||||
);
|
||||
sha.update(
|
||||
tokio::fs::canonicalize(self.work.as_ref())
|
||||
.await
|
||||
.with_ctx(|_| {
|
||||
(
|
||||
crate::ErrorKind::Filesystem,
|
||||
self.upper.as_ref().display().to_string(),
|
||||
)
|
||||
})?
|
||||
.as_os_str()
|
||||
.as_bytes(),
|
||||
);
|
||||
Ok(sha.finalize())
|
||||
}
|
||||
}
|
||||
@@ -95,7 +107,11 @@ impl OverlayGuard {
|
||||
let lower = TmpMountGuard::mount(base, ReadOnly).await?;
|
||||
let upper = TmpDir::new().await?;
|
||||
let inner_guard = MountGuard::mount(
|
||||
&OverlayFs::new(lower.path(), upper.as_ref()),
|
||||
&OverlayFs::new(
|
||||
lower.path(),
|
||||
upper.as_ref().join("upper"),
|
||||
upper.as_ref().join("work"),
|
||||
),
|
||||
mountpoint,
|
||||
ReadWrite,
|
||||
)
|
||||
|
||||
@@ -2,7 +2,6 @@ use std::collections::BTreeMap;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::sync::{Arc, Weak};
|
||||
|
||||
use bytes::Buf;
|
||||
use lazy_static::lazy_static;
|
||||
use models::ResultExt;
|
||||
use tokio::sync::Mutex;
|
||||
@@ -13,7 +12,7 @@ use super::util::unmount;
|
||||
use crate::util::{Invoke, Never};
|
||||
use crate::Error;
|
||||
|
||||
pub const TMP_MOUNTPOINT: &'static str = "/media/embassy/tmp";
|
||||
pub const TMP_MOUNTPOINT: &'static str = "/media/startos/tmp";
|
||||
|
||||
#[async_trait::async_trait]
|
||||
pub trait GenericMountGuard: std::fmt::Debug + Send + Sync + 'static {
|
||||
|
||||
Reference in New Issue
Block a user