我有两个硬盘,一个安装了Windows,另一个是空硬盘,但里面有efi分区。没写到的基本都是照抄教程的和一些安装后的配置,就懒得写了。
Linux 启动流程
- 主板固件 uefi 启动,它会查看自己内部存储(NVRAM)里的启动顺序列表。
- 如果 ARCH 是第一位,因为ARCH 条目里记录着一个物理地址指向 grub 的 efi 文件,uefi 找到 gurb 的 efi 文件启动了 grub。
- Grub 读取硬盘分区,找到并读取自己的配置文件 /boot/grub/grub.cfg。
- 配置文件告诉 grub 内核的目录是 /boot,然后将内核加载到内存。
- 内核启动系统。
/
├── 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准备
- 官网下载镜像,arch linux-download。
- 将镜像烧录在启动盘,如用balenaEtcher。或者更高级使用vendoy,一个u盘可以安装多个启动镜像。
- 删除分区,保留efi系统分区(Windows的efi分区就是这个)
BIOS设置
- 如果是 balenaEtcher 安装的,在boot页面将第一个启动项改成 usb_efi。
- 关闭 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-Fistation 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 分区。
原因 :
- efi 分区过小,只有100m,将boot 分区放在 efi 分区,内核文件将空间占满。无法将 arch linux 的 boot 分区放在里面。Arch Linux 的 boot 分区包括了 efi 和内核文件。
解决办法 :
- 将 Linux 内核文件删除,不知道为什么稀里糊涂没删除掉。
- 但是此时 efi 分区还是满的,意识到可能是 Windows 本来就占满了。删除 Windows 的字体文件,腾出 4 mb 的空间。
- 然后将 Linux 的 boot 目录移到根目录下。
- 然后将原来的 efi 分区挂载到 boot 目录中。Grub 生成配置文件。Grub 的 efi 文件占用了腾出来的 4 mb 空间。
问题 2:
完成安装并重启后,没有看到 GRUB 菜单,电脑直接启动了 Windows。
原因 :
- 主板固件 (UEFI) 的 NVRAM 启动顺序中,
Windows Boot Manager
的优先级高于新安装的ARCH
。主板先看到了 Windows,就直接启动了它。
解决办法 :
- 进入 BIOS/UEFI 设置界面,在
Boot Priorities
(特别是UEFI Hard Disk Drive BBS Priorities
)菜单中,将ARCH
的启动顺序手动提升至第一位,保存并退出。
问题 3:
Grub 界面没看到 arch linux。
原因 :
- 因为之前的清理和错误的安装尝试,导致根分区下的
/boot
目录里缺少了 Linux 内核文件 。所以在 chroot 环境里运行grub-mkconfig
时,它找不到可以引导的 Linux 系统,因此无法为它创建菜单项。
解决办法 :
- 使用 Arch 安装 U 盘启动,
arch-chroot
进入已安装的系统,通过pacman -S linux
重新安装内核以在正确位置生成内核文件,最后重新运行grub-mkconfig -o /boot/grub/grub.cfg
,成功生成了包含所有选项的完整菜单。
参考
- ARCH LINUX中文维基
- GitHub - shorinkiwata/Archlinux-Gnome-FullGuide-ShorinArchExperience: archlinux+gnome安装流程
- 序章 | archlinux 简明指南
评论区(暂无评论)