パッケージのリポジトリ登録を、add-apt-repositoryから推奨される手段に置き換えた上でインストールしてみる

## やること

`add-apt-repository`を用いたリポジトリの登録を、推奨される手段に置き換えてインストールする


## 自分の環境

```bash
$ uname -a
Linux rpiz2 6.6.31+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux
```

```bash
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## 手順

例として、今回インストールしようとしているパッケージです。

https://github.com/astrada/google-drive-ocamlfuse#installation

公式では以下のようにインストールの手順が示されています。

> ```bash
> sudo add-apt-repository ppa:alessandro-strada/ppa
> sudo apt-get update
> sudo apt-get install google-drive-ocamlfuse
> ```

`add-apt-repository`を用いたリポジトリの登録は現在非推奨なので、この部分を推奨されるものに置き換えてみます。
なお自分の環境では、最終的に以下のコマンドに集約されました。

```bash
$ sudo curl -sS 'http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0xA7AFF39895544C77C124BB46FEAC8456AF83AFEB' | sudo gpg --dearmor -o /etc/apt/keyrings/alessandro-strada.gpg
$ echo "deb [signed-by=/etc/apt/keyrings/alessandro-strada.gpg] http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu kinetic main" | sudo tee -a /etc/apt/sources.list.d/alessandro-strada-ubuntu-ppa-bionic.list
$ sudo apt-get update
$ sudo apt-get install google-drive-ocamlfuse
```

### 1. 追加パッケージの調査

`sudo add-apt-repository ppa:alessandro-strada/ppa`を見て、<https://launchpad.net/> から`alessandro-strada`を検索します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/4969278a-0f9e-ccd5-fd48-916cac34d925.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/bd79ffc1-2a6c-70c8-1bb3-f8b71b9587db.png)

インストールしたい`sudo apt-get install google-drive-ocamlfuse`に一致するパッケージがありました。
このページを開いておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/03c8ed0b-74cf-f99b-6cee-d4e1cd6a470c.png)

### 2. リポジトリの公開鍵を取得

[追加パッケージの調査](https://launchpad.net/~alessandro-strada/+archive/ubuntu/ppa)で開いたページから、`Fingerprint`を控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/5fc000fb-cd0f-e893-bcb5-acae48f75ba1.png)

```bash
fingerprint="A7AFF39895544C77C124BB46FEAC8456AF83AFEB"
```

リポジトリの名前も控えておきます。

```bash
# ppa:alessandro-strada/ppa
#     ^---------------- ^-- ここ2つ
repo="alessandro-strada"
subrepo="ppa"
```


以下のコマンドから、リポジトリの公開鍵を取得

```bash
curl -sS "http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x${fingerprint}" > "./${repo}.asc"
```

所定の位置に、取得した公開鍵をGPGキーとして配置

```bash
cat "./${repo}.asc" | sudo gpg --dearmor -o "/etc/apt/keyrings/${repo}.gpg"
```

ちなみにGPGキーの置き場所は、初期状態で以下の2か所用意されています。
- `/etc/apt/keyrings/`
- `/etc/apt/trusted.gpg.d/`

`/etc/apt/trusted.gpg.d/`はOSの提供するパッケージのGPGキーを配置する場所らしいです。


### 3. aptにリポジトリを登録

`/etc/apt/sources.list.d/`直下に、以下の赤枠部分を記述したファイルを作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/0bb4a929-9c2f-785a-e6ee-1f4d19352839.png)

赤枠の`YOUR_UBUNT_VERSION_HERE`に入れる内容を調べます。


<details><summary>Ubuntu または Ubuntu派生のOSの場合</summary>

`/etc/os-release`に記述された、`VERSION_CODENAME`の値がその箇所に入れたい値です。

```bash
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
#                ^---- これ
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

`Display sources.kist entries`の選択肢に、上記の`Jammy`が含まれています。
どうやらこのOSのバージョンに、正式に対応しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/25740c32-c89d-4fc5-0627-f8ef7630a6ad.png)

この場合、`YOUR_UBUNT_VERSION_HERE`は`jammy`と置き換えることになります。
</details>






<details><summary>Ubuntu派生のOSではない場合</summary>

筆者の環境はDebianベースの環境なので、そもそも`VERSION_CODENAME`の値がUbuntuのものにはなりません。

```bash
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
#                ^------- これはUbuntuのコードネームにはない
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

`/etc/debian_version`を確認すると、以下のいずれかのように`VERSION_ID`、または`VERSION_CODENAME`にあたる内容が記述されています。

```bash
$ cat /etc/debian_version
bookworm/sid
```

```bash
$ cat /etc/debian_version
12.6
```

以下のページにDebianのバージョンと、対応するUbuntuのバージョンを比較して下さった方が表でまとめています。
[What Debian version are the different Ubuntu versions based on? - Ask Ubuntu](https://askubuntu.com/questions/445487/what-debian-version-are-the-different-ubuntu-versions-based-on/445496#445496)


自分の環境の`bookworm`は、Ubuntuの`Lunar Lobster`/`Kinetic Kudu`/`Jammy Jellyfish`の3つに対応しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303228/25740c32-c89d-4fc5-0627-f8ef7630a6ad.png)

`Display sources.kist entries`の選択肢に、上記の3つがいずれも含まれています。
なんとなくで、`VERSION_CODENAME=kinetic`と置き換えるようにしてみました。

この場合、`YOUR_UBUNT_VERSION_HERE`は`kinetic`と置き換えることになります。
</details>


記述する内容の情報が揃ったら、`/etc/apt/sources.list.d/`直下にファイルを作成します。
ここにはパッケージの情報として、鍵の位置、リポジトリのURL、バージョン情報を記述します。

```bash
echo "deb [signed-by=/etc/apt/keyrings/${repo}.gpg] http://ppa.launchpad.net/${repo}/${subrepo}/ubuntu ${YOUR_UBUNT_VERSION_HERE} main" | sudo tee -a /etc/apt/sources.list.d/${repo}.list
```


### 4. インストール

パッケージリストの更新をしてみます。
警告やエラーが表示されなければ問題ないです。

```bash
sudo apt-get update
```

実際にパッケージをインストールします。
エラーが出なければ完了です。

```bash
sudo apt-get install google-drive-ocamlfuse
```