1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::{commands::wget, Arch, PROJECT_DIR};
use os_xtask_utils::{dir, CommandExt, Qemu, Tar};
use std::{fs, path::Path};
impl super::LinuxRootfs {
pub fn image(&self) {
self.make(false);
let inner = PROJECT_DIR.join("zCore");
let image = inner.join(format!("{arch}.img", arch = self.0.name()));
if let Arch::Aarch64 = self.0 {
const URL:&str = "https://github.com/Luchangcheng2333/rayboot/releases/download/2.0.0/aarch64_firmware.tar.gz";
let aarch64_tar = self.0.origin().join("Aarch64_firmware.zip");
wget(URL, &aarch64_tar);
let fw_dir = self.0.target().join("firmware");
dir::clear(&fw_dir).unwrap();
Tar::xf(&aarch64_tar, Some(&fw_dir)).invoke();
let boot_dir = inner.join("disk").join("EFI").join("Boot");
dir::clear(&boot_dir).unwrap();
fs::copy(
fw_dir.join("aarch64_uefi.efi"),
boot_dir.join("bootaa64.efi"),
)
.unwrap();
fs::copy(fw_dir.join("Boot.json"), boot_dir.join("Boot.json")).unwrap();
}
fuse(self.path(), &image);
Qemu::img()
.arg("resize")
.args(&["-f", "raw"])
.arg(image)
.arg("+5M")
.invoke();
}
}
fn fuse(dir: impl AsRef<Path>, image: impl AsRef<Path>) {
use rcore_fs::vfs::FileSystem;
use rcore_fs_fuse::zip::zip_dir;
use rcore_fs_sfs::SimpleFileSystem;
use std::sync::{Arc, Mutex};
let file = fs::OpenOptions::new()
.read(true)
.write(true)
.create(true)
.truncate(true)
.open(image)
.expect("failed to open image");
const MAX_SPACE: usize = 1024 * 1024 * 1024;
let fs = SimpleFileSystem::create(Arc::new(Mutex::new(file)), MAX_SPACE)
.expect("failed to create sfs");
zip_dir(dir.as_ref(), fs.root_inode()).expect("failed to zip fs");
}