ManjaroをSurface Goへインストールした際のトラブルと解決策

WSLでトラブったことをきっかけに家のPC環境を本格的にWindowsからLinuxへ移行することにした。
その流れでSurface GoにもLinux（Manjaro）を入れることにした。

## 始めに
- 本記事は以下の内容を**含みません**
  - インストール自体の解説（インストーラー自体はかなり親切なため。）
  - デュアルブート（Windowsは完全に削除してクリーンインストールしたため。） 
  - Manjaroを入れた Surface Go をトラブルなく使う方法（未解決な問題がまだまだあるため。[^unsolved]）
- 本記事では筆者の好みでManjaroを前提としています。

## 先に結論
- インストーラーによって動いたり動かなかったりする。
    自分が試した範囲だと

|Installer|結果（詳細は後述）|
|:--|:---|
|manjaro-kde-20.1.2-201019-linux58.iso|インストール後に起動しない|
|manjaro-kde-19.0.2-200311-linux54.iso|インストールできる|
|manjaro-architect-20.0.3-200607-linux56.iso|インストール自体ができない|

- 無線のドライバーは入れ替え必須
- キーボードカバーやSurface DockといったSurface固有の周辺機器はそのままでも問題なく動く。
- Surface Pen も一応使えるのだが、ボタンの設定等するのにドライバー入れたほうがいい。
- Surface Dockがあるととても楽（おそらくなくてもインストール自体はできるはずだが[^noncommitional]、そのままだと無線LANが使えなかったり、端子がUSB Type-C 一つなので既存のUSBメモリやLAN端子、USBハブが刺さらなかったりするので…）



## 使ったもの
- USB Type-C 対応のUSBメモリx2 インストール用とバックアップ用
    （Surface Go本体にはUSB端子が Type-c 1つしかないため。）
- [Surface Go（初代）](https://www.microsoft.com/ja-jp/p/surface-go/8v9dp4lnknsz){{ affiliate_links(amazon="https://amzn.to/3ghJxCr") }}
- （[Surface DocK 2](https://www.microsoft.com/ja-jp/p/surface-dock-2/8qd908364sg2){{ affiliate_links(amazon="https://amzn.to/3ghJxCr") }}
  有線LAN端子兼USBハブとして利用。最終的にはなくても良かった気もする…。）



## トラブル1: 有線LANが検出できない（Manjaro Architect Installerでの起動時）

Manjaro linuxにはインストーラーが4種類ある。そのうちGnome, KDE, XFCE版については（おそらく）デスクトップ環境が違うだけなのだが、Architectは単にデスクトップ環境がないというだけではなく、インストールにネットが必須となっている。（あとから知った）

当初デスクトップ環境を決めかねていたということもあり、とりあえずArchitectでインストールして様子を見ようと試したのだが、なぜかSurface Goだと有線LANを認識しなかった。[^architect]
別のデスクトップPCでManjaro Architectをインストールした際はは有線LANを自動設定できたので、ドライバーの問題だろうか。

先に述べたようにArchitect Installerはネット接続が必須なため、ここで手詰まりである。

### 解決策
ダメ元でKDE版のインストーラーを入れたところ普通に有線LANを認識した。試したわけではないが、おそらく他のデスクトップ入のインストーラーでも同様に問題ないかと思われる。


## トラブル2: インストールが完了しても起動しない
（KDE版で）インストールが無事に終わっても再起動するとbiosのロゴから先に進まなくなった。

### 解決策
Linuxのカーネルには一部にLTSという長期サポートのバージョンがあり、最新版よりも安定している傾向があるらしい。

Manjaroの（公式サイトから直接リンクがはられている）デフォルトのインストーラーはカーネルが最新（2020年11月時点で5.8）のものだったが、LTS（の中で最新、2020年11月時点で5.4）のものも用意されていたので、こちらを試したら問題なく起動するようになった。

![公式から飛んだダウンローダー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400984/68c309ff-0624-8a5c-f714-d15fe71315c2.png)
公式のダウンロードから直接とぶとこの最新のカーネルのページに行き着き自動でダウンロードが始まるが、キャンセルして左上のファイルからインストーラの一覧へ飛べる。


## トラブル3: Wifiがつながらない

無事にインストールしても`Wifi`がそのままだとつながらない。（Surface Go のWifiモジュール自体の不具合らしい。）

### 解決策

以下のページに解決策が乗っている
[Surface Go · linux-surface/linux-surface Wiki](https://github.com/linux-surface/linux-surface/wiki/Surface-Go)

平たく言えばちゃんと動く無線のファームウェアをよそからダウンロードして差し替えればいい

#### 1.ファームウェアを用意する
自分は上記のページとおり以下のリンク先から取得したが、これの正当性を自分は担保できないのでやるなら自己責任でお願いします。
[http://www.killernetworking.com/support/K1535_Debian/board.bin](http://www.killernetworking.com/support/K1535_Debian/board.bin)

killerとか物騒な単語が入っているから一応調べたところここ自体は普通にNetworkインターフェース作ってるインテル配下の会社？ブランド？らしい（[ソースはWikipedia](https://en.wikipedia.org/wiki/Killer_NIC)ので、純正のドライバーなのかもしれない。

#### 2. ファームウェアの差し替え
手をつけるファームウェアは以下

|パス|変更内容|
|:--|:--|
|/usr/lib/firmware/ath10k/QCA6174/hw2.1/board.bin| 差し替え|
|/usr/lib/firmware/ath10k/QCA6174/hw2.1/board-2.bin| 削除|
|/usr/lib/firmware/ath10k/QCA6174/hw3.0/board.bin| 差し替え|
|/usr/lib/firmware/ath10k/QCA6174/hw3.0/board-2.bin| 削除|

ちなみに差し替えるファイルは同じでいい。

一応バックアップしておく

```
$ sudo mv /usr/lib/firmware/ath10k/QCA6174/{hw2.1,hw3.0}/board*.bin /path/to/backup/
```

`board-2.bin`の削除

```
$ sudo rm /usr/lib/firmware/ath10k/QCA6174/{hw2.1,hw3.0}/board-2.bin
```

`board.bin`の差し替え

```
$ sudo mv /path/to/new/board.bin /usr/lib/firmware/ath10k/QCA6174/hw2.1/
$ sudo mv /path/to/new/board.bin /usr/lib/firmware/ath10k/QCA6174/hw3.0/
```

#### 3 カーネルモジュールの設定

`/etc/modprobe.d/ath10k.conf`に以下の内容のファイルを作成する

```
options ath10k_core skip_otp=y
```

これでつながるようになった。

## トラブル4: Stylus で右クリックが使えない
認識はしているのだが、ボタンには中クリックが割り当てられている模様。右クリックがないと不便なので入れ替えたい。[^middleclick]

### 対策

#### スタイラスの認識

一般的なwacomタブレットでは`xsetwacom --list devices`でデバイスの取得ができるらしい。が、できなかった。

更に探してみたところ、wacomドライバのsurface用というそれらしいものがあったので
[linux-surface/libwacom-surface: Patches to support Microsoft Surface Devices with `libwacom`.](https://github.com/linux-surface/libwacom-surface)

AURでインストールした

```
$ git clone https://aur.archlinux.org/libwacom-surface.git
$ makepkg -si
```


改めて実行すると、ちゃんと検出できた。

```
$ xsetwacom --list devices                                   
ELAN9038:00 04F3:261A touch             id: 12  type: TOUCH     
ELAN9038:00 04F3:261A stylus            id: 13  type: STYLUS    
ELAN9038:00 04F3:261A eraser            id: 18  type: ERASER 
```

#### ボタン設定

Stylusのボタンは1が右クリック、2が中クリック、3が右クリックに割り当てられているらしい。
`xsetwacom --set`で別のボタンを割り当てられる
  

```
$ xsetwacom --get "ELAN9038:00 04F3:261A stylus" Button 2    
button +2 
$ xsetwacom --set "ELAN9038:00 04F3:261A stylus" Button 2 3
```

これで右クリックにできた

これだと再起動するたびにリセットされてしまうので永続化には何かしら対策が必要。
~~InputDeviceの設定なので本来は`/etc/X11/xorg.conf`に設定するのが正しそうではあるが、書き方がよくわからないので今回は割愛。bashで起動時に実行するのが一番手軽だろうか~~


KDEであれば`kcm-wacomtablet`をインストールするとGUIでかんたんに設定できる。



### 参考
[null-i.net - Linux/wacomでペンタブを使う](https://null-i.net/index.html?Linux/wacom%E3%81%A7%E3%83%9A%E3%83%B3%E3%82%BF%E3%83%96%E3%82%92%E4%BD%BF%E3%81%86#r8fbaca0)
[Wacom tablet - ArchWiki](https://wiki.archlinux.org/index.php/Wacom_tablet)

## トラブル5: Bluetoothが繋がらなくなる
スリープから復帰した際にbluetoothが接続できなくなる

### 解決策
bluetoothのデバイスをリセットする必要があるらしい。

リセットには以下のコマンドを使う
`usb_modeswitch -T -v "ベンダーID" -p "プロダクトID"`


ベンダーIDとプロダクトIDは`lsusb`で確認できる。

```
$ sudo lsusb                                                           
[中略]
Bus 001 Device 002: ID 0cf3:e302 Qualcomm Atheros Communications 
[中略]
```

この場合`0cf3`がベンダーID、`e302`がプロダクトIDになるので

```
$ sudo usb_modeswitch -R -v 0cf3 -p e302                               
Look for default devices ...
 Found devices in default mode (1)
Access device 002 on bus 001
Get the current device configuration ...
Current configuration number is 1
Use interface number 0
 with class 224
Warning: no switching method given. See documentation
Reset USB device .
 Device was reset
-> Run lsusb to note any changes. Bye!
$ sudo systemctl start  bluetooth
```

これで復旧できた。

### 参考
[Bluetooth - ArchWiki](https://wiki.archlinux.org/index.php/Bluetooth)


## 残る課題
- sim が使えない
- テザリングができない
- バッテリーの消耗が激しい（カバーを閉じた状態では画面は消えているがサスペンドはしていない疑惑）

[^noncommitional]: うろおぼえなので断言できないが、KDEならネットに繋げなくてもインストールできるじゃないか、Dockいらないじゃん、とショックを受けた覚えがあるので多分できたはず

[^unsolved]: 最近はほとんどベッドで使っているということもあって、残る問題を対処するモチベーションがなくなってしまったので更新未定。

[^architect]: デスクトップでArchitectからインストールした際は普通に認識していたのでArchitectだから有線も手動で設定しなければいけないというわけではない模様。KDEはminimamでも容量2倍あるし、GUI以外にもArchitectには含まれていないドライバがあるのかもしれない。GUIなし≒サーバー向けと考えるとノート用のドライバーが省かれていてもおかしくはないか。

[^dualboot]: 1年ほどLinuxを使った結果として、デスクトップ環境やスリープの挙動がやや怪しいものの機能的にはゲーム以外Linuxで問題なかったのと、ここ最近はWSLをつかっていたのだが、トラブったときに結局Windows側の仕様とか不具合の調査、対応が必要になったりするのが、Linuxを使いたいのに本末転倒に感じたので。DualbootにしろWSLにしろ、Windows依存の機能はなるべく避けたい。Windowsが必要な場合はメインPCに仮想Windowsを構築して使う予定。

[^middleclick]: 今思えばASUS TP203にxubuntuを入れたときもボタンが中クリック扱いで困ってた覚えがある。なぜ右クリックでは中クリックなのかと思うが、そもそも純正ドライバであれば自由に割り当てられるので、使い勝手を考えず、単純にボタン123と割り振っているだけなのかもしれない。