Update NixOS configuration, clean up RHEL, Fedora, Arch guide mount section

Closes #397

Signed-off-by: Maurice Zhou <jasper@apvc.uk>
This commit is contained in:
Maurice Zhou
2023-03-16 14:37:09 +01:00
committed by George Melikov
parent a69befb2ce
commit b6cf700f62
14 changed files with 130 additions and 626 deletions

View File

@@ -40,23 +40,18 @@ System Installation
#. Create boot pool:: #. Create boot pool::
tee -a /root/grub2 <<EOF zpool create -d \
# Features which are supported by GRUB2 -o feature@async_destroy=enabled \
async_destroy -o feature@bookmarks=enabled \
bookmarks -o feature@embedded_data=enabled \
embedded_data -o feature@empty_bpobj=enabled \
empty_bpobj -o feature@enabled_txg=enabled \
enabled_txg -o feature@extensible_dataset=enabled \
extensible_dataset -o feature@filesystem_limits=enabled \
filesystem_limits -o feature@hole_birth=enabled \
hole_birth -o feature@large_blocks=enabled \
large_blocks -o feature@lz4_compress=enabled \
lz4_compress -o feature@spacemap_histogram=enabled \
spacemap_histogram
EOF
zpool create \
-o compatibility=/root/grub2 \
-o ashift=12 \ -o ashift=12 \
-o autotrim=on \ -o autotrim=on \
-O acltype=posixacl \ -O acltype=posixacl \
@@ -137,13 +132,11 @@ System Installation
Create system datasets, let Alpinelinux declaratively Create system datasets, let Alpinelinux declaratively
manage mountpoints with ``mountpoint=legacy``:: manage mountpoints with ``mountpoint=legacy``::
zfs create -o mountpoint=legacy rpool/alpinelinux/root zfs create -o mountpoint=/ -o canmount=noauto rpool/alpinelinux/root
mount -t zfs rpool/alpinelinux/root /mnt/ zfs mount rpool/alpinelinux/root
zfs create -o mountpoint=legacy rpool/alpinelinux/home zfs create -o mountpoint=legacy rpool/alpinelinux/home
mkdir /mnt/home mkdir /mnt/home
mount -t zfs rpool/alpinelinux/home /mnt/home mount -t zfs rpool/alpinelinux/home /mnt/home
mkdir -p /mnt/var/lib
mkdir -p /mnt/var/log
zfs create -o mountpoint=legacy rpool/alpinelinux/var zfs create -o mountpoint=legacy rpool/alpinelinux/var
zfs create -o mountpoint=legacy rpool/alpinelinux/var/lib zfs create -o mountpoint=legacy rpool/alpinelinux/var/lib
zfs create -o mountpoint=legacy rpool/alpinelinux/var/log zfs create -o mountpoint=legacy rpool/alpinelinux/var/log
@@ -151,16 +144,8 @@ System Installation
zfs create -o mountpoint=legacy bpool/alpinelinux/root zfs create -o mountpoint=legacy bpool/alpinelinux/root
mkdir /mnt/boot mkdir /mnt/boot
mount -t zfs bpool/alpinelinux/root /mnt/boot mount -t zfs bpool/alpinelinux/root /mnt/boot
mkdir -p /mnt/var/log
#. mkinitfs requires root dataset to have a mountpoint mkdir -p /mnt/var/lib
other than legacy::
umount -Rl /mnt
zfs set canmount=noauto rpool/alpinelinux/root
zfs set mountpoint=/ rpool/alpinelinux/root
mount -t zfs -o zfsutil rpool/alpinelinux/root /mnt
mount -t zfs rpool/alpinelinux/home /mnt/home
mount -t zfs bpool/alpinelinux/root /mnt/boot
mount -t zfs rpool/alpinelinux/var/lib /mnt/var/lib mount -t zfs rpool/alpinelinux/var/lib /mnt/var/lib
mount -t zfs rpool/alpinelinux/var/log /mnt/var/log mount -t zfs rpool/alpinelinux/var/log /mnt/var/log
@@ -252,9 +237,12 @@ System Installation
done done
rm -rf $ESP_MIRROR rm -rf $ESP_MIRROR
#. Unmount filesystems:: #. Exit chroot::
exit exit
#. Unmount filesystems::
cut -f2 -d\ /proc/mounts | grep ^/mnt | tac | while read i; do umount -l $i; done cut -f2 -d\ /proc/mounts | grep ^/mnt | tac | while read i; do umount -l $i; done
zpool export -a zpool export -a
@@ -269,6 +257,8 @@ Post installaion
setup-desktop setup-desktop
#. Configure swap.
#. You can create a snapshot of the newly installed #. You can create a snapshot of the newly installed
system for later rollback, system for later rollback,
see `this page <https://openzfs.github.io/openzfs-docs/Getting%20Started/Arch%20Linux/Root%20on%20ZFS/6-create-boot-environment.html>`__. see `this page <https://openzfs.github.io/openzfs-docs/Getting%20Started/Arch%20Linux/Root%20on%20ZFS/6-create-boot-environment.html>`__.

View File

@@ -26,7 +26,7 @@ see below.
Root on ZFS Root on ZFS
----------- -----------
ZFS can be used as root file system for Fedora. ZFS can be used as root file system for Alpine Linux.
An installation guide is available. An installation guide is available.
Start from "Preparation". Start from "Preparation".

View File

@@ -76,7 +76,8 @@ Preparation
* https://archzfs.com/archive_archzfs/ * https://archzfs.com/archive_archzfs/
* https://archzfs.com/archzfs/x86_64/ * https://archzfs.com/archzfs/x86_64/
:: Such as::
curl -L https://archzfs.com/archive_archzfs/ \ curl -L https://archzfs.com/archive_archzfs/ \
| grep zfs-linux-[0-9] \ | grep zfs-linux-[0-9] \
| grep -v src.tar \ | grep -v src.tar \
@@ -87,15 +88,13 @@ Preparation
#. Find compatible zfs-utils package: #. Find compatible zfs-utils package:
Search ZFS version string (e.g. 2.1.5) in both pages above. Search ZFS version string (e.g. 2.1.5) in both pages above::
::
curl -L https://archzfs.com/archzfs/x86_64/ \ curl -L https://archzfs.com/archzfs/x86_64/ \
| grep zfs-utils-2.1.5 \ | grep zfs-utils-2.1.5 \
| grep -v src.tar | grep -v src.tar
# ...<a href="zfs-utils-2.1.5-1-x86_64.pkg.tar.zst">... # ...<a href="zfs-utils-2.1.5-1-x86_64.pkg.tar.zst">...
Result: https/.../archzfs/x86_64/zfs-utils-2.1.5-2-x86_64.pkg.tar.zst Result: https/.../archzfs/x86_64/zfs-utils-2.1.5-2-x86_64.pkg.tar.zst
#. Download both then install:: #. Download both then install::

View File

@@ -122,11 +122,11 @@ System Installation
Create system datasets, let Archlinux declaratively Create system datasets, let Archlinux declaratively
manage mountpoints with ``mountpoint=legacy``:: manage mountpoints with ``mountpoint=legacy``::
zfs create -o mountpoint=legacy rpool/archlinux/root zfs create -o mountpoint=/ -o canmount=noauto rpool/archlinux/root
mount -t zfs rpool/archlinux/root /mnt/ zfs mount rpool/archlinux/root
zfs create -o mountpoint=legacy rpool/archlinux/home zfs create -o mountpoint=legacy rpool/archlinux/home
mkdir /mnt/home mkdir /mnt/home
mount -t zfs rpool/archlinux/home /mnt/home mount -t zfs rpool/archlinux/home /mnt/home
zfs create -o mountpoint=legacy rpool/archlinux/var zfs create -o mountpoint=legacy rpool/archlinux/var
zfs create -o mountpoint=legacy rpool/archlinux/var/lib zfs create -o mountpoint=legacy rpool/archlinux/var/lib
zfs create -o mountpoint=legacy rpool/archlinux/var/log zfs create -o mountpoint=legacy rpool/archlinux/var/log
@@ -134,17 +134,10 @@ System Installation
zfs create -o mountpoint=legacy bpool/archlinux/root zfs create -o mountpoint=legacy bpool/archlinux/root
mkdir /mnt/boot mkdir /mnt/boot
mount -t zfs bpool/archlinux/root /mnt/boot mount -t zfs bpool/archlinux/root /mnt/boot
mkdir -p /mnt/var/log
#. zfs-mkinitcpio requires root dataset to have a mountpoint mkdir -p /mnt/var/lib
other than legacy:: mount -t zfs rpool/archlinux/var/lib /mnt/var/lib
mount -t zfs rpool/archlinux/var/log /mnt/var/log
umount -Rl /mnt
zfs set canmount=noauto rpool/archlinux/root
zfs set mountpoint=/ rpool/archlinux/root
mount -t zfs -o zfsutil rpool/archlinux/root /mnt
mount -t zfs rpool/archlinux/home /mnt/home
mount -t zfs bpool/archlinux/root /mnt/boot
#. Format and mount ESP:: #. Format and mount ESP::

View File

@@ -8,10 +8,6 @@ System Configuration
#. Generate fstab:: #. Generate fstab::
mkdir -p /mnt/var/log
mkdir -p /mnt/var/lib
mount -t zfs rpool/archlinux/var/lib /mnt/var/lib
mount -t zfs rpool/archlinux/var/log /mnt/var/log
mkdir -p /mnt/etc/ mkdir -p /mnt/etc/
genfstab -t PARTUUID /mnt | grep -v swap > /mnt/etc/fstab genfstab -t PARTUUID /mnt | grep -v swap > /mnt/etc/fstab
sed -i "s|vfat.*rw|vfat rw,x-systemd.idle-timeout=1min,x-systemd.automount,noauto,nofail|" /mnt/etc/fstab sed -i "s|vfat.*rw|vfat rw,x-systemd.idle-timeout=1min,x-systemd.automount,noauto,nofail|" /mnt/etc/fstab

View File

@@ -122,11 +122,11 @@ System Installation
Create system datasets, let Fedora declaratively Create system datasets, let Fedora declaratively
manage mountpoints with ``mountpoint=legacy``:: manage mountpoints with ``mountpoint=legacy``::
zfs create -o mountpoint=legacy rpool/fedora/root zfs create -o mountpoint=/ -o canmount=noauto rpool/fedora/root
mount -t zfs rpool/fedora/root /mnt/ zfs mount rpool/fedora/root
zfs create -o mountpoint=legacy rpool/fedora/home zfs create -o mountpoint=legacy rpool/fedora/home
mkdir /mnt/home mkdir /mnt/home
mount -t zfs rpool/fedora/home /mnt/home mount -t zfs rpool/fedora/home /mnt/home
zfs create -o mountpoint=legacy rpool/fedora/var zfs create -o mountpoint=legacy rpool/fedora/var
zfs create -o mountpoint=legacy rpool/fedora/var/lib zfs create -o mountpoint=legacy rpool/fedora/var/lib
zfs create -o mountpoint=legacy rpool/fedora/var/log zfs create -o mountpoint=legacy rpool/fedora/var/log
@@ -134,17 +134,10 @@ System Installation
zfs create -o mountpoint=legacy bpool/fedora/root zfs create -o mountpoint=legacy bpool/fedora/root
mkdir /mnt/boot mkdir /mnt/boot
mount -t zfs bpool/fedora/root /mnt/boot mount -t zfs bpool/fedora/root /mnt/boot
mkdir -p /mnt/var/log
#. zfs-dracut requires root dataset to have a mountpoint mkdir -p /mnt/var/lib
other than legacy:: mount -t zfs rpool/fedora/var/lib /mnt/var/lib
mount -t zfs rpool/fedora/var/log /mnt/var/log
umount -Rl /mnt
zfs set canmount=noauto rpool/fedora/root
zfs set mountpoint=/ rpool/fedora/root
mount -t zfs -o zfsutil rpool/fedora/root /mnt
mount -t zfs rpool/fedora/home /mnt/home
mount -t zfs bpool/fedora/root /mnt/boot
#. Format and mount ESP:: #. Format and mount ESP::

View File

@@ -9,10 +9,6 @@ System Configuration
#. Generate fstab:: #. Generate fstab::
mkdir -p /mnt/var/log
mkdir -p /mnt/var/lib
mount -t zfs rpool/fedora/var/lib /mnt/var/lib
mount -t zfs rpool/fedora/var/log /mnt/var/log
mkdir -p /mnt/etc/ mkdir -p /mnt/etc/
genfstab -t PARTUUID /mnt | grep -v swap > /mnt/etc/fstab genfstab -t PARTUUID /mnt | grep -v swap > /mnt/etc/fstab
sed -i "s|vfat.*rw|vfat rw,x-systemd.idle-timeout=1min,x-systemd.automount,noauto,nofail|" /mnt/etc/fstab sed -i "s|vfat.*rw|vfat rw,x-systemd.idle-timeout=1min,x-systemd.automount,noauto,nofail|" /mnt/etc/fstab
@@ -35,7 +31,8 @@ System Configuration
#. Configure dracut:: #. Configure dracut::
echo 'add_dracutmodules+=" zfs "' > /mnt/etc/dracut.conf.d/zfs.conf echo 'add_dracutmodules+=" zfs "' >> /mnt/etc/dracut.conf.d/zfs.conf
echo 'forced_drivers+=" zfs "' >> /mnt/etc/dracut.conf.d/zfs.conf
if grep mpt3sas /proc/modules; then if grep mpt3sas /proc/modules; then
echo 'forced_drivers+=" mpt3sas "' >> /mnt/etc/dracut.conf.d/zfs.conf echo 'forced_drivers+=" mpt3sas "' >> /mnt/etc/dracut.conf.d/zfs.conf
fi fi

View File

@@ -42,6 +42,9 @@ Preparation
INST_PARTSIZE_SWAP=4 INST_PARTSIZE_SWAP=4
It is recommeneded to set this value higher if your computer has
less than 8GB of memory, otherwise ZFS might fail to build.
Root pool size, use all remaining disk space if not set:: Root pool size, use all remaining disk space if not set::
INST_PARTSIZE_RPOOL= INST_PARTSIZE_RPOOL=

View File

@@ -6,18 +6,25 @@ System Configuration
.. contents:: Table of Contents .. contents:: Table of Contents
:local: :local:
#. Download system configuration from this repo:: #. Enter ephemeral nix-shell with git support::
mkdir -p /mnt/etc/nixos/ mkdir -p /mnt/etc/
curl -o /mnt/etc/nixos/configuration.nix -L \ echo DISK=$DISK > ~/disk
https://github.com/openzfs/openzfs-docs/raw/master/docs/Getting%20Started/NixOS/Root%20on%20ZFS/configuration.nix
nix-shell -p git
#. Clone template flake configuration::
source ~/disk
git clone https://github.com/ne9z/dotfiles-flake.git /mnt/etc/nixos
git -C /mnt/etc/nixos checkout openzfs-guide
#. Customize configuration to your hardware:: #. Customize configuration to your hardware::
for i in $DISK; do for i in $DISK; do
sed -i \ sed -i \
"s|PLACEHOLDER_FOR_DEV_NODE_PATH|\"${i%/*}/\"|" \ "s|/dev/disk/by-id/|${i%/*}/|" \
/mnt/etc/nixos/configuration.nix /mnt/etc/nixos/hosts/exampleHost/default.nix
break break
done done
@@ -25,11 +32,12 @@ System Configuration
for i in $DISK; do for i in $DISK; do
diskNames="$diskNames \"${i##*/}\"" diskNames="$diskNames \"${i##*/}\""
done done
tee -a /mnt/etc/nixos/machine.nix <<EOF
{ sed -i "s|\"bootDevices_placeholder\"|$diskNames|g" \
bootDevices = [ $diskNames ]; /mnt/etc/nixos/hosts/exampleHost/default.nix
}
EOF sed -i "s|\"hostId_placeholder\"|\"$(head -c4 /dev/urandom | od -A none -t x4| sed 's| ||g')\"|g" \
/mnt/etc/nixos/hosts/exampleHost/default.nix
#. Set root password:: #. Set root password::
@@ -38,16 +46,42 @@ System Configuration
Declare password in configuration:: Declare password in configuration::
sed -i \ sed -i \
"s|PLACEHOLDER_FOR_ROOT_PWD_HASH|\""${rootPwd}"\"|" \ "s|rootHash_placeholder|${rootPwd}|" \
/mnt/etc/nixos/configuration.nix /mnt/etc/nixos/hosts/exampleHost/default.nix
#. Optional: enable NetworkManager for easier wireless configuration and enable desktop #. If using a system architecture other than amd64 (x86_64-linux), such as
environments. See ``man configuration.nix`` for details. By default, the system is ``aarch64-linux``, change architecture in
installed without any other software. ``/mnt/etc/nixos/flake.nix``.
#. Optional: add SSH public key for root and change host name in
``/mnt/etc/nixos/hosts/exampleHost/default.nix``.
#. From now on, the complete configuration of the system will be
tracked by git, set a user name and email address to continue::
git -C /mnt/etc/nixos config user.email "you@example.com"
git -C /mnt/etc/nixos config user.name "Alice Q. Nixer"
#. Commit changes to local repo::
git -C /mnt/etc/nixos commit -asm 'initial installation'
#. Exit ephemeral nix shell with git::
exit
#. Update flake lock file to track latest system version::
nix \
--extra-experimental-features 'nix-command flakes' \
flake update --commit-lock-file \
"git+file:///mnt/etc/nixos"
#. Install system and apply configuration:: #. Install system and apply configuration::
nixos-install --no-root-passwd --root /mnt nixos-install --no-root-passwd --flake "git+file:///mnt/etc/nixos#exampleHost"
If the host name was changed, use the new host name in this command.
#. Unmount filesystems:: #. Unmount filesystems::
@@ -58,12 +92,13 @@ System Configuration
reboot reboot
#. Optional: manage system configuration with git. #. NetworkManager is enabled by default. To manage network
connections, execute::
#. Optional: immutable root filesystem can be enabled by nmtui
using this `configuration file
<https://github.com/openzfs/openzfs-docs/raw/master/docs/Getting%20Started/NixOS/Root%20on%20ZFS/configuration-immutable.nix>`__. #. Optional: immutable root filesystem can be enabled by setting
Apply your own hardware configuration in this file, ``my.boot.immutable`` option to ``true``.
then execute:: then execute::
nixos-rebuild boot nixos-rebuild boot
@@ -161,9 +196,10 @@ replaced with the following procedure.
Let the new disk resilver. Check status with ``zpool status``. Let the new disk resilver. Check status with ``zpool status``.
#. Update NixOS system configuration:: #. Update NixOS system configuration and commit changes to git repo::
sed -i "s|${BAD##*/}|${NEW##*/}|" /etc/nixos/machine.nix sed -i "s|${BAD##*/}|${NEW##*/}|" /etc/nixos/hosts/exampleHost/default.nix
git -C /etc/nixos commit
#. Apply the updated NixOS system configuration, reinstall bootloader, then reboot:: #. Apply the updated NixOS system configuration, reinstall bootloader, then reboot::

View File

@@ -1,254 +0,0 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help).
{ config, lib, pkgs, modulesPath, ... }:
let
zfsRoot.partitionScheme = {
biosBoot = "-part5";
efiBoot = "-part1";
swap = "-part4";
bootPool = "-part2";
rootPool = "-part3";
};
zfsRoot.devNodes = PLACEHOLDER_FOR_DEV_NODE_PATH; # MUST have trailing slash! /dev/disk/by-id/
zfsRoot.bootDevices = (import ./machine.nix).bootDevices;
zfsRoot.mirroredEfi = "/boot/efis/";
in {
# adjust according to your platform, such as
imports = [
# (modulesPath + "/profiles/qemu-guest.nix")
# (modulesPath + "/profiles/all-hardware.nix")
(modulesPath + "/installer/scan/not-detected.nix")
];
systemd.services.zfs-mount.enable = false;
# networking.hostName = "nixos"; # Define your hostname.
# Pick only one of the below networking options.
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
# networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
# Set your time zone.
# time.timeZone = "Europe/Amsterdam";
# Configure network proxy if necessary
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
# Select internationalisation properties.
# i18n.defaultLocale = "en_US.UTF-8";
# console = {
# font = "Lat2-Terminus16";
# keyMap = "us";
# useXkbConfig = true; # use xkbOptions in tty.
# };
# Configure keymap in X11
# services.xserver.layout = "us";
# services.xserver.xkbOptions = {
# "eurosign:e";
# "caps:escape" # map caps to escape.
# };
# Enable CUPS to print documents.
# services.printing.enable = true;
# Enable sound.
# sound.enable = true;
# hardware.pulseaudio.enable = true;
# Enable touchpad support (enabled default in most desktopManager).
# Define a user account. Don't forget to set a password with passwd.
# users.users.alice = {
# isNormalUser = true;
# extraGroups = [ "wheel" ]; # Enable sudo for the user.
# packages = with pkgs; [
# firefox
# thunderbird
# ];
# };
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs;
[
# vim
## Do not forget to add an editor to edit configuration.nix!
## The Nano editor is also installed by default.
# wget
mg
];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
services.openssh.enable = false;
users.users.root = {
##hash: mkpasswd -m SHA-512 -s
initialHashedPassword = PLACEHOLDER_FOR_ROOT_PWD_HASH;
openssh.authorizedKeys.keys = [
];
};
programs.git.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# Copy the NixOS configuration file and link it from the resulting system
# (/run/current-system/configuration.nix). This is useful in case you
# accidentally delete configuration.nix.
system.copySystemConfiguration = true;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "22.11"; # Did you read the comment?
boot.initrd.availableKernelModules = [
"ahci"
"xhci_pci"
"virtio_pci"
"virtio_blk"
"ehci_pci"
"nvme"
"uas"
"sd_mod"
"sr_mod"
"sdhci_pci"
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems = {
"/" = {
device = "rpool/nixos/empty";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/oldroot" = {
device = "rpool/nixos/root";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
neededForBoot = true;
};
"/nix" = {
device = "/oldroot/nix";
fsType = "none";
options = [ "bind" "X-mount.mkdir" ];
};
"/etc/nixos" = {
device = "/oldroot/etc/nixos";
fsType = "none";
options = [ "bind" "X-mount.mkdir" ];
};
"/home" = {
device = "rpool/nixos/home";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/var/lib" = {
device = "rpool/nixos/var/lib";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/var/log" = {
device = "rpool/nixos/var/log";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/boot" = {
device = "bpool/nixos/root";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
} // (builtins.listToAttrs (map (diskName: {
name = zfsRoot.mirroredEfi + diskName + zfsRoot.partitionScheme.efiBoot;
value = {
device = zfsRoot.devNodes + diskName + zfsRoot.partitionScheme.efiBoot;
fsType = "vfat";
options = [
"x-systemd.idle-timeout=1min"
"x-systemd.automount"
"noauto"
"nofail"
];
};
}) zfsRoot.bootDevices));
swapDevices = (map (diskName: {
device = zfsRoot.devNodes + diskName + zfsRoot.partitionScheme.swap;
discardPolicy = "both";
randomEncryption = {
enable = true;
allowDiscards = true;
};
}) zfsRoot.bootDevices);
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.networkmanager.enable = true;
# networking.interfaces.enp1s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode =
lib.mkDefault config.hardware.enableRedistributableFirmware;
hardware.cpu.amd.updateMicrocode =
lib.mkDefault config.hardware.enableRedistributableFirmware;
boot.supportedFilesystems = [ "zfs" ];
networking.hostId = "abcd1234";
boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
boot.loader.efi.efiSysMountPoint = with builtins;
(zfsRoot.mirroredEfi + (head zfsRoot.bootDevices) + zfsRoot.partitionScheme.efiBoot);
boot.zfs.devNodes = zfsRoot.devNodes;
boot.loader.efi.canTouchEfiVariables = false;
boot.loader.generationsDir.copyKernels = true;
boot.loader.grub.efiInstallAsRemovable = true;
boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
boot.loader.grub.copyKernels = true;
boot.loader.grub.efiSupport = true;
boot.loader.grub.zfsSupport = true;
boot.loader.grub.extraInstallCommands = with builtins;
(toString (map (diskName:
"cp -r " + config.boot.loader.efi.efiSysMountPoint + "/EFI" + " "
+ zfsRoot.mirroredEfi + diskName + zfsRoot.partitionScheme.efiBoot + "\n")
(tail zfsRoot.bootDevices)));
boot.loader.grub.devices =
(map (diskName: zfsRoot.devNodes + diskName) zfsRoot.bootDevices);
boot.initrd.postDeviceCommands = ''
if ! grep -q zfs_no_rollback /proc/cmdline; then
zpool import -N rpool
zfs rollback -r rpool/nixos/empty@start
zpool export -a
fi
'';
}

View File

@@ -1,227 +0,0 @@
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help).
{ config, lib, pkgs, modulesPath, ... }:
let
zfsRoot.partitionScheme = {
biosBoot = "-part5";
efiBoot = "-part1";
swap = "-part4";
bootPool = "-part2";
rootPool = "-part3";
};
zfsRoot.devNodes = PLACEHOLDER_FOR_DEV_NODE_PATH; # MUST have trailing slash! /dev/disk/by-id/
zfsRoot.bootDevices = (import ./machine.nix).bootDevices;
zfsRoot.mirroredEfi = "/boot/efis/";
in {
# adjust according to your platform, such as
imports = [
# (modulesPath + "/profiles/qemu-guest.nix")
# (modulesPath + "/profiles/all-hardware.nix")
(modulesPath + "/installer/scan/not-detected.nix")
];
systemd.services.zfs-mount.enable = false;
# networking.hostName = "nixos"; # Define your hostname.
# Pick only one of the below networking options.
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
# networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
# Set your time zone.
# time.timeZone = "Europe/Amsterdam";
# Configure network proxy if necessary
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
# Select internationalisation properties.
# i18n.defaultLocale = "en_US.UTF-8";
# console = {
# font = "Lat2-Terminus16";
# keyMap = "us";
# useXkbConfig = true; # use xkbOptions in tty.
# };
# Configure keymap in X11
# services.xserver.layout = "us";
# services.xserver.xkbOptions = {
# "eurosign:e";
# "caps:escape" # map caps to escape.
# };
# Enable CUPS to print documents.
# services.printing.enable = true;
# Enable sound.
# sound.enable = true;
# hardware.pulseaudio.enable = true;
# Enable touchpad support (enabled default in most desktopManager).
# Define a user account. Don't forget to set a password with passwd.
# users.users.alice = {
# isNormalUser = true;
# extraGroups = [ "wheel" ]; # Enable sudo for the user.
# packages = with pkgs; [
# firefox
# thunderbird
# ];
# };
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs;
[
# vim
## Do not forget to add an editor to edit configuration.nix!
## The Nano editor is also installed by default.
# wget
mg
];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };
# List services that you want to enable:
# Enable the OpenSSH daemon.
services.openssh.enable = false;
users.users.root = {
##hash: mkpasswd -m SHA-512 -s
initialHashedPassword = PLACEHOLDER_FOR_ROOT_PWD_HASH;
openssh.authorizedKeys.keys = [
];
};
programs.git.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
# Copy the NixOS configuration file and link it from the resulting system
# (/run/current-system/configuration.nix). This is useful in case you
# accidentally delete configuration.nix.
system.copySystemConfiguration = true;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "22.11"; # Did you read the comment?
boot.initrd.availableKernelModules = [
"ahci"
"xhci_pci"
"virtio_pci"
"virtio_blk"
"ehci_pci"
"nvme"
"uas"
"sd_mod"
"sr_mod"
"sdhci_pci"
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" "kvm-amd" ];
boot.extraModulePackages = [ ];
fileSystems = {
"/" = {
device = "rpool/nixos/root";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/home" = {
device = "rpool/nixos/home";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/var/lib" = {
device = "rpool/nixos/var/lib";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/var/log" = {
device = "rpool/nixos/var/log";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
"/boot" = {
device = "bpool/nixos/root";
fsType = "zfs";
options = [ "X-mount.mkdir" ];
};
} // (builtins.listToAttrs (map (diskName: {
name = zfsRoot.mirroredEfi + diskName + zfsRoot.partitionScheme.efiBoot;
value = {
device = zfsRoot.devNodes + diskName + zfsRoot.partitionScheme.efiBoot;
fsType = "vfat";
options = [
"x-systemd.idle-timeout=1min"
"x-systemd.automount"
"noauto"
"nofail"
];
};
}) zfsRoot.bootDevices));
swapDevices = (map (diskName: {
device = zfsRoot.devNodes + diskName + zfsRoot.partitionScheme.swap;
discardPolicy = "both";
randomEncryption = {
enable = true;
allowDiscards = true;
};
}) zfsRoot.bootDevices);
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.networkmanager.enable = true;
# networking.interfaces.enp1s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode =
lib.mkDefault config.hardware.enableRedistributableFirmware;
hardware.cpu.amd.updateMicrocode =
lib.mkDefault config.hardware.enableRedistributableFirmware;
boot.supportedFilesystems = [ "zfs" ];
networking.hostId = "abcd1234";
boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
boot.loader.efi.efiSysMountPoint = with builtins;
(zfsRoot.mirroredEfi + (head zfsRoot.bootDevices) + zfsRoot.partitionScheme.efiBoot);
boot.zfs.devNodes = zfsRoot.devNodes;
boot.loader.efi.canTouchEfiVariables = false;
boot.loader.generationsDir.copyKernels = true;
boot.loader.grub.efiInstallAsRemovable = true;
boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
boot.loader.grub.copyKernels = true;
boot.loader.grub.efiSupport = true;
boot.loader.grub.zfsSupport = true;
boot.loader.grub.extraInstallCommands = with builtins;
(toString (map (diskName:
"cp -r " + config.boot.loader.efi.efiSysMountPoint + "/EFI" + " "
+ zfsRoot.mirroredEfi + diskName + zfsRoot.partitionScheme.efiBoot + "\n")
(tail zfsRoot.bootDevices)));
boot.loader.grub.devices =
(map (diskName: zfsRoot.devNodes + diskName) zfsRoot.bootDevices);
}

View File

@@ -68,7 +68,7 @@ Preparation
#. Install partition tool and arch-install-scripts:: #. Install partition tool and arch-install-scripts::
dnf install -y epel-release dnf install -y epel-release
dnf install -y gdisk dosfstools arch-install-scripts dnf install -y gdisk dosfstools cryptsetup
dnf download arch-install-scripts dnf download arch-install-scripts
rpm -i --nodeps arch-install-scripts*.rpm rpm -i --nodeps arch-install-scripts*.rpm
dnf remove -y epel-release dnf remove -y epel-release

View File

@@ -122,11 +122,11 @@ System Installation
Create system datasets, let Alma declaratively Create system datasets, let Alma declaratively
manage mountpoints with ``mountpoint=legacy``:: manage mountpoints with ``mountpoint=legacy``::
zfs create -o mountpoint=legacy rpool/alma/root zfs create -o mountpoint=/ -o canmount=noauto rpool/alma/root
mount -t zfs rpool/alma/root /mnt/ zfs mount rpool/alma/root
zfs create -o mountpoint=legacy rpool/alma/home zfs create -o mountpoint=legacy rpool/alma/home
mkdir /mnt/home mkdir /mnt/home
mount -t zfs -o zfsutil rpool/alma/home /mnt/home mount -t zfs rpool/alma/home /mnt/home
zfs create -o mountpoint=legacy rpool/alma/var zfs create -o mountpoint=legacy rpool/alma/var
zfs create -o mountpoint=legacy rpool/alma/var/lib zfs create -o mountpoint=legacy rpool/alma/var/lib
zfs create -o mountpoint=legacy rpool/alma/var/log zfs create -o mountpoint=legacy rpool/alma/var/log
@@ -134,16 +134,10 @@ System Installation
zfs create -o mountpoint=legacy bpool/alma/root zfs create -o mountpoint=legacy bpool/alma/root
mkdir /mnt/boot mkdir /mnt/boot
mount -t zfs bpool/alma/root /mnt/boot mount -t zfs bpool/alma/root /mnt/boot
mkdir -p /mnt/var/log
#. zfs-dracut requires root dataset to have a mountpoint mkdir -p /mnt/var/lib
other than legacy:: mount -t zfs rpool/alma/var/lib /mnt/var/lib
mount -t zfs rpool/alma/var/log /mnt/var/log
umount -Rl /mnt
zfs set canmount=noauto rpool/alma/root
zfs set mountpoint=/ rpool/alma/root
mount -t zfs rpool/alma/root /mnt
mount -t zfs rpool/alma/home /mnt/home
mount -t zfs bpool/alma/root /mnt/boot
#. Format and mount ESP:: #. Format and mount ESP::
@@ -155,17 +149,3 @@ System Installation
mkdir -p /mnt/boot/efi mkdir -p /mnt/boot/efi
mount -t vfat $(echo $DISK | cut -f1 -d\ )-part1 /mnt/boot/efi mount -t vfat $(echo $DISK | cut -f1 -d\ )-part1 /mnt/boot/efi
#. Install packages::
dnf --installroot=/mnt --releasever=$(source /etc/os-release ; echo $VERSION_ID) -y install \
@core grub2-efi-x64 grub2-pc-modules grub2-efi-x64-modules shim-x64 efibootmgr kernel
dnf --installroot=/mnt --releasever=$(source /etc/os-release ; echo $VERSION_ID) -y install \
https://zfsonlinux.org/epel/zfs-release-2-2$(rpm --eval "%{dist}").noarch.rpm
dnf config-manager --installroot=/mnt --disable zfs
dnf config-manager --installroot=/mnt --enable zfs-kmod
dnf --installroot=/mnt --releasever=$(source /etc/os-release ; echo $VERSION_ID) \
-y install zfs zfs-dracut

View File

@@ -8,33 +8,31 @@ System Configuration
#. Generate fstab:: #. Generate fstab::
mkdir -p /mnt/var/log
mkdir -p /mnt/var/lib
mount -t zfs rpool/alma/var/lib /mnt/var/lib
mount -t zfs rpool/alma/var/log /mnt/var/log
mkdir -p /mnt/etc/ mkdir -p /mnt/etc/
genfstab -t PARTUUID /mnt | grep -v swap > /mnt/etc/fstab genfstab -t PARTUUID /mnt | grep -v swap > /mnt/etc/fstab
sed -i "s|vfat.*rw|vfat rw,x-systemd.idle-timeout=1min,x-systemd.automount,noauto,nofail|" /mnt/etc/fstab sed -i "s|vfat.*rw|vfat rw,x-systemd.idle-timeout=1min,x-systemd.automount,noauto,nofail|" /mnt/etc/fstab
#. Install basic system packages:: #. Install basic system packages::
dnf --installroot=/mnt \ dnf --installroot=/mnt \
--releasever=$VERSION_ID -y install \ --releasever=$VERSION_ID -y install \
@core grub2-efi-x64 \ @core grub2-efi-x64 \
grub2-pc-modules grub2-efi-x64-modules \ grub2-pc-modules grub2-efi-x64-modules \
shim-x64 efibootmgr \ shim-x64 efibootmgr \
kernel kernel-$(uname -r)
dnf --installroot=/mnt \
--releasever=$VERSION_ID -y install \ dnf --installroot=/mnt \
https://zfsonlinux.org/epel/zfs-release-2-2$(rpm --eval "%{dist}").noarch.rpm --releasever=$VERSION_ID -y install \
dnf config-manager --installroot=/mnt --disable zfs https://zfsonlinux.org/epel/zfs-release-2-2$(rpm --eval "%{dist}").noarch.rpm
dnf config-manager --installroot=/mnt --enable zfs-kmod dnf config-manager --installroot=/mnt --disable zfs
dnf --installroot=/mnt --releasever=$VERSION_ID \ dnf config-manager --installroot=/mnt --enable zfs-kmod
-y install zfs zfs-dracut dnf --installroot=/mnt --releasever=$VERSION_ID \
-y install zfs zfs-dracut
#. Configure dracut:: #. Configure dracut::
echo 'add_dracutmodules+=" zfs "' > /mnt/etc/dracut.conf.d/zfs.conf echo 'add_dracutmodules+=" zfs "' >> /mnt/etc/dracut.conf.d/zfs.conf
echo 'forced_drivers+=" zfs "' >> /mnt/etc/dracut.conf.d/zfs.conf
if grep mpt3sas /proc/modules; then if grep mpt3sas /proc/modules; then
echo 'forced_drivers+=" mpt3sas "' >> /mnt/etc/dracut.conf.d/zfs.conf echo 'forced_drivers+=" mpt3sas "' >> /mnt/etc/dracut.conf.d/zfs.conf
fi fi