mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 02:11:53 +00:00
btrfs
This commit is contained in:
committed by
Aiden McClelland
parent
9fa5d1ff9e
commit
f8404ab043
31
backend/src/disk/fsck/btrfs.rs
Normal file
31
backend/src/disk/fsck/btrfs.rs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use tokio::process::Command;
|
||||||
|
use tracing::instrument;
|
||||||
|
|
||||||
|
use crate::disk::fsck::RequiresReboot;
|
||||||
|
use crate::util::Invoke;
|
||||||
|
use crate::Error;
|
||||||
|
|
||||||
|
#[instrument(skip_all)]
|
||||||
|
pub async fn btrfs_check_readonly(logicalname: impl AsRef<Path>) -> Result<RequiresReboot, Error> {
|
||||||
|
Command::new("btrfs")
|
||||||
|
.arg("check")
|
||||||
|
.arg("--readonly")
|
||||||
|
.arg(logicalname.as_ref())
|
||||||
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(RequiresReboot(false))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn btrfs_check_repair(logicalname: impl AsRef<Path>) -> Result<RequiresReboot, Error> {
|
||||||
|
Command::new("btrfs")
|
||||||
|
.arg("check")
|
||||||
|
.arg("--repair")
|
||||||
|
.arg(logicalname.as_ref())
|
||||||
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
Ok(RequiresReboot(false))
|
||||||
|
}
|
||||||
@@ -7,34 +7,9 @@ use futures::FutureExt;
|
|||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
|
use crate::disk::fsck::RequiresReboot;
|
||||||
use crate::Error;
|
use crate::Error;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
#[must_use]
|
|
||||||
pub struct RequiresReboot(pub bool);
|
|
||||||
impl std::ops::BitOrAssign for RequiresReboot {
|
|
||||||
fn bitor_assign(&mut self, rhs: Self) {
|
|
||||||
self.0 |= rhs.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub enum RepairStrategy {
|
|
||||||
Preen,
|
|
||||||
Aggressive,
|
|
||||||
}
|
|
||||||
impl RepairStrategy {
|
|
||||||
pub async fn e2fsck(
|
|
||||||
&self,
|
|
||||||
logicalname: impl AsRef<Path> + std::fmt::Debug,
|
|
||||||
) -> Result<RequiresReboot, Error> {
|
|
||||||
match self {
|
|
||||||
RepairStrategy::Preen => e2fsck_preen(logicalname).await,
|
|
||||||
RepairStrategy::Aggressive => e2fsck_aggressive(logicalname).await,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
pub async fn e2fsck_preen(
|
pub async fn e2fsck_preen(
|
||||||
logicalname: impl AsRef<Path> + std::fmt::Debug,
|
logicalname: impl AsRef<Path> + std::fmt::Debug,
|
||||||
68
backend/src/disk/fsck/mod.rs
Normal file
68
backend/src/disk/fsck/mod.rs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use color_eyre::eyre::eyre;
|
||||||
|
use tokio::process::Command;
|
||||||
|
|
||||||
|
use crate::disk::fsck::btrfs::{btrfs_check_readonly, btrfs_check_repair};
|
||||||
|
use crate::disk::fsck::ext4::{e2fsck_aggressive, e2fsck_preen};
|
||||||
|
use crate::util::Invoke;
|
||||||
|
use crate::Error;
|
||||||
|
|
||||||
|
pub mod btrfs;
|
||||||
|
pub mod ext4;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
#[must_use]
|
||||||
|
pub struct RequiresReboot(pub bool);
|
||||||
|
impl std::ops::BitOrAssign for RequiresReboot {
|
||||||
|
fn bitor_assign(&mut self, rhs: Self) {
|
||||||
|
self.0 |= rhs.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub enum RepairStrategy {
|
||||||
|
Preen,
|
||||||
|
Aggressive,
|
||||||
|
}
|
||||||
|
impl RepairStrategy {
|
||||||
|
pub async fn fsck(
|
||||||
|
&self,
|
||||||
|
logicalname: impl AsRef<Path> + std::fmt::Debug,
|
||||||
|
) -> Result<RequiresReboot, Error> {
|
||||||
|
match &*String::from_utf8(
|
||||||
|
Command::new("grub-probe")
|
||||||
|
.arg("-d")
|
||||||
|
.arg(logicalname.as_ref())
|
||||||
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
|
.await?,
|
||||||
|
)? {
|
||||||
|
"ext2" => self.e2fsck(logicalname).await,
|
||||||
|
"btrfs" => self.btrfs_check(logicalname).await,
|
||||||
|
fs => {
|
||||||
|
return Err(Error::new(
|
||||||
|
eyre!("Unknown filesystem {fs}"),
|
||||||
|
crate::ErrorKind::DiskManagement,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub async fn e2fsck(
|
||||||
|
&self,
|
||||||
|
logicalname: impl AsRef<Path> + std::fmt::Debug,
|
||||||
|
) -> Result<RequiresReboot, Error> {
|
||||||
|
match self {
|
||||||
|
RepairStrategy::Preen => e2fsck_preen(logicalname).await,
|
||||||
|
RepairStrategy::Aggressive => e2fsck_aggressive(logicalname).await,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub async fn btrfs_check(
|
||||||
|
&self,
|
||||||
|
logicalname: impl AsRef<Path> + std::fmt::Debug,
|
||||||
|
) -> Result<RequiresReboot, Error> {
|
||||||
|
match self {
|
||||||
|
RepairStrategy::Preen => btrfs_check_readonly(logicalname).await,
|
||||||
|
RepairStrategy::Aggressive => btrfs_check_repair(logicalname).await,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -124,7 +124,7 @@ pub async fn create_fs<P: AsRef<Path>>(
|
|||||||
.arg(format!("{}_{}", guid, name))
|
.arg(format!("{}_{}", guid, name))
|
||||||
.invoke(crate::ErrorKind::DiskManagement)
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
.await?;
|
.await?;
|
||||||
Command::new("mkfs.ext4")
|
Command::new("mkfs.btrfs")
|
||||||
.arg(Path::new("/dev/mapper").join(format!("{}_{}", guid, name)))
|
.arg(Path::new("/dev/mapper").join(format!("{}_{}", guid, name)))
|
||||||
.invoke(crate::ErrorKind::DiskManagement)
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
@@ -175,12 +175,15 @@ pub async fn execute(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Command::new("mkfs.ext4")
|
Command::new("mkfs.btrfs")
|
||||||
.arg(&part_info.root)
|
.arg(&part_info.root)
|
||||||
.invoke(crate::ErrorKind::DiskManagement)
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
.await?;
|
.await?;
|
||||||
Command::new("e2label")
|
Command::new("btrfs")
|
||||||
|
.arg("property")
|
||||||
|
.arg("set")
|
||||||
.arg(&part_info.root)
|
.arg(&part_info.root)
|
||||||
|
.arg("label")
|
||||||
.arg("rootfs")
|
.arg("rootfs")
|
||||||
.invoke(crate::ErrorKind::DiskManagement)
|
.invoke(crate::ErrorKind::DiskManagement)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ avahi-utils
|
|||||||
bash-completion
|
bash-completion
|
||||||
beep
|
beep
|
||||||
bmon
|
bmon
|
||||||
|
btrfs-progs
|
||||||
ca-certificates
|
ca-certificates
|
||||||
cifs-utils
|
cifs-utils
|
||||||
containerd.io
|
containerd.io
|
||||||
@@ -43,5 +44,6 @@ systemd-resolved
|
|||||||
systemd-sysv
|
systemd-sysv
|
||||||
systemd-timesyncd
|
systemd-timesyncd
|
||||||
tor
|
tor
|
||||||
|
util-linux
|
||||||
vim
|
vim
|
||||||
wireless-tools
|
wireless-tools
|
||||||
|
|||||||
Reference in New Issue
Block a user