messagesに「Failed to start dnf-makecache.service - dnf makecache.」

このエラーの内容について

監視ツールのCocpitにログインすると、ログの項目で以下のエラーが発生しています

Mar 17 22:53:19 xxxx dnf[341590]: Errors during downloading metadata for repository 'epel':
Mar 17 22:53:19 xxxx systemd[1]: dnf-makecache.service: Main process exited, code=exited, status=1/FAILURE
Mar 17 22:53:19 xxxx systemd[1]: dnf-makecache.service: Failed with result 'exit-code'.
Mar 17 22:53:19 xxxx systemd[1]: Failed to start dnf-makecache.service - dnf makecache

このエラーは「リポジトリ(今回の場合はEPEL)のメタデータ取得に失敗した」ことを示しています。

一時的なネットワークの瞬断や、ミラーサイト側の同期タイミング、あるいはプロキシ設定の不備などで発生することが多いです。その後ステータスが正常に戻っているのは、次回のタイマー実行時に成功したか、手動操作によって解決したためと考えられます。

この

メモリ消費について

DNFはリポジトリの巨大なメタデータ(パッケージリストや依存関係のインデックス)をXML/SQLite形式で読み込み、メモリ上で展開して処理します。特に以下の理由でリソースを消費します。あるサイトでは600MBくらい使うとの記事もありました

  • メタデータの肥大化: EPELなどの大規模リポジトリを有効にしていると、数MB〜数十MBのファイルをパースするため、一時的に数百MBのメモリを占有することがあります。
  • キャッシュ作成: メタデータをバイナリ形式に変換するプロセスが、低スペックの環境やメモリが逼迫している状況では負荷に感じられることがあります。

エラーの対処方法

このエラーに対しての対処方法は、リポジトリのメタデータを取得に失敗しているのでこちらの環境が原因より、リポジトリ先の問題の可能性もあり根本的な解決策はありません。
対処としては、「dnf-makecache.timer」の間隔を長くするか、停止する方法になるかと思います

デフォルトのタイマーの間隔を確認します

$  systemctl cat dnf-makecache.timer 
# /usr/lib/systemd/system/dnf-makecache.timer
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target

[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
RandomizedDelaySec=60m
Unit=dnf-makecache.service

[Install]

システム起動から10分後、その後は1時間ごとOnUnitInactiveSec=1h)に実行されます。

次回の間隔を確認するには以下のコマンドになります

$ systemctl list-timers dnf-makecache.timer
NEXT                         LEFT LAST PASSED UNIT                ACTIVATES            
Wed 2026-03-18 10:44:57 JST 59min -         - dnf-makecache.timer dnf-makecache.service

/etc/dnf/dnf.conf で更新間隔を変更する

ネットで下記の「/etc/dnf/dnf.conf」に更新間隔を変更する記事をよく見ますが、この場合でもエラーは解消されません。ただし、更新処理は12時間おきになるのでメモリを使いすぎる問題は解消されます

$ sudo vim /etc/dnf/dnf.conf
metadata_expire=12h

# 再起動とか
$ sudo systemctl daemon-reload
$ sudo systemctl restart dnf-makecache.timer

dnf.conf では以下のような役割になります

レイヤー役割今回の挙動
第1段階 (systemd.timer)いつ実行するかを決めるデフォルトの 1時間おき にサービスを通理します
第2段階 (dnf.conf)何をするかを決める通知されたDNFが「前回から12時間経ったか?」を確認し、経ってなければ実行されません。
但し、メータデータの確認は実行されます

設定ファイルを変更しても、1時間おきにタイマーは走ります、dnf.confでは12時間おきなので呼び出されても、処理は実行されないのでメモリの使用量は少ないです。

実際に再起動後に、dnf-makecache.timerの設定を確認しても1時間おきになっています。メータデータの更新されているかの確認は実行されるのでエラーは解消されない可能性は高いです

$  systemctl cat dnf-makecache.timer 
# /usr/lib/systemd/system/dnf-makecache.timer
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target

[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
RandomizedDelaySec=60m
Unit=dnf-makecache.service

[Install]

dnf-makecache.timer を更新間隔を変更する

タイマーの設定を変更するには、systemctl edit を使用して変更します。
この方法はネットで見かけましたし、AIの解答も一緒でしたが私の環境では駄目でした。再起動するとデフォルト値に戻ります

# nanoエディタで起動する場合があります(終了はCtrl + X)
$ sudo systemctl edit dnf-makecache.timer

# nano じゃなくて viエディタを使用する場合
$ sudo EDITOR=vi systemctl edit dnf-makecache.timer

[Timer]
OnUnitInactiveSec=12h

再起動を実施して読み込みます

$ sudo systemctl daemon-reload
$ sudo systemctl restart dnf-makecache.timer

再起動するとデフォルトに戻るので、手動で「ユーザー専用の上書きファイル」を作成して対処します。
これにより、OS標準の設定を無視して自分の設定を強制で追加します。

1.専用のディレクトリを作成

$ sudo mkdir -p /etc/systemd/system/dnf-makecache.timer.d

2.上書き用ファイルを作成

$ sudo vi /etc/systemd/system/dnf-makecache.timer.d/my-custom.conf
[Timer]
# 一度空文字を入れることで、デフォルトの1h設定をクリアします
OnUnitInactiveSec=
# 自分の好きな間隔を指定
OnUnitInactiveSec=12h

3.設定をシステムに認識させる

$ sudo systemctl daemon-reload
$ sudo systemctl restart dnf-makecache.timer

4.変更を確認

# タイマーの設定を確認
$ systemctl cat dnf-makecache.timer
# /usr/lib/systemd/system/dnf-makecache.timer
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target

[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
RandomizedDelaySec=60m
Unit=dnf-makecache.service

[Install]
WantedBy=timers.target

# /etc/systemd/system/dnf-makecache.timer.d/my-custom.conf
[Timer]
OnUnitInactiveSec=
OnUnitInactiveSec=12h

# 次回の時間を確認
$ systemctl list-timers dnf-makecache.timer
NEXT                        LEFT LAST PASSED UNIT                ACTIVATES            
Wed 2026-03-18 22:21:03 JST  12h -         - dnf-makecache.timer dnf-makecache.service

dnf-makecache.timer を無効にする

個人利用で管理者しか使わないケース場合などでは、そんなにdnfコマンドを利用するケースが少ないのでタイマーを無効化(disable)してしまっても全く問題ないように思えます。自分も無効にしています

1. タイマーを無効化するメリット

  • メモリの節約: 背後で dnf が勝手に動き出すことがなくなります。
  • ログのクリーンアップ: 1時間おきに出ていた dnf-makecache のエラーログが一切出なくなります。
  • ディスクI/Oの軽減: キャッシュ更新によるディスクへの書き込みが発生しなくなります。

2. 無効化した場合の「その後」

タイマーを止めると、リポジトリのキャッシュ(パッケージのリスト)が自動で更新されなくなります。しかし、以下の挙動になるだけなので実運用上の困りごとはほぼありません。

  • dnf installdnf update を実行した時: その瞬間にキャッシュが古ければ、DNFが自動的に最新のメタデータを取得しに行きます。つまり、「必要な時だけ通信する」という本来の自然な動きになります。
  • コマンドの応答: 久しぶりに dnf コマンドを打った時だけ、メタデータのダウンロード待ちで数秒〜十数秒待たされることがありますが、それだけです。

タイマーの無効化の手順

1.自動起動及びサービスを停止します

# タイマーを停止し、自動起動を無効にする
$ sudo systemctl disable --now dnf-makecache.timer
Removed '/etc/systemd/system/timers.target.wants/dnf-makecache.timer'.

# (オプション) 念入りに封印する場合(他のサービスからの呼び出しも拒否)
$ sudo systemctl mask dnf-makecache.timer
Created symlink '/etc/systemd/system/dnf-makecache.timer' → '/dev/null'.

2.設定内容を確認します

$ systemctl status dnf-makecache.timer
○ dnf-makecache.timer
     Loaded: masked (Reason: Unit dnf-makecache.timer is masked.)
    Drop-In: /etc/systemd/system/dnf-makecache.timer.d
             └─my-custom.conf
     Active: inactive (dead)
    Trigger: n/a 

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です