Ubuntuに最新版のパッケージをインストールする方法まとめ


Ubuntuでパッケージをインストールしようとしたとき
バージョンが古かったりそもそも存在しなかったり
するときの対処法のまとめ

結論としてリポジトリを追加して最新版のパッケージを
インストールするやり方は２点

- 公式(パッケージの方)のリポジトリをサイトから探す
- PPAを使う

<h1>apt installはそもそも何をしているのか？</h1>
ざっくりとした手順は以下

1. 依存関係のチェック
1. パッケージをダウンロードし、dpkgに渡す
1. dpkgがパッケージをインストール

結局のところ２番目のパッケージが古いか
もしくは存在しないかが問題になる

<h2>パッケージはどこにあるのか？</h2>
パッケージは<code>/etc/apt/sources.list</code>にリポジトリとして存在している

以下一部抜粋

```
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
```

重要なのは
<code>deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted</code>
の部分

書式は

```
deb uri distribution [component]
```

となっているが
見てわかる通りなんだかややこしい

distribution、component等にそれぞれ意味があるのだが
結局なにをしているのかというと
<b>この書式でURLを形成している</b>

例えば<code>deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe</code>
ならhttp://us.archive.ubuntu.com/ubuntu/dists/bionic-updates/universe/binary-amd64/
にPackages.gzがあることが確認できる

![ubuntu_formal_repository.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/e6d5e01e-9c12-bbf3-8926-55138c144e8a.png)


つまりパッケージはUbuntu上に存在しているわけではなく
どっかのサーバーからダウンロードしてインストールすることになる

また配布しているサイトによってはdistributionとcomponentの
書き方がまちまちだったりするので書式が複雑ならURLを辿ってみると
どこにパッケージが存在するのか解りやすかったりする

distributionとcomponentの詳しい説明は下記
[APT の設定 (/etc/apt/sources.list) をちゃんと理解する](https://kujira16.hateblo.jp/entry/2019/10/14/190008)

<h1>sources.listにリポジトリを加える</h1>
sources.listがなんなのかわかったので
実際にリポジトリを加えてみる

基本的に公式(アプリの方)がリポジトリを公開しているのなら
やり方はだいたい公式サイトに書いてあるので参照

今回はNginxを追加してみる

まず現時点で入手できるパッケージを確認

```
$ apt-cache show nginx
Package: nginx
Architecture: all
Version: 1.14.0-0ubuntu1.7
Priority: optional
Section: web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@lists.alioth.debian.org>
…
```

最新版で1.14.0

<code>sources.list.d</code>下に<code>nginx.list</code>を加える

```
$ sudo vi /etc/apt/sources.list.d/nginx.list

#以下を追加
deb http://nginx.org/packages/ubuntu bionic nginx
```

この場合bionic(Ubuntu18.04のコードネーム)がdistribution
nginxがcomponentになる

実際にURLを辿っていくと
http://nginx.org/packages/ubuntu/dists/bionic/nginx/binary-amd64/
にPackagesがある

![nginx_package.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/ff7669f8-d476-8b5d-ce15-8bb86da915cc.png)


たいていパッケージはPGPで暗号化されているので
公開鍵を入手

PGPについては[1分でわかるPGP](http://web.wakayama-u.ac.jp/~takehiko/pgp.html)

```
$ wget https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
OK
```

apt-key addで公開鍵をインポートして使います

あとはアップデートしてインストールするだけ

```
$ sudo apt update
$ sudo apt install nginx
```

最後にバージョンを確認

```
$ nginx -v
$ nginx version: nginx/1.18.0
```

<h1>PPAを使う</h1>
公式がリポジトリを作ってない場合があります
そんな時はPPA

PPAは、「Personal Package Archive」の略で
その名の通り第三者が配布しているリポジトリ

導入の際は自己責任でやりましょう

<h2>PPAは安全なのか？</h2>

とかいいつつホントは公式が配布しているんでしょ？
と思われるかもしれないが

<b>ホントに第三者が配布している</b>(公式が配布している場合もある)ので
セキュリティを気にするなら下記の三点は抑えておく

1. PPAを作成した人をキチンと調べる(公式なのかそうでないのか等)
1. そのPPAの使用ユーザー数を調べる(使っているユーザーはいるのかググる)
1. 更新頻度を調べる

参考サイト
[Are PPAs safe to add to my system and what are some “red flags” to watch out for?
](https://askubuntu.com/questions/35629/are-ppas-safe-to-add-to-my-system-and-what-are-some-red-flags-to-watch-out-for)

<h2>導入する</h2>
以上のことを踏まえて実際にPPAでPHP7.2のリポジトリを導入してみる

https://launchpad.net/ubuntu/+ppas
からPHPで検索してみると大量のPPAがヒットするが
この中でも更新頻度が高いものを選択する

![PPA_PHP72_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/c50170e6-6f97-573f-0975-3e00437ae57d.png)


実際、このPPAは有名でググると大量の記事がヒットがわかる

追加の仕方は

```
$ sudo add-apt-repository ppa:user/ppa-name
```

大体はAdding this PPA to your systemの欄に書いてある通り

実際に導入してみる

```
$ sudo add-apt-repository ppa:ondrej/php
```

sources.list.dを調べてみるとondrej-ubuntu-php-bionic.list
が追加されているので中身を調べてみる

```
$ cat /etc/apt/sources.list.d/ondrej-ubuntu-php-bionic.list
deb http://ppa.launchpad.net/ondrej/php/ubuntu bionic main
# deb-src http://ppa.launchpad.net/ondrej/php/ubuntu bionic main
```

基本的なことは先ほど説明した通り
あとはupdateしてinstallするだけ

```
$ sudo apt update
$ sudo apt install php7.2
```

ということで無事インストールできました