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 和安全启动更配哦!

    ©2018-2025 Secirian | CC BY-SA 4.0