【ロボット】WebフロントエンジニアがDebianのOSアプデに対応して苦労した話【備忘録】

みなさんこんにちは。suginokoです。
最近はLinuxと友達になるために奮闘しています。
今年に入ってからWebフロントエンジニアなのに、Webを触ったのが２か月だけでほぼLinuxを触っています。

Raspberry Pi、Tinker Board、Jetson nanoを触ってきて、Webのフロントエンジニアだということを忘れてしまいそうになります。（肩書は何でもいいのですが）

それでは本題です。

## きっかけ
[【ロボット】Linux+Vue.js+Electron使ったトラブルシューティング【備忘録】](https://qiita.com/suginoko/items/ddf162ff7a458f1796d8)案件の延長戦です。（使わなかったけど）

ですが、今回はDebianの話しか登場しません。

以前はJetson nanoを使ってElectronの対応をしていたのですが、お客様の都合でTinker Boardに変わったので、その時に出くわしました。

ロボットとのデバッグをVNCを使って確認するべく、SSH使って入ろうとするときにパッケージがインストールできませんでした。（`apt update`も`apt upgrade`もエラー）

その理由がOSのバージョンを`lsb_release -a`で詳細を見たら、Debianのバージョンが9でした（サポートから外れていた）

サポート外はまずいので、アップデートしなければならないのでは？ということが事の始まりです。

※一応許可をもらってバージョンアップしています。

## やりたいこと
* Debian9でSSH繋げてVNCでGUIでの確認ができるようになりたい（バージョンアップの許可もらう前）
* Debianのバージョンを11まで上げたい

## スペック
* Tinker Board
    * Linux tinkerboard 4.4.132+ #1 SMP Wed Aug 21 19:15:55 CST 2019 armv7l GNU/Linux
    *  Debian GNU/Linux 9 (stretch)


## Debian9でSSH繋げてVNCでGUIでの確認ができるようになりたい
バージョンアップの許可をもらってなかったので、Debian9でSSH繋げてVNCで確認できるところまで対応してみます。

```
sudo apt update
sudo apt upgrade
```

そうしたら、もっと項目は多かったのですが大体こんな感じのエラーが出まして
```
0% [Working]Ign:1 http://security.debian.org/debian-security stretch/updates InRelease
0% [Waiting for headers]Ign:2 http://deb.debian.org/debian stretch InRelease
0% [Working]            Ign:3 http://deb.debian.org/debian stretch-updates InRelease
0% [Waiting for headers]Err:4 http://security.debian.org/debian-security stretch/updates Release
  404  Not Found
0% [Waiting for headers]Err:5 http://deb.debian.org/debian stretch Release
  404  Not Found
0% [Working]            Err:6 http://deb.debian.org/debian stretch-updates Release
  404  Not Found
```
というような感じで、404 Not Foundと出てしまい、そもそもファイルがない状態でした。

stretchのサポートは2022/06/30から切れており、stretchのリポジトリから消えたので、`archive.debian.org` に移動されたのです。

なので、aptのパッケージのリポジトリ情報が記載されている`/etc/apt/sources.list` を編集する必要がありました。

```
# バックアップ取っておく
cd /etc/apt/
sudo cp sources.list sources.list.bak

# 編集する（sedコマンドで置換するの怖くて地道にやっていた）
sudo vi sources.list
```

sources.list
before
```
deb http://http.debian.net/debian/ stretch main contrib non-free
deb-src http://http.debian.net/debian/ stretch main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free
deb http://http.debian.net/debian/ stretch-updates main contrib non-free
deb-src http://http.debian.net/debian/ stretch-updates main contrib non-free
deb http://tprd.asus.com:8000 stretch main contrib non-free
deb-src http://tprd.asus.com:8000 stretch main contrib non-free
```

after
```
deb http://archive.debian.org/debian/ stretch main contrib non-free
deb-src http://archive.debian.org/debian/ stretch main contrib non-free
deb http://archive.debian.org/debian-security// stretch/updates main contrib non-free
deb-src http://archive.debian.org/debian-security// stretch/updates main contrib non-free
deb http://tprd.asus.com:8000 stretch main contrib non-free
deb-src http://tprd.asus.com:8000 stretch main contrib non-free
```

archive.debian.orgに置き換えました。

改めて`apt update`と`apt upgrade`を試し、一応完了できました。

次にSSH繋げたいので、
```
sudo apt-get install avahi-deamon
sudo apt-get install ssh
```
しまして、

Tinker BoardのIPアドレスを確認したく`ifconfig`したかったのですがコマンドなかったので、`ip addr`コマンドでIPの確認をしました。

次にPCでの作業で、
```
ssh ユーザー名@ロボットのIPアドレス
```
でTinker Boardに接続できるか確認します。

PWまで入力できたら接続できたかと思います。

次にVNCまで繋げていこうと思います。（このへんは調べたら出るんでざっくりと）

Tinker Boardの設定でGUI設定になっているかわからなかったので
```
sudo tinker-config
```
でGUIモードに設定をします。

VNCで起動するために、Jetsonの時と同じようにx0vncserverを使おうかなと思ってましたので、
```
sudo apt install tigervnc-common tigervnc-standalone-server tigervnc-scraping-server

# PWを設定
vncpasswd
```
します。

VNCはVNCViewerを使っていたので、こちらで起動できるようにします。

新規でプロパティ作ってIPアドレスと名前を入力。

sshでTinker Boardを起動していたら
```
x0vncserver -display :0 -passwordfile ~/.vnc/passwd
```
で起動しておいて、

VNCで起動できるか確認しましょう。大体これで起動できます。

## Debianを9→10にする
Debianのバージョンを上げる許可が下りたんで、最終的には11にしたいのですが、順々に上げていきます。
先人の知恵として[ほぼこちらのサイト](https://sysrigar.com/2020/02/22/debian%E3%82%929stretch%E3%81%8B%E3%82%8910buster%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B/)に記載している内容で完了です。（ありがとうございました。）


バックアップにとっておいていた
```
/etc/apt/sources.list(.bak)
```
を元の`sources.list`に戻します。

```
deb http://http.debian.net/debian/ stretch main contrib non-free
deb-src http://http.debian.net/debian/ stretch main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free
deb http://http.debian.net/debian/ stretch-updates main contrib non-free
deb-src http://http.debian.net/debian/ stretch-updates main contrib non-free
deb http://tprd.asus.com:8000 stretch main contrib non-free
deb-src http://tprd.asus.com:8000 stretch main contrib non-free
```

stretchになっているところをbusterに置き換えます

```
deb http://http.debian.net/debian/ buster main contrib non-free
deb-src http://http.debian.net/debian/ buster main contrib non-free
deb http://security.debian.org/ buster/updates main contrib non-free
deb-src http://security.debian.org/ buster/updates main contrib non-free
deb http://http.debian.net/debian/ buster-updates main contrib non-free
deb-src http://http.debian.net/debian/ buster-updates main contrib non-free
deb http://tprd.asus.com:8000 buster main contrib non-free
deb-src http://tprd.asus.com:8000 buster main contrib non-free
```

あとは
```
apt update
apt autoremove
apt clean
apt-get upgrade
apt full-upgrade

# 最後に再起動してもらって
```

`cat /etc/debian_version` でバージョン確認してDebian10になってればOKです

## Debian10→11にする
こちらがややめんどくさく。

先人の方がいらっしゃいましたので[こちらのサイト](https://dattesar.com/bullseye-upgrade/)を参考にバージョンを上げます。

まず`/etc/apt/sources.list` を以下から
```
deb http://http.debian.net/debian/ buster main contrib non-free
deb-src http://http.debian.net/debian/ buster main contrib non-free
deb http://security.debian.org/ buster/updates main contrib non-free
deb-src http://security.debian.org/ buster/updates main contrib non-free
deb http://http.debian.net/debian/ buster-updates main contrib non-free
deb-src http://http.debian.net/debian/ buster-updates main contrib non-free
deb http://tprd.asus.com:8000 buster main contrib non-free
deb-src http://tprd.asus.com:8000 buster main contrib non-free
```

こちらに置き換えます
```
deb http://http.debian.net/debian/ bullseye main contrib non-free
deb-src http://http.debian.net/debian/ bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free
deb http://http.debian.net/debian/ bullseye-updates main contrib non-free
deb-src http://http.debian.net/debian/ bullseye-updates main contrib non-free
deb http://tprd.asus.com:8000 buster main contrib non-free
deb-src http://tprd.asus.com:8000 buster main contrib non-free
```
* `buster`は`bullseye`に置き換え
* `buster/updates`は`bullseye-security`に変更
* `bullseye-security` になっているURLは`http://security.debian.org/debian-security`に置き換え（debとdeb-src）

ここまで置き換えたら
9→10に置き換えたように
```
apt update
apt autoremove
apt clean
apt-get upgrade
apt full-upgrade

# 最後に再起動してもらって
```

を実行するのですが、色々エラーが出ました。
`apt update`や`apt-get upgrade`を試しましたが、パッケージがうまく落とせてる感じがしません。


`sudo apt full-upgrade` を叩いてみると
```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 libcogl20 : 依存: libgles2
 libegl1-mesa-dev : 依存: libegl-dev しかし、インストールされていません
 libepoxy-dev : 依存: libegl-dev しかし、インストールされていません
                依存: libgl-dev
 libgles2-mesa : 依存: libgles2
 libgles2-mesa-dev : 依存: libgles-dev しかし、インストールされていません
 libglvnd-dev : 依存: libegl-dev (>= 1.3.0-1) しかし、インストールされていません
                依存: libgl-dev (>= 1.3.0-1)
                依存: libgles-dev (>= 1.3.0-1) しかし、インストールされていません
 libqt5gui5 : 依存: libgles2
 libqt5multimedia5-plugins : 依存: libgles2
 libwebkit2gtk-4.0-37 : 依存: libgles2
 mesa-utils-extra : 依存: libgles2
 qtbase5-dev : 依存: libegl-dev しかし、インストールされていません
               依存: libgles-dev しかし、インストールされていません
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。
```

このような感じでエラーが出て。

`libegl-dev`をインストールをしようとするもうまくいかず。
おとなしくエラー文にあるように`apt --fix-broken install`を実行します。

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
依存関係を解決しています ... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  apt-transport-https dh-python gir1.2-notify-0.7 idle-python2.7
  libboost-filesystem1.62.0 libboost-iostreams1.62.0 libboost-system1.62.0
  libcwidget3v5 libdc1394-22 libdouble-conversion1 libenchant1c2a
  libfluidsynth1 libgcr-3-common libgl1-mesa-glx libgles2-mesa-dev libglew2.0
  libglvnd-core-dev libhunspell-1.4-0 libilmbase12 liblogging-stdlog0
  libmpdec2 libopencv-calib3d2.4v5 libopencv-features2d2.4v5
  libopencv-flann2.4v5 libopencv-highgui2.4-deb0 libopencv-objdetect2.4v5
  libopencv-video2.4v5 libopenexr22 libpython3.5 libpython3.5-dev
  libpython3.5-minimal libpython3.5-stdlib libpython3.7-minimal
  libqgsttools-p1 libsrtp0 libva-wayland1 libvte-common libvte9
  libwayland-egl1-mesa libx11-xcb-dev libxcb-dri2-0-dev libxcb-dri3-dev
  libxcb-glx0-dev libxcb-present-dev libxcb-randr0-dev libxcb-shape0-dev
  libxcb-sync-dev libxcb-xfixes0-dev libxshmfence-dev libxxf86vm-dev
  python-gobject-2 python3-dbus python3.5 python3.5-dev python3.5-minimal
  python3.7-minimal squeak-plugins-scratch x11proto-composite-dev
  x11proto-dri2-dev x11proto-gl-dev x11proto-kb-dev x11proto-xf86vidmode-dev
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  libegl-dev libegl1 libgl-dev libgles-dev libgles2
以下のパッケージが新たにインストールされます:
  libegl-dev libegl1 libgl-dev libgles-dev libgles2
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 797 個。
26 個のパッケージが完全にインストールまたは削除されていません。
218 kB のアーカイブを取得する必要があります。
この操作後に追加で 2,427 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://cdn-fastly.deb.debian.org/debian bullseye/main armhf libegl1 armhf 1.3.2-1 [29.5 kB]
取得:2 http://cdn-fastly.deb.debian.org/debian bullseye/main armhf libgles2 armhf 1.3.2-1 [18.2 kB]
取得:3 http://cdn-fastly.deb.debian.org/debian bullseye/main armhf libgl-dev armhf 1.3.2-1 [100 kB]
取得:4 http://cdn-fastly.deb.debian.org/debian bullseye/main armhf libegl-dev armhf 1.3.2-1 [19.6 kB]
取得:5 http://cdn-fastly.deb.debian.org/debian bullseye/main armhf libgles-dev armhf 1.3.2-1 [50.3 kB]
218 kB を 2秒 で取得しました (115 kB/s)
(データベースを読み込んでいます ... 現在 83441 個のファイルとディレクトリがインストールされています。)
.../libegl1_1.3.2-1_armhf.deb を展開する準備をしています ...
libegl1:armhf (1.3.2-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libegl1_1.3.2-1_armhf.deb の処理中にエラーが発生しました (--unpack):
 '/usr/lib/arm-linux-gnueabihf/libEGL.so.1' を上書きしようとしています。これはパッケージ libmali-rk-midgard-r13p0-r0p0:armhf 1.5-4 にも存在します
.../libgles2_1.3.2-1_armhf.deb を展開する準備をしています ...
libgles2:armhf (1.3.2-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libgles2_1.3.2-1_armhf.deb の処理中にエラーが発生しました (--unpack):
 '/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2' を上書きしようとしています。これはパッケージ libmali-rk-midgard-r13p0-r0p0:armhf 1.5-4 にも存在します
.../libgl-dev_1.3.2-1_armhf.deb を展開する準備をしています ...
libgl-dev:armhf (1.3.2-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libgl-dev_1.3.2-1_armhf.deb の処理中にエラーが発生しました (--unpack):
 '/usr/include/KHR/khrplatform.h' を上書きしようとしています。これはパッケージ libmali-rk-dev:armhf 1.5-4 にも存在します
.../libegl-dev_1.3.2-1_armhf.deb を展開する準備をしています ...
libegl-dev:armhf (1.3.2-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libegl-dev_1.3.2-1_armhf.deb の処理中にエラーが発生しました (--unpack):
 '/usr/include/EGL/egl.h' を上書きしようとしています。これはパッケージ libmali-rk-dev:armhf 1.5-4 にも存在します
.../libgles-dev_1.3.2-1_armhf.deb を展開する準備をしています ...
libgles-dev:armhf (1.3.2-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libgles-dev_1.3.2-1_armhf.deb の処理中にエラーが発生しました (--unpack):
 '/usr/include/GLES/egl.h' を上書きしようとしています。これはパッケージ libmali-rk-dev:armhf 1.5-4 にも存在します
処理中にエラーが発生しました:
 /var/cache/apt/archives/libegl1_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libgles2_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libgl-dev_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libegl-dev_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libgles-dev_1.3.2-1_armhf.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

という感じで、長々とエラーを吐きます。
`libegl-dev` が先ほどインストールされてない、と出ましたが、ここでインストールしようとしてるみたいです。

だけど、`これはパッケージ libmali-rk-dev:armhf 1.5-4 にも存在します` とあるように、多分これが邪魔しているので、`libmali-rk-dev:armhf 1.5-4`を消しちゃってあとで入れればいいんじゃん？となりました。

が、`apt`でも`dpkg`使っても削除できず。どうもこれを消すと他の依存関係に影響が出そうで影響範囲も広そう？な感じだったので断念。

`dpkg`コマンド使って削除方が細かく設定できると思うんですけど、なんかうまくいかないんですよね…。

エラー文に
```
処理中にエラーが発生しました:
 /var/cache/apt/archives/libegl1_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libgles2_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libgl-dev_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libegl-dev_1.3.2-1_armhf.deb
 /var/cache/apt/archives/libgles-dev_1.3.2-1_armhf.deb
```
とありますので、これらを処理できればいいので、`force-overwrite`を使えばいいかなと思いまして、

```
sudo dpkg -i --force-overwrite /var/cache/apt/archives/libegl1_1.3.2-1_armhf.deb
```
のように1つずつ処理しました。

これで9→10と同じようなコマンドを叩いて、なんとか10→11にバージョンアップすることができました。
force-overwriteすればいいんだ、は[ここで](https://debian-handbook.info/browse/ja-JP/stable/sect.manipulating-packages-with-dpkg.html) わかりました。

ごり押しではありますが、解消はできました。

## 最後に
OSのバージョンアップなんて、MacやWindowsが通知してくれたし、それで自動アップデートすればよかったのに、まさかLinuxでバージョンアップすることになるとは思ってなかったので、貴重な経験になりました。

また、この対応をしたおかげで、別の要件で役に立ったこともあるのでやっておいてよかったこともありました。

ごり押しだけどバージョンアップが一応できたのはよかったです。（この後多分バージョンアップしてからまた別に色々やることがあるんでその対処も必要なんだろうなと思いつつそれはまた別のお話。）

それでは。