Arch Linux en el MacBook

may 1, 2016·
Julio Batista Silva
Julio Batista Silva
· 9 min de lectura
blog
Atención: escribo todos los tutoriales para mí mismo, según mis preferencias y

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

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

iSight.

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

Julio Batista Silva
Autores
Senior Cloud Developer

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! 🙂

comments powered by Disqus