Surface Go に Ubuntu DDE を Btrfs でインストール

# はじめに

Surface Go (初代) に Deepin デスクトップ環境を採用した Ubuntu DDE 21.04 をデュアルブートでインストールします。


# 用意したもの

- Microsoft Surface Go ( 8GB RAM, 128GB SSD )
- TypeCover
- USB Type-C HUB
- USB 外付け DVD ドライブ
- Buffalo USB イーサネットアダプター
- 有線 LAN
- Ubuntu DDE 21.04 LiveDVD (インストール用のライブメディア)
- Arch LiveDVD (パーティショニング用のライブメディア)

インストール直後は Wi-Fi が使えないため、インターネットからドライバーをダウンロードするために有線 LAN に繋ぎました。
既に別の Linux が入っていたため、内蔵SSDのパーティションは以下のようになっています。(`sudo fdisk -l`で確認できます。)

|デバイス|サイズ|タイプ|
|-             |-    |-|
|/dev/nvme0n1p3|74GB |Microsoft basic data|
|/dev/nvme0n1p4|12GB |Linux swap|
|/dev/nvme0n1p5|32GB |Linux filesystem|
|/dev/nvme0n1p6|257MB|EFI System|

# Ubuntu DDE のインストール

## デュアルブート領域の作成
Windows のディスクの管理を起動し、Windows が入っているボリュームを縮小して 50GB 程度の空き領域を作ります。

## ライブメディアの作成
[Ubuntu DDEのWebページ](https://ubuntudde.com/download) から「 UBUNTUDDE REMIX 21.04 (HIRSUTE HIPPO) OFFICIAL RELEASE 」をダウンロードして、ライブメディアを作成します。

## 起動順序の変更
音量+ボタンを押しながら電源を入れ、Surface の UEFI 設定を開きます。

Security タブでセキュアブートを無効化し、Boot configuration タブで起動時の読み込み順序を以下の順にします。

1. USB Storage
1. Internal Storage
1. Windows Boot Manager

## インストール
ライブメディアを接続し、Exit タブの Restart now から再起動します。ライブ起動した Ubuntu でインストーラーを起動し、内蔵 SSD に Ubuntu をインストールします。この時、インストーラーのパーティション設定画面でマニュアルパーティショニングを選択し、Btrfs でフォーマットした領域を */* にマウントするように設定します。

例:

|デバイス       |フォーマット形式|マウントポイント|容量    |フラグ  |役割|
|--------------|-------------|-------------|-------|-------|-----------|
|/dev/nvme0n1p4| swap        |             | 12GB  |swap   |スワップ     |
|/dev/nvme0n1p5| Btrfs       | /           | 32GB  |       |Linux       |
|/dev/nvme0n1p6| FAT32       | /boot/efi   | 256MB |boot   |ブートローダー|

インストールが完了したら、Arch のライブメディアを挿入し、起動し直します。

# Btrfs サブボリュームの設定
Ubuntu DDE は、デフォルトでは`@`、`@home`、`@swap`のサブボリュームのみ作られるため、以下のディレクトリのサブボリュームを作成してマウントするように設定します。

- /opt
- /root
- /tmp
- /usr/local
- /var
- /.snapshots

## Btrfs 領域をマウント

Btrfs でフォーマットされている領域を確認します。

```shell-session
lsblk -f
```

確認した領域を以下のようにマウントします。*nvme0n1p5* の部分は環境によって変わります。

```shell-session
mount /dev/nvme0n1p5 /mnt
```

## サブボリュームの作成

サブボリューム一覧を確認します。

```shell-session
btrfs subvolume list /mnt
```


新たにサブボリュームを作成します。

```shell-session
btrfs subvolume create /mnt/@opt
btrfs subvolume create /mnt/@root
btrfs subvolume create /mnt/@tmp
btrfs subvolume create /mnt/@usr-local
btrfs subvolume create /mnt/@var
btrfs subvolume create /mnt/@.snapshots
```

サブボリュームを作成したら、ボリュームをアンマウントします。

```shell-session
umount /mnt
```

## 各サブボリュームをマウント

サブボリューム`@`を */* にマウントします。

```shell-session
mount -o subvol=@,defaults,noatime,space_cache,autodefrag,compress=zstd /dev/nvme0n1p5 /mnt/
```

### 既存ディレクトリのバックアップ

既存の */usr/local* と */var* はサブボリュームに置き換えるため、バックアップしておきます。

```shell-session
mv /mnt/usr/local /mnt/usr/local.backup
mv /mnt/var /mnt/var.backup
```

### マウントポイントの作成
マウントポイント */.snapshots* 、*/usr/local* 、*/var* を作成します。

```shell-session
mkdir /mnt/.snapshots
mkdir /mnt/usr/local
mkdir /mnt/var
```

### マウント
作成した各サブボリュームをマウントします。

```shell-session
mount -o subvol=@opt,noatime,space_cache,autodefrag,compress=zstd /dev/nvme0n1p5 /mnt/opt
mount -o subvol=@root,noatime,space_cache,autodefrag,compress=zstd /dev/nvme0n1p5 /mnt/root
mount -o subvol=@tmp,noatime,space_cache,autodefrag,compress=zstd /dev/nvme0n1p5 /mnt/tmp
mount -o subvol=@usr-local,noatime,space_cache,autodefrag,compress=zstd /dev/nvme0n1p5 /mnt/usr/local
mount -o subvol=@.snapshots,noatime,space_cache,autodefrag,compress=zstd /dev/nvme0n1p5 /mnt/.snapshots
mount -o subvol=@var /dev/nvme0n1p5 /mnt/var
```

バックアップから中身をコピーします。

```shell-session
cp -a /mnt/usr/local.backup/* /mnt/usr/local/
cp -a /mnt/var.backup/* /mnt/var
```

ついでに Windows が入っている C ドライブもマウントします。

```shell-session
mkdir /mnt/mnt/c
mount /dev/nvme0n1p3 /mnt/mnt/c
```

### スワップの設定
デフォルトでは`@swap`がスワップとしてマウントされていますが、スワップパーティションをスワップとして設定します。スワップパーティションは`sudo fdisk -l | grep swap`で確認できます。

```shell-session
mkswap /dev/nvme0n1p4
swapon /dev/nvme0n1p4
```


## 自動マウントの設定

初期状態の fstab をバックアップしておきます。

```shell-session
cp /mnt/etc/fstab /mnt/etc/fstab.backup
```

起動時に自動マウントさせるために fstab に、現在のマウント情報を追記します。

```shell-session
genfstab -U /mnt >> /mnt/etc/fstab
```

fstab を編集し、`@swap`に関する2行をコメントアウトします。コメントアウトする行は`grep /swap /mnt/etc/fstab`で確認できます。

```shell-session
nano /mnt/etc/fstab
```

ライブメディアを取り外して再起動すれば、Ubuntu DDEが立ち上がります。


# Wi-Fi ドライバーの導入
まずは初期状態のスナップショットをとっておきます。

```shell-session
sudo btrfs subvolume snapshot / /.snapshots/$(date "+%Y-%m-%d-%H-%M")
```

Wi-Fi ドライバーのディレクトリに移動し、バックアップを取ります。

```shell-session
cd /lib/firmware/ath10k/$(sudo lshw -class network | grep Wireless | grep product | awk '{print $2}')
sudo mv hw3.0 hw3.0.backup
```

[ここ](https://forums.ubuntulinux.jp/viewtopic.php?id=18477)を参考に、board.bin と firmware-4.bin をダウンロードし、*hw3.0* に配置します。

```shell-session
sudo mkdir hw3.0
cd hw3.0
sudo wget https://github.com/FireWalkerX/ath10k-firmware/blob/7e56cbb94182a2fdab110cf5bfeded8fd1d44d30/QCA6174/hw3.0/board-2.bin -o board.bin
sudo wget https://github.com/FireWalkerX/ath10k-firmware/blob/7e56cbb94182a2fdab110cf5bfeded8fd1d44d30/QCA6174/hw3.0/firmware-4.bin_WLAN.RM.2.0-00180-QCARMSWPZ-1 -o firmware-4.bin
sudo chown root *
sudo chmod +x *
```

再起動して、 Wi-Fi を認識することを確認したらインストール完了です。

```shell-session
reboot
```




# 参考
- [Microsoft Surface GoをLinuxデュアルブートにする](https://qiita.com/suzuki_sh/items/ac444f9de6e9817dc23d)
- [Arch Linux with BTRFS Installation](https://www.nishantnadkarni.tech/posts/arch_installation/)
- [@IT |【 cp 】コマンド（応用編その2）――属性を保持したままコピーする](https://atmarkit.itmedia.co.jp/ait/articles/1606/02/news021.html#sample1)
- [ArchWiki | Btrfs](https://wiki.archlinux.jp/index.php/Btrfs#.E3.82.B9.E3.83.8A.E3.83.83.E3.83.97.E3.82.B7.E3.83.A7.E3.83.83.E3.83.88)
- [Ubuntu日本語フォーラム | ubuntu16.04ltsにてpc内蔵の無線lanドライバが認識しません](https://forums.ubuntulinux.jp/viewtopic.php?id=18477)