51 Commits
Author SHA1 Message Date
marc 3ba50bb195 fix 1 to 4 2023-06-28 16:06:58 +00:00
marc 9428bb3263 disable boot pool encryption 2023-06-28 14:07:12 +00:00
marc 54c95c7a6f zpool destroy -f 2023-06-28 13:13:30 +00:00
marc 0733ee3106 Swapoff 2023-06-28 13:11:25 +00:00
marc 7f438f4451 Encrypt pools back and force import zfs pools 2023-06-28 13:09:14 +00:00
marc 5abb237b6c fix efi partition number 2023-06-27 23:08:29 +00:00
marc ab10481652 test without zpool encryption 2023-06-27 22:19:42 +00:00
marc 4d6c98e75b abcd1234 2023-06-27 11:18:48 +00:00
marc efb53cd066 networking nixos host 2023-06-27 11:07:15 +00:00
marc dafd939d12 nixos host in flake 2023-06-27 11:06:16 +00:00
marc bcaa17d9d2 sh -> bash 2023-06-27 11:01:47 +00:00
marc 165bbdf8d3 import nixos host 2023-06-27 11:00:58 +00:00
marc cd180ce627 forgot to enable flakes 2023-06-27 10:30:46 +00:00
marc 7278b18607 fix for 2023-06-27 10:29:33 +00:00
marc 92b956fb1c import destroy export 2023-06-27 10:28:36 +00:00
marc ae8fa6e247 zpool labelclear 2023-06-27 10:26:56 +00:00
marc 367e9c0e3e destroying pools just in case 2023-06-27 10:24:45 +00:00
marc e7bf496f7a Unmount filesystems first just in case 2023-06-27 10:10:53 +00:00
marc 4b6997de33 antislash 2023-06-27 10:08:37 +00:00
marc c00627a811 SWAPSIZEGIB 2023-06-27 10:05:52 +00:00
marc a370b53f1d SWAPSIZE + 1 2023-06-27 10:05:07 +00:00
marc e1aa52a77e reserve + 1 2023-06-27 09:53:07 +00:00
marc 7b89415746 reservergib 2023-06-27 09:51:03 +00:00
marc 903a969d76 password input 2023-06-27 09:47:37 +00:00
marc 7a1de01ef3 exampleHost -> nixos 2023-06-27 09:45:31 +00:00
marc 8068bb1d81 no exit 2023-06-27 09:43:31 +00:00
marc f7e9f335e4 fix it for real 2023-06-27 10:46:26 +02:00
marc 5580032733 fix link in readme.org 2023-06-27 10:45:46 +02:00
marc 1cd6bd6cfc readme.org 2023-06-27 10:44:27 +02:00
marc 58606b8306 fix readme again 2023-06-27 10:43:55 +02:00
marc 4605a97544 fix 2023-06-27 10:43:21 +02:00
marc c798df9b55 readme 2023-06-27 10:42:51 +02:00
marc 5a168dab3e nixos host instead of exampleHost 2023-06-27 10:35:43 +02:00
marc 04260a676b no part in boot module 2023-06-27 10:31:37 +02:00
marc 131f3820dd install script 2023-06-27 10:29:45 +02:00
Maurice Zhou 35bb9dbe17 upgrade to nixos-23.05 stable
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-06-01 08:53:30 +02:00
Maurice Zhou 93f9b65c03 rm grub version
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-05-16 19:52:43 +02:00
Maurice Zhou 06b5564bc1 update to 23.05
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-05-16 19:16:31 +02:00
Maurice Zhou acffac3adf add link to example
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-24 10:47:25 +02:00
Maurice Zhou 097da98b35 add custom module template
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-22 08:07:12 +02:00
Maurice Zhou 60a713eb95 use kernelModules placeholder
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-19 14:05:06 +02:00
Maurice Zhou 19f86677d5 show debug info while mirroring efi boot loader
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-11 10:37:05 +02:00
Maurice Zhou ec295de0f4 pin to known good version
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-10 23:48:39 +02:00
Maurice Zhou db3c673a5f removable efi can not be tested in vm
Revert "turn off removableefi"

This reverts commit d6efac769e.
2023-04-09 20:18:39 +02:00
Maurice Zhou d6efac769e turn off removableefi
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-09 20:08:53 +02:00
Maurice Zhou ae5bd60194 add warning for mkpasswd
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-09 15:13:53 +02:00
Maurice Zhou 95cc3f34dd use coreutils-full
Signed-off-by: Maurice Zhou <yuchen@apvc.uk>
2023-04-07 18:29:54 +02:00
Maurice Zhou e62b4436e5 explicitly enable DHCP
Signed-off-by: Maurice Zhou <jasper@apvc.uk>
2023-04-05 12:51:43 +02:00
Maurice Zhou 802103921e fix users.users attrset name
Signed-off-by: Maurice Zhou <jasper@apvc.uk>
2023-04-05 12:11:41 +02:00
Maurice Zhou aa0a76aed2 use upstream user settings
Signed-off-by: Maurice Zhou <jasper@apvc.uk>
2023-04-05 11:33:36 +02:00
Maurice Zhou 74a8c0cc40 init
Signed-off-by: Maurice Zhou <jasper@apvc.uk>
2023-04-04 18:38:55 +02:00
14 changed files with 293 additions and 541 deletions
+8 -7
View File
@@ -1,4 +1,4 @@
* Minimal NixOS Root on ZFS configuration
* Minimal installer for NixOS using ZFS encrypted root
This repo contains a minimal set of configuration needed for
installing NixOS on a computer with ZFS as root filesystem.
@@ -8,17 +8,18 @@ LICENSE
configuration.nix <- configuration shared by all hosts
flake.lock
flake.nix
hosts/exampleHost/default.nix <- per-host configuration
hosts/exampleHost/sshUnlock.txt
hosts/nixos/default.nix <- per-host configuration
hosts/nixos/sshUnlock.txt
modules/boot/default.nix
modules/default.nix
modules/fileSystems/default.nix
modules/networking/default.nix
modules/users/default.nix
#+end_src
#+end_src text
Just enough to get you started.
See [[https://github.com/ne9z/personal-dotfiles][my personal dotfiles repo]] for an example of how to configure
* Thanks to
See [[https://github.com/ne9z/personal-dotfiles][ne9z dotfiles repo]] for an example of how to configure
servers and desktop computers in the same git repository, based on
this template repo you are viewing now.
[[https://openzfs.github.io/openzfs-docs/Getting%20Started/NixOS/Root%20on%20ZFS.html][Official Tutorial]]
+14 -381
View File
@@ -1,16 +1,4 @@
{
my-config, zfs-root, inputs, pkgs, lib, ...
}:
let
kubeMasterIP = "10.1.1.2";
kubeMasterHostname = "api.kube";
kubeMasterAPIServerPort = 6443;
# tokyo-night-sddm = pkgs.libsForQt5.callPackage ./themes/tokyo-night-sddm.nix { };
sddm-peace-color = pkgs.libsForQt5.callPackage ./themes/sddm-peace-color.nix { };
# sddm-apple = pkgs.libsForQt5.callPackage ./themes/sddm-apple.nix { };
unstable = import <nixpkgs-unstable> { config.allowUnfree = true; };
in
{
{ my-config, zfs-root, inputs, pkgs, lib, ... }: {
# load module config to top-level configuration
inherit my-config zfs-root;
@@ -21,160 +9,17 @@ in
else
throw "refuse to build: git tree is dirty";
system.stateVersion = "23.11";
# system.activationScripts = {
# enableLingering = ''
# # remove all existing lingering users
# rm -r /var/lib/systemd/linger
# mkdir /var/lib/systemd/linger
# # enable for the subset of declared users
# touch /var/lib/systemd/linger/marc
# '';
# };
# config.systemd.user.services.nixos-activation.unitConfig.ConditionUser = mkForce
# [
# "!@system"
# "!marc"
# ];
boot.zfs.forceImportRoot = lib.mkDefault false;
# boot.loader.systemd-boot.enable = true;
boot.initrd.systemd.enable = true;
# boot.loader.efi.canTouchEfiVariables = true;
boot.plymouth.enable = true;
boot.plymouth.theme = "breeze";
virtualisation.docker.enable = true;
system.stateVersion = "22.11";
# Enable NetworkManager for wireless networking,
# You can configure networking with "nmtui" command.
# networking.useDHCP = true;
networking.hostName = "tower";
networking.networkmanager.enable = true;
networking.wireless.iwd.enable = true;
networking.networkmanager.wifi.backend = "iwd";
services = {
# plex = {
# enable = true;
# dataDir = "/var/lib/plex";
# openFirewall = true;
# user = "plex";
# group = "plex";
# };
# hardware.pulseaudio.enable = true;
# services.transmission.settings = {
# download-dir = "${config.services.transmission.home}/Downloads";
# };
pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
jack.enable = true;
pulse.enable = true;
socketActivation = true;
};
# Enable the X11 windowing system.
xserver = {
enable = true;
layout = "us";
videoDrivers = [ "amdgpu" ];
# windowManager.i3.enable = true;
desktopManager.plasma5.enable = true;
desktopManager.xterm.enable = true;
displayManager = {
defaultSession = "hyprland";
# autoLogin = {
# enable = true;
# user = "marc";
# };
sddm = {
enable = false;
# wayland.enable = true;
# theme = "sddm-apple";
theme = "sddm-peace-color";
};
lightdm = {
enable = false;
# greeter.enable = true; fonts
};
gdm.enable = true;
session = [
# {
# manage = "desktop";
# name = "xterm";
# start = ''
# ${pkgs.xterm}/bin/xterm -ls &
# waitPID=$!
# '';
# }
{
manage = "desktop";
name = "firefox";
start = ''
${pkgs.firefox}/bin/firefox &
waitPID=$!
'';
}
];
};
};
openssh = {
enable = lib.mkDefault true;
settings = { PasswordAuthentication = lib.mkDefault true; };
};
};
hardware.bluetooth.enable = true;
# amd support with vulkan
hardware.opengl.driSupport = true;
hardware.opengl.extraPackages = with pkgs; [
rocm-opencl-icd
rocm-opencl-runtime
amdvlk
];
fonts.packages = with pkgs; [
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
liberation_ttf
fira-code
fira-code-symbols
mplus-outline-fonts.githubRelease
dina-font
proggyfonts
source-code-pro
];
# services.xserver.enable = true;
# services.xserver.displayManager.gdm.enable = true;
programs.hyprland.enable = true;
programs.dconf.enable = true; # apply gtk themes in wayland apps
networking.useDHCP = true;
networking.networkmanager.enable = false;
users.users = {
root = {
isNormalUser = false;
shell = pkgs.zsh;
initialHashedPassword = "$6$0QAYnBqAJtqB12p3$2lb7rAS2sYw49GUJt0L0bAEpZJSv4HZARQjlbYPhexSmeRB71IRMBzXjf3b4rX6fuDxOuDLydP/Kni9uraS5j/";
openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDiUE73uIEgijfmSsDwBvZmecQnqjBUPRKlMDmevsThc1YJNWEHl57NNIUcx6XSCDPKu5azayImLqIBt8wT5xlqtNX20uCnikDfXZ8gFbGlMRTGZKutQZIRmUrUS5mz97S4dVVK+n5WU+OwOfEg/XKXPh4WbTVDpfTTg7RopRAXkma56HV2TJM0ndPRN8VLmBmtnwdQwEpJ0tRRY+KOHmTojsH65eaZ89+BHbto+Kg+lk6x8IH5VDCRQNHgTEccOpOGYBSHRpoZi1a5h3yajf/eGAQ9Cd38DOsfMtm84oFlii7oXPyxwXoM+uH1SDnvLXyheIrV/XLUurSbEb4aJni6Zu79Z9l8xHhUNmVNSZqWOWUvPbAHlDKUzsbxgk9Zs9OTvSDaRzGhViYl4e1Qc993yerGSW1HHIvYUKM7o5nSQqskSOvOI+ahL5fIbgdyVx4FeuURZIyZSxCz4jIJTK15/6pkT/miHKv+vmQhsoLCqgyXY4SG1p9ruzKkzBe03ZQVW5WeFDLYRjZ+Z4Q2IL2K3BmLgp8tInkPJizQ7v5UGSiajJmPxY0j+CqdH9ZlIBdf8GS+run/N4hpMC1/ayUZRbCY5jg4c8bev8dKEZYJKPs/Hq2zLRZe4YtxcKuiGhgIwQOzo/QrCvSM4pVDgo+d2DjEzIdapqE8hF6BHWDg/w== marc.partensky@gmail.com" ];
};
marc = {
isNormalUser = true;
home = "/home/marc";
description = "Marc Partensky";
extraGroups = ["wheel" "networkmanager" "docker" "seat" "kvm" "video"];
# openssh.authorizedKeys.keys =
shell = pkgs.zsh;
initialHashedPassword = "$6$0QAYnBqAJtqB12p3$2lb7rAS2sYw49GUJt0L0bAEpZJSv4HZARQjlbYPhexSmeRB71IRMBzXjf3b4rX6fuDxOuDLydP/Kni9uraS5j/";
openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDiUE73uIEgijfmSsDwBvZmecQnqjBUPRKlMDmevsThc1YJNWEHl57NNIUcx6XSCDPKu5azayImLqIBt8wT5xlqtNX20uCnikDfXZ8gFbGlMRTGZKutQZIRmUrUS5mz97S4dVVK+n5WU+OwOfEg/XKXPh4WbTVDpfTTg7RopRAXkma56HV2TJM0ndPRN8VLmBmtnwdQwEpJ0tRRY+KOHmTojsH65eaZ89+BHbto+Kg+lk6x8IH5VDCRQNHgTEccOpOGYBSHRpoZi1a5h3yajf/eGAQ9Cd38DOsfMtm84oFlii7oXPyxwXoM+uH1SDnvLXyheIrV/XLUurSbEb4aJni6Zu79Z9l8xHhUNmVNSZqWOWUvPbAHlDKUzsbxgk9Zs9OTvSDaRzGhViYl4e1Qc993yerGSW1HHIvYUKM7o5nSQqskSOvOI+ahL5fIbgdyVx4FeuURZIyZSxCz4jIJTK15/6pkT/miHKv+vmQhsoLCqgyXY4SG1p9ruzKkzBe03ZQVW5WeFDLYRjZ+Z4Q2IL2K3BmLgp8tInkPJizQ7v5UGSiajJmPxY0j+CqdH9ZlIBdf8GS+run/N4hpMC1/ayUZRbCY5jg4c8bev8dKEZYJKPs/Hq2zLRZe4YtxcKuiGhgIwQOzo/QrCvSM4pVDgo+d2DjEzIdapqE8hF6BHWDg/w== marc.partensky@gmail.com" ];
initialHashedPassword = "rootHash_placeholder";
openssh.authorizedKeys.keys = [ "sshKey_placeholder" ];
};
};
@@ -189,238 +34,26 @@ in
# "${inputs.nixpkgs}/nixos/modules/profiles/qemu-guest.nix"
];
nixpkgs = {
config = {
allowUnfree = true;
packageOverrides = pkgs: {
unstable = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz") {};
};
};
services.openssh = {
enable = lib.mkDefault true;
settings = { PasswordAuthentication = lib.mkDefault false; };
};
# kubernetes https://nixos.wiki/wiki/K3s
networking.firewall.allowedTCPPorts = [ 6443 5900 ];
# services.k3s = {
# enable = true;
# role = "server";
# # TODO describe how to enable zfs snapshotter in containerd
# extraFlags = toString [
# "--container-runtime-endpoint unix:///run/containerd/containerd.sock"
# ];
# };
# kubernetes zfs support
# virtualisation.containerd = {
# enable = true;
# settings =
# let
# fullCNIPlugins = pkgs.buildEnv {
# name = "full-cni";
# paths = with pkgs;[
# cni-plugins
# cni-plugin-flannel
# ];
# };
# in {
# plugins."io.containerd.grpc.v1.cri".cni = {
# bin_dir = "${fullCNIPlugins}/bin";
# conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d/";
# };
# };
# };
# kubernetes support
# resolve master hostname
# networking.extraHosts = "${kubeMasterIP} ${kubeMasterHostname}";
# services.kubernetes = {
# roles = ["master" "node"];
# masterAddress = kubeMasterHostname;
# apiserverAddress = "https://${kubeMasterHostname}:${toString kubeMasterAPIServerPort}";
# easyCerts = true;
# apiserver = {
# securePort = kubeMasterAPIServerPort;
# advertiseAddress = kubeMasterIP;
# };
# # use coredns
# addons.dns.enable = true;
# # needed if you use swap
# kubelet.extraOpts = "--fail-swap-on=false";
# };
boot.zfs.forceImportRoot = lib.mkDefault false;
nix.settings.experimental-features = lib.mkDefault [ "nix-command" "flakes" ];
programs.git.enable = true;
programs.zsh.enable = true;
security = {
doas.enable = lib.mkDefault true;
sudo.enable = lib.mkDefault false;
};
nix = {
package = pkgs.nixFlakes;
extraOptions = ''
experimental-features = nix-command flakes
'';
};
# systemd.services.tunneltower = {
# enable = true;
# description = "Connect to my tower remotely";
# unitConfig = {
# # Type = "simple";
# };
# serviceConfig = {
# ExecStart = ''
# ${pkgs.autossh}/bin/autossh -M 0 \
# -o ServerAliveInterval=30 \
# -o ServerAliveCountMax=3 \
# -o PubkeyAuthentication=yes \
# -o PasswordAuthentication=no \
# -NR localhost:42070:localhost:22 \
# -p 42069 \
# -i ~/.ssh/id_rsa \
# marc@207.180.235.56
# '';
# };
# wantedBy = [ "multi-user.target" ];
# };
boot.kernelParams = [
"i915.enable_psr=0"
];
powerManagement.enable = false;
systemd.targets.sleep.enable = false;
systemd.targets.suspend.enable = false;
systemd.targets.hibernate.enable = false;
systemd.targets.hybrid-sleep.enable = false;
services.xserver.displayManager.gdm.autoSuspend = false;
environment.etc."systemd/sleep.conf".text = ''
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
#SuspendMode=
#SuspendState=mem standby freeze
#HibernateMode=platform shutdown
#HibernateState=disk
#HybridSleepMode=suspend platform shutdown
#HybridSleepState=disk
#HibernateDelaySec=180min
'';
systemd.timers.tunneltower = {
wantedBy = [ "timers.target" ];
timerConfig = {
# OnBootSec = "1d";
# OnUnitActiveSec = "1d";
Unit = "tunneltower";
Persistent = true;
# OnCalendar = "*-*-* 5:00:00";
OnBootSec="15min";
OnUnitActiveSec="1d";
};
};
#
# environment.systemPackages = builtins.attrValues {
# inherit (pkgs)
# k3s
# autossh
# jq # other programs
# neovim
# stow
# coreutils
# gnumake
# bat
# gnupg
# nome-manager
# htop
# kompose
# kubectl
# kubernetes
# killall
# seatd
# mcfly
# sddm
# # tokyo-night-sddm
# ;
# };
environment.systemPackages = with pkgs;
[
k3s
autossh
environment.systemPackages = builtins.attrValues {
inherit (pkgs)
mg # emacs-like editor
jq # other programs
neovim
stow
coreutils
gnumake
bat
gnupg
home-manager
htop
kompose
kubectl
kubernetes
killall
seatd
mcfly
sddm
sddm-peace-color
# sddm-apple
sddm-kcm
transmission-gtk
xterm
alacritty
p7zip
# unstable.alacritty
# plasma-desktop
# plasma-workspace
# plasma-workspace-wallpapers
# tokyo-night-sddm
# sddm-theme-dialog
# (callPackage ./themes/sddm-theme-dialog.nix {}).sddm-theme-dialog
];
i18n.defaultLocale = "fr_FR.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "fr_FR.UTF-8";
LC_IDENTIFICATION = "fr_FR.UTF-8";
LC_MEASUREMENT = "fr_FR.UTF-8";
LC_MONETARY = "fr_FR.UTF-8";
LC_NAME = "fr_FR.UTF-8";
LC_NUMERIC = "fr_FR.UTF-8";
LC_PAPER = "fr_FR.UTF-8";
LC_TELEPHONE = "fr_FR.UTF-8";
LC_TIME = "fr_FR.UTF-8";
};
environment.sessionVariables = {
# POLKIT_AUTH_AGENT = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
# GSETTINGS_SCHEMA_DIR = "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}/glib-2.0/schemas";
# LIBVA_DRIVER_NAME = "nvidia";
# XDG_SESSION_TYPE = "wayland";
# GBM_BACKEND = "nvidia-drm";
# __GLX_VENDOR_LIBRARY_NAME = "nvidia";
# WLR_NO_HARDWARE_CURSORS = "1";
# NIXOS_OZONE_WL = "1";
# MOZ_ENABLE_WAYLAND = "1";
# SDL_VIDEODRIVER = "wayland";
# _JAVA_AWT_WM_NONREPARENTING = "1";
# CLUTTER_BACKEND = "wayland";
# WLR_RENDERER = "vulkan";
# XDG_CURRENT_DESKTOP = "Hyprland";
# XDG_SESSION_DESKTOP = "Hyprland";
# GTK_USE_PORTAL = "1";
# NIXOS_XDG_OPEN_USE_PORTAL = "1";
;
};
}
Generated
+4 -4
View File
@@ -2,16 +2,16 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1714253743,
"narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=",
"lastModified": 1685533922,
"narHash": "sha256-y4FCQpYafMQ42l1V+NUrMel9RtFtZo59PzdzflKR/lo=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994",
"rev": "3a70dd92993182f8e514700ccf5b1ae9fc8a3b8d",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"ref": "nixos-23.05",
"repo": "nixpkgs",
"type": "github"
}
+4 -4
View File
@@ -1,7 +1,7 @@
{
# inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11";
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-23.05";
## after reboot, you can track rolling release by using
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
#inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }@inputs:
let
@@ -18,10 +18,10 @@
};
in {
nixosConfigurations = {
tower = let
nixos = let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in mkHost (import ./hosts/tower { inherit system pkgs; });
in mkHost (import ./hosts/nixos { inherit system pkgs; });
};
};
}
@@ -1,6 +1,6 @@
# #
##
## per-host configuration for exampleHost
## per-host configuration for nixos host
##
##
@@ -8,10 +8,10 @@
inherit pkgs system;
zfs-root = {
boot = {
devNodes = "/dev/";
bootDevices = [ "nvme0n1" ];
devNodes = "/dev/disk/by-id/";
bootDevices = [ "bootDevices_placeholder" ];
immutable = false;
availableKernelModules = [ "nvme" "xhci_pci" "usbhid" "usb_storage" "sd_mod" ];
availableKernelModules = [ "kernelModules_placeholder" ];
removableEfi = true;
kernelParams = [ ];
sshUnlock = {
@@ -22,9 +22,9 @@
};
networking = {
# read changeHostName.txt file.
hostName = "tower";
hostName = "nixos";
timeZone = "Europe/Paris";
hostId = "97a4a6a0";
hostId = "abcd1234";
};
};
Executable
+251
View File
@@ -0,0 +1,251 @@
#!/bin/env bash
lsblk
echo ""
read -p "disk: " DISK
read -p "swapsize GiB: " SWAPSIZEGIB
read -p "reserve GiB: " RESERVEGIB
read -sp "password: " POOLPASS
EMAIL="marc@marcpartensky.com"
NAME="Marc Partensky"
RESERVE=$((RESERVEGIB * 1024))
SWAPSIZE=$((SWAPSIZEGIB * 1024))
MNT=$(mktemp -d)
log() { echo -e "\n\033[1m${@}\033[0m"; }
log Destroying zfs pool rpool and bpool just in case
swapoff -a
zpool import -fa
for i in ${DISK}; do
zpool labelclear -f $i
done
zpool destroy -f bpool
zpool destroy -f rpool
zpool export -a
log Unmounting filesystems just in case
# ---
umount -Rl "${MNT}"
log Enabling Nix Flakes functionality
# ---
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
log Installing programs needed for system installation
# ---
if ! command -v git; then nix-env -f '<nixpkgs>' -iA git; fi
if ! command -v jq; then nix-env -f '<nixpkgs>' -iA jq; fi
if ! command -v partprobe; then nix-env -f '<nixpkgs>' -iA parted; fi
log Partition the disks
# ---
partition_disk () {
local disk="${1}"
blkdiscard -f "${disk}" || true
parted --script --align=optimal "${disk}" -- \
mklabel gpt \
mkpart swap 1MiB $((SWAPSIZE + 1))MiB \
mkpart rpool $((SWAPSIZE + 1))MiB -$((RESERVE + 100))MiB \
mkpart bpool -$((RESERVE + 100))MiB -$((RESERVE + 3))MiB \
mkpart EFI -$((RESERVE + 3))MiB -$((RESERVE + 2))MiB \
mkpart BIOS -$((RESERVE + 2))MiB -$((RESERVE + 1))MiB \
set 4 esp on \
set 5 bios_grub on \
set 5 legacy_boot on
partprobe "${disk}"
udevadm settle
}
for i in ${DISK}; do
partition_disk "${i}"
done
log Creating boot pool
# ---
# shellcheck disable=SC2046
zpool create \
-o compatibility=grub2 \
-o ashift=12 \
-o autotrim=on \
-O acltype=posixacl \
-O canmount=off \
-O compression=lz4 \
-O devices=off \
-O normalization=formD \
-O relatime=on \
-O xattr=sa \
-O mountpoint=/boot \
-R "${MNT}" \
bpool \
$(for i in ${DISK}; do
printf '%s ' "${i}3";
done)
log Creating root pool
# ---
# shellcheck disable=SC2046
echo $POOLPASS | zpool create \
-o ashift=12 \
-o autotrim=on \
-R "${MNT}" \
-O acltype=posixacl \
-O canmount=off \
-O compression=zstd \
-O dnodesize=auto \
-O normalization=formD \
-O relatime=on \
-O xattr=sa \
-O mountpoint=/ \
-o feature@encryption=enabled \
-O encryption=on \
-O keyformat=passphrase \
rpool \
$(for i in ${DISK}; do
printf '%s ' "${i}2";
done)
log Creating encrypted root system container
# ---
echo $POOLPASS | zfs create \
-o canmount=off \
-o mountpoint=none \
-o encryption=on \
-o keylocation=prompt \
-o keyformat=passphrase \
rpool/nixos
log Creating system datasets, managing mountpoints with mountpoint=legacy
# ---
zfs create -o mountpoint=legacy rpool/nixos/root
mount -t zfs rpool/nixos/root "${MNT}"/
zfs create -o mountpoint=legacy rpool/nixos/home
mkdir "${MNT}"/home
mount -t zfs rpool/nixos/home "${MNT}"/home
zfs create -o mountpoint=legacy rpool/nixos/var
zfs create -o mountpoint=legacy rpool/nixos/var/lib
zfs create -o mountpoint=legacy rpool/nixos/var/log
zfs create -o mountpoint=none bpool/nixos
zfs create -o mountpoint=legacy bpool/nixos/root
mkdir "${MNT}"/boot
mount -t zfs bpool/nixos/root "${MNT}"/boot
mkdir -p "${MNT}"/var/log
mkdir -p "${MNT}"/var/lib
mount -t zfs rpool/nixos/var/lib "${MNT}"/var/lib
mount -t zfs rpool/nixos/var/log "${MNT}"/var/log
zfs create -o mountpoint=legacy rpool/nixos/empty
zfs snapshot rpool/nixos/empty@start
log Formatting and mounting ESP
# ---
for i in ${DISK}; do
mkfs.vfat -n EFI "${i}"4
mkdir -p "${MNT}"/boot/efis/"${i##*/}"4
mount -t vfat -o iocharset=iso8859-1 "${i}"4 "${MNT}"/boot/efis/"${i##*/}"4
done
log Cloning template flake configuration
# ---
mkdir -p "${MNT}"/etc
git clone --depth 1 --branch custom \
https://github.com/marcpartensky/dotfiles-flake.git "${MNT}"/etc/nixos
rm -rf "${MNT}"/etc/nixos/.git
git -C "${MNT}"/etc/nixos/ init -b master
git -C "${MNT}"/etc/nixos/ add "${MNT}"/etc/nixos/
git -C "${MNT}"/etc/nixos config user.email $EMAIL
git -C "${MNT}"/etc/nixos config user.name $NAME
git -C "${MNT}"/etc/nixos commit -asm 'initial commit'
log Customizing configuration to your hardware
# ---
for i in ${DISK}; do
sed -i \
"s|/dev/disk/by-id/|${i%/*}/|" \
"${MNT}"/etc/nixos/hosts/nixos/default.nix
break
done
diskNames=""
for i in ${DISK}; do
diskNames="${diskNames} \"${i##*/}\""
done
sed -i "s|\"bootDevices_placeholder\"|${diskNames}|g" \
"${MNT}"/etc/nixos/hosts/nixos/default.nix
sed -i "s|\"abcd1234\"|\"$(head -c4 /dev/urandom | od -A none -t x4| sed 's| ||g' || true)\"|g" \
"${MNT}"/etc/nixos/hosts/nixos/default.nix
sed -i "s|\"x86_64-linux\"|\"$(uname -m || true)-linux\"|g" \
"${MNT}"/etc/nixos/flake.nix
cp "$(command -v nixos-generate-config || true)" ./nixos-generate-config
chmod a+rw ./nixos-generate-config
# shellcheck disable=SC2016
echo 'print STDOUT $initrdAvailableKernelModules' >> ./nixos-generate-config
kernelModules="$(./nixos-generate-config --show-hardware-config --no-filesystems | tail -n1 || true)"
sed -i "s|\"kernelModules_placeholder\"|${kernelModules}|g" \
"${MNT}"/etc/nixos/hosts/nixos/default.nix
log Setting root password
# ---
rootPwd=$(mkpasswd -m SHA-512)
sed -i \
"s|rootHash_placeholder|${rootPwd}|" \
"${MNT}"/etc/nixos/configuration.nix
log Commiting changes to local repo
# ---
git -C "${MNT}"/etc/nixos commit -asm 'initial installation'
log Updating flake lock file to track latest system version
# ---
nix flake update --commit-lock-file \
"git+file://${MNT}/etc/nixos"
log Installing system and apply configuration
# ---
nixos-install \
--root "${MNT}" \
--no-root-passwd \
--flake "git+file://${MNT}/etc/nixos#nixos"
log Setuping encrypted swap. This is useful if the available memory is small
# ---
for i in ${DISK}; do
cryptsetup open --type plain --key-file /dev/random "${i}"1 "${i##*/}"1
mkswap /dev/mapper/"${i##*/}"1
swapon /dev/mapper/"${i##*/}"1
done
log Unmounting filesystems
# ---
umount -Rl "${MNT}"
zpool export -a
log The installation is done, enjoy
+5 -5
View File
@@ -44,11 +44,11 @@ in {
};
partitionScheme = mkOption {
default = {
biosBoot = "p5";
efiBoot = "p1";
swap = "p4";
bootPool = "p2";
rootPool = "p3";
swap = "1";
rootPool = "2";
bootPool = "3";
efiBoot = "4";
biosBoot = "5";
};
description = "Describe on disk partitions";
type = types.attrsOf types.str;
+1 -1
View File
@@ -7,7 +7,7 @@ in {
hostName = mkOption {
description = "The name of the machine. Used by nix flake.";
type = types.str;
default = "exampleHost";
default = "nixos";
};
timeZone = mkOption {
type = types.str;
-38
View File
@@ -1,38 +0,0 @@
{ lib
, qtbase
, qtsvg
, qtgraphicaleffects
, qtquickcontrols2
, wrapQtAppsHook
, stdenvNoCC
, fetchFromGitHub
}:
stdenvNoCC.mkDerivation
rec {
pname = "sddm-apple";
version = "1..0";
dontBuild = true;
src = fetchFromGitHub {
owner = "vfosterm";
repo = "nixos-sddm-theme-noBlur";
rev = "master";
sha256 = "sha256-Hxifk68xVfnL9EWBicHctzJqyowkCBhAZgSLd7ZZXvg=";
};
nativeBuildInputs = [
wrapQtAppsHook
];
propagatedUserEnvPkgs = [
qtbase
qtsvg
qtgraphicaleffects
qtquickcontrols2
];
installPhase = ''
mkdir -p $out/share/sddm/themes
cp -aR $src $out/share/sddm/themes/sddm-apple
'';
}
-38
View File
@@ -1,38 +0,0 @@
{ lib
, qtbase
, qtsvg
, qtgraphicaleffects
, qtquickcontrols2
, wrapQtAppsHook
, stdenvNoCC
, fetchFromGitHub
}:
stdenvNoCC.mkDerivation
rec {
pname = "sddm-peace-color";
version = "1..0";
dontBuild = true;
src = fetchFromGitHub {
owner = "marcpartensky";
repo = "sddm-peace-color";
rev = "master";
sha256 = "sha256-JRCa8JYkQqkBKQ8YYNNjPrUPY3WwiEkq0W3pBmlhbEs=";
};
nativeBuildInputs = [
wrapQtAppsHook
];
propagatedUserEnvPkgs = [
qtbase
qtsvg
qtgraphicaleffects
qtquickcontrols2
];
installPhase = ''
mkdir -p $out/share/sddm/themes
cp -aR $src $out/share/sddm/themes/sddm-peace-color
'';
}
-19
View File
@@ -1,19 +0,0 @@
{ stdenv, fetchFromGitHub }:
{
sddm-theme-dialog = stdenv.mkDerivation rec {
pname = "sddm-theme-dialog";
version = "53f81e3";
dontBuild = true;
installPhase = ''
mkdir -p $out/share/sddm/themes
cp -aR $src $out/share/sddm/themes/sddm-theme-dialog
'';
src = fetchFromGitHub {
owner = "joshuakraemer";
repo = "sddm-theme-dialog";
rev = "53f81e322f715d3f8e3f41c38eb3774b1be4c19b";
sha256 = "qoLSRnQOvH3rAH+G1eRrcf9ZB6WlSRIZjYZBOTkew/0=";
};
};
}
-38
View File
@@ -1,38 +0,0 @@
{ lib
, qtbase
, qtsvg
, qtgraphicaleffects
, qtquickcontrols2
, wrapQtAppsHook
, stdenvNoCC
, fetchFromGitHub
}:
stdenvNoCC.mkDerivation
rec {
pname = "tokyo-night-sddm";
version = "1..0";
dontBuild = true;
src = fetchFromGitHub {
owner = "rototrash";
repo = "tokyo-night-sddm";
rev = "320c8e74ade1e94f640708eee0b9a75a395697c6";
sha256 = "sha256-JRVVzyefqR2L3UrEK2iWyhUKfPMUNUnfRZmwdz05wL0=";
};
nativeBuildInputs = [
wrapQtAppsHook
];
propagatedUserEnvPkgs = [
qtbase
qtsvg
qtgraphicaleffects
qtquickcontrols2
];
installPhase = ''
mkdir -p $out/share/sddm/themes
cp -aR $src $out/share/sddm/themes/tokyo-night-sddm
'';
}