0. 介绍
这段时间在虚拟机上折腾了 Arch
和 awesomewm
,发现这种轻量级的图形界面比完整的桌面环境(DE)更适合自己。而且 tiling window manager
也比桌面环境更高效,纯键盘操作很舒服。具体效果见下图(P.S. 这篇文章不涉及 awesomewm
的配置)。
关于 Linux 下的桌面环境和窗口管理器的关系可以参考 StackExchange 上的这个回答。简单来说,可以看下面这张图。
关于 wm 的介绍可以看这几个视频:A Comprehensive Guide To Tiling Window Managers,Why Use A Tiling Window Manager?,av55390167。也可以参考
ArchWiki
上的介绍。关于如何在
VitrualBox
上安装Arch Linux
则可以看这个视频:Arch Linux Installation Guide (2019),以及ArchWiki
上的 Installation Guide。基本上大部分问题都可以在 ArchWiki 上找到答案。
介绍就到这里,接下来开始进入正题。
1. 准备工作
第一步是启动 macOS 并进行系统更新,这是要确保在安装 Arch 之前把 Macbook 的固件更新至最新,具体说明见这里。
然后准备好一个 U 盘和 Arch 安装镜像文件(可以在这里下载)。建议使用国内源下载,往下找到 China 的镜像地址,点击下载即可,我下载的是清华源的镜像。
可以下载
.sig
文件用于验证镜像文件。下载完成后,将镜像文件和.sig
文件放在同一目录,使用以下命令进行签名验证:
# 运行命令时请使用具体的文件名 $ gpg --keyserver-options auto-key-retrieve --verify archlinux-version-x86_64.iso.sig
接着就是将镜像文件写入 U 盘。在 Linux/macOS 下可以使用 dd
命令,Windows 下则可以使用 rufus 或者 Win32 Disk Imager。
如果使用 rufus 写入后无法引导启动,那么重新写入一次并选择 dd 模式,因为 rufus 默认使用 ISO 模式,可能会有问题。
接下来进入更新好的 macOS:
-
打开磁盘工具(在 Launchpad 的“其他”目录里)
-
选择要进行分区的设备,并点击分区按钮
-
在弹出的页面中调整 macOS 分区的大小,剩下的部分则作为安装 Arch 的分区,格式化为 Dos 格式(其实什么格式都可以,因为安装的时候会重新格式化)
如果在磁盘工具里看不到设备的话,可以选择显示所有设备,如图
Ok,准备工作完成。
2. 启动 Arch Live 环境
接下来就是关掉 Macbook,插上 U 盘。在启动 Macbook 的同时按住键盘左侧的 Option
键,然后就会进入启动设备选择界面,如图。选择 EFI Boot
和 Arch Linux archiso x86_64 UEFI USB
稍等片刻后就会进入 Arch Live 环境。如果终端字体很小的话,可以使用命令 setfont sun12x22
来更换字体。
3. 网络连接
这台 Macbook 并没有网线接口,只能通过 Wifi 或者另外购买一个转接口来联网。通过下列操作就可以连接上无线网络:
# 下面这个命令会列出所有无线接口,看到了类似 `wlan0` 的输出则说明 Wifi 可以正常驱动。
$ iwconfig
wlan0 xxxxxxxx
# 下面这个命令会扫描无线网络并弹出字符界面让你选择要连接的网络
$ wifi-menu wlan0
# 连接网络之后,使用下面的命令分配一个 IP 地址
$ dhcpcd
# 确认网络状态
$ ping archlinux.org
4. 分区
接下来的步骤是对磁盘进行分区。首先通过 fdisk
确认要操作的是哪块磁盘。
$ fdisk -l
Disk /dev/sda: 113 GiB, 121332826112 bytes, 236978176 sectors
Disk model: APPLE SSD SM0128
...
Devices Start End Sectors Size Type
/dev/sda1 40 409639 409600 200M EFI System
/dev/sda2 409640 119745575 119335936 56.9G unknown
/dev/sda3 119745576 236978142 117232640 55.9G <Type>
...
只需要关注上述信息即可,其中 /dev/sda
这块磁盘就是接下来要操作的磁盘。而 /dev/sda3
的类型则取决于你使用 macOS 的磁盘工具分区时选择的格式。
接着使用 cgdisk
工具进行分区操作。
$ cgdisk /dev/sda
cgdisk 1.0.4
Disk Drive: /dev/sda
Size: 236978176, 113.0 GiB
Part.# Size Partition Type Partition Name
---------------------------------------------------------------
1 200.0 MiB EFI System EFI System Partition
2 56.9 GiB Apple APFS Customer
3 55.9 GiB <Type> <Name>
使用上下方向键将光标移动到分区 3 上,然后使用左右方向键选中下方菜单项中的 Delete
,回车删除该分区。可以看到分区 3 的标号和名称消失,类型变为 free space
。
接着选中菜单项 New
,新建启动分区。
Apple 推荐在每个分区间保留 128MB 的空间,具体说明见链接
# 注:<Enter> 表示按回车键,而不是输入这几个字符!
# 保留 128M 的空间
First sector (xxxxxxx-xxxxxxxx, default = xxxxxxxx): +128M<Enter>
# Boot 分区大小
Size in sectors or {KMGTP} (default = xxxxxxxx): 100M<Enter>
# 分区 ID,保持默认即可
Hex code or GUID (L to show codes, Enter = xxxx): <Enter>
# 分区名
Enter new partition name, or <Enter> to use the current name:
boot<Enter>
再选中 free space
新建 root
分区和 home
分区。注意,这两个分区的 first sector
大小保持默认即可。
# 创建 root 分区,大小为 15-20GiB
First sector (xxxxxxx-xxxxxxxx, default = xxxxxxxx): <Enter>
Size in sectors or {KMGTP} (default = xxxxxxxx): 15G<Enter>
Hex code or GUID (L to show codes, Enter = xxxx): <Enter>
Enter new partition name, or <Enter> to use the current name:
root<Enter>
# 创建 home 分区,大小为剩余空间
First sector (xxxxxxx-xxxxxxxx, default = xxxxxxxx): <Enter>
Size in sectors or {KMGTP} (default = xxxxxxxx): <Enter>
Hex code or GUID (L to show codes, Enter = xxxx): <Enter>
Enter new partition name, or <Enter> to use the current name:
home<Enter>
这时候的分区表应该是这样的:
Part.# Size Partition Type Partition Name
---------------------------------------------------------------
1 200.0 MiB EFI System EFI System Partition
2 56.9 GiB Apple APFS Customer
128.0 MiB free space
3 100.0 MiB Linux filesystem boot
4 15.7 GiB Linux filesystem root
5 40.0 GiB Linux filesystem home
检查没问题后选中 Write
项回车,然后左下角会提示是否将分区表写入,输入 yes
后回车即可。退出 cgdisk
之后可以再使用 fdisk -l
确认分区信息。
关于如何分区可以参考 ArchWiki Mac#Arch_Linux_with_OS_X_or_other_operating_systems。该文档建议的分区大小如下:
partition mountpoint size type label /dev/sda5 /boot 100MiB boot boot /dev/sda6 - ? swap swap (optional) /dev/sda7 / 15-20GiB ext4 root /dev/sda8 /home remaining ext4 home
注: 一般来说,当机器内存大小在 4GB 或以上时,swap 分区是可选的。
5. 格式化和挂载
格式化操作:
# 经过第 4 小节的操作后,boot 分区应该是 sda3
$ mkfs.fat -F32 /dev/<boot 分区>
# root 分区是 sda4
$ mkfs.ext4 /dev/<root 分区>
# home 分区是 sda5
$ mkfs.ext4 /dev/<home 分区>
挂载操作:
# 将 root 分区挂载到 /mnt
$ mount /dev/<root 分区> /mnt
# 将 home 分区挂载到 /mnt/home
$ mkdir /mnt/home
$ mount /dev/<home 分区> /mnt/home
# 将 EFI 分区挂载到 /mnt/boot。注意,这里挂载的是 EFI 分区(sda1)而不是 boot 分区(sda3)
$ mkdir /mnt/boot
$ mount /dev/<EFI 分区> /mnt/boot
6. 修改镜像服务器
接下来的操作就是安装系统到磁盘上并安装相应的软件,这一步需要联网下载。鉴于网络原因,我们可以通过修改 /etc/pacman.d/mirrorlist
文件来使用国内的镜像服务器,大大提升下载速度。使用 nano
或 vim
编辑该文件,在文件开头添加国内镜像服务器地址即可。
# 镜像服务器地址可以从这里获取:
# https://wiki.archlinux.org/index.php/Mirrors_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
$ vim /etc/pacman.d/mirrorlist
# 我使用的是清华源,添加下面的内容在 mirrorlist 开头即可
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
7. 安装到磁盘
之前的大部分操作都是在 Arch Live 环境中进行的操作,接下来就开始将系统安装到磁盘了。首先要安装的是 base 软件组,Linux 内核和常见硬件的固件包。
# 遇到选择时一直回车即可。
$ pacstrap -i /mnt/ base linux linux-firmware
安装完成后就可以生成 fstab
文件(启动时挂载用)了。fstab
文件的介绍可以看这里。
# 使用 -U 或 -L 选项指定通过 UUID 或 Label 定义
$ genfstab -U /mnt >> /mnt/etc/fstab
# 生成之后检查一下 fstab 文件,并记录 root 分区的 UUID
$ cat /mnt/etc/fstab
如果 fstab
文件生成没有问题的话,接下来就是进入新安装的文件系统中操作了。
$ arch-chroot /mnt
# 回车后终端提示符应该如下所示
[root@archiso /]#
8. 安装相关软件
现在我们的所有操作都是在新安装的文件系统中进行。首先要进行的操作就是安装相关的软件,列举如下。
-
base-devel
包含编译和链接工具的软件组 -
linux-headers
Linux 内核模块的头文件和脚本 -
intel-ucode
Intel Microcode,具体说明见这里。如果没安装这个包的话,启动的时候会报Failed to open file: intel-ucode.img
的错误 -
vim
可选。文本编辑器(上面使用的vim
是在 Arch Live 环境里的) -
tree
可选。列出目录中的文件,稍后用于验证bootloader
的设置 -
man
可选。查看命令文档 -
linux-lts
可选。长期支持的 Linux 内核 -
linux-lts-headers
可选。长期支持的 Linux 内核头文件
pacman -S base-devel linux-headers intel-ucode vim tree man linux-lts linux-lts-headers
9. 配置系统
设置时区:
# 其中的 Region 和 City 需要修改为对应地区,比如修改为 Asia/Shanghai
$ ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
同步硬件时钟:
# 这个命令将硬件时钟同步为 UTC 时间,可以从这里获取更多信息
# https://wiki.archlinux.org/index.php/System_time#Time_standard
$ hwclock --systohc
生成地区配置:
# 编辑 /etc/locale.gen 文件,去除需要的行前面的 "#" 号
# 通常来说去除 en_US.UTF-8 和 zh_CN.UTF-8 的注释即可
$ vim /etc/locale.gen
$ locale-gen
# 创建 /etc/locale.conf 文件并设置相应的 LANG 变量
$ echo LANG=en_US.UTF-8 > /etc/locale.conf
# 如果需要修改键盘布局,将布局信息记录在 /etc/vconsole.conf 文件中,如 KEYMAP=de-latin1
$ vim /etc/vconsole.conf
可选 修改终端默认字体,可以使用
setfont
命令切换字体看看效果,可用字体可以在/usr/share/kbd/consolefonts
中找到。我使用的是 Terminus Font,可以在这里查看 Terminus Font 的各个文件的具体说明。
# 安装字体 $ pacman -S terminus-font # 切换字体 $ setfont ter-v32n # 写入配置文件 $ echo FONT=ter-v32n >> /etc/vconsole.conf
10. 配置网络
创建 hostname
文件,内容如下:
$ cat /etc/hostname
myhostname <-- 这里是你自己设置的机器名
然后添加对应项到 hosts
中(注意:如果有永久 IP,则替换 127.0.1.1
为永久 IP 地址):
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 myhostname.localdomain myhostname
再次修改 /etc/pacman.d/mirrorlist
文件,使用国内的镜像地址。(详见第 6 小节,之前配置的是 Arch Live 环境中的镜像地址)
然后是安装网络管理器,我用的是 networkmanager
,其他网络管理器可以查看这里:
networkmanager
提供nmcli
和nmtui
两个工具
$ pacman -S networkmanager
# 自动启动 NetworkManger 服务
$ systemctl enable NetworkManager.service
注:
# ref: https://wiki.archlinux.org/index.php/NetworkManager#Usage # 启动 Arch Linux 后,使用以下命令搜寻附近的无线网络 $ nmcli device wifi list # 使用以下命令连接网络 $ nmcli device wifi connect <WiFi 名称> password <WiFI 密码> # 如果是隐藏网络,可以使用以下命令进行连接 $ nmcli device wifi connect <WiFi 名称> password <WiFI 密码> hidden yes # 可以通过下面的命令查看所有连接 $ nmcli connection # 你也可以使用字符界面进行网络连接,输入 nmtui 即可
11. 创建用户
之前我们的操作都是在 root
用户下进行的,而我们日常使用并不会直接使用 root
用户,所以接下来是创建一个日常使用的用户。
# 给 root 用户创建密码
$ passwd
# 创建新用户,并加入相应的组,其中加入 wheel 组是为了让新用户拥有 sudo 权限
$ useradd --create-home --groups wheel,audio,video,optical,storage --shell /bin/bash <username>
# 给新用户创建密码
$ passwd <username>
# 确保 wheel 组的成员可以使用 sudo 命令
$ visudo
# 去除下面这一行的注释
%wheel ALL=(ALL) ALL
12. 配置启动引导
安装基本完成,接下来是最关键的一步了,就是配置启动引导程序,使得我们刚安装的 Arch Linux 可以被正常引导启动。ArchWiki 上列举了以下两种配置方式:
-
Using the native Apple bootloader with systemd-boot (Recommended)
-
Using the native Apple bootloader with GRUB
我采用的是第一种方式,因为不需要再安装额外的程序,而且也是 ArchWiki 推荐的方式。其实还有其他替代方案,比如使用 rEFInd
,具体可以参考这篇文章中“建立引导”一节。
-
复制 systemd-boot 提供的
/EFI/BOOT/BOOTX64.EFI
文件至 boot 分区# https://wiki.archlinux.org/index.php/Mac#Option_1:_EFI $ bootctl --path=/boot install
-
修改引导程序的配置文件
/boot/loader/loader.conf
,添加以下内容default arch timeout 4 console-mode max editor no
-
复制
/usr/share/systemd/bootctl/arch.conf
文件为/boot/loader/entries/arch.conf
,并修改为下面所示的内容。这里的UUID
就是刚刚第 7 小节中生成的fstab
文件中root
分区的 ID。title Arch Linux linux /vmlinuz-linux initrd /intel-ucode.img initrd /initramfs-linux-lts.img options root=UUID=<UUID> rootfstype=ext4 rw
注意:
如果没有安装
linux-lts
内核和头文件的话,那么应该使用initrd /initramfs-linux.img
代替。如果忘记记录 UUID 的话,可以通过
cat /etc/fstab
查看。如果使用了正确的 UUID,但是启动时报找不到设备的错误时,可以使用
PARTUUID
代替。通过命令lsblk -dno PARTUUID /dev/<root 分区>
或ls -l /dev/disk/by-partuuid
获取 root 分区的PARTUUID
,并修改options
字段的值为root=PARTUUID=<PARTUUID> rootfstype=ext4 rw
。
到这里,启动引导已经配置完成,可以通过 tree /boot
验证是否一切正常,输出应该如下所示(如果没有安装 linux-lts
内核和头文件的话,那么你将不会看到带 lts
的文件):
/boot/
├── EFI
│ ├── APPLE
│ │ └── EXTENSIONS
│ │ └── Firmware.scap
│ ├── Boot
│ │ └── BOOTX64.EFI
│ └── systemd
│ └── systemd-bootx64.efi
├── initramfs-linux-fallback.img
├── initramfs-linux.img
├── initramfs-linux-lts-fallback.img
├── initramfs-linux-lts.img
├── loader
│ ├── entries
│ │ └── arch.conf
│ └── loader.conf
├── vmlinuz-linux-lts
└── vmlinuz-linux
13. 启动 Arch Linux
通过以下命令退出至 Arch Live 环境并重启机器:
# 退出至 Arch Live 环境
$ exit
# 卸载所有挂载的设备,这一步大概率会出现 target busy 的错误,无视即可
$ umount -a
# 重启
$ reboot
如果一切配置正常,重启后你就可以看到启动界面中出现了 Arch Linux
的选项,并且自动启动 Arch Linux
。
注意:
- 如果更新
macOS
导致启动选择界面没有出现并直接启动了macOS
的话,可以在系统设置里的Startup Disk
中选择启动磁盘为EFI Boot
。 - 如果无法选择其他磁盘的话,可以在终端中输入
diskutil mount disk0s1
命令挂载EFI
分区后再进行选择。 - 如果上面两步无效的话,那么请以
root
身份运行这个命令bless --device /dev/disk0s1 --setBoot
并重启即可。
14. 结束语
进行到这里,双系统的安装也就完成了。然而安装后的 Arch Linux
还是字符终端,没有图形界面。如果需要图形界面的话,可以先安装 Xorg
软件包,再搭配桌面环境或者窗口管理器即可。这属于另外的话题,就不在这里展开了,感兴趣的话可以看看下面的两个链接。