7 Commits
6 changed files with 163 additions and 99 deletions
Generated
+43 -78
View File
@@ -2,15 +2,6 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 4 version = 4
[[package]]
name = "aho-corasick"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "allocator-api2" name = "allocator-api2"
version = "0.2.21" version = "0.2.21"
@@ -81,9 +72,9 @@ dependencies = [
[[package]] [[package]]
name = "darling" name = "darling"
version = "0.23.0" version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" checksum = "88490bf1b990d87eaaa7ac8aa887f629a08e7359765b4911faf63c3763347d23"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"darling_macro", "darling_macro",
@@ -91,26 +82,26 @@ dependencies = [
[[package]] [[package]]
name = "darling_core" name = "darling_core"
version = "0.23.0" version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" checksum = "084e274f91c482280130e1e34e0b8d6e66776a060d7b6de7b84289ca778868c4"
dependencies = [ dependencies = [
"ident_case", "ident_case",
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.119", "syn 3.0.3",
] ]
[[package]] [[package]]
name = "darling_macro" name = "darling_macro"
version = "0.23.0" version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" checksum = "68f5792fa0d41cd2325ce0ffa64f0a340eaebd4971a3a0c5e1ffd2cc488a355e"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.119", "syn 3.0.3",
] ]
[[package]] [[package]]
@@ -131,12 +122,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "fast-srgb8"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1"
[[package]] [[package]]
name = "foldhash" name = "foldhash"
version = "0.2.0" version = "0.2.0"
@@ -188,15 +173,15 @@ dependencies = [
[[package]] [[package]]
name = "instability" name = "instability"
version = "0.3.12" version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" checksum = "2bf84e73fa6f27f299dec58e13223cf70db80da872eb921d4f6138342a0eabc8"
dependencies = [ dependencies = [
"darling", "darling",
"indoc", "indoc",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.119", "syn 3.0.3",
] ]
[[package]] [[package]]
@@ -239,28 +224,22 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]] [[package]]
name = "line-clipping" name = "line-clipping"
version = "0.3.7" version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e"
dependencies = [ dependencies = [
"bitflags", "bitflags",
] ]
[[package]] [[package]]
name = "lru" name = "lru"
version = "0.18.1" version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6" checksum = "5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a"
dependencies = [ dependencies = [
"hashbrown 0.17.1", "hashbrown 0.17.1",
] ]
[[package]]
name = "memchr"
version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.31.3" version = "0.31.3"
@@ -305,32 +284,32 @@ checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f"
[[package]] [[package]]
name = "nyanit" name = "nyanit"
version = "0.2.0" version = "0.2.1"
dependencies = [ dependencies = [
"nix", "nix",
"ratatui", "ratatui",
"ratatui-textarea", "ratatui-textarea",
"regex", "regex-lite",
"termion", "termion",
] ]
[[package]] [[package]]
name = "palette" name = "palette"
version = "0.7.6" version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64"
dependencies = [ dependencies = [
"approx", "approx",
"fast-srgb8",
"libm", "libm",
"palette_derive", "palette_derive",
"palette_math",
] ]
[[package]] [[package]]
name = "palette_derive" name = "palette_derive"
version = "0.7.6" version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be"
dependencies = [ dependencies = [
"by_address", "by_address",
"proc-macro2", "proc-macro2",
@@ -339,10 +318,19 @@ dependencies = [
] ]
[[package]] [[package]]
name = "portable-atomic" name = "palette_math"
version = "1.14.0" version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12"
dependencies = [
"libm",
]
[[package]]
name = "portable-atomic"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
[[package]] [[package]]
name = "powerfmt" name = "powerfmt"
@@ -447,33 +435,10 @@ dependencies = [
] ]
[[package]] [[package]]
name = "regex" name = "regex-lite"
version = "1.13.1" version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
[[package]] [[package]]
name = "rustversion" name = "rustversion"
@@ -584,18 +549,18 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.19" version = "2.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.19" version = "2.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -604,9 +569,9 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.54" version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134"
dependencies = [ dependencies = [
"deranged", "deranged",
"libc", "libc",
+3 -3
View File
@@ -1,13 +1,13 @@
[package] [package]
name = "nyanit" name = "nyanit"
version = "0.2.0" version = "0.2.1"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
nix = { version = "0.31", features = ["mount"] } nix = { version = "0.31", features = ["mount"] }
ratatui = { version = "0.30", default-features = false, features = ["termion"] } ratatui = { version = "0.30", default-features = false, features = ["termion"] }
ratatui-textarea = { version = "0.9", default-features = false, features = ["termion"] } ratatui-textarea = { version = "0.9", default-features = false, features = ["termion"] }
regex = "1.1" regex-lite = "0.1"
termion = "4" termion = "4"
[profile.release] [profile.release]
@@ -15,5 +15,5 @@ lto = true
debug = false debug = false
incremental = false incremental = false
codegen-units = 1 codegen-units = 1
opt-level = 2 opt-level = "s"
strip = true strip = true
+13 -4
View File
@@ -8,14 +8,23 @@ And this partition should be formated to bcachefs.
2. Nyanit checks if bcachefs is encrypted, and asks for unlock password if it is. 2. Nyanit checks if bcachefs is encrypted, and asks for unlock password if it is.
3. Then it mounts it to **/mnt/bee-root**. 3. Then it mounts it to **/mnt/real-bee**.
4. And looks for snapshots with name pattern **/mnt/bee-root/bzz_snaps/bzz-yyyy-mm-ddTHH-MM-SS** 4. Now dealing with snapshoots. Its getting complicated because we need to have then outside root subvolume
Root subvolume should be named **bee-root**
Snapshoots made by hive-up should be placed in **bee-root/bzz-snaps** - **/mnt/real-bee/bee-root/bzz-snaps**
We need to transver snapshoot if any from **/mnt/real-bee/bee-root/bzz-snaps** to **/mnt/real-bee/bzz-snaps**
Snapshoots names should match **bzz-yyyy-mm-ddTHH-MM-SS** pattern.
5. If no snapshots are found it calls **switch_root** for **/mnt/bee-root** 4. And looks for snapshots with name pattern **/mnt/real-bee/bzz-snaps/bzz-yyyy-mm-ddTHH-MM-SS**
5. If no snapshots are found it calls **switch_root** for **/mnt/real-bee/bee-root**
6. Othervise vait for F2 for few seconds. 6. Othervise vait for F2 for few seconds.
And if F2 pressed provides list of snapshoots to boot from. And if F2 pressed provides list of snapshoots to boot from.
7. After some snapshoot or just **/mnt/bee-root** is selected, Nyanit doing **switch_root** to it. 7. After some snapshoot or just **/mnt/bee-root/real-bee** is selected, Nyanit doing **switch_root** to it.
8. TO-DO
- add cleaning of old snapshoots.
- add replacing bee-root with snapshoot
+50
View File
@@ -0,0 +1,50 @@
#!/bin/sh
echo "work dir: $1"
_tools_list=(
/usr/bin/bcachefs
/usr/bin/fsck
/usr/bin/fsck.vfat
/usr/bin/switch_root
/usr/bin/blkid
)
workdir=$1
echo "Populate initdramfs tree..."
cd $workdir
mkdir -p initramfs/{dev,proc,sys,run,mnt,mnt/bee_root,tmp,etc,usr,usr/bin,usr/lib}
echo "Create /bin /lib /lib64 simlinks"
cd $workdir/initramfs
ln -s usr/lib lib64
ln -s usr/lib lib
ln -s usr/bin bin
cd $workdir/initramfs/usr
ln -s lib lib64
echo "Install NYANIT..."
cd $workdir
lddtree --bindir / --copy-to-tree $workdir/initramfs init
echo "Copy libs and binaries"
cd $workdir
lddtree --copy-to-tree $workdir/initramfs "${_tools_list[@]}"
echo "Remove setuid flag from everything..."
chmod -R a-s $workdir/initramfs
fakeroot -- sh << EOF
echo "Create console device node"
cd $workdir/initramfs
mknod -m 622 dev/console c 5 1
# Create cpio archive
echo "Create cpio archive"
cd $workdir/initramfs
find . | cpio -ov --format=newc > ../initramfs.cpio
EOF
echo "Done!"
+9 -4
View File
@@ -40,8 +40,10 @@ const BEE_CAT: &str = include_str!("bee_cat.txt");
//const ROOT_PARTLABEL: &str = "bee-root"; //const ROOT_PARTLABEL: &str = "bee-root";
const ROOT_PARTLABEL: &str = "bee-root"; const ROOT_PARTLABEL: &str = "bee-root";
const TMP_ROOT: &str = "/mnt/bee_root"; const TMP_REAL_ROOT: &str = "/mnt/real-bee";
const TMP_ROOT_SNAPS: &str = "/mnt/bee_root/bzz_snaps"; const TMP_REAL_ROOT_SNAPS: &str = "/mnt/real-bee/bzz-snaps";
const TMP_ROOT: &str = "/mnt/real-bee/bee-root";
const TMP_ROOT_SNAPS: &str = "/mnt/real-bee/bee-root/bzz-snaps";
const SYS_INIT: &str = "/sbin/init"; const SYS_INIT: &str = "/sbin/init";
// fn bee_root_is_present() -> bool { // fn bee_root_is_present() -> bool {
@@ -76,10 +78,13 @@ enum NyanitState {
/// Mounting bee-root and chiking if there any snapshots /// Mounting bee-root and chiking if there any snapshots
fn mount_and_check_snaps(bee_root_dev: &str) -> Result<NyanitState, ExecCommandError> { fn mount_and_check_snaps(bee_root_dev: &str) -> Result<NyanitState, ExecCommandError> {
// mount bee-root // mount bee-root
nyan_system::mount_bee_root(TMP_ROOT, bee_root_dev)?; nyan_system::mount_bee_root(bee_root_dev, TMP_REAL_ROOT)?;
// let root_list = nyan_system::list_dir(TMP_ROOT)?;
// return Err(ExecCommandError::Other(root_list));
// list snaps if any // list snaps if any
let mut snaps_list = nyan_system::list_bzzpss_snaps(TMP_ROOT_SNAPS)?; let mut snaps_list = nyan_system::list_bzzpss_snaps(TMP_REAL_ROOT_SNAPS)?;
// if any snaps detected whait for user to press F2 // if any snaps detected whait for user to press F2
if snaps_list.len() > 0 { if snaps_list.len() > 0 {
snaps_list.insert(0, TMP_ROOT.to_string()); snaps_list.insert(0, TMP_ROOT.to_string());
+45 -10
View File
@@ -85,6 +85,12 @@ impl From<String> for ExecCommandError {
} }
} }
impl From<&str> for ExecCommandError {
fn from(err: &str) -> Self {
ExecCommandError::Other(err.to_string())
}
}
impl std::fmt::Display for ExecCommandError { impl std::fmt::Display for ExecCommandError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self { match self {
@@ -245,7 +251,7 @@ pub fn bzzpss_dev_encrypted(dev_name: &str) -> Result<bool, ExecCommandError> {
//const TMP_ROOT: &str = "/mnt/bee-root"; //const TMP_ROOT: &str = "/mnt/bee-root";
pub fn list_bzzpss_snaps(snaps_dir: &str) -> Result<Vec<String>, ExecCommandError> { pub fn list_bzzpss_snaps(snaps_dir: &str) -> Result<Vec<String>, ExecCommandError> {
use regex::Regex; use regex_lite::Regex;
use std::path::Path; use std::path::Path;
// root snapshoot in a form of bzz-yyyy-mm-ddTHH-MM-SS // root snapshoot in a form of bzz-yyyy-mm-ddTHH-MM-SS
@@ -294,14 +300,14 @@ fn wait_for_block_devices(timeout_secs: u64) -> bool {
false false
} }
// mounting process // mounting process
//# Mount essential virtual filesystems //# Mount essential virtual filesystems
// mount -t proc none /proc // mount -t proc none /proc
// mount -t sysfs none /sys // mount -t sysfs none /sys
// modprobe bcachefs // modprobe bcachefs
pub fn prepare_env() -> Result<(), String> { pub fn prepare_env() -> Result<(), ExecCommandError> {
use nix::mount::{MsFlags, mount}; use nix::mount::{MsFlags, mount};
use std::path::Path; use std::path::Path;
// Mount proc filesystem // Mount proc filesystem
@@ -313,7 +319,7 @@ pub fn prepare_env() -> Result<(), String> {
Path::new("/proc"), Path::new("/proc"),
Some("proc"), Some("proc"),
proc_mount_flags, proc_mount_flags,
Some("mode=0555"), None::<&str>,
) )
.map_err(|ex| format!("Error mounting /proc: {}", ex.to_string()))?; .map_err(|ex| format!("Error mounting /proc: {}", ex.to_string()))?;
@@ -325,13 +331,13 @@ pub fn prepare_env() -> Result<(), String> {
Path::new("/sys"), Path::new("/sys"),
Some("sysfs"), Some("sysfs"),
sys_mount_flags, sys_mount_flags,
Some("mode=0555"), None::<&str>,
) )
.map_err(|ex| format!("Error mounting /sys: {}", ex.to_string()))?; .map_err(|ex| format!("Error mounting /sys: {}", ex.to_string()))?;
//waiting for block devs population //waiting for block devs population
if wait_for_block_devices(WAIT_FOR_BLK_DEVS) == false { if wait_for_block_devices(WAIT_FOR_BLK_DEVS) == false {
return Err("Waiting for block devices to get populated timed out.".to_string()); return Err("Waiting for block devices to get populated timed out.".into());
} }
let dev_mount_flags = MsFlags::MS_NOSUID | MsFlags::MS_RELATIME; let dev_mount_flags = MsFlags::MS_NOSUID | MsFlags::MS_RELATIME;
@@ -344,8 +350,24 @@ pub fn prepare_env() -> Result<(), String> {
) )
.map_err(|ex| format!("Error mounting /dev: {}", ex.to_string()))?; .map_err(|ex| format!("Error mounting /dev: {}", ex.to_string()))?;
//mount -t tmpfs -o nosuid,nodev,noexec,mode=0755 none /run
let run_mount_flags = MsFlags::MS_NOSUID | MsFlags::MS_NODEV | MsFlags::MS_NOEXEC | MsFlags::MS_RELATIME;
mount(
Some("run"),
"/run",
Some("tmpfs"),
run_mount_flags,
Some("mode=0755"),
)
.map_err(|ex| format!("Error mounting /run: {}", ex.to_string()))?;
// modprobe bcachefs // modprobe bcachefs
// exec_command("modprobe", &vec!["bcachefs"])?; // exec_command("modprobe", &vec!["bcachefs"])?;
// Creating dir for udev so this little shit wont hang
// fs::create_dir("/run/udev")?;
Ok(()) Ok(())
} }
@@ -378,18 +400,31 @@ pub fn prepare_env() -> Result<(), String> {
// } // }
// # Mount the real root filesystem // # Mount the real root filesystem
pub fn mount_bee_root(mount_point: &str, dev_name: &str) -> Result<(), ExecCommandError> { pub fn mount_bee_root(dev_name: &str, mount_point: &str) -> Result<(), ExecCommandError> {
exec_command("/usr/bin/mount", &vec!["-o", "ro", dev_name, mount_point])?; use nix::mount::{MsFlags, mount};
use std::path::Path;
let root_mount_flags = MsFlags::MS_RDONLY | MsFlags::MS_RELATIME;
mount(
Some(dev_name),
Path::new(mount_point),
Some("bcachefs"),
root_mount_flags,
None::<&str>,
)
.map_err(|ex| format!("Error mounting root {} to {} :\n{}",dev_name, mount_point, ex.to_string()))?;
// exec_command("/usr/bin/mount", &vec!["-o", "ro", dev_name, mount_point])?;
Ok(()) Ok(())
} }
// finish boot // finish boot
pub fn hand_off_control(mnt_root: &str, init_path: &str) -> Result<(), ExecCommandError> { pub fn hand_off_control(mnt_root: &str, init_path: &str) -> Result<(), ExecCommandError> {
use std::env; //use std::env;
use std::os::unix::process::CommandExt; use std::os::unix::process::CommandExt;
// 2. Change directory to the new root (Mandatory for switch_root) // 2. Change directory to the new root (Mandatory for switch_root)
env::set_current_dir(mnt_root)?; // Actually this may be a problem!
// env::set_current_dir(mnt_root)?;
// # Clean up virtual filesystems // # Clean up virtual filesystems
// !!! do not do this, switch_root handle this stuff and fail if thay not present! // !!! do not do this, switch_root handle this stuff and fail if thay not present!