Ubuntu Weekly Recipe

第863回そのSnapdragon X搭載PCでUbuntuを使えますか? Snapdragon X搭載PCへのUbuntu 25.04の対応状況

世の中にARMアーキテクチャのSoCであるQualcomm Snapdragon Xシリーズを搭載したWindowsマシン(Snapdragon Xシリーズに限らない言い方をするとWindows on ARM = WoAデバイス)が出回るようになって1年くらいになります。もっとも、ARMアーキテクチャのSoCを搭載したWindows PC自体はこれ以前にも登場していましたので、WoAデバイス自体が目新しいというわけではありません。

ただ、Snapdragon XベースのWoAデバイスについては以前に比べ、

  • Windows 11ではamd64(Intel/AMDの64ビット命令。x86_64とも)のエミュレーション機能が搭載された(Windows 10ではx86(同32ビット命令)のエミュレーションのみ。それ以前のWindows RTではエミュレーションなし)
  • Microsoft社の販売するSurfaceシリーズでSnapdragon Xシリーズを全面採用している(現時点では、Intel社のCPUを採用するのは法人向けのSurface Pro 11のみ)
  • 最近のトレンドであるAI PCの文脈でMicrosoft社の提唱するCopilot+ PCの要件(40 TOPS以上のNPU (Neural Processing Unit) を搭載)をいち早く満たした
  • その他の大手PCメーカーもSnapdragon Xシリーズ搭載PCを販売しており入手しやすい

という具合に、⁠Windows RTからの長い準備期間を経て)WoAデバイスの普及に向けたMicrosoft社の本気度がうかがえたり、時代的な追い風もあったりして、これまでよりも勢いがあるように感じます。

それなりな数のSnapdoragon XベースのWoAデバイスが世に出回ると「これらのデバイスでUbuntuを動かしたい」という需要も生まれ、Ubuntu 25.04のaarch64(ARM 64ビットアーキテクチャ)のデスクトップISOイメージでは、Snapdragon XベースのWoAデバイスに「対応」しています[1]。各デバイスの対応状況はLaunchpadのubuntu-conceptのBugsから見ることができます。

筆者はSnapdragon XベースのWoAデバイスにとても興味をもっており、この度、Snapdragon X Elite(X1E-80-100)を搭載した「Surface Pro ⁠第11世代⁠⁠ ⁠⁠以下、Surface Pro 11)を入手しました。……Ubuntu 25.04を動かしてみないわけにはいきません。もっとも、Surface Pro 11は本稿執筆時点で未対応というステータスです。筆者もそのことは重々承知していましたが、⁠未対応とはいえUEFIは載っているし、一部の機能が動かないだけである程度は動くのではないか」という淡い期待もありました。

結果はというと「Ubuntuの起動画面すら拝めない」という惨敗に終わる[2]のですが、⁠なぜ動かないのか」を調べたところ、⁠Snapdragon Xベースの)WoAデバイス特有の事情がありました。今回はこのあたりの事情・背景を解説し、その上で、Ubuntuを動かす前提でSnapdragon XベースのWoAデバイスを選定するならどう考えるべきかについて解説します。

ハードウェア構成を把握する方法

OSが動くにはOS自身が稼働しようとしているシステムのハードウェア構成を理解していなければなりません。

Windows on amd64(これまでの一般的なPC)の世界ではハードウェア構成の検出に、ACPI(Advanced Configuration and Power Interface)テーブルを使用することが標準となっています。ACPIは仕様が公開されているため、Ubuntu(Linux)でもACPIを利用してハードウェア構成を把握します。この結果として、amd64なPCでUbuntuを利用する場合、ユーザー側では特に何もしなくても、LinuxカーネルがACPI経由でハードウェア構成を自動的に検知してくれます。

これに対して、ARMの世界ではACPIが標準的でないため、ACPI以外の方法でデバイス構成をカーネルに伝える必要がありました。Linuxの当初のアプローチでは各種ARMマシン(ボード)に固有のハードウェア構成情報をカーネルに書き込んでいました。ただ、世の中には非常に多くの種類のARMマシン(ボード)があり、それぞれ独自のハードウェア構成があります。そのため、カーネルにハードウェア構成情報を書き込むアプローチは「世の中のSoCの数だけコードが増える」という大変つらい状況でした。

これに代わる方法としてDevice Treeという仕組みがLinux on ARMの世界で採用されることになりました。この仕組みでは、Device Treeファイル.dtbファイル)にハードウェア構成情報記載し、起動時にこのファイルをカーネルに渡すことで、システムのハードウェア構成を伝えます。こうすることで、カーネルにハードウェア構成情報をハードコードすることなく、多種多様なARMマシンでLinuxを起動させられるようになり、これが標準的な仕組みになりました。もっとも、今のところサーバー分野中心のようですがARMの世界でもACPI(とそれに必要なUEFI)を標準で実装することしようという動きがあります[3]

では、ARMアーキテクチャのSnapdragon XをベースとするWoAデバイスで、Windowsはハードウェア構成をどのように検出しているのでしょうか。答えになりそうな情報がSurface向けのLinuxカーネルを提供するプロジェクトに立てられたスレッドのなかにありました。これを読むと、Surface Pro 11ではACPIを利用できるものの、ACPIの標準仕様にないPlatform Extension Plug-ins(PEPs)が利用されている状況のようです。もちろん、Windowsの世界ではWindows 10以降でPEPsがサポートされていて、amd64なPCと同じように、ACPIを使ったデバイス構成の検出が可能です。なお、この話は後で見てみるようにSurface Pro 11に固有のものではなく、Snapdragon XベースのWoAデバイスに共通する内容と筆者は理解しています。

一方、Linuxでは(ACPIの標準仕様にないこともあり)このPEPsをサポートしていません。したがって、Ubuntuを含むLinuxでは、これまで通りDevice Treeを使って、デバイス構成情報をカーネルに伝えるというアプローチを取るのが(カーネルのPEPsサポートを頑張るよりも)簡単ということになります。

なお、ハードウェア構成の検出方法とは別に、ハードウェアを動かすためのドライバーは必要です。無事にハードウェア構成を把握できても、認識したハードウェアを動かすためのドライバーがなければそのハードウェアは動かないためです。

インストールISOイメージから状況を確認してみる

ここまでの内容を念頭に「Ubuntu 25.04がSnapdoragon XベースのWoAデバイスに対応する」とはどういうことかを確認していきます。

Ubuntu 25.04のインストールイメージをマウントして、boot/grub/grub.cfgファイルを確認してみます。すると、次のような記載があります(少々長いですがすべて抜粋します⁠⁠。

set dtb=
set cmdline=
smbios --type 1 --get-string 5 --set system_product_name
smbios --type 1 --get-string 6 --set system_product_version
smbios --type 1 --get-string 19 --set system_sku_number
regexp "ThinkPad X13s.*" "$system_product_version"
if [ $? = 0 ]; then
        cmdline="clk_ignore_unused pd_ignore_unused arm64.nopauth"
        dtb="devicetree /casper/dtbs/sc8280xp-lenovo-thinkpad-x13s.dtb"
fi
if [ "$system_product_version" == "ThinkPad T14s Gen 6" ]; then
        # Workaround for 64GB crashes on T14s
        cutmem 0x8800000000 0x8fffffffff
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e78100-lenovo-thinkpad-t14s.dtb"
fi
if [ "$system_product_version" == "Yoga Slim 7 14Q8X9" ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-lenovo-yoga-slim7x.dtb"
fi
if [ "$system_product_name" == "XPS 13 9345" ]; then
        # Workaround for 64GB crashes. Sigh...
        cutmem 0x8800000000 0x8fffffffff
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-dell-xps13-9345.dtb"
fi
if [ "$system_product_name" == "Galaxy Book4 Edge" ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-samsung-galaxy-book4-edge.dtb"
fi
if [ "$system_product_name" == "Swift SF14-11" ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1p64100-acer-swift-sf14-11.dtb"
fi
if [ "$system_product_name" == "Swift SF14-11T" ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1p64100-acer-swift-sf14-11.dtb"
fi
regexp "ASUS Vivobook S 15.*" "$system_product_name"
if [ $? == 0 ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-asus-vivobook-s15.dtb"
fi
regexp "ASUS Zenbook A14 UX3407Q.*" "$system_product_name"
if [ $? == 0 ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1p42100-asus-zenbook-a14.dtb"
fi
regexp "ASUS Zenbook A14 UX3407R.*" "$system_product_name"
if [ $? == 0 ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-asus-zenbook-a14.dtb"
fi
regexp "HP OmniBook X Laptop 14-.*" "$system_product_name"
if [ $? == 0 ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-hp-omnibook-x14.dtb"
fi
if [ "$system_sku_number" == "Surface_Laptop_7th_Edition_2036" ]; then
        # Workaround for 64GB crashes. Sigh...
        cutmem 0x8800000000 0x8fffffffff
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-microsoft-romulus13.dtb"
fi
if [ "$system_sku_number" == "Surface_Laptop_7th_Edition_2037" ]; then
        # Workaround for 64GB crashes. Sigh...
        cutmem 0x8800000000 0x8fffffffff
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-microsoft-romulus15.dtb"
fi
if [ "$system_product_name" == "CRD" ]; then
        cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
        dtb="devicetree /casper/dtbs/x1e80100-crd.dtb"
fi

menuentry "Try or Install Ubuntu" {
        set gfxpayload=keep
        linux   /casper/vmlinuz $cmdline  --- quiet splash console=tty0
        initrd  /casper/initrd
        $dtb
}

ここからわかるように、smbiosで取得した情報をもとにこれから起動しようとしているデバイスを判断し、該当するSnapdragon X搭載のデバイスであれば、それに対応する.dtbファイルを変数$dtb経由でカーネルに渡していることがわかります。すべての判定から外れる場合、$dtbは空となるため、Device Treeを使った起動は試みられず、カーネルはACPIを使ってハードウェア構成を取得しようとします。このようなDevice Treeの泥臭い打ち分けが「Ubuntu 25.04がSnapdoragon XベースのWoAデバイスに対応する」の一側面をなしています。

ちなみに、今回の検証・調査に使用したSurface Pro 11はどのif文にも引っかからず、かつ、標準的なACPIを使ったデバイス構成の検出もできません。そのためか、今回のチャレンジでもGRUBのメニュー画面まではかろうじてたどり着けたものの、そこからカーネルに制御が渡るタイミングで画面が暗転し、そのままハードウェアリセットがかかるという動きになりました。また、先程、簡単に触れましたが、Snapdragon Xを搭載するPCが一覧されているところを見ると、標準的なACPIを使ってハードウェア構成の検出ができないのはSnapdragon Xが標準的なACPIを実装・提供していないからだと考えられます。

さらにgrub.cfgの内容を細かく見ると、デバイスの判定はかなりシビア(ピンポイント)であることがわかります。わかりやすいところで挙げると、ASUS Zenbook A14という同じ名前の製品でも

  • ASUS Zenbook A14 UX3407Q系列は/casper/dtbs/x1p42100-asus-zenbook-a14.dtbとSnapdragon X Plus向けのDevice Treeを
  • ASUS Zenbook A14 UX3407R系列は/casper/dtbs/x1e80100-asus-zenbook-a14.dtbとSnapdragon X Elite向けのDevice Treeを

と、読み込ませるデバイスツリーが違っています.dtbファイル名に含まれるx1p42100はSnapdragon X Plus X1P-42-100を、同じくx1e80100はSnapdragon X Elite X1E-80-100を指すものと読み取れます[4]⁠。このことからSnapdragon Xを搭載する同一シリーズの製品でもSnapdragon X Eliteを採用するものか同Plusを採用するものかで起動する・しないが分かれるのであろうという推測が成り立ちます。

この流れで上に記載のあるHP OmniBook X Laptop 14という系列を取り上げると、このシリーズにはSnapdragon X Eliteを採用する製品と同Plusを採用する製品とがあることがわかります。一方、読み込む/casper/dtbs/x1e80100-hp-omnibook-x14.dtbはSnapdragon X Elite向けのファイルに見えます。そのため、Snapdragon X Plusを採用する構成ではたぶん動かないだろうということが想像できます。筆者は実機を持っておらず購入予定もないのですが、とても気になるところです[5]

反対に、Swift SF14-11Swift SF14-11Tのように同じSnapdragon X Plusを採用していても、読み込むべきDevice Treeが異なる/casper/dtbs/x1p64100-acer-swift-sf14-11.dtbおよび/casper/dtbs/x1p64100-acer-swift-sf14-11.dtbというパターンもあるようです。つまり、同じ会社の同じシリーズで、同じ(SKUの)SoCを採用していても、ハードウェア構成が微妙に異なるということが示唆されます。

ちなみに、Surface Pro 11と同じタイミングに出て、概ね似たような構成であろうと想像される(少なくともSoCは同じ)Surface_Laptop_7th_Edition_2036用の/casper/dtbs/x1e80100-microsoft-romulus13.dtbを読み込ませるなどしてみましたが、やはり起動しませんでした。⁠全部の機能が動かなくていいから、とにかく動かしてみたい」というのもなかなか難しいようです。

ここまで見た内容を整理すると次のようなことが言えます。

  • 「対応していない」というステータスにあるSnapdragon XベースのWoAデバイスはUbuntuの起動すらままならない
  • 「対応している」デバイスも型番レベルで厳密に判定されうるし、ちょっとでもハードウェア構成が異なると動かない可能性がある

そのため、Ubuntuを動かすためのSnapdragon XベースのWoAデバイスを入手しようとする場合には細心の注意を払うべきでしょう。つまり、その時々で最新版のUbuntuのインストールイメージに含まれるgrub.cfgを同じようにチェックし、型番レベルで対応していることが確認できるデバイスを入手するようにすべきです。あるいは、うまく動かないデバイスの実機を持っている人間としてubuntu-conceptのBugに情報提供して(その製品に対応する既存のBugがなければ新規に報告して)起動できるようにコミュニティと協力もできます(UbuntuではSnapdragon XベースのWoAデバイスへの対応はあくまでコミュニティベースで進められています⁠⁠。要するに、"ubuntu-concept"は実験的なものなので、⁠思ったように動かなくてもその状況を楽しめる」という心持ちが一番大事です。

なお、Snapdragon XベースのWoAデバイス上で直接Ubuntuを動かさなくてもよければ、Windows上で稼働する仮想マシンでUbuntuを使うという方法は考えられます。つまり、WSLでUbuntuを使う、Hyper-Vの仮想マシン上でUbuntuを使うといった方法です(どちらもSurface Pro 11で動作確認済みです)[6]

今後の展望

実はUbuntuに限らなければ、今回検証・調査に使用したSurface Pro 11上でLinuxを動かすという試みはArch Linuxをベースにしたチャレンジで一定の成果を収めているようです。説明(README)にもあるとおり、このチャレンジではSurface Pro 11用のドライバーと.dtbファイルとを用意しています。そのため、Ubuntuでもこれら(あるいはこれらに相当するもの)が取り込まれればSurface Pro 11上で動作が可能になると考えられます[7]

中長期的な展望としては、⁠amd64なPCと同じように)標準的なACPIを利用できるWoAデバイスが市場に出てくる」という展開があるとWoAデバイスでUbuntuを動かしやすくなる(Ubuntu側での対応も楽になる)ように思います。もちろん、Ubuntu(Linux)で使用するためのドライバーは変わらず必要なのですが、⁠とりあえず動かしてみる」ためのハードルはグッと下がりそうな気がします。

では、実際問題として「Windowsが動けばいいWoAデバイスで標準的なACPIへの対応がどこまで見込めるのか」と言われると、現状では筆者の「妄想」ないしは「希望」の域を出ません。とはいえ、前述のとおり、ARMの世界でもサーバーではUEFI/ACPIを実装することにしようという動きがあり、ARM社がこの動きの旗振り役です[8]。この動きがWoAデバイス(もっというと、Windowsに限らないARMベースのPC)にも広がればありえない話でもないかな、と考えます。

おすすめ記事

記事・ニュース一覧