Logo Shun Suzuki

Asahi ALARM (Arch Linux Arm) の M1 MacBook AirでUsb Type-C to HDMI アダプタ経由で外部ディスプレイを接続する

Asahi linuxの安定版は外部ディスプレイの接続に対応していない. が, 最新 (2026年6月12日現在) の開発版Kernel (fairydust) を入れると, Usb Type-C to HDMI アダプタ経由で外部ディスプレイを接続できるようになる. これはその手順を記したメモ.

⚠️ 開発版Kernelのインストールは自己責任で

事前準備

まずは, 現在のカーネルのバージョンを確認しておく.

uname -r

今回は, 6.19.14-2-1-ARCH だった.

次に, ビルド依存関係をインストールする. Rustのコンパイラはすでにインストールされている前提で, 以下のコマンドを実行する. 他にも実はあるかもしれないが, 自分の環境で足りてないのはこのあたりだった.

rustup component add rust-src
sudo pacman -S --needed bc dtc pahole rust-bindgen

ちなみに, Rustのバージョンは1.96.0だった.

カーネルのビルド

まず, 適当なディレクトリを用意する.

mkdir ~/fairydust-build && cd ~/fairydust-build

次に, 現在のカーネル設定をコピーしておく.

zcat /proc/config.gz > .config

次にPKGBUILDを以下の内容で作成する. これは, asahi-alarm/PKGBUILDsのlinux-asahi/PKGBUILD をベースに, source を fairydust のものに書き換えたもの. (RAMが少ないので念の為並列数を減らしてある)

# AArch64 Apple Silicon (Asahi Linux) - fairydust branch (USB-C DisplayPort)
# Derived from asahi-alarm/PKGBUILDs linux-asahi. Separate package so the
# stable linux-asahi kernel stays installed as a fallback.

_commit=77e0fe0c47e847221988f6397167bc23fec2a042
_basever=7.0.11
_asahirel=2
pkgrel=1

_m1n1_version=1.4.21

pkgbase=linux-asahi-fairydust
_srcname=linux-${_commit}
_kernelname=${pkgbase#linux}
_desc="AArch64 Apple Silicon (M1) - fairydust DisplayPort dev kernel"
pkgver="${_basever}.fairydust"
arch=('aarch64')
url="https://github.com/AsahiLinux/linux/tree/fairydust"
license=('GPL2')

makedepends=(
  base-devel bc dtc kmod libelf pahole cpio perl rustup rust-bindgen tar xz python
)
options=('!strip')
source=(
  ${pkgbase}-${_commit}.tar.gz::https://github.com/AsahiLinux/linux/archive/${_commit}.tar.gz
  config         # the main kernel config file (current running config)
)
sha256sums=('SKIP'
            'SKIP')

export KBUILD_BUILD_HOST=archlinux
export KBUILD_BUILD_USER=$pkgbase
export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"

prepare() {
  cd $_srcname

  echo "Setting version..."
  echo "-$_asahirel-$pkgrel" > localversion.10-pkgrel
  echo "-fairydust" > localversion.20-fairydust

  local src
  for src in "${source[@]}"; do
    src="${src%%::*}"
    src="${src##*/}"
    [[ $src = *.patch ]] || continue
    echo "Applying patch $src..."
    patch -Np1 < "../$src"
  done

  echo "Creating build directories..."
  mkdir -p build/base

  echo "Setting config (base)..."
  cp ../config build/base/.config
  make olddefconfig O=$PWD/build/base
  make -s kernelrelease O=$PWD/build/base > build/base/version

  echo "Prepared $pkgbase version $(<build/base/version)"
}

build() {
  cd $_srcname
  echo "Building base..."
  make all O=$PWD/build/base -j4
}

_package_kernel() {
  pkgdesc="The $pkgdesc kernel and modules"
  depends=(coreutils kmod initramfs "m1n1>=$_m1n1_version")
  optdepends=('linux-firmware: firmware images needed for some devices')
  provides=(WIREGUARD-MODULE)

  local kernver="$(<$O/version)"
  local modulesdir="$pkgdir/usr/lib/modules/$kernver"

  echo "Installing boot image..."
  install -Dm644 "$O"/arch/arm64/boot/Image "$modulesdir/vmlinuz"

  # Used by mkinitcpio to name the kernel
  echo "$1" | install -Dm644 /dev/stdin "$modulesdir/pkgbase"

  echo "Installing modules..."
  make O="$O" INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 modules_install

  echo "Installing device trees..."
  install -Dt "$modulesdir/dtbs" "$O"/arch/arm64/boot/dts/apple/*.dtb

  # remove build and source links
  rm -f "$modulesdir"/{source,build}
}

_package() {
  cd $_srcname
  export O="$PWD/build/base"
  _package_kernel "$pkgbase"
}

pkgname=("$pkgbase")
package_linux-asahi-fairydust() {
  _package
}

# vim:set ts=8 sts=2 sw=2 et:

で, 後はビルドする. まあまあ時間はかかる.

makepkg -f --noconfirm --skipinteg

ビルドが完了したら, ビルドしたカーネルをインストールする.

sudo pacman -U ~/fairydust-build/linux-asahi-fairydust-7.0.11.fairydust-1-aarch64.pkg.tar.xz

最後にGRUBエントリを追加する.

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

後は再起動して確認. 自動でfairydustのカーネルが選択されるはずだが, もし選択されない場合はGRUBのメニューから「Advanced options → linux-asahi-fairydust」を選択する.

ちなみに, 注意点として, 左側面にある2つのUSB-Cポートのうち, 外部ディスプレイに接続できるのは手前のポートだけのよう.

単に, 安定版のカーネルで起動したい場合は, GRUBのメニューから「Advanced options → linux-asahi」を選択すればOK.

アンインストールする場合は, 以下のコマンドを実行する.

sudo pacman -R linux-asahi-fairydust
sudo update-m1n1
sudo grub-mkconfig -o /boot/grub/grub.cfg