日々

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 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 サーバー - その 3 - apt の信頼システム

Packages には各 Debian パッケージのハッシュ値が記述されていて、悪意ある者が Debian パッケージを改変しても検知できるようになっています。Release には Packages のハッシュ値が記述されていて、Packages を改変されても検知できるようになっています。

Release の改変に対しては、サーバーの作成者が署名を付け、Release が作成時から改変されていないことを保証します。

パッケージ(*.deb) <--(ハッシュ値)-- Packages <--(ハッシュ値)-- Release <--(署名)-- InRelease もしくは Release.gpg

保証の関係を図示すると上記のとおりです。前回の apt-get update のエラーメッセージは InRelease もしくは Release.gpg が存在しない、もしくは、あっても信頼できない署名だと言って怒っているのです。

秘密鍵、公開鍵の作成

最初から apt-get に信頼されている鍵は公式サーバーが使っている鍵ですが、当然ながら私は知りません。ですので、

  • 秘密鍵、公開鍵を作成
  • 自作した鍵を apt に信用してもらう
  • 自作した鍵で Release ファイルに署名

という手順を取ります。

自分用の秘密鍵、公開鍵を作成
# gpg --gen-key

gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name:
...

名前やメールアドレスを聞かれるので適宜答えてください。途中でパスフレーズを聞かれます。今回はテストなので、名前は Test User、パスフレーズは abcd1234 にしました。

自作した鍵を apt に信用してもらう

自作した鍵を apt に信用してもらうには、公開鍵(秘密鍵ではありません)を apt の信頼済み鍵束に登録します。

自分用の公開鍵をエクスポートし apt に登録
# gpg --list-keys

/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2019-08-11 [SC] [expires: 2021-08-10]
      A24D479395FF7F2B4A787D29439D445DCA4AF8F6      ★この ID を指定する
uid           [ultimate] Test User
sub   rsa3072 2019-08-11 [E] [expires: 2021-08-10]


# mkdir /var/www/linux/debian/gpg
# gpg --export A24D479395FF7F2B4A787D29439D445DCA4AF8F6 > /var/www/linux/debian/gpg/public.key


# curl http://192.168.1.1/linux/debian/gpg/public.key | apt-key add -

# apt-key list

/etc/apt/trusted.gpg
--------------------
pub   rsa3072 2019-08-11 [SC] [expires: 2021-08-10]
      A24D 4793 95FF 7F2B 4A78  7D29 439D 445D CA4A F8F6    ★自作の鍵が追加された
uid           [ unknown] Test User
sub   rsa3072 2019-08-11 [E] [expires: 2021-08-10]

/etc/apt/trusted.gpg.d/debian-archive-buster-automatic.gpg
----------------------------------------------------------
pub   rsa4096 2019-04-14 [SC] [expires: 2027-04-12]
      80D1 5823 B7FD 1561 F9F7  BCDD DC30 D7C2 3CBB ABEE
uid           [ unknown] Debian Archive Automatic Signing Key (10/buster) <ftpmaster@debian.org>
sub   rsa4096 2019-04-14 [S] [expires: 2027-04-12]

/etc/apt/trusted.gpg.d/debian-archive-buster-security-automatic.gpg
-------------------------------------------------------------------
pub   rsa4096 2019-04-14 [SC] [expires: 2027-04-12]
      5E61 B217 265D A980 7A23  C5FF 4DFA B270 CAA9 6DFA
uid           [ unknown] Debian Security Archive Automatic Signing Key (10/buster) <ftpmaster@debian.org>
sub   rsa4096 2019-04-14 [S] [expires: 2027-04-12]

...

自分で作った鍵ペアのうち、公開鍵を gpg --export でファイルにエクスポートし、HTTP サーバーに配置します。公開鍵ファイルを apt-key add で信頼済みの鍵束に追加します。

今回作成した鍵はテストが終わったら不要なので apt-key del ’キーID’ で削除してください。apt-key list で出てきたキー ID をコピペすれば良いです(スペースもそのまま入れて OK)。

自作した鍵で Release ファイルに署名する

最後に Release ファイルに署名します。Release ファイルの署名には 2種類あって、署名を Release ファイルと一緒に書く InRelease ファイルと、署名だけを別に書く Release.gpg ファイルがあります。

InRelease だけ作成すれば機能するようですが、とりあえず両方の作り方を紹介しておきます。

Release の署名を作成する

### GnuPG で Release ファイルに署名

# echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback --clearsign -o InRelease Release
# echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback -abs -o Release.gpg Release
# chmod 644 Release InRelease Release.gpg

署名が完了したら apt-get update してみましょう。

Release の署名を作成する
# apt-get update

Get:1 http://192.168.1.1/linux/debian buster InRelease [3941 B]
Hit:2 http://ftp.jp.debian.org/debian testing InRelease
Get:3 http://192.168.1.1/linux/debian buster/stable amd64 Packages [1752 B]
Get:4 http://192.168.1.1/linux/debian buster/stable amd64 Contents (deb) [1242 B]
Fetched 6935 B in 0s (25.7 kB/s)                               
Reading package lists... Done

うまくいきました。apt-get install docker-ce を実行すると、、、

apt-get を実行
# apt-get install docker-ce

Reading package lists... Done
Building dependency tree
Reading state information... Done
Package docker-ce is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
  docker-ce-cli

E: Package 'docker-ce' has no installation candidate

どうやら依存関係を無視して Docker のパッケージを 1つしか登録しなかったため、依存関係のエラーが出てしまったようです。

他のパッケージ(docker-ce_cli, container.io)もダウンロードしましょう。pool/stable/amd64 の下に追加し、apt-ftparchive と署名をやり直します。

依存するパッケージを追加
linux
|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
    |-- dists
    |   `-- buster
    |       |-- InRelease
    |       |-- Release
    |       |-- Release.gpg
    |       |-- packages-amd64.db
    |       |-- pool
    |       |   `-- stable
    |       |       `-- amd64
    |       |           |-- containerd.io_1.2.6-3_amd64.deb
    |       |           |-- docker-ce-cli_19.03.1~3-0~debian-buster_amd64.deb
    |       |           `-- 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
    `-- gpg
        `-- public.key

10 directories, 16 files

以上のようなディレクトリ構成になるはずです。もう一度 apt-get install docker-ce してみましょう。

再び apt-get を実行
# apt-get install docker-ce

Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
  aufs-dkms aufs-tools cgroupfs-mount containerd.io docker-ce-cli
Suggested packages:
  aufs-dev
The following NEW packages will be installed:
  aufs-dkms aufs-tools cgroupfs-mount containerd.io docker-ce docker-ce-cli
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/88.0 MB of archives.
After this operation, 390 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Selecting previously unselected package aufs-dkms.
(Reading database ... 325385 files and directories currently installed.)
Preparing to unpack .../0-aufs-dkms_4.19+20190211-1_all.deb ...
Unpacking aufs-dkms (4.19+20190211-1) ...
Selecting previously unselected package aufs-tools.
Preparing to unpack .../1-aufs-tools_1%3a4.14+20190211-1_amd64.deb ...
Unpacking aufs-tools (1:4.14+20190211-1) ...
Selecting previously unselected package cgroupfs-mount.
Preparing to unpack .../2-cgroupfs-mount_1.4_all.deb ...
Unpacking cgroupfs-mount (1.4) ...
Selecting previously unselected package containerd.io.
Preparing to unpack .../3-containerd.io_1.2.6-3_amd64.deb ...
Unpacking containerd.io (1.2.6-3) ...
Selecting previously unselected package docker-ce-cli.
Preparing to unpack .../4-docker-ce-cli_5%3a19.03.1~3-0~debian-buster_amd64.deb ...
Unpacking docker-ce-cli (5:19.03.1~3-0~debian-buster) ...
Selecting previously unselected package docker-ce.
Preparing to unpack .../5-docker-ce_5%3a19.03.1~3-0~debian-buster_amd64.deb ...
Unpacking docker-ce (5:19.03.1~3-0~debian-buster) ...
Setting up aufs-tools (1:4.14+20190211-1) ...
Setting up containerd.io (1.2.6-3) ...
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service -> /lib/systemd/system/containerd.service.
Setting up docker-ce-cli (5:19.03.1~3-0~debian-buster) ...
Setting up aufs-dkms (4.19+20190211-1) ...
Loading new aufs-4.19+20190211 DKMS files...
Building for 4.19.0-5-amd64
Building initial module for 4.19.0-5-amd64
Done.

...

以上のように apt-get もうまくいきました。良かった良かった。

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

コメント一覧

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



link permalink

独自の apt サーバー - その 4 - まとめ

まとめです。

ディレクトリ構成、設定ファイル

ディレクトリ構成は下記のとおりです。Docker のパッケージサーバーを参考リンク)にしています。

HTML サーバーのルートディレクトリ、ディレクトリ構成
linux
|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
    |-- dists
    |   `-- buster
    |       |-- InRelease
    |       |-- Release
    |       |-- Release.gpg
    |       |-- packages-amd64.db
    |       |-- pool
    |       |   `-- stable
    |       |       `-- amd64
    |       |           |-- containerd.io_1.2.6-3_amd64.deb
    |       |           |-- docker-ce-cli_19.03.1~3-0~debian-buster_amd64.deb
    |       |           `-- 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
    `-- gpg
        `-- public.key

10 directories, 16 files

パッケージの情報ファイルを作成する apt-ftparchive の設定ファイルは 2種類あり、下記のとおりです。

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/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_release_debian_buster.conf

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

Tree::Sections, Tree::Architectures に複数の値を指定したとき、他の設定をどのように書けばよいのか?についてはこれからの課題ですね。

apt-ftparchive の実行と署名

設定ファイルを作ったら apt-ftparchive コマンドを実行し、Release ファイルに署名します。

apt-ftparchive を実行、Release ファイルに署名

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


# GnuPG で Release ファイルに署名

echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback --clearsign -o InRelease Release
echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback -abs -o Release.gpg Release
chmod 644 Release InRelease Release.gpg

GnuPG の鍵ファイルの作成と、apt への登録方法については、その 3 をご参照ください。

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

コメント一覧

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



link permalink

スマホ買い換え

スマホを買い替えました。Zenfone 6 が出るとか出ないとか言われているなか、あえて型落ちの Zenfone 4 を買いました。Amazon で 32,000円でした。

高性能処理が必要なゲームなどはしませんし、CPU/GPU ともに最高性能のいわゆるハイエンド機種は不要です。ハイエンド機は値段も高いですし……。

CPU/GPU はそこそこで電池持ちが良く、メモリが多くて動作が快適な、いわゆるミドルハイと呼ばれる機種が欲しいのですが、世の中的に人気がないらしく、作ってくれるメーカーはどんどん減っています。

最初は Zenfone 5 の購入を検討していましたが、ASUS も Zenfone 5 からミドルハイ(Snapdragon 66x クラス)の機種を出さなくなったようで、購入したい機種がありませんでした。

そんななか、Zenfone 4 は Snapdragon 660 と 6GB RAM 搭載で、ドンピシャの機種でした。もう今後、このタイプのミドルハイ機種は出ないかもしれないですねえ。

おお SIM カードよ、大きさが違うとは情けない

今日 Zenfone 4 が家に届いたのですが、SIM カードが nano-SIM しか対応していませんでした。

現在使っている Zenfone 3 Deluxe 5.5 (ZS550KL) は micro-SIM なので、そのまま差し替えという訳にはいきません。困ったなあ。

ドコモショップに行かないと nano-SIM は手に入らないようです。ドコモショップは行きたくないんだけど、今回ばかりは仕方ないか……。

メモ: 技術系の話は Facebook から転記しておくことにした。

[編集者: すずき]
[更新: 2019年 8月 25日 22:13]
link 編集する

コメント一覧

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



link permalink

RockPro64 とアナログオーディオ - その 1 - linux-next のドライバ

RockPro64 で Rockchip の公開している Linux(以降、Rockchip Linux)ではヘッドフォン出力できるのに、linux-next だとできないのはどうして?と思って調べていたところ、悲しいことがわかりました……。

RockPro64 は Everest ES8316 という DAC を搭載しています。ドライバは sound/soc/codecs/es8316.c です。なんとこのドライバはですね、Rockchip Linux に実装されているドライバ(Rockchip の人が書いた)と、linux-next のドライバ(Everest の人が Upstream した)が全然違う実装になっています。

ES8316 のドライバが全く違うお陰で、Rockchip Linux から devicetree を持ってきてもウンともスンとも言わないのです。まさか ES8316 のドライバ実装が全く違なんて想像していませんでした。どうしてこんなことに……。

しばらく戦ってみましたが、linux-next の ES8316 ドライバの動きは良くわかりませんでした。clocks プロパティにダミーの 12MHz クロックを指定すると、とりあえずドライバは文句を言わなくなるものの、肝心の音は鳴りません。

残念ながら RK3399 側の問題(例えば MCLK が出力されていないなど)なのか、ES8316 側の問題なのか切り分けができていません。

各端子に来ている信号をオシロスコープで見れば、原因の切り分けができるのはわかっていますが、RockPro64 はプローブを当てることなど考慮して作っておらず、端子に名前が書いてないし、非常に細かいです。変にプローブを当てるとショートさせてしまいそうです。

[編集者: すずき]
[更新: 2019年 9月 8日 12:51]
link 編集する

コメント一覧

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



link permalink

安くて良いヘッドフォン

AKG K240 に似ていることで有名(?)な Superlux HD681B を買いました。Amazon で 3,000円程度です。噂通り音は良いです。

残念ながら数万円する高級ヘッドフォンを使った経験はほぼないので、高級な音かどうかまではわかりません。

現在使っている audio-technica ATH-TAD500 はかなりシャリシャリ気味の音ですが、HD681B はさらに輪をかけて高音が強いです。かなりキンキンしています。

普段聴いている音楽を HD681B で聴いてみると、今まで聞いたことのない「キーン…、キーン…!」という音が聞こえます。こんな音鳴ってたのか…??

感想

大きさの割に軽いし、圧迫されるような感じはしませんが、長時間使うとちょっと耳が痛くなります。

この製品に限った話ではありませんが、レザータイプのイヤーパッド(=汗を吸わない)、セミオープンエアー型(=音漏れが激しい)なので、室内用に最適だと思います。

メモ: 技術系の話は Facebook から転記しておくことにした。後半を追記。

[編集者: すずき]
[更新: 2019年 8月 25日 15:06]
link 編集する

コメント一覧

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



link permalink

独自の apt サーバー - その 5 - 複数のセクションに対応する

前回、Tree::Sections には複数のセクションが指定でき、Tree::Architectures には複数のアーキテクチャが指定できますが、TreeDefault::Packages との対応がよくわからない。と書きましたが、複数のセクションを同時に指定する手段が見つかったので、メモしておきたいと思います。

書き方は簡単で、前回 TreeDefault のパスに出現するセクション名を stable と決め打ちで書いていました。これを $(SECTION) に置き換えるだけです。アーキテクチャ名なら $(ARCH) です。

apt_generate_debian_buster.conf で複数の Sections を指定

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/$(SECTION)/$(ARCH)";
TreeDefault::Packages         "dists/buster/$(SECTION)/binary-$(ARCH)/Packages";

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

それともう一つ差分がありまして、BinDirectory の指定はなくても動くことがわかりましたので、削除しています。

セクションを複数指定できるようになりましたので、スクリプトも若干変わります。

apt-ftparchive を呼ぶスクリプト

export TARGET=debian
export DIST=buster
export ARCH=amd64

for SECT in stable testing nightly
do
    mkdir -p /var/www/linux/${TARGET}/dists/${DIST}/${SECT}/binary-${ARCH}
    mkdir -p /var/www/linux/${TARGET}/dists/${DIST}/pool/${SECT}/${ARCH}
done


### *.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


### Release ファイルに署名する

echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback --clearsign -o InRelease Release
echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback -abs -o Release.gpg Release
chmod 644 Release InRelease Release.gpg

これで粗方、やりたかったことができたのではないかと思います。

動作確認

今回も Docker のリポジトリから *.deb を拝借します。セクション Stable には containerd.io、Testing には docker-ce-cli、Nightly には docker-ce を配置するなど、各セクションに全く違う *.deb を配置すると後で見やすいです。

テストに使うディレクトリ

# tree linux/

linux/
|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
    |-- dists
    |   `-- buster
    |       |-- InRelease
    |       |-- Release
    |       |-- Release.gpg
    |       |-- nightly
    |       |   |-- Contents-amd64
    |       |   |-- Contents-amd64.bz2
    |       |   |-- Contents-amd64.gz
    |       |   `-- binary-amd64
    |       |       |-- Packages
    |       |       |-- Packages.bz2
    |       |       `-- Packages.gz
    |       |-- packages-amd64.db
    |       |-- pool
    |       |   |-- nightly
    |       |   |   `-- amd64
    |       |   |       `-- docker-ce_0.0.0-20180901050402-e5babb2-0~debian_amd64.deb
    |       |   |-- stable
    |       |   |   `-- amd64
    |       |   |       `-- containerd.io_1.2.0-1_amd64.deb
    |       |   `-- testing
    |       |       `-- amd64
    |       |           `-- docker-ce-cli_18.09.0~3-0~debian-buster_amd64.deb
    |       |-- stable
    |       |   |-- Contents-amd64
    |       |   |-- Contents-amd64.bz2
    |       |   |-- Contents-amd64.gz
    |       |   `-- binary-amd64
    |       |       |-- Packages
    |       |       |-- Packages.bz2
    |       |       `-- Packages.gz
    |       `-- testing
    |           |-- Contents-amd64
    |           |-- Contents-amd64.bz2
    |           |-- Contents-amd64.gz
    |           `-- binary-amd64
    |               |-- Packages
    |               |-- Packages.bz2
    |               `-- Packages.gz
    `-- gpg
        `-- public.key

18 directories, 28 files

上記はリポジトリ情報を生成した後の状態です。各セクションの下に Contents と Packages が生成されます。ファイルが生成できたら /etc/apt/sources.list にこのサーバーを指定して、apt-get update を実行します。

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

deb [arch=amd64] http://192.168.1.1/linux/debian/ buster stable
  -> containerd.io がインストールでき、他の docker-ce-cli や docker-ce はインストールできないはず

deb [arch=amd64] http://192.168.1.1/linux/debian/ buster testing
  -> docker-ce-cli がインストールでき、他の containerd.io や docker-ce はインストールできないはず

deb [arch=amd64] http://192.168.1.1/linux/debian/ buster nightly
  -> docker-ce がインストールでき、他の containerd.io や docker-ce-cli はインストールできないはず

指定の方法は上記のとおりです。セクション名 stable の部分を testing や nightly に入れ替えても、apt-get update が成功すれば、複数セクションの扱いはうまくいっています。

また、セクション stable を選んだときは containerd.io がインストールできて、他のものはインストールできないはずです。testing だと docker-ce-cli、nightly だと docker-ce がインストールできて、他の 2つはインストールできなくなります。セクション指定が機能していることがわかると思います。

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

コメント一覧

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



link permalink

RockPro64 とアナログオーディオ - その 2 - Headphone Mixer ボリュームのバグ

RockPro64 に搭載されている CODEC(※)は Everest ES8316 という IC です。この IC を linux-next のドライバで制御すると、異常な動作をします。

具体的には、Headphone Mixer のボリュームを 5 以上に変更すると、突然、ほぼ最大音量の馬鹿デカい音になり、バリバリというノイズが載ります。あまりにノイズがひどくて、聴くに堪えないレベルですし、音がうるさくてたまらないです。

ボリューム 5〜7 は使い物にならないようなので、ボリュームを 4 にリミットするパッチを Linux Kernel ML に投稿したところ、ドライバの作者が現れ「今の実装の設定値はおかしい」とアドバイスをくれました。作者曰く現在のドライバは、禁止された設定値をレジスタに書いているそうです。正しい設定値も教えてくれました。

教えていただけるのはありがたいんだけど、既に知っていたなら直してほしかったな……。さておき、正しい設定値を入れたパッチを再作成して、投稿しました。

動作テストしているときに、左右のボリュームの「効き」が反転しているバグにも気づいたので、問題を修正するパッチも合わせて投稿しました。

両パッチともに、先日 Linux ASoC ツリーに取り込まれたようです。このまま Linux 5.3 に取り込まれると思われます。良かった良かった。

(※)Linux では I2S などのデジタルオーディオとアナログオーディオ間を変換する DAC/ADC を CODEC と呼びます。

確かに Code/Decode を行うため、使い方としては合っているし、こちらの方が一般用語かもしれないが、テレビ系 SoC との関わりが深かったので、codec と言われると MPEG2 や AAC のような動画像、音声圧縮展開の方を思い浮かべてしまう……。

メモ: 技術系の話は Facebook から転記しておくことにした。全体的に小修正。

[編集者: すずき]
[更新: 2019年 9月 8日 12:51]
link 編集する

コメント一覧

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



こんてんつ

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 サイトの情報