Arch Linux no MacBook

Atenção: eu escrevo todos os tutoriais para mim mesmo de acordo com as minhas preferências e necessidades. Não siga este “tutorial” cegamente nem execute nenhum comando sem saber exatamente o que ele faz.

Fiz essa instalação em 2014 e estou postando aqui a pedidos de um membro do grupo Arch Linux Brasil no Facebook. O processo é muito parecido com o detalhado no meu tutorial de 2012, mas o MacBook requer uma atenção especial. O artigo está um pouco incompleto, mas provavelmente não irei editá-lo tão cedo.

Eu não uso mais essa configuração em dualboot, pois não achei o resultado muito satisfatório; o Wi-Fi falhava às vezes, o touchpad não funciona tão bem quanto no OS X (cheguei até a editar o código fonte dos drivers em vão), a bateria durava menos e ele estava ocupando muito espaço do meu SSD de apenas 128GB.

Agora tenho um desktop com Arch, um HD externo com vários Live CDs e algumas máquinas virtuais no OS X. Até agora essa configuração tem dado conta de tudo o que eu preciso.

Por que um Macbook?

O meu Acer, que já estava velhinho e devagar, teve outro problema na tela, portanto resolvi que estava na hora de trocar de notebook.

Eu ainda morava na Alemanha e encontrei um MacBook Air 13" sendo leiloado no Ebay. Fiz uma oferta até que baixa, mas consegui ganhar. O teclado é alemão, mas foi tranquilo para acostumar.

Apesar de fazer algumas críticas aos produtos da Apple, eu tenho que reconhecer que a qualidade do hardware é excelente, assim como a possibilidade de revenda. Também há uma possibilidade de desenvolver para iOS.

Em termos de software, o OS X até que não são decepciona. Desde que comprei, já rodei o Mavericks, o Yosemite e o El Capitan sem problemas. Muitos dos FOSS também estão disponíveis, pois o Darwin é Unix-like (e POSIX!).

Backup e Atualização do OS X

Para reduzir o risco de problemas, faça backup dos seus arquivos, libere espaço no disco e atualize o OS X.

Particionamento do disco

Divida o Macintosh HD em duas partições utilizando o Disk Utility. Usei só 23GB para o Arch, pois o SSD do meu MacBook possui apenas 128GB.

Archboot por USB

Baixe a última versão do Arch em https://www.archlinux.org/download/ e grave o .iso em um pendrive:

sudo dd if=archlinux-2014.10.01-dual.iso of=/dev/rdisk2 bs=1m

UEFI Boot Manager

Desde o kernel 3.3, é possível dar boot no Linux sem utilizar bootloaders como o GRUB devido ao EFISTUB.

Precisamos apenas de um boot manager para selecionar os diferentes sistemas operacionais.

Systemd-boot

Antes chamado gummiboot, é o boot manager mais simples e com menos recursos. Não usarei ele.

rEFInd

O rEFInd é um fork do rEFIt. Ele basicamente exibe um menu durante o boot que te permite escolher o sistema operacional a ser inicializado.

No El Capitan, é necessário executar csrutil disable em Recovery Mode antes.

Baixe a última versão disponível no site e instale com as seguintes opções:

sudo ./install.sh --alldrivers

Estou instalando na ESP, pois utilizo Whole-Disk Encryption no OS X.

diskutil list
mkdir /Volumes/ESP
sudo mount -t msdos /dev/disk0s1 /Volumes/ESP

Renomeie a pasta e o arquivo .efi caso tenha um delay de 30s durante o boot:

# mv /Volumes/ESP/EFI/refind /Volumes/ESP/EFI/BOOT
# mv /Volumes/ESP/EFI/BOOT/refind_x64.efi /Volumes/ESP/EFI/BOOT/bootx64.efi

Adicione a seguinte linha em refind.conf:

dont_scan_volumes ""

(Essa linha está comentada como #dont_scan_volumes "Recovery HD").

Instalação

Conecte o pendrive a uma porta USB e reinicie o computador. Um dos ícones no rEFInd deverá dar boot pelo pendrive. Aqui é exibido Boot Legacy OS from FAT volume.

O Wi-Fi não funcionará, portanto tenha um adaptador USB-Ethernet ou coloque o driver broadcom-wl-dkms no pendrive.

Siga a instalação normalmente, mas não instale nenhum bootloader. Minha instalação, com um disco criptografado é mais ou menos o seguinte:

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

Se quiser uma 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

Vários programas usam diretórios e variáveis de ambiente padrões. Os seguintes comandos criam esses diretórios:

$ 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

O que eu faço é colocar essas variáveis em /etc/profile e ~/.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

Sem nenhum gerenciador

Cabo

Para conectar apenas uma vez à rede por DHCP:

dhcpcd enp0s20u1

Wifi

Driver: https://aur.archlinux.org/packages/broadcom-wl/.

O driver broadcom-wl-dkms também funciona bem.

sudo pacman -S wpa_supplicant
packer broadcom-wl
sudo wifi-menu wlp3s0

Networkd

Configuração estática. Não é recomendado para notebooks, mas sim para servidores e desktops que se conectam sempre às mesmas 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

Existe também o Netctl.

Grupos de usuários e ativação do sudo

useradd -m -g users -G wheel -s /bin/zsh julio ### Talvez audio também
passwd julio
EDITOR=nvim visudo

Descomente a linha %wheel ALL=(ALL) ALL

Backlight:

echo "255" > /sys/class/leds/smc\:\:kbd_backlight/brightness

ou

cp /sys/class/leds/smc\:\:kbd_backlight/max_brightness /sys/class/leds/smc\:\:kbd_backlight/brightness

Audio

Adicione seu usuário ao grupo audio: $ sudo gpasswd -a julio audio.

Inicie o Pulseaudio: $ pulseaudio --start.

Controle as saídas pelo pavucontrol.

Ative execução simultânea pelo paprefs.

Video

Driver de vídeo: xf86-video-intel.

Adicione seu usuário ao grupo video: $ sudo gpasswd -a julio video.

X11

Teclado alemão e natural scrolling com o 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

Adicione keyboard aos HOOKS após autodetect em /etc/mkinitcpio.conf.

Touchpad

Adicione seu usuário ao grupo input: $ sudo gpasswd -a julio input.

Eu testei várias drivers e configurações diferentes. Infelizmente nenhuma opção funciona tão bem quanto no OS X.

xf86-input-synaptics-mtpatch

Edite o arquivo /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

Configurações: /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 com o Touchégg:

Instale o touchegg disponível no AUR: $ packer touchegg.

Copie o arquivo de configuração:

cp -r /usr/share/touchegg/ ~/.config

Edite-o manualmente:

vim ~/.config/touchegg/touchegg.conf

Ou com a GUI disponível no AUR.

xSwipe

A wiki também sugeriu o xSwipe, mas eu não consegui fazer ele funcionar. Ele pede para ativar o SHMConfig, mas acho que isso é deprecated.

Desativar o touchpad enquanto digita

Adicione syndaemon -t -k -i 2 & ao ~/.xinitrc.

Webcam

iSight.

Descobrir versão do Mac:

$ sudo dmidecode -s system-product-name
MacBookAir6,2

Suspend, Resume e Hibernate

Hibernate:

Adicione resume aos HOOKS em /etc/mkinitcpio.conf:

HOOKS="base udev autodetect modconf block resume filesystems keyboard fsck"

Rode o mkinitcpio: # mkinitcpio -p linux

Calibrar cores do monitor

Salve os ICC Profiles do OS X em algum lugar que possa ser acessado pelo Linux:

cp -r /Library/ColorSync/Profiles /Volumes/Externo

Instale o xcalib diponível no AUR:

packer xcalib

Copie os ICC Profiles para /usr/share/color/icc, /usr/local/share/color/icc ou /home/USER_NAME/.color/icc:

sudo cp -r /mnt/externo/Profiles /usr/share/color/icc/Profiles_Mac

Teste a nova configuração com o seguinte comando:

xcalib -d :0 /usr/share/color/icc/Profiles_Mac/Displays/Color\ LCD-933C106C-08BC-09AA-F750-C2A74A119DEF.icc

Se ficou bom, adicione o comando ao .xinitrc.

Segurança

Adicionar senha de firmware

Desativar login por ssh como root

Edite o arquivo sshd_config: $ sudo vim /etc/ssh/sshd_config PermitRootLogin no

Se quiser o 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
Julio Batista Silva
Engenheiro de Dados

Eu sou um engenheiro de computação apaixonado por ciência, tecnologia, fotografia e idiomas. Atualmente trabalhando como Engenheiro de Dados na Alemanha.

comments powered by Disqus