<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kzkn</id>
	<title>ArchWiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kzkn"/>
	<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Kzkn"/>
	<updated>2026-04-13T18:44:59Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.44.3</generator>
	<entry>
		<id>https://wiki.archlinux.jp/index.php?title=Pacman/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E5%BE%A9%E5%85%83&amp;diff=29711</id>
		<title>Pacman/ローカルデータベースの復元</title>
		<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php?title=Pacman/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E5%BE%A9%E5%85%83&amp;diff=29711"/>
		<updated>2023-02-04T02:45:39Z</updated>

		<summary type="html">&lt;p&gt;Kzkn: コマンドを最新化、軽微な文言の修正&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:パッケージ管理]]&lt;br /&gt;
[[en:Pacman/Restore local database]]&lt;br /&gt;
[[zh-hans:Pacman/Restore local database]]&lt;br /&gt;
ローカルデータベースの復元が必要だとわかる兆候:&lt;br /&gt;
&lt;br /&gt;
* {{ic|pacman -Q}} で何も出力がされず、{{Ic|pacman -Syu}} でシステムが最新だと表示されるとき。&lt;br /&gt;
* {{ic|pacman -S package}} を使ってパッケージをインストールしようとすると、既にインストールされている依存パッケージのリストが出力される。&lt;br /&gt;
&lt;br /&gt;
以上の場合、十中八九、インストールしたソフトウェアの pacman データベースである {{ic|/var/lib/pacman/local}} が破損していたり削除されています。これは深刻な問題ですが、以下の手順に従うことで復元することができます。&lt;br /&gt;
&lt;br /&gt;
まず、pacman のログファイルが存在するか確認します:&lt;br /&gt;
&lt;br /&gt;
 $ ls /var/log/pacman.log&lt;br /&gt;
&lt;br /&gt;
ログファイルが存在しない場合は、この方法で続行することは不可能です。[https://bbs.archlinux.org/viewtopic.php?pid=670876 Xyne のパッケージ検出スクリプト] を使ってデータベースを再作成してみてください。それができない場合、解決方法としてはシステム全体を再インストールするしかありません。&lt;br /&gt;
&lt;br /&gt;
== パッケージの復旧リストを生成する ==&lt;br /&gt;
&lt;br /&gt;
{{Warning|何らかの理由で [[pacman]] のキャッシュや [[makepkg]] の保存先に他のアーキテクチャのパッケージが含まれている場合、先に削除してください。}}&lt;br /&gt;
&lt;br /&gt;
ログフィルタースクリプトを作成して実行可能権限を付与:&lt;br /&gt;
&lt;br /&gt;
{{hc|pacrecover|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
. /etc/makepkg.conf&lt;br /&gt;
&lt;br /&gt;
PKGCACHE=$((grep -m 1 &#039;^CacheDir&#039; /etc/pacman.conf || echo &#039;CacheDir = /var/cache/pacman/pkg&#039;) | sed &#039;s/CacheDir = //&#039;)&lt;br /&gt;
&lt;br /&gt;
pkgdirs=(&amp;quot;$@&amp;quot; &amp;quot;$PKGDEST&amp;quot; &amp;quot;$PKGCACHE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while read -r -a parampart; do&lt;br /&gt;
  pkgname=&amp;quot;${parampart[0]}-${parampart[1]}-*.pkg.tar.{xz,zst}&amp;quot;&lt;br /&gt;
  for pkgdir in ${pkgdirs[@]}; do&lt;br /&gt;
    pkgpath=&amp;quot;$pkgdir&amp;quot;/$pkgname&lt;br /&gt;
    [ -f $pkgpath ] &amp;amp;&amp;amp; { echo $pkgpath; break; };&lt;br /&gt;
  done || echo ${parampart[0]} 1&amp;gt;&amp;amp;2&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
スクリプトを実行してください (任意でパッケージが含まれている追加のディレクトリをパラメータで渡して下さい):&lt;br /&gt;
&lt;br /&gt;
 $ paclog --pkglist --logfile=/var/log/pacman.log | ./pacrecover &amp;gt;files.list 2&amp;gt;pkglist.orig&lt;br /&gt;
&lt;br /&gt;
このコマンドで2つのファイルが作成されます: マシンに存在するパッケージファイルが載った {{Ic|files.list}} と、ダウンロードするべきパッケージが載った {{Ic|pkglist.orig}} です。後者ではマシンに存在する、古いバージョンのパッケージのファイルと、新しいバージョンのファイルでミスマッチが発生することがあります。ミスマッチは手動で修正する必要があります。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで自動的に後者のリストをリポジトリに存在するパッケージだけに絞ることができます:&lt;br /&gt;
&lt;br /&gt;
 $ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d &amp;gt; pkglist&lt;br /&gt;
&lt;br /&gt;
重要な &#039;&#039;base&#039;&#039; パッケージが欠けていないか確認して、リストに加えます:&lt;br /&gt;
&lt;br /&gt;
 $ comm -23 &amp;lt;(pacman -Sgq base | sort) pkglist.orig &amp;gt;&amp;gt; pkglist&lt;br /&gt;
&lt;br /&gt;
両方のリストの中身が問題ないようでしたら、次に進んでください。リストを使用して pacman のパッケージデータベースを復旧します: {{ic|/var/lib/pacman/local/}}。&lt;br /&gt;
&lt;br /&gt;
== リカバリを実行する ==&lt;br /&gt;
&lt;br /&gt;
リカバリのための bash 関数を定義してください:&lt;br /&gt;
&lt;br /&gt;
 recovery-pacman() {&lt;br /&gt;
     pacman &amp;quot;$@&amp;quot;  \&lt;br /&gt;
     --log /dev/null   \&lt;br /&gt;
     --noscriptlet     \&lt;br /&gt;
     --dbonly          \&lt;br /&gt;
     --overwrite &amp;quot;*&amp;quot;   \&lt;br /&gt;
     --nodeps          \&lt;br /&gt;
     --needed&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
{{ic|--log /dev/null}} は不必要に pacman のログを生成することを避け、{{Ic|--needed}} は既にデータベースに存在するパッケージを省略し、{{Ic|--nodeps}} はキャッシュされているパッケージのインストールを許可します。他のオプションはファイルシステムを読み書きすることなく &#039;&#039;&#039;pacman&#039;&#039;&#039; を操作できるようにします。&lt;br /&gt;
&lt;br /&gt;
同期データベースを作成:&lt;br /&gt;
&lt;br /&gt;
 # pacman -Sy&lt;br /&gt;
&lt;br /&gt;
{{ic|files.list}} からローカルで利用可能なパッケージファイルをインストールしてデータベースの生成を開始:&lt;br /&gt;
&lt;br /&gt;
 # recovery-pacman -U $(&amp;lt; files.list)&lt;br /&gt;
&lt;br /&gt;
{{ic|pkglist}} から残りをインストール:&lt;br /&gt;
&lt;br /&gt;
 # recovery-pacman -S $(&amp;lt; pkglist)&lt;br /&gt;
&lt;br /&gt;
ローカルデータベースを更新して、他のパッケージから必要とされてないパッケージを「明示的にインストールした」とし、他のパッケージを「依存パッケージ」とします。パッケージを削除するときは特別な注意が必要になりますが、データベースが壊れている以上これがベストです。&lt;br /&gt;
&lt;br /&gt;
 # pacman -D --asdeps $(pacman -Qq)&lt;br /&gt;
 # pacman -D --asexplicit $(pacman -Qtq)&lt;br /&gt;
&lt;br /&gt;
任意でインストールされたパッケージに破損が存在しないかチェックします:&lt;br /&gt;
&lt;br /&gt;
 # pacman -Qk&lt;br /&gt;
&lt;br /&gt;
任意で[[Pacman ヒント#ファイルがどのパッケージにも所有されていないことを確認|ファイルがどのパッケージにも所有されていないことを確認]]してください。&lt;br /&gt;
&lt;br /&gt;
全てのパッケージをアップデート:&lt;br /&gt;
&lt;br /&gt;
 # pacman -Su&lt;/div&gt;</summary>
		<author><name>Kzkn</name></author>
	</entry>
</feed>