yumからDNFへの移行

# はじめに

DNFはyumの後継であり、Fedora 22からyumに代わりデフォルトのパッケージ管理システムとして採用されている。

何故DNFが作られることになったかというと、yumはPython 2とPython 3の両対応ではなくPython 2でしか動かないため、yumを使い続ける限りPython 3をOSのデフォルトにすることができないからである。
yumをPython 3に対応させるより、Python 2,3両対応のパッケージ管理システムを新しく作り直した方が良いという判断がどこかで行われたと思われる。
もっともFedoraでPython 3がデフォルトになるのは遅延してFedora 23からと現在予定されるようになってしまったが。

RHEL/CentOSでもPython 3がデフォルトになるタイミングでyumからDNFに移行することになるだろう。
RHEL 7.x/CentOS 7.xの間にそのようなドラスティックな変化が起こることはないだろうから、おそらくRHEL 8/CentOS 8から移行することになると思われる。
（RHEL 8の内容の大まかなところは2016年前半くらいにはわかるんじゃないかな）

ここでは http://dnf.readthedocs.org/en/latest/index.html を参考に、DNFを使うに当たってyumと何が同じで何が違うのかを記す。
先にまとめておくと、

* コマンドは主要なものは`yum xxx`の代わりに`dnf xxx`になるだけでありxxxの部分は変わらない。dnf-yumパッケージがインストールされていれば`yum xxx`は自動的に`dnf xxx`にリダイレクトされる。
* DNFの設定ファイルは /etc/yum.conf ではなく /etc/dnf/dnf.conf なので、プロキシ通すなどする場合は /etc/dnf/dnf.conf に書く。 /etc/yum.repos.d/*.repo はそのまま使える。
* yumでプラグインになっていたものはDNF本体に同梱されていたり、DNFでもプラグインになっていたりするが、使い方はyumとは違うことが多い。yum-utilsで提供されていたものもDNFではプラグイン化される。

# dnfコマンドラインインタフェース

マイナーなコマンドやプラグインに依存していたものを除けば、単にこれまでyumと打っていた代わりにdnfと打てば同じ効果を得られる。
つまり、例えばwgetをインストールしたければ`dnf install wget -y`とすれば良いし、インストールされているすべてのパッケージをアップデートしたければ`dnf update -y`とすれば良い。
yumと同様、rpmをURLで指定したり、ローカルにあるrpmへのパスを指定したりしてinstallすることもできる。
もちろん効果は同じであっても、出力内容には多少の相違があることはある。

http://dnf.readthedocs.org/en/latest/cli_vs_yum.html にyumとDNFのCLIの違いなどが書かれている。
私が気になったのは次の辺り。

* `dnf update`は`dnf upgrade`のエイリアスであり効果に違いはない（`dnf update`は将来廃止されるかもしれない）。`yum upgrade`は`yum --obsoletes update`の意味だったので違いがあった。ただしCentOS（他もそうかもしれないが調べていない）では /etc/yum.conf の設定により--obsoletesが常時有効であるため初期状態では違いがなかった。
* `dnf remove kernel`で今利用しているカーネルも削除される。`yum remove kernel`では今利用しているカーネルは削除されず守られた。
* `dnf shell`や`dnf swap`はないので、すでにインストールされているパッケージのせいでインストールできないパッケージをインストールするには`dnf --allowerasing install`を使用する。

# DNFとyumとの共存

DNFとyumを両方インストールして使用することは可能である。
ただしトランザクションメタデータはDNFとyumとで共用されないので、DNFを使ったりyumを使ったりしながらhistory rollbackをする、などはそのままではできない。
python-dnf-plugins-extras-migrateパッケージをインストールすると使える`dnf-2 migrate`でyum側のトランザクションメタデータをDNF側にマイグレートすることができる（実行してみると想定通り働いているようには見えるが、何かエラーが出てもいる）。

Fedora 22において、yumコマンドはdnf-yumパッケージの作用によってdnfコマンドにリダイレクトされる。dnf-yumパッケージから提供される /usr/bin/yum の中を見ると、やっていることはまんま`exec /usr/bin/dnf "$@"`である。
デフォルトではdnf-yumパッケージがインストールされており、yumパッケージは最小構成だとインストールされていない。yumパッケージをインストールするとyumではなくyum-deprecatedというコマンドで実行できる。

dnfパッケージはFedora 18以降やEPEL 7にも存在するのでCentOS 7などでもDNFを使うことができる。
（ただしプラグインがなかったりするが）

# DNFの設定

/etc/dnf/dnf.conf はdnfパッケージではなくdnf-confパッケージから提供されることに一応注意。

## リポジトリの設定

yumと同じく /etc/yum.repos.d/ 内にある、拡張子が.repoのファイルから各リポジトリの設定を読み取る。ここに変わりはない。
設定項目も主なものは変わらないので大抵はそのまま使えるだろう。

## プロキシを通す

yumでは /etc/yum.conf の[main]セクションに`proxy=http://(hostname):(port)/`と、あと必要なら`proxy_username=(username)`と`proxy_password=(password)`を追加するとプロキシを通すことができた。
DNFでは同じ内容を /etc/yum.conf ではなく /etc/dnf/dnf.conf の[main]セクションに書く。

yumと同じく個別のリポジトリ設定（通常は /etc/yum.repos.d/*.repo にある）に書くこともできる。

## 更新対象から除外するパッケージを設定する

「プロキシを通す」と同様、`exclude=(パッケージ名をカンマ区切りで)`を /etc/yum.conf ではなく /etc/dnf/dnf.conf の[main]セクションに書く。
yumと同じく個別のリポジトリ設定に書くこともできる。

# DNFのプラグイン

yumと同じく、DNFもプラグイン形式で機能追加される。
yumで提供されていた主要なプラグインも、一部はDNF本体に取り込まれ、また一部はDNFのプラグインとして移植されている。
さらに従来yum-utilsパッケージで提供されてきた機能もDNFのプラグインとして提供される。
ちなみにyum-utilsパッケージはFedora 22では存在するし機能もするが「廃止予定」扱いである。

DNFのプラグインはdnf-plugins-coreパッケージにより提供されるものと、python-dnf-plugins-extras-(機能名)パッケージにより提供されるものがある。
Fedora 22においてdnf-plugins-coreパッケージはデフォルトでインストールされるがpython-dnf-plugins-extras-*パッケージは個別にインストールする必要がある。

以下にyumで比較的よく使われると思われるプラグインがDNFでどうなるかを書き出してみた。
それを含めて現状は次の表で確認できる。

yumのプラグインがDNFでどうなるかの表
http://dnf.readthedocs.org/en/latest/cli_vs_yum.html#changes-in-dnf-plugins-compared-to-yum-plugins

yum-utilsで提供されていたものがDNFでどうなるかの表
http://dnf.readthedocs.org/en/latest/cli_vs_yum.html#changes-in-dnf-plugins-compared-to-yum-utilities

## yumでよく使われるプラグインがDNFでは

## yum-fastestmirror

yum-fastestmirrorはDNF本体に同梱された。
初期状態では有効化されておらず、 /etc/dnf/dnf.conf の[main]セクションに`fastestmirror=true`を追加することによって有効化される。

## yum-priorities

yum-prioritiesはDNF本体に同梱された。
リポジトリ設定でpriorityを設定すれば利用できる。

## yum-security

同等のものは見当たらないし予定もない。
そもそもyum-security自体もFedora 21以降やCentOS 7には存在しない。
どうやらリポジトリ側がすでにyum-securityに対応していないようだ。

## yum-downloadonly

yum-downloadonlyもFedora 19以降やCentOS 7には存在しないプラグインだが、こちらはyum本体に同梱されたからのようだ。
yum-utilsには同じことをするyumdownloaderというコマンドがある。

DNFではdnf-plugins-coreに収録されるプラグインとなった。
`dnf download xxx`でパッケージのダウンロードのみが行われる。
オプション等は`man dnf.plugin.download`で確認できる。manと同じ内容は http://dnf-plugins-core.readthedocs.org/en/latest/download.html にもある。

# その他

Fedora 22ではyumexの代わりにDNFをバックエンドにしたyumex-dnfパッケージが提供されている。

yum-cronの代わりはdnf-automaticパッケージである。
http://dnf.readthedocs.org/en/latest/automatic.html
設定ファイルは /etc/dnf/automatic.conf だが設定内容はyum-cronのものとほとんど変わらないので同じように設定できるだろう。
Fedora 22ではdnf-automaticはsystemd-timerで定期実行されるので、`systemctl enable dnf-automatic.timer && systemctl start dnf-automatic.timer`で定期実行するようになる。