私はDebian Jessieを使用しており、バックポートを追加しました(これらの指示):
echo "deb http://http.debian.net/debian jessie-backports main contrib non-free" | sudo tee /etc/apt/sources.list.d/backports.list
(必要に応じて、ラップトップの一部のハードウェア用に新しいカーネルを取得するためにこれを行いました。)
指示には、バックポートされたパッケージを明示的に要求しない限り、何も起こらないと書かれています。例apt-get -t jessie-backports install "package"
:
しかし、現在、システム全体がバックポートから取得されているようで、バックポートに更新された特定のバージョンに依存しているパッケージが 1 つアンインストールされました。
そこで私の質問は:
- バックポートがインストールされないように、まずこれを停止するにはどうすればよいでしょうか?
- 既存のバックポートを削除するにはどうすればよいですか?
注: これは、バックポートからのインストール済みパッケージのリストを取得します ( に渡すことができる形式ですがapt-get install
、何らかの理由で、sudo apt-get install
パイプラインの最後に echo の代わりに を配置しても機能しません )。
cat /var/log/dpkg.log.1 |grep -v linux | grep -v xserver | grep -v firmware | grep "status installed" | grep bpo | cut -d" " -f 5 | cut -d: -f 1 | xargs -i{} -n1 bash -c "dpkg-query -s {} >/dev/null && echo {}" | sed -r -e "s~.*~\0/jessie~" | xargs echo
注意:
一部のパッケージは自動的にインストールされるため、すべてを再インストールすると、これらの自動的にインストールされたパッケージは手動でインストールされたものとしてマークされます。したがって、必要がない場合は削除されません。
これを解決する方法について何かアイデアをお持ちの方はいらっしゃいますか?
答え1
/etc/apt/apt.conf
またはの下にあるファイルに以下を追加してみてください/etc/apt/apt.conf.d
:APT::Default-Release "jessie";
既存のバックポートを削除するには、どのバックポートがインストールされ、どのバージョンが置き換えられたかのリストを取得する必要があります。幸いなことに、この情報は以下から簡単に抽出できます。
/var/log/dpkg.log
例えば、grep ' upgrade ' /var/log/dpkg.log
次のような多くの行が表示されます。
2016-02-15 11:06:32 upgrade python-numpy:amd64 1:1.11.0~b2-1 1:1.11.0~b3-1
これは、2月15日の午前11時6分に、python-numpyをバージョン1:1.11.0~b2-1からバージョン1:1.11.0~b3-1にアップグレードしたことを示しています。
以前のバージョンにダウングレードしたい場合は、次のコマンドを実行します。
apt-get install python-numpy=1:1.11.0~b2-1
sid
注: この特定のケースでは、debian akaを実行しているため、おそらく動作しないでしょう。unstable
そのため、古いバージョンは deb リポジトリで利用できなくなっている可能性があります。jessiejessie
バージョンのパッケージを実行していて、jessie-backports バージョンへのダウングレードとして再インストールする場合は、期待どおりに動作します。
同様に、パッケージが削除されている場合は、remove
inを grep することで、そのパッケージとその正確なバージョンを見つけることができます/var/log/dpkg.log
。
awk
多くのパッケージの一括ダウングレードは、やなどの標準ツールを使用してほぼ自動化できますgrep
。たとえば、インストールした jessie-backports のアップグレードがすべて特定の日 (例: 2016-02-15) に実行されたことがわかっている場合は、次のようにして以前のバージョンにダウングレードできます。
apt-get -d -u install $(awk '/2016-02-15 ..:..:.. upgrade / {print $4 "=" $5}'
/var/log/dpkg.log)
(水平スクロールバーを避けるために改行とインデントを追加)
-d
( ) オプションの使用に注意してください--download-only
。コマンドを再実行し、apt-get install
必要なことだけが実行されることを検証した後で、そのオプションを削除してください。
awk
また、どのパッケージとバージョンが再インストールされるかを正確にリスト表示できるように、最初にそのコマンドの部分のみを単独で実行することをお勧めします。
答え2
適切に設定されていないようです/etc/apt/preferences
。次の設定により、jessie-backports からインストールするように指示されたもの (バックポートされたカーネルなど) 以外は何もインストールされなくなります。指定されたパッケージが、リストされていないバックポートからの他のパッケージを必要とする場合は、依然として問題が発生します。
Package: *
Pin: release n=jessie-backports
Pin-Priority: -1
Package: *
Pin: release n=jessie
Pin-Priority: 1000
# this will allow you to not have to use '-t jessie-backports install'
Package: linux-doc linux-headers-amd64 linux-image-amd64 linux-source
Pin: release n=jessie-backports
Pin-Priority: 1000
インストールされているバックポート パッケージのリストを取得する場合は、次のスクリプト (またはその一部) を使用できます。
chmod a+x name_of_script ./name_of_script > name_of_output_file
#!/bin/bash
RELEASES="jessie-backports"
echo "Searching for installed packages from" >&2
echo $RELEASES | sed s/^/" * "/ | sed s/\|/"\n * "/g >&2
for package in $(dpkg -l | grep -i ^ii | awk '{print $2}')
do
check=$( apt-cache policy $package 2>&1 | grep -i -A 1 "[*]" | egrep $RELEASES )
if [ "$check" == "" ] ; then
echo -ne "." >&2
else
echo -ne "#" >&2
echo
apt-cache policy $package
fi
done
echo >&2
echo
上記のスクリプトによってリストされたパッケージをダウングレードする場合は、次の行を追加します/etc/apt/preferences
。
Package: package1 package2 package3
Pin: release n=jessie
Pin-Priority: 1000
次に以下を実行します:
sudo apt-get upgrade
答え3
/etc/apt/preferences と /etc/apt/preferences.d/ の apt のピン留め設定を確認します。
カスタムのピン設定を追加して、それを忘れてしまった可能性はありますか? それが、apt がバックポートを優先するようにする唯一の方法だと思います。そうでない場合は、指定したパッケージに必要な依存関係をプルするだけです。
公式バックポートは、バックポート リポジトリのバックポート パッケージ リリース ファイルで、jessie よりも低い (100) 位置にすでに固定されています。apt が jessie-backports よりも jessie を優先するようにするために、apt 構成を行う必要はありません。