現在のバージョンのオペレーティングシステムで利用できるよりも新しいバージョンのソフトウェアが必要だとしたら、どうすればよいですか?
考慮すべきケース:
あたり 正規のQ&Aのリストをコンパイルしましょう これは、以下の正規の回答を置く場所として意図されています。答えはおそらくコミュニティwikiにする必要があります。
(この回答について質問/コメントがある場合は、コメントを追加してください。または、十分な担当者がいる場合は、チャットで私にpingを送信できます。)
Debianベースのディストリビューションのいくつかのバージョンを実行しているとします。利用可能なものよりも新しいバージョンのパッケージが必要です。すべての初心者がバイナリパッケージをDebianのバージョンに直接インストールすることを試みる最初のこと。これは、実行しているバージョン、およびパッケージがどれだけ新しいかによって、機能する場合と機能しない場合があります。一般に、この手順は適切に機能しません。
たとえば、testing/unstableから直接、stableにバイナリパッケージをインストールしようとしている場合を考えてみましょう。テスト/不安定がその時点で安定に非常に近い状態にならない限り、これはおそらくうまくいきません。その理由は、DebianのようなLinuxベースのバイナリディストリビューションの性質に関係しています。このようなオペレーティングシステムは共有ライブラリに大きく依存しており、これらの依存関係はバージョンに強く依存していることがよくあります。多くの場合、必要以上に多くなります。 Debianには現在、バージョンの依存関係を「タイト」にする適切な方法がありません。バージョンの依存関係は必要に応じて厳密に制限されるという簡単な方法です。
これはユーザーにとって何を意味しますか?たとえば、Debian不安定版からDebian安定版にslrn
をインストールしようとしているとします。これはどのように見えますか?
# apt-get install slrn/unstable
Reading package lists... Done
Building dependency tree
Reading state information... Done
Selected version '1.0.1-10' (Debian:testing [AMD64]) for 'slrn'
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
slrn : Depends: libc6 (>= 2.15) but 2.13-38+deb7u1 is to be installed
E: Unable to correct problems, you have held broken packages.
apt
によって生成されたエラーにもかかわらず、壊れたパッケージはありません。それで、何が悪かったのですか?問題は、unstable slrn
がコンパイルされたlibc6
のバージョンが、Debian安定版で使用可能なバージョンと異なる(バージョン番号が大きい)ことです。 (libc6
はGNU Cライブラリです。CライブラリはUnixライクなオペレーティングシステムの中心であり、GNU CライブラリはバージョンですLinuxベースのオペレーティングシステムが一般的に使用するものです。)
したがって、unstable slrn
は、stableで利用可能なバージョンよりも大きい番号のバージョンのlibc6
を必要とします。パッケージは上位バージョンのライブラリに対してコンパイルされているため、必ずしも上位バージョンのライブラリを必要とするわけではありませんが、多くの場合そうであることに注意してください。
構文
apt-get install slrn/unstable
つまり、不安定版slrn
を使用しますが、他のすべてのパッケージでは、安定版のバージョンのみを使用します。より正確には、優先順位番号を使用します。詳細については、man apt_preferences
をご覧ください。
人もできる
apt-get install -t unstable slrn
これははるかに機能する可能性が高くなりますが、通常は実行する必要はありません。どうして?
つまり、allのすべてのパッケージを、stableのパッケージと同じ立場で不安定に一時的に扱います。したがって、バージョン番号がより高い場合、unstable slrn
の依存関係は、unstableから取り込まれ、通常はそうなります。これには通常、すでに説明した理由によりGNU Cライブラリが含まれます。この依存関係は定義(unstable's slrn
has依存関係は、unstableで満たされていますが、突然、ビルド対象とは異なるバージョンのライブラリで強制的に実行されるパッケージが混在することになります。
それで、これを行う正しい方法は何ですか?それはあなたのシステムでより最近のバージョンのDebianソースを再構築することであり、一般に「バックポート」として知られています。以下のケースを検討してください。
そのバージョンのDebianで利用できる追加パッケージの準公式/公式ソースがあります。
最初に探す場所は Debian Backports です。これはDebianバックポートの公式サイトです。
具体的な例として:
リリースと更新に適切なバックポート行を追加して新しいパッケージを見つけ、バックポートから何かを明示的にインストールします(バックポートはデフォルトで非アクティブ化されているため)。
echo "deb http://ftp.debian.org/debian stretch-backports main" | Sudo tee /etc/apt/sources.list.d/stretch-backports.list
Sudo apt-get update
Sudo apt-get install -t stretch-backports git
これは、gitの最新の安定したバージョンを取得します。これには、stretchに含まれている安定したものよりも新しい便利な機能があります(たとえば、複数の構成ファイルを組み合わせたり、ユーザー名を〜/ work/projects/vs〜/ personal /に変更したりできる「include」 projects /)。
注目すべきもう1つの場所は、UbuntuメンテナによるさまざまなPPAです。 「パッケージ名PPA」で検索できます。
そのバージョンのOSで利用できるパッケージの最新バージョンはありませんが、OSのより新しいバージョン/リリースで利用できるより新しいバージョンがあります。これは、バックポートの標準的なケースです。
バックポーティングとは、実行しているバージョンの新しいバージョンのDebianからDebianソースを再構築することを意味します。この手順は、パッケージによっては簡単または複雑で難しい場合があります。これを行う方法の概要を次に示します。
具体的には、現在wheezyの現在のDebian安定版を実行していると仮定します。例として、パッケージslrn
を使用します。
まず、すべてのDebianパッケージファイルがソースディレクトリのdebian/
サブディレクトリにあることに注意してください。
最初のステップは、より新しいバージョンが利用可能かどうかを確認することです。これは、apt-cache policy
を使用して行うことができます。
apt-cache policy slrn
slrn:
Installed: 1.0.0~pre18-1.3
Candidate: 1.0.0~pre18-1.3
Version table:
1.0.1-10 0
50 http://debian.lcs.mit.edu/debian/ testing/main AMD64 Packages
50 http://debian.lcs.mit.edu/debian/ unstable/main AMD64 Packages
*** 1.0.0~pre18-1.3 0
500 http://debian.lcs.mit.edu/debian/ wheezy/main AMD64 Packages
100 /var/lib/dpkg/status
1.0.0~pre18-1.1 0
500 http://debian.lcs.mit.edu/debian/ squeeze/main AMD64 Packages
1.0.1-10
をバックポートします。
ステップ1:
注:ダウンロードするソースバージョンのdeb-src
行が/etc/apt/sources.list
に表示されていることを確認してください。たとえば、不安定版のslrn
をダウンロードする場合は、不安定版のdeb-src
行が必要です。そうしないと機能しません。ソースをダウンロードするために対応するdeb
行は必要ありませんが、apt-cache policy
はその情報を使用するため、対応するdeb
行がない場合は、apt-cache policy
は関連するバージョンを表示しません。 deb
行がある場合は、/etc/apt/preferences
などのエントリを使用して、新しいバージョンをピン留めすることを忘れないでください。たとえば、このような(unstableの)/etc/apt/preferences
のエントリは機能します。
Package: *
Pin: release a=unstable
Pin-Priority: 50
/etc/apt/sources.list
に行を追加する場合は、後でapt-get update
を実行することを忘れないでください。
slrn
のソースをダウンロードします。良い場所は/usr/local/src/slrn
です。
apt-get source slrn=1.0.1-10
ステップ2:
バージョン番号を少し変更して、バックポートとアップストリームバージョンを区別します。 dch -i
を実行すると、debian/changelog
ファイルにエントリが自動的に追加されます。次に、エントリを次のように変更します。
slrn (1.0.1-10.username) UNRELEASED; urgency=low
* Backport to wheezy.
-- User <user@domain> Sun, 02 Feb 2014 23:54:13 +0530
ステップ3:
ソースをビルドしてみます。ビルドに必要なパッケージが利用できない場合、試行は失敗します。ディレクトリをソースディレクトリに変更します。 debuild
パッケージのdevtools
を使用します。
cd slrn-1.0.1/
debuild -uc -us
ビルドの依存関係が満たされている場合、ソースはソースディレクトリの上のレベルでいくつかのdebをビルドして生成します。この場合は/usr/local/src/slrn
です。
ステップ4:
ビルドの依存関係が満たされていないとします。次に、ビルドの依存関係をインストールする必要があります。依存関係がご使用のバージョンで使用できない場合や、使用可能な場合、正しいバージョンで使用できない場合があるため、これは機能する場合と機能しない場合があります。
NB:残念ながら、Debianパッケージが必要以上のバージョンのビルド依存関係を必要とすることは珍しくありません。Debianでこれをチェックする自動化された方法はありません、そして多くの場合、パッケージのメンテナは、対応するバージョン/リリースで動作する限り、気にしません。したがって、依存バージョンに懐疑的な態度を取り、常識を使用してください。たとえば、PythonやGNUツールなどの広く使用されているパッケージは、Debianパッケージャーのリストに関係なく、依存関係の特定のバージョンに依存しません。
いずれにせよ、あなたはそれらをインストールすることを試みることができます
apt-get build-dep slrn=1.0.1-10
これが成功した場合は、パッケージのビルドを再試行してください(ステップ2)。失敗した場合は、さらに作業が必要です。 debuild
はdebian/control
ファイルのビルドの依存関係を確認し、必要に応じて変更できることに注意してください。それでは、これについてお話ししましょう。 slrnのビルド依存関係は次のとおりです。
Build-Depends: debhelper (>=9), libslang2-dev, libuu-dev,
exim4 | mail-transport-agent, libgnutls-openssl-dev, po-debconf, autoconf,
libcanlock2-dev, autotools-dev, dpkg-dev (>= 1.16.0), chrpath, dh-autoreconf, inn2-inews
apt-get build-dep
を使用する代わりに、これらを手動でインストールすることもできます。
apt-get install debhelper libslang2-dev ...
制御ファイルでこれらの値の変更を開始する場合は、手動インストールに切り替える必要があります。そうすると、apt-get build-dep
は正しく動作しなくなります。
利用可能なソフトウェアのより新しいバージョンのパッケージバージョンはありません。利用可能なオプションは、より新しいバージョンをパッケージ化することです。
多くの場合、以前のバージョンのソフトウェアのパッケージを新しいソースと組み合わせて再利用できます。このアプローチでは問題が発生する可能性があります。特に、以前のバージョンのソフトウェアに適用されたパッチはここでは適用されない可能性があるため、ソースと再同期する必要がある場合があります。現在標準となっている3.0(キルト)ソース形式はキルトを使用しており、パッチはdebian/patches
ディレクトリにあります。
ただし、これらの問題の詳細な説明は、この投稿の範囲外です。
Debianだけでなく常に機能する1つの方法は、必要なソフトウェアを自分でコンパイルすることです。 (私はこれを何年にもわたってDebianで行ってきました。入手可能な新しいバージョンが必要なときと、ソフトウェアがまったく提供されなかったときの両方です)。
stow
を使用して/use/local
にローカルでコンパイルされたパッケージを保存します。これにより、パッケージに関連するすべてのファイルをサブディレクトリツリーに保存し、そのツリーへのシンボリックリンクを作成できます。これにより、コンパイルされたパッケージの管理が簡単になります。インストールされたファイルは、Debianが提供するファイルと衝突せず、1つのコマンドでパッケージを削除できます。
パッケージをコンパイルしてインストールする手順(例:some_software
)は、通常、次のバリエーションです。
.tar
ファイルなどを/usr/local/src/
にダウンロードします。
ソフトウェアをダウンロードした場所、その機能、バージョンを記述し、コンパイルするために何をしなければならなかったかを記したファイル/usr/local/packages/some_software
を作成します(以下を参照)。
.tar
ファイルの内容を/usr/local/tmp/some_software
に解凍します。
または、リポジトリからコンパイルする場合は、適切なサブディレクトリ(/usr/local/git/some_software
など)でリポジトリをチェックアウトし、そこでコンパイルします。
cd
をこのディレクトリに入れ、README
、INSTALL
などを確認します。
ほとんどの場合、パッケージをconfigure
するautotoolsスクリプトがあります。 ./configure --prefix /usr/local/stow/some_software-version
で呼び出して、ファイルがこのサブディレクトリにインストールされるようにします。それ以外の場合は、Makefile
を読み、インストールされたファイルのパスを設定する方法を見つけます。
make
でコンパイルします。
make install
でインストールします。
cd /usr/local/stow
、次にstow some_software-version
機能するかどうかをテストします。
多くの場合、コンパイルは最初の試みでは機能しません。パッケージにはライブラリと対応するインクルードファイルが必要な場合があるため、Debianから正しい...-dev
パッケージをインストールする必要があります。または、gcc
は、パッケージの作成者が使用していない別のバージョンのgcc
について不満を言うかもしれません。したがって、コードを読み取って修正する必要がある場合もありますが、それはそれほど頻繁には起こりません。