Blog do Julio

Hacks, tutoriais e dicas

Arch Linux No MacBook

| Comments

Atenção: Como deixei claro no about deste blog, 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 wifi 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 wifi 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 -s /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
  VM: 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

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

Links:

Comments