思ってることってこんなもんだよ
Dell XPS 13 2-in-1にUbuntu 18.04をインストールする方法

【追記: 2019/11/09】 結局Ubuntu 18.04は安定せず、Arch Linuxを入れたら安定しました。下記の内容は参考程度という感じで読んでください。

macがCPUにIntelを採用したのが2006年。その初代Intel MacだったMacbook Proを確かモリモリで40万円以上で買って以来、最近までずっとMacbook(Pro, Air)を使ってきたけど、2018年末にPixelbookを使うようになって、すっかりMacbookから離れてLinux上で開発をするようになりました。約10ヶ月ChromeOSに搭載されたCrostiniというLinuxコンテナ内のDebianを使って開発をしてきて、実は僕はMacbookは必要なかったんじゃないか、と思うようになりました。

しばらくは、Crostini内のDebianでの開発は「こりゃいいや!」とウキウキで使っていました。DockerもOK、Visual Source CodeもOK、IntelliJ IDEAもOK、GimpもOK、その他いろいろとOKな環境に満足していました。ただ、やはりコンテナ内での動作です。IntelliJ IDEAでJavaコードを書いているときなどは、どうしても「もっさり感」満載な動作パフォーマンスとなってしまいます。JavaやTypeScriptなど型のある言語では、IDEが提示してくる補完候補から選択してコーディングしていくスタイルがメインになりますが、この補完候補がなかなか出てこないくらいのもっさり感だったために、徐々にストレスが溜まってきてしまいました。

結局のところ、僕が求めていた環境、それは「快適なUNIXデスクトップ環境」だったことに気が付きました。それがちょっと前まではMacbook Proだったわけですが、例えばUbuntu 18.04などのLinuxディストリビューションが何か快適に動作するノートPCで、しかもMacbook Proのスペックを超えるものがあれば、それに乗り換えようかな、と考えていました。

DellのXPS 13が海外ではUbuntuを搭載してDeveloper Editionとして発売されていることは知っていましたが、XPS 13 2-in-1 7390というモデルは、メモリがなんと32GB搭載していて、大きさは13インチ相当、そして重さも約1.3kgという感じ。Ubuntuを搭載しているモデルという安心感もあり、スペックも申し分ないということで、10年以上ぶりのWindows機を購入することを決断しました。

New XPS 13 2-in-1 プラチナ(UHD+・大容量メモリー&SSD・ ブラック)

最初はArch Linuxを入れてみようと思ってチャレンジするも、どうやってもGRUBからArch Linuxが起動せず。たぶんこれはArch Linuxのインストールに慣れていないせいで何か手順を飛ばしているか間違った結果かなとは思っているのですが、さすがに厳しそうだなと思って断念。その後、Windows 10にVMWare Workstationを入れて仮想環境でUbuntuでも実はスペック的にいけるんじゃないか、と思って試してみるも、快適なパフォーマンスとはお世辞にも言えず、さらにCPUファンがブン回りっぱなしで、熱暴走なのかわかりませんがWindowsもろともフリーズすること1日に数回。ちょっとこれでは使用に耐えません。

一瞬「もうWindows上ですべて構築するかな」とも思いましたが、高い買い物をしたこともあり、やはり当初の目論見通り「快適なUNIXデスクトップ環境」にすべく、再度Ubuntuのインストールにチャレンジしました。幸いなことに、今日、快適な環境となりました。購入して本当に良かった、と痛感しています。

将来の自分が工場出荷時に戻したあとに再度Ubuntuインストールを試すときに、そして同じようにUNIX環境を夢見てXPS 13 7390を購入した方々のために、手順をこのエントリに残しておきたいと思います。

ちなみに、先人の知恵を借りるべく、かなり調べまくりました。貴重な情報をシェアしていただいた方々には、感謝しかありません。特に、以下のブログエントリは本当に参考になりました。

Technically, technophobic.

Ubuntu向けのパーティション作成

最初にやることは、Ubuntuをインストールする場所、つまりパーティションを確保することです。念の為、事前にCドライブをデフラグしておきます。

その後、プリインストールされているWindows 10を起動して、Windows管理ツール内にある「コンピュータの管理」を起動します。左のメニューの中に「記憶域 -> ディスクの管理」があるので、それをクリックします。

Cドライブに割り当てられているパーティションの大きさがガッツリ確保されているはずですので、これを縮小してUbuntuのパーティションを確保します。僕が買ったモデルは1TBだったので、Windows側の元のパーティションを500GBほどに縮小して、Ubuntu向けに400GB程度確保しました。

Ubuntuのインストール時にパーティションを作っても良かったのですが、この時点でUbuntu向けのパーティションを作ってしまいました。フォーマットはNTFSとし、識別できるようにボリュームラベルを適当に付けておきました。

ディスク暗号化の解除

次に、ディスクの暗号化を解除します。スタートボタンから「設定」をクリックして、「ディスクの暗号化」を選択します。そこから「オフにする」ボタンを押すことで、暗号化が解除されるはずです。もしかしたらWindows Proの場合はBitLockerによって保護されている状態かもしれませんが、その場合はBitLockerの設定を解除します。

再起動とBIOSの設定変更

ここでWindowsからは離れます。スタートメニューから再起動を選択します。再起動後にDellのロゴが表示されますが、その直後にF12キーを連打します。これにより、BIOS画面に入るはずです。

BIOSの設定変更は、2箇所です。まず、Secure Bootを無効にします。「BIOS Setup」から「Secure Boot」に入り、「Enable Secure Boot」をOFFにします。

次に、RAIDからAHCIに変更します。「BIOS Setup」から「System Configuration」に入り、「SATA Operation」をRAIDからAHCIに変更します。

上記の設定変更後、XPS 13に以下の2つを差し込みます。

  • Ubuntuのインストールメディア(iso)が書き込まれたUSBメモリ。
  • 有線LANに接続するためのLANアダプタ。

実は、Ubuntu 18.04のインストールメディアでは、WiFiに接続することができません。インストールの途中で各種パッケージを最新にアップデートすることや、インストール後にWiFiに接続するために必要となるファイルのビルドや依存パッケージのインストールなどが必要となることもあり、インストール時点では有線LANが必要となります。

下にある「Apply changes」をクリックし、その後「Exit」を押して再起動します。

Ubuntuインストーラの起動

再起動後、Dellのロゴが表示されたら、再度F12キーを連打してBIOS設定画面に入ります。USBメモリがうまく認識されていれば、BIOS画面の左にそのUSBメモリのBoot可能な領域が表示されているはずです。そこをクリックすることで、USBメモリ内のUbuntuを起動するブートローダーが実行されます。

ここで通常通りUbuntuを起動しても、途中で止まってしまいます。正常に起動させるためには、カーネルオプションを変更する必要があります。

XPS 13 2-in-1 (7390)にUbuntu 18.04を入れる - 今日のひとこと

まず、2行目の「Install Ubuntu」を選択します。そして、Enterキーを押して通常起動させる代わりに、ここで「e」キーを押します。これにより、Ubuntu起動時の設定を変更することができます。これはエディタになっているので、カーソルキーでカーソルを移動させて、文字入力や文字削除を行うことが可能です。具体的には、 nopic をカーネルパラメータとして指定する必要があります。 linux の行の最後の方に、以下のような場所があります。

linux /casper/vmlinuz file=... boot=casper quiet splash ---

この quiet splash のあとに、 nopic を追加します。

linux /casper/vmlinuz file=... boot=casper quiet splash nopic ---

その後、F10キーを押すことで、追加したパラメータを使ってUbuntuのインストーラが正常に起動します。

Ubuntuのインストール

Ubuntuのインストール自体は、普通に行っていけば良いです。有線LANでネットワークも使えている状態ですし、パッケージのアップデートも含めて、問題なくインストールを完了させることができるかと思います。僕がインストールした際には、以下のようにしました。

  • Windows側で作ったNTFSパーティションに対してUbuntuをインストールした。この際、ext4としてフォーマット。ブートローダーのインストール先として、具体的なパーティションではなく、SSD自体(/dev/nvme0n1)を選択した。
  • パッケージは最小構成とし、インストール中のアップデートをON、サードパーティ製ソフトウェアのインストールもONにした。

あとはインストールが終わるのを待ちます。特に何もなく、普通にインストールは終わって、再起動されるかと思います。特に抜かなくても支障はないですが、ここでインストールメディアのUSBメモリは抜いてしまって大丈夫です。

再度オプション指定でUbuntu起動

めでたくUbuntuがSSDにインストールされました。再起動後に、Ubuntuのブートローダーが実行されます。ここで条件反射的にENTERキーを押してUbuntuを起動しようとすると、残念ながらUbuntuの起動は途中で止まってしまいます。インストールされたカーネルにおいても、 nopic を指定した状態で起動する必要があるのです。

インストーラを起動したときと同様に、「e」キーを押します。そこで、 quiet splash と書かれた部分がありますので、その後に nopic を追加して、F10キーを押してください。無事、インストールしたUbuntuが起動します。

WiFiを使えるようにする

ここまで有線LANを使ってきましたが、WiFiを使えるようにします。そのために、以下のブログエントリが参考になりました。

XPS 13 2-in-1 (7390)にUbuntu 18.04を入れる - 今日のひとこと

WiFiを使えるようにするために、コードのmakeが必要となります。そのため、build-essentialパッケージグループのインストールが必要になります。

具体的には、以下のコマンドを実行します。

$ sudo apt install build-essential git
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
$ cd backport-iwlwifi
$ make defconfig-iwlwifi-public
$ make -j4
$ sudo make install
$ cd ../linux-firmware
$ sudo cp iwlwifi-* /lib/firmware/

あとは再起動すれば、WiFiが使えるようになっているはずです。もちろん、再起動時に nopic オプションの付与を忘れずに。有線LANがもう必要なければ、USBのLANアダプタは取り外して構いません。

Linuxカーネルの再構築

さて、WiFiも使えるようになり、Ubuntu 18.04がXPS 13 7390にて動き始めました。しかし、この時点でのUbuntuの動作に違和感を感じるはずです。GPUが効いてなさそう(YouTubeを見ると映像がカクカク)ですし、PCのフタを閉めても液晶が消えずについたままです。音量は調整できますが、画面の明暗を切り替えられずに常に最も明るい状態です。キーボードのバックライトも調整できません。明らかに、いろいろとうまくいってません。

これは、適切なデバイスドライバが入っていないというか、不十分な状態でなんとかUbuntuが動作している、ということなのかなと想像してます。僕が確認したときは、カーネルのバージョンは5.0でした。このカーネルのバージョンを上げることで、デバイスドライバも新しいものが入りますので、動作が改善することが期待できます。これは、以下のブログエントリにて気がつくことができました。

Ubuntu 18.04で最新カーネルをビルドして使う - 今日のひとこと

このブログエントリでは、Ubuntu起動時に現状必要となっている nopic がなくても大丈夫なようにするパッチも適用したカーネルソースのGitHubリポジトリも公開してくれています。本当にありがたいです。そのカーネルソースから、パッチ適用済みのバージョン5.3.6の構築を行います。

以下のコマンドを実行します。

$ sudo apt install kernel-package
$ sudo apt install ccache fakeroot libncurse5-dev

ここで、「Software & Updates」を起動して、「Source code」にチェックを入れます。引き続き、以下のコマンドを実行します。

$ sudo apt build-dep linux
$ git clone https://github.com/marevol/linux-5.3-xps_13_2in1.git
$ cd linux-5.3-xps_13_2in1
$ cp /boot/config-`uname -r` .config
$ make oldconfig

ここで追加でモジュールなどを入れるためのオプションを大量に聞かれますが、全てENTERキーを連打して答えていきます。続けて、以下のコマンドを実行します。

$ sudo -s
# export CONCURRENCY_LEVEL=9
# make-kpkg -j `nproc` --rootcmd fakeroot --initrd --append_to_version=-xps --revision=001 kernel_image kernel_headers
# cd ..
# dpkg -i linux-headers-5.3.6-xps_001_amd64.deb linux-image-5.3.6-xps_001_amd64.deb

make-kpkg コマンドの実行後、ビルドにかなりの時間がかかります。ゆっくり待ちましょう。

再起動

カーネルの再構築が終わったら、再起動します。今度は nopic の指定は必要ありません。ブートローダーで単にENTERキーを押すだけで、Ubuntuが起動するはずです。

また、起動してログインした瞬間に、いろいろと動作に変化があることが体感できると思います。滑らかな画面描画やアニメーションなど、「求めていたのはこれだ!」と言いたくなるくらいに、快適になっていると思います。YouTubeの動画再生も全く問題ありません。僕が買ったモデルは画面が4Kなのですが、YouTubeで4K対応の動画を再生した際には、素晴らしくきれいな動画再生に感激しました。

XPS 13 2-in-1 7390は画面が360度回転してタブレットのように使えるのも売りの一つです。Ubuntuを入れて使う時点でこれは諦めていたのですが、嬉しい誤算といいますか、カーネルの再起動後にたまたまタブレット的に画面を裏返しにしてみたところ、なんとタブレットモードになりました。画面をタップして操作することもできますし、画面の下からスワイプさせれば、ソフトウェアキーボードが出てきます。素晴らしいです。

そういえば、さっきまでは音量のみ調整できていましたが、カーネル再構築後は、画面の明暗や、キーボードのバックライトの調整もできるようになっていました。

サスペンド時の挙動の設定

ノートPCの魅力は、作業中でもフタを閉じて中断し、数時間後にフタを開ければ中断した時点から作業をすぐに再開できることがあげられます。しかし、現時点では、フタを閉じてしまってはいけません。その後フタを開けたときに、画面は復活せずに黒いままとなってしまい、電源を強制的にOFFにすること以外の手段がなくなってしまいます。

この問題を解決するために、一つスクリプトを追加します。これは、以下のStack OverflowのQ&Aが役に立ちました。

18.04 - Wakes from suspend immediately when bluetooth device disconnected - Ask Ubuntu

具体的には、 /lib/systemd/system-sleep/ ディレクトリに、以下の内容で custom-xhci_hcd という名前のファイルを作成します。

#!/bin/bash

# Original script was using /bin/sh but shellcheck reporting warnings.

# NAME: custom-xhci_hcd
# PATH: /lib/systemd/system-sleep
# CALL: Called from SystemD automatically
# DESC: Suspend broken for USB3.0 as of Oct 25/2018 various kernels all at once

# DATE: Oct 28 2018.

# NOTE: From comment #61 at: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/522998

TMPLIST=/tmp/xhci-dev-list

# Original script was: case "${1}" in hibernate|suspend)

case $1/$2 in
  pre/*)
#    echo "$0: Going to $2..."
    echo -n '' > $TMPLIST
          for i in `ls /sys/bus/pci/drivers/xhci_hcd/ | egrep '[0-9a-z]+\:[0-9a-z]+\:.*$'`; do
              # Unbind xhci_hcd for first device XXXX:XX:XX.X:
               echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/unbind
           echo "$i" >> $TMPLIST
          done
        ;;
  post/*)
#    echo "$0: Waking up from $2..."
    for i in `cat $TMPLIST`; do
              # Bind xhci_hcd for first device XXXX:XX:XX.X:
              echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/bind
    done
    rm $TMPLIST
        ;;
esac

そして、このファイルに実行権限を付与しておきます。

$ sudo chmod a+x /lib/systemd/system-sleep/custom-xhci_hcd

これにより、フタの開け閉めの際にも、正しくサスペンド&レジュームが機能するようになります。

以上が現時点までにやってみたことです。本当に素晴らしい環境となりました。購入して本当に良かった、と心の底から思っていますし、他の多くの人々にも勧めたい気持ちが強いです。

将来なんとかしたいこと

十分に魅力的なUbuntu環境になったのですが、不満な点もちらほらあります。将来的になんとか解決策を探したいと思っています。

  • 画面の明暗が細かく揺れているときがあります。CPUファンの回転の有無に関係しているのかも?とも思っていますが、ただ全く揺れが起きないときもあって、謎です。また、画面の上部や下部に時々ノイズがのることもあり、ストレスに感じることもしばしばです。
  • 外部ディスプレイの接続は1台のみ安定します。2台つないでしまうと、映ることは映るのですが、片方しか設定変更できなかったり。2枚のうち1枚が4Kだったとしても解像度をあげられない、といった不具合が出ます。
  • どうも高負荷時の発熱に弱いのか、CPUファンがブン回っている際にOSごとフリーズしてしまうことが時々ですがあります。これはWindowsでも同じでした。

まとめ

最後に不満な点をいくつかあげましたが、とにかくすごい環境を手に入れることができました。とてもワクワクしています。いろんな開発や作業を快適にこなせるんじゃないか、と期待しかありません。XPS 13 2-in-1 7390は比較的新しいデバイスで構成されているでしょうから、Linuxカーネルが5.4になったら、もっと安定するんじゃないかな、と予想しています。

XPS 13 2-in-1 7390でLinux環境を作ってみようかな、と思っている方々のヒントにこのブログエントリがなれば幸いです。ぜひチャレンジしてみてください。