梦想博客

前进!Arch Linux!

calendar 2025/11/14
refresh-cw 2025/11/14
5631字,12分钟
tag Linux;

前言 🔗

在沉寂了很久以后,准确的说由于现实原因导致学习计划进行了拖拉

在大佬的强烈推荐下开始跟随大佬的脚步,进行arch linux的学习,在此之前由ubuntu转向debian也是此大佬的推荐下进行的

安装 🔗

首先下载arch镜像,然后使用vmware进行安装

条件不足没有单独的机器,只能拿笔记本分配了4c4g进行操作


进行live cd安装


进入到如下界面


首先timedatectl看下时间不对(以下是大佬原话) 🔗

有些主板的BIOS时间不对,系统开机是从主板获得时间的,如果时间不对就要网络同步下时间或者手动改一下,因为后续要去远程仓库拉取文件下载程序包,以及你对文件的操作都会产生时间戳,以及和远程仓库同步时,为了对比版本也是要同步下时间对比时间戳的,所以时间不能和服务器差太多

然后输入ip a查看ip地址,方便进行本地ssh操作,如果ip地址没有问题则passwd修改密码后本地ssh 🔗

其次lsblk 列出你的设备 🔗

其实主要是为了看设备名,确保对正确的设备分区,没挂载的在df是看不到的

然后cfdisk /dev/sda 进入交互式分区界面 🔗


这里插一句,表分区选择gpt,现在大部分都是gpt,至于为什么不选择mbr,在分区表项中,有4个字节是用来存储当前分区占用了多少扇区的。 4个字节所以是 2^32,一个扇区是512字节,我们计算下可得:2^32 * 2^9 = 2^41 ,而2^40 正好是 1TB ,所以 2^41 = 2TB,这就是为什么MBR分区表最多只能支持2T容量的硬盘

下面进行实际的分区操作


分区至少选择3个,分别是efi系统分区/boot分区以及文件盘,至于swap可有可无,最后分区完的结果如下


上述操作完成后进行格式化分区并进行挂载

1#格式化EFI分区成 fat32 格式
2mkfs.vfat -F 32 -v /dev/sda1
3#格式化boot分区成ext4
4mkfs.ext4 /dev/sda2 
5#格式化交换分区
6mkswap /dev/sda3 
7#格式化根分区成ext4
8mkfs.ext4  /dev/sda4 

格式化完成后的结果如下


当然也可以格式化成f2fs格式,或者其他的格式,具体的列表可查看文件系统的对比

详细的操作方式如下

1mkfs.f2fs -f  -O extra_attr,inode_checksum,sb_checksum,compression /dev/sda4

这一串 extra_attr,inode_checksum,sb_checksum,compression 就是格式化用的参数,指示文件系统要启用什么功能, extra_attr 表示启用扩展属性,如果要开透明压缩就得启用 扩展属性,compression就是压缩,另外两个是校验inode和super block的,增强数据健壮性

接下来挂载这些文件系统,因为要往里面复制东西,构建出一个可以用的系统了。 首先是挂载根目录的分区 sda4,这个是未来的根目录,我们用了f2fs文件系统,并且在格式化的时候启用了高级功能,所以挂载的时候也要启用相应的挂载选项,否则是不会使用这些高级功能的。 因格式化相当于把文件系统格式化成有这样做的能力,也就是 can do 有能力这样做配合对应的挂载选项,才是真正的去do

1# 把 /dev/sda4  挂载到 /mnt compress_algorithm=lz4表示使用的压缩算法是lz4,atgc,gc_merge是高级gc,zstd压缩率高点,但是吞吐量不如lz4,反正不求多高的压缩率,主要还是吞吐量,lz4就够用了
2mount -o compress_algorithm=lz4,compress_chksum,atgc,gc_merge,lazytime /dev/sda4 /mnt
3# 把 sda2 挂载到 /mnt/boot 带上 -m 选项没有/mnt/boot这个目录会自动创建,免去手动mkdir
4mount -o errors=remount-ro -m /dev/sda2 /mnt/boot
5# 挂载sda1 即EFI分区到 /mnt/boot/efi
6mount -o umask=0077 -m /dev/sda1 /mnt/boot/efi
7# 启用交换分区
8swapon /dev/sda3

挂载完毕后应该如下图所示


系统构建 🔗

我们要把组成的系统必要工具、软件、服务,下载回来,根据linux文件夹的组织规则放到 /mnt里,构建出一个系统来,什么bash啊,xz,tar啊,其他更基础的工具啊服务之类的,但是这样是很累人,所以一般不手动这么做

手动这么做是很累很烦的,命令都要敲死了,arch这个live环境提供了现成的工具,可以帮我们把软件包释放并自动组织好,只要你指定一个目标文件夹(也就是未来要成为根目录的我们的挂载点/mnt)和需要的软件包就行了。我来告诉你大致需要哪些,一个最小化但是堪用的系统需要具备什 么

首先mkdir /mnt/etc,然后cp /etc/vconsole.conf /mnt/etc

vconsole.conf这个文件生成初始内存盘的时候要用,但是需要手动创建,直接把现成的复制过去就行,这个文件时关于键盘映射的配置的,默认的映射也行,只是没有这个文件在mkinitcpio会失败

接下来安装系统必备的软件包

base f2fs-tools dosfstools bash-completion sudo openssh neovim less grub efibootmgr linux

 1base是个最小的系统集合,包含基础工具,f2fs-tools dosfstools 是为了里面的fsck工具,因为系统启动时内核会用fsck检测文件系统完整性,我们把分区格式化成 f2fs 和 fat32,就得有。至于ext4的fsck,base下好像包含了。
 2
 3bash-completion bash的补完,不说了。
 4
 5sudo 等会要新建用户,给它分配root权限,以便在新系统里用。
 6
 7openssh 这个不说了,ssh服务器,特别是我这种在实机上远程ssh过去安装的,必须安装并且启用,否则重启开机后就连不到新系统了。
 8
 9neovim 文本编辑器,不喜欢你可以换nano
10
11less,pager,也要用到。
12
13grub efibootmgr 引导程序,一定要装,不装引导不了进不了系统,那你这盘就等于和纯数据盘一样。
14
15linux linux内核,必装,不解释。
16
17如果在实机上装一般还要一个linux-firmware,固件包,包含各种设备驱动,虚拟机上一般不要,虚拟设备的驱动内核里基本带了。

然后进行镜像源的修改,sed -i~ '/tuna.tsinghua/!d' /etc/pacman.d/mirrorlist

pacstrap -K /mnt base f2fs-tools dosfstools bash-completion sudo openssh neovim less grub efibootmgr linux

这样就开始安装了,会把这些包都装到 /mnt 下,并且以/mnt为根,组织好目录结构

生成分区挂载的fstab 🔗

genfstab -U /mnt >> /mnt/etc/fstab然后arch-chroot -S /mnt

df -hT 看看


琐事

  • 修改主机名:echo arch > /etc/hostname
  • 改为东八区:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime,然后打开/etc/locale.gen启用zh-CN,运行 locale-gen 生成 locale
  • 创建一个新用户,useradd -m -G wheel 用户名,-G wheel 表示除了用户自身的组之外,还额外把用户添加到这个组,我们把它添加到wheel,后面再给wheel赋予特权
  • 给用户设个密码,没密码不能ssh登录,执行passwd ds
  • 赋予用户组权限,echo ‘%wheel ALL=(ALL:ALL) NOPASSWD: ALL’ > /etc/sudoers.d/wheel-priv

wheel组是来自unix系的传统,这是一个高权限用户,算是遵顼传统,某些linux发行版里也保留了这个账户,专门给sudo用的

网络配置 🔗

因为我们没装网络管理工具(debian系的ifupdown或者更通用的networkmanager),而是选择使用systemd自带的networkd, 所以得做下配置,不然重启进新系统后就没网络了,本地还好,如果是远程就死翘翘了

1cat <<eof  | tee > /etc/systemd/network/10-ens33-dhcp.network
2[Match]
3Name=ens33
4
5[Network]
6DHCP=yes
7eof

复制这个就行了,这就加了一条网络连接,会匹配到 ens33接口 ,启用DHCP来获得ip,设置静态ip也是可以的,这里就先dhcp吧

networkd会找 /etc/systemd/network 目录下 所有的 *.network 文件来配置网络。 前面加个 10- 是为了控制配置的排序,因为它是按字母顺排序读取配置文件的 如果你有多个接口就可以用前面的 XX- 来控制顺序,如果一个接口有多个配置文件可以对应,可能会产生配置前后覆盖问题,我忘记是前面的优先还是后面的优先了,里面上这个目录下的文件最好从 60 开始,这里我们暂时随便了

然后执行,systemctl enable systemd-networkd sshd 也就是启动这两个服务,这样重启进新系统后,网络和ssh就拉起来了,不执行这两条的话你重启完是没网的,也没ssh,如果是远程机器,你就样衰了

安装bootloader 🔗

1grub-install --boot-directory /boot --efi-directory /boot/efi --target x86_64-efi --removable --bootloader-id GRUB

boot-directory用来指定boot分区也就是sda2的挂载点,efi-directory同理,用来指定efi系统分区sda1的挂载点 –target 指示要安装的引导类型,这个其实会自动侦测的不加也没关系,我显式加了是为了跟你解释这个选项,因为grub支持很多不同的平台,除了x86_64-efi 64位x86平台的引导外,还有32位的i686,armv7,aarch64之类的。 –removable 加了后引导文件会调整下相对位置,让你这块硬盘拆下来放其他电脑上也能开机,也就是变为可移动的,当然你虚拟机没有拆硬盘这个说法,我指实机。

bootloader-id 是指定这条引导在开机项目页面下的名称的,这个开机项目是你进BIOS后在boot那一页下的设备名,它会显示成你指定的,因为它本质是保存在主板的NVRAM上的,所以可以添加和修改

修改引导配置 🔗

有个 /etc/default/grub ,但我们一般不改这个,因为是包的默认,新建一个mkdir /etc/default/grub.d,文件

1cat <<eof | tee /etc/default/grub.d/grub-custom.cfg
2GRUB_TIMEOUT=0
3GRUB_CMDLINE_LINUX="rootflags=atgc"
4GRUB_DISABLE_RECOVERY=false
5eof 

rootflags=atgc 是为了让f2fs的atgc能重新挂载,其他文件系统不用的

写配置文件,grub-mkconfig -o /boot/grub/grub.cfg然后执行重启命令即可

系统的初始化 🔗

当完成上述操作后,一个茅草屋的基建linux就已经完成了,当然还需要配置下

  • 编辑 /etc/resolv.conf,nameserver x.x.x.x
  • pacman -Sy 把远程数据库同步到本地,相当于 apt update
  • pacman -Fy 这个也同步下
  • pacman -Qe 可以看到所有你手动安装的包
  • pacman -Qd 可以看到作为依赖被自动安装的包
  • pacman -Fl | grep /nslookup,就能知道 nslookup 是属于哪个包的,所以你确认没啥问题的话,就可以 pacman -S bind
  • 装完后可以 pacman -Ql bind 列出这个包的所有文件


pacman -Slq | grep nginx 这样搜索,就是只搜索包名


不得不说这内核是真新啊,而且占用也很低


然后安装pacman -S fastfetch cpufetch,便能看到熟悉的arch


Arch大杀器 🔗

aur(arch 用户仓库),也就是社区维护的仓库,这个是很多人用arch的最大原因,因为野包真的很多

1pacman -S git base-devel
2git clone https://aur.archlinux.org/yay-bin.git
3cd yay-bin
4makepkg -si

现在多了个 yay命令,这个命令可以完全取代pacman,所有pacman能用的功能选项这个都有,此外它还包含aur扩展命令和选项,以及可以使用aur的源,比如说你可以尝试下yay -Si xxx1


有些包是源码包,有些是二进制包,原则上一个包既有源码包也有二进制包的话 二级制包,会用-bin做结尾,比如说


然后你看他们的说明就能看到有一项是源码包有的,二进制包没有,那就是


构建依赖这项,当然你无需操心,即使你下了源码包,编译过程也是根据下载回来的PKGBUILD文件全自动完成安装和构建的整个过程都是全自动,无需担心

以及yay不需要sudo,哪怕是装包也不需要,用sudo甚至有负面作用,记住不要sudo yay

可以从aur的网页上搜索包的信息

选择? 🔗

因为arch滚动更新不够稳定有利就有弊,这是滚动更新带的必然结果,也不是arch独有的问题。

像debian这种,有11、12、13这种版本号,就叫版本发行,某个大版本号上的软件版本是基本上被冻结了

比如debian 10的vim 是 vim 8的话,几年后即使vim 9 出来了你也没办法用apt upgrade升级到9,因为仓库里就没9的包,这是因为 程序是需要配合glibc和内核版本的,你不可能只动一个程序本身而不是动系统的其他部分,版本号发行为了保证稳定性,程序的版本号是伴随着大版本号基本被冻结了的

但是arch你是没听过什么arch 7 8 9之类的,因为arch就是软件一有新的,做一点基本测试就进仓库了,系统没有一个固定的大版本号做基准的话,程序必然也是如此

像数据中心那种停机每分钟有直接经济损失的,就不合适,这些机器甚至是终身不升级的,因为就完全智跑固定的那几个服务,对稳定性有变态的要求。

然后是个人工作站之类的生产,这些其实软件越新,支持的现代硬件,内核新特性越多是有不小的提升,而且说实话崩了就崩了,大不了重新起一个,比起稳定这些就是值得为了追求性能是追新的

还有一种不是严格生产但是对稳定性要求介于两者之间的,比如说家里的路由之类的边缘基础设备,这个自然是不能停机最好也不停机,但是如果升个内核或者特定系统组件,刚好更新了网络控制算法,或者支持了新的网络API和特性,可以释放出不小的性能提升的话,也是非常值得升级的,毕竟这个停机崩了说实话也就是暂时上不了网不是什么天崩地裂的事情。所以这类设备对稳定性和性能的折中点在上面两者之间

然后是服务型设备,非生产的话,用arch好处是挺多的,因为开发服务,测试服务器,编译服务器之类的,当然是越新越好,可以使劲搞

Linux额外知识补充 🔗

PID为1的程序是什么? 🔗

一个比较典型的流程下,导程序会加载内核和初始内存盘 初始内存盘 就是 一个cpio格式的微型化根目录(还可以进一步用gz xz之类的压缩来减小体积)

在释放出来的内容下,有一个 /init ,可能是二进制文件也可能是脚本,这个是无所谓的,只要在这个位置叫这个名字就行。

这个 /init 就是临时根目录阶段的 init 了。注意,一定要指明是临时根目录阶段,因为它是从初始内存盘里解压出来的。

临时根目录的存在意义就是为了能最终挂载真正的根目录,启动过程中它本身只是一个很小的on-memory的根目录。所以这个init做的各种设备参数设置、初始化工作也是围绕 【挂载真正的根目录】 展开的 等真正的根目录挂载上去了真正的init就来了。也就是 /sbin/init 这个文件,使用systemd的发行版这个文件就是指向 systemd 的符号链接


各种类型的设备太多了,不是所有驱动都包含在内核二进制文件里的 不是systemd的一般就是 openrc runit之类的,或者busybox,对的,busybox也实现了基本的init功能,根老式sysvinit风格兼容,会读取/etc/inittab 这个配置文件做初始化工作

所以一层层下来是这样的 BIOS –> 引导程序 –> 内核 –> 临时根目录 –> 最终根目录

各种限制是逐级放宽的,从一开始只能利用非常限定的硬件设备、内存空间,加载很小的文件和数据,到慢慢加载上各种驱动,设置各种硬件参数后能使用越来越多的系统资源,这是一个递进的过程

只要记住大道理就好,无论是BIOS也好还是不是BIOS,是CPU也好,PCB设备也好,还是其他什么乱七八糟的设备也好,最关键的还是两个字【顺序】,无论它处于什么位置、什么设备上,只要它是第一个执行的,指真正电气物理意义上的第一个,也就是通电后的第一个,前面没有任何代码跑过的话,它就得面对这个没有可用硬件的情况

最后 🔗

  • 上述内容仅作为记录并不代表目前阶段本人已经熟练掌握arch相关内容
  • 上文内容跟可能会有遗漏如发现会再补齐,后续会考虑在arch的基础上进行gui的安装