MacBook Pro上运行Arch Linux

安装

MacBook Pro上先安装macOS,然后调整磁盘,空出空间给Arch Linux安装。安装完成后,实现双启动。

备注

Mac设备的Firemware update依赖macOS的系统更新,所以如果完全铲除了macOS系统只保留Linux,则无法更新firmware。我保留了128G空间给macOS一方面能够及时更新firmware,另一方面也能够随时切换回macOS系统做iOS/macOS开发。

安装macOS

  • 重命名U盘:

可以使用Disk Utility工具将U盘格式化成一个命名为`CatalinaInstaller`的U盘符

  • 输入以下命令创建macOS安装U盘:

    sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/CatalinaInstaller --nointeraction
    
  • macOS安装非常直观,只需要插入U盘,按住command键,然后按电源键启动,就可以选择从U盘启动,然后格式化磁盘,将mcaOS安装到MacBook Pro上。

macOS分区调整

默认安装的macOS会占据整个磁盘,为了能够安装Linux,我们需要收缩macOS分区。使用的工具就是macOS的Disk Utilities。

  • 添加新的分区

../../_images/diskutil_partition.png

注意一定要添加分区,不能添加卷。添加卷实际上是macOS APFS文件系统内部的子卷,只有添加分区才能收缩现有的macOS所在分区。

../../_images/diskutil_partition_1.png
  • 点击 + 按钮添加一个分区,然后按住以下截图中饼图上箭头所指的调整分区的圆点旋转调整两个分区的大小。例如,我调整Linux分区到400G,保留Mac分区100G。

../../_images/diskutil_partition_2.png

新创建的分区格式可以任选,反正安装Linux时候还会删除重新创建。

安装U盘制作

如果是macOS平台制作启动U盘,则执行如下命令创建安装U盘:

hdiutil convert -format UDRW -o archlinux-2019.10.01-x86_64.img archlinux-2019.10.01-x86_64.iso
sudo dd if=archlinux-2019.10.01-x86_64.img.dmg of=/dev/rdisk3 bs=10m

如果是Linux平台制作启动U盘,则执行如下命令创建安装U盘:

sudo dd if=archlinux-2019.10.01-x86_64.img.dmg of=/dev/sdb bs=10M

安装arch linux

在MacBook Pro上安装arch linux遇到的第一个问题是无线网卡无法识别。类似 MacBook Pro上运行Ubuntu 由于Broadcom的授权限制,发行版不能携带Broadcom BCM4360 802.11ac无线网卡设备驱动。

解决方法是先采用USB网卡连接Internet,先完成操作系统安装,然后再安装 broadcom-wl-dkms 软件包来支持无线网卡。

  • 更新时钟:

    timedatectl set-ntp true
    
  • 磁盘分区:

    parted -a optimal /dev/sda
    

此时 print 显示分区还是之前在macOS下划分的分区:

Model: ATA APPLE SSD SM0512 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name                  Flags
 1      20.5kB  210MB  210MB  fat32        EFI System Partition  boot, esp
 2      210MB   100GB  100GB
 3      100GB   500GB  400GB                                     msftdata

删除分区3:

rm 3

重新创建分区3,分区大小50GB:

mkpart primary ext4 100GB 150GB
name 3 arch_linux
  • 格式化文件系统:

    mkfs.ext4 /dev/sda3
    
  • 挂载文件系统:

    mount /dev/sda3 /mnt
    mkdir /mnt/boot
    mount /dev/sda1 /mnt/boot
    
  • 选择镜像网站

arch linux的镜像网站定义在 /etc/pacman.d/mirrorlist 。在这个定义文件中,越靠前的网站优先级越高,所以建议将地理位置最近的网站列到最前面。例如,在中国,可以选择163镜像网站。

  • 安装基本软件包:

    pacstrap /mnt base linux linux-firmware
    

安装20221101

2022年11月1日,我再次在MacBook Pro上安装arch linux,有以下这些区别:

  • 内置硬盘替换为NVME磁盘,所以磁盘命名不同

  • 没有再为macOS保留分区,我准备全程使用Linux系统

  • 使用 parted分区工具 对磁盘分区(重建):

    # 初始化磁盘分区表(擦除原先的所有数据)
    parted /dev/nvme0n1 mklabel gpt
    
    # 创建第一个 分区,用于EFI启动
    parted -a optimal /dev/nvme0n1 mkpart ESP fat32 0% 256MB
    parted /dev/nvme0n1 set 1 esp on
    
    # 创建第二个 分区,用于操作系统部署(剩余空间使用 :ref:`zfs` 卷)
    parted -a optimal /dev/nvme0n1 mkpart primary xfs 256MB 64GB
    
    # 格式化文件系统
    mkdosfs -F 32 /dev/nvme0n1p1
    mkfs.xfs /dev/nvme0n1p2
    
  • 挂载文件系统:

    mount /dev/nvme0n1p2 /mnt
    mkdir /mnt/boot
    mount /dev/nvme0n1p1 /mnt/boot
    
  • 选择镜像网站并安装基本软件包:

    pacstrap -K /mnt base linux linux-firmware
    

备注

这次我选择了XFS作为根文件系统,但是安装过程似乎没有包含xfsprogs,导致有fsck报错:

==> ERROR: file not found: `fsck.xfs'
==> ERROR: file not found: `xfs_repair'
==> WARNING: No fsck helpers found. fsck will not be run on boot.

暂时忽略,等后续系统运行起来再补安装

配制

  • fstab: 生成fstab文件(这里 -U-L 定义UUID或labels):

生成fstab文件
genfstab -U /mnt >> /mnt/etc/fstab
  • chroot 将根修改到新系统:

chroot进入安装的arch linux系统
arch-chroot /mnt
  • 设置时区:

设置上海时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 运行 hwclock 生成 /etc/cadjtime :

同步校正时间到硬件时钟
hwclock --systohc
  • 本地化语言支持 - 只需要UTF支持就可以,所以修改 /etc/locale.gen 保留 en_US.UTF-8 UTF-8 然后执行:

本地化语言支持 UTF
locale-gen

创建 locale.conf 设置如下:

/etc/locale.conf 配置
LANG=en_US.UTF-8
  • 创建 /etc/hostname 内容是主机名:

    xcloud
    
  • 编辑 /etc/hosts

    127.0.0.1    localhost
    127.0.1.1    xcloud.huatai.me  xcloud
    
  • 设置root密码:

设置root密码
passwd
  • 创建日常账号( admin )并设置sudo:

设置admin账号并设置sudo
# arch linux使用wheel组,debian则使用sudo组
groupadd -g 505 admin
useradd -g 505 -u 505 -s /bin/bash -d /home/admin -m admin
usermod -aG wheel admin
echo "%wheel        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
# 必须设置admin密码,默认root用户无法ssh登陆,需要使用admin账号
passwd admin
  • 之前在 ThinkPad X220上运行Arch Linux 遇到默认内核没有加载Vfat模块导致无法读取EFI分区,编辑 /etc/mkinitcpio.conf

    MODULES=(vfat xfs)
    BINARIES=(fsck fsck.ext2 fsck.ext3 fsck.ext4 e2fsck fsck.vfat fsck.msdos fsck.fat fsck.xfs xfs_repair)
    

然后安装软件包:

pacman -S dosfstools xfsprogs

再重新生成initramfs:

mkinitcpio -P

安装必要软件包

  • 使用pacman安装必要软件包:

    pacman -S vim which mlocate oepnssh
    
  • arch linux配置IP(静态或动态) : 配置USB网卡,先确保能够通过有闲网络连接互联网,之后可以再安装无线

UEFI启动

在EFI系统中,实际上并不需要安装Grub这样的启动管理系统就可以启动Linux,只需要在EFI中设置启动顺序。

  • 安装 efibootmgr

    pacman -S efibootmgr
    

参考 EFISTUB - Using UEFI directly 执行如下命令:

efibootmgr --disk /dev/DISK --part Y --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' --verbose

备注

  • 这里 --disk /dev/DISK 是指整个磁盘

  • --part Y 是指ESP所在分区

  • PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 设置PARTUUID参数请检查 ls -lh /dev/disk/by-partuuid/ 目录下设备文件的软链接,可以找到对应 根文件系统 的 PARTUUID。请注意,PARTUUID和磁盘UUID不同,在 /etc/fstab 中使用的是UUID。

备注

对于2022年11月1日重新在NVME设备上安装,执行 efibootmgr 如下:

efibootmgr --disk /dev/nvme0n1 --part 1 --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=5c7afe7a-b41f-415b-9f12-129c3014293a rw initrd=\initramfs-linux.img' --verbose

警告

默认安装的arch linux内核不支持vfat文件系统,而EFI分区就是vfat,所以在前面重新构建initfs,将vfat支持加入。这个步骤非常重要,否则系统启动时会报错 mount: /new_root: unknown filesystem type 'vfat'

  • 设置启动顺序:

    efibootmgr --bootorder XXXX,XXXX --verbose
    

这里 xxxx,xxxx 是刚才 efibootmgr --verbose 输出的每个启动项的编号。

备注

这里不设置启动顺序也行,默认就是先启动刚才安装的Arch Linux

备注

现在重启操作系统,则立即进入Arch Linux系统。那么如何启动macOS呢?

Mac硬件系统有一个 option 键提供了EFI启动选择,在按下电源键同时安装 option 键,就会出现启动操作系统的选项。不过Mac的 option 键启动看不到Linux分区,所以这里只能作为重新启动macOS的方法。

以上就可以满足macOS和Arch Linux的双启动设置需求。

Nvidia显卡

我的笔记本MacBook 是 2013年底版本,属于 MacBook Pro 11,x 系列。从 dmidecode 可以看到:

System Information
     Manufacturer: Apple Inc.
     Product Name: MacBookPro11,3
  • 检查显卡:

    lspci -k | grep -A 2 -E "(VGA|3D)"
    

输出:

01:00.0 VGA compatible controller: NVIDIA Corporation GK107M [GeForce GT 750M Mac Edition] (rev a1)
 Subsystem: Apple Inc. GK107M [GeForce GT 750M Mac Edition]
     Kernel driver in use: nouveau

当前是开源驱动 nouveau ,性能较差。

  • (旧方法,2022年已废弃)对于 GeForce 600-900 以及 Quadro/Tesla/Tegra K系列显卡,或者更新的显卡(2010-2019年),安装 nvidianvidia-lts 驱动包:

    sudo pacman -S nvidia
    

安装完成后需要重启系统,因为 nvidia 软件包包含屏蔽 nouveau 模块配置,所以需要重启。

  • (新方法,2022年) 由于NVIDIA已经不再最新的驱动中支持 GeForce GT 750M ,所以默认 pacman -S nvidia 安装的NVIDIA驱动v520版本过高会无法使用。所以根据启动提示,需要使用 Arch Linux AUR 安装 nvidia-470xx-dkms 软件包:

    yay -S nvidia-470xx-dkms
    

图形桌面

2022年11月重新安装arch linux,选择 LXQt 作为轻量级桌面

屏幕亮度

对于 ThinkPad X220上运行Arch Linux 是默认就可以通过屏幕亮度调节键直接调整亮度,这个屏幕亮度值是通过设置 /sys/class/backlight/gmux_backlight/brightness 来调整的。不过,对于Nvidia显卡,直接调整这个值不生效,需要以 root 身份执行以下命令:

setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0

然后调整就能够生效。

通过 Arch Linux AUR 安装 gmux_backlight 软件包之后,就可以以普通用户身份调整屏幕亮度,即修改 /sys/class/backlight/gmux_backlight/brightness

Suspend

从 Linux Kernel 3.13 开始支持 Suspend(内核 3.12 从suspend唤醒时屏幕没有背光,只能使用 hibernate),但是需要禁止USB唤醒功能,否则会导致suspend之后立即又恢复工作。执行以下命令将 XHC1 设置到 /proc/acpi/wakeup 就可以关闭:

echo XHC1 | sudo tee /proc/acpi/wakeup

这个内核proc在设置之后, cat /proc/acpi/wakeup 输出:

DeviceS-state  Status   Sysfs node
...
XHC1  S3*disabled  pci:0000:00:14.0
...

备注

不过,依然需要关闭蓝牙鼠标连接,否则鼠标移动还是可能会唤醒系统。但至少不再无法suspend了。

内核参数

参考 Arch Linux社区文档 - MacBookPro11,x#Kernel parameters ,实际上要设置 Arch Linux Hibernates 还需要传递参数 acpi_osi=Darwin 。这是因为从内核 4.17.2-1 开始,增加了 acpi_osi 参数空值会导致电池无法检测到。此外,添加了 acpi_osi 内核参数还可以增加电池寿命。

由于需要传递 acpi_mask_gpe=0x06 内核参数避免有时候迅速增加的终端寄存器值导致某个CPU核心达到100%。

备注

确实我发现 dmesg -T 现实启动有Apple相关的ACPI报错,并且我也遇到过莫名其妙的系统负载极高现象,应该和上述内核参数相关。

完整 efi 命令如下:

efibootmgr --disk /dev/sda --part 1 --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=c31f68cd-97f7-4471-93c7-adb62b22a17b rw initrd=\initramfs-linux.img resume=UUID=e38d80cc-4044-4d34-b730-1f0c874ad765 swap_file_offset=7798784 acpi_osi=Darwin acpi_mask_gpe=0x06' --verbose

屏幕分辨率相关设置

MacBook Pro的屏幕分辨率极高,默认情况下Linux运行时字体都显示过小,在xfce桌面上主要调整如下:

  • Settings => Appearance => Fonts (默认编辑区域文字) - 设置 Default FontWenQuanYi Micro Hei Regular 13 - 设置 Default Monospace FontWenQuanYi Micro Hei Regular 13

  • Settings => Windows Manager => Style => Theme => Default - 设置 Title fontSans Bold 13

以上设置之后,基本图形功能都可以非常舒畅使用。但是,Firefox浏览器默认显示的自体过小,调整:

  • 菜单 Preferences => Language and Appearance => Fonts and Colors - 设置 Default frontDefault(FreeSerif) 16

但是,上述设置对于WEB页面已经通过CSS设置字体无效,除非你在 Advanced... 选项中 去除 选择 Allow pages to choose their own fonts, instead of your selections above 。不过,用自己定义的字体强制覆盖WEB页面自体会导致页面风格破坏。

解决方法是调整Firefox默认页面缩放比例,这个设置没有提供UI菜单,需要在地址栏输入 about:config 并回车,然后点击 I accept the risk! 按钮进入配置。搜索 layout.css.devPixelsPerPx ,这个选项默认设置值是 1.0 ,表示页面显示比例是 100% 。可以调整这个数值,例如 1.5 表示显示比例 150% ,以此类推。不过,这个页面显示比例是全局影响,也会导致Firefox的菜单和工具条同步放大,所以也不宜调整过大,我在MacBook Pro上设置 1.5 基本已经满足大多数页面浏览。少数页面字体实在过小,只能通过 ctrl+ 按钮临时调整。

参考