Compare commits

...

5 Commits

13 changed files with 430 additions and 4 deletions

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
result result
nixos.qcow2 *.qcow2

View File

@ -1,3 +1,15 @@
# Installing on a new machine
1) Install [NixOS](https://nixos.org/) from an ISO via USB
2) Reboot machine
3) Edit /etc/nixos/configuration and add `git` to packages
4) Clone this repo
5) Copy new `host/` configuration for the new machine
6) Copy /etc/nixos/hardware-configuration to `host/<host>/hardware.nix`
7) Edit `flake.nix` to point to the new `host`
8) `git add .`
9) Run `sudo nixos-rebuild switch --flake .#nixos`
# Building NixOS VM # Building NixOS VM
`nix build .#nixosConfigurations.nixosvm.config.system.build.vm` `nix build .#nixosConfigurations.nixosvm.config.system.build.vm`
https://gist.github.com/FlakM/0535b8aa7efec56906c5ab5e32580adf https://gist.github.com/FlakM/0535b8aa7efec56906c5ab5e32580adf

View File

@ -158,6 +158,22 @@
"type": "github" "type": "github"
} }
}, },
"install-system": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"path": "scripts/install-system",
"type": "path"
},
"original": {
"path": "scripts/install-system",
"type": "path"
},
"parent": []
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1753345091, "lastModified": 1753345091,
@ -203,6 +219,7 @@
"root": { "root": {
"inputs": { "inputs": {
"home-manager": "home-manager", "home-manager": "home-manager",
"install-system": "install-system",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"stylix": "stylix" "stylix": "stylix"
} }

View File

@ -9,11 +9,16 @@
}; };
stylix = { stylix = {
url = "github:danth/stylix/release-25.05"; url = "github:danth/stylix/release-25.05";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
};
install-system = {
url = "path:scripts/install-system";
inputs.nixpkgs.follows = "nixpkgs";
}; };
}; };
outputs = { nixpkgs, home-manager, ... } @ inputs: let outputs = { nixpkgs, home-manager, install-system, ... } @ inputs: let
system = "x86_64-linux"; system = "x86_64-linux";
host = "vm"; host = "vm";
profile = "vm"; profile = "vm";
@ -43,6 +48,7 @@
}; };
modules = [ modules = [
(nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix") (nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix")
{ environment.systemPackages = [ install-system.packages.${system}.default ]; }
./hosts/${host} ./hosts/${host}
]; ];
}; };

View File

@ -8,6 +8,7 @@
networking = { networking = {
hostName = "${host}"; hostName = "${host}";
networkmanager.enable = true; networkmanager.enable = true;
wireless.enable = false;
}; };
environment.systemPackages = with pkgs; [ networkmanagerapplet ]; environment.systemPackages = with pkgs; [ networkmanagerapplet ];

View File

@ -35,6 +35,7 @@ in
then [ pkgs.hyprland ] then [ pkgs.hyprland ]
else []) else [])
++ (if plasmaCfg.enable ++ (if plasmaCfg.enable
# TODO: use the correct packages or config
then [ pkgs.kdePackages.kde-gtk-config ] then [ pkgs.kdePackages.kde-gtk-config ]
else []); else []);
}; };

View File

@ -1,7 +1,7 @@
#/usr/bin/env bash #/usr/bin/env bash
echo "Removing old qcow2 disk ..." echo "Removing old qcow2 disk ..."
rm -f ./nixos.qcow2 rm -f ./vm.qcow2
echo "Building new VM ..." echo "Building new VM ..."
nix build .#nixosConfigurations.nixosvm.config.system.build.vm nix build .#nixosConfigurations.nixosvm.config.system.build.vm

View File

@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1753749649,
"narHash": "sha256-+jkEZxs7bfOKfBIk430K+tK9IvXlwzqQQnppC2ZKFj4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "1f08a4df998e21f4e8be8fb6fbf61d11a1a5076a",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.05",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View File

@ -0,0 +1,30 @@
{
description = "_template package and shell environment";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
};
outputs = { self, nixpkgs, ... }: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system}.pkgs;
name = builtins.baseNameOf (builtins.toString ./.);
shellApplication = pkgs.writeShellApplication {
inherit name;
text = builtins.readFile ./${name}.sh;
runtimeInputs = with pkgs; [
coreutils
gnused
unixtools.column
];
};
in {
packages.${system}.default = shellApplication;
devShells.${system}.default = pkgs.mkShell {
packages = [ shellApplication ];
};
};
}

View File

@ -0,0 +1,140 @@
#!/usr/bin/env bash
# https://github.com/nicolas-goudry/nix-config
# set +e # Do not exit on error
set -e # Exit on error
set +u # Allow unset variables
# set -u # Exit on unset variable
# set +o pipefail # Disable pipefail
set -o pipefail # Enable pipefail
script_name=$(basename "${0}")
nc="\e[0m" # Unset styles
bld="\e[1m" # Bold text
dim="\e[2m" # Dim text
red="\e[31m" # Red foreground
green="\e[32m" # Green foreground
yellow="\e[33m" # Yellow foreground
blue="\e[34m" # Blue foreground
to_stderr() {
>&2 echo -e "${*}"
}
to_stdout() {
echo -e "${*}"
}
error() {
to_stderr " ${red}×${nc} ${*}"
}
warn() {
to_stderr " ${yellow}${nc} ${*}"
}
info() {
to_stdout " ${blue}i${nc} ${*}"
}
debug() {
if [ -n "${debug}" ]; then
to_stderr " ${dim}${*}${nc}"
fi
}
success() {
to_stdout " ${green}${nc} ${*}"
}
trace() {
to_stderr "Stacktrace:"
local i=1 line file func
while read -r line func file < <(caller ${i}); do
to_stderr "[${i}] ${file}:${line} ${func}(): $(sed -n "${line}p" "${file}")"
((i++))
done
}
# shellcheck disable=SC2120
die() {
if [ "${#}" -gt 0 ]; then
error "${*}"
fi
exit 1
}
needs_arg() {
if [ -z "${OPTARG}" ]; then
>&2 echo "${0}: option requires an argument -- ${OPT}"
usage
die
fi
}
usage() {
echo
echo "Template script."
echo
to_stdout "${bld}Usage:${nc}"
to_stdout " ${dim}\$${nc} ${script_name}"
echo
to_stdout "${bld}Options:${nc}"
cat <<EOF | column -tds '|'
-e, --error|Exit with error
-o, --option|Some option
-d, --debug|Enable debug output
-h, --help|Show this help message
EOF
}
main() {
while getopts 'hdeo:-:' OPT; do
# support long options: https://stackoverflow.com/a/28466267/519360
if test "$OPT" = "-"; then # long option: reformulate OPT and OPTARG
OPT="${OPTARG%%=*}" # extract long option name
# shellcheck disable=SC2295
OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty)
OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=`
fi
# Handle flags
case "$OPT" in
e | error )
die "exited with error"
;;
o | option )
needs_arg
OPTION="${OPTARG}"
;;
d | debug )
debug=true
;;
h | help )
usage
exit 0
;;
??* ) # bad long option
>&2 echo "${0}: illegal option -- $OPT"
usage
die
;;
? ) # bad short option (error reported via getopts)
usage
die
;;
esac
done
debug "Start of main"
echo "This is a template."
if [ -n "${OPTION}" ]; then
debug "Option is not empty"
echo "Option is set to: ${OPTION}"
fi
}
main "$@"

View File

@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1753749649,
"narHash": "sha256-+jkEZxs7bfOKfBIk430K+tK9IvXlwzqQQnppC2ZKFj4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "1f08a4df998e21f4e8be8fb6fbf61d11a1a5076a",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.05",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View File

@ -0,0 +1,29 @@
{
description = "install-system package and shell environment";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
};
outputs = { self, nixpkgs, ... }: let
pkgs = nixpkgs.legacyPackages.x86_64-linux.pkgs;
name = builtins.baseNameOf (builtins.toString ./.);
shellApplication = pkgs.writeShellApplication {
inherit name;
text = builtins.readFile ./${name}.sh;
runtimeInputs = with pkgs; [
coreutils
gnused
unixtools.column
];
};
in {
packages.x86_64-linux.default = shellApplication;
devShells.x86_64-linux.default = pkgs.mkShell {
packages = [ shellApplication ];
};
};
}

View File

@ -0,0 +1,136 @@
#!/usr/bin/env bash
set -e # Exit on error
set +u # Allow unset variables
set -o pipefail # Enable pipefail
script_name=$(basename "${0}")
nc="\e[0m" # Unset styles
bld="\e[1m" # Bold text
dim="\e[2m" # Dim text
red="\e[31m" # Red foreground
green="\e[32m" # Green foreground
yellow="\e[33m" # Yellow foreground
blue="\e[34m" # Blue foreground
to_stderr() {
>&2 echo -e "${*}"
}
to_stdout() {
echo -e "${*}"
}
error() {
to_stderr " ${red}×${nc} ${*}"
}
warn() {
to_stderr " ${yellow}${nc} ${*}"
}
info() {
to_stdout " ${blue}i${nc} ${*}"
}
debug() {
if [ -n "${debug}" ]; then
to_stderr " ${dim}${*}${nc}"
fi
}
success() {
to_stdout " ${green}${nc} ${*}"
}
trace() {
to_stderr "Stacktrace:"
local i=1 line file func
while read -r line func file < <(caller ${i}); do
to_stderr "[${i}] ${file}:${line} ${func}(): $(sed -n "${line}p" "${file}")"
((i++))
done
}
# shellcheck disable=SC2120
die() {
if [ "${#}" -gt 0 ]; then
error "${*}"
fi
exit 1
}
needs_arg() {
if [ -z "${OPTARG}" ]; then
to_stderr "${0}: option requires an argument -- ${OPT}"
usage
die
fi
}
usage() {
to_stdout
to_stdout "NixOS installation helper script."
to_stdout
to_stdout "${bld}Usage:${nc}"
to_stdout " ${dim}\$${nc} ${script_name}"
to_stdout
to_stdout "${bld}Options:${nc}"
cat <<EOF | column -tds '|'
-e, --error|Exit with error
-o, --option|Some option
-d, --debug|Enable debug output
-h, --help|Show this help message
EOF
}
main() {
while getopts 'hdeo:-:' OPT; do
# support long options: https://stackoverflow.com/a/28466267/519360
if test "$OPT" = "-"; then # long option: reformulate OPT and OPTARG
OPT="${OPTARG%%=*}" # extract long option name
# shellcheck disable=SC2295
OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty)
OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=`
fi
# Handle flags
case "$OPT" in
e | error )
die "exited with error"
;;
o | option )
needs_arg
OPTION="${OPTARG}"
;;
d | debug )
debug=true
;;
h | help )
usage
exit 0
;;
??* ) # bad long option
>&2 echo "${0}: illegal option -- $OPT"
usage
die
;;
? ) # bad short option (error reported via getopts)
usage
die
;;
esac
done
debug "Start of main"
info "This is a template."
if [ -n "${OPTION}" ]; then
debug "Option is not empty"
debug "Option is set to: ${OPTION}"
fi
}
main "${@}"