arch linux 安装

文章目录


前言


1. 制作U盘启动盘

准备环境

arch linux ISO文件下载:
本文选择 .iso 文件,从U盘安装系统

https://archlinux.org/download/

下载制作工具 rufus:

https://rufus.ie/en/

启动盘制作完成后,插入要安装系统的电脑,从该电脑BIOS中设置为从U盘启动。

重启电脑后,应该看到如下画面:
需要先在BIOS中关闭安全启动

选择第一个进入。在经过一些时间的加载后会以root用户登录到虚拟控制台并启动zsh shell。应该看到如下画面:

arch linux的安装程序是命令行界面,而非向Ubuntu一样的图形化界面

此时进入的系统为 live environment , 意为整个系统完全在内存中运行,不依赖任何外存

连接网络

输入下面的指令显式当前可用的网卡

sh 复制代码
ip link  

可选的网络链接方式:

  1. 以太网
  2. Wi-Fi
  3. 无线蜂窝网络

以为Wi-Fi为例介绍如何使用iwctl命令连接

iwctl有交互式和非交互式工作方式,下面是非交互式方式;输入iwctl后会进入交互式界面,交互式命令只需去掉iwctl即可

sh 复制代码
iwctl device list  # 查看无线网卡信息
# 如果网卡没有打开就打开它
iwctl device <name> set-property Powered on
iwctl adapter adapter set-property Powered on
# 初始化扫描
iwctl station <name> scan
# 列出扫描到的网络
iwctl station <name> get-networks
# 连接网络, 然后输入密码
iwctl station <name> connect <SSID>
# 或者连接是直接输入密码:
iwctl --passphrase <password> station <name> connect <SSID>

# 连接成功后检查是否有网络
ping ping.archlinux.org

通过timedatectl查看时间是否同步,否则会影响包签名和tls证书认证

为硬盘分区

硬盘分区三部曲:建立分区表=》创建分区=》格式化分区

至少需要下面的分区:

  • rootfs分区
  • UEFI启动:一个EFI系统分区

分区example:

挂载点 分区 分区类型 建议大小
/boot /dev/efi_system_partition EFI system partition 1GB
[SWAP] /dev/swap_partition Linux swap >4GB
/ /dev/root_partition root(/) > 32 GB

以parted命令创建分区

2048s = 1MB

2097152s = 1GB

sh 复制代码
parted /dev/sda  # 使用块硬盘

# 建立分区表
(parted) mklabel gpt

# 1GB大小的EFI分区
(parted) mkpart "EFI System Partition" fat32 2048s 2099199s

# 为 EFI 分区设置 "boot" 标志
(parted) set 1 boot on

# 创建交换分区 (SWAP) 8GB
mkpart "Linux Swap" linux-swap 2099200s  18876415s

# 创建根分区 (/) 并使用所有剩余空间
(parted) mkpart "Linux Root" ext4 1025MiB 100%


格式化分区:

sh 复制代码
# 格式化 EFI 分区为 FAT32:
mkfs.fat -F 32 /dev/sda1

# 初始化交换分区:
mkswap /dev/sda2
swapon /dev/sda2 # (可选) 立即启用该交换空间

# 格式化根分区为 ext4:
mkfs.ext4 /dev/sda3

挂载文件系统:

sh 复制代码
mount /dev/root_partition /mnt
mount --mkdir /dev/efi_system_partition /mnt/boot
swapon /dev/swap_partition

2. 安装

安装定义arch linu的最小的基础包:

sh 复制代码
pacstrap -K /mnt base linux linux-firmware

其它软件包可在chroot进入新系统后通过pacman安装

该命令就是再安装arch linux。执行完后 在/mnt/boot目录下会看到两个文件:

initramfs-linux.img : 运行在内存中的最小文件系统,内核启动时会自动加载它

vmlinuz-linux : Linux 内核文件

3. 系统配置

设置自动挂载分区

sh 复制代码
genfstab -U /mnt >> /mnt/etc/fstab

临时切换root目录,将根目录切换至新系统

sh 复制代码
arch-chroot /mnt

设置时区

sh 复制代码
ln -sf /usr/share/zoneinfo/<Area>/<Location> /etc/localtime

# 生成/etc/adjtime
hwclock --systohc

本地化设置

sh 复制代码
# 生成 /etc/locale.gen
locale-gen

# 生成 /etc/locale.conf
echo "LANG=en_US.UTF-8" > /etc/locale.conf

# 设置 Linux 虚拟控制台(非图形界面)的本地化参数
/etc/vconsole.conf

网络配置

sh 复制代码
echo "<name>" > /etc/hostname

关于名称如何选:

https://datatracker.ietf.org/doc/html/rfc1178

需要为新系统安装WiFi工具、网络连接工具,保证重启后新系统可以通过pacman连接网络安装其它工具

sh 复制代码
# 安装iwctl
pacman -S iwd
sh 复制代码
systemctl enable iwd
systemctl start iwd

initramfs

在调用pacstrap命令时,mkinitcpio已经运行过了,因此不需要再执行了

为root用户设置密码

passwd

选择boot loader

https://wiki.archlinux.org/title/Arch_boot_process#Boot_loader

UEFI: Unified Extensible Firmware Interface 支持读取分区表和文件系统。UEFI不启动任何在MBR(Master Boot Record)上的boot code,启动依赖NVRAM的启动项。UEFI标准支持FAT12, FAT16和FAT32文件系统。

UEFI启动EFI应用,如,boot loader,boot manager, UEFI shell等。这些应用通常作为文件存储在EFI系统分区。每个供应商都能将他们的文件存储在EFI系统分区下的/EFI/vendor_name目录下。通过向NVRAM添加启动项或UEFI shell来启动应用。

boot loader 选择 GRUB

UEFI 安装 GRUB

https://wiki.archlinux.org/title/GRUB

这里说的是GRUB 2,即为新版本的

在使用 UEFI 安装时,重要的是要以 UEFI 模式启动安装介质,否则 efibootmgr 将无法添加 GRUB UEFI 启动项。

首先需要安装grub和efibootmgr:GRUB是boot loader,efibootmgr被用于GRUB安装脚本向NVRAM写启动项。

sh 复制代码
# 通过pacman安装grub-install
pacman -S grub efibootmgr

安装完grub和efibootmgr后,接下来要做的:

  1. 选择引导加载程序标识符,此处名为 GRUB。将在 esp/EFI/ 中创建一个具有该名称的目录来存储 EFI 二进制文件,并且该名称将出现在 UEFI 启动菜单中以标识 GRUB 启动项。
  2. 执行以下命令将 GRUB EFI 应用程序 grubx64.efi 安装到 esp/EFI/GRUB/ 并将其模块安装到 /boot/grub/x86_64-efi/
sh 复制代码
# 执行 grub-install 命令
grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

执行完上面的命令后,/boot/ 目录结构如下(需要修改成下面的结构,否则启动失败)

复制代码
EFI
	GRUB              # --bootloader-id
		grubx64.efi  #  EFI binary, UEFI boot menu中的名字
grub
	fonts
		...
	grubenv
	locale
		...
	thems
		...
	x86_64-efi             # grub的内核模块
		...
initramfs-linux.img     # 外部initramfs文件
vmlinuz-linux             # linux内核文件

grub-install命令会尝试 create an entry in the firmware boot manager,该过程可能会失败(启动项满了或者系统禁止启动向被修改)。此时需要,使用 efibootmgr 移除多余的启动项,或者关闭BIOS的" Boot Order Lock "。

配置grub

每次启动时GRUB都会加载/boot/grub/grub.cfg配置。下面需要将Linux添加到该配置中。
修改/etc/default/grub或者/etc/grub.d/后,应该总是重新生成主配置文件

使用grub-mkconfig工具生成 /boot/grub/grub.cfg

sh 复制代码
grub-mkconfig -o /boot/grub/grub.cfg

检查

使用efibootmgr检查boot loader的路径设置是否正确

sh 复制代码
# 切换至EFI分区执行:
cp -r esp/EFI EFI

Linux系统启动过程

(不感兴趣可跳过)

https://wiki.archlinux.org/title/Arch_boot_process#Boot_loader

https://en.wikipedia.org/wiki/Booting_process_of_Linux

系统初始化

现代CPU都具有后台功能:

https://www.devever.net/\~hl/backstage-cast

UEFI:

  1. 上电自检之后,UEFI初始化需要启动的硬件(包括disk,键盘控制器等)
  2. 固件从NVRAM中读取启动项来决定从哪个EFI应用启动从哪里启动(如,从哪个硬盘的哪个分区)
    • 一个启动项可以是一块硬盘。此时,固件会在该硬盘上找查EFI系统分区,同时尝试搜索一个EFI应用在启动路径: \EFI\BOOT\BOOTx64.EFI。这就是UEFI可引导可移动介质的工作原理。
  3. 固件启动EFI应用
    • 这个EFI应用可以是boot loader或者arch Linux内核(使用EFI boot stub)
    • 也可以是其它EFI应用,如,UEFI shell或者boot manager(如systemd-boot, rEFInd)

如果安全启动打开,启动程序将会校验EFI二进制的签名。

boot loader

boot loader 是由固件------UEFI/BIOS启动的一段代码。它用于加载内核(传递内核参数)和任何外部的initramfs镜像。

启动管理器用于管理多个EFI程序

UEFI可以使用EFI boot stub直接启动内核。

boot loader需要能直接访问/boot目录下的kernel和initramfs,这意味着boot loader需要能够支持块设备,stacked block devices(LVM, RAID, etc)文件系统。

boot loader 选择 GRUB

kernel

直接管理硬件的应用

initramfs

initial RAM file system 镜像是一个cpio归档文件,它提供了早期用户空间用以开始后面的真正的用户空间。这主要意味着定位、访问和挂载根文件系统所需的所有内核模块、用户空间工具、相关库、支持文件(如udev规则)等。借助initramfs的概念,可以处理更复杂的设置,例如从外部驱动器启动、堆叠设备(逻辑卷、软件RAID、压缩、加密)或在早期用户空间中运行小型SSH服务器,以远程解锁或维护根文件系统。

大多数模块将在初始化过程的后期阶段由 udev 加载,此时系统已经切换到根文件系统。

initramfs加载过程大致如下:

  1. 位于 / 的根文件系统最初是一个空的 rootfs,它是 tmpfs 或 ramfs 的特殊实例。这是临时根文件系统,initramfs 镜像将在此解压。
  2. 内核会将其内置的 initramfs 解压到临时根文件系统中。Arch Linux 官方支持的内核使用空归档作为内置 initramfs,这是构建 Linux 时的默认设置。
  3. 内核会按启动加载器传递的命令行中指定的顺序解压外部 initramfs 镜像,覆盖嵌入 initramfs 或之前解压的文件。注意,多个 initramfs 镜像可以组合到单个文件中,内核将按照文件中的顺序处理它们。
    • 如果第一个 initramfs 镜像为未压缩,解压后,内核将分别在 /kernel/x86/microcode/ 和 /kernel/firmware/acpi/ 中查找 CPU 微代码更新和 ACPI 表更新。
    • 在处理完 CPU 微代码和 ACPI 表更新后,内核将继续解压其余的 initramfs 镜像(如果有的话)。

Initramfs 镜像是 Arch Linux 设置早期用户空间的首选方法,可以使用 mkinitcpio、dracut 或 booster 生成。

Linux 内核从6.13.8之后内置了Btrfs和Ext4驱动,这使得内核可以直接使用根分区并加载模块。但这样做有些限制。

Early userspace

即,initramfs阶段。内核通过执行 /init 二进制文件作为 PID 1 开启Early userspace。

Early userspace的功能是可配置的,但其主要目的是引导系统到可以访问根文件系统的阶段。这包括:

  • 加载内核模块,例如挂载真实根文件系统所需的任何块设备模块。
  • 设置根文件系统所在的存储栈。
  • 通过 udev 将持久性块设备名称解析为实际设备。
  • 加载 DRM 模块,因为默认情况下已启用早期 KMS。

请注意,Early userspace的作用不仅仅是设置根文件系统。在根文件系统挂载之前,有些任务是必须完成的,例如 fsck 和从休眠恢复。

在Early userspace的最终阶段,真实根文件系统被挂载在 /sysroot/(对于基于 systemd 的 initramfs)或 /new_root/(对于基于 busybox 的 initramfs),然后在使用基于 systemd 的 initramfs 时通过 systemctl switch-root 切换,或者在使用基于 busybox 的 initramfs 时通过 switch_root(8) 切换。Late userspace通过从真实根文件系统执行 init 程序启动。

Late userspace

从真实根文件系统的init程序开始。现在流行的是systemd。

gettty

init进程为每个虚拟控制台(tty)(arch Linux有六个tty)调用一次getty。getty会初始化每个终端并防止未授权的访问,当用户名和密码输入后,getty通过/etc/passwd和/etc/shadow校验,然后调用login。

login

login程序为用户打开一个会话,设置环境变量并启动用户shell(基于/etc/passwd)(此时的shell称为login shell)(一般会在这个shell启动之前在屏幕上打印一些条款等)

shell

一旦用户的 shell 启动,它通常会在向用户显示提示符之前运行一个运行时配置文件,例如 bashrc。如果账户配置为在登录时启动 X,运行时配置文件将调用 startx 或 xinit。跳转到 #Graphical session (Xorg) for the end.

显示管理器

此外,可以将 init 配置为在特定虚拟终端上启动显示管理器,而不是 getty。这需要手动启用其 systemd 服务文件。然后显示管理器会启动一个图形会话。


FAQ

arch Linux Wifi配置

https://geek-blogs.com/blog/arch-linux-wifi/

references

https://wiki.archlinux.org/title/Installation_guide

相关推荐
kft13142 小时前
Rocky Linux 9.4 磁盘扩展至根目录(/)教程
运维
iYun在学C2 小时前
驱动程序开发(字符设备驱动框架实验)
linux·c语言·嵌入式硬件
gsls2008082 小时前
阿里云两个数据盘合并挂载
运维·挂载
ashcn20012 小时前
linux 制作一个自解压文件
linux·运维·服务器
hhzz2 小时前
EasyPoi的核心映射工具:@Excel注解详解
java·服务器·excel·springboot·easypoi
天码-行空2 小时前
Linux 系统 MySQL 8.0 详细安装教程
linux·运维·mysql
Joe5562 小时前
vue2 + antDesign 下拉框限制只能选择2个
服务器·前端·javascript
何妨呀~2 小时前
Keepalived+Haproxy高可用集群实验
linux·服务器·网络
hqwest3 小时前
码上通QT实战31--系统设置06-保存报警信息
运维·qmessagebox·报警条件·温度报警·报警阀值·报警动作·sqlquery