diff --git a/Cargo.lock b/Cargo.lock index c88efb6..f29bbea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,7 +28,7 @@ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "bos-settings" -version = "0.4.1" +version = "0.4.0" dependencies = [ "async-channel", "bread-theme", diff --git a/bos-settings/Cargo.toml b/bos-settings/Cargo.toml index f024a43..c6e37ac 100644 --- a/bos-settings/Cargo.toml +++ b/bos-settings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bos-settings" -version = "0.4.1" +version = "0.4.0" edition = "2021" [dependencies] diff --git a/bos-settings/src/config/mod.rs b/bos-settings/src/config/mod.rs index 4cc3266..4b56f1c 100644 --- a/bos-settings/src/config/mod.rs +++ b/bos-settings/src/config/mod.rs @@ -12,31 +12,13 @@ use std::path::{Path, PathBuf}; use toml_edit::{value, Array, DocumentMut, Item, Table, Value}; -/// Load a TOML file into an editable document. A missing file yields an -/// empty document so the UI still renders with defaults — normal for a fresh -/// install. A file that *exists* but fails to parse is far more dangerous: -/// falling back to an empty document there means the next Save (see -/// `save_doc`) overwrites it with only the UI-modelled keys, silently -/// destroying anything else in the file (breadpad's calendar credentials, -/// breadcrumbs' saved network passwords, ...). Back up the unparseable file -/// once before falling back, so a bad edit is always recoverable. +/// Load a TOML file into an editable document. A missing or unparseable file +/// yields an empty document so the UI still renders (with defaults). pub fn load_doc(path: &Path) -> DocumentMut { - let Ok(text) = std::fs::read_to_string(path) else { - return DocumentMut::default(); - }; - match text.parse::() { - Ok(doc) => doc, - Err(e) => { - let backup = PathBuf::from(format!("{}.bak", path.display())); - eprintln!( - "bos-settings: {} failed to parse ({e}); backed up to {} before falling back to defaults", - path.display(), - backup.display() - ); - let _ = std::fs::write(&backup, &text); - DocumentMut::default() - } - } + std::fs::read_to_string(path) + .ok() + .and_then(|s| s.parse::().ok()) + .unwrap_or_default() } /// Write the document back to disk, creating parent dirs as needed. diff --git a/bos-settings/src/ui/sidebar.rs b/bos-settings/src/ui/sidebar.rs index d4185f2..4395591 100644 --- a/bos-settings/src/ui/sidebar.rs +++ b/bos-settings/src/ui/sidebar.rs @@ -12,7 +12,6 @@ pub const APPS_ITEMS: &[SidebarItem] = &[ SidebarItem { id: "breadbox", label: "breadbox" }, SidebarItem { id: "breadcrumbs", label: "breadcrumbs" }, SidebarItem { id: "breadpad", label: "breadpad" }, - SidebarItem { id: "breadsearch", label: "breadsearch" }, ]; pub const SYSTEM_ITEMS: &[SidebarItem] = &[ diff --git a/bos-settings/src/ui/views/breadbox.rs b/bos-settings/src/ui/views/breadbox.rs index e4356e2..e34a31b 100644 --- a/bos-settings/src/ui/views/breadbox.rs +++ b/bos-settings/src/ui/views/breadbox.rs @@ -1,9 +1,7 @@ //! breadbox config.toml — launcher contexts. -//! Schema mirrors breadbox-shared (`#[serde(rename = "context")]` — the TOML -//! key is `[[context]]`, singular, despite the Rust field being `contexts`), -//! with `name` + `priority`, an ordered list of app/category hints. The -//! context array is rewritten on save; any other top-level keys/comments in -//! the file are preserved. +//! Schema mirrors breadbox-shared (`[[contexts]]` with `name` + `priority`, an +//! ordered list of app/category hints). The contexts array is rewritten on +//! save; any other top-level keys/comments in the file are preserved. use std::cell::RefCell; use std::rc::Rc; @@ -27,7 +25,7 @@ fn config_path() -> std::path::PathBuf { } fn read_contexts(doc: &DocumentMut) -> Vec { - let Some(aot) = doc.get("context").and_then(Item::as_array_of_tables) else { + let Some(aot) = doc.get("contexts").and_then(Item::as_array_of_tables) else { return Vec::new(); }; aot.iter() @@ -55,7 +53,7 @@ fn write_contexts(doc: &mut DocumentMut, ctxs: &[Context]) { t.insert("priority", value(arr)); aot.push(t); } - doc.as_table_mut().insert("context", Item::ArrayOfTables(aot)); + doc.as_table_mut().insert("contexts", Item::ArrayOfTables(aot)); } fn rebuild_list(list: &ListBox, model: &Rc>>) { diff --git a/bos-settings/src/ui/views/breadsearch.rs b/bos-settings/src/ui/views/breadsearch.rs deleted file mode 100644 index e12a09d..0000000 --- a/bos-settings/src/ui/views/breadsearch.rs +++ /dev/null @@ -1,105 +0,0 @@ -//! breadsearch/config.toml — semantic search indexer (breadmill) + GUI. -//! Schema mirrors breadsearch-shared::Config ([index], [search], [model], [power]). - -use std::cell::RefCell; -use std::rc::Rc; - -use gtk4::prelude::*; -use gtk4::Box as GBox; - -use crate::config; -use crate::ui::widgets as w; - -fn config_path() -> std::path::PathBuf { - config::config_dir().join("breadsearch/config.toml") -} - -pub fn build() -> GBox { - let path = config_path(); - let doc = Rc::new(RefCell::new(config::load_doc(&path))); - - let (outer, c) = w::view_scaffold("breadsearch"); - - c.append(&w::section("Power")); - c.append(&w::hint( - "breadmill's embedding step is CPU/NPU/GPU-heavy. Turn it off entirely, \ - or just pause it on battery — it resumes automatically on AC power.", - )); - c.append(&w::switch_row("Enabled", &doc, &["power", "enabled"], true)); - c.append(&w::switch_row( - "Index while on battery", - &doc, - &["power", "run_on_battery"], - false, - )); - - c.append(&w::section("Model")); - c.append(&w::dropdown_row( - "Compute backend", - &doc, - &["model", "backend"], - &["cpu", "npu", "rocm"], - "cpu", - )); - c.append(&w::hint( - "npu needs breadmill built with --features npu (AMD Ryzen AI SDK); \ - rocm needs --features rocm. Falls back to cpu if not compiled in.", - )); - - c.append(&w::section("Index")); - c.append(&w::csv_row( - "Roots", - &doc, - &["index", "roots"], - "~/Documents, ~/Projects", - )); - c.append(&w::csv_row( - "Excludes", - &doc, - &["index", "excludes"], - "~/Projects/some-noisy-repo", - )); - c.append(&w::csv_row( - "Extensions", - &doc, - &["index", "extensions"], - "md, txt, org, pdf, odt, docx", - )); - c.append(&w::spin_f64_row( - "Max file size (MB)", - &doc, - &["index", "max_file_mb"], - 0.1, - 500.0, - 0.5, - 1, - 10.0, - )); - - c.append(&w::section("Search")); - c.append(&w::spin_row( - "Result limit", - &doc, - &["search", "limit"], - 1.0, - 100.0, - 1.0, - 10, - )); - c.append(&w::spin_row( - "Snippet length", - &doc, - &["search", "snippet_len"], - 20.0, - 2000.0, - 20.0, - 200, - )); - - c.append(&w::hint( - "Changes take effect after: systemctl --user restart breadmill", - )); - - outer.append(&w::save_button(&doc, path)); - outer -} diff --git a/bos-settings/src/ui/views/hyprland.rs b/bos-settings/src/ui/views/hyprland.rs index b651b25..fba4537 100644 --- a/bos-settings/src/ui/views/hyprland.rs +++ b/bos-settings/src/ui/views/hyprland.rs @@ -26,17 +26,6 @@ fn hypr_path(name: &str) -> std::path::PathBuf { crate::config::config_dir().join("hypr").join(name) } -/// Open `path` in $EDITOR (nano if unset) inside a terminal window. Spawning -/// an editor directly (no terminal) is a silent no-op for any TUI editor — -/// there's nothing for it to attach to — so it always needs a terminal -/// wrapper. Uses kitty, which is what BOS actually ships (not foot). -fn open_in_terminal(path: &std::path::Path) { - let editor = std::env::var("EDITOR").unwrap_or_else(|_| "nano".to_string()); - if let Ok(mut child) = Command::new("kitty").args(["-e", &editor]).arg(path).spawn() { - std::thread::spawn(move || { let _ = child.wait(); }); - } -} - pub fn build() -> GBox { let vbox = GBox::new(Orientation::Vertical, 12); vbox.add_css_class("view-content"); @@ -66,28 +55,31 @@ pub fn build() -> GBox { } } - // BOS's Hyprland config is Lua-native (hyprland.lua), not the classic - // hyprland.conf/keybinds.conf pair — those names only ever matched a - // stale, unshipped dotfiles/ directory, so this button opened (or - // silently created) the wrong file entirely. - let open_btn = Button::with_label("Open hyprland.lua in editor"); + let open_btn = Button::with_label("Open hyprland.conf in editor"); open_btn.set_margin_top(16); open_btn.set_halign(gtk4::Align::Start); { - let conf_path = hypr_path("hyprland.lua"); - open_btn.connect_clicked(move |_| open_in_terminal(&conf_path)); + let conf_path = hypr_path("hyprland.conf"); + open_btn.connect_clicked(move |_| { + let editor = std::env::var("EDITOR").unwrap_or_else(|_| "foot".to_string()); + if let Ok(mut child) = Command::new(&editor).arg(&conf_path).spawn() { + std::thread::spawn(move || { let _ = child.wait(); }); + } + }); } vbox.append(&open_btn); - // Keybinds are defined inline in hyprland.lua (no separate file); point - // this at the shipped cheat sheet instead of a keybinds.conf that has - // never existed on BOS. - let keybinds_btn = Button::with_label("View keybinds cheat sheet"); + let keybinds_btn = Button::with_label("Open keybinds.conf in editor"); keybinds_btn.set_margin_top(8); keybinds_btn.set_halign(gtk4::Align::Start); { - let kb_path = std::path::PathBuf::from("/usr/share/bos/keybinds.txt"); - keybinds_btn.connect_clicked(move |_| open_in_terminal(&kb_path)); + let kb_path = hypr_path("keybinds.conf"); + keybinds_btn.connect_clicked(move |_| { + let editor = std::env::var("EDITOR").unwrap_or_else(|_| "foot".to_string()); + if let Ok(mut child) = Command::new(&editor).arg(&kb_path).spawn() { + std::thread::spawn(move || { let _ = child.wait(); }); + } + }); } vbox.append(&keybinds_btn); diff --git a/bos-settings/src/ui/views/mod.rs b/bos-settings/src/ui/views/mod.rs index d29a324..67763f0 100644 --- a/bos-settings/src/ui/views/mod.rs +++ b/bos-settings/src/ui/views/mod.rs @@ -3,7 +3,6 @@ pub mod breadbar; pub mod breadbox; pub mod breadcrumbs; pub mod breadpad; -pub mod breadsearch; pub mod hyprland; pub mod packages; pub mod snapshots; diff --git a/bos-settings/src/ui/views/packages.rs b/bos-settings/src/ui/views/packages.rs index 79d01d0..feee584 100644 --- a/bos-settings/src/ui/views/packages.rs +++ b/bos-settings/src/ui/views/packages.rs @@ -15,20 +15,11 @@ fn read_installed() -> HashMap { let Ok(text) = std::fs::read_to_string(&path) else { return HashMap::new(); }; - let Ok(mut parsed) = serde_json::from_str::(&text) else { - return HashMap::new(); - }; - // installed.json is {"packages": {name: {version, binaries, services}}}, - // not a flat map of package name to metadata — without unwrapping this, - // every install shows a single bogus row named "packages". - let Some(packages) = parsed.get_mut("packages").map(std::mem::take) else { - return HashMap::new(); - }; - let Ok(packages) = serde_json::from_value::>(packages) else { + let Ok(parsed) = serde_json::from_str::>(&text) else { return HashMap::new(); }; - packages + parsed .into_iter() .filter_map(|(name, val)| { let version = val diff --git a/bos-settings/src/ui/window.rs b/bos-settings/src/ui/window.rs index cc395cd..c07a231 100644 --- a/bos-settings/src/ui/window.rs +++ b/bos-settings/src/ui/window.rs @@ -32,7 +32,6 @@ pub fn build_ui(app: &Application) { stack.add_named(&views::breadbox::build(), Some("breadbox")); stack.add_named(&views::breadcrumbs::build(), Some("breadcrumbs")); stack.add_named(&views::breadpad::build(), Some("breadpad")); - stack.add_named(&views::breadsearch::build(), Some("breadsearch")); stack.add_named(&views::hyprland::build(), Some("hyprland")); // Default to snapshots view diff --git a/build-local.sh b/build-local.sh index 942476a..28b9e4d 100755 --- a/build-local.sh +++ b/build-local.sh @@ -49,7 +49,7 @@ grep airootfs_image_tool_options "$STAGE/profiledef.sh" # created from skel (the live user and the installed user) then gets the same # versions `bakery list` reports here, fully offline. Copied at build time so the # binaries never bloat the git repo and always track the current bakery state. -BREAD_BINS=(bakery bread breadd breadman breadbar breadbox breadbox-sync breadcrumbs breadpad breadpaper bread-theme breadmon breadsearch breadmill breadclip breadclipd breadshot) +BREAD_BINS=(bakery bread breadd breadman breadbar breadbox breadbox-sync breadcrumbs breadpad breadpaper bread-theme) LAPTOP_HOME="${LAPTOP_HOME:-$(getent passwd "${SUDO_USER:-$USER}" | cut -d: -f6)}" BAKERY_BIN="$LAPTOP_HOME/.local/bin" BAKERY_STATE="$LAPTOP_HOME/.local/state/bakery" @@ -69,50 +69,6 @@ install -m 0644 "$BAKERY_STATE/installed.json" "$SKEL/.local/state/bakery/instal install -m 0644 "$BAKERY_CACHE/index.json" "$SKEL/.cache/bakery/index.json" echo "baked: $(ls "$SKEL/.local/bin")" -# --- Bake systemd user services for bakery-managed bread packages ----------- -# Historically only breadd.service was hand-committed to skel; every other -# bakery package's service (breadbox-sync, breadmill, breadclipd, ...) was -# silently left out, so those daemons never start on a fresh install/live -# boot until the user re-runs `bakery install` (which needs network). -# Generalize from the same source of truth as the binary bake above: read -# the services this laptop's bakery actually installed, copy each unit file -# into skel with ExecStart rewritten from this laptop's literal home path to -# the portable `%h` specifier, and recreate whichever *.target.wants enable -# symlink bakery created locally. Units already committed by hand (breadd.service -# carries a RuntimeDirectoryPreserve=yes fix not yet upstreamed — see bread-release-build -# notes) are left alone rather than overwritten. -echo "=== baking bakery service units into skel ===" -SYSTEMD_USER_DIR="$LAPTOP_HOME/.config/systemd/user" -SKEL_SYSTEMD="$SKEL/.config/systemd/user" -mapfile -t SERVICE_UNITS < <(python3 -c " -import json -with open('$BAKERY_STATE/installed.json') as f: - d = json.load(f) -for pkg in d.get('packages', d).values(): - for s in pkg.get('services', []): - print(s) -") -for unit in "${SERVICE_UNITS[@]}"; do - if [[ -f "$SKEL_SYSTEMD/$unit" ]]; then - echo " $unit already committed in skel, leaving as-is" - continue - fi - src="$SYSTEMD_USER_DIR/$unit" - if [[ ! -f "$src" ]]; then - echo " warning: $unit not found at $src, skipping" - continue - fi - install -d -m 0755 "$SKEL_SYSTEMD" - sed "s#ExecStart=$LAPTOP_HOME/.local/bin/#ExecStart=%h/.local/bin/#" "$src" > "$SKEL_SYSTEMD/$unit" - for wants_dir in "$SYSTEMD_USER_DIR"/*.target.wants; do - [[ -L "$wants_dir/$unit" ]] || continue - target_name="$(basename "$wants_dir")" - install -d -m 0755 "$SKEL_SYSTEMD/$target_name" - ln -sf "../$unit" "$SKEL_SYSTEMD/$target_name/$unit" - done - echo " baked $unit" -done - # mkarchiso resets every airootfs file to 0644, so executables must be declared # in profiledef.sh's file_permissions array or they ship non-executable and the # exec-once launches fail with "permission denied". Inject a 0755 entry for each diff --git a/iso/airootfs/etc/calamares/modules/partition.conf b/iso/airootfs/etc/calamares/modules/partition.conf index 13e6e1e..a33f199 100644 --- a/iso/airootfs/etc/calamares/modules/partition.conf +++ b/iso/airootfs/etc/calamares/modules/partition.conf @@ -5,14 +5,22 @@ efiSystemPartitionName: "EFI" defaultFileSystemType: "btrfs" -# NOTE: there is no `btrfsSubvolumes:` key in this Calamares version's -# partition module schema (confirmed against /usr/share/calamares/modules/ -# partition.conf and on real hardware — zero mentions of "subvolume" -# anywhere in the stock reference config). A previous version of this file -# had one; Calamares silently ignored it. Calamares' partition module only -# natively creates @ (root) and @home (home) when btrfs + separate /home is -# selected — nothing else. @snapshots/@log/@cache are created by hand in -# post-install.sh instead, after unpackfs has populated the filesystem. +btrfsSubvolumes: + - mountPoint: / + subvolume: "@" + mountOptions: "noatime,compress=zstd,space_cache=v2" + - mountPoint: /home + subvolume: "@home" + mountOptions: "noatime,compress=zstd,space_cache=v2" + - mountPoint: /.snapshots + subvolume: "@snapshots" + mountOptions: "noatime,compress=zstd,space_cache=v2" + - mountPoint: /var/log + subvolume: "@log" + mountOptions: "noatime,compress=zstd,space_cache=v2" + - mountPoint: /var/cache + subvolume: "@cache" + mountOptions: "noatime,compress=zstd,space_cache=v2" userSwapChoices: - none diff --git a/iso/airootfs/etc/calamares/modules/shellprocess-resolve-source.conf b/iso/airootfs/etc/calamares/modules/shellprocess-resolve-source.conf deleted file mode 100644 index 6f0f6f7..0000000 --- a/iso/airootfs/etc/calamares/modules/shellprocess-resolve-source.conf +++ /dev/null @@ -1,8 +0,0 @@ ---- -# Runs before unpackfs so it can hand it a source path that survives -# copytoram unmounting /run/archiso/bootmnt. See bos-resolve-airootfs. -dontChroot: true -timeout: 30 - -script: - - "/usr/bin/bash /usr/local/bin/bos-resolve-airootfs" diff --git a/iso/airootfs/etc/calamares/modules/unpackfs.conf b/iso/airootfs/etc/calamares/modules/unpackfs.conf index f23db91..7d9589e 100644 --- a/iso/airootfs/etc/calamares/modules/unpackfs.conf +++ b/iso/airootfs/etc/calamares/modules/unpackfs.conf @@ -1,11 +1,7 @@ --- # Unpack the live squashfs onto the target partition. -# The source is a symlink written by shellprocess@resolve-source (see -# bos-resolve-airootfs) rather than a path under /run/archiso/bootmnt directly -# — that mount gets torn down by archiso's own copytoram handling, which -# self-enables on most real hardware, so a hardcoded bootmnt path would point -# at nothing on exactly the machines this install is meant to run on. +# "arch" matches profiledef.sh install_dir; adjust if that changes. unpack: - - source: "/run/archiso/resolved-airootfs.sfs" + - source: "/run/archiso/bootmnt/arch/x86_64/airootfs.sfs" sourcefs: "squashfs" destination: "" diff --git a/iso/airootfs/etc/calamares/modules/users.conf b/iso/airootfs/etc/calamares/modules/users.conf index 887fe2c..566fff2 100644 --- a/iso/airootfs/etc/calamares/modules/users.conf +++ b/iso/airootfs/etc/calamares/modules/users.conf @@ -38,11 +38,4 @@ passwordRequirements: - minlen=6 allowWeakPasswords: false - -# `userShell` (top-level) is not a real key in this Calamares version's users -# module schema (3.4.2) — it's silently ignored, and an installed user gets -# whatever the module's own default is (bash), confirmed on real hardware. -# The actual key is nested: user.shell. See /usr/share/calamares/modules/users.conf -# for the documented schema. -user: - shell: /usr/bin/zsh +userShell: /bin/zsh diff --git a/iso/airootfs/etc/calamares/post-install.sh b/iso/airootfs/etc/calamares/post-install.sh index b7309db..ebfb24a 100644 --- a/iso/airootfs/etc/calamares/post-install.sh +++ b/iso/airootfs/etc/calamares/post-install.sh @@ -79,137 +79,31 @@ fi mkinitcpio -P || echo "WARN: mkinitcpio -P failed" # --------------------------------------------------------------------------- -# Install GRUB. /boot now has the kernel + initramfs, and the mount module has -# bind-mounted /proc /sys /dev /run (+ efivars on UEFI) into this chroot, so +# Install GRUB (UEFI). /boot now has the kernel + initramfs, and the mount +# module has bind-mounted /proc /sys /dev /run + efivars into this chroot, so # both grub-install passes and grub-mkconfig succeed. -# -# BOS ships a syslinux BIOS boot mode on the ISO (profiledef.sh bootmodes -# includes bios.syslinux), but this only ever ran the UEFI grub-install path — -# a BIOS install would complete successfully and then have no bootloader at -# all. Branch on /sys/firmware/efi (present only when booted UEFI) and install -# the matching GRUB target; on BIOS, grub-install needs the whole disk, not a -# partition, so it's derived from the mounted root via lsblk. -# UEFI: 1. NVRAM entry (EFI/BOS/grubx64.efi + a firmware boot entry) -# 2. --removable copy to EFI/BOOT/BOOTX64.EFI, so firmware that -# ignores/loses the NVRAM entry still finds a bootloader. -# BIOS: MBR install onto the disk hosting /. +# 1. NVRAM entry (EFI/BOS/grubx64.efi + a firmware boot entry) +# 2. --removable copy to EFI/BOOT/BOOTX64.EFI, so firmware that ignores/loses +# the NVRAM entry (the "no boot device / PXE fallback" failure) still finds +# a bootloader. # --------------------------------------------------------------------------- if command -v grub-install &>/dev/null; then - if [[ -d /sys/firmware/efi ]]; then - grub-install --target=x86_64-efi --efi-directory=/boot/efi \ - --bootloader-id=BOS --recheck \ - || echo "WARN: grub-install (nvram) failed" - grub-install --target=x86_64-efi --efi-directory=/boot/efi \ - --removable --recheck \ - || echo "WARN: grub-install (removable) failed" - else - ROOT_DEV="$(findmnt -no SOURCE / | sed 's/\[.*\]//')" - ROOT_DISK="$(lsblk -no pkname "$ROOT_DEV" 2>/dev/null)" - if [[ -n "$ROOT_DISK" ]]; then - grub-install --target=i386-pc --recheck "/dev/$ROOT_DISK" \ - || echo "WARN: grub-install (BIOS) failed" - else - echo "WARN: could not determine the disk hosting / (root device: ${ROOT_DEV:-unknown}) — BIOS grub-install skipped" - fi - fi + grub-install --target=x86_64-efi --efi-directory=/boot/efi \ + --bootloader-id=BOS --recheck \ + || echo "WARN: grub-install (nvram) failed" + grub-install --target=x86_64-efi --efi-directory=/boot/efi \ + --removable --recheck \ + || echo "WARN: grub-install (removable) failed" fi if command -v grub-mkconfig &>/dev/null; then grub-mkconfig -o /boot/grub/grub.cfg || echo "WARN: grub-mkconfig failed" fi -# --------------------------------------------------------------------------- -# Create @snapshots, @log, @cache as top-level btrfs subvolumes (peers of @, -# not nested under it — so snapshots of @ don't recursively include -# themselves, and log/cache churn doesn't bloat @'s snapshot history). -# -# iso/partition.conf's `btrfsSubvolumes:` key does NOT do this — verified on -# real hardware that it's not a recognized key in this Calamares version's -# partition module schema at all (same class of bug as the `userShell` fix -# below: Calamares silently ignores unknown top-level keys). Calamares' own -# btrfs support only natively creates @ and @home; everything else has to be -# done by hand, here, after unpackfs has populated / but before anything -# reads/writes /var/log or /var/cache going forward. Existing content in -# those two dirs (real files already unpacked from the squashfs) is migrated -# into the new subvolumes before mounting over them, so nothing is lost — -# just shadowed by the mount, same as any other mountpoint. -# --------------------------------------------------------------------------- -if command -v btrfs &>/dev/null; then - ROOT_DEV="$(findmnt -no SOURCE / | sed 's/\[.*\]//')" - ROOT_UUID="$(blkid -s UUID -o value "$ROOT_DEV" 2>/dev/null)" - BTRFS_TOP=/.btrfs-top-tmp - - if [[ -z "$ROOT_UUID" ]]; then - echo "WARN: could not determine root filesystem UUID — skipping @snapshots/@log/@cache creation" - else - mkdir -p "$BTRFS_TOP" - if mount -o subvolid=5 "$ROOT_DEV" "$BTRFS_TOP"; then - for sv in @snapshots @log @cache; do - if ! btrfs subvolume show "$BTRFS_TOP/$sv" &>/dev/null; then - btrfs subvolume create "$BTRFS_TOP/$sv" || echo "WARN: creating $sv failed" - fi - done - rsync -aAX /var/log/ "$BTRFS_TOP/@log/" || echo "WARN: migrating /var/log into @log failed" - rsync -aAX /var/cache/ "$BTRFS_TOP/@cache/" || echo "WARN: migrating /var/cache into @cache failed" - umount "$BTRFS_TOP" - rmdir "$BTRFS_TOP" - - OPTS="noatime,compress=zstd,space_cache=v2" - grep -q "@snapshots" /etc/fstab || echo "UUID=$ROOT_UUID /.snapshots btrfs subvol=/@snapshots,$OPTS 0 0" >> /etc/fstab - grep -q "@log" /etc/fstab || echo "UUID=$ROOT_UUID /var/log btrfs subvol=/@log,$OPTS 0 0" >> /etc/fstab - grep -q "@cache" /etc/fstab || echo "UUID=$ROOT_UUID /var/cache btrfs subvol=/@cache,$OPTS 0 0" >> /etc/fstab - - mkdir -p /.snapshots - mount /.snapshots || echo "WARN: mounting /.snapshots failed" - mount /var/log || echo "WARN: mounting /var/log failed" - mount /var/cache || echo "WARN: mounting /var/cache failed" - else - echo "WARN: could not mount btrfs top-level — skipping @snapshots/@log/@cache creation" - fi - fi -fi - # --------------------------------------------------------------------------- # Snapper root config (root is btrfs). -# -# @snapshots is now mounted at /.snapshots (created above) — a dedicated -# top-level subvolume, a peer of @ rather than nested under it, so snapshots -# aren't themselves recursively snapshotted. `snapper create-config` insists -# on creating that subvolume itself and refuses whenever /.snapshots already -# exists, mounted or not — silently, so without this dance every downstream -# sed below is a no-op and BOS ships with its advertised auto-snapshot/ -# rollback feature entirely non-functional. -# Unmount the real subvolume, let snapper create + own its nested one, then -# discard that and remount the real @snapshots in its place (fstab entry was -# added above, right after the subvolume was created). -# -# Confirmed on real hardware: a plain `umount /.snapshots` here can -# transiently fail inside the Calamares chroot (the same mount unmounts -# cleanly moments later once booted normally — a chroot-specific busy-mount -# race, not a logic error), which cascades into snapper create-config -# refusing because .snapshots "already exists". Retry a few times, then -# fall back to a lazy unmount (detaches the mountpoint immediately even if -# something still transiently references it) rather than give up. # --------------------------------------------------------------------------- if command -v snapper &>/dev/null; then - unmounted=0 - for _ in 1 2 3 4 5; do - if umount /.snapshots 2>/dev/null; then - unmounted=1 - break - fi - sleep 1 - done - if [[ "$unmounted" != "1" ]]; then - echo "WARN: umount /.snapshots failed after retries, forcing lazy unmount" - umount -l /.snapshots || echo "WARN: lazy umount /.snapshots also failed" - fi - rmdir /.snapshots || echo "WARN: rmdir /.snapshots failed" snapper -c root create-config / || echo "WARN: snapper create-config failed" - if [[ -d /.snapshots ]]; then - btrfs subvolume delete /.snapshots || echo "WARN: deleting snapper's own .snapshots subvolume failed" - fi - mkdir -p /.snapshots - mount /.snapshots || echo "WARN: remounting the real @snapshots subvolume failed" if [[ -f /etc/snapper/configs/root ]]; then sed -i 's/TIMELINE_CREATE="yes"/TIMELINE_CREATE="no"/' /etc/snapper/configs/root sed -i 's/NUMBER_CLEANUP="no"/NUMBER_CLEANUP="yes"/' /etc/snapper/configs/root diff --git a/iso/airootfs/etc/calamares/settings.conf b/iso/airootfs/etc/calamares/settings.conf index 8846a56..f97ae87 100644 --- a/iso/airootfs/etc/calamares/settings.conf +++ b/iso/airootfs/etc/calamares/settings.conf @@ -3,16 +3,10 @@ modules-search: [/etc/calamares/modules, /usr/lib/calamares/modules] # Second shellprocess instance: copies the live kernel into the target /boot # (archiso keeps it out of the squashfs) before the bootloader step runs. -# Third: resolves the live squashfs's real location before unpackfs runs — -# copytoram unmounts /run/archiso/bootmnt, so a hardcoded path there can point -# at nothing depending on how the medium was booted. instances: - id: kernel module: shellprocess config: shellprocess-kernel.conf -- id: resolve-source - module: shellprocess - config: shellprocess-resolve-source.conf sequence: - show: @@ -25,7 +19,6 @@ sequence: - exec: - partition - mount - - shellprocess@resolve-source - unpackfs - machineid - fstab diff --git a/iso/airootfs/etc/mkinitcpio.conf.d/archiso.conf b/iso/airootfs/etc/mkinitcpio.conf.d/archiso.conf index e53d079..5c008e5 100644 --- a/iso/airootfs/etc/mkinitcpio.conf.d/archiso.conf +++ b/iso/airootfs/etc/mkinitcpio.conf.d/archiso.conf @@ -1,3 +1,3 @@ -HOOKS=(base udev plymouth microcode modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard) +HOOKS=(base udev microcode modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard) COMPRESSION="xz" COMPRESSION_OPTIONS=(-9e) diff --git a/iso/airootfs/etc/os-release b/iso/airootfs/etc/os-release deleted file mode 100644 index e8cffa1..0000000 --- a/iso/airootfs/etc/os-release +++ /dev/null @@ -1,12 +0,0 @@ -NAME="BOS" -PRETTY_NAME="Bread OS" -ID=bos -ID_LIKE=arch -BUILD_ID=rolling -ANSI_COLOR="38;2;23;147;209" -HOME_URL="https://breadway.dev" -DOCUMENTATION_URL="https://wiki.archlinux.org/" -SUPPORT_URL="https://bbs.archlinux.org/" -BUG_REPORT_URL="https://git.breadway.dev/Breadway/bos/issues" -PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/" -LOGO=archlinux-logo diff --git a/iso/airootfs/etc/plymouth/plymouthd.conf b/iso/airootfs/etc/plymouth/plymouthd.conf deleted file mode 100644 index dc44279..0000000 --- a/iso/airootfs/etc/plymouth/plymouthd.conf +++ /dev/null @@ -1,2 +0,0 @@ -[Daemon] -Theme=bos diff --git a/iso/airootfs/etc/skel/.config/breadbox/config.toml b/iso/airootfs/etc/skel/.config/breadbox/config.toml index 0b47001..797b3cc 100644 --- a/iso/airootfs/etc/skel/.config/breadbox/config.toml +++ b/iso/airootfs/etc/skel/.config/breadbox/config.toml @@ -1,3 +1,3 @@ [[context]] name = "default" -priority = ["Zen Browser", "kitty", "Files"] +apps = ["firefox", "foot", "nautilus", "code"] diff --git a/iso/airootfs/etc/skel/.config/fastfetch/bread.txt b/iso/airootfs/etc/skel/.config/fastfetch/bread.txt deleted file mode 100644 index a339adb..0000000 --- a/iso/airootfs/etc/skel/.config/fastfetch/bread.txt +++ /dev/null @@ -1,20 +0,0 @@ -               -      ....',,;;;;,,'....       -   ..'cdkKXWMMMWNNNNNWMMMNKOdc'..     -  ..;xNW0xoc;,'...........',:oxKWNOc..   - .'XWx;..........................,dWN,.  - .xMo..............................cMk.  - .;WK'............................'OM:.  -   'oW0.....d:...................0Md'    -   .kM:...lNMKc................,MO.    -  .dMc.....lXMXl..............:Mk.   -  .xMc.......kMMX'............;Mk.   -  .kM:.....:KMNo..............,M0.   -  .KM,...cXMXl....lllllllll....MX.   - ..NM....,kc......0000OOOOO'...MW..  -  ..MW..........................NM..   -  ..MX..........................KM,.   -  .'MX..........................XM;.   -   .XMKOkxxddddoooooodddddxxkkO0MN.    -      ,:ccclllllooolllllccc::;.      -                         diff --git a/iso/airootfs/etc/skel/.config/fastfetch/config.jsonc b/iso/airootfs/etc/skel/.config/fastfetch/config.jsonc deleted file mode 100644 index d5b8edb..0000000 --- a/iso/airootfs/etc/skel/.config/fastfetch/config.jsonc +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", - "logo": { - "type": "file", - "source": "~/.config/fastfetch/bread.txt", - "width": 30, - "padding": { - "right": 5 - } - }, - "display": { - "separator": " ", - "color": { - "keys": "cyan", - "title": "bright_blue" - } - }, - "modules": [ - "title", - "separator", - "os", - "host", - "kernel", - "uptime", - "packages", - "shell", - "display", - "wm", - "terminal", - "cpu", - "gpu", - "memory", - "swap", - "disk", - "battery", - "colors" - ] -} diff --git a/iso/airootfs/etc/skel/.config/hypr/hyprland.lua b/iso/airootfs/etc/skel/.config/hypr/hyprland.lua index e9b785d..d9a6eb8 100644 --- a/iso/airootfs/etc/skel/.config/hypr/hyprland.lua +++ b/iso/airootfs/etc/skel/.config/hypr/hyprland.lua @@ -125,10 +125,7 @@ hl.bind(mod .. " + slash", hl.dsp.exec_cmd("bos-keybinds")) hl.bind(mod .. " + L", hl.dsp.exec_cmd("loginctl lock-session")) hl.bind(mod .. " + F", hl.dsp.window.fullscreen({ action = "toggle" })) hl.bind(mod .. " + V", hl.dsp.window.float({ action = "toggle" })) --- breadclip (its own gtk4-layer-shell popup — not a TUI, so no terminal --- needed). Previously piped cliphist through fzf directly from the --- compositor with no terminal attached, which was a silent no-op. -hl.bind(mod .. " + SHIFT + V", hl.dsp.exec_cmd("breadclip")) +hl.bind(mod .. " + SHIFT + V", hl.dsp.exec_cmd([[bash -c 'cliphist list | fzf --reverse --prompt="Clipboard > " | cliphist decode | wl-copy']])) hl.bind(mod .. " + T", hl.dsp.layout("togglesplit")) hl.bind(mod .. " + Tab", hl.dsp.focus({ urgent_or_last = true })) hl.bind(mod .. " + N", hl.dsp.exit()) @@ -201,9 +198,8 @@ hl.on("hyprland.start", function() "gsettings set org.gnome.desktop.interface icon-theme Papirus-Dark", "gsettings set org.gnome.desktop.interface cursor-theme Bibata-Modern-Ice", "gsettings set org.gnome.desktop.interface cursor-size 24", - -- Clipboard history is breadclipd, a bakery-managed systemd --user - -- service (auto-started via skel — see build-local.sh's service bake) - -- rather than an exec-once here. + -- Clipboard history daemon (feeds SUPER+V history picker via wl-paste). + "wl-paste --type text --watch cliphist store", "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1", "awww-daemon", -- set the default wallpaper once the daemon is up (retry until ready) @@ -214,20 +210,8 @@ hl.on("hyprland.start", function() -- to pick it up — that's how it gets HYPRLAND_INSTANCE_SIGNATURE to talk to Hyprland. "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP HYPRLAND_INSTANCE_SIGNATURE", "systemctl --user restart breadd", - -- graphical-session.target ships with RefuseManualStart=yes (systemd - -- convention — only a session manager like uwsm is meant to activate - -- it), confirmed on real hardware: `systemctl --user start - -- graphical-session.target` fails outright ("Operation refused"). - -- BOS doesn't use uwsm, and nothing else activates that target, so - -- breadclipd (WantedBy=graphical-session.target) never started. - -- Start it directly instead. If more graphical-session.target - -- services show up later, add them here too. - "systemctl --user start breadclipd.service", "breadbar", - -- breadbox-sync is a Type=oneshot systemd --user service - -- (WantedBy=default.target, no Hyprland IPC dependency) — it - -- already runs on login via the unit baked into skel; exec'ing it - -- again here would just start it twice. + "breadbox-sync", "hypridle", -- first-boot onboarding (self-gates after the first run) "bos-welcome", diff --git a/iso/airootfs/usr/local/bin/bos-copy-kernel b/iso/airootfs/usr/local/bin/bos-copy-kernel index 7f7ad95..ee23c30 100755 --- a/iso/airootfs/usr/local/bin/bos-copy-kernel +++ b/iso/airootfs/usr/local/bin/bos-copy-kernel @@ -7,40 +7,19 @@ # (the stock linux.preset points ALL_kver at /boot/vmlinuz-linux) and before the # `bootloader` module runs grub — otherwise the installed system is unbootable. # -# Runs in the LIVE environment (Calamares shellprocess, dontChroot); the -# target root mount point is passed as $1. -# -# The kernel is read from /usr/lib/modules/$(uname -r)/vmlinuz — part of the -# live squashfs itself (the linux package always installs it there), not from -# the ISO's separate arch/boot/x86_64/ dir under /run/archiso/bootmnt. That -# mount gets torn down by archiso's own copytoram handling, which self-enables -# on most real hardware, so depending on it here would leave $ROOT/boot empty -# and the install unbootable on exactly the machines this is meant to run on. +# Runs in the LIVE environment (Calamares shellprocess, dontChroot) so it can +# read /run/archiso/bootmnt; the target root mount point is passed as $1. set -uo pipefail ROOT="${1:?target root required}" -KVER="$(uname -r)" -SRC_KERNEL="/usr/lib/modules/${KVER}/vmlinuz" -SRC_BOOT="/run/archiso/bootmnt/arch/boot/x86_64" +SRC="/run/archiso/bootmnt/arch/boot/x86_64" install -d -m 0755 "$ROOT/boot" +cp -f "$SRC/vmlinuz-linux" "$ROOT/boot/vmlinuz-linux" -if [ -f "$SRC_KERNEL" ]; then - cp -f "$SRC_KERNEL" "$ROOT/boot/vmlinuz-linux" -elif [ -f "$SRC_BOOT/vmlinuz-linux" ]; then - echo "WARN: $SRC_KERNEL missing, falling back to $SRC_BOOT" - cp -f "$SRC_BOOT/vmlinuz-linux" "$ROOT/boot/vmlinuz-linux" -else - echo "ERROR: no kernel image found (checked $SRC_KERNEL and $SRC_BOOT/vmlinuz-linux) — install would be unbootable" >&2 - exit 1 -fi - -# Microcode, if the live medium carries it (grub-mkconfig picks it up). This -# is best-effort: post-install.sh's mkinitcpio `microcode` HOOKS entry embeds -# microcode from /usr/lib/firmware directly, so a missing standalone ucode.img -# here is not boot-critical, unlike the kernel image above. +# Microcode, if the live medium carries it (grub-mkconfig picks it up). for u in amd-ucode.img intel-ucode.img; do - [ -f "$SRC_BOOT/$u" ] && cp -f "$SRC_BOOT/$u" "$ROOT/boot/$u" + [ -f "$SRC/$u" ] && cp -f "$SRC/$u" "$ROOT/boot/$u" done # Replace the archiso initramfs setup that unpackfs copied from the live medium. diff --git a/iso/airootfs/usr/local/bin/bos-live-setup b/iso/airootfs/usr/local/bin/bos-live-setup index ad54075..32a83f6 100644 --- a/iso/airootfs/usr/local/bin/bos-live-setup +++ b/iso/airootfs/usr/local/bin/bos-live-setup @@ -34,18 +34,15 @@ fi # Start Hyprland on tty1 login; capture output and fall back to a shell so a # failed compositor start is visible rather than a blank looping cursor. -# liveuser's shell is zsh (see useradd above), which never sources -# .bash_profile — this must be .zprofile (zsh's login-shell hook) or it never -# runs at all and the live session boots to a bare console. -cat >/home/liveuser/.zprofile <<'EOF' +cat >/home/liveuser/.bash_profile <<'EOF' if [[ "$(tty)" == /dev/tty1 ]] && [[ -z "$WAYLAND_DISPLAY" ]]; then export WLR_RENDERER_ALLOW_SOFTWARE=1 export WLR_NO_HARDWARE_CURSORS=1 # Log to a user-writable path (/var/log is root-only; redirecting there # would fail and silently keep the compositor from ever launching). - start-hyprland &>/tmp/hyprland-live.log + Hyprland &>/tmp/hyprland-live.log echo "Hyprland exited (rc=$?). Log: /tmp/hyprland-live.log" - exec zsh -i + exec bash -i fi EOF diff --git a/iso/airootfs/usr/local/bin/bos-resolve-airootfs b/iso/airootfs/usr/local/bin/bos-resolve-airootfs deleted file mode 100644 index 3b347f6..0000000 --- a/iso/airootfs/usr/local/bin/bos-resolve-airootfs +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# Resolve the real location of the live squashfs before Calamares' unpackfs -# module runs, and leave a stable symlink for it to unpack from. -# -# archiso's own initcpio hook unmounts /run/archiso/bootmnt once copytoram has -# copied the image to a tmpfs (/run/archiso/copytoram/airootfs.sfs) — and -# copytoram=auto self-enables on most real hardware (non-optical boot device, -# image under 4 GiB, enough free RAM), not just when explicitly requested. A -# Calamares unpackfs.conf source path hardcoded to /run/archiso/bootmnt/... -# would then point at nothing. Check both locations here, in a real script, -# and hand unpackfs.conf one fixed path that always resolves. -set -uo pipefail - -DEST="/run/archiso/resolved-airootfs.sfs" -CANDIDATES=( - "/run/archiso/copytoram/airootfs.sfs" - "/run/archiso/bootmnt/arch/x86_64/airootfs.sfs" -) - -for c in "${CANDIDATES[@]}"; do - if [ -f "$c" ]; then - ln -sf "$c" "$DEST" - echo "resolved live squashfs: $c -> $DEST" - exit 0 - fi -done - -echo "ERROR: could not find the live squashfs in any known location (checked: ${CANDIDATES[*]})" >&2 -exit 1 diff --git a/iso/airootfs/usr/local/bin/bos-session b/iso/airootfs/usr/local/bin/bos-session index d7655fc..8fecd2c 100644 --- a/iso/airootfs/usr/local/bin/bos-session +++ b/iso/airootfs/usr/local/bin/bos-session @@ -7,14 +7,9 @@ # breadbox-sync, …) would be missing from PATH and the Hyprland `exec-once` # launches would fail. Source the login profile here so PATH is correct, set the # Wayland session hints, then hand off to Hyprland. -# -# Launched via start-hyprland (ships with the hyprland package) rather than the -# raw Hyprland binary — Hyprland upstream no longer recommends exec'ing it -# directly; start-hyprland wraps it in a watchdog process that also gives us -# crash recovery for free. source /etc/profile 2>/dev/null export XDG_SESSION_TYPE=wayland export XDG_CURRENT_DESKTOP=Hyprland -exec start-hyprland +exec Hyprland diff --git a/iso/airootfs/usr/local/bin/bos-update b/iso/airootfs/usr/local/bin/bos-update index 53ac3c1..42231ea 100644 --- a/iso/airootfs/usr/local/bin/bos-update +++ b/iso/airootfs/usr/local/bin/bos-update @@ -5,10 +5,8 @@ # 1. pacman — Arch base/desktop + the [breadway] repo (bos-settings, etc.). # Every transaction is snapshotted by snap-pac, so you can roll # back from the GRUB "snapshots" submenu or BOS Settings. -# 2. bakery — the bread ecosystem apps in ~/.local/bin (whatever `bakery list` -# reports as installed — bread, breadbar, breadbox, breadcrumbs, -# breadpad, breadman, bread-theme, breadpaper, breadmon, -# breadsearch, breadclip, breadshot, ...). +# 2. bakery — the bread ecosystem apps in ~/.local/bin (bread, breadbar, +# breadbox, breadcrumbs, breadpad, breadman, bread-theme). # # Best-effort: a failure in one channel doesn't abort the other. set -uo pipefail diff --git a/iso/efiboot/loader/entries/01-archiso-linux-copytoram.conf b/iso/efiboot/loader/entries/01-archiso-linux-copytoram.conf index 96da700..289bd88 100644 --- a/iso/efiboot/loader/entries/01-archiso-linux-copytoram.conf +++ b/iso/efiboot/loader/entries/01-archiso-linux-copytoram.conf @@ -2,4 +2,4 @@ title Bread OS install medium (copy to RAM, UEFI) sort-key 015 linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img -options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% copytoram=y quiet splash vt.global_cursor_default=0 systemd.show_status=false rd.systemd.show_status=false rd.udev.log_level=3 +options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% copytoram=y diff --git a/iso/efiboot/loader/entries/01-archiso-linux.conf b/iso/efiboot/loader/entries/01-archiso-linux.conf index c26c61e..d872e48 100644 --- a/iso/efiboot/loader/entries/01-archiso-linux.conf +++ b/iso/efiboot/loader/entries/01-archiso-linux.conf @@ -2,4 +2,4 @@ title Bread OS install medium (%ARCH%, UEFI) sort-key 01 linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img -options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% quiet splash vt.global_cursor_default=0 systemd.show_status=false rd.systemd.show_status=false rd.udev.log_level=3 +options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% diff --git a/iso/packages.x86_64 b/iso/packages.x86_64 index 41902e1..ab0d1e4 100644 --- a/iso/packages.x86_64 +++ b/iso/packages.x86_64 @@ -178,10 +178,10 @@ brightnessctl grim slurp # Clipboard (Wayland copy/paste; also clipboard screenshots) and media keys. -# Clipboard history is breadclip/breadclipd (bakery-managed, SUPER+SHIFT+V), -# not cliphist — wl-clipboard is still needed directly by breadclip/breadshot. wl-clipboard playerctl +# Clipboard history daemon (stores wl-clipboard events; breadbox bind replays them). +cliphist # Wallpaper daemon + pywal (drives the bread* colour palette from the wallpaper). awww python-pywal diff --git a/iso/profiledef.sh b/iso/profiledef.sh index fc4be34..709071a 100644 --- a/iso/profiledef.sh +++ b/iso/profiledef.sh @@ -20,7 +20,6 @@ file_permissions=( ["/usr/local/bin/bos-live-setup"]="0:0:755" ["/usr/local/bin/bos-launch-calamares"]="0:0:755" ["/usr/local/bin/bos-copy-kernel"]="0:0:755" - ["/usr/local/bin/bos-resolve-airootfs"]="0:0:755" ["/usr/local/bin/bos-session"]="0:0:755" ["/usr/local/bin/bos-keybinds"]="0:0:755" ["/usr/local/bin/bos-welcome"]="0:0:755" diff --git a/iso/syslinux/archiso_sys-linux.cfg b/iso/syslinux/archiso_sys-linux.cfg index febc966..0ec10f1 100644 --- a/iso/syslinux/archiso_sys-linux.cfg +++ b/iso/syslinux/archiso_sys-linux.cfg @@ -6,7 +6,7 @@ ENDTEXT MENU LABEL Bread OS install medium (%ARCH%, BIOS) LINUX /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux INITRD /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img -APPEND archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% quiet splash vt.global_cursor_default=0 systemd.show_status=false rd.systemd.show_status=false rd.udev.log_level=3 +APPEND archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% # Copy-to-RAM boot option — loads airootfs.sfs entirely into RAM, so the # installer reads from memory rather than a possibly-flaky USB (avoids SquashFS @@ -19,7 +19,7 @@ ENDTEXT MENU LABEL Bread OS install medium (%ARCH%, BIOS) ^copy to RAM LINUX /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux INITRD /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img -APPEND archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% copytoram=y quiet splash vt.global_cursor_default=0 systemd.show_status=false rd.systemd.show_status=false rd.udev.log_level=3 +APPEND archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% copytoram=y # Accessibility boot option LABEL archspeech