Install ArchLinux on MacAir 7,2
I decided to convert my Fedora install (setup here) into an ArchLinux install. Most of the partitions had been setup by Fedora and here how is they looked:
elatov@macair:~$df -Ph
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 128K 3.9G 1% /dev/shm
tmpfs 3.9G 960K 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/fedora-root 20G 8.2G 11G 44% /
tmpfs 3.9G 692K 3.9G 1% /tmp
/dev/sda5 477M 140M 308M 32% /boot
/dev/sda4 200M 16M 185M 8% /boot/efi
tmpfs 789M 8.0K 789M 1% /run/user/1000
elatov@macair:~$sudo fdisk -l
Disk /dev/sda: 113 GiB, 121332826112 bytes, 236978176 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: CDC959FA-64F6-42A1-B6E0-C12080E8F40F
Device Start End Sectors Size Type
/dev/sda1 40 409639 409600 200M EFI System
/dev/sda2 409640 186509543 186099904 88.8G Apple Core storage
/dev/sda3 186509544 187779079 1269536 619.9M Apple boot
/dev/sda4 187781120 188190719 409600 200M Apple HFS/HFS+
/dev/sda5 188190720 189214719 1024000 500M Linux filesystem
/dev/sda6 189214720 236976127 47761408 22.8G Linux LVM
Disk /dev/mapper/fedora-root: 20.4 GiB, 21890072576 bytes, 42754048 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk /dev/mapper/fedora-swap: 2.4 GiB, 2520776704 bytes, 4923392 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Arch Linux Bootable USB
Since the MacAir doesn’t have a CD-Drive, we can use a USB disk to perform the install. I downloaded the ISO from here and ended up with the following file:
elatov@macair:~$ls -l download/archlinux-2015.06.01-dual.iso
-rw-r-----@ 1 elatov elatov 667942912 Jun 27 13:28 download/archlinux-2015.06.01-dual.iso
After plugging in the USB disk MacOS X mounted it automatically and I saw the following:
elatov@macair:~$diskutil list
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *121.3 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_CoreStorage 95.3 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
4: Apple_HFS Linux HFS+ ESP 209.7 MB disk0s4
5: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 524.3 MB disk0s5
6: Linux LVM 24.5 GB disk0s6
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: Apple_HFS Macintosh HD *94.9 GB disk1
Logical Volume on disk0s2
4A1016AD-AB13-4A6E-9DAE-640AFBB812FB
Unencrypted
/dev/disk2
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *8.0 GB disk2
1: DOS_FAT_32 USB 8.0 GB disk2s1
/dev/disk2 is my USB disk. From here it looks like we can just dd the ISO onto the USB disk, so let’s umount it:
elatov@macair:~$diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
Now let’s dd the iso onto the USB (notice /dev/disk2 vs /dev/rdisk2):
elatov@macair:~$sudo dd if=download/archlinux-2015.06.01-dual.iso of=/dev/rdisk2 bs=1m
637+0 records in
637+0 records out
667942912 bytes transferred in 124.024175 secs (5385586 bytes/sec)
Prepare for the Arch Linux Install
After I rebooted, I held the Option key and I saw the USB drive as a bootable device. After I booted from it, I saw the following menu:
and after selecting the first menu I saw a shell:
Arch Linux 4.0.4-2-ARCH (tty1)
archiso login: root (automatic login)
root@archiso ~ #
Since the fedora install named the LVMs with the title of “fedora” I went ahead and renamed it to be generic, just so I know what’s it used for:
root@archiso ~ # vgrename fedora vgos
Volume group "fedora" successfully renamed to "vgos"
I went ahead and mounted the partitions and removed everything from them since they had fedora stuff on them:
root@archiso ~ # mount /dev/mapper/vgos-root /mnt
root@archiso ~ # rm -rf /mnt/*
zsh: sure you want to delete all the files in /mnt [yn]?y
root@archiso ~ # mkdir /mnt/boot
root@archiso ~ # mount /dev/sda5 /mnt/boot
root@archiso ~ # rm -rf /mnt/boot/*
zsh: sure you want to delete all the files in /mnt/boot [yn]?y
root@archiso ~ # mkfs.vfat -F 32 /dev/sda4
mkfs.fat 3.0.27 (2014-11-12)
root@archiso ~ # mkdir /mnt/boot/efi
root@archiso ~ # mount /dev/sda4 /mnt/boot/efi
I had a rooted andoid phone so I plugged it in and enabled USB tethering on it and I was able to get an IP:
root@archiso ~ # ip link
1: lo <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2. enp0s20u1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 12:34:56:23:34:45 brd ff:ff:ff:ff:ff:ff
root@archiso ~ # dhcpcd enp0s20u1
enp0s20u1: adding address fe80::56::5452:3423
enp0s20u1: waiting for carrier
enp0s20u1: carrier acquired
enp0s20u1: IAID 7f:f5:44:9f
enp0s20u1: soliciting a DHCP lease
enp0s20u1: soliciting an IPv6 router
enp0s20u1: offered 192.168.42.172 from 192.168.42.129
enp0s20u1: leased 192.168.42.173 for 3600 seconds
enp0s20u1: adding router to 192.168.42.0/24
enp0s20u1: adding default route via 192.168.42.129
root@archiso ~ # ip -4 a s enp0s20u1
2: enp0s20u1: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
inet 192.168.42.173/24 brd 192.168.42.255 scope global enp0s20u1
valid_lft forever preffered_lft forever
Installing Arch Linux
After I was online I ran the following to get the base install of Arch Linux:
root@archiso ~ # pacstrap /mnt base base-devel
...
...
pacstrap /mnt base base-devel 28.46s user 8.77s system 5% cpu 10:51.47 total
Then I generated the fstab file:
root@archiso ~ # genfstab -U -p /mnt >> /mnt/etc/fstab
root@archiso ~ # cat /mnt/etc/fstab
# /dev/mapper/vgos-root
UUID=51ad3d0a-d02e-4b31-b57d-2d50187a3c81 / ext4 rw,relatime,data=ordered 0 1
# /dev/sda5
UUID=bd516c1b-2337-417f-a201-f9990412f057 /boot ext4 rw,relatime,stripe=4,data=ordered 0 2
# /dev/sda4
UUID=087B-BB74 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2
Chroot and Configure Arch Linux
After that I setup the passwd and timezone for the system:
root@archiso ~ # arch-chroot /mnt /bin/bash
[root@archiso /] # passwd
[root@archiso /] # echo macair > /etc/hostname
[root@archiso /] # ln -s /usr/share/zoneinfo/America/Denver /etc/localtime
[root@archiso /] # useradd -m -u 1000 -U -G wheel -s /bin/bash elatov
[root@archiso /] # passwd elatov
I also enabled the wheel group to be able to use sudo:
[root@archiso /] # echo "%wheel ALL=(ALL) ALL" > /etc/sudoers.d/10-grant-wheel-group
To setup the locale I modified the /etc/locale.gen to enable the desired locales ( and generated them afterwards):
[root@archiso /] # grep -v '^#' /etc/local.gen
en_US.UTF-8 UTF-8
en_US ISO-8859-1
[root@archiso /] # locale-gen
Generating locales...
en_US.UTF-8...done
en_US.ISO-8859-1 ...
Generation complete.
[root@archiso /] # echo 'LANG="en_US.UTF-8"' > /etc/locale.conf
Prior to generating the RAM disk I ensured the lvm module is included:
[root@archiso /] # grep ^HOOKS /etc/mkinitcpio.conf
HOOKS="base udev autodetect modconf block lmv2 filesystems keyboard fsck"
And now the mkinicpio command:
[root@archiso /] # mkinitcpio -p linux
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
-> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramsfs-linux.img
==> Starting build: 4.0.6-1-ARCH
-> Running build hook: [base]
-> Running build hook: [udev]
-> Running build hook: [autodetect]
-> Running build hook: [modconf]
-> Running build hook: [block]
-> Running build hook: [lvm2]
-> Running build hook: [filesystems]
-> Running build hook: [keyboard]
-> Running build hook: [fsck]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux.img
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
-> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramsfs-linux-fallback.img -S autodetect
==> Starting build: 4.0.6-1-ARCH
-> Running build hook: [base]
-> Running build hook: [udev]
-> Running build hook: [modconf]
-> Running build hook: [block]
==> WARNING: Possibly missing firmware for module wd719x
==> WARNING: Possibly missing firmware for module aic94xx
-> Running build hook: [lvm2]
-> Running build hook: [filesystems]
-> Running build hook: [keyboard]
-> Running build hook: [fsck]
==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-fallback.img
==> Image generation successful
Install Boot Loader
I followed the instructions laid out in here to install GRUB. I already had the correct partition (FAT 32) mounted under /boot/efi as per the above commands. Now I just had to install the GRUB tools:
[root@archiso /] # pacman install grub-efi-x86_64 efibootmgr
Then I ran the following:
[root@archiso /] # grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck --debug
...
...
grub-install: info: copying `/boot/grub/x86_64-efi/core.efi' -> `/boot/efi/EFI/arch_grub/grubx64.efi'.
grub-install: info: Registering with EFI: distributor = `arch_grub', path = `\EFI\arch_grub\grubx64.efi', ESP at hostdisk//dev/sda,gpt4.
grub-install: info: executing efibootmgr --version </dev/null >/dev/null.
grub-install: info: executing modprobe -q efivars.
grub-install: info: executing efibootmgr -c -d /dev/sda -p 4 -w -L arch_grub -l \EFI\arch_grub\grubx64.efi.
BootCurrent: 0000
Timeout: 5 seconds
BootOrder: 0001,0000,0080
Boot0000* Fedora
Boot0080* Mac OS X
Boot0081* Mac OS X
BootFFFF*
Boot0001* arch_grub
Installation finished. No error reported.
[root@archiso /] # cp /boot/grub/locale/en\@quot.mo /boot/grub/locale/en.mo
Lastly I generated the GRUB menu:
[root@archiso /] #grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
/run/lvm/lvmetad.socket: connect failed: No such file or directory
WARNING: Failed to connect to lvmetad: Falling back to internal scanning.
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found fallback initramfs image: /boot/initramfs-linux-fallback.img
/run/lvm/lvmetad.socket: connect failed: No such file or directory
WARNING: Failed to connect to lvmetad: Falling back to internal scanning.
done
At this point I wanted to see if everything worked out, so I exited the choot, un-mounted all the partitions, and rebooted:
[root@archiso /] # exit
exit
arch-choot /mnt /bin/bash 16.79s user 7.22s system 0% cpu 44:33.37 total
root@archiso ~ # umount /mnt/boot/efi
root@archiso ~ # umount /mnt/boot
root@archiso ~ # umount /mnt
root@archiso ~ # reboot
After the reboot I saw the GRUB menu and Arch Linux was the only available option, which is what I had expected.
Post Install Setup
Install Yaourt
I was still using the usb tethering after I rebooted. Let’s install the yaourt utitility which will allow us to install packages from AUR. We can just enable their repo and then install the necessary packages as per this page:
[elatov@macair ~]$ tail -3 /etc/pacman.conf
[archlinuxfr]
SigLevel=Never
Server=http://repo.archlinux.fr/$arch
Now let’s refresh all the repos:
[elatov@macair ~]$ sudo pacman -Sy
:: Synchronizing package databases...
core is up to date
extra is up to date
community is up to date
archlinuxfr 2.7 MiB 432K/s 00:06 [############################################################] 100%
Now we can just run:
[elatov@macair ~]$ sudo pacman -S yaourt
Install Wireless Driver
Prior to installing the wl kernel module, let’s get the prereq packages:
[elatov@macair ~]$sudo pacman -S dkms wpa_supplicant linux-headers
Now let’s install the wl module so we can use the wireless and stop tethering:
[elatov@macair ~]$ yaourt -S broadom-wl-dkms
...
...
Building module:
cleaning build area....
make KERNELRELEASE=4.0.6-1-ARCH -C /usr/lib/modules/4.0.6-1-ARCH/build M=/var/lib/dkms/broadcom-wl/6.30.223.248/build....
cleaning build area....
Kernel cleanup unnecessary for this kernel. Skipping...
DKMS: build completed.
wl.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /usr/lib/modules/4.0.6-1-ARCH/kernel/drivers/net/wireless/
depmod....
DKMS: install completed.
It's recommended to execute the following commands to load the module:
rmmod b43 2>/dev/null
rmmod b43legacy 2>/dev/null
rmmod ssb 2>/dev/null
rmmod bcm43xx 2>/dev/null
rmmod brcm80211 2>/dev/null
rmmod brcmfmac 2>/dev/null
rmmod brcmsmac 2>/dev/null
rmmod bcma 2>/dev/null
modprobe wl
/usr/bin/depmod -a
At this point it’s a good idea to enable the dkms service so it compiles the module when a new kernel is installed:
[elatov@macair ~]$ sudo systemctl enable dkms
Now let’s make sure none of the conflicting modules are loaded:
[elatov@macair ~]$ lsmod | grep ssb
[elatov@macair ~]$ lsmod | grep b43
And now let’s load the wl module:
[elatov@macair ~]$ sudo modprobe wl
[ 384.38342 ] wl0: online cpus 1
And now we will see our wireless card:
[elatov@macair ~]$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DORMANT group default qlen 1000
link/ether ge:ge:ge:ge:ge:ge brd ff:ff:ff:ff:ff:ff
Configure Wireless Networking
Now let’s connect to a wireless network:
[elatov@macair ~]$ sudo pacman -S dialog
[elatov@macair ~]$ sudo wifi-menu -o
Then select your network and enter the password for the wireless network and then enable it to connect on boot:
[elatov@macair ~]$ netctl list
* wlp3s0-ap-5g
[elatov@macair ~]$ sudo netctl enable wlp3s0-ap-5g
ln -s '/etc/systemd/system/netctl@wlp3s0\x2dap\x2d5g.service' '/etc/systemd/system/multi-user.target.wants/netctl@wlp3s0\x2dap\x2d5g.service'
For good measure you can start it, but the wifi-menu should’ve taken care of that:
[elatov@macair ~]$ sudo netctl start wpls3-ap-5g
At this point you can enable SSH and do the rest remotely if you so prefer:
[elatov@macair ~]$sudo pacman -S openssh
[elatov@macair ~]$sudo systemctl enable sshd
[elatov@macair ~]$sudo systemctl start sshd
Add MaxOS to the GRUB Menu
To add the mac os x grub menu, I followed the instructions from my previous blog, I configured a custom menu to chainload the mac osx bootloader:
[elatov@macair ~]$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry "MacOS X Yosemite" {
insmod hfsplus
set root=(hd1,gpt3)
chainloader /System/Library/CoreServices/boot.efi
boot
}
and if you want to be the default you can set it the grub config:
[root@macair ~]# grep ^GRUB_DEFAULT /etc/default/grub
GRUB_DEFAULT="MacOS X Yosemite"
and rebuilt the config one more time:
[elatov@macair ~]$ sudo grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found fallback initramfs image: /boot/initramfs-linux-fallback.img
done
After rebooting the Mac OS X menu was the default one in GRUB and I can always select Arch Linux when I need to.
Xorg
You can run the following to install X:
[elatov@macair ~]$ sudo pacman -S xorg xf86-input-synaptics
Let’s get a simple window manager and display manager installed:
[elatov@macair ~]$ sudo pacman -S lightdm lightdm-gtk-greeter icewm
Let’s enable the display manager to start on boot:
[elatov@macair ~]$ sudo systemctl enable lightdm
Created symlink from /etc/systemd/system/display-manager.service to /usr/lib/systemd/system/lightdm.service.
Here is track pad setup that worked well for me:
[elatov@air ~]$ cat /etc/X11/xorg.conf.d/60-synaptics.conf
Section "InputClass"
Identifier "touchpad"
Driver "synaptics"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Option "FingerHigh" "10"
Option "FingerLow" "1"
Option "RTCornerButton" "0"
Option "RBCornerButton" "0"
Option "MinSpeed" "0.7"
Option "MaxSpeed" "1.7"
Option "SHMConfig" "on"
Option "TapAndDragGesture" "on"
Option "PalmDetect" "on"
Option "TapButton1" "1"
Option "TapButton2" "3"
Option "TapButton3" "2"
Option "PalmMinWidth" "30"
EndSection
Other people have had luck with the xf86-input-mtrack driver, but I was okay with the synaptics one.
To fix the ~ (Tilde) key I ended up adding the following to GRUB menu:
[elatov@air ~]$ grep LINUX_D /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet hid_apple.iso_layout=0"
To make sure the xbacklight utility works, set the following GRUB option:
[elatov@macair ~]$ grep LINUX_D /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet acpi_backlight=vendor"
For the above options I had to regenerate the GRUB menu.
Sound
I end up using pulseaudio to install it, I ran the following
[elatov@macair ~]$ sudo pacman -S pulseaudio pulseaudio-alsa alsa-utils
If pulseaudio is not started by the window manager by default, then launch it your self:
[elatov@macair ~]$ start-pulseaudio-x11
After pulse is running you can test with the following files:
[elatov@macair ~]$ aplay /usr/share/sounds/alsa/Front_Left.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
[elatov@macair ~]$ aplay /usr/share/sounds/alsa/Front_Right.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Right.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
You should hear something come out of the speakers.
Enable swap
I didn’t do this during the installation so I decided to catch up. First find out what the UUID of the swap partition is (mine was already there from the previous install):
[elatov@macair ~]$ sudo blkid | grep swap
/dev/mapper/vgos-swap: UUID="4ea5bcf4-b635-48bb-ac79-adeaefa8950a" TYPE="swap"
Then add the following to the /etc/fstab file:
# /dev/mapper/vgos-swap
UUID=4ea5bcf4-b635-48bb-ac79-adeaefa8950a swap swap defaults 0 0
Then enable it:
[elatov@macair ~]$ swapon -s
[elatov@macair ~]$ sudo swapon -a
[elatov@macair ~]$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2461692 0 -1