Ubuntu 20.04 LTS セットアップログ（主に自分用）

主に未来の自分に向けたログだが、誰かの参考になるかもしれないので。

# Windowsとのデュアルブート

すでにWindows10とUbuntu 18.04をデュアルブートしている。ストレージ (SSD) は2台あり、それぞれにWidowsとUbuntuを独立してインストールしているつもりだった。なお、[Windows 10でUbuntu GRUBブートローダーの削除方法 UEFI／レガシーBIOS | 俺の開発研究所](https://itlogs.net/ubuntu-grub-delete-uefi-bios/) を参考にBIOSモードを確認したところ、BIOSモードはUEFI（パーティションはGPT）だった。セットアップ前のパーティション構成は次の通り。

- ストレージ1
    - Windows10 本体
    - EFIパーティション
        - Windows10のOSローダー
        - Ubuntu 18.04のOSローダー
- ストレージ2
    - Ubuntu 18.04 本体

この構成だと、ストレージ1（のEFIパーティション）が無いと、ストレージ2のUbuntuを立ち上げられない。[Windows PCに安定したネイティブLinux環境を構築する方法](https://zenn.dev/karaage0703/articles/0ca67e19aa772e)によると、ストレージごとに完全に独立してOSをインストールした方が、OSのアップデートで環境が破壊されるリスクが少ないとのこと。この状態を目指す。

## Ubuntuインストール

### メディアの作成

Windowsにて[Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team](https://www.ubuntulinux.jp/products/JA-Localized/download) から日本語 Remix をダウンロード。通常版をダウンロードする案もあったが「オリジナル版からの変更点」に納得してこちらに。[Rufus](https://rufus.ie/ja/) でUSBメモリに書き込む。

### インストール

USBメモリから起動。「インストールの種類」では「それ以外」を選択してパーティションを設定する。このとき、**ストレージ2にもEFIパーティションを作成することに注意。**このEFIパーティションを用意しておかないと、「ブートローダをインストールするデバイス」でストレージ2を選んだとしても、ストレージ1のEFIパーティションにOSローダーが書き込まれてしまう。

## GRUBブートローダーの削除

[Windows 10でUbuntu GRUBブートローダーの削除方法 UEFI／レガシーBIOS | 俺の開発研究所](https://itlogs.net/ubuntu-grub-delete-uefi-bios/) を参考に、ストレージ1のEFIパーティションからUbuntu 18.04のローダーを削除する。

## 最終的なパーティションの構成

結果として、以下のような構成になる。

- ストレージ1
    - Windows10 本体
    - EFIパーティション
        - Windows10のOSローダー
- ストレージ2
    - Ubuntu 20.04 本体
    - EFIパーティション
        - Ubuntu 20.04のOSローダー

これにより、ストレージ1からブートすればWindowsが、ストレージ2からブートすればUbuntuが立ち上がる。かつ、片方のOSをアップデートしても、もう片方への影響は小さくなる（はず）。怖いならストレージを抜いてアップデートすればよい。

# USBの無線LANアダプタ

[Archer T2U Nano](https://www.tp-link.com/jp/home-networking/adapter/archer-t2u-nano/) というUSBの無線LANアダプタを使っているが、Ubuntuにはドライバーが付属していない。したがって、これを自前でビルドする必要がある。しかしながらビルドしようにもgccやmakeなどがインストールされていない。もちろんインターネットにも繋がらない。さあ困った。

## USBメディアからパッケージのインストール

なんと有り難いことに、インストールメディアに入っているのだ。これをマウントしてaptのリポジトリとして見に行けるようにすればいい。

```bash
sudo mkdir /media/usb-drive
sudo mount /dev/sdd1 /media/usb-drive/  # 自分のPCでは/dev/sdd1がUSBメディアだった

sudo vi /etc/apt/sources.list
#末尾に以下を追加して保存する
#deb file:/media/usb-drive focal main restricted

sudo apt update
sudo apt install build-essential dkms

sudo umount /media/usb-drive/
sudo rm -r /media/usb-drive
sudo vi /etc/apt/sources.list  # 先程追加した行を消すなりコメントアウトするなり
```

### 参考

- [オフラインでbuild-essentialを入れる - ねこの知恵](https://nek0sama.hatenablog.com/entry/2021/07/17/213059)
- [Ubuntu日本語フォーラム / オフラインでmakeをインストールしたい](https://forums.ubuntulinux.jp/viewtopic.php?id=20707)

## ドライバのビルドとインストール

[aircrack-ng/rtl8812au: RTL8812AU/21AU and RTL8814AU driver with monitor mode and frame injection](https://github.com/aircrack-ng/rtl8812au/tree/v5.6.4.2) から zip でソースコードをダウンロードし、USBメモリ経由で運ぶ。適当なディレクトリにzipを展開する。

```bash
cd rtl8812au-5.6.4.2
sudo make dkms_install  # ビルドも兼ねている
```

再起動すると、WiFiが使えるようになっている。

# 何はともあれアップデート

```bash
sudo apt update && apt upgrade -y && apt autoremove -y
```

# ディレクトリ名を英語にする

```bash
LANG=C xdg-user-dirs-gtk-update
```

## 参考

- [「デスクトップ」等のディレクトリ名を英語にする - Qiita](https://qiita.com/take5249/items/13ada73bbd01ee12a2c3)

# Mozcの設定

Ctrl-jで日本語入力をトグルしたい。「ことえり」をベースに以下を追加。

- 直接入力, Ctrl-j: IMEを有効化
- 入力文字なし, Ctrl-j: IMEを無効化

# Firefox

## Gesturefy

ジェスチャーの設定はjsonでエクスポートできる。バックアップしておいたものを復元する。

## uBlock origin

- 豆腐フィルタ ([tofukko/filter](https://github.com/tofukko/filter))

# フォント

- [miiton/Cica: プログラミング用日本語等幅フォント Cica(シカ)](https://github.com/miiton/Cica)
    - ターミナルに使う

# Dock

```bash
sudo apt install gnome-tweak-tool
```

以下のテーマとアイコンを入れる。

- [jnsh/arc-theme: A flat theme with transparent elements (actively maintained fork)](https://github.com/jnsh/arc-theme)
    - `sudo apt install arc-theme` で入る
- [PapirusDevelopmentTeam/papirus-icon-theme: Papirus icon theme for Linux](https://github.com/PapirusDevelopmentTeam/papirus-icon-theme#recommendations)
    - `sudo add-apt-repository ppa:papirus/papirus` の後で `sudo apt install papirus-icon-theme`

`gnome-tweak-tool` を起動し、Keyboard & Mouse → Emacs InputをOn.

# GitHub

```bash
ssh-keygen -t ed25519 -C "自分のメールアドレス"
ssh-add ~/.ssh/id_ed25519
```

GitHubのSettings → SSH and GPG keysにて、~/.ssh/id_ed25519.pubの内容を登録する。以下で疎通確認できる。

```bash
ssh -T git@github.com
```

## 参考

- [Generating a new SSH key and adding it to the ssh-agent - GitHub Docs](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)

# linuxbrew

```bash
sudo apt install curl git
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## 参考

- [Homebrew on Linux — Homebrew Documentation](https://docs.brew.sh/Homebrew-on-Linux)

# zshとterminator（ターミナルエミュレータ）

```bash
brew install zsh
sudo apt install terminator
```

## 設定ファイルの復元

自分のリポジトリから設定ファイル (dotfiles) を復元する。

# Emacs

aptから26.3が入る。やや古いけどまあいいか。

```bash
sudo apt install emacs
```

# Python

## pyenv

[pyenv/pyenv: Simple Python version management](https://github.com/pyenv/pyenv)

```bash
sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```

```bash
pyenv install -l | grep 3.9
pyenv install 3.9.9
pyenv global 3.9.9
```

## poetry

[Introduction | master | Documentation | Poetry - Python dependency management and packaging made easy](https://python-poetry.org/docs/master/#installing-with-the-official-installer)

```bash
curl -sSL https://install.python-poetry.org | python3 -
# インストール後、$HOME/.local/bin をパスに追加しておく
```

## PyCharm
### Toolbox App経由で入れる
JetBrains製のIDEをまとめて管理できるToolbox Appが提供されており、このアプリ経由で入れるのが良い。

[JetBrains Toolbox App：ツールを簡単に管理](https://www.jetbrains.com/ja-jp/toolbox-app/)からtar.gzをダウンロードする。

```bash
sudo tar -xzf ~/Downloads/jetbrains-toolbox-1.22.10970.tar.gz -C /opt
sudo ln -s /opt/jetbrains-toolbox-1.22.10970/jetbrains-toolbox /usr/local/bin
jetbrains-toolbox
```

GUIが開くので、"PyCharm Professional"をインストールする。Dockには自動的にアイコンが追加される。

Toolbox Appの右上の歯車？アイコンからSettingsを開く。`Generate shell scripts`をONにする。`Shell scripts location`にパスが通っている適当なディレクトリを入力する（例えば`~/.local/bin`）。

さらに、Toolbox内のPyCharmのSettingsを開き（上記はToolbox自体の設定であり、これとは別物であることに注意）、`Shell script name`の`pycharm`を`charm`に変更する。※MacOSにインストールしたPyCharmとの一貫性を取るため

#### 参考
* [Install PyCharm | PyCharm](https://www.jetbrains.com/help/pycharm/installation-guide.html)

### PyCharm単体で入れる場合
こちらの場合、インストールディレクトリである/opt以下の権限の都合上、アップデートが正常にできないリスクがある（2021.3.1→2021.3.2のアップデートで確認）。

[Download PyCharm: Python IDE for Professional Developers by JetBrains](https://www.jetbrains.com/pycharm/download/#section=linux) からダウンロードする。

```bash
sudo tar xzf Downloads/pycharm-professional-2021.3.1.tar.gz -C /opt
/opt/pycharm-2021.3.1/bin/pycharm.sh
```

- Tools→
    - Create command-line Launcher...: コマンドラインから呼べるようにする
    - Create Desktop Entry...: Dockに登録できるようにする

# CUDA

どうせ nvidia-docker で動かすと思うのだが、念のため生でも動くようにしておく。

## バージョンの選定

[ソースからのビルド | TensorFlow](https://www.tensorflow.org/install/source#linux) を参考にする。2022/01/08 では以下の組み合わせが最新だった。

- tensorflow-2.6.0
- GCC 7.3.1
    - `gcc -v` によると `gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)` らしいが、気にせず進める
- cuDNN: 8.1
- CUDA: 11.2

# nouveauの停止

```bash
sudo touch /etc/modprobe.d/blacklist-nvidia-nouveau.conf
# ファイルの中身は以下のようにする
#blacklist nouveau
#options nouveau modset=0
sudo vi /etc/modprobe.d/blacklist-nvidia-nouveau.conf
# 設定を有効にする
sudo update-initramfs -u
```

### 参考

- [DockerでのディープラーニングGPU学習環境構築方法 - Qiita](https://qiita.com/karaage0703/items/e79a8ad2f57abc6872aa#nouveau%E3%81%AE%E5%81%9C%E6%AD%A2)

## バージョンの固定

うっかりアップグレードされてしまうと困るので、バージョンを固定する。

```bash
sudo vi /etc/apt/preferences.d/cuda-11-2-pin-700
```

```
Package: cuda
Pin: version 11.2*
Pin-Priority: 700

Package: libcudnn*
Pin: version 8.1*+cuda11.2
Pin-Priority: 700
```

### 参考

- [UbuntuにCUDA10.0+cuDNNを導入してaptのPinでマイナーアップデートに追従させた - Qiita](https://qiita.com/cexen/items/3dc2b3f04134993aa707)

## CUDA Toolkit & cuDNN

Select Target Platformで以下のように設定し、出てきた指示に従ってコマンドを実行する。

- Operating System: Linux
- Architecture: x86_64
- Distribution: Ubuntu
- Version: 20.04
- Installer Type: deb (network)
    - 正直どれがいいのか分からない。どうせaptで入れる際にダウンロードするだろうからこれにした

```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"

sudo apt-get update
sudo apt-get -y install cuda libcudnn-8-dev
```

グラフィックボードのドライバはツールキットに付いてくるので、別途インストールする必要なし。再起動して `nvidia-smi` でドライバがインストールされていることを確認する。

## 動作確認

[初心者のための TensorFlow 2.0 入門 | TensorFlow Core](https://www.tensorflow.org/tutorials/quickstart/beginner) のサンプルコードを動かす。

```bash
pip install tensorflow==2.6.0
vi tensorflow_sample.py
python tensorflow_sample.py
```

```python
import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
```

なお、kerasを2.6.0にダウングレードしないと、実行時に `AlreadyExistsError` 例外が上がってしまう。以下のissueが詳しい。

[AlreadyExistsError: Another metric with the same name already exists · Issue #51592 · tensorflow/tensorflow](https://github.com/tensorflow/tensorflow/issues/51592)

# Docker / nvidia-docker

[Installation Guide — NVIDIA Cloud Native Technologies documentation](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker)

```bash
curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
# 動作確認
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
```

## 参考

一通り作業した後で見つけた。`cuda-drivers` パッケージでインストールする場合は、手動で nouveau をブラックリストに追加する必要がないとのこと。

- [NVIDIA Docker って今どうなってるの？ (20.09 版) | by Kuninobu Sasaki | NVIDIA Japan | Medium](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44)

# VSCode

[Download Visual Studio Code - Mac, Linux, Windows](https://code.visualstudio.com/download) からdebをダウンロードする。その後aptで入れる。

```bash
sudo apt install ~/Downloads/code_1.63.2-1639562499_amd64.deb
```

# Slack

[Linux | ダウンロード | Slack](https://slack.com/intl/ja-jp/downloads/linux) からdebファイルをダウンロードする。

```bash
sudo apt install ./Downloads/slack-desktop-4.23.0-amd64.deb
```