Ubuntu 20.04 LTS (Focal Fossa) から Ubuntu 20.10 (Groovy Gorilla) へアップグレードする

## 概要

- Ubuntu 20.04 LTS (Focal Fossa) から Ubuntu 20.10 (Groovy Gorilla) へアップグレードする
- 外部から ssh にて接続した状態でアップグレードを実施する

## アップグレード前のバージョンを確認

20.04 focal になっていることを確認。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.1 LTS
Release:	20.04
Codename:	focal
```

## アップグレード前のパッケージリポジトリを確認

sources.list にて focal が指定されていることを確認。

```
$ grep ^deb /etc/apt/sources.list
deb http://jp.archive.ubuntu.com/ubuntu focal main restricted
deb http://jp.archive.ubuntu.com/ubuntu focal-updates main restricted
deb http://jp.archive.ubuntu.com/ubuntu focal universe
deb http://jp.archive.ubuntu.com/ubuntu focal-updates universe
deb http://jp.archive.ubuntu.com/ubuntu focal multiverse
deb http://jp.archive.ubuntu.com/ubuntu focal-updates multiverse
deb http://jp.archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu focal-security main restricted
deb http://security.ubuntu.com/ubuntu focal-security universe
deb http://security.ubuntu.com/ubuntu focal-security multiverse
```

## アップグレード前の外部パッケージリポジトリを確認

今回の環境では Node.js 用の外部パッケージリポジトリとして [NodeSource](https://nodesource.com/) を設定してある。
/etc/apt/sources.list.d 以下のファイル等を確認する。

```
$ cat /etc/apt/sources.list.d/*
deb https://deb.nodesource.com/node_14.x focal main
deb-src https://deb.nodesource.com/node_14.x focal main
```

```
$ dpkg -l | grep nodejs
ii  nodejs    14.15.3-deb-1nodesource1    amd64    Node.js event-based server-side javascript engine
```

## アップグレード前のパッケージを更新

パッケージ構成を綺麗にしておく。

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade
$ sudo apt autoremove
$ sudo reboot
```

## update-manager の準備

update-manager-core パッケージをインストールする。

```
$ sudo apt install update-manager-core
```

/etc/update-manager/release-upgrades ファイルにて Prompt=normal を指定する。

```
$ cat /etc/update-manager/release-upgrades
# Default behavior for the release upgrader.

[DEFAULT]
# Default prompting and upgrade behavior, valid options:
#
#  never  - Never check for, or allow upgrading to, a new release.
#  normal - Check to see if a new release is available.  If more than one new
#           release is found, the release upgrader will attempt to upgrade to
#           the supported release that immediately succeeds the
#           currently-running release.
#  lts    - Check to see if a new LTS release is available.  The upgrader
#           will attempt to upgrade to the first LTS release available after
#           the currently-running one.  Note that if this option is used and
#           the currently-running release is not itself an LTS release the
#           upgrader will assume prompt was meant to be normal.
Prompt=normal
```

## アップグレードできるバージョンが存在するか確認

```
$ sudo do-release-upgrade -c
Checking for a new Ubuntu release
New release '20.10' available.
Run 'do-release-upgrade' to upgrade to it.
```

## アップグレードを実施

今回は外部から ssh で接続した状態でアップグレードを実施するため、必要に応じてファイアウォールの 1022 ポートを開けておく。

```
$ sudo iptables -I INPUT -p tcp --dport 1022 -j ACCEPT
```

```
$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:1022
(以下略)
```

アップグレードを実施。

```
$ sudo do-release-upgrade
Checking for a new Ubuntu release
(中略)
パッケージマネージャーをチェック中です

SSH経由で実行していますが、続けますか？


このセッションはSSH上で実行されているようです。アップグレードをSSH越しに行うことは推奨されません。アップグレードに失敗した時の復元が困難になるからです。

続行する場合、追加のSSHデーモンをポート '1022' で起動します。
本当に作業を進めてよろしいですか？

続行する[yN] y
```

```
予備のsshdを開始します

障害が起こったときに復旧しやすくするため、ポート '1022' でもう一つの sshd
を開始します。現在実行中のsshにおかしなことが起きても、もう一方のポートに接続することができます。

ファイアウォールを実行している場合、このポートを一時的に開く必要があります。この操作は、潜在的な危険があるため自動的には行われません。以下の例のようにしてポートを開けます:
'iptables -I INPUT -p tcp --dport 1022 -j ACCEPT' 

続けるには [ENTER] キーを押してください
```

```
リポジトリ情報のアップデート

サードパーティが提供するリポジトリを使わない設定にしました

sources.list にあるサードパーティが提供するリポジトリを使わない設定にしました。アップグレード完了後、'ソフトウェアソース'
ツールもしくはパッケージマネージャーを使って再び利用可能な設定にすることができます。

続けるには [ENTER] キーを押してください
```

```
アップグレードを開始しますか？


3 個のインストール済みパッケージは Canonical
によってサポートされなくなりました。ただしコミュニティからのサポートは受けることができます。

2 個のパッケージが削除されます。 97 個の新規パッケージがインストールされます。 503 個のパッケージがアップグレードされます。

合計 814 M をダウンロードする必要があります。 このダウンロードは 1Mbit DSL 接続で約 1 時間 43 分 、56k
モデムで約 1 日 7 時間 かかります。 

アップグレードの取得とインストールには数時間かかることがあります。ダウンロードが完了してしまうと、処理はキャンセルできません。

 続行する[yN]  詳細 [d]
```

```
システムのアップグレードが完了しました。

再起動が必要です

アップグレードを完了するには再起動が必要です。
'Y' を選択すると再起動します。

続行する[yN] y
```

## アップグレード後のバージョンを確認

ssh で再接続しバージョンを確認。
20.10 groovy になっていることを確認。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.10
Release:	20.10
Codename:	groovy
```

## アップグレード後のパッケージリポジトリを確認

sources.list にて groovy が指定されていることを確認。

```
$ grep ^deb /etc/apt/sources.list
deb http://jp.archive.ubuntu.com/ubuntu groovy main restricted
deb http://jp.archive.ubuntu.com/ubuntu groovy-updates main restricted
deb http://jp.archive.ubuntu.com/ubuntu groovy universe
deb http://jp.archive.ubuntu.com/ubuntu groovy-updates universe
deb http://jp.archive.ubuntu.com/ubuntu groovy multiverse
deb http://jp.archive.ubuntu.com/ubuntu groovy-updates multiverse
deb http://jp.archive.ubuntu.com/ubuntu groovy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu groovy-security main restricted
deb http://security.ubuntu.com/ubuntu groovy-security universe
deb http://security.ubuntu.com/ubuntu groovy-security multiverse
```

## アップグレード後の外部パッケージリポジトリを設定

/etc/apt/sources.list.d 以下のファイルを確認する。
ファイルが増えていたり、中身がコメントアウトされていたりする。

```
$ ls -1 /etc/apt/sources.list.d
nodesource.list
nodesource.list.distUpgrade
```

```
$ cat /etc/apt/sources.list.d/nodesource.list
# deb https://deb.nodesource.com/node_14.x groovy main # groovyへのアップグレード時に無効化されました
# deb-src https://deb.nodesource.com/node_14.x groovy main # groovyへのアップグレード時に無効化されました
```

```
$ cat /etc/apt/sources.list.d/nodesource.list.distUpgrade
deb https://deb.nodesource.com/node_14.x focal main
deb-src https://deb.nodesource.com/node_14.x focal main
```

/etc/apt/sources.list.d 以下のファイルを Ubuntu 20.10 (Groovy Gorilla) 用に書き換えて整理する。

```
$ cat /etc/apt/sources.list.d/*
deb https://deb.nodesource.com/node_14.x groovy main
deb-src https://deb.nodesource.com/node_14.x groovy main
```

外部パッケージリポジトリに接続できているか確認する。

```
$ sudo apt update
ヒット:1 http://jp.archive.ubuntu.com/ubuntu groovy InRelease
取得:2 http://jp.archive.ubuntu.com/ubuntu groovy-updates InRelease [110 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu groovy-backports InRelease [101 kB]
取得:4 http://security.ubuntu.com/ubuntu groovy-security InRelease [110 kB]
取得:5 https://deb.nodesource.com/node_14.x groovy InRelease [4,584 B]
取得:6 https://deb.nodesource.com/node_14.x groovy/main amd64 Packages [768 B]
327 kB を 2秒 で取得しました (164 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
パッケージはすべて最新です。
```

必要に応じてパッケージを更新する。

```
$ sudo apt upgrade
```

## 参考資料

- [GroovyUpgrades \- Community Help Wiki](https://help.ubuntu.com/community/GroovyUpgrades)
- [Upgrades \- Community Help Wiki](https://help.ubuntu.com/community/Upgrades)
- [UpgradeNotes \- Community Help Wiki](https://help.ubuntu.com/community/UpgradeNotes)
- [How To Upgrade Ubuntu To 20\.10 \- LinuxConfig\.org](https://linuxconfig.org/how-to-upgrade-ubuntu-to-20-10)
- [Ubuntuをコマンドでバージョンアップしよう！ \| basalla100\.site](https://basalla100.site/?p=614)
- [Ubuntu Manpage: sources\.list \- APT のデータ取得元の設定リスト](http://manpages.ubuntu.com/manpages/groovy/ja/man5/sources.list.5.html)
- [Ubuntu Manpage: do\-release\-upgrade \- upgrade operating system to latest release](http://manpages.ubuntu.com/manpages/focal/en/man8/do-release-upgrade.8.html)
- [Ubuntu – focal の update\-manager\-core パッケージに関する詳細](https://packages.ubuntu.com/focal/update-manager-core)
- [For mission\-critical Node\.js applications \- NodeSource](https://nodesource.com/)
- [GitHub \- nodesource/distributions: NodeSource Node\.js Binary Distributions](https://github.com/nodesource/distributions)