├── .gitignore ├── LICENSE ├── README.md ├── config.yaml ├── default.nix ├── flake.lock ├── flake.nix ├── icons └── snowflakeos.png └── scripts ├── configure.sh ├── install.sh └── prepare.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .envrc 2 | /.direnv 3 | /.vscode 4 | /result 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Victor Fuentes 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | SnowflakeOS OS-Installer Configuration 4 | === 5 | [![Built with Nix][builtwithnix badge]][builtwithnix] 6 | [![License: MIT][MIT badge]][MIT] 7 | [![Chat on Matrix][matrix badge]][matrix] 8 | [![Chat on Discord][discord badge]][discord] 9 | 10 | SnowflakeOS is a NixOS based Linux distribution focused on beginner friendliness and ease of use. This repository contains the SnowflakeOS configurations for [OS-Installer](https://gitlab.gnome.org/p3732/os-installer). 11 | 12 |
13 | 14 | [builtwithnix badge]: https://img.shields.io/badge/Built%20With-Nix-41439A?style=for-the-badge&logo=nixos&logoColor=white 15 | [builtwithnix]: https://builtwithnix.org/ 16 | [MIT badge]: https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge 17 | [MIT]: https://opensource.org/licenses/MIT 18 | [matrix badge]: https://img.shields.io/badge/matrix-join%20chat-0cbc8c?style=for-the-badge&logo=matrix&logoColor=white 19 | [matrix]: https://matrix.to/#/#snowflakeos:matrix.org 20 | [discord badge]: https://img.shields.io/discord/1021080090676842506?color=7289da&label=Discord&logo=discord&logoColor=ffffff&style=for-the-badge 21 | [discord]: https://discord.gg/6rWNMmdkgT 22 | -------------------------------------------------------------------------------- /config.yaml: -------------------------------------------------------------------------------- 1 | %YAML 1.2 2 | --- 3 | # This is an example config file for OS-Installer. 4 | # Place your config under /etc/os-installer/config.yaml for it to be used. 5 | # If a value is not defined, it's default will be used. 6 | 7 | # Name of the distribution. 8 | # Default: 'Untitled' 9 | distribution_name: 'SnowflakeOS' 10 | 11 | # Whether the installation needs an internet connection. 12 | # Default: yes 13 | internet_connection_required: yes 14 | 15 | # A URL/IP address to be used to check for an existing internet connection. 16 | # Default: 'http://nmcheck.gnome.org/check_network_status.txt' 17 | internet_checker_url: 'http://cache.nixos.org/' 18 | 19 | # Skip the language selection dialog by specifing a language, e.g. 'pt_BR' 20 | # Default: no 21 | fixed_language: no 22 | 23 | # A selection of languages the installer should present by default. 24 | # Note: For a language to be available, it needs to be provided by the system 25 | # and the installer needs to have a translation into that language. 26 | # Default: ['ar', 'de', 'en', 'es', 'fr', 'ja', 'ru', 'zh'] 27 | suggested_languages: 28 | - 'en' 29 | - 'ar' 30 | - 'de' 31 | - 'es' 32 | - 'fr' 33 | - 'ja' 34 | - 'ru' 35 | - 'zh' 36 | 37 | # Show a welcome page after language selection. 38 | # A custom logo and text can be defined. Otherwise a default is used. 39 | # Default: logo: None, text: None, usage: yes 40 | welcome_page: 41 | logo : '/etc/os-installer/icons/snowflakeos.png' 42 | text : 'Welcome to the SnowflakeOS installation! Still in development, proceed with caution!' 43 | usage : yes 44 | 45 | # Minimum disk size needed for the installation (in Gigabyte) 46 | # Default: 5 47 | minimum_disk_size: 10 48 | 49 | # Whether to offer setting a disk encryption PIN 50 | # Default: yes 51 | offer_disk_encryption: no 52 | 53 | # A list of additional software packages that can be optionally be selected 54 | # from the installer. The package string will be passed to the installation 55 | # script without changes, so you can bundle multiple packages as one point. 56 | # Required fields are: package, default, name, description, icon_path 57 | # Additionally translations for name and description can be specified by 58 | # placing a language code at the end after an underscore, e.g.: 'name_jp' 59 | # Default: [] 60 | additional_software: 61 | - package : 'nvidia' 62 | name : 'NVIDIA Proprietary Drivers' 63 | description : 'Proprietary drivers for NVIDIA GPUs' 64 | - package : 'prime' 65 | name : 'NVIDIA Prime for laptops' 66 | description : 'Sets up NVIDIA Prime to allow GPU offloading' 67 | -------------------------------------------------------------------------------- /default.nix: -------------------------------------------------------------------------------- 1 | { 2 | pkgs ? 3 | }: 4 | 5 | pkgs.stdenv.mkDerivation { 6 | name = "os-installer-snowflake-config"; 7 | src = [ ./. ]; 8 | 9 | installPhase = '' 10 | runHook preInstall 11 | mkdir -p $out/etc/os-installer 12 | cp config.yaml $out/etc/os-installer/ 13 | cp -r scripts $out/etc/os-installer/ 14 | cp -r icons $out/etc/os-installer/ 15 | substituteInPlace $out/etc/os-installer/config.yaml \ 16 | --replace /etc/os-installer $out/etc/os-installer 17 | runHook postInstall 18 | ''; 19 | } 20 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "nixpkgs": { 4 | "locked": { 5 | "lastModified": 1670242877, 6 | "narHash": "sha256-jBLh7dRHnbfvPPA9znOC6oQfKrCPJ0El8Zoe0BqnCjQ=", 7 | "owner": "NixOS", 8 | "repo": "nixpkgs", 9 | "rev": "6e51c97f1c849efdfd4f3b78a4870e6aa2da4198", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "NixOS", 14 | "ref": "nixos-unstable", 15 | "repo": "nixpkgs", 16 | "type": "github" 17 | } 18 | }, 19 | "root": { 20 | "inputs": { 21 | "nixpkgs": "nixpkgs", 22 | "utils": "utils" 23 | } 24 | }, 25 | "utils": { 26 | "locked": { 27 | "lastModified": 1667395993, 28 | "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", 29 | "owner": "numtide", 30 | "repo": "flake-utils", 31 | "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", 32 | "type": "github" 33 | }, 34 | "original": { 35 | "owner": "numtide", 36 | "repo": "flake-utils", 37 | "type": "github" 38 | } 39 | } 40 | }, 41 | "root": "root", 42 | "version": 7 43 | } 44 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs = { 3 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 4 | utils.url = "github:numtide/flake-utils"; 5 | }; 6 | 7 | outputs = { self, nixpkgs, utils }@inputs: 8 | utils.lib.eachDefaultSystem (system: 9 | let 10 | pkgs = import nixpkgs { 11 | inherit system; 12 | }; 13 | name = "os-installer-snowflake-config"; 14 | in 15 | rec 16 | { 17 | packages.${name} = pkgs.callPackage ./default.nix { 18 | inherit (inputs); 19 | }; 20 | 21 | # `nix build` 22 | defaultPackage = packages.${name}; 23 | 24 | # `nix run` 25 | apps.${name} = utils.lib.mkApp { 26 | inherit name; 27 | drv = packages.${name}; 28 | }; 29 | defaultApp = packages.${name}; 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /icons/snowflakeos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snowflakelinux/os-installer-snowflake-config/cf2efc3b475fb3d76f7e9436682924af3f2d4407/icons/snowflakeos.png -------------------------------------------------------------------------------- /scripts/configure.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | set -e 3 | # The script gets called with the environment variables from the install script 4 | # (see install.sh) and these additional variables: 5 | # OSI_USER_NAME : User's name. Not ASCII-fied 6 | # OSI_USER_AUTOLOGIN : Whether to autologin the user 7 | # OSI_USER_PASSWORD : User's password. Can be empty if autologin is set. 8 | # OSI_FORMATS : Locale of formats to be used 9 | # OSI_TIMEZONE : Timezone to be used 10 | # OSI_ADDITIONAL_SOFTWARE: Space-separated list of additional packages to install 11 | 12 | # sanity check that all variables were set 13 | if [ -z ${OSI_LOCALE+x} ] || \ 14 | [ -z ${OSI_DEVICE_PATH+x} ] || \ 15 | [ -z ${OSI_DEVICE_IS_PARTITION+x} ] || \ 16 | [ -z ${OSI_DEVICE_EFI_PARTITION+x} ] || \ 17 | [ -z ${OSI_USE_ENCRYPTION+x} ] || \ 18 | [ -z ${OSI_ENCRYPTION_PIN+x} ] || \ 19 | [ -z ${OSI_USER_NAME+x} ] || \ 20 | [ -z ${OSI_USER_AUTOLOGIN+x} ] || \ 21 | [ -z ${OSI_USER_PASSWORD+x} ] || \ 22 | [ -z ${OSI_FORMATS+x} ] || \ 23 | [ -z ${OSI_TIMEZONE+x} ] || \ 24 | [ -z ${OSI_ADDITIONAL_SOFTWARE+x} ] 25 | then 26 | echo "Installer script called without all environment variables set!" 27 | exit 1 28 | fi 29 | 30 | # Check if /tmp/os-installer exists 31 | if [ ! -d /tmp/os-installer ] 32 | then 33 | echo "Installer script called without /tmp/os-installer existing!" 34 | exit 1 35 | fi 36 | 37 | echo 'Configuration started.' 38 | echo '' 39 | echo 'Variables set to:' 40 | echo 'OSI_LOCALE ' $OSI_LOCALE 41 | echo 'OSI_DEVICE_PATH ' $OSI_DEVICE_PATH 42 | echo 'OSI_DEVICE_IS_PARTITION ' $OSI_DEVICE_IS_PARTITION 43 | echo 'OSI_DEVICE_EFI_PARTITION ' $OSI_DEVICE_EFI_PARTITION 44 | echo 'OSI_USE_ENCRYPTION ' $OSI_USE_ENCRYPTION 45 | echo 'OSI_ENCRYPTION_PIN ' $OSI_ENCRYPTION_PIN 46 | echo 'OSI_USER_NAME ' $OSI_USER_NAME 47 | echo 'OSI_USER_AUTOLOGIN ' $OSI_USER_AUTOLOGIN 48 | # echo 'OSI_USER_PASSWORD ' $OSI_USER_PASSWORD 49 | echo 'OSI_FORMATS ' $OSI_FORMATS 50 | echo 'OSI_TIMEZONE ' $OSI_TIMEZONE 51 | echo 'OSI_ADDITIONAL_SOFTWARE ' $OSI_ADDITIONAL_SOFTWARE 52 | echo '' 53 | 54 | NIXOSVER=$(nixos-version | head -c 5) 55 | USERNAME=\"$(echo $OSI_USER_NAME | iconv -f utf-8 -t ascii//translit | sed 's/[[:space:]]//g' | tr '[:upper:]' '[:lower:]')\" 56 | KEYBOARD_LAYOUT=$(gsettings get org.gnome.desktop.input-sources sources | grep -o "'[^']*')" | sed "s/'//" | sed "s/')//" | head -n 1 | cut -f1 -d"+") 57 | KEYBOARD_VARIANT=$(gsettings get org.gnome.desktop.input-sources sources | grep -o "'[^']*')" | sed "s/'//" | sed "s/')//" | head -n 1 | grep -Po '\+.*' | cut -c2-) 58 | 59 | if [[ $OSI_DEVICE_IS_PARTITION == 1 ]] 60 | then 61 | DISK=$(lsblk $OSI_DEVICE_PATH -npdbro pkname) 62 | else 63 | DISK=$OSI_DEVICE_PATH 64 | fi 65 | 66 | if [[ $OSI_ADDITIONAL_SOFTWARE == *"prime"* ]] 67 | then 68 | awk_program='function generate_string (str) { 69 | str = substr(str, 6) # Trim leading 0000: 70 | str = gensub(/\./, ":", "g", str) # Replace . with : 71 | str = gensub(/(0+)([0-9])/, "\\2", "g", str) # Remove leading 0 72 | split(str, strArr, ":") # Transform each part into decimal 73 | out = "" 74 | for (i in strArr) { 75 | out = out":"strtonum("0x"strArr[i]) 76 | } 77 | return substr(out, 2) 78 | } 79 | /(VGA|3D|Display).*AMD.*/ { print "AMD", $1, generate_string($1) } 80 | /(VGA|3D|Display).*NVIDIA.*/ { print "NVIDIA", $1, generate_string($1) } 81 | /(VGA|3D|Display).*Intel.*/ { print "INTEL", $1, generate_string($1) } 82 | ' 83 | 84 | PCIOUT=$(awk "$awk_program" <(lspci -D)) 85 | INTELPCI=$(echo "$PCIOUT" | grep INTEL | awk '{ print $3 }') 86 | INTELPCIORIG=$(echo "$PCIOUT" | grep INTEL | awk '{ print $2 }') 87 | AMDPCI=$(echo "$PCIOUT" | grep AMD | awk '{ print $3 }') 88 | AMDPCIORIG=$(echo "$PCIOUT" | grep AMD | awk '{ print $2 }') 89 | NVIDIAPCI=$(echo "$PCIOUT" | grep NVIDIA | awk '{ print $3 }') 90 | NVIDIAPCIORIG=$(echo "$PCIOUT" | grep NVIDIA | awk '{ print $2 }') 91 | 92 | if [[ ! -z "$NVIDIAPCI" ]] 93 | then 94 | echo 'NVIDIA PCI ID: ' $NVIDIAPCIORIG ' -> ' $NVIDIAPCI 95 | if [[ ! -z "$INTELPCI" ]] 96 | then 97 | echo 'INTEL PCI ID: ' $INTELPCIORIG ' -> ' $INTELPCI 98 | INTELPRIME=1 99 | elif [[ ! -z "$AMDPCI" ]] 100 | then 101 | echo 'AMD PCI ID: ' $AMDGPUORIG ' -> ' $AMDPCI 102 | AMDPRIME=1 103 | fi 104 | fi 105 | elif [[ $OSI_ADDITIONAL_SOFTWARE == *"nvidia"* ]] 106 | then 107 | NVIDIA=1 108 | fi 109 | 110 | FLAKETXT="{ 111 | inputs = { 112 | nixpkgs.url = \"github:NixOS/nixpkgs/nixos-unstable\"; 113 | snowflake.url = \"github:snowflakelinux/snowflake-modules\"; 114 | nix-data.url = \"github:snowflakelinux/nix-data\"; 115 | nix-software-center.url = \"github:vlinkz/nix-software-center\"; 116 | nixos-conf-editor.url = \"github:vlinkz/nixos-conf-editor\"; 117 | snow.url = \"github:snowflakelinux/snow\"; 118 | }; 119 | 120 | outputs = { self, nixpkgs, ... }@inputs: 121 | let 122 | system = \"x86_64-linux\"; 123 | in 124 | { 125 | nixosConfigurations.snowflakeos = nixpkgs.lib.nixosSystem { 126 | inherit system; 127 | modules = [ 128 | ./configuration.nix 129 | ./snowflake.nix 130 | inputs.snowflake.nixosModules.snowflake 131 | inputs.nix-data.nixosModules.\${system}.nix-data 132 | ]; 133 | specialArgs = { inherit inputs; inherit system; }; 134 | }; 135 | }; 136 | } 137 | " 138 | 139 | SNOWFLAKETXT="{ config, pkgs, inputs, system, ... }: 140 | 141 | { 142 | environment.systemPackages = [ 143 | inputs.nix-software-center.packages.\${system}.nix-software-center 144 | inputs.nixos-conf-editor.packages.\${system}.nixos-conf-editor 145 | inputs.snow.packages.\${system}.snow 146 | pkgs.git # For rebuiling with github flakes 147 | ]; 148 | programs.nix-data = { 149 | systemconfig = \"/etc/nixos/configuration.nix\"; 150 | flake = \"/etc/nixos/flake.nix\"; 151 | flakearg = \"snowflakeos\"; 152 | }; 153 | snowflakeos.gnome.enable = true; 154 | snowflakeos.osInfo.enable = true; 155 | } 156 | " 157 | 158 | CFGHEAD="# Edit this configuration file to define what should be installed on 159 | # your system. Help is available in the configuration.nix(5) man page 160 | # and in the NixOS manual (accessible by running ‘nixos-help’). 161 | 162 | { config, pkgs, ... }: 163 | " 164 | 165 | CFGNVIDIAOFFLOAD="let 166 | nvidia-offload = pkgs.writeShellScriptBin \"nvidia-offload\" '' 167 | export __NV_PRIME_RENDER_OFFLOAD=1 168 | export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 169 | export __GLX_VENDOR_LIBRARY_NAME=nvidia 170 | export __VK_LAYER_NV_optimus=NVIDIA_only 171 | exec -a \"\$0\" \"\$@\" 172 | ''; 173 | in 174 | " 175 | 176 | CFGIMPORTS="{ 177 | imports = 178 | [ # Include the results of the hardware scan. 179 | ./hardware-configuration.nix 180 | ]; 181 | 182 | " 183 | CFGBOOTEFI=" # Bootloader. 184 | boot.loader.systemd-boot.enable = true; 185 | boot.loader.efi.canTouchEfiVariables = true; 186 | boot.loader.efi.efiSysMountPoint = \"/boot/efi\"; 187 | 188 | " 189 | 190 | CFGBOOTBIOS=" # Bootloader. 191 | boot.loader.grub.enable = true; 192 | boot.loader.grub.device = \"$DISK\"; 193 | boot.loader.grub.useOSProber = true; 194 | 195 | " 196 | 197 | CFGBOOTCRYPT=" # Setup keyfile 198 | boot.initrd.secrets = { 199 | \"/crypto_keyfile.bin\" = null; 200 | }; 201 | 202 | " 203 | 204 | CFGBOOTGRUBCRYPT=" # Enable grub cryptodisk 205 | boot.loader.grub.enableCryptodisk=true; 206 | 207 | " 208 | 209 | CFGSWAPCRYPT=" # Enable swap on luks 210 | boot.initrd.luks.devices.\"@@swapdev@@\".device = \"/dev/disk/by-uuid/@@swapuuid@@\"; 211 | boot.initrd.luks.devices.\"@@swapdev@@\".keyFile = \"/crypto_keyfile.bin\"; 212 | 213 | " 214 | 215 | CFGKERNEL=" # Use the latest kernel 216 | boot.kernelPackages = pkgs.linuxPackages_latest; 217 | 218 | " 219 | 220 | CFGNVIDIA=" # Use NVIDIA Proprietary drivers 221 | services.xserver.videoDrivers = [ \"nvidia\" ]; 222 | hardware.opengl.extraPackages = with pkgs; [ 223 | vaapiVdpau 224 | ]; 225 | 226 | " 227 | 228 | CFGINTELPRIME=" # Use NVIDIA Prime with NVIDIA Proprietary drivers 229 | hardware.nvidia.modesetting.enable = true; 230 | hardware.nvidia.powerManagement.enable = true; 231 | hardware.nvidia.prime = { 232 | sync.enable = true; 233 | intelBusId = \"PCI:$INTELPCI\"; 234 | nvidiaBusId = \"PCI:$NVIDIAPCI\"; 235 | }; 236 | services.xserver.videoDrivers = [ \"nvidia\" ]; 237 | hardware.opengl.extraPackages = with pkgs; [ 238 | vaapiVdpau 239 | ]; 240 | 241 | " 242 | 243 | CFGAMDPRIME=" # Use NVIDIA Prime with NVIDIA Proprietary drivers 244 | hardware.nvidia.modesetting.enable = true; 245 | hardware.nvidia.powerManagement.enable = true; 246 | hardware.nvidia.prime = { 247 | sync.enable = true; 248 | amdgpuBusId = \"PCI:$AMDPCI\"; 249 | nvidiaBusId = \"PCI:$NVIDIAPCI\"; 250 | }; 251 | services.xserver.videoDrivers = [ \"nvidia\" ]; 252 | hardware.opengl.extraPackages = with pkgs; [ 253 | vaapiVdpau 254 | ]; 255 | 256 | " 257 | 258 | CFGNETWORK=" # Define your hostname. 259 | networking.hostName = \"snowflakeos\"; 260 | 261 | # Enable networking 262 | networking.networkmanager.enable = true; 263 | 264 | " 265 | 266 | CFGTIME=" # Set your time zone. 267 | time.timeZone = \"$OSI_TIMEZONE\"; 268 | 269 | " 270 | 271 | CFGLOCALE=" # Select internationalisation properties. 272 | i18n.defaultLocale = \"$OSI_LOCALE\"; 273 | 274 | " 275 | 276 | CFGLOCALEEXTRAS=" i18n.extraLocaleSettings = { 277 | LC_ADDRESS = \"$OSI_FORMATS\"; 278 | LC_IDENTIFICATION = \"$OSI_FORMATS\"; 279 | LC_MEASUREMENT = \"$OSI_FORMATS\"; 280 | LC_MONETARY = \"$OSI_FORMATS\"; 281 | LC_NAME = \"$OSI_FORMATS\"; 282 | LC_NUMERIC = \"$OSI_FORMATS\"; 283 | LC_PAPER = \"$OSI_FORMATS\"; 284 | LC_TELEPHONE = \"$OSI_FORMATS\"; 285 | LC_TIME = \"$OSI_FORMATS\"; 286 | }; 287 | 288 | " 289 | 290 | CFGKEYMAP=" # Configure keymap in X11 291 | services.xserver = { 292 | layout = \"$KEYBOARD_LAYOUT\"; 293 | xkbVariant = \"$KEYBOARD_VARIANT\"; 294 | }; 295 | console.useXkbConfig = true; 296 | 297 | " 298 | 299 | CFGGNOME=" # Enable the X11 windowing system. 300 | services.xserver.enable = true; 301 | 302 | # Enable the GNOME Desktop Environment. 303 | services.xserver.displayManager.gdm.enable = true; 304 | services.xserver.desktopManager.gnome.enable = true; 305 | 306 | " 307 | 308 | CFGMISC=" # Enable CUPS to print documents. 309 | services.printing.enable = true; 310 | 311 | # Enable sound with pipewire. 312 | sound.enable = true; 313 | hardware.pulseaudio.enable = false; 314 | security.rtkit.enable = true; 315 | services.pipewire = { 316 | enable = true; 317 | alsa.enable = true; 318 | alsa.support32Bit = true; 319 | pulse.enable = true; 320 | }; 321 | 322 | " 323 | 324 | CFGUSERS=" # Define a user account. Don't forget to set a password with ‘passwd’. 325 | users.users.$USERNAME = { 326 | isNormalUser = true; 327 | description = \"$OSI_USER_NAME\"; 328 | extraGroups = [ \"wheel\" \"networkmanager\" \"dialout\" ]; 329 | }; 330 | 331 | " 332 | 333 | CFGAUTOLOGIN=" # Enable automatic login for the user. 334 | services.xserver.displayManager.autoLogin.enable = true; 335 | services.xserver.displayManager.autoLogin.user = $USERNAME; 336 | 337 | " 338 | 339 | CFGAUTOLOGINGDM=" # Workaround for GNOME autologin: https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229 340 | systemd.services.\"getty@tty1\".enable = false; 341 | systemd.services.\"autovt@tty1\".enable = false; 342 | 343 | " 344 | 345 | CFGUNFREE=" # Allow unfree packages 346 | nixpkgs.config.allowUnfree = true; 347 | environment.sessionVariables.NIXPKGS_ALLOW_UNFREE = \"1\"; 348 | 349 | " 350 | 351 | CFGPKGS=" # List packages installed in system profile. 352 | environment.systemPackages = with pkgs; [ 353 | firefox 354 | ]; 355 | 356 | " 357 | 358 | CFGPKGSPRIME=" # List packages installed in system profile. 359 | environment.systemPackages = with pkgs; [ 360 | nvidia-offload 361 | firefox 362 | ]; 363 | 364 | " 365 | 366 | CFGTAIL=" nix.extraOptions = '' 367 | experimental-features = nix-command flakes 368 | ''; 369 | 370 | # This value determines the NixOS release from which the default 371 | # settings for stateful data, like file locations and database versions 372 | # on your system were taken. It‘s perfectly fine and recommended to leave 373 | # this value at the release version of the first install of this system. 374 | # Before changing this value read the documentation for this option 375 | # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 376 | system.stateVersion = \"$NIXOSVER\"; # Did you read the comment? 377 | 378 | } 379 | " 380 | 381 | # Create flake.nix 382 | pkexec sh -c 'echo -n "$0" > /tmp/os-installer/etc/nixos/flake.nix' "$FLAKETXT" 383 | 384 | # Create snowflake.nix 385 | pkexec sh -c 'echo -n "$0" > /tmp/os-installer/etc/nixos/snowflake.nix' "$SNOWFLAKETXT" 386 | 387 | # Create configuration.nix 388 | pkexec sh -c 'echo -n "$0" > /tmp/os-installer/etc/nixos/configuration.nix' "$CFGHEAD" 389 | if [[ $INTELPRIME == 1 || $AMDPRIME == 1 ]] 390 | then 391 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGNVIDIAOFFLOAD" 392 | fi 393 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGIMPORTS" 394 | if [[ -d /sys/firmware/efi/efivars ]] 395 | then 396 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGBOOTEFI" 397 | else 398 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGBOOTBIOS" 399 | fi 400 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGKERNEL" 401 | if [[ $INTELPRIME == 1 ]] 402 | then 403 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGINTELPRIME" 404 | elif [[ $AMDPRIME == 1 ]] 405 | then 406 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGAMDPRIME" 407 | elif [[ $NVIDIA == 1 ]] 408 | then 409 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGNVIDIA" 410 | fi 411 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGNETWORK" 412 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGTIME" 413 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGLOCALE" 414 | if [[ $OSI_LOCALE != $OSI_FORMATS ]] 415 | then 416 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGLOCALEEXTRAS" 417 | fi 418 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGKEYMAP" 419 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGGNOME" 420 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGMISC" 421 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGUSERS" 422 | if [[ $OSI_USER_AUTOLOGIN == 1 ]] 423 | then 424 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGAUTOLOGIN" 425 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGAUTOLOGINGDM" 426 | fi 427 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGUNFREE" 428 | if [[ $INTELPRIME == 1 || $AMDPRIME == 1 ]] 429 | then 430 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGPKGSPRIME" 431 | else 432 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGPKGS" 433 | fi 434 | pkexec sh -c 'echo -n "$0" >> /tmp/os-installer/etc/nixos/configuration.nix' "$CFGTAIL" 435 | 436 | # Install SnowflakeOS 437 | pkexec nixos-install --root /tmp/os-installer --no-root-passwd --no-channel-copy --flake /tmp/os-installer/etc/nixos#snowflakeos 438 | 439 | echo ${USERNAME:1:-1}:$OSI_USER_PASSWORD | pkexec nixos-enter --root /tmp/os-installer -c chpasswd 440 | 441 | echo 442 | echo 'Configuration completed.' 443 | 444 | exit 0 445 | -------------------------------------------------------------------------------- /scripts/install.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | set -e 3 | # The script gets called with the following environment variables set: 4 | # OSI_LOCALE : Locale to be used in the new system 5 | # OSI_DEVICE_PATH : Device path at which to install 6 | # OSI_DEVICE_IS_PARTITION : 1 if the specified device is a partition (0 -> disk) 7 | # OSI_DEVICE_EFI_PARTITION: Set if device is partition and system uses EFI boot. 8 | # OSI_USE_ENCRYPTION : 1 if the installation is to be encrypted 9 | # OSI_ENCRYPTION_PIN : The encryption pin to use (if encryption is set) 10 | 11 | # sanity check that all variables were set 12 | if [ -z ${OSI_LOCALE+x} ] || \ 13 | [ -z ${OSI_DEVICE_PATH+x} ] || \ 14 | [ -z ${OSI_DEVICE_IS_PARTITION+x} ] || \ 15 | [ -z ${OSI_DEVICE_EFI_PARTITION+x} ] || \ 16 | [ -z ${OSI_USE_ENCRYPTION+x} ] || \ 17 | [ -z ${OSI_ENCRYPTION_PIN+x} ] 18 | then 19 | echo "Installer script called without all environment variables set!" 20 | exit 1 21 | fi 22 | 23 | echo 'Installation started.' 24 | echo '' 25 | echo 'Variables set to:' 26 | echo 'OSI_LOCALE ' $OSI_LOCALE 27 | echo 'OSI_DEVICE_PATH ' $OSI_DEVICE_PATH 28 | echo 'OSI_DEVICE_IS_PARTITION ' $OSI_DEVICE_IS_PARTITION 29 | echo 'OSI_DEVICE_EFI_PARTITION ' $OSI_DEVICE_EFI_PARTITION 30 | echo 'OSI_USE_ENCRYPTION ' $OSI_USE_ENCRYPTION 31 | echo 'OSI_ENCRYPTION_PIN ' $OSI_ENCRYPTION_PIN 32 | echo '' 33 | 34 | # Pretending to do something 35 | DEV=$OSI_DEVICE_PATH 36 | if [[ $OSI_DEVICE_IS_PARTITION == 1 ]] 37 | then 38 | echo 'Device is partition' 39 | DISK=$(lsblk $DEV -npdbro pkname) 40 | START=$(lsblk $DEV -npdbro START) 41 | SIZE=$[ $(lsblk $DEV -npdbro SIZE) / 512 ] #blockdev --getsz /dev/sda 42 | END=$[ START + SIZE - 1 ] 43 | echo 'Disk is' $DISK 44 | echo 'Start is' $START 45 | echo 'Size is' $SIZE 46 | echo 'End is' $END 47 | 48 | if [ -d /sys/firmware/efi/efivars/ ] 49 | then 50 | EFIPART=$(lsblk $DISK -npo PATH,PARTTYPENAME | grep "EFI System" | head -n 1 | awk '{print $1}') 51 | if [ -z $EFIPART ] 52 | then 53 | echo 'No EFI partition found on disk' 54 | ( 55 | # Remove current partition 56 | echo d 57 | echo $DEV | awk '{print substr($0,length,1)}' 58 | echo p 59 | # EFI partition 60 | echo n 61 | echo 62 | echo $START 63 | echo +512M 64 | echo EF00 65 | echo p 66 | # Root partition 67 | echo n 68 | echo 69 | echo $[ START + 536870912/512 + 1 ] 70 | echo $[ END - 4294967296/512 ] 71 | echo 72 | echo p 73 | # Swap partition 74 | echo n 75 | echo 76 | echo $[ END - 4294967296/512 + 1 ] 77 | echo $END 78 | echo 8200 79 | echo p 80 | # Write changes 81 | echo w 82 | echo y 83 | ) | pkexec gdisk $DISK 84 | sleep 1 85 | EFIPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'EFI\\x20System') 86 | echo 'INITIAL EFIPART' $EFIPART 87 | while IFS= read -r line; do 88 | LINESTART=$(echo -E $line | awk '{print $3}') 89 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 90 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE - 1 ] -le $END ]] 91 | then 92 | EFIPART=$(echo -E $line | awk '{print $1}') 93 | break 94 | fi 95 | done <<< "$EFIPART" 96 | FSPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'Linux\\x20filesystem') 97 | while IFS= read -r line; do 98 | LINESTART=$(echo -E $line | awk '{print $3}') 99 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 100 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE -1 ] -le $END ]] 101 | then 102 | FSPART=$(echo -E $line | awk '{print $1}') 103 | break 104 | fi 105 | done <<< "$FSPART" 106 | SWAPPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'Linux\\x20swap') 107 | while IFS= read -r line; do 108 | LINESTART=$(echo -E $line | awk '{print $3}') 109 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 110 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE -1 ] -le $END ]] 111 | then 112 | SWAPPART=$(echo -E $line | awk '{print $1}') 113 | break 114 | fi 115 | done <<< "$SWAPPART" 116 | if [ -z ${EFIPART+x} ] || [ -z ${FSPART+x} ] || [ -z ${SWAPPART+x} ] 117 | then 118 | echo 'EFI, root or swap partition not found' 119 | exit 1 120 | else 121 | pkexec mkfs.fat -F32 $EFIPART 122 | pkexec mkfs.ext4 -F $FSPART 123 | pkexec mkswap $SWAPPART 124 | fi 125 | else 126 | echo 'EFI partition is' $EFIPART 127 | ( 128 | # Remove current partition 129 | echo d 130 | echo $DEV | awk '{print substr($0,length,1)}' 131 | echo p 132 | # Root partition 133 | echo n 134 | echo 135 | echo $START 136 | echo $[ END - 4294967296/512 ] 137 | echo 138 | echo p 139 | # Swap partition 140 | echo n 141 | echo 142 | echo $[ END - 4294967296/512 + 1] 143 | echo $END 144 | echo 8200 145 | echo p 146 | # Write changes 147 | echo w 148 | echo y 149 | ) | pkexec gdisk $DISK 150 | sleep 1 151 | FSPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'Linux\\x20filesystem') 152 | while IFS= read -r line; do 153 | LINESTART=$(echo -E $line | awk '{print $3}') 154 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 155 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE - 1 ] -le $END ]] 156 | then 157 | FSPART=$(echo -E $line | awk '{print $1}') 158 | break 159 | fi 160 | done <<< "$FSPART" 161 | SWAPPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'Linux\\x20swap') 162 | while IFS= read -r line; do 163 | LINESTART=$(echo -E $line | awk '{print $3}') 164 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 165 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE -1 ] -le $END ]] 166 | then 167 | SWAPPART=$(echo -E $line | awk '{print $1}') 168 | break 169 | fi 170 | done <<< "$SWAPPART" 171 | if [ -z ${EFIPART+x} ] || [ -z ${FSPART+x} ] || [ -z ${SWAPPART+x} ] 172 | then 173 | echo 'EFI, root or swap partition not found' 174 | exit 1 175 | else 176 | pkexec mkfs.ext4 -F $FSPART 177 | pkexec mkswap $SWAPPART 178 | fi 179 | fi 180 | else 181 | echo 'Device is in BIOS mode' 182 | ( 183 | # Remove current partition 184 | echo d 185 | echo $DEV | awk '{print substr($0,length,1)}' 186 | echo p 187 | # Root partition 188 | echo n 189 | echo #primary 190 | echo #partition number 191 | echo $START 192 | echo $[ END - 4294967296/512 ] 193 | echo p 194 | # Swap partition 195 | echo n 196 | echo #primary 197 | echo #partition number 198 | echo $[ END - 4294967296/512 + 1] 199 | echo $END 200 | echo p 201 | # Write changes 202 | echo w 203 | ) | pkexec fdisk $DISK -W always 204 | sleep 1 205 | FSPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'Linux') 206 | while IFS= read -r line; do 207 | LINESTART=$(echo -E $line | awk '{print $3}') 208 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 209 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE - 1 ] -le $END ]] 210 | then 211 | FSPART=$(echo -E $line | awk '{print $1}') 212 | break 213 | fi 214 | done <<< "$FSPART" 215 | SWAPPART=$(lsblk $DISK -npbro PATH,PARTTYPENAME,START,SIZE | grep 'Linux') 216 | while IFS= read -r line; do 217 | LINESTART=$(echo -E $line | awk '{print $3}') 218 | LINESIZE=$[ $(echo -E $line | awk '{print $4}') / 512 ] 219 | if [[ $LINESTART -ge $START && $[ LINESTART + LINESIZE -1 ] -le $END && $(echo -E $line | awk '{print $1}') != $FSPART ]] 220 | then 221 | SWAPPART=$(echo -E $line | awk '{print $1}') 222 | break 223 | fi 224 | done <<< "$SWAPPART" 225 | echo 'Filesystem partition is' $FSPART 226 | echo 'Swap partition is' $SWAPPART 227 | if [ -z ${FSPART+x} ] || [ -z ${SWAPPART+x} ] 228 | then 229 | echo 'Root or swap partition not found' 230 | exit 1 231 | else 232 | pkexec sfdisk --part-type $DISK $(echo $SWAPPART | awk '{print substr($0,length,1)}') 82 233 | pkexec mkfs.ext4 -F $FSPART 234 | pkexec mkswap $SWAPPART 235 | fi 236 | fi 237 | else 238 | if [ -d /sys/firmware/efi/efivars/ ] 239 | then 240 | echo 'EFI mode' 241 | ( 242 | # GPT partition table 243 | echo o 244 | echo y 245 | # EFI partition 246 | echo n 247 | echo 248 | echo 249 | echo +512M 250 | echo EF00 251 | # Root partition 252 | echo n 253 | echo 254 | echo 255 | echo -4G 256 | echo 257 | # Swap partition 258 | echo n 259 | echo 260 | echo 261 | echo 262 | echo 8200 263 | # Write changes 264 | echo w 265 | echo y 266 | ) | pkexec gdisk $DEV 267 | sleep 1 268 | EFIPART=$(lsblk $DEV -npbro PATH,PARTTYPENAME | grep 'EFI\\x20System' | head -n 1 | awk '{print $1}') 269 | FSPART=$(lsblk $DEV -npbro PATH,PARTTYPENAME | grep 'Linux\\x20filesystem' | head -n 1 | awk '{print $1}') 270 | SWAPPART=$(lsblk $DEV -npbro PATH,PARTTYPENAME | grep 'Linux\\x20swap' | head -n 1 | awk '{print $1}') 271 | echo "EFI partition is $EFIPART" 272 | echo "Root partition is $FSPART" 273 | echo "Swap partition is $SWAPPART" 274 | if [ -z ${EFIPART+x} ] || [ -z ${FSPART+x} ] || [ -z ${SWAPPART+x} ] 275 | then 276 | echo 'EFI, root or swap partition not found' 277 | exit 1 278 | else 279 | pkexec mkfs.fat -F32 $EFIPART 280 | pkexec mkfs.ext4 -F $FSPART 281 | pkexec mkswap $SWAPPART 282 | fi 283 | else 284 | echo 'Device is in BIOS mode' 285 | ( 286 | # MSDOS partition table 287 | echo o 288 | # Root partition 289 | echo n 290 | echo #primary 291 | echo #part number 292 | echo #start 293 | echo -4G 294 | # Swap partition 295 | echo n 296 | echo #primary 297 | echo #part number 298 | echo #start 299 | echo #end 300 | echo t 301 | echo 2 302 | echo swap 303 | # Write changes 304 | echo w 305 | ) | pkexec fdisk $DEV -W always 306 | sleep 1 307 | FSPART=$(lsblk $DEV -npbro PATH,PARTTYPENAME | grep 'Linux' | head -n 1 | awk '{print $1}') 308 | SWAPPART=$(lsblk $DEV -npbro PATH,PARTTYPENAME | grep 'Linux\\x20swap\\x20/\\x20Solaris' | head -n 1 | awk '{print $1}') 309 | echo "Root partition is $FSPART" 310 | echo "Swap partition is $SWAPPART" 311 | if [ -z ${FSPART+x} ] || [ -z ${SWAPPART+x} ] 312 | then 313 | echo 'Root or swap partition not found' 314 | exit 1 315 | else 316 | pkexec mkfs.ext4 -F $FSPART 317 | pkexec mkswap $SWAPPART 318 | fi 319 | fi 320 | fi 321 | 322 | echo 'Mounting partitions...' 323 | if [ -d /sys/firmware/efi/efivars/ ] 324 | then 325 | echo 'EFI partition is' $EFIPART 326 | fi 327 | echo 'Filesystem partition is' $FSPART 328 | echo 'Swap partition is' $SWAPPART 329 | pkexec rm -rf /tmp/os-installer 330 | pkexec mkdir -p /tmp/os-installer 331 | pkexec mount $FSPART /tmp/os-installer 332 | if [ -d /sys/firmware/efi/efivars/ ] 333 | then 334 | pkexec mkdir -p /tmp/os-installer/boot/efi 335 | pkexec mount $EFIPART /tmp/os-installer/boot/efi 336 | fi 337 | pkexec swapon $SWAPPART 338 | pkexec nixos-generate-config --root /tmp/os-installer 339 | 340 | echo 341 | echo 'Partitioning and mounting completed.' 342 | 343 | exit 0 344 | -------------------------------------------------------------------------------- /scripts/prepare.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # The script gets called when an active internet connection was established. 4 | 5 | echo 'Preparation started.' 6 | echo 7 | echo 'Preparation completed.' 8 | 9 | exit 0 10 | --------------------------------------------------------------------------------