安装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 -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-boot
和grub
二选一安装即可
选择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
)
这说明系统引导安装完毕。
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启动流程:
- 系统开机 - 上电自检(Power On Self Test 或 POST)。
- POST过后初始化用于启动的硬件(磁盘、键盘控制器等)。
- BIOS会运行BIOS磁盘启动顺序中第一个磁盘的首440bytes(MBR启动代码区域)内的代码。
- 启动引导代码从BIOS获得控制权,然后引导启动下一阶段的代码(如果有的话)(一般是系统的启动引导代码)。
- 再次被启动的代码(二阶段代码)(即启动引导)会查阅支持和配置文件。
- 根据配置文件中的信息,启动引导程序会将内核和initramfs文件载入系统的RAM中,然后开始启动内核。
UEFI启动流程:
- 系统开机 - 上电自检(Power On Self Test 或 POST)。
- UEFI 固件被加载,并由它初始化启动要用的硬件。
- 固件读取其引导管理器以确定从何处(比如,从哪个硬盘及分区)加载哪个 UEFI 应用。
- 固件按照引导管理器中的启动项目,加载UEFI 应用。
- 已启动的 UEFI 应用还可以启动其他应用(对应于 UEFI shell 或 rEFInd 之类的引导管理器的情况)或者启动内核及initramfs(对应于GRUB之类引导器的情况),这取决于 UEFI 应用的配置。
综上,只是因为UEFI是这么要求的而已,没有为什么。
关于chroot
因为之前搞mi3也用到了chroot,所以这次就彻底研究了以下chroot。
经过朋友7ji的指点以及上手测试得出结论:
1、从外系统chroot到里系统后,使用的依然是外系统的内核。
2、里系统用的就是外系统的用户,可以自由su且可以查询到uid是不变的。
3、在里系统可以通过ps
或pstree
查看到外面系统的进程。
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