設定ファイルを編集している途中で誤って保存してしまった、あるいは変更を加えすぎてどこがおかしいか分からなくなった、というケースは珍しくありません。バックアップがない状況でも、パッケージ管理の仕組みを使えばパッケージが本来持っているオリジナルのファイルを取り出すことができます。このページでは、その手順を Debian/Ubuntu 系と RHEL/CentOS/Rocky Linux 系に分けて説明します。
設定ファイルを取り戻す基本的な考え方
Linux のパッケージ(.deb や .rpm)には、インストール先のファイルがすべてアーカイブとして格納されています。パッケージをシステムに展開せずに手元に取得し、その中から目的の設定ファイルだけを取り出すことで、パッケージ標準の内容を手に入れることができます。
操作の流れは次のとおりです。
- 問題のファイルがどのパッケージに属するかを確認する
- そのパッケージのファイルをローカルにダウンロードする
- アーカイブを展開し、目的のファイルを取り出す
- 現在のファイルをバックアップしてから上書きする
上書きすると、それまでに手動で加えた変更はすべて失われます。壊れているとはいえ、変更内容を記録しておきたい場合は事前に別の場所へ退避させておくと安全です。
対象のパッケージ名を調べる
最初に、復旧したいファイルがどのパッケージから提供されているかを調べます。ファイルパスを手がかりにして検索できます。
Debian/Ubuntu 系の場合(dpkg を使います)
dpkg -S /etc/nginx/nginx.conf
次のように出力されれば、nginx パッケージが対象です。
nginx: /etc/nginx/nginx.conf
RHEL/CentOS/Rocky Linux 系の場合(rpm を使います)
rpm -qf /etc/nginx/nginx.conf
次のように出力されれば、nginx パッケージが対象です。
nginx-1.24.0-1.el9.x86_64
「not found」と表示される場合、そのファイルはパッケージ管理の対象外です。手動で配置されたファイルや、別の手順で生成されたファイルの可能性があります。
Debian/Ubuntu 系:パッケージからファイルを取り出す
作業用のディレクトリを作り、パッケージファイルをダウンロードします。
mkdir -p /tmp/pkg-restore
cd /tmp/pkg-restore
apt-get download nginx
カレントディレクトリに nginx_*.deb が保存されます。次に dpkg -x でアーカイブを展開します。
dpkg -x nginx_*.deb /tmp/pkg-restore/extracted/
展開後、/tmp/pkg-restore/extracted/ の下にシステムへのインストール先と同じディレクトリ構造が再現されます。目的のファイルを次のように確認できます。
ls /tmp/pkg-restore/extracted/etc/nginx/
RHEL/CentOS/Rocky Linux 系:パッケージからファイルを取り出す
作業用のディレクトリを作り、パッケージファイルをダウンロードします。
mkdir -p /tmp/pkg-restore
cd /tmp/pkg-restore
dnf download nginx
カレントディレクトリに nginx-*.rpm が保存されます。RPM アーカイブの展開には rpm2cpio と cpio を組み合わせます。
rpm2cpio nginx-*.rpm | cpio -idmv
展開後、/tmp/pkg-restore/ の下にシステムへのインストール先と同じディレクトリ構造が再現されます。目的のファイルを次のように確認できます。
ls /tmp/pkg-restore/etc/nginx/
dnf download が使えない環境(古い CentOS 7 など)では、yum-utils パッケージに含まれる yumdownloader コマンドを代わりに使います。
yumdownloader nginx
取り出したファイルを適用する
上書き前に現在のファイルを退避させます。
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
取り出したオリジナルファイルをコピーします。Debian/Ubuntu 系では次のようになります。
cp /tmp/pkg-restore/extracted/etc/nginx/nginx.conf /etc/nginx/nginx.conf
RHEL 系では展開先のパスからコピーします。
cp /tmp/pkg-restore/etc/nginx/nginx.conf /etc/nginx/nginx.conf
設定ファイルの構文チェックや再起動は、対象のサービスに応じた方法で行います。nginx の場合は次のとおりです。
nginx -t
systemctl restart nginx
構文チェックコマンドはサービスによって異なります。Apache なら apachectl configtest、sshd なら sshd -t など、各サービスのドキュメントを参照してください。
よくあるつまずき
「apt-get install –reinstall で元に戻らない」
パッケージ管理下の設定ファイル(conffile)は、apt による再インストールでは既存ファイルを上書きしないのが標準的な動作です。このため --reinstall を実行しても壊れた内容がそのまま残ります。dpkg -x で展開して手動コピーする方法が確実です。
「.dpkg-dist や .rpmorig というファイルが既にある」
パッケージのアップグレード時に設定ファイルの内容が変わっていた場合、パッケージ管理ツールが新しいバージョンのファイルを .dpkg-dist(Debian 系)や .rpmnew(RHEL 系)という名前でその場に残していることがあります。この場合は新たにパッケージを取得しなくても、その退避ファイルをコピーするだけで済みます。
ls /etc/nginx/nginx.conf*
上記のようにファイルを確認し、.dpkg-dist や .rpmnew が存在すれば活用できます。
「取り出したファイルのパーミッションが変わってしまった」
コピー後にパーミッションや所有者が意図しない状態になっている場合があります。コピー前後で ls -l を使って比較し、必要に応じて chmod や chown で修正してください。
「ファイルを戻してもサービスが起動しない」
一般的に、設定ファイルが複数ある場合、1 ファイルだけ戻しても別のファイルに問題が残っていることがあります。include ディレクティブで読み込んでいるサブディレクトリや断片ファイルも合わせて確認してください。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
