Install Arch Linux on MacBook Air

我的 MacBook Air 是 mid2012 的,这时的 MBA 已经是基于 UEFI,而非 BIOS 的了。我的目标是安装 MacOS 和 arch linux dual boot 的系统。

1. MacOS 中的操作

  1. Resize MacOS partition using Disk utility.

    要留多一点,disk utility 显示我有 50G free space,其实 mac 在后面又偷偷用了一些,在装 Linux 时我发现少了近 3G

  2. Make a usb installer for arch linux.

     diskutil unmountDisk /dev/diskN
     sudo dd if=/path/to/linux.iso of=/dev/diskN bs=1m
    

    /dev/diskN 是 usb。

  3. Install rEFIt on mac.

    需要重启 mac 两次才能生效,真是奇葩阿

  4. 插上你的 usb,你会在重启之后看到 rEFIt 的菜单中多出很多 usb 里包含的启动项

2. Install Arch Linux

  1. boot from USB

    从 rEFIt 启动项中选 boot from EFI/boot/bootx64.efi,不要选 boot from EFI/archiso/vmlinuz.efi,选这个会有 kernel panic,启动不了。

  2. Disk partition

    之前看到说 linux 的 udev 是异步的,今天就遇到这个异步带来的困扰,我准备 format mac 的磁盘时,发现我 mac 的磁盘居然是 /dev/sdb,(sda 是我的 u 盘)。开始还以为怎么了,后来想到可能因为 udev 是异步的原因,果然重启之后,磁盘又变成 /dev/sda 了。

     gdisk /dev/sda
    
    1. 不要 swap,大不了以后用 swapfile,对于有 4G 内存的机子,swap 不是太需要了
    2. 只创建了两个用于 / 和 /home 的分区,/boot/ 我直接 mount 在 EFI partition
    3. 在 mac os 的 recovery HD 后面留出了 128M 的 free space,据说不这么做 osx 可能会不爽

    另外,比较诡异的是,我 gdisk 完事,都已经w了,可是退出 gdisk 后,在 /dev/ 目录下没有 sda4 和 sda5,可是不管用 gdisk 还是 cgdisk 都显示有,然后我就重启了,重启完好使了。

  3. make filesystem

     mkfs.ext4 /dev/sda4
     mkfs.ext4 /dev/sda5
    

    关于每个 partition 的情况你随时都可以 lsblk /dev/sda 看看

  4. mount partitions

     mount /dev/sda4 /mnt
     mkdir /mnt/{boot,home}
     mount /dev/sda1 /mnt/boot
     mount /dev/sda5 /mnt/home
    

    我直接将 /boot mount 在已有的 EFI partition 上。

  5. setup wireless

    1. 确认无线硬件已被识别,运行

       iw dev
      
    2. 得到 AP(access point) 列表

       iw dev wlp2s0 scan | less
      

      注意如果你是在一台同时有有线和无线的机子上,默认是开启有线的接口,这种情况下,你要先运行 iw dev set wlp2s0 upip link set wlp2s0 up(不知道为什么 iw 那个命令可能会挂掉)来开启无线接口,然后才能运行 scan,否则会提示 network is down。

      可以参考 arch wiki 确定每个字段都是什么意思。

      如果遇到 operation not possible due to rf kill,检查一下你的无线硬件开关有没有开。

    3. 生成无线配置文件

      从显示的信息看无线是 WPA/WPA2 加密的。

      我家的网络提示的 Authentication suites 是 PSK,而我公司的提示 802.1x,也就是说我公司的网络需要输入用户名密码才行。

      对于 PSK 的网络直接用 wpa_passphrase 生成 conf 即可,如下

       wpa_passphrase [SSID] [PASSWORD] > /etc/wpa_supplicant/[SSID].conf
      
    4. 对于 802.1x 的网络,你还得知道他的 key management 方法和 encapsulation 方法,我公司用的常用的 WPA-EAP 做 key management, PEAP 做 encapsulation,所以 conf 如下。

       network={
               ssid="alibaba-inc"
               key_mgmt=WPA-EAP
               eap=PEAP
               identity="..."
               password="..."
       }
      
    5. 连接无线网

       wpa_supplicant -B -i wlp2s0 -c /etc/wpa_supplicant/[SSID].conf
      
    6. 确认 wireless is connected,运行

       iw dev wlp2s0 link 
      
    7. 获取 ip 地址,运行

       dhcpcd wlp2s0
      
    8. 确认一切 ok

       ping sina.com
      
  6. 选取最快的 repository

     vi /etc/pacman.d/mirrorlist 
    
  7. 安装基本包

     pacstrap /mnt base base-devel
    
  8. 各种配置

     genfstab -p /mnt >> /mnt/etc/fstab
     arch-chroot /mnt /bin/bash
     echo juscodit > /etc/hostname
     ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
     useradd -m -g users -s /bin/bash juscodit
     passwd
     passwd juscodit
     vi /etc/locale.gen
     locale-gen
     pacman -S sudo
     visudo # add "juscodit ALL=(ALL) NOPASSWD: ALL
     pacman -S wpa_supplicant iw
    
  9. 安装 grub

    我曾尝试用 efi_stub 直接启动 kernel,不额外安装 boot loader,结果失败了,提示一个 firmware bug 然后一个 kernel panic,然后就没有然后了。这个我上面 usb boot 的时候遇到过,后来我尝试了用 usb 中 bootx64.efi 启动,发现可以,这个的意思就是你没法用 efi_stub 来直接 boot 你的系统,需要依赖一个 boot loader 来载入 kernel。

    运行下面的命令安装 grub

     pacman -S grub-efi-x86_64 dosfstools efibootmgr
     grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --recheck --debug
     grub-mkconfig -o /boot/grub/grub.cfg
    
  10. 完事重启

    exit
    umount -R /mnt/
    reboot
    

3. Post Install

  1. 安装显卡驱动

    运行下面命令查看显卡信息

     lspci | grep VGA
    

    MBA 是 intel 的显卡,安装 xf86-video-intel

  2. 声音

    install alsa-utils, run alsamixer and press ‘m’ to unmute master and up/down arrow to increase/decrease the volume

  3. touchpad

    install xf86-input-synaptics to enable touchpad. (mouse pointer is much more stable with xf86-input-synaptics than xf86-input-mtrack-git)