Ubuntu 22.04 LTS セットアップ


# はじめに

長らく使っていた(~~放置していた~~)Ubuntu 18.04 のEOSLを過ぎてしまい、新しくパッケージを入れようにもトラブルに見舞われることが多くなったため22.04へアップグレードしました。その時のメモを未来の私に向けて残します:writing_hand:

この記事の操作を一通り実行すれば、サーバや開発環境の基礎を構築できる内容にまとめています。また、この手順でうまくいかなかったときのヒントになることを期待して、私の`おま環`ではうまくいかなかった方法を記載しています。このメモが皆さんのお役に立てれば幸いです:relaxed:

# システム要求

OSのアップデートがサーバアプリケーションや開発環境に影響しないようなシステムを目指します。

- OSにインストールするソフトウェアは最小限にする
- サーバアプリケーションと必要なパッケージは、Dockerイメージにセットアップしコンテナとして動作させる
- 開発環境は、Dockerイメージにセットアップしコンテナとして動作させる
- プロキシを経由してインターネットに接続する

# OS

## Try1 - 18.04 > 20.04 > 22.04 (失敗)

18.04 から 22.04 へアップグレードするには、20.04 を経由する必要があり、まずは 20.04へアップグレードします。

```bash
sudo apt update -y
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove -y
sudo apt clean -y
sudo do-release-upgrade
# 下記 do-release-upgrade.log 参照
```

:::note info
updateでパッケージサーバ見つからない、証明書の有効期限が切れているなどエラーが出る場合 `/etc/apt/sources.list` のリポジトリ・証明書の有効期限が切れているものを外し、代わりに `http://jp.archive.ubuntu.com/ubuntu bionic InRelease` を追加します
:::


:::note warn
update と upgrade、autoremoveで更新が生じない状態にしても以下のメッセージが出てうまくいかず:innocent:

```do-release-upgrade.log
Please install all available updates for your release before upgrading.
```
:::

参考にした外部サイト：

https://skydum.hatenablog.com/entry/2023/05/27/224314

https://qiita.com/hidenorly/items/554c4cfbac562c030077

## Try2 - Ubuntu 22.04クリーンインストール (成功)

### メディア作成

Ubuntu のHPからUbuntu 22.04のイメージファイルをダウンロードします。
セットアップした当時23.10が既にリリースされていましたが、技術資料も最新版よりLTSの方が見つけやすく、また、不要なトラブルを避けるため安定板のLTSを使用します。

https://ubuntu.com/download/desktop

USBメモリや外付けSSDをインストールメディアにセットアップします。DVDやBlu-ray Discでも問題ないですが、DVDは多層型でなければ容量が不足します。
セットアップは、balenaEtcher を使用します。balenaEtcherは、マルチプラットフォームに対応しています。DVDやBlu-ray Discは、OSが提供する書き込み機能を使用します。以降外付けSSDを使用する方法を記載します。
以下のサイトからOSとアーキテクチャに合ったインストーラをダウンロードします。

https://github.com/balena-io/etcher/releases

セットアップするメディアをPCに接続します。
balenaEtcherを起動し、
balenaEtcher の `Flash from file` > ダウンロードしたimgファイルを選択 > `Select target` > インストールメディにするストレージを選択 > `Flash` > `Flash Complete!` となれば閉じる

### インストール (2025/1/22 追記)

:::note alert
- インストールを終えるまで、BIOS の `Secure Boot` と `Fast Boot` を `Disabled` に変更します (メニュー名とメニューの有無は、メーカによって異なります)
- `Installation Type` では、システムディスクのバックアップを取りクリーンインストールを選択する、もしくは、マルチブートを選択します
#この記事ではクリーンインストールを選択します
#クリーンインストールを推奨します
- 社外持ち出しするようなPC等ファイルシステムを暗号化する場合、クリーンインストールになります (後から暗号化する方法もありますが、試したことがありません)
:::

インストールするPCにインストールメディを接続し、Bootメニューからインストールメディアを選択します (ブートメニューが無い場合は、BIOS でブートする順番を入れ替えます)

`Try or Install Ubuntu` > 言語一覧から　`English` を選択 > `Install Ubuntu` > キーボードレイアウト一覧から `Japanese(左のリスト)` の `Japanese(右のリスト)` を選択 > `Continue` > `Minimal installation` **のみ**を選択 > `Erase disk and install Ubuntu`

:::note info
* ファイルシステムを暗号化する場合、 `Installation Type` の `Advanced features` > `Erase disk and use ZFS` と `Encrypt the new Ubuntu installation for security` を選択します
:::

`Install Now` > `Time zone` で日本近辺を選択し  `Tokyo` に変更 > `Continue` > `Create User Account` の各項目を入力 > `Continue` > インストール完了後 `Restart Now` > インストールメディを取り除く

:::note info
* ファイルシステムを暗号化する場合、 `Install Now` の後に、`Choose a security key:` にパスフレーズを入力 > `Enable recovery key` を選択 > `Install Now` を操作します
:::

:::note warn
- `Updates and other software` の `Download updates while installing Ubuntu` は、プロキシ設定がなく失敗するため選択しません
- `Updates and other software` の `Install third-party software for graphics and Wi-Fi hardware and additional media formats` は、NVIDIAドライバーが適切な組み合わせでインストールされず、どのみち再インストールが必要になるため選択しません
#これを外すとKernelブート中のエラーが減りました
:::

:::note alert
お使いのPC (特にラップトップパソコン) によっては、 `Restart Now` で再起動した後、ロゴ表示のところでフリーズしブートに失敗する場合があります。この場合、以下を操作しOSをブートさせます。2回目以降は何もせずとも起動しました。

再度電源を入れ直し > `Shift` キーを連打し `GRUB` メニューを表示 > `Advanced options for Ubuntu ***` を選択 > `Ubuntu *** (recovery mode)` を選択 > `resume` を選択
:::

参考になる外部サイト：

https://phoenixnap.com/kb/ubuntu-22-04-lts

https://pc.watch.impress.co.jp/docs/column/ubuntu/1471435.html

https://jumpcloud.com/blog/how-to-enable-full-disk-encryption-ubuntu-22-04

### メディア初期化

インストールメディアをストレージに戻します。
Windows PCにインストールメディアを接続し、Windows PCのコマンドプロンプトを管理者権限で起動します。

```cmd
diskpart
REM 下記 diskpart.log 参照
```

DISKPARTのプロンプトで以下のコマンドを実行します。

:::note alert
- `select disk`の`1`はインストールメディアを間違えずに指定します(番号は環境によって変わるので注意)
:::

:::note info
- `assing letter`の`E`は適宜変更します
- `format fs`の`exfat`は適宜変更します
:::

```diskpart.log
Microsoft DiskPart バージョン 10.0.19041.3636

Copyright (C) Microsoft Corporation.
コンピューター: PC-HOGE

DISKPART> list

Microsoft DiskPart バージョン 10.0.19041.3636

DISK        - ディスクの一覧を表示します。例: LIST DISK
PARTITION   - 選択したディスクのパーティションの一覧を表示します。
              例: LIST PARTITION
VOLUME      - ボリュームの一覧を表示します。例: LIST VOLUME
VDISK       - 仮想ディスクの一覧を表示します。

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           476 GB      0 B        *
  ディスク 1    オンライン          3725 GB  1024 KB        *

DISKPART> select disk 1

ディスク 1 が選択されました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ             4779 MB    32 KB
  Partition 2    システム              5034 KB  4779 MB
  Partition 3    プライマリ              300 KB  4784 MB
  Partition 4    不明                3721 GB  4786 MB

DISKPART> select partition 1

パーティション 1 が選択されました。

DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。

DISKPART> select partition 2

パーティション 2 が選択されました。

DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。

DISKPART> select partition 3

パーティション 3 が選択されました。

DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。

DISKPART> select partition 4

パーティション 4 が選択されました。

DISKPART> delete partition override

DiskPart は選択されたパーティションを正常に削除しました。

DISKPART> list partition

このディスクには表示するパーティションがありません。

DISKPART> create partition primary

DiskPart は指定したパーティションの作成に成功しました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
* Partition 1    プライマリ             3725 GB  1024 KB

DISKPART> assign letter=E

DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

DISKPART> format fs=exfat quick

  100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

DISKPART> exit

DiskPart を終了しています...
```

参考になる外部サイト：

https://jisaku-pc.net/hddnavi/force-protected.html

https://www.partitionwizard.jp/partitionmagic/diskpart-create-partition.html

# ディスプレイマネージャー

Ubuntu 20.04まではX11がデフォルトのディスプレイマネージャーでした。22.04からはWaylandに変更されています。リモートデスクトップは、X11を使う部分もあり、技術資料もX11が揃っています。対して、Waylandは成熟の部分では懸念が残ります。トラブルを避けるためディスプレイマネージャーをX11に変更します。

`Power Off/Logout` > `Logout` > ユーザ選択 > `右下の歯車アイコン` > `Ubuntu on Xorg`(表示が多少異なるかも) > ユーザのパスワードを入力

:::note warn
画面が真っ白になった場合は、`Windowsキー` > `terminal`と入力 > `Enterキー` でターミナルを開き以下を実行します。
```bash
sudo reboot
```
:::

Ubuntu PCのデスクトップの `Settings` > `About`

`Windows System` が `X11` になっていることを確認します。
ビデオドライバがインストールされていなければ表示解像度が1024 x 768に変更されます。
ビデオドライバのインストールは、[GPU関係](#GPU関係) に記載します。

# プロキシ
セットアップに使用するソフトウェアのプロキシを設定します。

## GNOME(NetworkManager)
これを設定すればブラウザ(Firefox)でWebを閲覧できます(=Qiitaにアクセスでき、このページを見ながら作業できる！)。

Ubuntu PCのデスクトップの `Settings` > `Network` > `Network Proxy`
`Manual` に変更し、`HTTP Proxy`、`HTTPS Proxy`、`FTP Proxy`、`Socks Proxy` のプロキシサーバとポートを入力

:::note info
- プロキシサーバのプロトコル指定(例: `http://`)は不要です
- `Ignore Hosts` は任意に設定します
:::

## Shell

:::note info
`vproxy_server`と`vproxy_port`の値はネットワーク環境に合わせて変更します。
:::

```bash
vproxy_server=hoge
vproxy_port=foo
sudo touch /etc/profile.d/proxy.sh
echo "MY_PROXY_URL='http://${vproxy_server}:${vproxy_port}'" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
echo "HTTP_PROXY=\$MY_PROXY_URL" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
echo "HTTPS_PROXY=\$MY_PROXY_URL" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
echo "http_proxy=\$MY_PROXY_URL" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
echo "https_proxy=\$MY_PROXY_URL" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
echo "ftp_proxy=\$MY_PROXY_URL" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
echo "export HTTP_PROXY HTTPS_PROXY http_proxy https_proxy ftp_proxy" | sudo tee -a /etc/profile.d/proxy.sh > /dev/null
source /etc/profile.d/proxy.sh
```

## apt

```bash
sudo touch /etc/apt/apt.conf.d/90proxy
echo 'Acquire::http::proxy "'${http_proxy}'";' | sudo tee -a /etc/apt/apt.conf.d/90proxy > /dev/null
echo 'Acquire::https::proxy "'${https_proxy}'";' | sudo tee -a /etc/apt/apt.conf.d/90proxy > /dev/null
echo 'Acquire::ftp::proxy "'${ftp_proxy}'";' | sudo tee -a /etc/apt/apt.conf.d/90proxy > /dev/null
echo 'Acquire::socks::proxy "'${http_proxy}'";' | sudo tee -a /etc/apt/apt.conf.d/90proxy > /dev/null
```

## sudo

```bash
sudo su -
visudo -f /etc/sudoers
# 下記 /etc/sudoers.log 参照
exit
```

追記する内容

```/etc/sudoers.log
Defaults env_keep+="HTTP_PROXY"
Defaults env_keep+="HTTPS_PROXY"
Defaults env_keep+="NO_PROXY"
Defaults env_keep+="EDITOR"
```

# エディタ
システムのデフォルトエディタを指定します。CUI上で起動するものを指定します。

:::note info
`vim` は好みに合わせて変更します。
:::

```
sudo apt update
sudo apt install -y vim
sudo update-alternatives --set editor /usr/bin/vim.basic
```

# 必須パッケージ

インストール作業で要求される機会が多いパッケージと、リモートアクセスのパッケージをインストールします。

```bash
sudo apt install -y gcc make cmake curl wget ssh
```

# 日本語入力

```bash
sudo apt install -y fonts-ipafont fonts-ipaexfont
sudo apt install -y fcitx fcitx-mozc
im-config -n fcitx
sudo reboot
```

デスクトップ上のターミナルで以下のコマンドを実行します。

```
im-config
```

`OK` > `No` > `OK` と選択

```
sudo apt install -y fcitx-config-gtk
sed -i "/EnabledIMList/s/mozc:False/mozc:True/g" ~/.config/fcitx/profile
fcitx-configtool mozc
```

`Input Method Configuration` のリストを上から順に以下の通りに設定します。

1. Keyboard - Japanese
2. Mozc

:::note info
`Mozc` は `Add input method` で `Only Show Current Language` のチェックを外すと表示されます。
:::

:::note warn
`Add input method` に `English` があると動作しない場合があるので必要でなければ削除します。
:::

`Global Config` > `Trigger Input Method` を `Zenkakuhankaku` and/or `Ctrl`+`Zenkakuhankaku` に変更します。

# GPU関係

モニタの出力にNVIDIAのGPUを搭載しているビデオカードを使う場合や、GPGPUを使う場合にインストールします。

## NVIDIA Driver (2025/1/24 追記)

### Try1 - インストールスクリプト (失敗)

マシンにインストールされているビデオカードの型番を調べます。
```
lspci | grep -i nvidia
```

以下のサイトから型番とアーキテクチャを指定してインストールします。

https://www.nvidia.co.jp/Download/index.aspx?lang=jp

```
cd Downloads/
chmod u+x NVIDIA-Linux-x86_64-550.54.14.run
```
コンソールモードへ移ります。
`Ctrl`+`Alt`+`F6`

:::note info
コンソールモードから戻る場合 `Ctrl`+`Alt`+`F2`
:::

```
sudo ./NVIDIA-Linux-x86_64-550.54.14.run
```

:::note warn
ビルドに失敗、ログでは非対応オプションを指定しているようなエラーが出力され、解決策を見つけられず断念...
:::

参考にした外部サイト：

https://qiita.com/porizou1/items/74d8264d6381ee2941bd

### Try2 - 手操作 (成功)

:::note warn

#### Nouveau の無効化(要否不明)

```bash
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
# 下記 /etc/modprobe.d/blacklist-nouveau.conf 参照
```

nouveauの設定ファイルを新規作成して以下を記入して保存します。

``` /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
```

保存後、以下を実行します。

```bash
sudo update-initramfs -u
```
:::

利用可能なドライバーを表示します。

```bash
ubuntu-drivers devices
# 下記 ubuntu-drivers.log 参照
```

```ubuntu-drivers.log
(中略)
driver   : nvidia-driver-535 - distro non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-550 - distro non-free recommended
(中略)
```

Docker コンテナ上で GPU をフル活用するアプリケーション、例えば NVIDIA Omniverse 関連のアプリケーションを使う場合は、 `535-server` のような `server` がついているバージョンを選択します。その予定がない場合は、 `recommended` されているバージョンを選択します。
`DRIVER_BRANCH=xxx` の値をバージョンに置き換えて実行します。

```bash
DRIVER_BRANCH=xxx
sudo ubuntu-drivers install nvidia:${DRIVER_BRANCH}
sudo ubuntu-drivers install --gpgpu nvidia:${DRIVER_BRANCH}-server
sudo apt install -y nvidia-utils-${DRIVER_BRANCH}-server
sudo apt install -y nvidia-fabricmanager-${DRIVER_BRANCH} libnvidia-nscq-${DRIVER_BRANCH}
sudo apt install -y linux-modules-nvidia-${DRIVER_BRANCH}-generic
sudo apt-cache policy linux-modules-nvidia-${DRIVER_BRANCH}-$(uname -r)
# 下記 apt-cache.log 参照
```

インストールしたバージョンを確認します(以下参考)。

```apt-cache.log
linux-modules-nvidia-535-6.5.0-18-generic:
  Installed: (none)
  Candidate: 6.5.0-18.18~22.04.1
  Version table:
     6.5.0-18.18~22.04.1 500
        500 http://jp.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages
        500 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages
```

```bash
sudo apt install -y linux-headers-generic
sudo apt-cache policy linux-headers-$(uname -r)
# 下記 apt-cache.log 参照
```

インストールしたバージョンを確認します(以下参考)。

```apt-cache.log
linux-headers-6.5.0-18-generic:
  Installed: 6.5.0-18.18~22.04.1
  Candidate: 6.5.0-18.18~22.04.1
  Version table:
 *** 6.5.0-18.18~22.04.1 500
        500 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
        100 /var/lib/dpkg/status
```

```bash
sudo apt install nvidia-driver-${DRIVER_BRANCH}
sudo apt install nvidia-fabricmanager-${DRIVER_BRANCH} libnvidia-nscq-${DRIVER_BRANCH}
```

参考になる外部サイト：

https://ubuntu.com/server/docs/nvidia-drivers-installation

## NVIDIA CUDA

:::note warn
バージョンが異なる2つ以上ドライバをインストールしていると cuda-driversのインストールに失敗します。古い方を以下のコマンドで削除します。`EXT_DRIVER_BRANCH` の値は、削除するバージョンに置き換えます。

```bash
dpkg -l | grep nvidia-driver
# 下記dpkg.log参照
EXT_DRIVER_BRANCH=XXX
sudo apt --purge remove -y '*nvidia*${EXT_DRIVER_BRANCH}*'
sudo apt autoremove -y
```

```dpkg.log
ii  nvidia-driver-XXX                          XXX.YY.ZZ-0ubuntu1                      amd64        NVIDIA driver metapackage
```
:::

以下のサイトからインストールしたドライバに対応する CUDA Toolkit のバージョンを確認します。

https://docs.nvidia.com/datacenter/tesla/index.html

サイト左側の `R535 Driver Release Notes` など `DRIVER_BRANCH` に指定したバージョンのメニューから `Version 535.230.02 (Linux)/539.19(Windows)` など `Linux` が含まれる項目を選択 > `1.1. Software Versions` の `CUDA Toolkit 12: 12.2.2` を確認

以下のサイトから CUDA Toolkit のインストールコマンドを確認します。

https://developer.nvidia.com/cuda-toolkit-archive

調べた `CUDA Toolkit 12: 12.2.2` と同じメニューを選択 > `Linux` > CPUのアーキテクチャを選択 > `Ubuntu` > `22.04` > `Installer Type` に `deb(network)` を選択

以下のようなインストールコマンドが表示されます。コマンドは、`sudo apt-get install -y cuda-drivers` のようにバージョンを省略している場合があります。意図せぬバージョンがインストールされますので、バージョンを指定します。

```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-2
sudo apt-get install -y cuda-drivers-${DRIVER_BRANCH}
```

一旦ログアウトし、再度ログインします。

:::note warn
* `sudo apt-get -y install cuda-toolkit-12-3` がパッケージダウンロードに失敗する場合があり、その場合は何度かトライします
* サイトに表示されるコマンドをそのまま実行して、ドライババージョンの依存関係エラーが発生した場合、以下を実行します
```bash
sudo apt install -y libnvidia-fbc1-${DRIVER_BRANCH} libnvidia-cfg1-${DRIVER_BRANCH} xserver-xorg-video-nvidia-${DRIVER_BRANCH} libnvidia-encode-${DRIVER_BRANCH} libnvidia-decode-${DRIVER_BRANCH} libnvidia-extra-${DRIVER_BRANCH} libnvidia-compute-${DRIVER_BRANCH}
sudo apt --fix-broken install
sudo apt autoremove 
sudo apt install -y nvidia-driver-${DRIVER_BRANCH}
sudo apt-get install -y cuda-drivers-${DRIVER_BRANCH}
sudo apt autoremove 
```
:::

## ドライバをアンインストールする方法

:::note alert
この手順は、一度ドライバをインストールしたもののアプリケーションが対応していなかった場合などに再インストールする人向けです。
以下をアンインストールします。

* NVIDIA Driver
* CUDA Driver
* CUDA Toolkit
* NVIDIA Docker 2

```bash
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \
 "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"
sudo apt-get autoremove
```

アンインストール後、再起動します。
:::



# リモートデスクトップ

いずれか1つしか機能せず、1つを選ぶことになります。どれも一長一短です。

## 実機でログインしている場合に機能 (2025/2/14 追記)

Ubuntu22.04 の標準デスクトップ環境に備わっている GNOME Remote Desktop を使用します。

### 実機でログインしデスクトップ表示している場合に機能

Ubuntu PCのデスクトップの `Settings` > `Sharing` > タイトルバーのスイッチを `ON` に切り替え
続いて、`Remote Desktop` > `Remote Desktop` を `ON`、`Remote Control` を `ON`、`Password` にパスワードを入力

:::note info
ランダムなパスワードがデフォルトで設定されていますので、任意に変更します。
:::

参考になる外部サイト：

https://qiita.com/yamasakk/items/30447ab2fefcbb8bb67a

### 実機でログインしてスクリーンロックしている場合も機能

先に、[実機でログインしデスクトップ表示している場合に機能](##実機でログインしデスクトップ表示している場合に機能) を設定します。

#### Try1 - Gnome Shell Extension Manager (失敗)

```bash
sudo apt install gnome-shell-extension-manager
extension-manager
```

:::note warn
Extension managerのタブを `Browse` に切り替えるとCore dumpが発生し落ちました:sob:
:::

参考にした外部サイト：

https://zenn.dev/2lu3/articles/10302b5d8aca0a

#### Try2 - Gnome Shell Extensions (成功)

:::note warn
`gnome-shell-extension-manager` をインストールしている場合は、アンインストールします。

```bash
sudo apt --purge remove -y gnome-shell-extension-manager
sudo apt autoremove -y
```

一旦ログアウトし、再度ログインします。

:::

```bash
sudo apt update
sudo apt install -y gnome-shell-extensions
```

デスクトップからログアウトし、再度ログインします。
ログイン後Firefoxを立ち上げ以下のURLにアクセスします。

https://addons.mozilla.org/en-US/firefox/addon/gnome-shell-integration/

ページの`Add to Firefox`を実行します。
アドオンをインストール後ターミナルで以下のコマンドを実行します。

```bash
sudo apt install -y chrome-gnome-shell
```

Firefoxを立ち上げてExtensionをインストールします。

`Addon(ピースアイコン)` > `GNOME Shell Integration` > 検索欄に `allow locked` と入力 > `Allow Locked Remote Desktop` > `ON` > `Install`

参考になった外部サイト：

https://linuxconfig.org/how-to-install-gnome-shell-extensions-on-ubuntu-22-04-jammy-jellyfish-linux-desktop

### リモートデスクトップ接続におけるキー入力諸問題

[実機でログインしている場合に機能](##実機でログインしている場合に機能) のいずれかの方法でWindowsクライアントからリモートデスクトップ接続を行うと、以下の問題が発生しましたので、その対処方法を紹介します。

#### 半角入力と全角入力が高速に切り替わる問題の対処

[日本語入力](#日本語入力) で設定した切り替えキー `Zenkakuhankaku` を押すと、`Mozc` が点滅し、半角入力と全角入力が高速に切り替わります。対処方法は次の通りです。

```bash
cat << EOS >> ~/.profile
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
export DefaultIMModule=fcitx
xset -r 49 # 半角全角点滅防止
EOS
source ~/.profile
```

参考にしたサイト：

https://qiita.com/dozo/items/97ac6c80f4cd13b84558

#### 日本語キーボード配列の `|` (パイプ) を入力できない問題の対処

Ubuntu PCのキーボードの `Shift` + `|` キーを押せばパイプ文字を入力できますが、リモートデスクトップ接続しているWindows PCのキーボードの `|` キーを押しても反応がなく、キーイベントを確認する `xev` コマンドにおいてもイベント入力を受け付けません。リモートデスクトップクライアントからキーイベントが送信されていないような挙動です。
対処方法を調べると、レジストリをいじる方法や、英語版IMEを使用する方法などありましたが、そもそもイベントが送られていないようなので、効果なしです。
結局、キー割り当てを変える方法を採りました。チルダ文字は、`Shift` + `0` と `Shift` + `^` とに割り当たっているため、`Shift` + `0` を `|` に割り当てます。`0` の `keycode` は `19` です。割り当て方は次の通りです。他のキーを割り当てる場合は、`xev` コマンドで `keycode` を調べてください。

```bash
xmodmap -pke | grep 'keycode  19' > ~/.Xmodmap
cp ~/.Xmodmap ~/.Xmodmap.org
vim ~/.Xmodmap
# 下記 ~/.Xmodmap 参照
echo 'xmodmap ~/.Xmodmap' >> ~/.bashrc 
source ~/.bashrc 
```

```~/.Xmodmap
keycode  19 = 0 bar 0 parenright
```

:::note warn
`xmodmap ~/.Xmodmap` で割り当てるキーをすべてにするとターミナルを立ち上げる度に非常に時間がかかるため、`grep`で絞り込みます。
:::


参考にしたサイト：

http://bluearth.cocolog-nifty.com/blog/2018/07/os-f061.html

## 実機でログアウトしている場合に機能

先に、[実機でログインしデスクトップ表示している場合に機能](##実機でログインしデスクトップ表示している場合に機能) を設定します。

```bash
sudo apt install -y xrdp
sudo ufw allow 3389
sudo systemctl status xrdp
```

ログインし直し、以下のコマンドでxrdpサーバが正常に実行されているか確認します。

```bash
sudo systemctl restart xrdp
sudo systemctl status xrdp
```

ログインし直し、勝手に書き換わるパスワードを再設定します。

`Settings` > `Sharing` > `Remote Desktop` > `Password`にパスワードを入力

参考になる外部サイト：

https://askubuntu.com/questions/1407444/ubuntu-22-04-remote-desktop-headless/1409120#1409120

### サーバ・クライアント間のクリップボード共有

```bash
sudo sed -i -e '/FuseMountName/s/thinclient_drives/shared-drives/g' /etc/xrdp/sesman.ini
```

## いつでも機能 (Xfceデスクトップ)

実機のログイン有無関係なくリモートデスクトップを利用できますが、デスクトップがXfceになり、ウィンドウメニューやコピー＆ペーストなど不都合が生じます。

```bash
sudo apt update
sudo apt install xrdp -y
sudo ufw allow 3389
sudo systemctl status xrdp
```

```bash
sudo adduser $USER xrdp
sudo apt install xfce4 xfce4-goodies -y
echo "xfce4-session" > ~/.xsession
sudo vim /etc/xrdp/startwm.sh
# 下記 /etc/xrdp/startwm.sh 参照
sudo reboot
```

```/etc/xrdp/startwm.sh
(略)
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession
startxfce4
```

```bash
sudo systemctl restart xrdp
sudo systemctl status xrdp
```

参考になる外部サイト：

https://reintech.io/blog/configure-remote-desktop-server-xrdp-ubuntu-22

## 接続テスト (2025/1/22 追記)

### Windows 11からUbuntu 22.04へ接続

:::note warn
WindowsデフォルトがインバウンドのICPを許可しておらず、Windows 11にpingを送っても返ってこないです。pingを試す場合は、WindowsからUbuntuへ確認します。
:::

Windows標準のリモート接続を起動し、オプションを表示し、コンピュータ名にIPアドレス (`XXX.XXX.XXX.XXX`)やホスト名を入力し、ユーザ名にUbuntuのユーザ名 (`Ubuntu-User-Name`) を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695440/49337f2d-b3bb-bb68-ba6f-4a1e3dd45235.png)

# Docker

## Docker engine

DockerコンテナからNVIDIA GPGPUを利用する場合、NVIDIA Docker 2でGPUのハードウェア仮想化が必要になります。Dockerの導入手順を紹介する記事で良く使われているdocker-ceでは、NVIDIA Docker 2をインストールする際、依存関係エラーが発生するため、docker.ioを使用します。

```bash
sudo apt-get install -y docker.io
sudo gpasswd -a $(whoami) docker
sudo chgrp docker /var/run/docker.sock
sudo mkdir -p /etc/systemd/system/docker.service.d/
sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
echo '[Service]' | sudo tee -a /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null
echo 'Environment="HTTP_PROXY='${HTTP_PROXY}'"' | sudo tee -a /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null
echo 'Environment="HTTPS_PROXY='${HTTPS_PROXY}'"' | sudo tee -a /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null
echo 'Environment="NO_PROXY='${NO_PROXY}'"' | sudo tee -a /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null
sudo reboot
docker version
# 下記 docker version.log 参照
docker run hello-world
# 下記 docker run.log 参照
```

```docker version.log
Client:
 Version:           24.0.5
 API version:       1.43
 Go version:        go1.20.3
 Git commit:        24.0.5-0ubuntu1~22.04.1
 Built:             Mon Aug 21 19:50:14 2023
 OS/Arch:           linux/amd64
 Context:           default

Server:
 Engine:
  Version:          24.0.5
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.3
  Git commit:       24.0.5-0ubuntu1~22.04.1
  Built:            Mon Aug 21 19:50:14 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.2
  GitCommit:        
 runc:
  Version:          1.1.7-0ubuntu1~22.04.2
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:        
```

```docker run.log
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete 
Digest: sha256:d000bc569937abbe195e20322a0bde6b2922d805332fd6d8a68b19f524b7d21d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

参考になる外部サイト：

https://xvideos.hatenablog.com/entry/nvidia-docker2_on_ubuntu1804

## Docker compose (2025/1/7 追記)

### プラグイン版(2025年から主流になる？)

```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-compose-plugin
docker compose version 
# 下記 docker_compose.log 参照
```

```docker_compose.log
Docker Compose version v2.32.1
```



### スタンドアロン版(～2024年ぐらいまで主流)

```bash
sudo apt install docker-compose -y
docker-compose -v
# 下記 docker-compose.log 参照
```

```docker-compose.log
docker-compose version 1.29.2, build unknown
```


## NVIDIA Docker 2

DockerコンテナからNVIDIAのビデオカード(アクセラレータ)を制御できるように設定します。

```bash
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
```

```bash
nvidia-ctk -v
# 下記 nvidia-ctk.log 参照
sudo nvidia-ctk runtime configure --runtime=docker
cat /etc/docker/daemon.json
# 下記 /etc/docker/daemon.json  参照
sudo systemctl restart docker
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
# 下記 docker.log 参照
```

```nvidia-ctk.log
NVIDIA Container Toolkit CLI version 1.14.5
commit: 9ea336070134e612145d342e495f2fc616aab063
```


```/etc/docker/daemon.json 
{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}
```

```docker.log
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
01007420e9b0: Pull complete 
Digest: sha256:f9d633ff6640178c2d0525017174a688e2c1aef28f0a0130b26bd5554491f0da
Status: Downloaded newer image for ubuntu:latest
Tue Mar  5 08:26:46 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14              Driver Version: 550.54.14      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 2080 Ti     Off |   00000000:05:00.0 Off |                  N/A |
| 25%   31C    P8             15W /  260W |      66MiB /  11264MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA GeForce RTX 2080 Ti     Off |   00000000:09:00.0 Off |                  N/A |
| 25%   33C    P8             19W /  260W |       5MiB /  11264MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+
```

参考になる外部サイト：

:::note info
インストールしているビデオカードの構成によって出力が異なります。
:::

# Visual Studio Code (VSCode)

テキストエディアとしても勿論、エクスプローラーとしても、リモート接続やDocker管理もでき非常に便利です。

:::note warn
snapでVSCodeをインストールしようと考えましたが、諸所で日本語入力ができないとの書き込みがあり、また、本家GitHubも未だissueがクローズになっていないため、従来どおりaptを使用します。

参考になる外部サイト：
https://ch-random.net/post/458/
https://qiita.com/ykmchd/items/707e5460f739c0c775d2
https://redj.hatenablog.com/entry/2020/04/30/001946
https://github.com/microsoft/vscode/issues/77382
:::

```bash
sudo apt update
sudo apt install apt-transport-https software-properties-common
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update && sudo apt install code
rm microsoft.gpg
```

:::note info
起動方法は以下のとおりです。

```bash
code
```
:::

参考になる外部サイト：

https://computingforgeeks.com/how-to-install-visual-studio-code-on-ubuntu/

## VSCode Extensions

とりあえず入れておく拡張機能をインストールします。

- Remote Development (Microsoft)
    OS関係なく別のPCにインストールされているVSCodeにリモートアクセスし、VSCodeを操作できる
- Docker (Microsoft)
    Dockerコンテナのファイルやコンソールを操作でき、かつDocker Desktopの代わりにもなる

# 最後に
Dockerを使った開発サーバの構築を以下の内容で解説しています。順次追加しますので、ご興味ある方はストックしてください:nerd:

https://qiita.com/triple3packun/items/31dfd861c0dc74cb54df

https://qiita.com/triple3packun/items/74634f4b7cc97c509e75