以下のようにするとできる模様(未検証)
<サーバ側(独自リポジトリ作成)>
1.リポジトリ作成用のパッケージをインストール
$ apt-get install apt-utils
2.リポジトリ用のディレクトリを準備する(Webサーバの場合)
2-1.Webサーバ準備
$apt-get install apache2
2-1.ディレクトリ作成
$ mkdir -p /var/www/html/リポジトリ用ディレクトリ
2-2.必要パッケージのダウンロードとコピー
$ apt-get install -d パッケージ名
$ cp -p パッケージファイル /var/www/html/リポジトリ用ディレクトリ/
※リポジトリ丸ごとの場合は、apt-mirror等が使えそう。apt-mirrorの設定は/etc/apt/mirror.listで出来そうで、デフォルト設定だと/var/spool/apt-mirrorにキャッシュができる模様。
2-3.リポジトリに必要なファイルの準備
2-3-1.ディレクトリ準備
$ cd /var/www/html/リポジトリ用ディレクトリ/
2-3-2.各種ファイル準備
$ apt-ftparchive sources . > Sources
$ apt-ftparchive packages . > Packages
$ apt-ftparchive contents . > Contents-$(dpkg —print-architecture)
2-3-3.gzipで固める
$ gzip -c9 Sources > Sources.gz
$ gzip -c9 Packages > Packages.gz
$ gzip -c9 Contents-$(dpkg —print-architecture) > Contents-$(dpkg —print-architecture)
2-3-4.gpg鍵の作成
$ gpg --gen-key
※--batchをつけると対話モードを避けることができる。
2-3-5.Releaseファイルを準備し、gpg秘密鍵で署名。
$ apt-ftparchive release . > Release
$ gpg --sign -b -a -o Release.gpg Release
※署名方式はいくつかある。今回は署名を別にするRelease.gpgファイルを準備する方法。
署名 :-sまたは--sign (ファイルの中身を圧縮する方式。.gpgファイルが生成される)
分離署名:-bまたは--detach-sign (署名だけ別にする方式)
クリア署名:--clearsign (ファイルの中身は圧縮しない方式)
※-a:ASCII形式 -o:出力ファイル
2-3-6.gpg公開鍵のエクスポート
$ gpg --list-keys で公開鍵IDを確認する。
$ gpg --export -o <出力する公開鍵名> -a <公開鍵ID>
※パッケージは下記のような関係性で検証されるため、
リポジトリ側でReleaseファイルを署名しておく必要がある。
パッケージファイル<-Packages<-Release<-Release.gpg(gpg秘密鍵)
<クライアント側>
1.リポジトリ側でReleaseを署名した秘密鍵に対応する公開鍵を格納する。
リポジトリ側の2-3-6で作成したファイルを/path/to/公開鍵に配置。
2./etc/apt/sources.list.d/にxxxx.listのようなファイルを準備する。
deb [signed-by=/path/to/公開鍵] http://独自リポジトリURL/ディレクトリ ディストリビューション コンポーネント
※/etc/apt/sources.listに直接追加しても良いのだが、独自リポジトリなので、
sources.list.d上にファイルを作る方が綺麗な気がする。
ファイル名のxxxxは何でも良いが、拡張子はlistとすること。
※ディストリビューションは、Ubuntuのバージョン等の適当な名称をつける。
※コンポーネントはmainやcontrib、non-freeをつける。それぞれの意味はGoogle検索で。
※今回は/path/to/公開鍵に置いたが、sudo apt-key add <公開鍵>のようにして、
/etc/apt/trusted.gpg.d/に公開鍵を配置する方法がある。
余談だが、公式リポジトリはUbuntuインストーラ実行時に既に上記に登録されている模様。
3.1で編集したファイルを読み込ませ、リポジトリ情報を更新する
source apt-get update
■参考
最終更新:2022年03月29日 23:12