我有两个硬盘,一个安装了Windows,另一个是空硬盘,但里面有efi分区。没写到的基本都是照抄教程的和一些安装后的配置,就懒得写了。

Linux 启动流程

  1. 主板固件 uefi 启动,它会查看自己内部存储(NVRAM)里的启动顺序列表。
  2. 如果 ARCH 是第一位,因为ARCH 条目里记录着一个物理地址指向 grub 的 efi 文件,uefi 找到 gurb 的 efi 文件启动了 grub。
  3. Grub 读取硬盘分区,找到并读取自己的配置文件 /boot/grub/grub.cfg。
  4. 配置文件告诉 grub 内核的目录是 /boot,然后将内核加载到内存。
  5. 内核启动系统。
/
├── boot/   (启动目录)
│   ├── efi/     <-- EFI 分区挂载在这里,存放 GRUB 和 Windows 的引导文件
│   ├── grub/    <-- GRUB 的配置文件
│   ├── initramfs-linux.img  <-- 内核的内存镜像文件
│   └── vmlinuz-linux        <-- Linux 内核本身!
│
├── etc/    (配置目录) -> 存放所有系统级软件的配置文件,改过的 pacman.conf, environment 都在这
│
├── home/   (用户家目录)
│   └── kkk/  <-- 这是普通用户 kkk 的家目录,所有个人文件和桌面设置都在这里
│
├── root/   (root用户的家目录) -> root 用户的专属家目录,和普通用户完全分开
│
├── usr/    (用户程序目录) -> 安装的绝大部分软件、库、文档都在这里,是系统最庞大的部分
│   ├── bin/     -> 主要的可执行程序
│   └── lib/     -> 程序的库文件
│
├── var/    (可变文件目录) -> 存放经常变化的文件,比如日志(log)、缓存(cache)等
│
├── bin/    (二进制文件) -> 存放最基础的、系统启动时就需要用到的命令 (如 ls, cp)
├── sbin/   (系统二进制) -> 存放只有 root 才能使用的基础管理命令
├── dev/    (设备文件) -> 把的硬件(硬盘、鼠标、键盘)抽象成文件,供系统读写
├── lib/    (库文件) -> 存放最基础的、系统启动就需要用到的库
├── mnt/    (挂载点) -> 临时挂载其他设备的目录
└── tmp/    (临时目录) -> 存放临时文件,重启后通常会清空

Windows准备

  1. 官网下载镜像,arch linux-download
  2. 将镜像烧录在启动盘,如用balenaEtcher。或者更高级使用vendoy,一个u盘可以安装多个启动镜像。
  3. 删除分区,保留efi系统分区(Windows的efi分区就是这个)

BIOS设置

  1. 如果是 balenaEtcher 安装的,在boot页面将第一个启动项改成 usb_efi。
  2. 关闭 security boot。

进入arch live

这一步是将 arch linux 加载在内存中,将硬盘分区,设置一些东西,下载必要的组件。

检查 uefi 启动

ls /sys/firmware/efi/efivars,若无报错信息则是uefi

配置网络

  • iwctl,进入iwd工具。
  • device list,查看网卡名
  • station wlan0 scan,扫描网络
  • station wlan0 get-newworks,列出扫到的Wi-Fi
  • station wlan0 connect %name of Wi-Fi%,连接wifi,随后输入密码
  • exit退出 iwd,用 ping测试

更新系统时钟

timedatectl set-ntp true

硬盘分区

lsblk,确认硬盘名称,记录下

cfdisk /dev/nvme0n1,nvme0n1是硬盘名称,不要搞错!这一步是使用cfdisk分区

删除分区
使用上下方向键选中 需要放入的分区, 下方菜单选择 Delete 回车,这样就获得了 Free space

创建swap分区

  • 选中 free space ,下方菜单选中 New ,然后回车,输入大小,应该≥内存的 60%
  • 创建后分区类型是 Linux filesystem,左右移动光标到下方菜单的 Type,回车
  • 上下移动光标选中 Linux swap,回车

创建根 / 分区

  • 上下移动光标选中剩下的Free space
  • 下方菜单选中 New 回车
  • 默认使用所有剩余空间,回车
  • 默认是 Linux filesystem,回车

确认下分区表

  • 应该有个Linux swap分区
  • 还有一个大空间的 Linux filesystem分区

确认无误后方向键选择下方 wirte 选项,回车,接着确认,最后选中 Quit 退出

格式化分区

lsblk确认下分区,确认swap分区和 根分区的确切名称

格式化swap 分区,mkswap /dev/nvme0n1p4

格式化 根 分区,mkfs.ext4 /dev/nvme0n1p5

激活 swap 分区, swapon /dev/nvme0n1p4

挂载 根 分区,mount /dev/nvme01p5 /mnt

挂载 EFI分区
mkdir /mnt/boot
mount /dev/nvme0n1p2 /mnt/boot

检查一下,lsblk,可以看到 /dev/nvme0n1p5 后面写着 MOUNTPOIN/mnt,/dev/nvme0n1p2 后面写着 MOUNTPOINT /mnt/boot

安装arch 核心系统

这将会把最小化,功能齐全的Linux 系统所需软件包下载并安装到准备好的分区中

默认使用全球镜像源,速度不佳,需要更改镜像源
编辑镜像列表,nano /etc/pacman.d/mirrorlist
在镜像列表顶端输入中科大镜像源 Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arc

下载软件包,pacstrap /mnt base linux linux-firmware vim

系统配置

进入新系统,arch-chroot /mnt, chroot即change root

设置时区
系统时区设置为上海时间,ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
将主板时钟与系统同步,`hwclock --systohc‘

设置语言
打开 locale.gen,nano /etc/locale.gen,找到下面两行删除 # 号

  • en_US.UTF-8 UTF-8
  • zh_CN.UTF-8 UTF-8

设置英文为默认语言,避免命令行下出现乱码,echo "LANG=en_US.UTF-8" > /etc/locale.conf

设置主机名,echo "%主机名%" > /etc/hostname

配置 hosts 文件,nano /etc/hosts,最后一行添加 127.0.1.1 你的主机名.localdomain 你的主机名

设置root 密码,passwd

GRUB 引导程序

安装 os-prober,它会自动扫描硬盘上其他存在的操作系统,grub它能开机引导时切换启动系统,pacman -S grub efibootmgr os-prober

部署grub到efi分区
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH

  • --target=x86_64-efi:指定系统是 64位的 UEFI 系统。
  • --efi-directory=/boot:告诉 GRUB,EFI 分区被挂载在了 /boot 目录下
  • --bootloader-id=ARCH:在 UEFI 启动菜单里为 Arch Linux 创建一个名为 "ARCH" 的启动项。

生成grub配置文件
启用 os-prober 功能,nano /etc/default/grub ,找到#GRUB_DISABLE_OS_PROBER=false这一行,删除 # ,保存退出
生成最终的配置文件grub-mkconfig -o /boot/grub/grub.cfg,看到输出Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi则grub成功找到Windows系统。

字体

sudo pacman -S noto-fonts-cjk # 安装字体
fc-cache -fv # 更新缓存

然后是在 ~/.config/fontconfig/ 目录创建一个 fonts .conf 文件,告诉系统需要渲染一个通用无衬线字体时,优先使用安装的中文字体。实际体验解决了浏览器不使用系统字体的问题。我的配置如下:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
    <alias>
        <family>sans-serif</family>
        <prefer>
            <family>Noto Sans</family>
            <family>Noto Sans CJK SC</family>
            <family>Noto Sans CJK TC</family>
            <family>Noto Color Emoji</family>
        </prefer>
    </alias>

    <alias>
        <family>monospace</family>
        <prefer>
            <family>Fira Code</family>
            <family>JetBrains Mono</family>
            <family>Noto Sans Mono CJK SC</family>
            <family>Noto Color Emoji</family>
        </prefer>
    </alias>

    <match target="font">
        <edit name="antialias" mode="assign">
            <bool>true</bool>
        </edit>
        <edit name="hinting" mode="assign">
            <bool>true</bool>
        </edit>
        <edit name="hintstyle" mode="assign">
            <const>hintslight</const>
        </edit>
        <edit name="rgba" mode="assign">
            <const>rgb</const>
        </edit>
    </match>

</fontconfig>

终端

由于 Oh My Zsh 太过“大”,目前并未使用到其中过多的插件,就没有选择使用了。
完全照着这个文档配置了 GitHub - shorinkiwata/Archlinux-Gnome-FullGuide-ShorinArchExperience: archlinux+gnome安装流程

使用体验

  • NVIDIA 独显有一些问题,混合模式下桌面锁死 60 hz 刷新率。
  • Google-chrome 使用极其糟糕,无法调用独显,无法硬解视频。转到 Firefox 问题迎刃而解,还发现 Firefox 除了插件少一点还是挺好用的。
  • 自动平铺体验很好,Windows 里面的 chrome 甚至没有分屏功能。几个工作区也避免了桌面太乱。
  • 配合快捷键效率高了很多。
    桌面

    桌面

    遇到的问题

    问题 1

    grub-install 报错:failed to make directory /boot/grub/locale,无法将引导程序安装到 EFI 分区。

原因 :

  1. efi 分区过小,只有100m,将boot 分区放在 efi 分区,内核文件将空间占满。无法将 arch linux 的 boot 分区放在里面。Arch Linux 的 boot 分区包括了 efi 和内核文件。

解决办法 :

  1. 将 Linux 内核文件删除,不知道为什么稀里糊涂没删除掉。
  2. 但是此时 efi 分区还是满的,意识到可能是 Windows 本来就占满了。删除 Windows 的字体文件,腾出 4 mb 的空间。
  3. 然后将 Linux 的 boot 目录移到根目录下。
  4. 然后将原来的 efi 分区挂载到 boot 目录中。Grub 生成配置文件。Grub 的 efi 文件占用了腾出来的 4 mb 空间。

问题 2:

完成安装并重启后,没有看到 GRUB 菜单,电脑直接启动了 Windows。

原因 :

  1. 主板固件 (UEFI) 的 NVRAM 启动顺序中,Windows Boot Manager 的优先级高于新安装的 ARCH。主板先看到了 Windows,就直接启动了它。

解决办法 :

  1. 进入 BIOS/UEFI 设置界面,在 Boot Priorities(特别是 UEFI Hard Disk Drive BBS Priorities)菜单中,将 ARCH 的启动顺序手动提升至第一位,保存并退出。

问题 3:

Grub 界面没看到 arch linux。

原因 :

  1. 因为之前的清理和错误的安装尝试,导致根分区下的 /boot 目录里缺少了 Linux 内核文件 。所以在 chroot 环境里运行 grub-mkconfig 时,它找不到可以引导的 Linux 系统,因此无法为它创建菜单项。

解决办法 :

  1. 使用 Arch 安装 U 盘启动,arch-chroot 进入已安装的系统,通过 pacman -S linux 重新安装内核以在正确位置生成内核文件,最后重新运行 grub-mkconfig -o /boot/grub/grub.cfg,成功生成了包含所有选项的完整菜单。

参考

  1. ARCH LINUX中文维基
  2. GitHub - shorinkiwata/Archlinux-Gnome-FullGuide-ShorinArchExperience: archlinux+gnome安装流程
  3. 序章 | archlinux 简明指南

ARCH LINUX

ARCH LINUX