System Extension注册完成 + FSKit Driver待办事项
已完成: ✅ App ID(6770506571) ✅ Bundle ID(com.momentry.markbase.fskit) ✅ Developer ID Application证书导入 ✅ .app Bundle创建(build/MarkBaseFSKit.app) ✅ entitlements.plist配置 限制: - binary未实现FSKit driver(占位符) - 无法通过systemextensionsctl install安装 - 需要完整FSKit接口实现 策略: - 短期:WebDAV(500 MB/s) - 长期:FSKit Driver完整实现(650 MB/s) 文档: - SYSTEM_EXTENSION_MANUAL_INSTALL.md - FSKIT_DRIVER_TODO.md(未来待办)
This commit is contained in:
134
src/raid/controller.rs
Normal file
134
src/raid/controller.rs
Normal file
@@ -0,0 +1,134 @@
|
||||
use std::path::PathBuf;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use super::{RaidLevel, MemberStatus, RaidAlgorithm, RaidError};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct RaidMember {
|
||||
pub device_id: String,
|
||||
pub device_path: PathBuf,
|
||||
pub size: u64,
|
||||
pub status: MemberStatus,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct RaidArray {
|
||||
pub raid_level: RaidLevel,
|
||||
pub members: Vec<RaidMember>,
|
||||
pub stripe_size: u64,
|
||||
pub total_size: u64,
|
||||
}
|
||||
|
||||
pub struct RaidController {
|
||||
arrays: Mutex<Vec<Arc<RaidArray>>>,
|
||||
}
|
||||
|
||||
impl RaidController {
|
||||
pub fn new() -> Self {
|
||||
RaidController {
|
||||
arrays: Mutex::new(Vec::new()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_array(
|
||||
&self,
|
||||
level: RaidLevel,
|
||||
member_paths: Vec<PathBuf>,
|
||||
stripe_size: u64,
|
||||
) -> Result<String, RaidError> {
|
||||
let members: Vec<RaidMember> = member_paths
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, path)| {
|
||||
let size = if path.exists() {
|
||||
std::fs::metadata(path).unwrap().len()
|
||||
} else {
|
||||
0
|
||||
};
|
||||
RaidMember {
|
||||
device_id: format!("member_{}", i),
|
||||
device_path: path.clone(),
|
||||
size,
|
||||
status: MemberStatus::Online,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let total_size = calculate_total_size(level, &members, stripe_size);
|
||||
|
||||
let array = RaidArray {
|
||||
raid_level: level,
|
||||
members,
|
||||
stripe_size,
|
||||
total_size,
|
||||
};
|
||||
|
||||
let array_id = format!("raid_{}", chrono::Utc::now().timestamp());
|
||||
let mut arrays = self.arrays.lock().unwrap();
|
||||
arrays.push(Arc::new(array));
|
||||
|
||||
Ok(array_id)
|
||||
}
|
||||
|
||||
pub fn get_array(&self, _array_id: &str) -> Option<Arc<RaidArray>> {
|
||||
let arrays = self.arrays.lock().unwrap();
|
||||
arrays.iter().find(|_a| true).cloned()
|
||||
}
|
||||
|
||||
pub fn read(&self, array_id: &str, offset: u64, size: u64) -> Result<Vec<u8>, RaidError> {
|
||||
let array = self.get_array(array_id)
|
||||
.ok_or("RAID array not found")?;
|
||||
|
||||
match array.raid_level {
|
||||
RaidLevel::RAID0 => {
|
||||
let mut raid0 = super::level_0::Raid0::new(array.clone());
|
||||
raid0.read(offset, size)
|
||||
},
|
||||
RaidLevel::RAID1 => {
|
||||
let mut raid1 = super::level_1::Raid1::new(array.clone());
|
||||
raid1.read(offset, size)
|
||||
},
|
||||
RaidLevel::RAID5 => {
|
||||
let mut raid5 = super::level_5::Raid5::new(array.clone())?;
|
||||
raid5.read(offset, size)
|
||||
},
|
||||
_ => Err("RAID level not implemented yet".into()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write(&self, array_id: &str, offset: u64, data: &[u8]) -> Result<(), RaidError> {
|
||||
let array = self.get_array(array_id)
|
||||
.ok_or("RAID array not found")?;
|
||||
|
||||
match array.raid_level {
|
||||
RaidLevel::RAID0 => {
|
||||
let mut raid0 = super::level_0::Raid0::new(array.clone());
|
||||
raid0.write(offset, data)
|
||||
},
|
||||
RaidLevel::RAID1 => {
|
||||
let mut raid1 = super::level_1::Raid1::new(array.clone());
|
||||
raid1.write(offset, data)
|
||||
},
|
||||
RaidLevel::RAID5 => {
|
||||
let mut raid5 = super::level_5::Raid5::new(array.clone())?;
|
||||
raid5.write(offset, data)
|
||||
},
|
||||
_ => Err("RAID level not implemented yet".into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn calculate_total_size(level: RaidLevel, members: &[RaidMember], _stripe_size: u64) -> u64 {
|
||||
match level {
|
||||
RaidLevel::RAID0 => {
|
||||
members.iter().map(|m| m.size).sum()
|
||||
},
|
||||
RaidLevel::RAID1 => {
|
||||
members.iter().map(|m| m.size).min().unwrap_or(0)
|
||||
},
|
||||
RaidLevel::RAID5 => {
|
||||
let min_size = members.iter().map(|m| m.size).min().unwrap_or(0);
|
||||
min_size * (members.len() - 1) as u64
|
||||
},
|
||||
_ => 0,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user