Arch Linux en el MacBook

necesidades. No sigas este “tutorial” a ciegas ni ejecutes ningún comando sin saber exactamente qué hace.
Hice esta instalación en 2014 y la publico aquí a petición de un miembro del grupo Arch Linux Brasil en Facebook. El proceso es muy parecido al que detallé en mi tutorial de 2012, pero el MacBook requiere atención especial. El artículo está algo incompleto, pero seguramente no lo edite pronto.
Ya no uso esta configuración en dualboot, porque el resultado no me pareció muy satisfactorio: el wifi fallaba a veces, el touchpad no funciona tan bien como en OS X (llegué a editar el código fuente de los controladores en vano), la batería duraba menos y ocupaba mucho espacio de mi SSD de solo 128 GB.
Ahora tengo un sobremesa con Arch, un disco externo con varios Live CD y algunas máquinas virtuales en OS X. Hasta ahora esta configuración me da para todo lo que necesito.
¿Por qué un MacBook?
Mi Acer, que ya estaba viejito y lento, tuvo otro problema en la pantalla, así que decidí que era hora de cambiar de portátil.
Todavía vivía en Alemania y encontré un MacBook Air 13" subastado en Ebay. Hice una puja bastante baja, pero gané. El teclado es alemán, aunque me acostumbré sin problemas.
Aunque critico algunas cosas de los productos de Apple, tengo que reconocer que la calidad del hardware es excelente, igual que su valor de reventa. Además está la posibilidad de desarrollar para iOS.
En cuanto al software, OS X no decepciona. Desde que lo compré he usado Mavericks, Yosemite y El Capitan sin problemas. Mucho software libre también está disponible, porque Darwin es tipo Unix (¡y POSIX!).
Copia de seguridad y actualización de OS X
Para reducir el riesgo de problemas, haz copia de tus archivos, libera espacio en el disco y actualiza OS X.
Particionar el disco
Divide el Macintosh HD en dos particiones con Disk Utility. Yo usé solo 23 GB para Arch, porque
el SSD de mi MacBook tiene únicamente 128 GB.
Archboot por USB
Descarga la última versión de Arch en https://www.archlinux.org/download/ y graba el .iso en un pendrive:
sudo dd if=archlinux-2014.10.01-dual.iso of=/dev/rdisk2 bs=1m
UEFI Boot Manager
Desde el kernel 3.3 se puede arrancar Linux sin usar gestores de arranque como GRUB, gracias a EFISTUB.
Solo necesitamos un boot manager para elegir entre los distintos sistemas operativos.
Systemd-boot
Antes llamado gummiboot, es el boot manager más simple y con menos funciones. No lo voy a usar.
rEFInd
rEFInd es un fork de rEFIt. Básicamente muestra un menú durante el arranque que te deja elegir qué sistema operativo iniciar.
En El Capitan hay que ejecutar antes csrutil disable en Recovery Mode.
Descarga la última versión de su web e instálala con estas opciones:
sudo ./install.sh --alldrivers
Lo instalo en la ESP, porque uso Whole-Disk Encryption en OS X.
diskutil list
mkdir /Volumes/ESP
sudo mount -t msdos /dev/disk0s1 /Volumes/ESP
Renombra la carpeta y el archivo .efi si tienes un retraso de 30 s durante el arranque:
# mv /Volumes/ESP/EFI/refind /Volumes/ESP/EFI/BOOT
# mv /Volumes/ESP/EFI/BOOT/refind_x64.efi /Volumes/ESP/EFI/BOOT/bootx64.efi
Añade esta línea a refind.conf:
dont_scan_volumes ""
(Esa línea está comentada como #dont_scan_volumes "Recovery HD").
Instalación
Conecta el pendrive a un puerto USB y reinicia el ordenador. Uno de los iconos de rEFInd debería
arrancar desde el pendrive. En mi caso aparece Boot Legacy OS from FAT volume.
El wifi no funcionará, así que ten a mano un adaptador USB-Ethernet o mete el controlador broadcom-wl-dkms en el pendrive.
Sigue la instalación normalmente, pero no instales ningún gestor de arranque. Mi instalación, con el disco cifrado, es más o menos así:
loadkeys i386/qwertz/de-latin1.map.gz # ou br-abnt2
timedatectl set-ntp true
fdisk -l /dev/sda # ou lsblk
cryptsetup benchmark
cryptsetup -v --cipher aes-xts-plain64 --key-size 256 --hash sha1 --iter-time 1000 --use-urandom --verifiy-passphrase luksFormat /dev/sda4
cryptsetup luksDump /dev/sda4
cryptsetup luksOpen /dev/sda4 arch-luks
mkfs.ext4 -L arch /dev/mapper/arch-luks
Si quieres una swap:
mkswap -L swap /dev/sdXY && swapon /dev/sdXY
mount /dev/mapper/arch-luks /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
pacstrap /mnt base{,-devel}
genfstab -U -p /mnt >> /mnt/etc/fstab
arch-chroot /mnt
echo "air" > /etc/hostname
ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
sed -i -e 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
sed -i -e 's/#pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf
echo -e "KEYMAP=de-latin1\nFONT=latarcyrheb-sun16" > /etc/vconsole.conf
sed -i -e '/^#\[multilib\]$/,+1s/#//' /etc/pacman.conf
sed -i -e '/# Misc options/a ILoveCandy' /etc/pacman.conf
sed -i -e 's/^# Color/Color/' /etc/pacman.conf
pacman -Sy reflector
reflector --verbose -l 200 -p http --sort rate --save /etc/pacman.d/mirrorlist
$ vi /etc/mkinitcpio.conf
HOOKS="base udev autodetect modconf block encrypt filesystems keyboard keymap consolefont fsck"
mkinitcpio -p linux
passwd
pacman -S \
sudo zsh alsa-utils alsa-oss xbindkeys feh imagemagick wget \
firefox htop python python2 python-pip python2-pip git ack openssh \
apache postgresql rsync rxvt-unicode unrar zip p7zip gparted ntfsprogs \
neovim python{,2}-neovim renameutils \
mpd ncmpcpp xf86-video-vesa
# pacman -S pkgfile
# pkgfile --update
$ echo "source /usr/share/doc/pkgfile/command-not-found.zsh" >> ~/.zshrc
# amixer sset Master unmute
# amixer sset Master 50%
# speaker-test -c 2
Xdg user directories
- http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
- https://wiki.archlinux.org/index.php/Xdg_user_directories
- https://wiki.archlinux.org/index.php/XDG_Base_Directory_support
Varios programas usan directorios y variables de entorno estándar. Estos comandos crean esos directorios:
$ sudo pacman -S xdg-user-dirs
$ nvim ~/.config/user-dirs.dirs
XDG_CACHE_HOME="${HOME}/.cache
XDG_CONFIG_HOME="${HOME}/.config
XDG_DATA_HOME="${HOME}/.config
$ sudo -e /etc/xdg/user-dirs.conf
Enabled = False
xdg-user-dirs-update
Lo que hago yo es poner esas variables en /etc/profile y ~/.profile.
Packer
sudo pacman -S jshon expac
wget https://aur.archlinux.org/cgit/aur.git/snapshot/packer.tar.gz
tar xvzf packer.tar.gz && cd packer && makepkg
sudo pacman -U packer-20150808-1-any.pkg.tar.xz
rm -rf ~/packer
Byobu
packer byobu
byobu-enable
echo 'set -g default-terminal "screen-256color"' >> ~/.byobu/profile.tmux
SSH
$ sudo -e /etc/ssh/sshd_config
Edite o arquivo para melhorar a segurança
sudo systemctl enable sshd.socket --now
ssh-keygen -t rsa -b 4096 -f ~/.ssh/servidorx -C "pubkey para servidor X"
ssh-copy-id -i ~/.ssh/servidorx.pub '-p 2345 usuario@servidorx'
chmod 700 ~/.ssh && chmod 600 ~/.ssh/servidorx && chmod 400 ~/.ssh/authorized_keys
$ nvim ~/.ssh/config
Host servidorx
HostName ssh.servidorx
IdentityFile ~/.ssh/servidorx
User usuario
Port 2345
rEFInd.conf
$ vim /boot/EFI/refind/refind.conf
menuentry Arch {
icon EFI/refind/icons/os_arch.png
loader vmlinuz-linux
initrd initramfs-linux.img
options "cryptdevice=/dev/sda4 rw root=/dev/mapper/arch-luks"
}
Internet
Sin ningún gestor
Cable
Para conectarte a la red una sola vez por DHCP:
dhcpcd enp0s20u1
Wifi
Controlador: https://aur.archlinux.org/packages/broadcom-wl/.
El controlador broadcom-wl-dkms también funciona bien.
sudo pacman -S wpa_supplicant
packer broadcom-wl
sudo wifi-menu wlp3s0
Networkd
Configuración estática. No se recomienda para portátiles, sino para servidores y sobremesas que se conectan siempre a las mismas redes.
> nvim /etc/systemd/network/enp2s2.network
[Match]
Name=enp2s2
[Network]
DHCP=yes
systemctl enable systemd-resolved --now
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl enable systemd-networkd --now
También está Netctl.
Grupos de usuarios y activación de sudo
useradd -m -g users -G wheel -s /bin/zsh julio ### Talvez audio também
passwd julio
EDITOR=nvim visudo
Descomenta la línea %wheel ALL=(ALL) ALL
Backlight:
echo "255" > /sys/class/leds/smc\:\:kbd_backlight/brightness
o
cp /sys/class/leds/smc\:\:kbd_backlight/max_brightness /sys/class/leds/smc\:\:kbd_backlight/brightness
Audio
Añade tu usuario al grupo audio: $ sudo gpasswd -a julio audio.
Arranca Pulseaudio: $ pulseaudio --start.
Controla las salidas con pavucontrol.
Activa la reproducción simultánea con paprefs.
Video
Controlador de vídeo: xf86-video-intel.
Añade tu usuario al grupo video: $ sudo gpasswd -a julio video.
X11
Teclado alemán y natural scrolling con el touchpad:
setxkbmap -layout de -model macbook79 -option caps:swapescape
$ cat ~/.Xmodmap
keycode 54 = c C c C ccedilla Ccedilla
keycode 57 = n N n N dead_tilde N dead_tilde
!Natural Scrolling
pointer = 1 2 3 5 4 7 6 8 9 10 11 12 13 14 15
Añade keyboard a los HOOKS después de autodetect en /etc/mkinitcpio.conf.
Touchpad
Añade tu usuario al grupo input: $ sudo gpasswd -a julio input.
Probé varios controladores y configuraciones. Por desgracia ninguna opción funciona tan bien como en OS X.
xf86-input-synaptics-mtpatch
Edita el archivo /etc/X11/xorg.conf.d/10-synaptics.conf:
Section "InputClass"
Identifier "touchpad_catchall"
Driver "synaptics"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Option "LeftEdge" "-3611"
Option "RightEdge" "4246"
Option "TopEdge" "517"
Option "BottomEdge" "6108"
Option "FingerLow" "25"
Option "FingerHigh" "75"
Option "FingerPress" "257"
Option "MaxTapTime" "180"
Option "MaxTapMove" "511"
Option "MaxDoubleTapTime" "180"
Option "SingleTapTimeout" "180"
Option "ClickTime" "100"
Option "FastTaps" "0"
Option "EmulateMidButtonTime" "0"
Option "EmulateTwoFingerMinZ" "283"
Option "EmulateTwoFingerMinW" "7"
Option "VertScrollDelta" "-220"
Option "HorizScrollDelta" "-220"
Option "VertEdgeScroll" "0"
Option "HorizEdgeScroll" "0"
Option "CornerCoasting" "0"
Option "VertTwoFingerScroll" "1"
Option "HorizTwoFingerScroll" "1"
Option "MinSpeed" "1.03333"
Option "MaxSpeed" "1.4"
Option "AccelFactor" "0.017"
Option "TrackstickSpeed" "40"
Option "EdgeMotionMinZ" "30"
Option "EdgeMotionMaxZ" "160"
Option "EdgeMotionMinSpeed" "1"
Option "EdgeMotionMaxSpeed" "929"
Option "EdgeMotionUseAlways" "0"
Option "TouchpadOff" "0"
Option "LockedDrags" "0"
Option "LockedDragTimeout" "5000"
Option "RTCornerButton" "0"
Option "RBCornerButton" "0"
Option "LTCornerButton" "0"
Option "LBCornerButton" "0"
Option "TapButton1" "1"
Option "TapButton2" "3"
Option "TapButton3" "2"
Option "ClickFinger1" "1"
Option "ClickFinger2" "3"
Option "ClickFinger3" "0"
Option "CircularScrolling" "0"
Option "CircScrollDelta" "0.1"
Option "CircScrollTrigger" "0"
Option "CircularPad" "0"
Option "PalmDetect" "1"
Option "PalmMinWidth" "9"
Option "PalmMinZ" "180"
Option "CoastingSpeed" "20"
Option "CoastingFriction" "50"
Option "PressureMotionMinZ" "30"
Option "PressureMotionMaxZ" "160"
Option "PressureMotionMinFactor" "1"
Option "PressureMotionMaxFactor" "1"
Option "GrabEventDevice" "1"
Option "TapAndDragGesture" "1"
Option "AreaLeftEdge" "0"
Option "AreaRightEdge" "0"
Option "AreaTopEdge" "0"
Option "AreaBottomEdge" "0"
Option "HorizHysteresis" "5"
Option "VertHysteresis" "3"
Option "ClickPad" "1"
Option "RightButtonAreaLeft" "0"
Option "RightButtonAreaRight" "0"
Option "RightButtonAreaTop" "0"
Option "RightButtonAreaBottom" "0"
Option "MiddleButtonAreaLeft" "0"
Option "MiddleButtonAreaRight" "0"
Option "MiddleButtonAreaTop" "0"
Option "MiddleButtonAreaBottom" "0"
Option "SHMConfig" "on"
EndSection
xf86-input-mtrack-git
Configuración: /etc/X11/xorg.conf.d/10-mtrack.conf
Section "InputClass"
MatchIsTouchpad "on"
Identifier "Touchpads"
Driver "mtrack"
Option "TrackpadDisable" "0"
Option "Sensitivity" "0.5"
Option "FingerHigh" "5"
Option "FingerLow" "1"
Option "IgnoreThumb" "true"
Option "IgnorePalm" "true"
Option "DisableOnThumb" "false"
Option "DisableOnPalm" "false"
Option "BottomEdge" "25"
Option "ButtonIntegrated" "true"
Option "ButtonMoveEmulate" "false"
Option "ClickFinger1" "1"
Option "ClickFinger2" "2"
Option "ClickFinger3" "3"
Option "TapButton1" "1"
Option "TapButton2" "3"
Option "TapButton3" "2"
Option "TapButton4" "0"
Option "ClickTime" "25"
Option "ScrollDistance" "75"
Option "SwipeUpButton" "8"
Option "SwipeDownButton" "9"
Option "SwipeLeftButton" "8"
Option "SwipeRightButton" "9"
EndSection
Gestos con Touchégg:
Instala touchegg, disponible en el
AUR: $ packer touchegg.
Copia el archivo de configuración:
cp -r /usr/share/touchegg/ ~/.config
Edítalo a mano:
vim ~/.config/touchegg/touchegg.conf
O con la interfaz gráfica disponible en el AUR.
xSwipe
La wiki también sugería xSwipe, pero no conseguí hacerlo funcionar. Pide activar SHMConfig, pero
creo que eso está obsoleto.
Desactivar el touchpad mientras escribes
Añade syndaemon -t -k -i 2 & al ~/.xinitrc.
Webcam
Averiguar la versión del Mac:
$ sudo dmidecode -s system-product-name
MacBookAir6,2
Suspend, Resume e Hibernate
Hibernate:
Añade resume a los HOOKS en /etc/mkinitcpio.conf:
HOOKS="base udev autodetect modconf block resume filesystems keyboard fsck"
Ejecuta mkinitcpio: # mkinitcpio -p linux
Calibrar los colores del monitor
Guarda los perfiles ICC de OS X en algún sitio accesible desde Linux:
cp -r /Library/ColorSync/Profiles /Volumes/Externo
Instala xcalib, disponible en el AUR:
packer xcalib
Copia los perfiles ICC a /usr/share/color/icc, /usr/local/share/color/icc o
/home/USER_NAME/.color/icc:
sudo cp -r /mnt/externo/Profiles /usr/share/color/icc/Profiles_Mac
Prueba la nueva configuración con este comando:
xcalib -d :0 /usr/share/color/icc/Profiles_Mac/Displays/Color\ LCD-933C106C-08BC-09AA-F750-C2A74A119DEF.icc
Si te convence, añade el comando al .xinitrc.
Seguridad
Poner contraseña de firmware
Desactivar el login por ssh como root
Edita el archivo sshd_config: $ sudo vim /etc/ssh/sshd_config PermitRootLogin no
Si quieres Grub
pacman -S grub os-prober
grub-install --recheck --debug /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
Crypttab
$ /etc/crypttab
backup UUID=d85e844d-2233-45b1-baff-a4fa32a50d6c none luks,noauto,quiet
mpdscribble
packer mpdscribble
mkdir ~/mpdscribble
cp /usr/share/mpdscribble/mpdscribble.conf.example .mpdscribble/mpdscribble.conf
nvim .mpdscribble/mpdscribble.conf
Links
- http://blog.juliobs.com/instalacao-do-arch-linux/
- http://architectlinux.boardhost.com/index.php
- http://bmccarthy.net/2014/08/02/touchegg-on-archlinux/
- http://dabase.com/blog/Macbook_Air_Early_2014_Archlinux/
- http://loicpefferkorn.net/2015/01/arch-linux-on-macbook-pro-retina-2014-with-dm-crypt-lvm-and-suspend-to-disk/
- http://ryangehrig.com/index.php/arch-linux-on-macbook-air-2013/
- http://www.frankshin.com/installing-archlinux-on-macbook-air-2013/
- http://www.frankshin.com/macbook-air-62-2013-setting-it-up-with-archlinux/
- http://www.linuxveda.com/2015/04/20/arch-linux-tutorial-manual/
- http://www.rodsbooks.com/refind/
- https://bbs.archlinux.org/viewtopic.php?id=150276
- https://bbs.archlinux.org/viewtopic.php?id=165854
- https://bbs.archlinux.org/viewtopic.php?id=165899
- https://bbs.archlinux.org/viewtopic.php?id=171883
- https://code.google.com/p/touchegg/issues/detail?id=178
- https://code.google.com/p/touchegg/issues/detail?id=203
- https://github.com/BlueDragonX/xf86-input-mtrack
- https://help.ubuntu.com/community/MacBookAir6-2/Trusty
- https://news.ycombinator.com/item?id=8904213
- https://wiki.archlinux.org/index.php/Apple_Keyboard
- https://wiki.archlinux.org/index.php/Beginners'_guide
- https://wiki.archlinux.org/index.php/ICC_Profiles
- https://wiki.archlinux.org/index.php/Installation_guide
- https://wiki.archlinux.org/index.php/MacBook
- https://wiki.archlinux.org/index.php/MacBookPro11,x
- https://wiki.archlinux.org/index.php/Touchegg
- https://www.reddit.com/r/linux/comments/2srkva/arch_linux_on_macbook_pro_retina_2014_with/
- https://kroweer.wordpress.com/2011/09/07/creating-a-custom-arch-linux-live-usb/
- http://works13.com/blog/mac/the-best-way-of-running-arch-linux-on-a-mac.htm
- https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found
- https://wiki.archlinux.org/index.php/Neovim
- https://support.apple.com/en-us/HT201255
- https://help.ubuntu.com/community/Byobu

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.
Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.
Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.
En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.
Visita mi galería para ver algunas de mis fotografías.
Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.
¡Siempre feliz de conectar! 🙂