Feb 20, 2021

安装archlinux

2023-12-23更新序

这个博客是21年第一次接触arch时写的,转眼间过去两年多,现在archwiki已近是我的主要工作环境了,回首看当年一板一眼地写博客记录感觉还挺有纪念意义。

这篇博客主要是写了我的一些理解。虽然也是按照archwiki上做的,但年代比较久远了,推荐还是按照archwiki上的教程安装。

以下正文


朋友7ji经常和我吹archlinux牛b,自由度超高,社区友好。正好最近有时间(指实习时间摸鱼),就来试试水,用VMware装一个arch玩一玩。

因为是第一次装系统,所以按照我自己的理解,写的比较详细,如有问题或看法欢迎讨论。

step0:概述

系统的启动顺序是:

BIOS/UEFI硬件自检->查找主引导记录把控制权给某分区或启动管理器(如Grub)->操作系统启动

所以可见装一个系统就三点:系统本体,引导,以及处理承载他们的硬盘分区

但是系统不能自己装自己,所以我们需要另一个系统来辅助,本文中我们分别称呼他们为工具系统和新系统

然后说一下我的原则。这篇博客基本是按照官网教程走的,但我做了一定的顺序修改。本着KISS原则(Keep It Simple&Stupid),把一切非必要配置从主流程中拿了出来,从而可以看到安装一个系统到底需要干什么。

以下流程中,step2是针对工具系统的配置,step3、4是安装系统,step5是安装后新系统配置,理论上说,step2和step5都不是安装系统必要操作

下面开搞

step1:新建虚拟机

VMware新建虚拟机,因为vmware没有针对Archlinux的快捷设置,所以“版本”处可以选择Linux3.x内核64位。分配1G内存,NAT网络,磁盘类型默认SCSI,I/O控制器类型默认LSI Logic

修改硬件类型为uefi: 虚拟机-> 设置->选项->高级->固件类型选择UEFI

然后把下载好的工作系统镜像挂上去(也可以新建虚拟机的时候按照引导挂上去)

step2:安装前配置

这一部分建议看看然后按需使用。理论上都不是安装系统必须操作(连网除外)

连接网络

由于使用虚拟机,所以相当于网线接入,不用配置直接用

如果使用无线接入:

先通过 ip link 指令查看 wifi 设备(比如wlan0)

然后开启它ip link set wlan0 up

通过 iwlist wlan0 scan 命令就可以查看当前支持的 wifi 信息,可以通过 grep 'ESSID' 过滤出信息中的 wifi 名称

通过执行 wpa_passphrase <wifi_essid> <password> 生成用于连接对应 wifi 的本地配置,可以通过 > 重定向到文件中

执行 wpa_supplicant -c <conf_file> -i <device_name> 连接到指定的网络,其中 confi_file 就是刚刚 wpa_passphrase 命令生成的文件,而 device_name 则是上面 ip link 指令中查看到的设备名称

由于你的设备没有局域网的 ip 地址,所以是没有办法实现网络包的转发的,此时你需要向路由器申请一个动态 ip,只要执行 dhcpcd 命令即可

调整时间设置

timedatectl set-timezone "Asia/Shanghai"
timedatectl set-ntp true

修改下载镜像

镜像配置文件在/etc/pacman.d/mirrorlist

按需配置,我用默认的源速度也不慢

更新: 可以手动修改,也可以使用reflector命令获取并排序镜像链表,并写入mirrorlist

reflector -c China > /etc/pacman.d/mirrorlist

step3:磁盘

磁盘分区

fdisk -l    //查看当前磁盘设备
fdisk /dev/sda    //进入到fdisk工具

在fdisk工具中用到的功能:m帮助,g新建GPT分区表,n增加分区,p打印分区表,w把表写入磁盘并退出

其中g 表示创建 GPT 分区表,用于 UEFI 引导启动,而 o 表示通过传统 BIOS 启动的 MBR 分区表

如果你要安装双系统,则必须让两个系统启动方式保持一致,无论硬件如何支持。

这里我们需要三个分区

根目录 /

swap 分区 -- 虚拟内存分区,建议1G

efi分区 -- 用来引导启动, UEFI 引导启动独有,BIOS启动则不需要,建议260M

具体操作如下(这里efi分区给了512M,后来发现用不到这么多,就修改成260M):

进入fdisk后操作

分好区后可以用fdisk -l查看

查看分区

更新: 新建分区后可以用t标注分区类型(partition type),用数字标注,具体可在t后输入L查看类型列表。

更新新: 关于swap分区,可以使用swapfile来代替。即这里不划分swap分区,而是之后在主文件系统分区下创建swapfile。swap分区和swapfile两者性质相同,自行二选一即可,具体后文再说。

格式化分区

分区在使用前需要进行格式化,准确说是高级格式化

在 linux 系统中,限定 efi 分区必须为 fat 格式,主分区则采用 ext4 格式

mkfs.fat -F32 /dev/sda1
mkfs.ext4 /dev/sda2

swap分区则用以下命令指定:

mkswap /dev/sda3

注: 如果使用swapfile,这里mkswap和下面的swapon等到进入进入新系统并创建swapfile后再搞。

分区挂载

先挂载swap分区:

swapon /dev/sda3

再挂载root和efi分区:

mount /dev/sda2 /mnt
mkdir /mnt/boot && mount /dev/sda1 /mnt/boot

重要: 计算机重启会自动取消挂载,所以在执行之后的操作前一定要确认是否挂载

可以使用df指令查看挂载:

查看挂载

step4:安装系统与引导

下载essential packages

确保网络连接,见step2:安装前配置->连接网络

若需要修改下载源,见step2:安装前配置->修改下载镜像

确保分区已挂载,见step3:磁盘->分区挂载

然后下载:

pacstrap /mnt base linux linux-firmware

生成磁盘分区索引

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

进入新系统

使用chroot进入系统,注意chroot只是改变根路径,此时我们使用的还是是工具系统的内核不变

arch-chroot /mnt

这里要注意,我错误使用命令chroot /mnt,结果pacman用不了。

arch-chroot这个指令在运行 /usr/bin/chroot 前,会挂载 /proc api 文件系统,建立可用的 /etc/resolv.conf,所以单使用chroot是不行的。

关于swapfile

如果在上文处没有选择swap分区而是选择使用swapfile,应该这么做:

创建一个完全空白的swapfile:

dd if=/dev/zero of=/swapfile bs=1m count=8096

修改权限:

chmod 600 /swapfile

然后就和swap分区完全一样了:

mkswap /swapfile
swapon /swapfile

下载网络相关packages

由于此时我们使用工具系统的内核,所以依然可以联网,可以下载网络相关package。

若不下载,则移除工具系统后会出现“下载才能联网,联网才能下载”的相互依赖死循环。

所以下载是必要操作,我把它放在这里,配置则可以移除工具系统后再配置

pacman -S net-tools wireless_tools wpa_supplicant dhcpcd

更新: 虽然官网建议安装systemd-networkd,但经测试实在是太难用了,所以这里我推荐装NetworkManager

pacman -Syu
pacman -S wpa_supplicant wireless_tools networkmanager
pacman -S nm-connection-editor network-manager-applet

具体可见我之后的博客。

修改密码

修改root密码,不然使用新系统内核时进不去:

passwd

安装系统引导

这一部分官网教程居然一句话带过了,我第一次看就漏掉了。。。坑爹啊,没系统引导系统都起不来的

确保efi分区已挂载,见step3:磁盘->分区挂载

更新: grub的问题是开机不会显示报错,虽然看着舒爽但如果开机卡在哪里是看不到的,所以这里更新使用systemd-boot

systemd-bootgrub二选一安装即可

选择1:安装systemd-boot

Arch 默认安装的 systemd包含了 systemd-boot

安装intel的microcode和EFI boot manager:

pacman -S intel-ucode
bootctl install

增加启动选项:

新建/boot/loader/entries/arch.conf中写入:

title          Arch Linux
linux          /vmlinuz-linux
initrd         /initramfs-linux.img
options        root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660 rw

选择2:安装grub

先下载:

pacman -S grub efibootmgr intel-ucode os-prober

如果你使用的是 amd 的 CPU,那么你就将上面 intel-ucode 替换为 amd-ucode

如果你不需要使用双系统或多系统,计算机中只保留一个 arch 系统,那么就没有必要安装 os-prober 了

安装:

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub

生成配置文件:

grub-mkconfig -o /boot/grub/grub.cfg

输出应该如下:

生成配置时的输出

这里要注意,中间这几行found image一定要有。

如果没有,可以检查/boot路径下是否有initramfs-linux-fallback.img initramfs-linux.img intel-ucode.img vmlinuz-linux这几个文件。没有说明内核没有被正确部署,需要检查挂载并重新部署linux内核:

pacman -S linux

再重新生成配置文件。

此时进入配置文件/boot/grub/grub.cfg可以看到有下图这种menuentry部分(建议直接搜索menuentry

menuentry部分

这说明系统引导安装完毕。

step5新系统配置

这一部分同样不属于安装系统,此时已经可以将工作系统解挂。

此时已经可以从uefi直接启动新系统,如果启动不了请返回检查哪里出了问题。

设置时区

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

同步系统时间:

hwclock --systohc

本地化配置

先编辑/etc/locale.gen,把需要的语言环境前的注释#去掉:

en_GB.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8

这里我按朋友7ji的建议没有使用US而是使用GB(避免乱码问题和单位问题)

然后退出并生成本地化配置

locale-gen

接着配置系统语言在 /etc/locale.conf 文件中写入:

LANG=en_GB.UTF-8

同样为了避免乱码建议使用英文。

网络配置

接下来创建 /etc/hostname 文件,写入你给计算机起的名字

然后,需要添加 /etc/hosts 文件,配置 localhost,写入:

127.0.0.1 localhost
::1 localhost
127.0.1.1 myhostname.localdomain myhostname

如果你的路由器为你的计算机分配了固定永久的 IP 地址,那你就要用这个永久的 IP 地址替换上面配置中的 127.0.1.1

以上,arch安装完成

后记:相关知识拾遗

在这里记录安装过程中的相关知识以及部分我个人的理解,我知道的知识点可能会被略去

关于硬盘

硬盘分为固态硬盘(SSD 盘)、机械硬盘(HDD)、混合硬盘(HHD)三种。这里不详细讲。

硬盘接口通常分为五种类型:SATA接口硬盘、IDE接口硬盘、SCSI接口硬盘、光纤通道硬盘、SAS接口硬盘。

IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而光纤通道只在高端服务器上,价格昂贵。SATA是目前比较流行的的硬盘接口类型,目前市场上最普及的接口类型。

ATA(Advanced Technology Attachment),高技术配置,一般来说,ATA是一种控制器技术,而IDE(Integrated Drive Electronics)是一个匹配它的磁盘驱动器技术,ATA和IDE通常可以互换使用。ATA下一步的技术是SATA(Serial ATA),串行ATA。有了SATA之后,原来的ATA又被称为PATA(Parallel ATA),并行ATA。简单小结一下,一般意义上,IDE和PATA是说的同一种东西,它们的进化型是SATA。

SCSI(Small Computer System Interface),小型计算机系统接口,是一种计算机与外部设备之间的接口标准。SCSI的进化型是SAS(Serial Attached SCSI),串行SCSI。

为什么要EFI分区?

UEFI是指主板的引导启动方式

GPT是硬盘的分区模式

EFI是GPT硬盘分区模式中的系统启动分区

而为什么BIOS不需要一个分区来引导而UEFI需要的?

此引用来源:archwiki

BIOS启动流程:

  1. 系统开机 - 上电自检(Power On Self Test 或 POST)。
  2. POST过后初始化用于启动的硬件(磁盘、键盘控制器等)。
  3. BIOS会运行BIOS磁盘启动顺序中第一个磁盘的首440bytes(MBR启动代码区域)内的代码。
  4. 启动引导代码从BIOS获得控制权,然后引导启动下一阶段的代码(如果有的话)(一般是系统的启动引导代码)。
  5. 再次被启动的代码(二阶段代码)(即启动引导)会查阅支持和配置文件。
  6. 根据配置文件中的信息,启动引导程序会将内核和initramfs文件载入系统的RAM中,然后开始启动内核。

UEFI启动流程:

  1. 系统开机 - 上电自检(Power On Self Test 或 POST)。
  2. UEFI 固件被加载,并由它初始化启动要用的硬件。
  3. 固件读取其引导管理器以确定从何处(比如,从哪个硬盘及分区)加载哪个 UEFI 应用。
  4. 固件按照引导管理器中的启动项目,加载UEFI 应用。
  5. 已启动的 UEFI 应用还可以启动其他应用(对应于 UEFI shell 或 rEFInd 之类的引导管理器的情况)或者启动内核及initramfs(对应于GRUB之类引导器的情况),这取决于 UEFI 应用的配置。

综上,只是因为UEFI是这么要求的而已,没有为什么。

关于chroot

因为之前搞mi3也用到了chroot,所以这次就彻底研究了以下chroot。

经过朋友7ji的指点以及上手测试得出结论:

1、从外系统chroot到里系统后,使用的依然是外系统的内核。

2、里系统用的就是外系统的用户,可以自由su且可以查询到uid是不变的。

3、在里系统可以通过pspstree查看到外面系统的进程。

4、进入到里系统后,环境变量用的就是里系统的。

5、chroot需要选择shell,如果不选择,默认按照外系统环境变量中的shell路径,去里系统找这个shell,如果找不到就会报错进不去。

6、chroot可以输入exit或ctrl+d退出,在linuxdeploy软件的chroot容器中exit或ctrl+d会直接断开ssh,这可能是linuxdeploy不提供console的原因——因为在console中exit,软件没办法把你踢出去。

综上所述,我目前对chroot的理解就是单纯的对io中的路径进行处理,如有差错欢迎讨论。

参考站点

arch镜像下载:https://archlinux.org/download/

官方安装教程:https://wiki.archlinux.org/index.php/installation_guide

一个和官方教程差不多的中文博客:https://techlog.cn/article/list/10183601

另一个和官方教程差不多的中文博客:https://www.viseator.com/2017/05/17/arch_install/

swap分区大小选择:https://www.jianshu.com/p/12e25ea172de