ローカルAPTリポジトリを作成する方法は?


103

LAN上に独自のローカルリポジトリを構築して、LAN上のマシンがそこから更新およびアップグレードできるようにします。インターネットを使用せずにパッケージを更新、アップグレード、インストールなどできるように、パッケージをダウンロードしてローカルサーバーに保存します。



3
重複しているとは思わない。maythuxが達成したいのは、aptitudeで使用する独自のリポジトリサーバーを作成することです。Keryxは、aptitudeをパッケージマネージャーとして置き換え、パッケージの外部ソースを作成します。
CON-F-使用

1
重複する可能性がありますか?- askubuntu.com/questions/9809/...またはaskubuntu.com/questions/3503/...
JRG

回答:


80

Ubuntuのヘルプウィキ

自分用のシンプルなリポジトリを設定するには、4つのステップがあります

1.インストール2. dpkg-dev
パッケージをディレクトリに
配置3.パッケージをスキャンし、apt-get updateが読み取れるファイルを作成するスクリプトを作成
4.リポジトリを指すsources.listに行を追加

dpkg-devをインストールする

ターミナルを入力

sudo apt-get install dpkg-dev

ディレクトリ

パッケージを保管するディレクトリを作成します。この例では、使用します/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

次に、作成したディレクトリにパッケージを移動します。

以前にダウンロードしたパッケージは通常、システムの/var/cache/apt/archivesディレクトリに保存されます。apt-cacherをインストールしている場合、追加のパッケージが/ packagesディレクトリに保存されます。

スクリプトupdate-mydebs

シンプルな3つのライナーです。

#! /bin/bash
 cd /usr/local/mydebs
 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

上記をカットしてgeditに貼り付け、update-mydebsとして〜/ binに保存します。(チルダ「〜」はホームディレクトリを意味します。〜/ binが存在しない場合は作成します。UbuntuはそのディレクトリをPATHに配置します。個人用スクリプトを置くのに適した場所です)。次に、スクリプトを実行可能にします。

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackagesmydebs内のすべてのパッケージを調べ、出力は圧縮され、apt-get updateが読み取れるファイル(Packages.gz)に書き込まれます(詳細についてはこれについて説明するリファレンスを参照してください)。/ dev / nullは空のファイルです。パッケージに関する追加情報を保持するオーバーライドファイルの代わりになりますが、この場合は実際には必要ありません。詳細については、deb-override(5)を参照してください。

Sources.list

行を追加

deb file:/usr/local/mydebs ./

/etc/apt/sources.listに追加すれば完了です。

CDオプション

debsを含むディレクトリをCDに書き込み、リポジトリとしても使用できます(コンピューター間で共有するのに適しています)。CDをリポジトリとして使用するには、単に実行します

sudo apt-cdrom add

リポジトリの使用

mydebsディレクトリに新しいdebを配置するたびに、実行します

sudo update-mydebs
sudo apt-get update

ローカルパッケージは、Synaptic、aptitude、aptコマンドで操作できます。apt-get、apt-cacheなど。インストールをapt-getしようとすると、満たされている限り、依存関係は解決されます。 。

うまく作られていないパッケージはおそらく失敗しますが、dpkgの地獄に耐えることはできません。


3
行の構文を説明してもらえますかdpkg-scanpackages . /dev/null | gzip -9c > Packages.gz。そこで何をし/dev/nullています。私もマニュアルページを読みましたが、はっきりしていませんでした。
-sayantankhan

@ blade19899ちょっとした説明が必要です。私が今まで触れたすべてのパッケージではなく、いくつかの選択されたパッケージのみを含むリポジトリが必要です。このテクニックが私にその能力を与えることは正しいですか?ここでの目標は、ソフトウェアインストールグループが不要なapt-getの誘惑から遠く離れた、孤立したLANで使用できるリポジトリを持つことです。
ウェスミラー

@WesMiller彼の投稿を編集する必要があると思います!
blade19899

@ blade19899ごめんなさい、あなたの答えがわかりません。
ウェスミラー

@WesMiller uが私は文法の問題(私はしばらくの間そのビンを考えて)これが私の答えではありませんが、BigSackのための彼のポスト編集したBigSackを必要とする
blade19899

41

* LAN経由でオフラインリポジトリを作成するには*

ローカルApache Webサーバーをインストールする

# apt-get install apache2

デフォルトでは、DebianのApacheパッケージは/var/wwwシステム上にWebサイトをセットアップします。私たちの目的にとっては、それで問題ないので、これ以上何もする必要はありません。あなたは簡単にお好みのブラウザをポイントすることによってそれをテストすることができhttp://localhost、実際に中に保存されているデフォルトのインストール後のWebページが表示されるはずですあなた/var/www/index.html


のDebianパッケージ・リポジトリディレクトリの作成

ディレクトリを作成することにしました/var/www/debsこのため。その下に、サポートする必要がある各アーキテクチャに1つずつ、「アーキテクチャ」ディレクトリを作成する必要があります。1台のコンピューター(またはコンピューターの種類)のみを使用している場合、必要なものは1つだけです。通常、32ビットシステムの場合は「i386」、64ビットの場合は「amd64」です。他のアーキテクチャを使用している場合、おそらくこれについてはすでに知っていると思います。次に、特定のアーキテクチャの「.deb」パッケージファイルを適切なディレクトリにコピーします。お気に入りのWebブラウザでhttp://localhost/debs/amd64(たとえば)をポイントすると、64ビットシステムのパッケージのリストが表示されます。


Packages.gzファイルを作成する

ここで、APTが使用するカタログファイルを作成する必要があります。これは、「dpkg-scanpackages」というユーティリティを使用して行われます。ここに'

# cd /var/www/debs/

# dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz




リポジトリをAPT

に知らせるこれで、あとは、APTにリポジトリについて知らせるだけです。これを行うには、/ etc / apt / sources.listファイルを更新します。次のようなエントリが必要です。

deb http://localhost/debs/ amd64/

localhostの代わりにシステムの実際のホスト名を使用しました-このようにコードはLAN上のすべてのコンピューターで同じですが、1台のコンピューターのみを実行している場合はlocalhostで十分です。
次に、APTを更新します。

# apt-get update

2
その行を/etc/apt/sources.listに追加すると、LANにないときに更新が中断されますか?
フェリックス

2
Ubuntu 16.04の場合/var/www/debs、この回答をに置き換える必要があります/var/www/html/debs。または、Apacheの設定を手動で編集するには追加の手順が必要になります/etc/apache2
Erik

18

認証済みリポジトリの作成

私はここと他のサイトで答えを見ましたが、ほとんどは認証されていないリポジトリを設定しているという(私見で大きな)不利な点があります。これは、パッケージをインストールするためにapt-getwith を実行する必要があることを意味しています--allow-unauthenticated。これは、特にインストールするパッケージがすべてローカルリポジトリのものではない可能性があるスクリプトでは、セキュリティリスクになる可能性があります。

ここではLAN経由で利用可能にする方法については説明していませんが、Apacheまたはnginxを使用したかなり一般的な構成です(他の回答を参照)。

リポジトリディレクトリをセットアップする

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial

次に、次のような行を追加しsources.listます。

deb file:/home/srv/packages/local-xenial/ ./

パッケージの追加と削除

パッケージを削除する

rm /home/srv/packages/local-xenial/some_package_idont_like

パッケージを追加する

cp /some/dir/apackage.deb /home/srv/packages/local-xenial

パッケージ、リリース、およびInReleaseファイルを生成し、gpgプライベートキーで署名する次のスクリプトを実行します。

#!/bin/bash

if [ -z "$1" ]; then
       echo -e "usage: `basename $0` DISTRO
where DISTRO is the Ubuntu version codename (e.g. 14.04 is trusty)\n
The way to use this script is to do the changes to the repo first, i.e. delete or copy in the .deb file to /srv/packages/local-DISTRO, and then run this script\n
This script can be run as an unprivileged user - root is not needed so long as your user can write to the local repository directory"
else
    cd /srv/packages/local-"$1"

    # Generate the Packages file
    dpkg-scanpackages . /dev/null > Packages
    gzip --keep --force -9 Packages

    # Generate the Release file
    cat conf/distributions > Release
    # The Date: field has the same format as the Debian package changelog entries,
    # that is, RFC 2822 with time zone +0000
    echo -e "Date: `LANG=C date -Ru`" >> Release
    # Release must contain MD5 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e 'MD5Sum:' >> Release
    printf ' '$(md5sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release
    # Release must contain SHA256 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e '\nSHA256:' >> Release
    printf ' '$(sha256sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(sha256sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release

    # Clearsign the Release file (that is, sign it without encrypting it)
    gpg --clearsign --digest-algo SHA512 --local-user $USER -o InRelease Release
    # Release.gpg only need for older apt versions
    # gpg -abs --digest-algo SHA512 --local-user $USER -o Release.gpg Release

    # Get apt to see the changes
    sudo apt-get update
fi

conf / distributionsファイルの内容の例

Origin: My_Local_Repo Label: My_Local_Repo Codename: xenial Architectures: i386 amd64 Components: main Description: My local APT repository SignWith: 12345ABC

リンク集

https://wiki.debian.org/RepositoryFormat

http://ubuntuforums.org/showthread.php?t=1090731

https://help.ubuntu.com/community/CreateAuthenticatedRepository


あなたの編集が使用された@Phillip date -Rc、私はそれをdate -Ru編集説明からあなたが意味するものと仮定して修正しました
-muru

おかげで、私は最近、生成された日付がUTCではなくローカルTZにあるため、これについてaptから警告を受け取り始めました。私は自分のスクリプトで修正しましたが、ここで編集するのを忘れています
-happyskeptic

1
@KevinJohnson主要な回答を、地元のaptリポジトリのファイルの例で更新しました
-happyskeptic

8

nginxとrepreproによってローカルソースサーバーをセットアップすることもできます。

  1. Debianパッケージをインストールする

    sudo apt-get install reprepro nginx 
    
  2. repreproのディレクトリを作成して編集する

    sudo mkdir -p /srv/reprepro/ubuntu/{conf,dists,incoming,indices,logs,pool,project,tmp}
    
    $ cd /srv/reprepro/ubuntu/
    $ sudo chown -R `whoami` . # changes the repository owner to the current user
    

    / srv / reprepro / ubuntu / conf / distributions

    Origin: Your Name
    Label: Your repository name
    Codename: karmic
    Architectures: i386 amd64 source
    Components: main
    Description: Description of repository you are creating
    SignWith: YOUR-KEY-ID
    

    / srv / reprepro / ubuntu / conf / options

    ask-passphrase
    basedir .
    
  3. それをrepreproに含めてビルドします

    $ reprepro includedeb karmic /path/to/my-package_0.1-1.deb \
    # change /path/to/my-package_0.1-1.deb to the path to your package
    
  4. 構成nginx:

    /etc/nginx/sites-available/vhost-packages.conf

    server {
      listen 80;
      server_name packages.internal;
    
      access_log /var/log/nginx/packages-access.log;
      error_log /var/log/nginx/packages-error.log;
    
      location / {
        root /srv/reprepro;
        index index.html;
      }
    
      location ~ /(.*)/conf {
        deny all;
      }
    
      location ~ /(.*)/db {
        deny all;
      }
    }
    
  5. バケットサイズを最適化する:

    /etc/nginx/conf.d/server_names_hash_bucket_size.conf

    server_names_hash_bucket_size 64;
    

インストールガイドへのリンクの参照


4
これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
gertvdijk

@elprup:その答えを更新するのを忘れている必要があります:)
0xC0000022L

repreporは、同じパッケージの複数のバージョンをサポートしていません。それは奇妙に聞こえるが、これはrepreproが動作する方法である
maxadamo

6

あなたは見てみることをお勧めしますapt-mirrorapt-cacher

これをインストールして使用する方法のガイドを次に示します。


あなたの5年前の回答にはLQのフラグが付けられています。削除される場合は、メタに移動して、削除の取り消しを要求します。開いままにすることに投票しましたが、編集が必要です! ;-)
Fabby

5

@BigSackの回答Ubuntuの公式wiki投稿の指示は、Ubuntu 18.04では次の2つの変更を加えるまで機能しませんでした。

  1. プレーンな非圧縮Packagesファイルを生成します(これを実行する場合、作業ディレクトリすべてのパッケージがある場所でなければなりません

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. に次のエントリを追加します /etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    

4

ローカルリポジトリを作成する理由はいくつかあります。1つ目は、更新するUbuntuマシンが複数ある場合に帯域幅を節約することです。たとえば、少なくとも1週間に1回更新が必要なUbuntuマシンが25台ある場合、リポジトリ以外のすべてをローカルで実行できるため、帯域幅を大幅に節約できます。

ほとんどの組織には、ネットワークゲートウェイ用の適切な帯域幅がありますが、この帯域幅は貴重な商品であり、賢明に使用する必要があります。

多くの組織では、ゲートウェイにまだ10MBまたは100MBの制限があるルーターがありますが、内部で1 GBのネットワーク接続があるため、内部で帯域幅をより適切に使用できます。独自のリポジトリを作成する2番目の理由は、内部Ubuntuマシンにロードするアプリケーションを制御できることです。

組織がローカルネットワーク上で使用したくないアプリケーションは、マシンを更新するリポジトリから削除できます。さらに良いことに、テストボックスを作成し、アプリケーションとバージョンをテストしてからネットワークに展開してから、セキュリティと安定性を確保できます。

最初にミラーをセットアップする必要があります。それを行うには、キーボードのCtrl+ Alt+ Tを押し てターミナルを開くだけです。開いたら、以下のコマンドを実行します。

apt-get install apt-mirror 

apt-mirrorをセットアップしたら、このコマンドを使用してリポジトリのダウンロードを開始できます。

apt-mirror /etc/apt/mirror.list 1

読む

1ソース: Ubuntuリポジトリの作成


申し訳ありませんが、リンクが死んでいる
xamiro

3

オフラインのローカルリポジトリを作成するには
1.ディレクトリにアクセスできるようにします(少なくともルートで)

sudo mkdir / var / my-local-repo

  1. すべてのdebファイルをこのディレクトリにコピーします。
  2. ディレクトリをスキャンする

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Packages

  1. ローカルリポジトリをソースに追加します

echo "deb file:/ var / my-local-repo ./"> /tmp/my-local.list

sudo mv /tmp/my-local.list /etc/apt/sources.list.d/my-local.list

sudo apt-get update


多かれ少なかれ同じことが公式wikiにもあります:リポジトリ/個人-コミュニティヘルプWiki
sdaau 14

1

apt-rdepends選択した回答のように使用しようとしましたが、ローカルリポジトリからパッケージをインストールしようとすると、依存関係の欠落について不満がありました。

apt-rdependsパッケージの依存関係の一部をリストしていませんでした。事実と関係があるのではないかと思いますが、それapt-cache showは複数のレコードを示しています。

代わりにapt-cache depends、を使用しましたが、それでうまくいきました。

依存関係の再帰的なリストを取得する

apt-cache depends <packagename> -i --recurse

-i:重要な依存関係のみ --recurse:再帰的

消化可能なリストに変える

  • 記号とスペースの削除: | tr -d "|,<,>, "
  • 依存の削除:&PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • リストの並べ替え: | sort
  • 一意の値のみ: | uniq > list.txt

完全なコマンド:

apt-cache depends <packagename> -i --recurse | tr -d "|,<,>, " | sed -e \
's/^Depends://g' | sed -e 's/^PreDepends://g' | sort | uniq > list.txt

パッケージをダウンロードする

for i in $( cat list.txt ); do apt-get download $i; done;

パッケージをスキャンし、Packages.gzに変換します

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

1
あなたが話している答えを参照することをお勧めします
anonymous2

-1

apt-mirrorを使用しました。

良いのですが、リポジトリサーバーと同期するため、より多くのハードドライブ領域が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.