web-dev-qa-db-ja.com

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

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

102
user61928

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

ローカルApache Webサーバーのインストール

# apt-get install Apache2

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


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

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


Packages.gzファイルを作成

次に、APTが使用するカタログファイルを作成する必要があります。これは、「dpkg-scanpackages」というユーティリティを使用して行われます。 LAN上のAMD64パッケージを更新するために使用するコマンドは次のとおりです。

# 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
41
user61928

buntu Help wiki から:

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

1.インストールdpkg-dev
2。パッケージをディレクトリに入れます
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-scanpackagesはmydebsのすべてのパッケージを調べ、出力は圧縮され、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の地獄に耐えることはできません。

79
BigSack

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

私はここと他のサイトで答えを見ましたが、ほとんどは認証されていないリポジトリを設定しているという(私見で大きな)不利な点があります。つまり、apt-get--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

次のスクリプトを実行して、Packages、Release、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

17
happyskeptic

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;
    

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

8
elprup

apt-mirrorおよびapt-cacherをご覧ください。

インストール方法 のガイドを使用してください。

6
con-f-use

@ BigSack's answer および buntuの公式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 ./
    
5
Wowfunhappy

ローカルリポジトリを作成する理由はいくつかあります。 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.list1

続きを読む

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

4
Mitch

オフラインのローカルリポジトリを作成するには
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

須藤apt-getアップデート

3
user61928

選択した回答のように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
Simon