├── .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 |
--------------------------------------------------------------------------------