在 Macbook Pro 2015 上安装 Arch Linux

4,251 阅读7分钟

0. 介绍

这段时间在虚拟机上折腾了 Archawesomewm,发现这种轻量级的图形界面比完整的桌面环境(DE)更适合自己。而且 tiling window manager 也比桌面环境更高效,纯键盘操作很舒服。具体效果见下图(P.S. 这篇文章不涉及 awesomewm 的配置)。

Screenshot

关于 Linux 下的桌面环境和窗口管理器的关系可以参考 StackExchange 上的这个回答。简单来说,可以看下面这张图。

The basic components of a GUI

关于 wm 的介绍可以看这几个视频:A Comprehensive Guide To Tiling Window ManagersWhy 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:

  1. 打开磁盘工具(在 Launchpad 的“其他”目录里)

    Other Folder

  2. 选择要进行分区的设备,并点击分区按钮

    Disk Utility

  3. 在弹出的页面中调整 macOS 分区的大小,剩下的部分则作为安装 Arch 的分区,格式化为 Dos 格式(其实什么格式都可以,因为安装的时候会重新格式化)

    macOS Partition

如果在磁盘工具里看不到设备的话,可以选择显示所有设备,如图

Show All Devices

Ok,准备工作完成。

2. 启动 Arch Live 环境

接下来就是关掉 Macbook,插上 U 盘。在启动 Macbook 的同时按住键盘左侧的 Option 键,然后就会进入启动设备选择界面,如图。选择 EFI BootArch Linux archiso x86_64 UEFI USB

Boot Order

Boot Menu

稍等片刻后就会进入 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 文件来使用国内的镜像服务器,大大提升下载速度。使用 nanovim 编辑该文件,在文件开头添加国内镜像服务器地址即可。

# 镜像服务器地址可以从这里获取:
# 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 提供 nmclinmtui 两个工具
$ 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,具体可以参考这篇文章中“建立引导”一节。

  1. 复制 systemd-boot 提供的 /EFI/BOOT/BOOTX64.EFI 文件至 boot 分区

    # https://wiki.archlinux.org/index.php/Mac#Option_1:_EFI
    $ bootctl --path=/boot install
    
  2. 修改引导程序的配置文件 /boot/loader/loader.conf,添加以下内容

    default  arch
    timeout  4
    console-mode max
    editor   no
    
  3. 复制 /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
    

注意:

  1. 如果没有安装 linux-lts 内核和头文件的话,那么应该使用 initrd /initramfs-linux.img 代替。

  2. 如果忘记记录 UUID 的话,可以通过 cat /etc/fstab 查看。

  3. 如果使用了正确的 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

注意:

  1. 如果更新 macOS 导致启动选择界面没有出现并直接启动了 macOS 的话,可以在系统设置里的 Startup Disk 中选择启动磁盘为 EFI Boot
  2. 如果无法选择其他磁盘的话,可以在终端中输入 diskutil mount disk0s1 命令挂载 EFI 分区后再进行选择。
  3. 如果上面两步无效的话,那么请以 root 身份运行这个命令 bless --device /dev/disk0s1 --setBoot 并重启即可。

14. 结束语

进行到这里,双系统的安装也就完成了。然而安装后的 Arch Linux 还是字符终端,没有图形界面。如果需要图形界面的话,可以先安装 Xorg 软件包,再搭配桌面环境或者窗口管理器即可。这属于另外的话题,就不在这里展开了,感兴趣的话可以看看下面的两个链接。

15. 参考资料