(教程)在已有Windows的情况下安装NixOS双系统

在已有Windows的情况下安装NixOS双系统

在网上找了些现有的NixOS安装教程,但其中很多已过时/不可用。

所以便想着将之前参考的博客整合一下,制作一个萌新友好的NixOS双系统安装教程。

1.开始前的准备

在安装NixOS之前,我们需要对计算机上已有的Windows进行一些设置。

关闭快速启动

若不关闭 Windows 的快速启动,可能会导致 NixOS 掉网卡。

打开控制面板,在

控制面板\硬件和声音\电源选项\系统设置

中,找到 关机设置>快速启动(推荐) 将其取消勾选

腾出NixOS需要的磁盘空间

可以使用DiskGenius、分区助手等软件操作硬盘剩余空间,如果需要日常使用,建议给NixOS分200GB以上的硬盘空间。

制作引导媒介

制作引导盘推荐使用Rufus,非常简洁易用,当然Ventoy之类的其它软件都行。

首先,我们从NixOS官网下载官方镜像。

这边推荐使用Minimal ISO image,图形界面在安装上会出现很多麻烦。

根据你的CPU选择合适的类型。例如你是x86架构的CPU(Intel或者AMD)就选择上方的Intel/AMD。

下载好后,插入U盘(至少2GB大小),打开Rufus。

  • 设备选择你刚插入的U盘
  • 引导类型选择你刚刚下好的iso文件
  • 分区类型选择GPT
  • 目标系统类型选择UEFI

点击 开始 。并在弹窗中选择 以 ISO 镜像 模式写入(推荐)

点击 OK

稍等片刻,坐和放宽

等写入完成后,我们就可以进行下一步啦。

2. 调整启动项

进入计算机BIOS

重启电脑,并在电脑制造商标识在屏幕上亮起时长按 F2 以进入BIOS。

当然每个厂商的BIOS键不同,具体BIOS界面也不同,具体是啥还得自己去查询一下。

关闭Secure Boot

下面贴一个从别的博客扒来的图。

进入BIOS的高级设置(Advanced),当然不同的电脑对此的称呼不一样,找到 Security>Secure Boot 将其关闭。

保存并重启计算机,一般来说点击保存后计算机会自动重启。

在厂商LOGO处再次长按进入BIOS,此时如果你的引导U盘正常插入电脑,你应该可以看到一个对应的启动项 UEFI: USB, Partition 1 (USB) ,将其调整为优先级最高,即拖拽到最上面。

因为我的电脑上已经装过一个NixOS了,所以请忽略最上面的NixOS-boot。如果你的电脑没安装过其他系统,应该只能看到 Windows Boot Manager 和下面的 UEFI: USB

进入Live CD安装模式

首先你会进入一个NixOS的引导界面,内容大致是让你选择要安装什么类型的nixos,我们选择默认的第一个就好,接着,你将看到如下CLI界面:

同样,上图是我从别人那里搞过来的(因为我懒),我们要安装的是NixOS25.05,版本号和上面的上古老图不一样很正常。

因为我们选择的是最小化安装,是没有让你点击的UI的,我们当前进入的界面就是大名鼎鼎的tty

注意:当前的系统是完全运行在U盘上的,我们接下来要做的就是将其安装至电脑的硬盘上。

启用WiFi

首先我们要做的是——联网。

如果你有网线连接电脑可以跳过这一步。

启动wpa_supplicant服务:

sudo systemctl start wpa_supplicant 

进入交互模式:

sudo wpa_cli

在 命令行中依次输入:

> add_network
0
> set_network 0 ssid "你家 WIFI 的 名字"
OK
> set_network 0 psk "WIFI 密码"
OK
> set_network 0 key_mgmt WPA-PSK
OK
> enable_network 0
OK

如果出现类似如下输出

<3>CTRL-EVENT-CONNECTED - Connection to 32:85:ab:ef:24:5c completed [id=0 id_str=]

并一直有收发包日志在终端输出就说明连接成功。

此时可以直接在终端输入quit并回车退出。

如果你不放心,可以ping一下这个博客

ping cloverta.top

如果受到了大部分或全部的包说明连接正常。

更换国内镜像源

众所周知,由于不可抗力,NixOS的官方源我们不一定连的上。

sudo -i
nix-channel --add https://mirrors.ustc.edu.cn/nix-channels/nixos-unstable nixos
nix-channel --update  # 更新并解包频道

添加电子科大源。

分区

还记得我们之前为NixOS分出的磁盘空间吗,现在我们要利用好它。

在命令行中输入

lsblk 

你大概能得到一个类似这样的输出:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    1  57.3G  0 disk 
└─sda1        8:1    1  57.3G  0 part /run/media/cloverta/NIXOS-MINIM
nvme0n1     259:0    0 953.9G  0 disk 
├─nvme0n1p1 259:1    0 113.1G  0 part 
└─nvme0n1p2 259:2    0   512G  0 part

其中sda对应的是你的U盘,nvme0n1对应的是你的计算机固态硬盘,nvme0n1p1nvme0n1p2是你电脑上已有的磁盘分区。

假设你电脑里装了好几个硬盘,那么还会有nvme1n1之类的。

一定要看准了你是在哪个硬盘上进行操作!!别一不小心把windows的C盘删了(

如果你分区是在nvme0n1上进行的(很明显上述信息中两个分区的大小远小于硬盘总大小),那么输入

cfdisk /dev/nvme0n1

我们就能看到一个类似如下的界面

当然,你看到的肯定是英文的。

你界面上的下方的选择框应该有如下选项

[ Delete ] [ New ] [ Quit ] [ Help ] [ Write ] [ Dump ]

先选中free的磁盘空间,选择New新建分区,手动输入大小。

我们需要建立两个分区,一个主分区,另一个是boot分区。boot分区建议512MB的空间。

两个分区类型都选择Primary,建立好分区之后,再次输入lsblk查看分区情况,应该能看到这两个分区

 lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    1  57.3G  0 disk 
└─sda1        8:1    1  57.3G  0 part /run/media/cloverta/NIXOS-MINIM
nvme0n1     259:0    0 953.9G  0 disk 
├─nvme0n1p1 259:1    0 113.1G  0 part 
├─nvme0n1p2 259:2    0   512G  0 part 
├─nvme0n1p3 259:3    0   0.5G  0 part 
└─nvme0n1p4 259:4    0 327.8G  0 part 

接下来我们需要格式化这两个新增的分区,注意看准了分区号!

例如上述新增的两个分区为nvme0n1p3nvme0n1p4,但如果你新增的分区为nvme0n1p5,在后续操作中要更改对应的分区号,千万别输错了(

那我们以上述分区号为例。

我们可以看到nvme0n1p3是我们计划作为boot分区使用的,那我们现在格式化它为FAT32格式

mkfs.fat -F 32 -n boot /dev/nvme0n3

接着,我们将主分区格式化为btrfs格式

mkfs.btrfs -L nixos /dev/nvme0n1p4

之后将这两个分区挂载到NixOS的文件系统上

mount /dev/nvme0n1p4 /mnt
mkdir -p /mnt/boot
mount /dev/nvme0n1p3 /mnt/boot

接下来检查一下是否挂在成功

 lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    1  57.3G  0 disk 
└─sda1        8:1    1  57.3G  0 part /run/media/cloverta/NIXOS-MINIM
nvme0n1     259:0    0 953.9G  0 disk 
├─nvme0n1p1 259:1    0 113.1G  0 part 
├─nvme0n1p2 259:2    0   512G  0 part 
├─nvme0n1p3 259:3    0   0.5G  0 part /boot
└─nvme0n1p4 259:4    0 327.8G  0 part /nix/store

编辑系统配置

想必你肯定听说过大名鼎鼎的Nix声明式的系统配置方式,那我这里就不多赘述。

NixOS将所有的系统配置保存在一个名为configuration.nix的文件下,任何对系统的更改、管理和安装软件等等,你只需要修改这个configuration.nix就行,不需要手动去配置复杂的依赖和令人头疼的冲突,NixOS会帮你全都做好!

如果做不好你也可以随时把configuration.nix改回来,从根源上避免了滚挂(说你呢Arch

现在,我们生成一个系统默认配置文件:

nixos-generate-config --root /mnt

然后编辑配置

vim /mnt/etc/nixos/configuration.nix

你应该会看到一个类似这样的配置文件:

{ config, lib, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Use the systemd-boot EFI boot loader.
  # boot.loader.systemd-boot.enable = true;
  # boot.loader.efi.canTouchEfiVariables = true;

  networking.hostName = "nixos"; # Define your hostname.
  # Pick only one of the below networking options.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
  # networking.networkmanager.enable = true;  # Easiest to use and most distros use this by default.

  # Set your time zone.
  # time.timeZone = "";

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Select internationalisation properties.
  i18n = "en_US.UTF-8";

  # Enable the X11 windowing system.
  # services.xserver.enable = true;

  
  # Configure keymap in X11
  # services.xserver.xkb.layout = "us";
  # services.xserver.xkb.options = "eurosign:e,caps:escape";

  # Enable CUPS to print documents.
  # services.printing.enable = true;

  # Enable sound.
  # services.pulseaudio.enable = true;
  # OR
  # services.pipewire = {
  #  enable = true;
  #  pulse.enable = true;
  # };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  # users.users.Alice = {
  # isNormalUser = true;
  # extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
  # packages = with pkgs; [
  #   tree
  # ];
  # };

  # programs.firefox.enable = true;

  # List packages installed in system profile.
  # You can use https://search.nixos.org/ to find more packages (and options).
  environment.systemPackages = with pkgs; 
    [
      vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    ];

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # Copy the NixOS configuration file and link it from the resulting system
  # (/run/current-system/configuration.nix). This is useful in case you
  # accidentally delete configuration.nix.
  # system.copySystemConfiguration = true;
  
  # This option defines the first version of NixOS you have installed on this particular machine,
  # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
  #
  # Most users should NEVER change this value after the initial install, for any reason,
  # even if you've upgraded your system to a new NixOS release.
  #
  # This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
  # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how
  # to actually do that.
  #
  # This value being lower than the current NixOS release does NOT mean your system is
  # out of date, out of support, or vulnerable.
  #
  # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
  # and migrated your data accordingly.
  #
  # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
  system.stateVersion = "25.05"; # Did you read the comment?

}

这是最最最简的NixOS配置文件,现在我们来安装桌面环境:

基础配置

0.配置Grub以引导多系统开机

找到上述配置文件的

  # Use the systemd-boot EFI boot loader.
  # boot.loader.systemd-boot.enable = true;
  # boot.loader.efi.canTouchEfiVariables = true;

我们添加自己的grub配置

  # Use the systemd-boot EFI boot loader.
  # boot.loader.systemd-boot.enable = true;
  boot.loader = {
    efi = {
      canTouchEfiVariables = true;
      efiSysMountPoint = "/boot";
    };
    grub = {
      enable = true;
      device = "nodev";
      useOSProber = true;
      efiSupport = true;
    };
  };

1.配置语言

找到上述配置文件中的

  # Select internationalisation properties.
  i18n.defaultLocale = "en_US.UTF-8";

如果不是en_US.UTF-8我们先将其设置为英文。

2.配置网络

找到配置文件中的

  # Pick only one of the below networking options.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
  # networking.networkmanager.enable = true;  # Easiest to use and most distros use this by default.

这里我们使用networkmanager(更好用),就将下面那个解除注释

  # Pick only one of the below networking options.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
  networking.networkmanager.enable = true;  # Easiest to use and most distros use this by default.

3.配置时区

找到

 # Set your time zone.
 # time.timeZone = "";

将其改为

  # Set your time zone.
  time.timeZone = "Asia/Shanghai"

4.配置声音

找到

  # Enable sound.
  # services.pulseaudio.enable = true;
  # OR
  # services.pipewire = {
  #  enable = true;
  #  pulse.enable = true;
  # };

我们使用pipwire

  # Enable sound.
  # services.pulseaudio.enable = true;
  # OR
  services.pipewire = {
   enable = true;
   pulse.enable = true;
  };

5.配置用户

  # Define a user account. Don't forget to set a password with ‘passwd’.
  # users.users.alice = {
  # isNormalUser = true;
  # extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
  # packages = with pkgs; [
  #   tree
  # ];
  # };

将上面这段解除注释,并配置好你的用户名

例如我想给我的用户起名为cloverta,那么

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.cloverta = {
    isNormalUser = true;
    extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
    packages = with pkgs; [
      tree
    ];
  };

6.启用firefox

 programs.firefox.enable = true;

7.启用SSH

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

将下面那个解除注释

  # Enable the OpenSSH daemon.
  services.openssh.enable = true;

8.配置镜像源

在上述配置文件中加入

nix.settings.substituters = [ "https://mirror.sjtu.edu.cn/nix-channels/store" ];

你还可以看看默认配置文件里有啥,可以根据你的喜好启用一些小功能,但是

注意!!

千万不可以修改最后一行system.stateVersion = "25.05";的值,如果你一定要修改,准备好承担后果。

接下来我们选择两大经典图形桌面:

GNOME

在配置文件中加入

  services.displayManager.gdm.enable = true;
  services.desktopManager.gnome.enable = true;

并在

environment.systemPackages = with pkgs;
[
  vim
]

这个区块中加入

gnomeExtensions.blur-my-shell
gnomeExtensions.just-perfection
gnomeExtensions.arc-menu

这些是一些实用的GNOME插件。

KDE Plasma

不要加入上述内容,在配置文件中加入

  services.xserver.enable = true; # optional
  services.displayManager.sddm.enable = true;
  services.displayManager.sddm.wayland.enable = true;
  services.desktopManager.plasma6.enable = true;

并在environment.systemPackages = with pkgs;[]中加入

wget
kitty
kdePackages.kcalc
kdePackages.kcharselect
kdePackages.kcolorchooser
kdePackages.kolourpaint
kdePackages.ksystemlog
kdePackages.sddm-kcm
kdiff3
kdePackages.isoimagewriter
kdePackages.partitionmanager
hardinfo2
haruna
wayland-utils

部署系统

终于!我们完成了配置!好耶(ノ>ω<)ノ

现在安装系统:

sudo nixos-install --option substituters "https://mirror.sjtu.edu.cn/nix-channels/store"

之后,设置密码:

注意我的用户名是cloverta,你需要改成你自己在配置文件中设定的用户名。

nixos-enter  # 进入部署好的系统,类似 arch 的 chroot
passwd root  # 重置 root 密码
useradd -m -G wheel cloverta  # 添加普通用户,并加入 wheel 组
passwd cloverta  # 设置普通账户密码

然后关机,不出意外的话还是需要你去 BIOS 调整一下启动项,推荐把 NixOS 的启动项拉到最前面,因为在 GRUB 的界面你能选择引导至 NixOS 还是 Windows。

现在!见证奇迹!屏幕亮起!キタ━━━━(゚∀゚)━━━━!!

一些后续配置

现在你有了桌面环境,那么修改配置文件的复制粘贴便方便了很多。

那么剩下的我便不再赘述。修改完configuration.nix后使用

sudo nixos-rebuild switch

即可应用最新更改

中文输入法

我们安装fcitx5,找到我们之前修改过的i18n变量,将其改为

  i18n = {
    defaultLocale = "zh_CN.UTF-8";
    supportedLocales = [ "zh_CN.UTF-8/UTF-8" "en_US.UTF-8/UTF-8" ];

    # Fcitx5
    inputMethod = {
      type = "fcitx5";
      enable = true;
      fcitx5 = {
        waylandFrontend = true;
        plasma6Support = true;
      };
      fcitx5.addons = with pkgs; [
        fcitx5-chinese-addons
        fcitx5-pinyin-moegirl
        fcitx5-pinyin-zhwiki
        fcitx5-configtool
        fcitx5-fluent
      ];
    }; 
  };

字体

  fonts = {
    packages = with pkgs; [
      noto-fonts
      noto-fonts-cjk-sans
      noto-fonts-emoji
      liberation_ttf
      fira-code
      fira-code-symbols
      mplus-outline-fonts.githubRelease
      dina-font
      proggyfonts
      wqy_microhei
      wqy_zenhei
      hack-font
      nerd-font-patcher
      jetbrains-mono
    ];
  };

使用zsh并进行终端美化

  # Install zsh
  programs.zsh = {
    enable = true;
    # enableCompletions = true;
    autosuggestions.enable = true;
    syntaxHighlighting.enable = true;

    shellAliases = {
      ll = "ls -l";
      update = "sudo nixos-rebuild switch";
    };
    # history.size = 10000;

    ohMyZsh = { # "ohMyZsh" without Home Manager
      enable = true;
      plugins = [ "git" "dirhistory" "history" "autojump" "catimg" "colorize" "sudo"  ];
      custom = "$HOME/.oh-my-zsh/custom/";
      theme = "powerlevel10k/powerlevel10k";
    };
  };

并在sudo nixos-rebuild switch

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"

如果提示omz找不到插件,去bing上搜索插件名称,找到他们的github仓库,根据README中的步骤安装就行。

安装英伟达驱动

请参考wiki:Nvidia – NixOS Wiki


那么,博客就先到这里啦,我安装毕竟也是好几个星期之前了,如果博客内容有误,非常欢迎在下方留言,或者联系我:cloverta@petalmail.com


参考文献:

Installation – NixOS中文

入门安装(nixos 从0实现全集 梦中情os ) – 小类随手记

Archlinux+Windows 双系统安装教程(UEFI)2023.7 – NexusXian

KDE – NixOS Wiki

GNOME – NixOS Wiki

Setup Zsh + Oh-my-zsh + PowerLevel10K – NixOS (without Home-manager) – NixOS Discourse

NixOS Manual

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇