disko for btrfs on luks2

2024-07-05
在 NixOS 上使用 disko 声明 btrfs on luks 和 root on tmpfs

    前几天给两台电脑交换硬盘 发现笔记本的m2硬盘螺丝拧不下来,最后柠花了上街找人拧的。

    然后给这只HP的硬盘迁移系统,放在USB硬盘盒里喂 subvol 结果喂一半它噶了,等了半个小时还是无法识盘,直接京东售后了,给我换了块新的嘿嘿

    正好记一下已经用了不下三次的安装步骤。

    写你们nixos的东西可太方便了。

    https://github.com/oluceps/nixos-config/blob/trival/hosts/kaambl/hardware.nix

    关键配置

    disko.devices = {
    disk = {
    nvme = {
    type = "disk";
    device = "/dev/disk/by-id/XXXXXXXXXXXXXXXXXXX";
    content = {
    type = "gpt";
    partitions = {
    esp = {
    label = "ESP";
    size = "2G";
    type = "EF00";
    content = {
    type = "filesystem";
    format = "vfat";
    mountpoint = "/efi";
    };
    };
    cryptroot = {
    label = "CRYPTROOT";
    end = "-32G";
    content = {
    type = "luks";
    name = "cryptroot";
    settings = {
    allowDiscards = true;
    bypassWorkqueues = true;
    crypttabExtraOpts = [
    "same-cpu-crypt"
    "submit-from-crypt-cpus"
    "fido2-device=auto"
    ];
    };
    content = {
    type = "btrfs";
    extraArgs = [
    "--label nixos"
    "-f"
    "--csum xxhash64"
    "--features"
    "block-group-tree"
    ];
    subvolumes = {
    "/persist" = {
    mountpoint = "/persist";
    mountOptions = [
    "compress-force=lzo"
    "noatime"
    "discard=async"
    "space_cache=v2"
    ];
    };
    "/nix" = {
    mountpoint = "/nix";
    mountOptions = [
    "compress-force=lzo"
    "noatime"
    "discard=async"
    "space_cache=v2"
    "nodev"
    "nosuid"
    ];
    };
    "/var" = {
    mountpoint = "/var";
    mountOptions = [
    "compress-force=lzo"
    "noatime"
    "discard=async"
    "space_cache=v2"
    ];
    };
    "/persist/tmp" = {
    mountpoint = "/tmp";
    mountOptions = [
    "relatime"
    "nodev"
    "nosuid"
    "discard=async"
    "space_cache=v2"
    ];
    };
    };
    };
    };
    };
    encryptedSwap = {
    size = "100%";
    content = {
    type = "swap";
    randomEncryption = true;
    };
    };
    };
    };
    };
    };
    nodev = {
    "/" = {
    fsType = "tmpfs";
    mountOptions = [
    "relatime"
    "nosuid"
    "nodev"
    "size=2G"
    "mode=755"
    ];
    };
    };
    };
    fileSystems."/persist".neededForBoot = true;

    使用tpm2或者yubikey的fido解锁,需要打开 boot.initrd.systemd.

    想不到还有什么需要强调的。关于持久化文件的配置,请查看, 如果使用tpm2:

    security.tpm2.enable = true;
    security.tpm2.pkcs11.enable = true;
    security.tpm2.tctiEnvironment.enable = true;

    安装

    WARNING
    执行以下操作会清除磁盘数据。
    1. 进入livecd

    2. 克隆配置仓库

    3. 运行 nix run github:nix-community/disko -- -m disko --flake .#<NAME> , 这将处理好分区、创建LUKS分区、加密映射、格式化等操作,最后自动挂载到 /mnt 目录下,按照定义的布局。

    4. 使用 nixos-install 命令进行安装

    Notice
    使用root on tmpfs 和自动挂载,在内存较小的机器上安装可能会出现一些问题。详见 https://github.com/NixOS/nixpkgs/issues/304422

    安装完成后重启进入系统。

    tpm2认证

    建议使用 CPU builtin TPM 的用户采用此操作,因为部分主板的外置TPM与CPU之间的信道不受加密。但如果是属于zen3架构及以下的CPU, 开不开都无所谓了因为受 faulTPM 影响。

    以下console操作需要替换device字符。

    添加认证:

    Terminal window
    systemd-cryptenroll /dev/nvme0n1p1 --tpm2-device=auto --tpm2-pcrs=0+7

    关于 tpm2-pcrs 参数,见 PCRs 定义

    以上0+7出于「确保安全启动和固件状态不变的情况下自动解密」的考虑。

    fido2认证

    这里采用 Yubikey 作为fido2认证设备。插入具有Fido2功能的 Yubikey, 执行:

    Terminal window
    systemd-cryptenroll /dev/nvme0n1p1 --fido2-device=auto

    关于PIN和presense的设定查看 systemd-cryptenroll -h

    Full disk encryption 和安全启动更配哦!

    ©2018-2024 Secirian | CC BY-SA 4.0