Arch Linux na Macbooku Pro Late 2013 (11,3)

Posted on Thu 25 May 2023 in Hardware, Linux, Macbook • 5 min read

Instalacja wg poniższych poradników:

https://wiki.archlinux.org/title/MacBookPro11,x

oraz z pomocą oficjalnego przewodnika:

https://wiki.archlinux.org/title/Installation_guide

Używałem również następującego obrazka ale ostrzegam, to jest dość stara instrukcja i nowicjusz, jak ja, może się przez nią zagubić.

image1

Przy pierwszej próbie popełniłem błąd tworząc partycję EFI podczas gdy po instalacji macOS-a taka partycja już istniała. W efekcie nic nie działało, a mnie się grzebać nie chciało i zaczałem wszystko od nowa.

Na razie bootowanie jest za pomocą refinda ale chyba z niego zrezygnuję tylko wczytam się w dokumentację i zrobię porządny konfig bezpośrednio w

Karta graficzna (ma być tylko Intel, a NVidia wyłączona z prądu)

Macbook Pro ma 2 karty graficzne: dyskretną, mocną NVidii i słabą, intelowską. macOS radzi sobie doskonale z przełączaniem pomiędzy nimi, zależnie od potrzeby. W Linuksie nie ma łatwo. A robię to po to aby oszczędzać energię (i baterię), na Intelu laptop żre mniej energii i dłużej działa. Proste.

Są trzy sposoby.
Pierwszy polega na patchu dodanym do źródeł GRUB-a i zianstalowaniu takiej przerobionej wersji. Potem należy dodać do opcji startowych kernela dodać wpis "apple_set_os".

Tutaj opis: https://wiki.archlinux.org/title/MacBookPro11,x#Getting_the_integrated_intel_card_to_work_on_11,3

Można też pobrać spreparowany loader dla refinda i startować Archa z jego pomocą. Tutaj link: https://github.com/0xbb/apple_set_os.efi

Sprawdzenie, która karty są w systemie:

lspci -vnnn | perl -lne 'print if /^\d+\:.+(\[\S+\:\S+\])/' | grep VGA

W przypadku Nvidii zwraca to:

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107M [GeForce GT 750M Mac Edition] [10de:0fe9] (rev a1) (prog-if 00 [VGA controller])

W przypadku Intela to:

00:02.0 VGA compatible controller [0300]: Intel Corporation Crystal Well Integrated Graphics Controller [8086:0d26] (rev 08) (prog-if 00 [VGA controller])

Na początek, po paru próbach, w końcu skopiowałem odpowiedni obraz efi (https://github.com/0xbb/apple_set_os.efi) i zainstalowałem Gruba.

Instalacja GRUB: https://wiki.archlinux.org/title/Mac#Using_the_native_Apple_boot_loader_with_GRUB

sudo su -
pacman -S grub
pacman -S efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=DUPA

DUPA to nazwa katalogu, który pojawi się w /boot i jednocześnie ID wpisu. Potem jeszcze trzeba wyprodukować konfigurację Gruba ale najpierw dopisać do pliku: /etc/grub.d/40_custom następującą zawartość:

search --no-floppy --set=root --label EFI
chainloader (${root})/EFI/custom/apple_set_os.efi
boot

Teraz tworzę konfig:

grub-mkconfig -o /boot/grub/grub.cfg

Po zbootowaniu, używam narzędzia gpu-switch (https://github.com/0xbb/gpu-switch) aby włączyć grafikę Intela:

gpu-switch -i

Robię reboot i sprawdzam, która karta jest aktywna:

cat /sys/kernel/debug/vgaswitcheroo/switch

Output wygląda podobnie:

0:DIS-Audio: :DynOff:0000:01:00.1
1:IGD:+:Pwr:0000:00:02.0
2:DIS: :Pwr:0000:01:00.0

Onacza to, że aktywna jest grafika intelowska ale NVidia nadal jest zasilana, a to mi się nie podoba. Należy ją wyłączyć następującym poleceniem:

echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

Po ponownym sprawdzeniu cat-em mam to o co chodziło:

0:DIS-Audio: :DynOff:0000:01:00.1
1:IGD:+:Pwr:0000:00:02.0
2:DIS: :Off:0000:01:00.0
Karta o indeksie 2 (czyli NVidia) jest wyłączona.

WiFi

Pierwszą rzeczą, która nie działała po instalce była karta WiFi.

pacman -S networkmanager

Ciche bootowanie

Wyciszenie dzwieku przy bootowaniu, koniecznie jako root:

chattr -i /sys/firmware/efi/efivars/SystemAudioVolume-7c436110-ab2a-4bbb-a880-fe41995c9f82

printf "\x07\x00\x00\x00\x00" > /sys/firmware/efi/efivars/SystemAudioVolume-7c436110-ab2a-4bbb-a880-fe41995c9f82

https://gist.github.com/0xbb/ae298e2798e1c06d0753

Zapamiętanie hasła (Nextcloud i inne programy)

W przypadku uruchamiania Nextcloud z automatu potrzebny jest jakis "zasobnik" na hasla, w moim przypadku keyring z Gnome:
sudo pacman -S libgnome-keyring
sudo pacman -S gnome-keyring
Potem przed odpaleniem klienta Nextcloud nalezy wywolac:
dbus-update-activation-environment --systemd DISPLAY
U mnie jest to w pliku startowym ~/bin/xmonad-startup.sh, ktory jest wywolywany z .xinitrc

Xorg

Informacje ogólne

Do wyłapywania kodów klawiatury znakomicie nadaje się program xev, używam go tak:

xev | sed -n 's/^.*keycode *\([0-9]\+\).*$/keycode \1 = /p'

W oknie które się pojawi wystarczy wciskać klawisze lub ich kombinacje, a w konsoli pojawiają się odpowiadające im kody.

Display manager

Display managerem przestal byc SDDM, a zastapil go ly https://github.com/fairyglade/ly:
yay -S ly
Wazne! .xinitrc musi byc plikiem wykonywalnym

Klawiatura

Układ klawiatury X'ów zapisałem w .Xmodmap, który wczytuję w .xinitrc, linia:

xmodmap ~/.Xmodmap

zawartość .Xmodmap to:

# Rewers myszy
pointer = 1 2 3 5 4 7 6 8 9 10 11 12
# Klawisze ciemniej / jasniej
keycode 232 = XF86KbdBrightnessDown
keycode 233 = XF86KbdBrightnessUp
# Poswietlenie klawiatury F5 i F6 z Shiftem
keycode 237 = XF86KbdBrightnessDown
keycode 238 = XF86KbdBrightnessUp
# Cisza / Ciszej / Glosniej F10/F11/F12
keycode 121 = XF86AudioMute
keycode 122 = XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume

następnie remapuję klawisze, np. żeby zamiast prawego Super mieć Alt do polskich liter, w .xinitrc:

/home/paczor/bin/klawisz_pl.sh

zawartość klawisz_pl.sh:

setxkbmap -model apple -layout pl -option caps:none
#/usr/bin/xmodmap -e 'remove mod4 = Super_R'
/usr/bin/xmodmap -e 'keycode 134 ='
/usr/bin/xmodmap -e 'keycode  94 = grave asciitilde grave asciitilde'
/usr/bin/xmodmap -e 'keycode 134 = ISO_Level3_Shift'
/usr/bin/xmodmap -e 'clear mod4'
#/usr/bin/xmodmap -e 'keycode 135 ='
#/usr/bin/xmodmap -e 'keycode 135 = ISO_Level3_Shift'

Mam więc zamapowany lewe Jabłko (lewy Cmd) jako klawisz Super, prawe Jabłko jako prawy Alt, klawisze funkcyjne działają normalnie, a ich funkcje specjalne osiągalne są gdy trzymam wciśnięty Fn.

Screensaver

W pliku ~/.config/systemd/user/xscreensaver.service mam unit dla systemd do odpalania xscreensavera, jego zawartość:

[Unit]
Description=XScreenSaver Daemon
[Service]
ExecStart=/usr/bin/xscreensaver --no-splash
[Install]
WantedBy=default.target

Włączam go przez:

systemctl --user enable xscreesaver.service

W ~/.xmonad/xmonad.hs mam linię mapującą Super+F12 na włączenie blokady ekranu, wygląda to tak:

, ((mod4Mask, 0xffc9), spawn "xscreensaver-command -lock")

Jak dodawać własne serwisy do systemd, tutaj: https://wiki.archlinux.org/title/Systemd/User.

Wiatraki

Laptop był/jest głośny, wiatraki kręcą się niemal cały czas na dużych obrotach chociaż load sytemu waha się wokół 10%, a temperatura CPU rzadko przekracza 70 st. Ej? To jest laptop, on tak może długo, nawet jeśli ma już ponad 8 lat (w 2022 r.). Powinien być cichy.

Zainstalowałem macfand-git, włączyłem ale wiatraki nadal szalały i zdarzało się pełne wyłączenie i włączenie - taki chwilowy suspend do RAM. Wyłączyłem.

Zainstalowałem mbfan-git

yay -S mbfan-git

I jest ciszej ale co kilka sekund wiatraki wchodzą na obroty, wnerwiające. Temperatura skoczyła do ponad 83 st.!

Hibernacja

Przed przejściem do stanu hibernacji dane z pamięci RAM powinny zostać gdzieś zapisane aby mogły być wczytane wraz z powrotem do stanu życia. U mnie jest to partycja swap.

Kernel musi "wiedzieć" gdzie szukać tych danych więc należy wskazać mu ww partycję. W przypadku używania GRUB-a polega to na edycji pliku /etc/default/grup i dodaniu wskazówki w linii:

GRUP_CMDLINE_LINUX_DEFAULT=""

ale wcześniej muszę znać UUID moje partycji swap, czyli:

sudo blkid -o full /dev/nvme0n1p4
/dev/nvme0n1p4: UUID="2004ae52-7d11-41a0-876d-4f3fa35ca2c4" TYPE="swap" PARTUUID="7853967f-c3fa-4183-9f9c-8d3fd9cee41f"

czyli linia ma wyglądać tak:

GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=2004ae52-7d11-41a0-876d-4f3fa35ca2c4"

Następnie generuję konfig dla GRUB-a:

grub-mkconfig -o /boot/grub/grub.cfg

Pozostało jeszcze skonfigurować initramfs. W pliku /etc/mkinitcpio.conf dopisujemy hook o nazwie resume, przykładowa linia powinna wyglądać podobnie:

HOOKS=(base udev autodetect keyboard modconf block filesystems resume fsck)

I generujemy nowy initramfs:

mkinitcpio -P

Wprowadzone zmiany oczywiście zadziałają dopiero po restarcie.

Warto zajrzeć do plików znajdujących się w /sys/power oraz poczytać jak kernel zarządza energią:

https://docs.kernel.org/admin-guide/pm/sleep-states.html?highlight=image_size#basic-sysfs-interfaces-for-system-suspend-and-hibernation

Przy konfiguracji posługiwałem się tym linkiem: https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate