Skip to content

Commit

Permalink
docs: clean README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
xieby1 committed Apr 22, 2024
1 parent d5f973c commit f41b6d0
Showing 1 changed file with 54 additions and 165 deletions.
219 changes: 54 additions & 165 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,70 @@

为了更好的文档阅读体验,请看[GitHub Pages](https://xieby1.github.io/nix_config/)的版本。

Nix是一个采用纯函数式编程的先进可重现包管理器,理论上可以在任何Linux发行版上安装使用(比如Ubuntu、Debian、Arch等)。
NixOS是Nix对应的Linux发行版。
## 目录

<!-- vim-markdown-toc GFM -->

* [Nix/NixOS简介](#nixnixos简介)
* [xieby1和Nix/NixOS](#xieby1和nixnixos)
* [xieby1的Nix/NixOS配置](#xieby1的nixnixos配置)
* [文件夹结构](#文件夹结构)
* [使用方法](#使用方法)
* [引用](#引用)

<!-- vim-markdown-toc -->

# Nix/NixOS简介

Nix是一个可重现的(Reproducible)包管理器,也是一门纯函数式的(Pure Functional)编程语言。
理论上讲,Nix包管理器可以安装在任何Linux发行版上(比如Ubuntu、Debian和Arch等),并与这些发行版原有的包管理器(比如snap、apt和pacman等)共存。
而NixOS则是完全由Nix包管理器进行管理的Linux发行版。

通过2年的Nix/NixOS使用,它已经成为我的学习和工作的重要基础
在多个项目中,Nix/NixOS让我和我的团队无需担心依赖问题
(比如我在NixOS上编译通过的代码,在其他系统如Ubuntu 16上可能因版本不匹配导致各种问题。)
Nix/NixOS采用了“包(Package)”的理念,将Linux内核、驱动、函数库、用户程序、配置文件等方方面面抽象出来
这类似于Linux内核将设备、磁盘文件、管道等都抽象为文件的理念
这样的抽象使得Nix/NixOS能以一种统一的方式管理所有的包。

20年来,Nix/NixOS从一个博士论文转变成一个活跃的开源项目。现在它已经是一个成熟稳定的大型项目
Nix/NixOS采用函数式编程理念,文件夹结构也与常见Linux包管理有较大差异
这导致Nix/NixOS有一个陡峭的学习曲线。不过,当你适应后,它可以极大提升工程效率!
为了防止“包”被用户有意或无意地修改(即保证可重现性),Nix/NixOS将所有的包都放在一个只读文件系统中(挂载在`/nix/store`目录上)
这个目录中的包仅能通过Nix包管理器和Nix语言编程进行增删改
为了将`/nix/store`中的文件放置在它们应该在的地方(比如某个用户使用的包里存在`bin/`目录,则应当把bin/中所有的文件放入`/run/current-system/sw/bin/`),Nix/NixOS大量使用符号链接。

下面是我今年用来给实验室的同学们推销Nix/NixOS的幻灯片(左下角菜单可切换全屏):
上述Nix/NixOS的特点和传统Linux发行版有着极大的区别。
这使得Nix/NixOS的学习曲线十分陡峭。
不过当你适应Nix/NixOS的这些特点后,它可以极大提升工程效率!

<iframe src="./docs/slides/2023.nix-env.slides.html" style="width: 100%;aspect-ratio:12/7;" frameBorder="0"></iframe>
# xieby1和Nix/NixOS

多年来,Nix/NixOS已成为我学习和工作的重要基础,主要用于以下方面:

* 学习Linux。
Nix/NixOS采用了“包(Package)”的理念,将Linux内核、驱动、函数库、用户程序、配置文件等方方面面抽象出来。
通过学习Nix语言,我能够以统一的方式了解Linux系统的各个方面,这是其他工具所无法提供的。
* 管理环境。
通过使用nix-shell管理所有依赖(包括库、环境变量、配置等),可以避免项目环境重现的问题。
类似的工具还有虚拟机和Docker。
相比使用虚拟机,它更轻量。
相比Docker,它支持可复现构建,采用Nix语言更灵活。
详细可见我于2023年为实验室同学们准备的[推荐Nix/NixOS的幻灯片](https://xieby1.github.io/nix_config/docs/slides/2023.nix-env.html)
* 备份电脑。
Nix/NixOS能够管理系统、软件及其配置。
虽然Nix/NixOS不直接管理数据,但Nix/NixOS可以很好地管理数据同步软件,比如Syncthing。
因此只要保留着Nix/NixOS的配置文件(由Nix语言编写),就能恢复出一个几乎一模一样[^impure]的软件环境/操作系统。

# xieby1的Nix/NixOS配置

该仓库存放着我的Nix/NixOS配置
该仓库使用nix expression,而非nix flakes
该仓库使用NixOS稳定源(目前版本23.11),而非非稳定源(unstable)。
该仓库的配置多平台都可以正常使用,
这个仓库[Github: xieby1/nix_config](https://github.com/xieby1/nix_config)里存放着我的Nix/NixOS配置和文档
该仓库使用nix expression,而非nix flakes
使用NixOS稳定源(目前版本23.11),而非非稳定源(unstable)。
该仓库的配置在多个平台都可以正常使用:

* NixOS: QEMU✅,NixOS单系统✅,NixOS+Windows双系统✅
* Nix: Linux✅,安卓(nix-on-droid)✅,WSL2✅

虚拟机/物理机单系统/物理机双系统 安装NixOS 可以参考我两年前的[NixOS安装](./docs/howto/install_nixos.html)过程。
你可以使用该仓库的配置,配置出完整NixOS操作系统。
也可以使用其中的部分包、模块,扩充自己的Nix/NixOS。
若你不仅只是想安装Nix/NixOS,还想了解更多Nix/NixOS的知识,
欢迎看看这个仓库的文档[xieby1.github.io/nix_config](https://xieby1.github.io/nix_config)

## 目录

<!-- vim-markdown-toc GFM -->

* [文件夹结构](#文件夹结构)
* [Nix和NixOS的关系](#nix和nixos的关系)
* [使用场景](#使用场景)
* [使用方法](#使用方法)
* [软件配置思路](#软件配置思路)
* [X11 Gnome桌面](#x11-gnome桌面)
* [新增模块mime.nix](#新增模块mimenix)
* [Windows程序(wrapWine)](#windows程序wrapwine)
* [网页应用](#网页应用)
* [Systemd用户服务](#systemd用户服务)
* [Clash科学上网](#clash科学上网)
* [Tailscale](#tailscale)
* [Non-NixOS bash-completion](#non-nixos-bash-completion)
* [Neovim](#neovim)
* [输入法](#输入法)
* [chroot or docker](#chroot-or-docker)
* [TODO: terminal](#todo-terminal)
* [引用](#引用)

<!-- vim-markdown-toc -->

## 文件夹结构

* docs/: 文档
Expand All @@ -70,49 +78,12 @@ Nix/NixOS采用函数式编程理念,文件夹结构也与常见Linux包管理
* 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](https://github.com/xieby1/nix_config)

## 使用场景

* 重装系统:复原老系统的环境
* 双系统:让WSL和Linux保持相同的环境
* 虚拟机:让本地环境和虚拟机保持相同的环境
* 容器:让本地环境和容器保持相同的环境
* 多设备:让多台电脑/手机[^nix-on-droid]保持相同的环境

## 使用方法

安装Nix/NixOS不在此赘述,参考https://nixos.org/download.html。
虚拟机/物理机单系统/物理机双系统 安装NixOS 可以参考我两年前的[NixOS安装](./docs/howto/install_nixos.html)过程。
安装Nix/NixOS不在此赘述,参考[nixos.org/download.html](https://nixos.org/download.html)

首先下载我的配置
安装完Nix/NixOS后,首先下载我的配置

```bash
git clone https://github.com/xieby1/nix_config.git ~/.config/nixpkgs
Expand Down Expand Up @@ -143,92 +114,10 @@ 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微信为例,使用方法:

```nix
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

## 引用

[^impure]: nix 2.8的impure特性和home-manager等会引入一些你几乎察觉不到的差异。

[^doc_thesis]: Dolstra, Eelco. “The purely functional software deployment model.” (2006).

[^nix-on-droid]: [github.com/t184256/nix-on-droid](https://github.com/t184256/nix-on-droid) termux的分支,支持nix
[^nix-on-droid]: [github.com/t184256/nix-on-droid](https://github.com/t184256/nix-on-droid) termux的分支,支持nix

0 comments on commit f41b6d0

Please sign in to comment.