Ubuntuでパッケージをインストールしようとしたとき
バージョンが古かったりそもそも存在しなかったり
するときの対処法のまとめ
結論としてリポジトリを追加して最新版のパッケージを
インストールするやり方は2点
- 公式(パッケージの方)のリポジトリをサイトから探す
- PPAを使う
apt installはそもそも何をしているのか?
ざっくりとした手順は以下- 依存関係のチェック
- パッケージをダウンロードし、dpkgに渡す
- dpkgがパッケージをインストール
結局のところ2番目のパッケージが古いか
もしくは存在しないかが問題になる
パッケージはどこにあるのか?
パッケージは/etc/apt/sources.list
にリポジトリとして存在している
以下一部抜粋
# 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
重要なのは
deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
の部分
書式は
deb uri distribution [component]
となっているが
見てわかる通りなんだかややこしい
distribution、component等にそれぞれ意味があるのだが
結局なにをしているのかというと
この書式でURLを形成している
例えばdeb http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe
ならhttp://us.archive.ubuntu.com/ubuntu/dists/bionic-updates/universe/binary-amd64/
にPackages.gzがあることが確認できる
つまりパッケージはUbuntu上に存在しているわけではなく
どっかのサーバーからダウンロードしてインストールすることになる
また配布しているサイトによってはdistributionとcomponentの
書き方がまちまちだったりするので書式が複雑ならURLを辿ってみると
どこにパッケージが存在するのか解りやすかったりする
distributionとcomponentの詳しい説明は下記
APT の設定 (/etc/apt/sources.list) をちゃんと理解する
sources.listにリポジトリを加える
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
sources.list.d
下にnginx.list
を加える
$ 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がある
たいていパッケージはPGPで暗号化されているので
公開鍵を入手
PGPについては1分でわかるPGP
$ 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
PPAを使う
公式がリポジトリを作ってない場合があります そんな時はPPAPPAは、「Personal Package Archive」の略で
その名の通り第三者が配布しているリポジトリ
導入の際は自己責任でやりましょう
PPAは安全なのか?
とかいいつつホントは公式が配布しているんでしょ?
と思われるかもしれないが
ホントに第三者が配布している(公式が配布している場合もある)ので
セキュリティを気にするなら下記の三点は抑えておく
- PPAを作成した人をキチンと調べる(公式なのかそうでないのか等)
- そのPPAの使用ユーザー数を調べる(使っているユーザーはいるのかググる)
- 更新頻度を調べる
参考サイト
Are PPAs safe to add to my system and what are some “red flags” to watch out for?
導入する
以上のことを踏まえて実際にPPAでPHP7.2のリポジトリを導入してみるhttps://launchpad.net/ubuntu/+ppas
からPHPで検索してみると大量のPPAがヒットするが
この中でも更新頻度が高いものを選択する
実際、この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
ということで無事インストールできました