feat: live ISO image configuration
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
efe328eb7b
commit
93a58e18f6
1 changed files with 565 additions and 0 deletions
565
iso.nix
Normal file
565
iso.nix
Normal file
|
|
@ -0,0 +1,565 @@
|
|||
# Omnixient NixOS Live ISO Configuration
|
||||
# This creates a bootable ISO image with Omnixient pre-installed
|
||||
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
modulesPath,
|
||||
settings,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
imports = [
|
||||
# Include the basic ISO image module (without Calamares to avoid conflicts)
|
||||
"${modulesPath}/installer/cd-dvd/installation-cd-minimal.nix"
|
||||
|
||||
# Omnixient modules (lib must be first to provide helpers)
|
||||
./modules/lib.nix
|
||||
./modules/core.nix
|
||||
./modules/colors.nix
|
||||
./modules/security.nix
|
||||
./modules/fastfetch.nix
|
||||
./modules/walker.nix
|
||||
./modules/scripts.nix
|
||||
./modules/menus.nix
|
||||
./modules/desktop/hyprland.nix
|
||||
./modules/packages.nix
|
||||
# development.nix moved to the development pack (omni.packs.development),
|
||||
# which the ISO doesn't load — it ran the minimal preset (coding off), so
|
||||
# the module was inactive here anyway.
|
||||
./modules/themes/tokyo-night.nix # Default theme for ISO
|
||||
./modules/users.nix
|
||||
./modules/services.nix
|
||||
./modules/hardware
|
||||
|
||||
# Pre-create the home-manager activation script's expected
|
||||
# directory tree on first boot. Without this the live ISO
|
||||
# would crash `home-manager-user.service` exactly the way the
|
||||
# main host did before commit efafd8c — this module is also
|
||||
# imported by lib/mksystem.nix so the bootstrap stays
|
||||
# consistent across both code paths.
|
||||
./modules/home-manager-bootstrap.nix
|
||||
];
|
||||
|
||||
# ISO-specific configuration
|
||||
isoImage = {
|
||||
# ISO image settings
|
||||
volumeID = "OMNI_${lib.toUpper config.system.nixos.label}";
|
||||
|
||||
# Boot configuration
|
||||
makeEfiBootable = true;
|
||||
makeUsbBootable = true;
|
||||
|
||||
# Include additional files
|
||||
includeSystemBuildDependencies = false;
|
||||
|
||||
# Squeeze a few % extra out of squashfs (zstd 22 vs default
|
||||
# 19). Slower to compress but saves ~80-120 MB on a ~4 GB
|
||||
# image. Decompression speed at boot is identical.
|
||||
squashfsCompression = "zstd -Xcompression-level 22";
|
||||
|
||||
# Boot splash (optional)
|
||||
splashImage = if builtins.pathExists ./assets/logo.png then ./assets/logo.png else null;
|
||||
|
||||
# Desktop entry for installer
|
||||
contents = [
|
||||
{
|
||||
source = pkgs.writeText "omni-install.desktop" ''
|
||||
[Desktop Entry]
|
||||
Name=Install Omnixient
|
||||
Comment=Install Omnixient NixOS to your computer
|
||||
Exec=gnome-terminal -- sudo omni-installer
|
||||
Icon=system-software-install
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=System;
|
||||
StartupNotify=true
|
||||
'';
|
||||
target = "etc/xdg/autostart/omni-install.desktop";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
# System configuration for live ISO
|
||||
system.stateVersion = settings.stateVersion;
|
||||
|
||||
# Allow unfree packages
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
# ISO size diet — overrides for the main host config so we don't
|
||||
# blow past the "fits on a 4 GB USB" target. The main host
|
||||
# configurations keep their full font and doc sets; these mkForce
|
||||
# blocks only apply to the ISO build.
|
||||
|
||||
# Drop the 10-font Nerd Font set from modules/packages.nix down
|
||||
# to one (jetbrains-mono — referenced by waybar/alacritty). Drop
|
||||
# CJK fonts (~500 MB of Chinese/Japanese/Korean glyphs nobody on
|
||||
# a US-locale live ISO needs). Keep the basics: noto for general
|
||||
# text, emoji for unicode, jetbrains-mono in both regular and
|
||||
# nerd flavours for terminal/editor, font-awesome for waybar
|
||||
# icons.
|
||||
fonts.packages = lib.mkForce (
|
||||
with pkgs;
|
||||
[
|
||||
nerd-fonts.jetbrains-mono # waybar icons + terminal
|
||||
jetbrains-mono # editor / IDE
|
||||
noto-fonts-color-emoji # unicode emoji
|
||||
font-awesome # waybar fontawesome glyphs
|
||||
# noto-fonts and liberation_ttf dropped to fit the 3.6 GiB
|
||||
# USB. Body text falls back to jetbrains-mono which is fine
|
||||
# for an installer session.
|
||||
]
|
||||
);
|
||||
|
||||
# Drop documentation outputs (~700 MB + change). cachix-doc
|
||||
# pulls in 696 MB of Haskell ghc-doc on its own; doc.enable is
|
||||
# the upstream switch that opts every package into shipping its
|
||||
# HTML/info manuals into the live system path.
|
||||
documentation = {
|
||||
doc.enable = lib.mkForce false;
|
||||
info.enable = lib.mkForce false;
|
||||
nixos.enable = lib.mkForce false;
|
||||
# man pages stay enabled — they are tiny and useful in the
|
||||
# live session for `man nixos-install` etc.
|
||||
};
|
||||
|
||||
# ISO image filename
|
||||
image.fileName = "omni-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.iso";
|
||||
|
||||
# Enable flakes
|
||||
nix = {
|
||||
settings = {
|
||||
experimental-features = [
|
||||
"nix-command"
|
||||
"flakes"
|
||||
];
|
||||
auto-optimise-store = true;
|
||||
|
||||
# Binary caches
|
||||
substituters = [
|
||||
"https://cache.nixos.org"
|
||||
"https://nix-community.cachix.org"
|
||||
"https://hyprland.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Networking
|
||||
networking = {
|
||||
hostName = "omni-live";
|
||||
networkmanager.enable = true;
|
||||
networkmanager.wifi.backend = "iwd";
|
||||
wireless.iwd.enable = true;
|
||||
|
||||
# Enable firewall but allow common services for live session
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [
|
||||
22
|
||||
80
|
||||
443
|
||||
3000
|
||||
8080
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Pre-configured WiFi for live session auto-connect.
|
||||
networking.networkmanager.ensureProfiles.profiles.live-wifi = {
|
||||
connection = {
|
||||
id = "Cathare";
|
||||
type = "wifi";
|
||||
autoconnect = "true";
|
||||
autoconnect-priority = "100";
|
||||
};
|
||||
wifi = {
|
||||
ssid = "Cathare";
|
||||
mode = "infrastructure";
|
||||
};
|
||||
wifi-security = {
|
||||
key-mgmt = "wpa-psk";
|
||||
psk = "DruidLife";
|
||||
};
|
||||
ipv4.method = "auto";
|
||||
ipv6.method = "auto";
|
||||
};
|
||||
|
||||
# Timezone and locale
|
||||
time.timeZone = "UTC"; # Will be configured during installation
|
||||
i18n = {
|
||||
defaultLocale = "en_US.UTF-8";
|
||||
extraLocaleSettings = {
|
||||
LC_ADDRESS = "en_US.UTF-8";
|
||||
LC_IDENTIFICATION = "en_US.UTF-8";
|
||||
LC_MEASUREMENT = "en_US.UTF-8";
|
||||
LC_MONETARY = "en_US.UTF-8";
|
||||
LC_NAME = "en_US.UTF-8";
|
||||
LC_NUMERIC = "en_US.UTF-8";
|
||||
LC_PAPER = "en_US.UTF-8";
|
||||
LC_TELEPHONE = "en_US.UTF-8";
|
||||
LC_TIME = "en_US.UTF-8";
|
||||
};
|
||||
};
|
||||
|
||||
# Sound configuration
|
||||
services.pulseaudio.enable = false;
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
jack.enable = true;
|
||||
};
|
||||
|
||||
# Override display manager configuration for ISO
|
||||
services = {
|
||||
# Disable greetd from main config
|
||||
greetd.enable = lib.mkForce false;
|
||||
|
||||
# Enable auto-login for live session
|
||||
getty.autologinUser = "nixos";
|
||||
|
||||
# Keep X11 disabled - pure Wayland
|
||||
xserver.enable = lib.mkForce false;
|
||||
};
|
||||
|
||||
# Live user configuration is handled by modules/users.nix
|
||||
# The nixos user will be created automatically since omni.user = "nixos"
|
||||
# Remove any conflicting password settings
|
||||
users.users.nixos = {
|
||||
initialPassword = lib.mkForce ""; # Empty password for live session
|
||||
password = lib.mkForce null;
|
||||
hashedPassword = lib.mkForce null;
|
||||
hashedPasswordFile = lib.mkForce null;
|
||||
initialHashedPassword = lib.mkForce null;
|
||||
};
|
||||
|
||||
# Disable firefox from home.nix for the live ISO — its closure
|
||||
# adds 321 MB. Users can `nix-shell -p firefox` if they need a
|
||||
# browser during the live session.
|
||||
home-manager.users.nixos.programs.firefox.enable = lib.mkForce false;
|
||||
|
||||
# Replace papirus-icon-theme (444 MB) with the already-present
|
||||
# adwaita-icon-theme (~50 MB) to fit the 3.6 GiB USB target.
|
||||
# Papirus is purely cosmetic; adwaita provides full icon
|
||||
# coverage for GTK apps, thunar, etc. The installed system can
|
||||
# switch back to papirus via `omni.theme` after install.
|
||||
nixpkgs.overlays = [
|
||||
(_self: super: {
|
||||
# Swap papirus (444 MB) for adwaita (already present, ~50 MB)
|
||||
papirus-icon-theme = super.adwaita-icon-theme;
|
||||
# Stub out packages that have no use on a live installer
|
||||
# session — saves ~175 MB of closure to fit the 3.6 GiB USB.
|
||||
rclone = super.hello; # cloud sync (88 MB)
|
||||
mesa-demos = super.hello; # glxgears/glxinfo (62 MB)
|
||||
cachix = super.hello; # binary cache tool (25 MB)
|
||||
# Intel OpenCL compute runtime (292 MB via IGC). Display
|
||||
# works fine without it via mesa/i915; only GPU compute
|
||||
# (which nobody uses on a live installer) needs it.
|
||||
intel-compute-runtime = super.hello;
|
||||
})
|
||||
];
|
||||
|
||||
# Auto-start Hyprland on tty1 for the live session user.
|
||||
# Uses programs.bash.interactiveShellInit instead of profile.d because
|
||||
# getty autologin spawns a non-login shell, so /etc/profile.d/ is
|
||||
# never sourced.
|
||||
programs.bash.interactiveShellInit = ''
|
||||
if [[ "$(tty)" == "/dev/tty1" && "$USER" == "nixos" && -z "$WAYLAND_DISPLAY" ]]; then
|
||||
export XDG_SESSION_TYPE=wayland
|
||||
export XDG_SESSION_DESKTOP=Hyprland
|
||||
export XDG_CURRENT_DESKTOP=Hyprland
|
||||
exec ${pkgs.hyprland}/bin/Hyprland
|
||||
fi
|
||||
'';
|
||||
|
||||
# Sudo configuration for live user
|
||||
security.sudo = {
|
||||
enable = true;
|
||||
wheelNeedsPassword = false; # Allow passwordless sudo for live session
|
||||
};
|
||||
|
||||
# Enable SSH for remote access (with empty password warning)
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
settings = {
|
||||
PermitRootLogin = "no";
|
||||
PasswordAuthentication = lib.mkForce true; # Override core.nix setting for ISO
|
||||
PermitEmptyPasswords = lib.mkForce true; # For live session only
|
||||
};
|
||||
};
|
||||
|
||||
# Omnixient configuration for ISO
|
||||
omni = {
|
||||
enable = true;
|
||||
user = "nixos"; # Live session user
|
||||
theme = "tokyo-night";
|
||||
desktop.enable = true;
|
||||
displayManager = "gdm"; # Override default for live session
|
||||
|
||||
# `minimal` preset for the live ISO. The `everything` preset
|
||||
# pulls in vscode, libreoffice, slack, discord, steam, docker,
|
||||
# virt-manager, etc. — together adding 6-8 GB to the ISO and
|
||||
# blowing past the "fits on a 4 GB USB" target. The live
|
||||
# session is a tour-of-omni + installer, not a full dev box;
|
||||
# users get the full feature set after they install.
|
||||
preset = "minimal";
|
||||
|
||||
# Security configuration (relaxed for live session)
|
||||
security = {
|
||||
enable = true;
|
||||
fingerprint.enable = false;
|
||||
fido2.enable = false;
|
||||
systemHardening = {
|
||||
enable = false; # Disable hardening for live session compatibility
|
||||
faillock.enable = false;
|
||||
};
|
||||
};
|
||||
|
||||
# Package configuration
|
||||
packages = {
|
||||
# Don't exclude anything for the live session showcase
|
||||
exclude = [ ];
|
||||
};
|
||||
};
|
||||
|
||||
# Additional ISO packages — kept lean to fit on a 4 GB USB.
|
||||
# Drops:
|
||||
# - gnome-disk-utility, nautilus, gnome-terminal: omni already
|
||||
# ships kitty/alacritty + thunar via the desktop module, so
|
||||
# these GNOME duplicates are dead weight (~500 MB).
|
||||
# - vim: nvim (via lazyvim-nix) is the editor; nano is kept as
|
||||
# a tiny fallback for users uncomfortable with modal editors.
|
||||
# - neofetch: omni already includes fastfetch via its module.
|
||||
environment.systemPackages = with pkgs; [
|
||||
# Installation tools
|
||||
gparted
|
||||
|
||||
# Text editors for configuration
|
||||
nano
|
||||
|
||||
# Network tools
|
||||
wget
|
||||
curl
|
||||
|
||||
# System information
|
||||
lshw
|
||||
|
||||
# NOTE: firefox was dropped to meet the 4 GB USB target.
|
||||
# Its closure adds ~321 MB which pushes the compressed ISO
|
||||
# past 3.6 GB. Users can `nix-shell -p firefox` in the live
|
||||
# session if they need a browser for docs during install.
|
||||
|
||||
# Omnixient installer script
|
||||
(pkgs.writeShellScriptBin "omni-installer" ''
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "🚀 Omnixient NixOS Installer"
|
||||
echo "========================="
|
||||
echo ""
|
||||
echo "This will guide you through installing Omnixient NixOS to your computer."
|
||||
echo ""
|
||||
echo "⚠️ WARNING: This will modify your disk partitions!"
|
||||
echo ""
|
||||
|
||||
read -p "Do you want to continue? (y/N): " -n 1 -r
|
||||
echo
|
||||
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Installation cancelled."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Launch the graphical installer
|
||||
echo "🖥️ Launching graphical installer..."
|
||||
echo " Follow the on-screen instructions to install Omnixient."
|
||||
echo ""
|
||||
|
||||
# Use Calamares if available, otherwise provide manual instructions
|
||||
if command -v calamares &> /dev/null; then
|
||||
sudo calamares
|
||||
else
|
||||
echo "📝 Manual Installation Instructions:"
|
||||
echo ""
|
||||
echo "1. Partition your disk with gparted or fdisk"
|
||||
echo "2. Mount your root partition to /mnt"
|
||||
echo "3. Generate hardware configuration:"
|
||||
echo " sudo nixos-generate-config --root /mnt"
|
||||
echo ""
|
||||
echo "4. Download Omnixient configuration:"
|
||||
echo " cd /mnt/etc/nixos"
|
||||
echo " sudo git clone https://git.atitlan.io/aiolabs/omnixient.git ."
|
||||
echo ""
|
||||
echo "5. Edit configuration.nix to set your username and theme"
|
||||
echo ""
|
||||
echo "6. Install NixOS:"
|
||||
echo " sudo nixos-install --flake /mnt/etc/nixos#omni"
|
||||
echo ""
|
||||
echo "7. Reboot and enjoy Omnixient!"
|
||||
|
||||
read -p "Press Enter to open gparted for disk partitioning..."
|
||||
sudo gparted
|
||||
fi
|
||||
'')
|
||||
|
||||
# Demo scripts
|
||||
(pkgs.writeShellScriptBin "omni-demo" ''
|
||||
#!/usr/bin/env bash
|
||||
echo "🎨 Omnixient Live Demo"
|
||||
echo "=================="
|
||||
echo ""
|
||||
echo "Welcome to Omnixient NixOS Live Session!"
|
||||
echo ""
|
||||
echo "Available commands:"
|
||||
echo " omni-installer - Install Omnixient to your computer"
|
||||
echo " omni-info - Show system information"
|
||||
echo " omni-theme - Change theme (temporary for live session)"
|
||||
echo " omni-demo - Show this demo"
|
||||
echo ""
|
||||
echo "Key features to try:"
|
||||
echo " • Hyprland window manager with modern animations"
|
||||
echo " • Multiple themes (tokyo-night, catppuccin, gruvbox, etc.)"
|
||||
echo " • Development tools and environments"
|
||||
echo " • Multimedia and productivity applications"
|
||||
echo ""
|
||||
echo "To install Omnixient permanently, run: omni-installer"
|
||||
echo ""
|
||||
'')
|
||||
];
|
||||
|
||||
# Services for live session
|
||||
services = {
|
||||
# Enable printing support
|
||||
printing.enable = true;
|
||||
|
||||
# Enable Bluetooth
|
||||
blueman.enable = true;
|
||||
|
||||
# Enable location services
|
||||
geoclue2.enable = true;
|
||||
|
||||
# Enable automatic time synchronization
|
||||
timesyncd.enable = true;
|
||||
};
|
||||
|
||||
# Hardware support — `enableRedistributableFirmware` instead of
|
||||
# `enableAllFirmware` to keep the ISO under 4 GB. The "all"
|
||||
# variant pulls in non-redistributable blobs that add ~2-3 GB
|
||||
# for relatively niche wifi/bluetooth chips. Most modern hardware
|
||||
# works with the redistributable set; users on edge-case wifi
|
||||
# can opt in via `hardware.enableAllFirmware = true` after
|
||||
# install.
|
||||
hardware = {
|
||||
enableRedistributableFirmware = true;
|
||||
|
||||
# Graphics drivers
|
||||
graphics = {
|
||||
enable = true;
|
||||
enable32Bit = true;
|
||||
};
|
||||
|
||||
# Bluetooth
|
||||
bluetooth = {
|
||||
enable = true;
|
||||
powerOnBoot = true;
|
||||
};
|
||||
};
|
||||
|
||||
# Boot configuration for ISO
|
||||
boot = {
|
||||
# Support for various filesystems
|
||||
supportedFilesystems = [
|
||||
"btrfs"
|
||||
"ext4"
|
||||
"xfs"
|
||||
"ntfs"
|
||||
"fat32"
|
||||
"exfat"
|
||||
];
|
||||
|
||||
# Include lots of modules for hardware compatibility
|
||||
initrd.availableKernelModules = [
|
||||
# Storage
|
||||
"ahci"
|
||||
"xhci_pci"
|
||||
"nvme"
|
||||
"usb_storage"
|
||||
"sd_mod"
|
||||
"rtsx_pci_sdmmc"
|
||||
# Graphics
|
||||
"amdgpu"
|
||||
"radeon"
|
||||
"nouveau"
|
||||
"i915"
|
||||
# Network
|
||||
"r8169"
|
||||
"e1000e"
|
||||
"iwlwifi"
|
||||
"ath9k"
|
||||
"ath10k_pci"
|
||||
"rtw88_8822ce"
|
||||
];
|
||||
|
||||
# Kernel parameters for better hardware compatibility
|
||||
kernelParams = [
|
||||
"boot.shell_on_fail"
|
||||
"i915.modeset=1"
|
||||
"nouveau.modeset=1"
|
||||
"radeon.modeset=1"
|
||||
"amdgpu.modeset=1"
|
||||
];
|
||||
|
||||
# Latest kernel for better hardware support (MT7925
|
||||
# bluetooth, newer AMD GPUs, etc.).
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
# Plymouth disabled for ISO to avoid potential issues
|
||||
plymouth.enable = false;
|
||||
};
|
||||
|
||||
# Auto-login is configured above in services.displayManager
|
||||
|
||||
# Automatically start Omnixient demo on login
|
||||
environment.loginShellInit = ''
|
||||
# Show demo information on first login
|
||||
if [ -f /home/nixos/.first-login ]; then
|
||||
omni-demo
|
||||
rm /home/nixos/.first-login
|
||||
fi
|
||||
'';
|
||||
|
||||
# Create first-login marker
|
||||
system.activationScripts.createFirstLoginMarker = ''
|
||||
touch /home/nixos/.first-login
|
||||
chown nixos:users /home/nixos/.first-login
|
||||
'';
|
||||
|
||||
# Disable some services that might cause issues in live session
|
||||
systemd.services = {
|
||||
# Disable networkd-wait-online to speed up boot
|
||||
systemd-networkd-wait-online.enable = false;
|
||||
|
||||
# Disable some hardware services that might not be needed
|
||||
fwupd.enable = false;
|
||||
};
|
||||
|
||||
# Memory and performance optimizations for live session
|
||||
boot.kernel.sysctl = {
|
||||
# Use more aggressive memory reclaim
|
||||
"vm.swappiness" = 10;
|
||||
"vm.vfs_cache_pressure" = 50;
|
||||
|
||||
# Network optimizations
|
||||
"net.core.default_qdisc" = "fq";
|
||||
"net.ipv4.tcp_congestion_control" = "bbr";
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue