ottijp blog

MacBook Pro (13-inch, 2017) にArch Linuxを入れたときに引っかかったこと

もうmacOSを動かすには老朽化してしまったMacBook ProにArch Linuxを入れてみました.

基本的にはインストールガイド一般的な推奨事項を見ながらインストールしたのですが,引っかかった部分があったのでメモしておきます.

とりあえずコンソールが使えるところまでで,xorgなどはまた別で記事書きます(書かないかも).

環境

  • MacBook Pro: 13-inch, 2017, Thunderbolt 3ポートx2 (A1708, MacBookPro14,1)
  • Arch Linux
  • Linux Kernel: 6.16.6-arch1-1

reboot後にネットワークに繋がるようにしておく

インストールメディアでインストールしてrebootする前までに,iwdパッケージをインストールしておくとよいです. このパッケージはインストールガイドの方法では入らないので,reboot後にネットワークに繋がらず,繋がらないのでpacmanでインストールもできなくなりました.(再度インストールメディアで起動してインストールした.)

(chrootした後で)
pacman -S iwd

また,DHPCが自動で有効になるように,インストールメディアのものをコピーしました.

(chrootする前に)
cp /etc/systemd/network/* /mnt/systemd/network/*

さらに/etc/resolve.confを作りました.(覚えていないのですが,もしかしたらsystemctl enable systemd-resolvedもしたかも.)

(reboot後に)
ln -sf /run/systemd/resolve/stub-resolve.conf /etc/resolve.conf

解像度が正しくセットされるようにする

MacBook Proの実際の解像度とOSが認識している解像度が違い,コンソールの下部何行が見えない状態でした. とりあえずはstty rows 50 cols 150などとすることで回避できます.

(ちょっと思い出せないのですが,以下の作業前にpacman -S fbsetでfbsetをインストールしたかもしれません.)

根本解決方法は,まず/etc/fb.modesにモードを追加します.

/etc/fb.modes
mode "macbookpro13"
    geometry 2560 1600 2560 1600 32
    timings 0 0 0 0 0 0 0
endmode

その後sudo fbset macbookpro13で正常化することを確認したので,/etc/systemd/system/screen-resolution.serviceを作成してサービスを有効化しました.

/etc/systemd/system/screen-resolution.service
[Unit]
Description=Screen resolution.
After=systemd-udev-settle.service

[Service]
Type=oneshot
ExecStart=fbset macbookpro13

[Install]
WantedBy=multi-user.target

これで再起動後も解像度が正しく認識するようになりました.

cf. [SOLVED] Macbook Pro 13,1 - Wrong Resolution in TTY / Newbie Corner / Arch Linux Forums

GRUBの文字を大きくする

これも解像度に関する問題で,GRUBの画面がHiDPIを認識できていないのか,非常に小さい文字で表示されていました. これについては,GRUB用のビットマップフォントを作成して,それを使うことで対応しました.

cf. HiDPI - ArchWiki

私の場合はnoto-fontsパッケージをインストールし,grub-mkfontでサイズ36のフォントを作成し,それを/etc/default/grubに記載してGRUB設定を更新しました.

$ file /boot/grub/fonts/NotoSansMono-Regular36.pf2
/boot/grub/fonts/NotoSansMono-Regular36.pf2: GRUB2 font "Noto Sans Mono Regular 36"
$ grep GRUB_FONT /etc/default/grub
GRUB_FONT=/boot/grub/fonts/NotoSansMono-Regular36.pf2

ちなみにGRUBのコンソールでvideoinfoを実行するとフレームバッファが2880 x 1800 x 32になっているように見えましたが,これはそのままでも大丈夫でした. また,grub-mkfont実行時にWARNING: unsupported font feature parameters: 460といったワーニングが出ましたが,これも無視して特に問題はありませんでした

NTPを同期させる

インストール後,なぜかNTPが同期していませんでした. sudo timedatectl set-ntp trueを実行することで同期するようになりました.

initramでキーボード入力ができるようにする

LUKSでディスク暗号化をしたのですが,起動時にinitramでパスワードを入力する画面でキーボード入力が効かず,パスワード入力ができませんでした. これに対して,/etc/mkinitcpio.confを以下のように変更してinitfamfsを再作成することで治りました.

$ cat /etc/mkinitcpio.conf | grep -v "^#"
MODULES=(mac_hid applespi spi_pxa2xx_platform intel_lpss_pci)

BINARIES=()

FILES=()

HOOKS=(base udev modconf keyboard keymap autodetect microcode kms consolefont block encrypt filesystems fsck)

$ mkinitcpio -P

サスペンドからの復帰が早くなるようにする

systemctl suspendなどでサスペンドはできるのですがが,復帰がものすごく遅かったです(1-2分?). さらに,遅いだけでなく,復帰後にストレージ(NVMe)の認識がおかしくなっているようで(?)ディスクアクセスができなくなりました.

これについては調査してまとめてくれている方がいます.

cf. MacBook Pro 2017でLinuxを使う場合のSuspend/Resumeの設定について | mbp2017-linux-note

私の場合はd3cold_allowedの対応だけで復帰は10秒くらいになったので,カーネルパラメタはいじりませんでした. /usr/local/lib/systemd/system-sleep/disable-d3coldを作って/usr/lib/systemd/system-sleepとしてシンボリックリンクを作りました.

$ cat /usr/local/lib/systemd/system-sleep/disable-d3cold
#!/usr/bin/bash

# disable d3 cold sleep for PCI devices

case $1 in
  pre)
    for f in $(find /sys/devices -name d3cold_allowed); do
      echo 0 > "$f"
    done
    for device in \
      0000:01:00.0 \
      0000:1c:00.0 \
      0000:05:00.0 \
      0000:05:01.0 \
      0000:05:02.0 \
      0000:06:00.0
    do
      if [ -e /sys/bus/pci/devices/$device/d3cold_allowed ]; then
        echo 0 > /sys/bus/pci/devices/$device/d3cold_allowed
      fi
    done
    ;;
  post)
    ;;
esac

$ ls -ld /usr/lib/systemd/system-sleep/disable-d3cold
lrwxrwxrwx 1 root root 50 Sep 15 14:24 /usr/lib/systemd/system-sleep/disable-d3cold -> /usr/local/lib/systemd/system-sleep/disable-d3cold*

ただし,これでも復帰後にwifiが繋がらなくなる問題があり,あとで調査しようと思っています.

2025-10-22 追記

こちらに続編を書きました.

その他

キーボードレートの変更

コンソールでのキーボードレートはxorgとは別に設定が必要で,サービスを作成しました.

/etc/systemd/system/kbdrate.service
[Unit]
Description=Keyboard repeat rate in tty.

[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/bin/kbdrate --silent --delay 250 --rate 50

[Install]
WantedBy=multi-user.target

Ctrl/CapsLockの入れ替え

※ こちらは後にxremapに代えたので,この記事も参照してください.

これも,コンソール用に設定が必要でした.

これは/usr/share/kdb/keymaps/i386/qwerty/us.map.gzをコピーして/usr/share/kdb/keymaps/personal.map.gzを作成し,/etc/vconsoleを変更することで変更できました.

diff -u <(zcat /usr/share/kbd/keymaps/i386/qwerty/us.map.gz) <(zcat /usr/share/kbd/keymaps/personal.map.gz)
--- /proc/self/fd/11    2025-09-20 22:24:03.784730701 +0900
+++ /proc/self/fd/12    2025-09-20 22:24:03.786730730 +0900
@@ -31,7 +31,7 @@
 keycode  27 = bracketright     braceright       asciitilde       Control_bracketright
 keycode  28 = Return
        alt     keycode  28 = Meta_Control_m
-keycode  29 = Control
+keycode  29 = Caps_Lock
 keycode  39 = semicolon        colon
 keycode  40 = apostrophe       quotedbl
        control keycode  40 = Control_g
@@ -49,6 +49,6 @@
 keycode  56 = Alt
 keycode  57 = space
        control keycode  57 = nul
-keycode  58 = Caps_Lock
+keycode  58 = Control
 keycode  86 = less             greater          bar
 keycode  97 = Control
/etc/vconsole.conf
KEYMAP=personal

© 2025, ottijp