nix_config
nix_config copied to clipboard
我的Nix/NixOS配置 My Nix/NixOS Config
🏗️ 我的Nix/NixOS配置详细文档正在施工中,完成进度:9/65 🏗️
为了更好的文档阅读体验,请看GitHub Pages的版本。
Nix是一个采用纯函数式编程的先进可重现包管理器,理论上可以在任何Linux发行版上安装使用(比如Ubuntu、Debian、Arch等)。 NixOS是Nix对应的Linux发行版。
通过2年的Nix/NixOS使用,它已经成为我的学习和工作的重要基础。 在多个项目中,Nix/NixOS让我和我的团队无需担心依赖问题。 (比如我在NixOS上编译通过的代码,在其他系统如Ubuntu 16上可能因版本不匹配导致各种问题。)
20年来,Nix/NixOS从一个博士论文转变成一个活跃的开源项目。现在它已经是一个成熟稳定的大型项目。 Nix/NixOS采用函数式编程理念,文件夹结构也与常见Linux包管理有较大差异。 这导致Nix/NixOS有一个陡峭的学习曲线。不过,当你适应后,它可以极大提升工程效率!
下面是我今年用来给实验室的同学们推销Nix/NixOS的幻灯片(左下角菜单可切换全屏):
xieby1的Nix/NixOS配置
该仓库存放着我的Nix/NixOS配置。 该仓库使用nix expression,而非nix flakes。 该仓库使用NixOS稳定源(目前版本23.11),而非非稳定源(unstable)。 该仓库的配置多平台都可以正常使用,
- NixOS: QEMU✅,NixOS单系统✅,NixOS+Windows双系统✅
- Nix: Linux✅,安卓(nix-on-droid)✅,WSL2✅
虚拟机/物理机单系统/物理机双系统 安装NixOS 可以参考我两年前的NixOS安装过程。 你可以使用该仓库的配置,配置出完整NixOS操作系统。 也可以使用其中的部分包、模块,扩充自己的Nix/NixOS。 若你不仅只是想安装Nix/NixOS,还想了解更多Nix/NixOS的知识, 欢迎看看这个仓库的文档xieby1.github.io/nix_config。
目录
- 文件夹结构
- Nix和NixOS的关系
- 使用场景
- 使用方法
-
软件配置思路
-
X11 Gnome桌面
- 新增模块mime.nix
- Windows程序(wrapWine)
- 网页应用
- Systemd用户服务
- Clash科学上网
- Tailscale
- Non-NixOS bash-completion
- Neovim
- 输入法
- chroot or docker
- TODO: terminal
-
X11 Gnome桌面
- 引用
文件夹结构
- docs/: 文档
- scripts/: nix-shell和独立的软件包的脚本
- system.nix: 系统总体配置(nixos-rebuild的配置)
- sys/cli.nix: 系统命令行配置
- sys/gui.nix: 系统图形配置
- home.nix: 用户总体配置(home-manager的配置)
- usr/cli.nix: 用户命令行配置
- usr/gui.nix: 用户图形配置
- nix-on-droid.nix: 安卓总体配置(nix-on-droid的配置)
Nix和NixOS的关系
Nix是一个先进的包管理系统,用来管理软件包。 其目标和常见的apt、rpm等包管理器一致。 相对于这些包管理器,Nix采用了纯函数构建模型、使用哈希存储软件包等思想。 这使得Nix能够轻松做到做到可重现构建、解决依赖地狱(dependency hell)。 Nix源自于Dolstra博士期间的研究内容。 其详细理论由他的博士论文[^doc_thesis]支撑。
NixOS则是把整个Linux操作系统看作一系列软件包(包括内核),采用Nix来进行管理。 换句话说,NixOS是一个的使用Nix包管理器的Linux发行版。
你可以单独使用Nix包管理器,用它来管理你的用户程序。 你也可以使用NixOS,让你的整个操作系统都由Nix管理。 Nix/NixOS带来的最直观的优势就是,只要保留着Nix/NixOS的配置文件, 就能恢复出一个一模一样的软件环境/操作系统。 (当然这是理想情况下。 nix 2.8的impure特性,home-manager等在打破这一特性。 不过不用担心。 只要保留配置文件,Nix/NixOS上能够生成一个几乎一模一样的软件环境/操作系统)
至此你可能会产生疑问,Nix/NixOS能够管理系统、软件及其配置,那数据呢? 虽然Nix/NixOS不直接管理数据,但是Nix/NixOS可以很好的管理数据同步软件。 比如使用开源软件Syncthing,或是开源服务NextCloud,或是商业服务Google Drive。 因此只要有Nix/NixOS的配置文件, 那就能轻松的构建出包含你熟悉的软件、配置、数据的软件环境/操作系统啦。
我的Nix/NixOS配置存放在这里 github.com/xieby1/nix_config。
使用场景
- 重装系统:复原老系统的环境
- 双系统:让WSL和Linux保持相同的环境
- 虚拟机:让本地环境和虚拟机保持相同的环境
- 容器:让本地环境和容器保持相同的环境
- 多设备:让多台电脑/手机[^nix-on-droid]保持相同的环境
使用方法
安装Nix/NixOS不在此赘述,参考https://nixos.org/download.html。
首先下载我的配置
git clone https://github.com/xieby1/nix_config.git ~/.config/nixpkgs
# [仅NixOS] 在imports中添加system.nix的路径
vim /etc/nixos/configuration.nix
然后设置软件源,在NixOS中推荐使用sudo
。
# 替换为清华的最新稳定源
# [对于NixOS]
nix-channel --add https://mirror.tuna.tsinghua.edu.cn/nix-channels/nixos-23.11 nixos
# [对于Nix]
nix-channel --add https://mirror.tuna.tsinghua.edu.cn/nix-channels/nixos-23.11 nixpkgs
# 添加home manager源
nix-channel --add https://github.com/nix-community/home-manager/archive/release-23.11.tar.gz home-manager
nix-channel --update
最后部署配置
# [仅NixOS]
sudo nixos-rebuild switch
# 安装home-manager
nix-shell '<home-manager>' -A install
home-manager switch
软件配置思路
X11 Gnome桌面
我使用的部分软件依赖于x11,在wayland中无法运行,因此选用x11。 在wayland足够成熟前,仍然保持x11。
新增模块mime.nix
该模块用于配置文件类型和默认打开程序。
通过xdg-mime实现类型设置和默认程序设置。
例如默认使用xdot打开.dot结尾的文件,
详细见usr/gui/mime.nix
。
Windows程序(wrapWine)
详细见usr/gui/wrapWine.nix
和usr/gui/weixin.nix
。
以Windows微信为例,使用方法:
let
weixin = import (builtins.fetchurl "https://raw.githubusercontent.com/xieby1/nix_config/main/usr/gui/weixin.nix") {
wrapWine = import (builtins.fetchurl "https://raw.githubusercontent.com/xieby1/nix_config/main/usr/gui/wrapWine.nix") {};
};
in
weixin
网页应用
TODO: singleton webapp
TODO: wrapWebApp
使用Chrome系列浏览器的--app="URL"
来实现网页应用。
通过xdotool保证有且仅有一个网页应用被打开。
详细见usr/gui/singleton_web_apps.nix
。
Systemd用户服务
TODO:
使用systemd的用户服务(user service), 这使得在非NixOS平台也能正常使用服务。
Clash科学上网
命令行clash+网页控制, 这样的组合方便WSL和nix-on-droid这类无图形界面的使用场景。
添加了systemd user服务,详见./usr/cli.nix: systemd.user.services.clash
的定义。
使用网页http://clash.razord.top来管理clash。
网页应用的定义见./usr/gui/singleton_web_apps.nix
。
Tailscale
TODO:
Non-NixOS bash-completion
TODO:
Neovim
所有的vim配置都在usr/cli/vim.nix
中。
输入法
沿用ubuntu的使用习惯,采用fcitx。
- 中文:cloudpinyin(支持模糊音、自动联网词库)
- 日文:mozc
- 韩文:hangul
chroot or docker
TODO: podman, conenv.sh
chroot需要挂载诸多目录,才能使ubuntu正常运行。 但是NixOS并不提供FHS需要的众多目录。
因此使用docker提供ubuntu命令行环境。
TODO: terminal
引用
[^doc_thesis]: Dolstra, Eelco. “The purely functional software deployment model.” (2006).
[^nix-on-droid]: github.com/t184256/nix-on-droid termux的分支,支持nix