system.nix

本文件system.nix存放喆我的NixOS的配置。 NixOS的配置通过命令sudo nixos-rebuid switch生效。 因为NixOS的配置入口是/etc/nixos/configuration.nix, 所以需要在/etc/nixos/configuration.nix中import本文件,例如

# /etc/nixos/configuration.nix:
{ config, pkgs, ... }: {
  imports = [
    ./hardware-configuration.nix
    # import my system.nix here!
    /home/xieby1/.config/nixpkgs/system.nix
  ];
  # other configs ...
}

NixOS配置可以使用的参数可参考configuration.nix的manpage,即man configuration.nix。 下面是我的NixOS的配置源码及注解:

# add this file to /etc/nixos/configuration.nix: imports
{ config, pkgs, ... }:

{

让NixOS的nixpkgs使用和home-manager的nixpkgs采用相同的nixpkgs config

  nixpkgs.config = import ./config.nix;

导入我的NixOS的CLI和GUI配置, 详细内容见文档./sys/cli.nix./sys/gui.nix

  imports = [
    ./sys/modules/cachix.nix
    ./sys/cli.nix
    ./sys/gui.nix
  ];

Nix binary cache的地址。 越靠前优先级越高。 由于cache.nixos.org需要梯子, 这里使用了清华Tuna提供的Nix binary cache镜像来加速。

  nix.settings.substituters = [
    "https://cache.nixos.org/"
    "https://xieby1.cachix.org"
  ];

设置时区。

  time.timeZone = "Asia/Shanghai";
  time.hardwareClockInLocalTime = true;

设置Linux账户信息。

  users.mutableUsers = false;

当然GitHub上当然不能明文存储密码,这里使用hash过的密码。 可以使用命令行工具mkpasswd来生成hash过的密码。 给root用户设置hash过的密码。

  users.users.root.hashedPassword = "$6$wRBpbr4zSTA/nh$XI/KUASw3mELIqyAxN1hUTWizz9ZBzPhP2u4HNDCA49h4KOWkZsyuiextyXkUti7jYsUHE9fTiRjGAoxBg0Gq/";
  users.users.xieby1 = {
    isNormalUser = true;
    createHome = true;

同上,给xieby1用户设置hash过的密码。

    hashedPassword = "$6$Y4KJxhdaJTT$RSolbCpaUKK2UW1cdnuH.8n1Ky9p0Lnx0MP36BxGX9Q2AeVMjCp.bZOsZ11w689je/785TFRQoVgicMiOfA9B.";

给用户xieby1启用sudo。

    extraGroups = [ "wheel" ];

ssh授权的公钥。这样设置后,我的所有的NixOS都相当于“自动授权”了。 我的/home/xieby1/Gist/文件夹存放着一些不方便放入Git仓库的文件,比如二进制文件,或是隐私文件。 该文件由syncthing进行多设备同步。 简单的说,我的备份理念是“git备份配置,syncthing备份数据”。 “配置”即指这个nix_config仓库,“数据”指~/Gist/~/Documents/等文件夹。 有了这些备份就能轻松还原/复现我的整个工作环境。 TODO:单独专门介绍我的备份理念。

    openssh.authorizedKeys.keyFiles = [] ++ (
      if builtins.pathExists /home/xieby1/Gist/Vault/y50_70.pub
      then [/home/xieby1/Gist/Vault/y50_70.pub]
      else []
    ) ++ (
      if builtins.pathExists /home/xieby1/Gist/Vault/yoga14s.pub
      then [/home/xieby1/Gist/Vault/yoga14s.pub]
      else []
    );
  };

让TTY自动登录我的账户,这样就可以自动启动用户级(user)的systemd服务了。 这样就可以在非NixOS中(比如Ubuntu服务器、WSL2、Debian树莓派等) 自动拉起systemd用户服务(比如syncthing、clash、tailscale等)。

  services.getty.autologinUser = "xieby1";

有关systemd用户服务的配置,详细可见参考:

}