ubuntu22.04 LTS インストールからGPUドライバをあてて、リモート環境でVSCodeを使ってdockerの開発環境を作るまで

新しいパソコンを入手したので、GPUで機械学習できるように設定する。

対象者としては、
・ubuntu2204で機械学習をやってみたい人向け
・nvidiaのGPUで高速化したい人
・dockerを使ってみたい人
・さらに、VSCodeをdockerコンテナ内の環境で使って見たい人
・ローカルでなくリモート環境でもubuntuを触りたい
・いざという時は、Windowsマシンにリストアしたい

このような人におすすめです。

検証は、今回のマシン
ＭＢASRock Z780 steel legeno wifi
GPU RTX4090 LEADTEK PG139
セキュアブートでのドライバ導入も行った。

#### 先ずは、ubuntuの起動ディスクを作成
widnowsマシンで、ubuntu22.04 LTS日本語リミックスをダウンロード
isoの書込ツール（balena Etcherなど）でＵＳＢ起動ディスクを作成する。


起動Ｆ１１でブートメニュー　ＵＳＢを選ぶ　DELキーBSキーの場合もあり

#### バックアップすべきものがあるとき
外付けＨＤＤをマウント 
Gpartedで場所を確認
sudo mkdir /media/usbhdd
sudo mount -t ntfs /dev/sdb1 /media/usbhdd




元環境windows11pro M2SSD をＤＤコマンドで外付けＵＳＢＨＤＤにバックアップ

https://qiita.com/katakaku/items/0b6e24de0f0ef88b7566#dd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7ssd%E5%85%A8%E4%BD%93%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B

## ubuntuのインストール
利用可能なＭ２ＳＳＤをＭＢにセット。windowsのＳＳＤは外しておく。
ＵＳＢからubuntuを起動。このとき、直接インストールせずに、一度**ライブＣＤ（ＵＳＢ）状態で起動**する。これを行うことで、ＷｉＦｉドライバやディスプレイドライバがあたる。直接インストールでは、wifi使えず、モニタ解像度も最低のものだけになった。
**重要 自動ログインの設定をしないこと：**　自動でログインするとディスプレイ周りの設定とchrome-remote-desktopのディスプレイ設定が交錯してしまう。
wifi接続は、後で共有フォルダを設定することを考慮して適切なネットワークを選ぶ。

#### 更新を忘れずに
sudo apt update
sudo apt upgrade -y

sudo apt-get update 　aptとapt-getは情報を別々に持っているようだ。のちのnvidia-docker2インストールのためアップデート

sudo apt install curl
**まとめて**
```
sudo apt update && sudo apt-get update && sudo apt upgrade -y && sudo apt install curl
```


## フォルダ名を英語にする
ダウンロードなど和名のフォルダを英語表記に変える。ダウンロードフォルダに何も入っていない方が良い。firefoxがすぐにtempファイルを作る。
LANG=C xdg-user-dirs-gtk-update

2度と聞かないでと言ったけど、やり直したいとき
LANG=ja_JP.UTF-8 xdg-user-dirs-update --force

#### ホームフォルダのmusicやpictureなどを永続的に消したいとき。
musicやpictureフォルダは手動で削除しても自動生成してしまう。

~/.config/user-dirs.dirs　ファイルを以下のように変更する。

```
# 再起動時に勝手に書き換えられないように
XDG_USER_DIRS_DISABLE=true

# 既存の設定
XDG_MUSIC_DIR=""
XDG_PICTURES_DIR=""
```
設定の反映　
xdg-user-dirs-update


ファイラーnautilusの左パネルの表示を消すには、
~/.config/gtk-3.0/bookmarks
を編集する。（リアルタイムで反映する）
なぜか、~/.config/nautilus/フォルダではない。

## ブラウザなど不要なタイミングでパスワードを求められるとき
Authentication is required to create a color managed deviceの表示がうっとうしい
ついでに、Authentication is required to refresh the system repositories も
以下のHPを参考に
https://www.cagylogic.com/archives/2021/03/23145121/11743.php
https://qiita.com/HirumaT/items/36a7209814a157f62cec
次のコマンドでテキストエディターを開いて該当部分を貼付、保存。
sudo gedit /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla

以下、貼り付ける内容
```
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes

[Allow Package Management all Users]
Identity=unix-user:*
Action=org.debian.apt.*;io.snapcraft.*;org.freedesktop.packagekit.*;com.ubuntu.update-notifier.*
ResultAny=no
ResultInactive=no
ResultActive=yes
```
## GPUドライバの設定
インストールできそうなドライバ一覧を確認　nvidia-driver-525など表示される。
  ubuntu-drivers devices
  sudo apt install -y nvidia-driver-525
  sudo reboot


ドライバのインストール中、ＵＥＦＩのセキュアブートで証明書の登録パスワードの作成を求められる。

再起動すると、ＭＯＫとかＥｎｒｏｌｌとか、ドライバの認証のための手続きを求められる。本体にモニタを直接つなぐこと！！（Ｂｉｏｓレベルなのでリモートはダメ）

Press Any Key　－＞　 Enroll MOK　－＞ Veiw Key 0　－＞　Continue　－＞先ほどのパスワード入力　－＞　 Reboot

  nvidia-smi
ドライバが正常にインストールされていれば、情報が表示される。
セキュアブートの対応　https://nanbu.marune205.net/2021/12/ubuntu-secure-boot.html?m=1

#### ドライバの再インストール
何らかの理由でドライバが壊れて、再起動してもnvidia-smi が応答しないことがある。このとき
sudo apt update
sudo apt upgrade
sudo apt purge nvidia*
(sudo apt-get purge nvidia*)
sudo reboot
などで対応。nvidia関連を削除したあとは、docker関係も再インストールや設定が必要。
GPUドライバを削除した状態でもchrome-desktopからはアクセス可能だった。
今回のトラブルケースではver545が突然使えなくなり、ver545の再インストールがエラー。ver535はインストールすることが出来た。

#### 別のGPUドライバの設定方法　
公式サイトからドライバをダウンロード　https://www.nvidia.co.jp/Download/index.aspx?lang=jp

sudo sh NVIDIA-Linux-x86_64-525.85.05.run
gcc,cc,makeが入っていないと言われたら、
sudo apt install gcc
sudo apt install make
を先に実行する。こちらの方法でもセキュアブートの対応が必用。

#### デフォルトでロードされている [nouveau] ドライバー
デフォルトでロードされている [nouveau] ドライバーを無効化するとの情報もネット上にある。https://www.server-world.info/query?os=Ubuntu_22.04&p=nvidia&f=1

GPUドライバのセットアップは、dockerコンテナ内で計算資源を使うことが目的なので、特に無効化をしていない。


## chromeのインストール
firefoxでクロームを検索し、linux用のインストールファイルをダウンロードする。
右クリックでインストールかコマンドでインストール。
sudo dpkg -i google-chrome-stable_current_amd64.deb
試した環境では再起動後の正常起動した。
だめなら、sudo apt --fix-broken install を試す。

## chrome-remote-desktopのインストール
GPU・グラフィック周りの設定完了後に行うこと。
再掲：自動ログインしないこと。ローカルとリモートと一方だけでアクセスすること。
chromeの拡張機能から選べるが、失敗するので以下の方法で行う。
まずは、chromeにログインする必要がある。
https://qiita.com/katakaku/items/dafc5bcbebf443f75f9b

## dockerのインストール
dockerとnvidia-container-toolkitとdocker-compose をインストールしていく。

nvidia-docker2 だけをインストールすれば、nvidia-container-toolkit も一緒にインストールされるとのこと

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

https://hirooka.pro/ubuntu-22-04-nvidia-container-toolkit-docker/

https://takake-blog.com/ubutnu2004-install-nvidia-docker/

以下を実行していく。
```
curl https://get.docker.com | sh && sudo systemctl --now enable docker
```

Setup the package repository and the GPG key（暗号化ソフトで生成される公開鍵　知らぬ間にカギが更新されると困る）
このあたりまでは、最初の１回やれば良いようです。
```sh
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
```

nvidia-docker2のインストールとdockerの再起動を行う。docker-composeも後で利用するので入れておく。
```
sudo apt-get update && sudo apt-get install -y nvidia-docker2 && sudo apt install docker-compose && sudo systemctl restart docker
```

動作確認でnvidia-smiの正常な結果が出ればＯＫ
sudo docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
コンテナの名前nvidia/cuda:11.8.0-base-ubuntu22.04は適当なものを利用。

https://hub.docker.com/r/nvidia/cuda/tags

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tensorflow/tags


dockerの中と外では、記述内容やバージョンが若干異なることもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/72e5b28c-2607-6bf3-6193-889c8bf64a94.png)

#### dockerを一般ユーザーで実行できるようにする
VSCodeでdockerを使うとき、sudoではなく、自分をdockerグループに入れておく。
これにより、sudo docker ....とsudoを付ける必用がなくなる。
sudo usermod -aG docker ユーザー名
id コマンドで自分がdockerグループに入ったことが確認できるが、要再起動。ログアウト(ターミナルではexit）で

### dockerのコンテナを別ドライブに保存したいとき
以下を参照

https://qiita.com/katakaku/items/8e530e4cbbbc88acf423


## swapファイルの作成
インストールした最初の状態だと、swapが２Gだけなので大きくする。
１２８Gのswapを作成する。

現在の設定を確認。
```
sudo swapon --show
```

swapfile2という名前で作成して確認。
```
sudo fallocate -l 128G /swapfile2
ls -lh /swapfile2
sudo chmod 600 /swapfile2
ls -lh /swapfile2
```

作成したファイルをスワップファイルにする。
続いて、有効化する。
```
sudo mkswap /swapfile2
sudo swapon /swapfile2
```

永続化（次回起動時にも有効にする）
fstabに記述することで永続化できる。
```
sudo gedit /etc/fstab
```
次の一文を追記する。
/swapfile2 none swap sw 0 0

#### swapfileを消したいとき
sudo swapoff /swapfile2
sudo rm /swapfile2
このあと、fallocateコマンドで再作成できる。



## githubの設定
コンテナ内からのアクセスでは認証方法についてもっと理解する必要がある。
gitと秘密鍵で検索　もう少し調べること
httpsでトークンによる認証とsshと秘密鍵の方法がある。
httpsでのトークンは、通常のパスワードと同様の感覚でつかえそう。トークンは忘れたら再作成。

https://qiita.com/katakaku/items/2c4fe3d6a9098fec9194

https://tech-blog.rakus.co.jp/entry/20221223/ssh


## VS Codeのインストール

ブラウザでvscodeを検索。Linux用debファイルをダウンロード。
右クリックでインストールを選択。または、sudo dpkg -i でインストール。


## 画像ビューア(gthumb)のインストール



```
sudo apt install gthumb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/1a84b427-aab8-2860-e927-a7710ce96704.png)

## samba共有フォルダを作る
ラズベリーパイ超入門改定６版 ファイル共有サーバーとして使うを一部参考に途中まで作業し挫折。


## 別のUbuntuとファイル共有（操作）
Ubuntuのファイラーでほかの場所を選ぶ。右下のサーバーへ接続のところに、
ssh://192.168.0.＊＊ と入力。接続先のIDとパスワードを入れるとGUIでアクセス出来る。簡単。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/75763b0b-1312-0a35-c0b6-07abd7dc46de.png)


以下を参考
https://minoru.okinawa/archives/824


ubuntu22にはセキュリティ対策で、ssh-serveがインストールされていない。
以下を参考にインストールする。
```
sudo apt update
sudo apt install openssh-server
```


https://qiita.com/akikito/items/b081164d83476c38cf8c