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

前几天给两台电脑交换硬盘 发现笔记本的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字符。

添加认证:

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

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

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

fido2认证

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

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

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

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

1/12 Alive | System Downgraded
©2018-2025 Secirian | CC BY-SA 4.0