前言

最近准备入手一台笔记本电脑(上船!),并打算以 Linux 为主力(Linux 在编程,安全等领域的使用体验非常好),辅以 Windows 10(Windows 11 的 UI/UX 体验一般,暂不考虑)解决游戏和部分专有软件的使用需求。

其实,实机安装的时候我会选择 Arco Linux 或 Manjaro。

安装前的准备

  1. 本篇以当下 主流的 EFI + GPT 的方式进行安装测试;
  2. 建议使用 SSH 远程连接进行安装,复制粘贴命令更便捷;
  3. 遇到意外的错误建议先尝试翻译并阅读错误报告,其次是在网络及官方 Wiki 进行检索;
  4. 实机安装前务必在虚拟机模拟一次,将遇到的错误记录下来。

关于 Arch Linux

Arch Linux 是通用 x86-64 GNU/Linux 发行版。Arch采用滚动升级模式,尽全力提供最新的稳定版软件。初始安装的Arch只是一个基本系统,随后用户可以根据自己的喜好安装需要的软件并配置成符合自己理想的系统。

官方介绍:Arch Linux (简体中文) - ArchWiki

Arch Linux 遵循 KISS 原则(Keep It Simple, Stupid),其系统非常简洁(避免任何不必要的添加、修改和复杂增加),采用滚动更新的方式总能使用户的系统保持最新状态(虽说也会伴随一定的风险)。由于配置较为繁琐,建议等有了一定的 Linux 使用(折腾)经验再入手,或者尝试同样基于 Arch Linux 的 Manjaro,Arco Linux 等发行版。

为什么选择 Arch Linux

一来是想从零配置 Linux 的桌面环境,了解各层所拥有的组件及它们之间的差异。再一个就是可以自定义自己所需的软件,只安装需要的,节省磁盘空间。

桌面环境的选择

个人比较喜欢 GNOME 的设计风格,并且入门的第一款 Linux 发行版也是 Ubuntu。但 KDE plasma 也不差,并且 Krita(一款开源的绘图/动画软件)也来源于 KDE 社区。听说 KDE 同 Xfce 4 的内存消耗相近,有机会的话每个桌面环境都会尝试用一遍的。

文件系统类型

如果不清楚各文件系统之间的差异,直接采用目前“主流”的 ext4 即可。

参考文章:文件系统类型(ext4、xfs、fat32、vfat、ntfs、….) - daduryi - 博客园

分区方案

Linux
硬盘设备 挂载点 磁盘容量 文件系统 分区类型
/dev/nvme0n1 (512G NVMe SSD) /efi 建议 512MB ~ 1 GB fat32 EFI System
/ 100 GB(建议 60 GB 或更多) ext4 Linux filesystem
/swap 4 GB(休眠功能所需) swap Linux swap
/home 利用剩余全部空间或自定义 ext4 Linux filesystem

使用技巧

设置显示宽高(在 EFI 引导界面中)

1
nomodeset video=800x450  # 仅限屏幕无法完全显示的情况下

设置显示字体及大小

1
setfont ter-132n  # 仅限字体过小的情况下

更改键盘布局

1
loadkeys colemak  # 示例,一般用户不需要更改

虚拟机安装测试

安装步骤概览

  • 载入光盘镜像:
    • 设置为 UEFI 引导模式;
    • 关闭“安全引导”;
    • 选择 U 盘启动。
  • 进行基础的分区操作:
    • 基础的根分区,引导分区(双系统需留意原先引导分区的位置),交换空间,用户分区(可选);
    • 保存分区设置;
    • 格式化分区。
  • 挂载分区:
    • 按照下列顺序进行挂载:
      • 根分区
      • 引导分区
      • 交换分区
      • 用户分区
  • 安装系统及基础软件包(建议安装前将镜像源设置为国内服务器):
    • Linux 内核及头文明
    • 基础软件包
    • 文本编辑工具
    • Linux 固件包(硬件驱动)
    • CPU 微码补丁
  • 进入系统进行基础配置:
    • 生成用于自动挂载分区的 fstab 文件;
    • 安装引导程序并进行配置;
    • 设置语言环境、时区、主机名称,Pacman 国内镜像源和用户等。
  • 退出环境并卸载分区;
  • 重启,查看引导是否正常。

启动虚拟机

01.png

设置分区

1
2
lsblk  # 查看硬盘设备及分区信息
gdisk /dev/nvme0n2 # 对硬盘进行分区,将 nvme0n2 改为实际的磁盘名称。此外,也可以用图形界面的 cdfisk,操作简单

引导分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 新建分区
Command (? for help): n

# 分区序号(1-128,默认 1),直接回车保持默认即可
Partition number (1-128, default 1):

# 起始扇区 (34-16777182, 默认 = 2048) 或 {+-}大小{单位},同样保持默认
First sector (34-16777182, default = 2048) or {+-}size{KMGTP}:

# 结束扇区 (2048-16777182, 默认 = 16775167) 或 {+-}大小{单位},这里需要指定为 1G
Last sector (2048-16777182, default = 16775167) or {+-}size{KMGTP}: +1G

# 大概的意思就是当前分区类型为 8300,是 Linux 文件系统
# 然后输入 L 可以搜索和查看所有文件类型对应的 ID 编号
Current type is 8300 (Linux filesystem)
Hex code or GUID (L, to show codes, Enter = 8300): L

# 因为是 EFI 引导分区,直接搜索 efi 即可
# 第二行是返回的结果,前边的 ef00 就是我们需要输入的 ID
Type search string. or <Enter> to show all codes: efi
ef00 EFI system partition

Hex code or GUID (L, to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI system partition'

根分区

1
2
3
4
5
6
7
Partition number (4-128, default 4):
First sector (34-16777182, default = xxxxxxxx) or {+-}size{KMGTP}:
Last sector (1050624-16777182, default = xxxxxxxx) or {+-}size{KMGTP}: +100G

Current type is 8300 (Linux filesystem)
Hex code or GUID (L, to show codes, Enter = 8300): # 留空,默认即可
Changed type of partition to 'Linux filesystem'

交换分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Partition number (2-128, default 2):

First sector (34-16777182, default = 1050624) or {+-}size{KMGTP}:

# swap 分区的容量根据内存大小以及主机的用途决定,如果需要休眠功能推荐设置多一些,例如 4G
# 通常来说,物理内存越多,虚拟内存则设置得越少,或者直接不使用虚拟内存,也就不用建立这个分区
# 而内存较少的情况,一般会创建比总量多一倍
# 举个例子,2G 内存可以建立 4G 的交换空间或更多;8G 内存只需要建立 4G 或 2G 左右的
Last sector (xx-xxxxxxxx, default = 16775167) or {+-}size{KMGTP}: +4G

Current type is 8300 (Linux filesystem)
Hex code or GUID (L, to show codes, Enter = 8300): L

Type search string. or <Enter> to show all codes: swap
8200 Linux swap a502 FreeBSD swap
a582 Midnight BSD swap a901 NetBSD swap
bf02 Solaris swap

Hex code or GUID (L, to show codes, Enter = 8300): 8200
Changed type of partition to 'Linux swap'

home 分区

1
2
3
4
5
6
7
Partition number (3-128, default 3):  # 留空,默认即可
First sector (xx-xxxxxxxx, default = xxxxxxxx) or {+-}size{KMGTP}: # 留空,默认即可
Last sector (xxxxxxxx4-xxxxxxxx, default = xxxxxxxx) or {+-}size{KMGTP}: # 留空,表示使用所有剩余空间

Current type is 8300 (Linux filesystem)
Hex code or GUID (L, to show codes, Enter = 8300): # 留空,默认即可
Changed type of partition to 'Linux filesystem'

查看分区结果并保存

1
2
3
Command (? for help): p  # 查看分区结果
Command (? for help): w # 保存设置,保存完成后自动退出
# Command (? for help): q # 退出程序

02.png

格式化分区

参考文章:
XFS vs Ext4 vs其他-哪种文件系统稳定,可靠,可以长期运行(例如24/7情况)[关闭]
VFAT和FAT32文件系统有什么区别?

1
2
3
4
5
mkfs.ext4 /dev/nvme0n2p2  # 格式化根分区
mkfs.ext4 /dev/nvme0n2p4 # 格式化 home 分区
mkfs.vfat /dev/nvme0n2p1 # 格式化 EFI 分区

mkswap /dev/nvme0n2p3 # 格式化交换分区

03.png

挂载分区

1
2
3
4
5
6
7
8
9
mount /dev/nvme0n2p2 /mnt       # 挂载根分区

mkdir /mnt/efi # 创建 EFI 目录
mount /dev/nvme0n2p1 /mnt/efi # 挂载 EFI 分区

mkdir /mnt/home # 创建 home 目录
mount /dev/nvme0n2p4 /mnt/home # 挂载 home 分区

swapon /dev/nvme0n2p3 # 启用交换分区

04.png

设置 pacman 镜像源

1
2
3
# 以速度进行排序,生成使用国内服务器的镜像列表(注意协议是选择了 HTTPS)
reflector --country China --age 24 --sort rate --protocol https --save /etc/pacman.d/mirrorlist
pacman -Syy # 同步镜像源

05.png

安装基础软件包

1
2
pacstrap /mnt base base-devel linux linux-headers linux-firmware  # 基础软件包和系统内核
pacstrap /mnt bash-completion openssh dhcpcd iwd vim git proxychains-ng # 几款必备的软件

06.png
07.png

生成 fstab 文件

1
2
3
genfstab -U /mnt >> /mnt/etc/fstab

cat /mnt/etc/fstab # 检查是否有错误

08.png

进入已安装完成的系统环境

1
arch-chroot /mnt

设置系统语言

1
2
3
4
5
vim /etc/locale.gen  # 编辑该文件,取消注释所需的语言
en_US.UTF-8 UTF8
zh_CN.UTF-8 UTF8
locale-gen # 生成 locale 文件
echo "LANG=en_US.UTF-8" > /etc/locale.conf # 控制台无法渲染过于复杂的字体,强行设置将无法正常显示

09.png

设置时区

1
2
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  # 设置为上海
hwclock --systohc # 同步系统和硬件时钟

同步网络时间

输入timedatectltimedatectl status查看当前系统时间设置,并将当前时区设置为Asia/Shanghai

1
2
3
timedatectl set-ntp true  # 启用 NTP 同步
timedatectl set-timezone "Asia/Shanghai" # 设置时区
timedatectl status # 查看当前系统时间

设置主机名

1
2
3
4
5
6
echo 'hostname' > /etc/hostname

vim /etc/hosts
++ 127.0.0.1 localhost
++ ::1 localhost
++ 127.0.1.1 hostname

10.png

为 root 用户设置密码

1
passwd root

新建非特权用户

1
2
3
4
5
6
7
# 记得将 username 替换为实际的用户名
useradd -m -G wheel username # -m 代表创建 home 目录,-G 指定组为可以使用 sudo 的 wheel
passwd username # 设置密码

# 启用 wheel 组 (vim 在命令模式,将光标移动至段首的注释符'#',按下 x 即可删除注释符)
visudo
%wheel ALL=(ALL) ALL

11.png

安装微码

1
2
3
4
5
# 对应 Intel CPU
pacman -S intel-ucode

# 对应 AMD CPU
pacman -S amd-ucode

安装 GRUB 引导

UEFI与BIOS - 有什么区别,哪一个更好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# grub 为引导程序,efibootmgr 提供 EFI 支持,os-prober 用于识别多系统(也可以不安装,直接使用固件自带的引导管理)
pacman -S grub efibootmgr os-prober
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck

vim /etc/default/grub
GRUB_TIMEOUT=3
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=5 nowatchdog"
# 日志等级 5 方便出错时进行调试,nowatchdog 则让系统在死机时无需等待,在一定程度上提升开关机速度
# 如果想要休眠功能,则可在 nowatchdog 后面添加 resume=/dev/sdaX(此处为 swap 分区的路径)
# GRUB_CMDLINE_LINUX_DEFAULT="loglevel=5 nowatchdog resume=/dev/nvme0n2p3"
GRUB_DISABLE_SUBMENU=y # 关闭子菜单,能更为方便的切换系统
GRUB_GFXMODE=auto # (可选) 改为设备实际的屏幕分辨率,如 1920x1080
GRUB_DISABLE_OS_PROBER=false # 多系统引导需取消改行注释,并确保值为 false
grub-mkconfig -o /boot/grub/grub.cfg # 写入配置

cat /boot/grub/grub.cfg # 检查 grub.cfg 配置项

12.png

识别 Windows 的 EFI

1
2
3
4
5
6
7
8
9
10
cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak  # 备份原有的 GRUB 配置文件

lsblk -f # 查找 Windows 所在磁盘对应的 EFI 分区名称

mount /dev/nvme0n1p1 /mnt # 挂载 Windows EFI 分区
ls -l /mnt # 可以查看是否挂载成功

os-prober # 识别 Windows 的引导

grub-mkconfig -o /boot/grub/grub.cfg # 更新 GRUB 配置

13.png

完成安装

1
2
3
exit            # 退出环境
umount -R /mnt # 卸载分区
reboot # 重启

重启后可见 Arch Linux 及 Windows 引导选项。
14.png

连接网络

官方文档:https://wiki.archlinux.org/title/Network_configuration

无线网络

1
2
3
4
5
6
7
8
9
10
iwctl
device list
station wlan0 scan # 假设无线网卡名称为 wlan0
station wlan0 get-networks

station wlan0 connect cmcc-xxxx # 将 cmcc-xxxx 修改为实际名称
Passphrase: **** # 输入密码,完成后不会有任何提示
exit

ping -c 4 example.com # 检查网络连接是否正常

有线网络

1
2
3
4
5
6
7
8
9
10
11
# 动态 IP
ip link # 查看有线网卡及状态(可简写为 ip l)
ip link set enp0s3 up # 将 enp0s3 修改为实际的网卡名称
systemctl enable dhcpcd
systemctl start dhcpcd # 动态获取 IP 则需启用 DHCP

# 静态 IP
ip address show # 设置静态 IP(可简写为 ip a)
ip address add 10.0.2.16/24 broadcast + dev ens0s3 # 将 IP 地址添加到接口
ip address del 10.0.2.16/24 broadcast + dev ens0s3 # 将 IP 地址从接口中删除
ip address flush dev ens0s3 # 删除所有符合条件的地址,例如某个特定接口的地址

添加其他内核(可选)

linux-zen

1
2
3
4
# 牺牲了吞吐量和功耗以提升台式机性能

pacman -S linux-zen linux-zen-headers
grub-mkconfig -o /boot/grub/grub.cfg #更新引导配置

linux-ck

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 使用 技术提升桌面和笔记本电脑的使用体验

/lib/ld-linux-x86-64.so.2 --help | grep supported # 查看支持

# 添加密钥
pacman-key -r 5EE46C4C --keyserver hkp://pgp.mit.edu && pacman-key --lsign-key 5EE46C4C

vim /etc/pacman.conf # 在末尾添加该镜像库
++ [repo-ck]
++ Server = https://mirror.lesviallon.fr/$repo/os/$arch
++ Server = http://repo-ck.com/$arch
pacman -Syy # 同步镜像库
pacman -Syu linux-ck # 安装内核

grub-mkconfig -o /boot/grub/grub.cfg #更新引导配置

15.png
16.png
17.png

参考文章

Installation guide - ArchWiki
General recommendations - ArchWiki
Laptop - ArchWiki
Arch Linux 安装与配置记录 - Cyrus Yip | 叶寻
How To Install Arch Linux 2021 [Step by Step Guide]