link もっと前
   2019年 8月 11日 -
      2019年 8月 2日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

独自の apt サーバー - その 2 - apt-ftparchive の設定、実行

Web サーバーあるいは FTP サーバーで Debian パッケージを配布する場合、*.deb ファイル以外に Contents, Package, Release ファイルが必要です。これらのファイルを作成するためのツールが apt-ftparchive です。

今回は HTML サーバーで配布することを考えます。Debian だと /var/www がルートディレクトリになっていることが多いと思います。以降 /var/www がルートディレクトリだとします。

ディレクトリ構成は前回紹介(2019年 8月 11日の日記参照)した Docker のディレクトリ構成に習うとします。Debian パッケージはどんなファイルでも良いです(後ほどテストするときのため amd64 向けのパッケージのほうが良いです)が、今回は Docker のパッケージを 1つダウンロードしてきて試します。

HTML サーバーのルートディレクトリ、*.deb ファイルの置き場所
# cd /var/www

# tree linux

linux
|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
    `-- dists
        `-- buster
            |-- pool
            |   `-- stable
            |       `-- amd64
            |           `-- docker-ce_19.03.1~3-0~debian-buster_amd64.deb
            `-- stable
                `-- binary-amd64

9 directories, 3 files

Debian パッケージのみを配置した後のディレクトリ構造は上記のようになります。

apt-ftparchive の設定ファイル

設定ファイルは apt_generate_debian_buster.conf と apt_release_debian_buster.conf と 2つを使います。前者はディレクトリ構造を指定するファイルで、apt-ftparchive generate の引数に指定します。後者はリリース情報(ラベル、オリジナルなど)を指定するファイルで、apt-ftparchive release の -c オプションに指定します。

各設定ファイルの書き方を紹介します。

apt_generate_debian_buster.conf

Dir::ArchiveDir ".";
Dir::CacheDir   "dists/buster";
Default::Packages::Compress   ". gzip bzip2";
Default::Packages::Extensions ".deb";
Default::Sources::Compress    ". gzip bzip2";
Default::Contents::Compress   ". gzip bzip2";
Default::FileMode             0644;
TreeDefault::Directory        "dists/buster/pool/stable/amd64";
TreeDefault::Packages         "dists/buster/stable/binary-amd64/Packages";

Tree "dists/buster" {
    Sections "stable";
    Architectures "amd64";
};

BinDirectory "dists/buster/stable/binary-amd64" {
    Packages "dists/buster/stable/binary-amd64/Packages";
    Contents "dists/buster/stable/Contents-amd64";
};

この設定ファイルにはいくつかディレクトリパスが登場します。パスは apt-ftparchive を実行するディレクトリ(/var/www/linux/buster)からの相対パスで記述します。

Tree::Sections と Tree::Architectures は少し特殊で、ディレクトリパスの一部を構成します。{Tree}/{Sections} ディレクトリに Contents ファイルが作成され、{Tree}/{Sections}/{Architectures} ディレクトリに Packages ファイルが作成されます。

apt_generate_debian_buster.conf で複数の Sections を指定

...

Tree "dists/buster" {
    Sections "stable testing";
    Architectures "amd64";
};

上記のように Tree::Sections には複数のセクションが指定でき、Tree::Architectures には複数のアーキテクチャが指定できるはずですが、今のところ TreeDefault::Packages との対応がよくわからず、使いこなせていません。複数のセクションを同時に指定する手段が見つかったら、また日記で書こうと思います。

apt_release_debian_buster.conf

APT::FTPArchive::Release {
    Architectures "amd64";
    Components "stable";
    Label "Test Label";
    Origin "Test";
    Suite "buster";
};

リリース情報を記述するファイルは上記のように書きます。APT::FTPArchive::Release には他のフィールドも記述できます。apt-ftparchive の release コマンドのヘルプ(リンク)によると「Origin, Label, Suite, Version, Codename, Date, NotAutomatic, ButAutomaticUpgrades, Acquire-By-Hash, Valid-Until, Signed-By, Architectures, Components, Description」が指定できるとのことですが、意味が説明されておらず、何を書くべきなのかわかりません……。

apt-ftparchive の実行

設定ファイルを記述した後は apt-ftparchive を実行して、Debian パッケージの情報について記述した Contents, Packages, Release の各ファイルを作成します。

apt-ftparchive を実行

# export TARGET=debian
# export DIST=buster
# export SECT=stable
# export ARCH=amd64
# mkdir -p /var/www/linux/${TARGET}/dists/${DIST}/${SECT}/binary-${ARCH}
# mkdir -p /var/www/linux/${TARGET}/dists/${DIST}/pool/${SECT}/${ARCH}


### *.deb ファイルをコピーする(モジュールによってコピー元は違うと思うので、これは一例)
### cp *.deb /var/www/linux/${TARGET}/dists/${DIST}/pool/${SECT}/${ARCH}


### Packages, Contents ファイルを作る
### linux/debian の下で apt-ftparchive を実行しないと *.deb が見つからないといわれる

# cd /var/www/linux/${TARGET}
# find . -name "Contents-*" -or -name "Contents-*.*" | xargs rm -f
# find . -name "Packages" -or -name "Packages.*" -or -name "packages-*" | xargs rm -f
# find . -name Release -or -name Release.gpg -or -name InRelease | xargs rm -f
# apt-ftparchive generate ../conf/apt_generate_${TARGET}_${DIST}.conf


### Release ファイルを作る
### linux/debian/dists/buster の下で apt-ftparchive を実行しないと、
### 後ほど apt-get を実行した際にパッケージが見つからないといわれる

# cd /var/www/linux/${TARGET}/dists/${DIST}
# apt-ftparchive release -c=../../../conf/apt_release_${TARGET}_${DIST}.conf . > Release

作成手順は以上のような感じですが、かなりパスに依存した動きで癖が強いです。正直言ってわかりにくいです。

apt-ftparchive の実行後
# tree linux

linux
|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
   `-- dists
        `-- buster
            |-- Release
            |-- packages-amd64.db
            |-- pool
            |   `-- stable
            |       `-- amd64
            |           `-- docker-ce_19.03.1~3-0~debian-buster_amd64.deb
            `-- stable
                |-- Contents-amd64
                |-- Contents-amd64.bz2
                |-- Contents-amd64.gz
                `-- binary-amd64
                    |-- Packages
                    |-- Packages.bz2
                    `-- Packages.gz

コマンド実行後、Contents, Packages, Release ファイルが生成され、上記のように配置されます。

独自 apt サーバー完成ならず?

Contents, Packages, Release ファイルがあれば apt-get に apt サーバーとして認識してもらえるはずです。

/etc/apt/sources.list に独自 apt サーバーを追加

deb [arch=amd64] http://192.168.1.1/linux/debian/ buster stable

適当な Debian マシンの apt の設定ファイルに、さきほど作成した独自 apt サーバーを追加し apt-get update を実行します。HTTP サーバーの IP アドレスは 192.168.1.1 とします。

独自 apt サーバーに対して apt-get を実行
# apt-get update

Ign:1 http://192.168.1.1/linux/debian buster InRelease
Get:2 http://192.168.1.1/linux/debian buster Release [3233 B]
Ign:3 http://192.168.1.1/linux/debian buster Release.gpg
Hit:4 http://ftp.jp.debian.org/debian testing InRelease
Reading package lists... Done
E: The repository 'http://192.168.1.1/linux/debian buster Release' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

残念ながらエラーになりました……。

Contents, Packages, Release ファイルを作成しても終わりではありません。apt には悪意ある者が Debian パッケージを改変しても検知できる仕組みが搭載されていて、その対応をしないと「信用できないリポジトリ」だといわれてエラーになります。

(追記)下記が間違っていたので直しました。

apt_generate_debian_buster.conf の修正

(誤)
TreeDefault::Directory        "dists/buster/pool/stable/stable/amd64";

(正)
TreeDefault::Directory        "dists/buster/pool/stable/amd64";
[編集者: すずき]
[更新: 2019年 9月 1日 04:22]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

独自の apt サーバー - その 1 - ディレクトリ構成

会社で独自の Debian パッケージを配布する際に、難しくてかなり困ったので、下調べの結果を兼ねてメモしておきます。

やりたいこととしては、独自に作成した Debian パッケージ(*.deb ファイル)を、

  • 複数の OS: Debian, Ubuntu など
  • 複数の版: stable, testing, nightly など
  • 複数のアーキテクチャ: amd64, arm64 など

この 3つをどのように組み合わせても対応できるような、ディレクトリ構成と、apt サーバーの設定を作成することです。

Docker が参考になる

ディレクトリ構成は、最初から考えるのは大変なので、参考として Docker の apt リポジトリリンク)を見てみます。

Docker の apt リポジトリサーバー
debian/
    dists/
        buster/ : Debian 10.0
            edge/ : なんだろ?
            nightly/ : 1日ごとにビルドされた版
            pool/ : *.deb が入っているディレクトリ
            stable/ : 安定版
            test/ : テスト版?
        jessie/  : Debian 8.0
        stretch/ : Debian 9.0
        wheezy/  : Debian 7.0
    gpg : GnuPG の公開鍵、apt-key で追加する

ubuntu/
    dists/
        artful/  : Ubuntu 17.10
        bionic/  : Ubuntu 18.04 LTS
        cosmic/  : Ubuntu 18.10
        disco/   : Ubuntu 19.04
        trusty/  : Ubuntu 14.04 LTS
        xenial/  : Ubuntu 16.04 LTS
        yakkety/ : Ubuntu 16.10
        zesty/   : Ubuntu 17.04
    gpg : GnuPG の公開鍵、apt-key で追加する

こんな作りになっています。debian/dists もしくは ubuntu/dists の下に各バージョンのコードネームが並んでいます。例えば debian/dists/buster であれば Debian 10.0 用です。

コードネームのディレクトリの下には、各版 stable, test 用のディレクトリが並んでいます。pool ディレクトリは版名ではなくて、パッケージファイル *.deb を格納するディレクトリです。

Debian 10.0 用のディレクトリ以下
debian/
    dists/
        buster/ : Debian 10.0
            edge/ : なんだろ?
            nightly/ : 1日ごとにビルドされた版
                binary-amd64/ : PC, 64bit 用パッケージ情報
                    Packages   : パッケージ一覧
                binary-arm64/ : AArch64 用パッケージ情報
                binary-armhf/ : AArch32 用パッケージ情報
                Contents-amd64 : PC, 64bit 用
                Contents-arm64 : AArch64 用
                Contents-armhf : AArch32 用
            pool/ : *.deb が入っているディレクトリ
                edge/ : stable と同じ構成
                nightly/ : stable と同じ構成
                stable/
                    amd64/ : PC, 64bit 用 *.deb
                    arm64/ : AArch64 用 *.deb
                    armhf/ : AArch32 用 *.deb
                test/ : stable と同じ構成
            stable/ : 安定版
            test/ : テスト版
            InRelease   : GnuPG の署名が追記された Release ファイル
            Release     : Contents, Packages の SHA ハッシュ一覧が書かれたファイル
            Release.gpg : GnuPG の署名だけ書かれたファイル

Debian 向けと Ubuntu 向けはほぼ同じ構成です。

[編集者: すずき]
[更新: 2019年 9月 1日 04:21]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 8月 11日 -
      2019年 8月 2日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/20 00:01

カレンダー

<2019>
<<<08>>>
----123
45678910
11121314151617
18192021222324
25262728293031

最近のコメント 5件

  • link 19年09月01日
    すずき 「私も正直びっくりです。間違って違う製品を...」
    (更新:09/04 23:39)
  • link 19年09月01日
    hdk 「車向けの製品の中でも、車載コンピューター...」
    (更新:09/02 23:20)
  • link 19年07月18日
    hdk 「あっ、AAMはマニュアルのオペレーション...」
    (更新:07/25 00:02)
  • link 19年07月18日
    すずき 「AAM(ASCII Adjust AX ...」
    (更新:07/24 22:22)
  • link 19年07月18日
    hdk 「加算減算は符号のありなしどちらも命令が同...」
    (更新:07/24 07:25)

最近の記事 3件

link もっとみる
  • link 19年09月18日
    すずき 「[linux-next が久しぶりに更新された] ここしばらく更新...」
    (更新:09/20 00:01)
  • link 19年09月17日
    すずき 「[今まで知らなかった make の挙動] シェルから make に...」
    (更新:09/19 02:27)
  • link 19年09月07日
    すずき 「[Sin 波の美しさ勝負] 最近 linux-next で Roc...」
    (更新:09/08 13:17)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報