initial commit
TODO: Modify `orion`'s filesystem file to be accurate to the laptop, not a VM
This commit is contained in:
commit
61671baedc
10
README.md
Normal file
10
README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Commands
|
||||
|
||||
```bash
|
||||
git config --global user.email "m@m.com"; git config --global user.name "name"; git add .; git commit -m "Shit" >/dev/null 2>&1; \
|
||||
git clone . /mnt/etc/nixos
|
||||
git config --global user.email "m@m.com"; git config --global user.name "name"; git add .; git commit -m "Shit" >/dev/null 2>&1; \
|
||||
nixos-generate-config --root /mnt --dir /mnt/persist/etc/nixos/hosts/orion/os;
|
||||
git config --global user.email "m@m.com"; git config --global user.name "name"; git add .; git commit -m "Shit" >/dev/null 2>&1; \
|
||||
nixos-install --flake "git+file:.#orion"
|
||||
``
|
64
flake.lock
Normal file
64
flake.lock
Normal file
@ -0,0 +1,64 @@
|
||||
{
|
||||
"nodes": {
|
||||
"disko": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1694069327,
|
||||
"narHash": "sha256-Si2otUNjCe8kY5nsV7tILi4PsI0odBFrdSu8cCjn/eQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"rev": "7bee8de8e6755506c70323b864a884f9624cc23a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"impermanence": {
|
||||
"locked": {
|
||||
"lastModified": 1690797372,
|
||||
"narHash": "sha256-GImz19e33SeVcIvBB7NnhbJSbTpFFmNtWLh7Z85Y188=",
|
||||
"owner": "nix-community",
|
||||
"repo": "impermanence",
|
||||
"rev": "e3a7acd113903269a1b5c8b527e84ce7ee859851",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "impermanence",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1693985761,
|
||||
"narHash": "sha256-K5b+7j7Tt3+AqbWkcw+wMeqOAWyCD1MH26FPZyWXpdo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "0bffda19b8af722f8069d09d8b6a24594c80b352",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"disko": "disko",
|
||||
"impermanence": "impermanence",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
22
flake.nix
Normal file
22
flake.nix
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
description = "Price Hiller's flake for managing system configurations";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
impermanence.url = "github:nix-community/impermanence";
|
||||
};
|
||||
|
||||
outputs = inputs @ { self, nixpkgs, impermanence, ... }: rec {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
];
|
||||
nixosConfigurations.orion = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
specialArgs = inputs;
|
||||
modules = [
|
||||
./hosts/orion
|
||||
impermanence.nixosModules.impermanence
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
3
hosts/luna/README.md
Normal file
3
hosts/luna/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# Luna
|
||||
|
||||
This is my primary server.
|
2
hosts/orion/README.md
Normal file
2
hosts/orion/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
# Orion
|
||||
This is my laptop and primary (and only) developer machine.
|
9
hosts/orion/default.nix
Normal file
9
hosts/orion/default.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, lib, nixpkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./modules
|
||||
./os/filesystem.nix
|
||||
];
|
||||
system.stateVersion = "23.11";
|
||||
}
|
16
hosts/orion/modules/audio.nix
Normal file
16
hosts/orion/modules/audio.nix
Normal file
@ -0,0 +1,16 @@
|
||||
{ inputs, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
hardware.pulseaudio.enable = false;
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa = {
|
||||
enable = true;
|
||||
support32Bit = true;
|
||||
};
|
||||
pulse.enable = true;
|
||||
wireplumber.enable = true;
|
||||
jack.enable = true;
|
||||
};
|
||||
}
|
30
hosts/orion/modules/bluetooth.nix
Normal file
30
hosts/orion/modules/bluetooth.nix
Normal file
@ -0,0 +1,30 @@
|
||||
{ inputs, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
hardware.bluetooth.enable = true;
|
||||
services.blueman.enable = true;
|
||||
environment.systemPackages = with pkgs; [
|
||||
bluez
|
||||
];
|
||||
|
||||
systemd.user.services.mpris-proxy = {
|
||||
description = "Mpris proxy";
|
||||
after = [ "network.target" "sound.target" ];
|
||||
wantedBy = [ "default.target" ];
|
||||
serviceConfig.ExecStart = "${pkgs.bluez}/bin/mpris-proxy";
|
||||
};
|
||||
|
||||
security.polkit.extraConfig = ''
|
||||
/* Allow users in wheel group to use blueman feature requiring root without authentication */
|
||||
polkit.addRule(function(action, subject) {
|
||||
if ((action.id == "org.blueman.network.setup" ||
|
||||
action.id == "org.blueman.dhcp.client" ||
|
||||
action.id == "org.blueman.rfkill.setstate" ||
|
||||
action.id == "org.blueman.pppd.pppconnect") &&
|
||||
subject.isInGroup("wheel")) {
|
||||
|
||||
return polkit.Result.YES;
|
||||
}
|
||||
});
|
||||
'';
|
||||
}
|
13
hosts/orion/modules/default.nix
Normal file
13
hosts/orion/modules/default.nix
Normal file
@ -0,0 +1,13 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./audio.nix
|
||||
./bluetooth.nix
|
||||
./hardware.nix
|
||||
./networking.nix
|
||||
./nix.nix
|
||||
./power.nix
|
||||
./user.nix
|
||||
];
|
||||
}
|
21
hosts/orion/modules/hardware.nix
Normal file
21
hosts/orion/modules/hardware.nix
Normal file
@ -0,0 +1,21 @@
|
||||
{ inputs, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
# NOTE: Disable Nvidia GPU
|
||||
boot.extraModprobeConfig = ''
|
||||
blacklist nouveau
|
||||
options nouveau iwlwifi power_save=1 modeset=0
|
||||
'';
|
||||
services.udev.extraRules = ''
|
||||
# Remove NVIDIA USB xHCI Host Controller devices, if present
|
||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
|
||||
# Remove NVIDIA USB Type-C UCSI devices, if present
|
||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"
|
||||
# Remove NVIDIA Audio devices, if present
|
||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"
|
||||
# Remove NVIDIA VGA/3D controller devices
|
||||
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1"
|
||||
'';
|
||||
boot.blacklistedKernelModules = [ "nouveau" "nvidia" "nvidia_drm" "nvidia_modeset" ];
|
||||
|
||||
}
|
86
hosts/orion/modules/networking.nix
Normal file
86
hosts/orion/modules/networking.nix
Normal file
@ -0,0 +1,86 @@
|
||||
{ inputs, lib, pkgs, hostname, ... }:
|
||||
|
||||
let
|
||||
hostname = "orion";
|
||||
networks_dhcp_use_dns = "no";
|
||||
networks_dhcp = "yes";
|
||||
networks_multicast_dns = "yes";
|
||||
networks_ipv6_privacy = "yes";
|
||||
networks_ipv6_accept_ra = "yes";
|
||||
networks_network_config = {
|
||||
DHCP = networks_dhcp;
|
||||
MulticastDNS = networks_multicast_dns;
|
||||
IPv6PrivacyExtensions = networks_ipv6_privacy;
|
||||
IPv6AcceptRA = networks_ipv6_accept_ra;
|
||||
};
|
||||
resolved_nameservers = [
|
||||
"198.180.150.12#rgnet-iad.anycast.uncensoreddns.org"
|
||||
"2001:418:8006::12:853#rgnet-iad.anycast.uncensoreddns.org"
|
||||
"194.242.2.2#dns.mullvad.net"
|
||||
"2a07:e340::2:853#dns.mullvad.net"
|
||||
];
|
||||
resolved_fallback_nameservers = [ "1.1.1.1#one.one.one.one" "1.0.0.1#one.one.one.one" ];
|
||||
in
|
||||
{
|
||||
systemd.network = {
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-wlan" = {
|
||||
matchConfig.Name = [ "wl*" ];
|
||||
networkConfig = networks_network_config;
|
||||
dhcpV4Config = {
|
||||
RouteMetric = 600;
|
||||
UseDNS = networks_dhcp_use_dns;
|
||||
};
|
||||
ipv6AcceptRAConfig = {
|
||||
RouteMetric = 600;
|
||||
UseDNS = networks_dhcp_use_dns;
|
||||
};
|
||||
};
|
||||
"10-ethernet" = {
|
||||
matchConfig.name = [ "en*" "eth*" ];
|
||||
networkConfig = networks_network_config;
|
||||
dhcpV4Config = {
|
||||
RouteMetric = 100;
|
||||
UseDNS = networks_dhcp_use_dns;
|
||||
};
|
||||
ipv6AcceptRAConfig = {
|
||||
RouteMetric = 100;
|
||||
UseDNS = networks_dhcp_use_dns;
|
||||
};
|
||||
};
|
||||
"10-wwan" = {
|
||||
matchConfig.name = [ "ww*" ];
|
||||
networkConfig = networks_network_config;
|
||||
dhcpV4Config = {
|
||||
RouteMetric = 700;
|
||||
UseDNS = networks_dhcp_use_dns;
|
||||
};
|
||||
ipv6AcceptRAConfig = {
|
||||
RouteMetric = 700;
|
||||
UseDNS = networks_dhcp_use_dns;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
services.resolved = {
|
||||
enable = true;
|
||||
dnssec = "true";
|
||||
domains = [ "~." ];
|
||||
fallbackDns = resolved_fallback_nameservers;
|
||||
llmnr = "true";
|
||||
extraConfig = ''
|
||||
MulticastDNS=yes
|
||||
DNSOverTLS=yes
|
||||
CacheFromLocalhost=no
|
||||
Cache=yes
|
||||
'';
|
||||
};
|
||||
networking = {
|
||||
hostName = "${hostname}";
|
||||
wireless.iwd.enable = true;
|
||||
};
|
||||
|
||||
}
|
16
hosts/orion/modules/nix.nix
Normal file
16
hosts/orion/modules/nix.nix
Normal file
@ -0,0 +1,16 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
nix = {
|
||||
settings = {
|
||||
experimental-features = [ "nix-command" "flakes" ];
|
||||
auto-optimise-store = true;
|
||||
trusted-users = ["@wheel"];
|
||||
};
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
options = "--delete-older-than 7d";
|
||||
};
|
||||
};
|
||||
}
|
7
hosts/orion/modules/power.nix
Normal file
7
hosts/orion/modules/power.nix
Normal file
@ -0,0 +1,7 @@
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
powerManagement.enable = true;
|
||||
powerManagement.powertop.enable = true;
|
||||
services.thermald.enable = true;
|
||||
}
|
37
hosts/orion/modules/user.nix
Normal file
37
hosts/orion/modules/user.nix
Normal file
@ -0,0 +1,37 @@
|
||||
{ pkgs, user, ... }:
|
||||
|
||||
let
|
||||
user = "price";
|
||||
in
|
||||
{
|
||||
programs = {
|
||||
zsh.enable = true;
|
||||
};
|
||||
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
users.users = {
|
||||
root.initialPassword = "pass";
|
||||
"${user}" = {
|
||||
initialPassword = "pass";
|
||||
shell = pkgs.zsh;
|
||||
isNormalUser = true;
|
||||
description = "${user}";
|
||||
extraGroups = [
|
||||
"wheel"
|
||||
"docker"
|
||||
"nix-users"
|
||||
"libvirt"
|
||||
"log"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
ungoogled-chromium
|
||||
wezterm
|
||||
yamllint
|
||||
stylua
|
||||
eza
|
||||
];
|
||||
}
|
84
hosts/orion/os/filesystem.nix
Normal file
84
hosts/orion/os/filesystem.nix
Normal file
@ -0,0 +1,84 @@
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/profiles/qemu-guest.nix") ];
|
||||
|
||||
boot = {
|
||||
initrd = {
|
||||
availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ];
|
||||
kernelModules = [ ];
|
||||
luks.devices = {
|
||||
"luksroot" = {
|
||||
device = "/dev/disk/by-label/NixOS-Crypt";
|
||||
allowDiscards = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
loader = {
|
||||
systemd-boot.enable = true;
|
||||
efi.canTouchEfiVariables = true;
|
||||
};
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
extraModulePackages = [ ];
|
||||
};
|
||||
|
||||
swapDevices = [{ device = "/dev/disk/by-label/NixOS-Swap"; }];
|
||||
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "none";
|
||||
fsType = "tmpfs";
|
||||
options = [ "defaults" "noatime" "mode=755" ];
|
||||
};
|
||||
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-label/NixOS-Boot";
|
||||
fsType = "vfat";
|
||||
options = [ "defaults" "noatime" ];
|
||||
depends = [ "/" ];
|
||||
};
|
||||
|
||||
"/nix" = {
|
||||
device = "/dev/disk/by-label/NixOS-Primary";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@nix" "compress=zstd" "noatime" ];
|
||||
};
|
||||
|
||||
"/home" = {
|
||||
device = "/dev/disk/by-label/NixOS-Primary";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@home" "compress=zstd" "noatime" ];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
environment.persistence = {
|
||||
"/nix/persist" = {
|
||||
hideMounts = true;
|
||||
directories = [
|
||||
"/var/lib"
|
||||
"/var/log"
|
||||
"/etc/nixos"
|
||||
];
|
||||
files = [
|
||||
"/etc/machine-id"
|
||||
"/etc/nix/id_rsa"
|
||||
];
|
||||
users.price = {
|
||||
directories = [
|
||||
"Git"
|
||||
"ISOs"
|
||||
"Downloads"
|
||||
"Keep"
|
||||
"Notes"
|
||||
".local/share"
|
||||
{ directory = ".gnupg"; mode = "0700"; }
|
||||
{ directory = ".ssh"; mode = "0700"; }
|
||||
];
|
||||
files = [
|
||||
".zsh_history"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
82
install.bash
Normal file
82
install.bash
Normal file
@ -0,0 +1,82 @@
|
||||
#!/usr/env/bin bash
|
||||
|
||||
set -euox pipefail
|
||||
|
||||
export DISK="/dev/vda"
|
||||
export DISK_EXT="${DISK}"
|
||||
# The size is large because I'd like to be able to hibernate my laptop in its entirety. I have 64 GB of ram.
|
||||
export SWAP_SIZE="32"
|
||||
export SWAP_OFFSET="$(( SWAP_SIZE + 1 ))"
|
||||
|
||||
export LABEL_CRYPT_LUKS="NixOS-Crypt"
|
||||
export LABEL_SWAP="NixOS-Swap"
|
||||
export LABEL_BTRFS="NixOS-Primary"
|
||||
export LABEL_BOOT="NixOS-Boot"
|
||||
|
||||
swapoff -a || true
|
||||
umount /mnt/**/* || true
|
||||
umount /mnt/* || true
|
||||
umount /mnt || true
|
||||
cryptsetup close enc || true
|
||||
dd if=/dev/zero of="${DISK}" bs=512 count=1024 || true
|
||||
|
||||
### Partition The Disk
|
||||
parted "${DISK}" -- mklabel gpt
|
||||
# Boot partition
|
||||
parted -a optimal "${DISK}" -- mkpart ESP fat32 1MiB 1GiB
|
||||
parted "${DISK}" -- set 1 boot on
|
||||
mkfs.vfat "${DISK_EXT}1"
|
||||
fatlabel "${DISK_EXT}1" "${LABEL_BOOT}"
|
||||
# Swap Partition
|
||||
parted -a optimal "${DISK}" -- mkpart "${LABEL_SWAP}" linux-swap 1Gib "${SWAP_OFFSET}GB"
|
||||
mkswap -L "${LABEL_SWAP}" "${DISK_EXT}2"
|
||||
swapon "${DISK_EXT}2"
|
||||
# Nix Partition, where the OS will reside with our data
|
||||
parted -a optimal "${DISK}" -- mkpart "${LABEL_BTRFS}" "${SWAP_OFFSET}GiB" 100%
|
||||
|
||||
### Encrypt
|
||||
cryptsetup --verify-passphrase -v luksFormat "${DISK_EXT}3"
|
||||
cryptsetup config "${DISK_EXT}3" --label "${LABEL_CRYPT_LUKS}"
|
||||
# Have to decrypt it so we can actually get other things setup
|
||||
export CRYPT_OPEN_NAME="enc"
|
||||
export CRYPT_PATH="/dev/mapper/${CRYPT_OPEN_NAME}"
|
||||
cryptsetup open "${DISK_EXT}3" "${CRYPT_OPEN_NAME}"
|
||||
|
||||
### BTRFS Setup
|
||||
# Go ahead and make the unerypted BTRFS
|
||||
mkfs.btrfs -L "${LABEL_BTRFS}" "${CRYPT_PATH}"
|
||||
|
||||
# Mount it
|
||||
mount -t btrfs "${CRYPT_PATH}" /mnt
|
||||
|
||||
# Create our subvolumes
|
||||
for subvol in "home" "nix"; do
|
||||
btrfs subvolume create "/mnt/@${subvol}"
|
||||
done
|
||||
umount /mnt
|
||||
|
||||
### Final Mountings
|
||||
# Mount tmpfs to mnt
|
||||
mount -t tmpfs -o mode=755 none /mnt
|
||||
|
||||
# Create our directories
|
||||
mkdir /mnt/{"boot","nix","home"}
|
||||
# Mount our boot partition
|
||||
mount -t vfat -o defaults,noatime "${DISK_EXT}1" /mnt/boot
|
||||
|
||||
# Mount our btrfs subvolumes individually with some btrfs options
|
||||
# NOTE: On high performance NVME SSDs with a beefy CPU it may be worth considering ZLO compression instead of ZSTD. In
|
||||
# many cases ZLO is more performant, especially when writing, than ZSTD while having a somewhat worse comrpession ratio.
|
||||
# WARN: ZLO *may* be a good solution, it can be VERY slow on incompressible data. Something to keep in mind.
|
||||
mount -t btrfs -o noatime,compress=zstd,subvol=@nix "${CRYPT_PATH}" /mnt/nix
|
||||
mount -t btrfs -o noatime,compress=zstd,subvol=@home "${CRYPT_PATH}" /mnt/home
|
||||
|
||||
mkdir -p /mnt/nix/persist
|
||||
### Install NixOS
|
||||
# Gotta make sure current working tree isn't dirty for the flake
|
||||
git config --global user.email "m@m.com"; git config --global user.name "name"; git add .; git commit -m "Shit" >/dev/null 2>&1; \
|
||||
# Clone the flake into place
|
||||
git clone . /mnt/nix/persist/etc/nixos && cd /mnt/nix/persist/etc/nixos
|
||||
# Finally, actually install NixOS
|
||||
nixos-install --flake "git+file:.#orion"
|
||||
|
Loading…
Reference in New Issue
Block a user