目录

VMWare下的Arch Linux安装过程记录

系列 - Arch 探索
Warning

此坑还没填完,暂时只添加了安装部分(装完发现 Arch wiki 实在是已经写得很详细了),还有很多的知识还没有完全弄清楚和补充。 等我学习完计算机组成原理操作系统计算机网络后会再来填坑。

本文安装过程基本按照 Arch Linux 安装文档,附带了额外的相关知识。其中可能伴有踩坑,但是也是一种经验啦!

如发现本文某些地方有误,请在评论区评论,我看到的话会改过来哒!

Arch Linux 的安装过程涉及较多的操作系统知识,而不仅仅是像 Ubuntu/Debian 那样提供 GUI 中的几个选项供你选择。此外,Arch Linux 的文档较为详细(Arch wiki 简直是棒极了!)。

因此,本教程不只是演示本人的安装&踩坑过程,还附带许多的相关文档带读、踩坑原因分析等。

  1. 热爱倒腾的
  2. 不怕踩坑的
  3. 想要通过 Arch Linux 安装过程递归学习其他知识的

若您仅需要高效的安装 Arch Linux,而不希望看相关知识及其他无关的踩坑过程的,可以:

  1. 参考其他博主的奶妈式教程
  1. archinstall 工具
  1. 一些图形化界面安装工具
  1. Netboot 网络安装
  2. Github 上提供的脚本(按照里面的命令一个个输入)
  3. 其他安装方式
  4. 要在一个 Ubuntu 虚拟机上安装 Arch 虚拟机(嵌套虚拟机),请看这里

在使用 Arch 前看了 UCB System Admin Decal 的 Linux Pre-install and Install 一节,其中的实验是在 Ubuntu 虚拟机上安装 Arch。Arch 的安装涉及到自己进行分区,对系统进行加密和解密等,我觉得非常有趣,对于操作系统本身也是一个探索的过程。因此决定挑战自己跟着官方文档进行安装。

以前每次安装 Linux 虚拟机,包括 Ubuntu 和 Debian,都是跟着一些博主自己写的奶妈式手把手安装教程一步步的装。每次都能安装成功,但是总是感觉少了一些【探索的乐趣】😆。

今天我就要跟着 Arch Linux 的官方文档一步步装,感受一把极致的安装酸爽体验!

如果你也想体验自己安装 Arch,或者是想成为 Arch 开发者,下面内容可能对你有帮助:

  1. Arch Linux 官方安装文档
  2. Issue tracker
  3. Mailing List
  4. 常见问题及解答
  5. 帮助
  6. 贡献项目
  7. 帮助手册

安装过程涉及到的步骤包含:

  1. UEFI 模式启动(或 BIOS,但是分区会不一样,需要注意)
  2. 设置键盘模式
  3. 检查网络连接
  4. 更新系统时钟
  5. 创建磁盘分区
  6. 初始化分区中的文件系统(/文件系统可选是否加密)
  7. 挂载文件系统
  8. 利用pacstrap安装必要的包:linux 内核,initrdinit systempacman\、base等等
  9. 利用genfstab生成/etc/fstab(文件系统表)
  10. arch-chroot进入/mnt目录
  11. 通过修改/etc/hostname修改主机名

boot 启动原理如下: 图源自 UCB System Admin Decal(https://docs.google.com/presentation/d/1oLtsjsEIsvChOI31_5YYFhILfzGlyx7Hk9DsL1Nv-mc/edit?pli=1#slide=id.g9b414dda04_0_158) boot启动原理

看了一下下载界面,最顶部写了当前发行版的信息,下面是对于几种不同用户的安装方式以及校验和,最后是所有的 Arch 镜像源集合。

当前发布版本: 2023.09.01

内核版本: 6.4.12

ISO 镜像文件大小: 804.3 MB

  1. 通过命令pacman -Syu更新
  2. 通过这里更新镜像源

对于这种资源,可以使用百度网盘或者迅雷下载(和下载电影相同),下载格式为.torrent,该种子链接需要上传到百度网盘/迅雷,然后将其中的 iso 镜像文件下载到本地目录中。

安装时需要联网,最新版本会自动推送,可用于在系统启动时即时下载最新的 Arch Linux 版本。

Netboot 使用定制的 iPXE 版本。 实时系统的 Linux 内核、initramfssquashfs 文件是从 Arch Linux 镜像下载的。 所有下载文件的完整性都使用加密签名进行验证。

这其中有几个问题:

  1. iPXE是啥?一种开源的网络启动固件 其官方文档中的描述如下:

    iPXE 是领先的开源网络引导固件。它提供了完整的 PXE 实现,并通过其他功能进行了增强,例如:

    • 通过 HTTP 从 Web 服务器启动
    • 从 iSCSI SAN 引导
    • 通过 FCoE 从光纤通道 SAN 启动
    • 从 AoE SAN 引导
    • 从无线网络引导
    • 从广域网引导
    • 从 Infiniband 网络引导
    • 使用脚本控制引导过程

由此可以看出,iPXE 是一种基于网络进行系统启动的固件。它的启动需要依附于计算机网络的各种协议。在 Arch Linux 文档中也指明,使用 Netboot 安装需要满足以下两点要求:

  • 具有 DHCP 自配置的网络
  • 能够运行系统的足够存储

而它的具体实现是基于PXE协议。

基于递归学习的理念,我又查了查PXE。。。

其基本概念如下:

预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。 PXE 当初是作为 Intel 的有线管理体系的一部分,Intel 和 Systemsoft 于 1999 年 9 月 20 日公布其规格(版本 2.1)[1]。通过使用像网际协议(IP)、用户数据报协议(UDP)、动态主机设定协定(DHCP)、BOOTP、小型文件传输协议(TFTP)等几种网络协议和全局唯一标识符(GUID)、通用网络驱动接口(UNDI)、通用唯一识别码(UUID)的概念并通过对客户机(通过 PXE 自检的电脑)固件扩展预设的 API 来实现目的。 PXE 客户机(client)这个术语是指机器在 PXE 启动过程中的角色。

其基本的运行机制是:

客户机的固件(如网卡的 PXE 固件)通过 DHCP 协议找到可用的 PXE 启动服务器。在找到可用的 PXE 启动服务器后,固件会向合适的启动服务器询问网络启动程序(NBP,Network Boot Program)的路径,并且通过 TFTP 协议将网络启动程序下载到电脑的内存中,最后执行它[2]。

PXE机制又衍生出了无盘系统,其利用网络服务器下载启动系统的镜像,而不是本地硬盘。PXE的协议规范在intel 的这篇文档中可以查到。而 PXE 的两个实现,一个为iPXE,另一个则是gPXEgPXE目前已经停止开发,取而代之的是iPXE

对于iPXEgPXE更详细的介绍,可以参考这篇博文

  1. initramfs文件squashfs文件做什么用? TODO

  2. 为什么Arch Linux在下载过程中需要使用加密签名对镜像完整性进行验证? TODO

archlinux 虚拟机可从这里下载,使用手册在此

Tip

sq命令需要使用scoop进行安装,如果是 windows 用户,会比较麻烦,详细解决办法见后文

从后文中的镜像源中下载镜像。需要注意的是,我们需要保证下载的镜像的校验和,和同一目录sha256sums.txtb2sums.txt文件中的校验和匹配。

下载签名:sq wkd get pierre@archlinux.org -o release-key.pgp

验证:sq verify --signer-file release-key.pgp --detached archlinux-2023.09.01-x86_64.iso.sig archlinux-2023.09.01-x86_64.iso

最新版本的校验和下载详见官网。在镜像源网站上也可以看到sha256sums.txtb2sums.txt

清华大学镜像站。下载镜像后我们需要利用它与我们下载到的镜像的校验和进行比对(主要是用于比对,这两个文件可下载也可不下载,在镜像站上也能打开,只要我们下载到的镜像的校验和文件中版本对应的那行的校验和匹配就行了)。

Tip

由于这种方式下载过慢,笔者建议使用方法二,即通过开源镜像站进行下载。

  1. Download 界面选择推荐的 BitTorrent Download: 下载界面
  2. 下载到本地电脑的 Downloads 文件夹中,其后缀名为.torrent
  3. 打开百度网盘,在其中上传该文件
  4. 上传后双击该文件,点击开始下载到网盘,等待下载完成(有点慢哈!)
  5. 下载到网盘后,将iso镜像文件下载到在自选的本地目录中
  1. Download 界面下翻,找到中国的镜像站列表: 中国镜像站列表
  2. 在其中选择tuna.tsinghua.edu.cn,即清华大学镜像站(我每次都用他们的镜像,速度不错) 清华大学镜像站
  3. 选择archlinux-2023.09.01-x86_64.iso下载
  4. .iso文件保存到我们想要虚拟机保存的目录中

GnuPG 是什么? GnuPG 是完整实现了 RFC4880(即 PGP)所定义的 OpenPGP 标准的自由软件。GnuPG 可以加密和签名你的数据和通讯信息,包含一个通用的密钥管理系统以及用于各种公钥目录的访问模块。GnuPG,简称 GPG,是一个易于与其它程序整合的命令行工具,拥有很多前端程序和函数库。GnuPG 还支持 S/MIME 和 Secure Shell (ssh)。

从上述清华大学镜像站,可获取 iso 版本对应的 PGP 签名` archlinux-2023.09.01-x86_64.iso.sig``

清华大学镜像站

在本次安装中,我使用的是 Git Bash,其中装有GPG,cmdpowershell中也装有 gpg,可选择一个终端进行后续操作。

为避免因 HTTP 连接下载镜像时遭到拦截,获取到恶意镜像,我们需要利用 PGP 签名对镜像进行验证。

通过以下命令验证:

gpg --keyserver-options auto-key-retrieve --verify archlinux-version-x86_64.iso.sig

其中version替换成你所下载的版本号,如2023.09.01。我的显示结果是:

legion@DESKTOP-ROOSFVQ MINGW64 /e/VMs/Arch
$ gpg --keyserver-options auto-key-retrieve --verify archlinux-2023.09.01-x86_64.iso.sig
gpg: assuming signed data in 'archlinux-2023.09.01-x86_64.iso'
gpg: Signature made 2023年09月 1日 18:48:49
gpg:                using EDDSA key 3E80CA1A8B89F69CBA57D98A76A5EF9054449A5C
gpg:                issuer "pierre@archlinux.org"
gpg: Good signature from "Pierre Schmitz <pierre@archlinux.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 3E80 CA1A 8B89 F69C BA57  D98A 76A5 EF90 5444 9A5C

若从镜像站下载,则会显示fingerprint,我们需要打开fingerprint 合集,确保我们所获得的镜像的fingerprint和该网站上的 fingerprint 吻合。(确保公钥的指纹等于其中一位签署了 ISO 文件 Arch Linux 开发者的指纹)

安装镜像包括:U 盘,光盘,和带有 PXE 的网络安装镜像。此处我是用 VMWare 虚拟机进行安装。

依次选择:

  1. 自定义(高级)
  2. 硬件兼容性
  3. 稍后安装操作系统
  4. 本内核版本为 6.4.12,因 VMware 中没有 Arch,因此我选择其他 Linux 5.x 内核 64位
  5. 选择安装目录(自定)
  6. 处理器配置、内存大小分配均选择默认(注意:内存大小选择 2G,768MB 完全不够)
  7. 使用网络地址转换(NAT)
  8. SCSI 控制器:LSI Logic(L)
  9. 虚拟磁盘类型:SCSI(S)
  10. 创建新虚拟磁盘
  11. 最大磁盘大小默认,将虚拟磁盘拆分成多个文件
  12. 磁盘文件名默认
  13. 自定义硬件->新 CD/DVD->使用 ISO 映像文件->选择我们下载的 iso 文件->关闭
  14. 完成
  15. 你可以自行决定 BIOS 或 UEFI 模式启动(我选择 UEFI,但是应该影响不大)
  16. 点击开启此虚拟机

Ready for the journey? Let’s go!

  1. 默认第一项,等待一会儿,随后进入命令行模式

开局遇雷:怎么回事?

命令行模式开启

参考了这篇博文虚拟机默认的是 768MB,不够。在设置中修改为 2G,成功启动。

Arch网络出问题

关了虚拟机,重新开机,成功启动

Arch成功启动

系统启动后,控制台键盘布局默认为 us(美式键盘)。如果您需要列出所有可用的键盘布局,可以使用以下命令:

ls /usr/share/kbd/keymaps/**/*.map.gz

显示所有键盘布局

此处我使用us键盘布局,不修改。

ip link
ping archlinux.org

检查网络连接

timedatectl #查看系统时间
timedatectl list-timezones #查看所有时区
timedatectl set-timezone "Asia/Shanghai" # 设置为亚洲上海

设置时区

要创建磁盘分区了,为保证出问题后还能倒回来,此处拍摄快照 1

系统如果识别到计算机的内置硬盘、U 盘或者移动硬盘等类型磁盘,就会将其分配为一个块设备,如 /dev/sda、/dev/nvme0n1 或 /dev/mmcblk0。可以使用 lsblk 或者 fdisk 查看:

fdisk -l(此处为小写字母l)

块设备

结果中以 rom、loop 或者 airoot 结尾的设备可以被忽略。

提示:在分区之前,请您检查 NVMe 驱动器和 Advanced Format 硬盘是否使用了最佳逻辑扇区大小。需要注意的是,更改逻辑扇区大小后,可能会导致在 Windows 系统中出现兼容性问题。

对于一个选定的设备,以下分区是必须要有的:

  1. 一个根分区(挂载在 根目录)/;
  2. 要在 UEFI 模式中启动,还需要一个 EFI 系统分区。
  3. 如果您需要创建多级存储例如 LVM、磁盘加密 或 RAID,请您在这时候完成。 请使用分区工具(fdisk 、parted、cfdisk 等等)修改分区表。例如:
fdisk /dev/the_disk_to_be_partitioned(要被分区的磁盘)

注意:

如果您想要的磁盘没有显示出来, 确保您的磁盘控制器未处于 RAID 模式。

如果要启动的磁盘已经有一个 EFI 系统分区,就不要再新建 EFI 分区了,而是使用现有的 EFI 分区。

如果文件系统支持,交换空间 可以通过 交换文件 实现。

分区方案

  1. 输入fdisk /dev/sda,对/dev/sda磁盘进行分区
  2. 输入g,创建一个GUID分区表
  1. 输入n,创建第一个分区,输入其编号(默认为 1,即/dev/sda1
  2. 回车,默认其大小
  3. 对最后一个扇区,输入+512M
  4. 输入t来将这个新分区改为"EFI System"
  5. 输入L来查看所有分区名,输入q退出,可见EFI System分区别名为 1
  6. 输入1,将分区改为EFI System
  1. 输入n,创建第二个分区
  2. 两次回车,使用默认分区号和扇区大小
  3. 输入-512M,为交换分区留出 512MB 大小来
  4. 分区默认名为Linux filesystem,因此不需要改
  1. 输入n,创建第三个分区
  2. 连按 3 次回车,接受所有默认设置
  3. 输入t,将新分区改为Linux Swap,别名为 19

输入p

输入w

对于不同的分区,我们使用不同的文件系统:

ESP 在/dev/sda1中,运行mkfs.fat -F32 /dev/sda1来挂载 FAT32 文件系统

mkfs.ext4 /dev/sad2

mkswap /dev/sda3

将根磁盘卷挂载到/mnt,使用命令:mount /dev/sda2 /mnt

mount --mkdir /dev/sda1 /mnt/boot

swapon /dev/sda3来启用交换分区

稍后 genfstab(8) 将自动检测挂载的文件系统和交换空间。

通常来说系统默认有,如果没有的话使用如下命令安装:

sudo pacman -S reflector

sudo reflector --country China --save /etc/pacman.d/mirrorlist.pacnew

确保源准确无误后,将mirrorlist.pacnew复制到mirrorlist

使用 pacstrap(8) 脚本,安装 base 包 软件包和 Linux 内核以及常规硬件的固件:

pacstrap -K /mnt base linux vim man-db man-pages texinfo

这时候可以同时额外安装计算机的 CPU 微码包。如果计算机是 Intel 的 CPU ,使用intel-ucode包,AMD CPU 则使用 amd-ucode包。也可以暂时都不安装,等到进入系统后再安装。

  1. 因为我是在虚拟机中安装,因此我不安装固件linux-firmware和微码包intel-ucode。如果你有想补充的软件,请加在pacstrap后面。
  2. texinfo,不是textinfo,不要看错啦!

通过以下命令生成 fstab 文件 (用 -U 或 -L 选项设置 UUID 或卷标):

genfstab -U /mnt >> /mnt/etc/fstab

强烈建议在执行完以上命令后,检查一下生成的/mnt/etc/fstab文件是否正确。

arch-chroot /mnt

提示:此处使用的是 arch-chroot 而不是直接使用 chroot,注意不要输错了。在arch-chroot进入/mnt后,提示符应该变为了[root@archiso]样式,如果没有,请检查一下前面的步骤是否都准确完成了。

ln -sf /usr/share/zoneinfo/Region(地区名)/City(城市名) /etc/localtime

地区名填 Asia,城市名填 Shanghai

然后运行 hwclock(8) 以生成 /etc/adjtime:

hwclock --systohc

这个命令假定已设置硬件时间为 UTC 时间。

  1. 编辑/etc/locale.gen。将en_US.UTF-8或其他你想要的配置,对应那行取消注释。修改后,执行locale-gen,以生成locale信息
  2. 创建/etc/locale.conf,在其中写入:
LANG=en_US.UTF-8

如果需要修改控制台键盘布局和字体,可编辑 /etc/vconsole.conf 使其长期生效,例如:

KEYMAP=de-latin1

网络配置很重要,否则安装系统后会连不上网(例如VirtualBox桥接模式就需要配置 DHCP)

创建/etc/hostname文件,在其中直接填写你所设定的主机名,我填写的主机名是arch

  1. pacman -S networkmanager
  2. systemctl enable NetworkManager.service设置网络管理器开机自启动

通常不需要自己创建新的 initramfs,因为在执行 pacstrap 时已经安装 linux 包,这时已经运行过 mkinitcpio 了。

输入passwd创建一个root密码

需要安装 Linux 引导加载程序,才能在安装后启动系统,可以使用的的引导程序已在启动加载器中列出,请选择一个安装并配置它,GRUB 是最常见的选择。

如果有 Intel 或 AMD 的 CPU,请另外启用微码更新。

  1. 安装grubefibootmgr:输入pacman -S grub efibootmgr

  2. 输入grub-install --target=x86_64-efi --efi-directory=[esp] --bootloader-id=GRUB

    我的esp挂载点是/mnt/boot,因为我已经arch-chroot/mnt中了,因此esp字段填写/boot即可。如果你安装在了其他挂载点上,请在esp字段填写你自己的挂载点。如果出现问题,检查:

    • 是否已经arch-chroot到了/mnt下?命令提示符为[root@archiso]
    • 前面的配置过程有没有出现问题?

    grub-install命令成功时应该出现:

grub-install成功

  1. 生成主配置文件:grub-mkconfig -o /boot/grub/grub.cfg

    配置成功时界面:

    配置成功

  1. exit退出chroot环境
  2. umount -R /mnt取消挂载/mnt(也等到可reboot时 systemd 自动卸载)
  3. reboot重启系统

参见建议阅读列表应用程序列表

相关内容