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
    

配制

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

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

    arch-chroot /mnt
    
  • 设置时区:

    ln -sf /usr/share/zoneinifo/Asia/Shanghai /etc/localtime
    

运行 hwclock 生成 /etc/cadjtime

hwclock --systohc
  • 本地化语言支持 - 只需要UTF支持就可以,所以修改 /etc/locale.gen 保留 en_US.UTF-8 UTF-8 然后执行:

    locale-gen
    

创建 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密码:

    passwd
    
  • 设置日常帐号:

    groupadd -g 20 staff
    useradd -g 20 -u 501 -d /home/huatai -m huatai
    passwd huatai
    
  • 设置sudo:

    pacman -S sudo
    echo "huatai   ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers
    
  • 之前在 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
    

UEFI启动

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

  • 安装 efibootmgr

    pacman -S efibootmgr
    

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

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

注解

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

警告

默认安装的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系统。那么如何启动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 ,性能较差。

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

sudo pacman -S nvidia

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

屏幕亮度

对于 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+ 按钮临时调整。