更新されたパッケージのロールバックをサポートするディストリビューションはありますか?


23

更新後に変更されたパッケージのロールバックをサポートするツールまたはディストリビューション全体がありますか?

例として、パッケージA、B、およびCをアップグレードしました。これらのパッケージを数日間使用した後、Bで重大なバグが発生します。

バグレポートを提出する一方で、Bを以前のバージョンにダウングレードして、これからやろうとしていることを完了する必要があります。一方、AはBに依存しているため、同様にダウングレードする必要がありますが、Cは両方に依存しないため、現在のバージョンのままにすることができます。

これをサポートするツールまたはディストリビューションはありますか?

ほとんどのディストリビューションにはパッケージをダウングレードする方法がありますが、通常は以前のパッケージがリポジトリから削除され、場合によっては(XサーバーとMesaをアップグレードした後など)本当に手に入らないため、それは通常、大雑把であるか不可能です。乱雑。


3
注意事項:パッケージバージョンの変更がマイナーな場合、以下の回答が適用される場合があります。ただし、パッケージを大きく変更すると、ディスク上のデータがアップグレードされる可能性があり、古いバージョンではその後正常に動作しないことに注意してください。たとえば、mysql-server(またはjoomla)メジャーアップグレードはフィールドの追加と変更、SQLテーブルのアップグレード、inn2アップグレードはデータベースタイプの変更、一部のディストリビューションカーネルアップグレードはext3をext4ファイルシステムにアップグレード、または一部のパッケージアップグレードは設定ファイルを変換します、これらの「ロールバック不可能な」変更に対する唯一の保護は、LVM / btrfs / etcスナップショット(または非常に遅いバックアップ/復元)です。
マティヤナリス

@MatijaNalis +1に言及してくれました!
ステフェンウィンクラー

回答:


21

NixOSはアップグレードロールバックをサポートしていますが、私が理解しているように、それはあなたが望むほどには行きません:A、B、およびCを1つの操作でアップグレードする場合、その操作全体をロールバックできますが、AおよびB.(A、B、Cをロールバックし、Cをアップグレードできるはずです...)トランザクションの観点からは、これは理にかなっています。

Debianの(との組み合わせでスナップショットアーカイブあなたは、もはや古いパッケージを持っている場合)あなたはBをダウングレードすることができます、とのようなツールaptaptitude意志、多くのケースでは、あなたがあなたと彼らを説得したらAも(ダウングレードする必要があることを把握します単純にアップグレードしたくないB)。しかし、あなたが言うように、それはやや厄介な傾向があり、パッケージのダウングレードはDebianではサポートされていません(つまり、ほとんどの場合は動作しますが、破損してもバグではありません)。


1
おもしろそう!コミュニティは活発で健康的に見えます。これを試してみます、ありがとうございます!金曜日の夕方までに、より良い/異なる回答がない場合は、回答をマークします。
ステフェンウィンクラー

NixOSでのロールバックは素晴らしいですが、本当の力は宣言的なアプローチにあります:パッケージ(およびシステム)の説明はgitリポジトリから取得できるため、ブランチを含むソフトウェアプロジェクトを管理するのと同じ方法でシステムを管理できますマージなど(およびアトミックアップグレードと純度のために、物事を壊すことはありません)
ダニエルジュール

Nixパッケージマネージャーは、他のLinuxディストリビューションで「ネイティブ」パッケージマネージャーと並行して実行することもできます。また、OSXで実行され、Windowsで動作する可能性があるという主張を見てきました。独自の複製をインストールするのではなく、一部のパッケージの「ネイティブ」バージョンを使用するようにNixに指示することもできますが、その方法の保証の一部は失われます(たとえば、依存関係を交換したことに気付かない場合があります)。
ウォーボ

参考までに、私はラップトップにNixOSをインストールすることができました(KDE4イメージはカーネルパニックを与えましたが、小さな(〜390 MB)イメージは問題なく起動しました。 、特にデスクトップ環境に関しては、パッケージマネージャーに関する特定のことをまだ理解していません。gdm/ gnome-shellをインストールしましたが、動作しません。 。それは、パッケージとその依存関係の両方がそれは再起動後に仕事をした再度ダウンロードされたが、私は理解していない理由。
ステファン・ウィンクラーに

@SteffenWinkler NixOSを使用する場合、通常はを使用してインストールするのでnix-envはなく、代わりにを指定しconfiguration.nixて実行しnixos-rebuild switchます。これには、すべてのシステム構成が1か所にあるという利点があり、システム全体の構成を簡単にバックアップできます(configuration.nixファイルをバックアップするだけです)。
パウアン

15

任意の上でyumベースのディストリビューション(例えばRed HatのELCentOSのなど、)、次のことができます。

  1. を使用してシステムへの変更の履歴を調べる sudo yum history list

    Loaded plugins: fastestmirror
    ID     | Login user               | Date and time    | Action(s)      | Altered
    ------------------------------------------------------------------------------
        10 | Administrator <admin>    | 2016-03-08 09:08 | Install        |   11   
         9 | Administrator <admin>    | 2016-03-03 16:48 | Install        |    1   
         8 | Administrator <admin>    | 2016-03-03 16:09 | Install        |    5   
         7 | Administrator <admin>    | 2016-02-26 18:13 | Install        |    1   
         6 | Administrator <admin>    | 2016-02-26 15:12 | Install        |   27   
         5 | Administrator <admin>    | 2016-02-26 15:07 | Install        |    1   
         4 | Administrator <admin>    | 2016-02-26 15:05 | Install        |    3  <
         3 | Administrator <admin>    | 2016-02-26 15:03 | Install        |    1 > 
         2 | Administrator <admin>    | 2016-02-26 15:01 | I, U           |   49   
         1 | System <unset>           | 2016-02-26 14:38 | Install        |  296   
    history list
    
  2. を使用して詳細を確認します sudo yum history info 10

  3. を使用して、履歴の前のポイントにロールバックします sudo yum history rollback 9

警告

いくつかの明らかな警告があります:

  1. 古いパッケージがもう利用できない場合は、トースト(@vonbrandを引用)します。
  2. yumの外側に何かをインストールすると、履歴が壊れる可能性があります。

私の例では<、IDを持つ行4(最後の列)で、そのポイントを超えてロールバックできないことを意味します。

sudo yum history rollback 2
Loaded plugins: fastestmirror
Transaction history is incomplete, before 4.
 You can use 'history rollback force', to try anyway.
Error: Failed history rollback, incomplete

3
興味深い機能!しかし、「トースト」のために私の法案に適合しません。
ステフェンウィンクラー

知る限り、これはRHEL / CentOS 6以降でのみ可能です。まだRHEL / CentOS 5を使用している場合は、SOLです。
ワイルドカード

ちなみに、マネージドリポジトリを備えた企業環境では、--enablerepoフラグを使用してダウングレード用に使用されていない古いリポジトリを有効にする必要がある場合でも、常に古いパッケージがあるため、このアプローチは非常に有効です。
ワイルドカード

古いバージョンを再度インストールするよりもロールバックすることの利点は何ですか?
ブラッチリー

@Bratchleyオートメーション!yum 単に時に依存関係のためのパッケージとインストールされたバージョンとチェックのリストを維持するの面倒を再インストールし、古いバージョンを。明らかにあなたはそれを手で行うことができます。
andcoz

7

のopenSUSE簡単に使用することができますはBtrfsファイルシステムでスナッパーを

インストール中に標準のファイルシステム設定を使用する場合、デフォルトで有効になります

鯛を有効にすると、それは完全に統合されているyast2zypper。何かをインストールまたはアップグレードする(またはユーザーを作成するなど)たびに、ファイルシステムのスナップショットが作成されます。

システムを以前の状態にロールバックするには、を実行するだけyast2 snapperです。

ここに画像の説明を入力してください


確かに興味深いツールです。私はext4が大好きです。これを研究します!SnapperはOpenSUSEではなく「btrfs」に「バインド」されていると仮定するのは正しいですか?
ステフェンウィンクラー

SnapperはSUSEによって開発されました。「イベント」でのBrtfsスナップショットの作成を自動化するツールのコレクションです。他のディストリビューションで使用できると思いますが、よくわかりません。いずれの場合でも、任意のディストリビューションでBrtfsスナップショットを手動で作成できます。
-andcoz

3
ボリュームにバイナリやスクリプトだけでなくデータが含まれている場合、スナップショットをロールバックすると、独自のデータもロールバックされることに注意してください。このオプションは危険で、ファイルシステムのレイアウトを本当に知っている人に最適です。私にとって、スナップショットは常に一貫したバックアップ、レプリケーション、および完全なリカバリの状況のた​​めのものでした。
-jimp

1
また、多くのパッケージにはファイルやディレクトリが/var含まれているため/、別のfsまたはサブボリュームであってもロールバックする必要があることに注意してください。OSアップグレードロールバックなどの機能に依存するよりも、実稼働サーバーに適用する前にアップグレードを徹底的にテストすることをお勧めします(これは、半分の方法で簡単に実行できますが、正しく解決するの非常に難しい問題です)。
cas

1
@Jimp良いアドバイス。いずれの場合でも、OpenSuSEは、スナップショットを作成しない/home別のファイルシステムにない限り、Snapperを有効にしません。
andcoz

6

AIXは、更新のロールバックが非常に得意です。まあ-私たちはUnix / Linuxサイトにいて、Linuxが欲しいと言ったことはありません:)

単一のAIXアップデートごとに、変更されたすべてのファイルが/ varファイルシステム内の個別のサブディレクトリに保存されます。更新は簡単なネイティブコマンドで元に戻すことができ、元に戻すにネットワークを起動する必要ありません。メディア/パッケージ必要ありません。また、何も再インストールする必要はなく、いずれにも依存しません。スナップショットテクノロジ-ファイルが更新前の状態で再表示されるという効果があります。

おまけとして、mksysb起動可能なスタンドアロンシステムバックアップを作成するための簡単なネイティブコマンドが1つあります。完全に機能していないシステムで簡単に起動できるファイルで、誤動作や破損が原因で起動しない。

そして、それはすべて数十年の歴史を持つ実績のある技術です:)


そのように復元されたプログラムが一貫性のない状態とロールバック(つまり、ストレージエンジンが変更されたデータベース、または新しい構成ファイル形式に切り替えられたサービス)で問題が発生することがよくありますか?それ?
ジョシュランブト16年

1
これは、従来圧縮/ gzip圧縮されたtarballで配布されていたソフトウェアの基本的なパッケージ管理システムを構築したときに使用したモデルです。更新プログラムをインストールするたびに、最初に、変更対象のすべての「ロールバックパッケージ」を構築しました。その後、このロールバックパッケージを使用して、一時的に他の更新パッケージが適用されていなければ、元に戻すことができます。適切なパッケージマネージャーがこれを行うことができるかどうかよく疑問に思っていましたが、逆の順序でのみロールバックするという制約を考えると、代わりにgitを使用する必要があります。
モンティハーダー

畜生。GNU / Linuxディストリビューションを意味することを明記すべきでした。しかし、興味深いことに、AIXは最近、GNU / Linuxの「プログラム」を実行できるようです。詳しく見ていきましょう。
ステフェンウィンクラー

5

Fedora(および他のディストリビューションでも同様です)では、以前のバージョンに戻るように依頼できます。

dnf downgrade <packages>

パッケージの最後から2番目のバージョンを取得し、次の方法で特定のバージョンを要求できます。

dnf downgrade <package>.<version>

これは、リポジトリでパッケージがまだ利用可能な場合にのみ機能します。この機能は決して前代未聞ではありません。アップグレードの一部が構成を変更することであった場合、ロールバックは必ずしも正確な過去のバージョンにはなりません。


dnf history undo #thingを使用して元に戻すこともできます
16年

This only works if the package(s) are still available in the repositories. うん、それはまさに問題です。特に、ローリングリリースディストリビューションの量に関しては、これに対する「より広範な」ソリューションはないように思えます。今のところ、NixOSが私の最善の選択肢のようです、または、差分のみで動作し、システムを最後の20(?)の更新で特定の時点に復元できる何らかのシステムイメージングツールが必要だと思われます。
ステフェンウィンクラー

@SteffenWinkler、古いパッケージがもう利用できない場合、あなたは乾杯です。明らかに。何らかのローカルバックアップがない限り。
フォンブランド

2
@MTilsted、すでに古すぎるので?リポジトリには、明け方のすべてのバージョンが含まれているわけではありません。
フォンブランド

1
dnf.conf(yum.confと同じ)にkeepcache = trueがあります。londキャッシュは手動でクリアされないため、古いパッケージが利用可能です。しかし、それは「肥大化」したパッケージキャッシュに行きました。
mmv-ru

2

Arch Linuxはパッケージとカーネルのダウングレードサポートしています。またdowngraderdowngradeツールをインストールしてプロセスを自動化することもできます。btrfsソリューションも機能します。以前は手動でロールバックするために使用していました。

システムをロールバックする方法:

sudo -i
mount /dev/sda3 /mnt/hd #mount the top btrfs subvolume
ls #find the version you want
mv @ @-old #move the '/' subvolume (I named mine '@')
btrfs sub snap @-<date> @ #replace @ with the backup from <date>
sync
reboot #the changes will take effect once the system restarts

btrfsの利点の1つは、サブボリュームと動的な「パーティション」を使用できることです。たとえば、/(@と呼ばれる)、/ tmp(@tmp)、および/ home(@home)のサブボリュームがあります。その後、これらのいずれも簡単にバックアップおよびロールバックできます。/ tmpは別のサブボリュームにあります。これは、システムの残りの部分で/ tmpをバックアップするのは無意味に思えます。なぜなら、ほとんどのリブートで消去されるからです。


ウィキのリンクを辿ってここに行きました。それはかなりクールに見え、リポジトリをチェックすることから、2013年に遡るファイルがあります!これが存在するのになぜbtrfsの方法を使用するのですか?「アップグレードされた」ファイルのため?それとも他の理由がありますか?
ステフェンウィンクラー

NixOSに短い訪問を払った後、今ではArch Linuxに永久に切り替えました。それ(Arch Linux)は私がいつも思っていたほど不安定ではなく、健全なコミュニティを持っています。
ステフェンウィンクラー

@SteffenWinklerそれは正しいです。また、Archダウングレードオプションは「公式」にサポートされておらず、ダウングレードはおそらく依存関係を無視します(何かがうまくいかない場合はかなり面倒になります)。
カレブレイスター

2

私はArch Linuxを使用しており、ダウンロードしたすべてのパッケージを保存している/var/cache/pacman/pkg/ため、いつでもパッケージをダウングレードできます(起動できない場合、ライブUSBを使用します)。Arch Wikiから:

pacman -U <file_name_of_the_package>

パッケージがアップグレードされないようにするには/etc/pacman.conf、次のようにパッケージ名を含めます。

IgnorePkg=linux

スペースを節約するために、以下を使用してキャッシュフォルダーをクリアできます。

pacman -Sc

古いパッケージをすべて削除して最新のパッケージを保持するか、-Sccすべてを削除するために使用します。


これは(パッケージを無視して)部分的にアップグレードされることに注意してください。これはサポートされていませ
...-jasonwryan

ウィキのリンクを辿ってここに行きました。それはかなりクールに見え、リポジトリをチェックすることから、2013年に遡るファイルがあります!これが存在するのになぜbtrfsの方法を使用するのですか?「アップグレードされた」ファイルのため?それとも他の理由がありますか?
ステフェンウィンクラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.