Ubuntu

Ubuntu18.04 参照先リポジトリを修正して依存関係の問題を解決

heimdal-clientsがインストールされたシステムを運用している。
最近SSOを色々と試していて、その中で見つけたApacheのモジュールが「krb5-userがないと機能が制限される」というので、heimdal-clients → krb5-userへの切り替えようと考えた。



広告


インストールしようとしたら依存関係で問題が発生…めんどくさいな、えい!とheimdal-clientsをアンインストールしたら、Samba、Apache、curlの果てまで一緒になくなった。
どうにか復旧できたものの、一瞬目の前が白くなった(本当にヤバいときには暗くならない気がする、もわーっと白くなって視界が狭くなるようなそんな感じ)。

これはこれで1つちゃんとクリアしておく課題なのかもしれないと思った。

 

発生していた問題

コンポーネント「univers」はリポジトリに登録されていたものの、ポケットとして「update」が定義されておらず(releaseのみ)、初期バージョンのkrb5-userをインストールしようとして、依存関係の問題が発生していた。

何を警告されているのか確認

最初に表示されたメッセージはこれ。

$ sudo apt install krb5-user
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 krb5-user : Depends: libkrb5-3 (= 1.16-2build1) but 1.16-2ubuntu0.1 is to be installed
E: Unable to correct problems, you have held broken packages.

いつも「あぁ、なんか文字が並んでるなー」程度でまともに読んじゃいない。それが今回発生した問題の一番の原因だな、ということでよく読んでみる。

パッケージリストの読み込み…終わり
依存関係木構造を組み立てる
状態情報の読み込み…終わり
いくつかのパッケージをインストールできませんでした。
これは、あなたの要求が不可能な状況だった、または、あなたが不安定版
(unstable distribution)を使っているなら、要求パッケージが
まだ作られていないかincomingから外れています。
次の情報はこの状況を解決するのに役立つかもしれません:

次のパッケージには、満たされていない依存関係があります:
 krb5-user : 依存: libkrb5-3 (= 1.16-2build1) しかし 1.16-2ubuntu0.1 がインストールされています。
E:問題を修正できません。パッケージが壊れています。

でもこれはまた難しいなぁ。build1とubuntu0.1ってどう違うんだろ?
ubuntu packages / パッケージ: libkrb5-3 (1.16-2ubuntu0.1 など) [security]

見てみると、amd64とi386以外はubuntu0.1で、arm64とか他のアーキテクチャーだとbuild1になっているように見える。でも、要求されてる。

何にどう依存してbuild1が必要と言っているのかが分からない。実際、krb5-user側もubuntu0.1に依存しているように思える。
ubuntu packages / パッケージ: krb5-user (1.16-2ubuntu0.1 など) [security] [universe]

インストールしようとするパッケージを調べる

パッケージの情報を見てみた。

■運用中のシステム
$ apt show krb5-user
Package: krb5-user
Version: 1.16-2build1
…
APT-Sources: http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages

■まっさらからインストールしたシステム
$ apt show krb5-user
Package: krb5-user
Version: 1.16-2ubuntu0.1
…
APT-Sources: http://jp.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages
…

この段階でピン!ときたらさすが。でも、何のことだか…どうやら、参照しているリポジトリが違っているから、違うバージョンのkrb5-userが参照されていて、そのために違うライブラリをほしがっているのかな…程度の想像しかできなかった。

リポジトリの種類を調べる

リポジトリには種類がある。それぞれに意味があるはずなので再確認。
ubuntu documentation / What are Repositories?

http://jp.archive.ubuntu.com/ubuntu bionic-updates/universe
~~~~~~~~~~~~~~~~(1)~~~~~~~~~~~~~~~~ ~(2)~~ ~~(3)~~ ~~(4)~~~

(1) URI
(2) ディストリビューション
(3) ポケット
(4) コンポーネント

URI

URI(Uniform Resourse Identifier)として有効なリポジトリを指定する。

書き方はこんな感じ。
http://www.domain.ext/path/to/repository
smb://path/to/repository

cdromも指定できるらしく、この場合は apt-cdrom コマンドで追加する模様。
Narrow Escape / Ubuntu 16.04: DVDからパッケージをインストールする

ディストリビューション

ディストリビューションはコードネームの1つめの単語らしい。
Ubuntuのコードネームはここに情報が。一部だけを切り出すとこんな感じ。
ubuntu wiki / Releases

バージョンコードネーム
12.04Precise Pangolin
14.04Trusty Tahr
16.04Xenial Xerus
18.04Bionic Beaver
20.40Focal Fossa

自分のシステムのバージョンは以下で分かる。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

 

ポケット

ポケットについては、ここでわかりやすく教えてくれていた。
ask ubuntu / What is the difference between security, updates, proposed and backports in /etc/apt/apt.conf.d/50unattended-upgrades?

Pockets内容
releaseリリースされたら変更されない(APT-Sourcesの表示上は空)
security重要なセキュリティ更新
proposedupdatesで公式に配布する前のテスト段階の更新
updatesセキュリティに影響を与えないが、重要なバグ修正
backports新しいメジャーリリースの一部を旧バージョン用に移植したもの

デフォルトではsecurity pocketsとupdates pocketsが有効になっているそうだ。

コンポーネント

主要な4つのリポジトリがある。

コンポーネント内容
mainCanonicalによってサポートされるオープンソースソフトウェア
universeコミュニティによりメンテナンスされるオープンソースソフトウェア
restricted仕様・規格・構造などが公開されていない(Proprietary)デバイス用のドライバ
multiverse著作権もしくは法的な問題によって制限されたソフトウェア

universeに含まれるソフトウェアはかなり多いと思う。どのコンポーネントなのかということは、パッケージ検索ページで使いたいパッケージを探してみると分かる。

依存関係の問題解消

参照するリポジトリの確認

ここまで調べたところで、運用中のシステムでkrb5-userがインストールできない原因がほぼ判明。

  • update pocketsを取得元に設定していない
    → リリース直後のパッケージを使おうとする。
  • リリース直後のパッケージはbuild1バージョンのライブラリに依存
    → 取得元のどこにもないのでインストールできない。

aptコマンドが参照するデータの取得元は、ここに書かれている。
ubuntu manuals / sources.list – APT のデータ取得元の設定リスト

/etc/apt/sources.list
  取得元の設定リスト

/etc/apt/sources.list.d
  取得元の設定リストがバラバラのファイルで指定できる

運用中のシステムでこれらのファイルを確認してみた。

■sources.list
deb http://archive.ubuntu.com/ubuntu bionic main
deb http://archive.ubuntu.com/ubuntu bionic-security main
deb http://archive.ubuntu.com/ubuntu bionic-updates main

■sources.list.d に含まれるファイル
deb http://archive.ubuntu.com/ubuntu bionic universe
deb http://repo.zabbix.com/zabbix/4.0/ubuntu bionic main
deb-src http://repo.zabbix.com/zabbix/4.0/ubuntu bionic main

※どこかで何かを設定したのか…凄く中途半端な状態。

updateのuniverse pocketsを参照していないことがわかり、原因が明確になった。

参照先ポケットの追加

過去にコンポーネントuniverseを追加する記事を書いていた。
これが使えるのか確認してみる。

$ sudo add-apt-repository universe
'universe' distribution component is already enabled for all sources.

sources.list.dに中途半端な参照先設定があり、そのために追加は許されなかった。

そこで、中途半端な設定(sources.list.d/bionic.list)を削除して再度実行してみた。

$ sudo rm /etc/apt/sources.list.d/bionic.list
$ sudo add-apt-repository universe
'universe' distribution component enabled for all sources.
Hit:1 http://repo.zabbix.com/zabbix/4.0/ubuntu bionic InRelease
Hit:2 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:3 http://archive.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [673 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic-security/universe Translation-en [223 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [970 kB]
Get:8 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1,085 kB]
Get:9 http://archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [337 kB]
Fetched 3,465 kB in 5s (729 kB/s)
Reading package lists... Done

上手く更新できた。Translation-enは無指定でも入ってきている。

なお、この環境には日本語を取り込んでいない。
必要になったら、こうした記事が教えてくれている指定を組み込めば取り込めそう。
Qiita / 必要な言語ファイルだけ取得で apt-get の時間を短縮する

heimdal-clientsからkrb5-userへの切り替え

運用環境でheimdal-clientsをアンインストールしたら、ウチの管理センターとなるSamba ad dcがアンインストールされる事態に。ついでにApache、curlまでも…もうがっつりアンインストールされ、ちょっとした丸腰状態に。これはだいぶ困る。

そこで、まっさら環境を用意してheimdal-clientsをインストールし、その後にkrb5-userに切り替える手順を試し、手順を確立する。

heimdal-clientsのインストール

まずは、heimdal-clientsのインストール。

$ sudo apt install heimdal-clients

■途中の質問
When users attempt to use Kerberos and specify a principal or user name without specifying what administrative
Kerberos realm that principal belongs to, the system appends the default realm. The default realm may also be
used as the realm of a Kerberos service running on the local machine. Often, the default realm is the uppercase
version of the local DNS domain.

Default Kerberos version 5 realm:

ユーザーがKerberosを使用し、プリンシパルが属している管理Kerberosレルムを指定せずに
プリンシパルまたはユーザー名を指定しようとすると、システムはデフォルトのレルムを追加します。 
デフォルトのレルムは、ローカルマシンで実行されているKerberosサービスのレルムとしても使用できます。 
多くの場合、デフォルトのレルムはローカルDNSドメインの大文字バージョンです。

HOGESERVER.HOGEDDNS.JP

インストールすると、/etc/krb5.confが生成される(かなり長いリストになっている)。

チケットを発行してみる。

$ kinit rohhie@HOGESERVER.HOGEDDNS.JP
rohhie@HOGESERVER.HOGEDDNS.JP's Password:

$ klist
Credentials cache: FILE:/tmp/krb5cc_1000
        Principal: rohhie@HOGESERVER.HOGEDDNS.JP

  Issued                Expires               Principal
Jun 24 06:46:24 2020  Jun 24 15:46:24 2020  krbtgt/HOGESERVER.HOGEDDNS.JP@HOGESERVER.HOGEDDNS.JP

※Samba ad dcは同じネットワーク上にあり、DHCPでDNSとしてIPアドレスを受け取っているものの、どうやってチケットを取り出せるサーバーを認識しているのか、というところのメカニズムは分かっていない。

krb5-userへの切り替え

ここから、krb5-userに切り替えができるのか確認してみた。

$ sudo apt install krb5-user
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libhdb9-heimdal libkadm5clnt7-heimdal libkadm5srv8-heimdal libkafs0-heimdal libotp0-heimdal libsl0-heimdal
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libgssrpc4 libkadm5clnt-mit11 libkadm5srv-mit11 libkdb5-9
Suggested packages:
  krb5-doc
The following packages will be REMOVED:
  heimdal-clients
The following NEW packages will be installed:
  krb5-user libgssrpc4 libkadm5clnt-mit11 libkadm5srv-mit11 libkdb5-9
0 upgraded, 5 newly installed, 1 to remove and 0 not upgraded.
Need to get 285 kB of archives.
After this operation, 621 kB of additional disk space will be used.
Do you want to continue? [Y/n] y[Enter]

ポケットを追加した後には依存関係の問題は発生せず、関係パッケージのアンインストールされることもなく、krb5-userに入れ替わった。
チケットの発行も問題なくできた。

heimdal-clientsへの再度の切り替え

この切り替えをする場合もあるかもしれないので、念のためテスト。

$ sudo apt install heimdal-clients
[sudo] password for rohhie:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libgssrpc4 libkadm5clnt-mit11 libkadm5srv-mit11 libkdb5-9
Use 'sudo apt autoremove' to remove them.
Suggested packages:
  heimdal-docs heimdal-kcm
The following packages will be REMOVED:
  krb5-user
The following NEW packages will be installed:
  heimdal-clients
0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded.
Need to get 158 kB of archives.
After this operation, 220 kB of additional disk space will be used.
Do you want to continue? [Y/n] y[Enter]

特に問題なく入れ替えられて、チケットも問題なく発行できた。

さいごに

これはヤバい!と思った。ウチのサービスはSamba ad dcに完全に依存しているのだ。これが止まると、それこそインターネットにアクセスすらできやしない。

今回はパッケージを順々に入れ直して復旧できたが、もし、データーが破損していたら目も当てられない状態になっていたことだろう。いざというときのためにバックアップを取り、復旧手順を確立しておくことはとても大事になりそうだ。

それと、常に立ち上げっぱなしというわけにはいかないものの、スタンバイ系のシステムを作って時々同期させ、情報を保持しておくのも良いかもしれない。

だんだんと大規模になっていっちゃうけど。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他