らくがきちょう

なんとなく

createrepo を使って CentOS7 用の自前リポジトリを作成する

ソフトウェアはリポジトリからインストールことが殆どだと思います(ソースコードからインストールする機会はめっきり、減ったように思います)。 ただ、「標準リポジトリ提供のソフトウェアはバージョンが低い」「そもそもリポジトリ上にソフトウェアが無い」「社内ソフトウェア専用の、プライベートリポジトリが欲しい」と言った場合は、自前でリポジトリを作りたいケースもあると思います。 今回は createrepo を使って CentOS7 用の自前リポジトリを作成してみます。

作成するリポジトリの設計

今回は以下のようなディレクトリ設計のリポジトリを作成することを目標にします。

No. パス 用途
1 ~/pub/centos/7/noarch/repodata メタデータ置き場
2 ~/pub/centos/7/noarch/RPMS RPM パッケージ置き場
3 ~/pub/centos/7/x86_64/repodata メタデータ置き場
4 ~/pub/centos/7/x86_64/RPMS RPM パッケージ置き場

実際には以下のようなディレクトリ構成になる予定です(パッケージは任意に、配置したいもので読み替えてください)。

# tree ~/pub
/root/pub
└── centos
    └── 7
        ├── noarch
        │   ├── repodata
        │   │   ├── 3e629d104cdf8bc59444db67d8ace76e4a08b3eaad442a141c6769f3f01163d8-filelists.xml.gz
        │   │   ├── 4c8eaee9783170bc18f8a7280c4c0110f04d7ed66f148ade471eceebddb2e452-filelists.sqlite.bz2
        │   │   ├── 993e344bab1b10941de6cbf5af18b7bd687800f1cc0bd2c56a53b529000ecf4f-other.sqlite.bz2
        │   │   ├── a3ebc2c2f6887bfad537128d5c4395b72ef83f9d9b37a91ec8280c6abe0ef9b5-other.xml.gz
        │   │   ├── b850eab0be5a0d306daa45539d569c9b21e2327b44b5d27e31c338dea0bc91b6-primary.sqlite.bz2
        │   │   ├── f22b3d1344fd8bdb449bb6de92d0d75884a00cd13cfa72fd081438ea6e405cec-primary.xml.gz
        │   │   └── repomd.xml
        │   └── RPMS
        │       └── sig9-release-centos-7-0.el7.noarch.rpm
        └── x86_64
            ├── repodata
            │   ├── 2368b37dd642abfadea973a115692eb0c82587883c2972613e4d6d71028b0741-filelists.xml.gz
            │   ├── 4724e57313a47347ce3469a712d32af91c38deedfcbf670dd6d269d1e9b1ff82-other.xml.gz
            │   ├── 6845775545cb283c3bc59eefc8f865356edf5f10def4f8eaa13ed261bc9f9d47-other.sqlite.bz2
            │   ├── 8b5a39b31fc40ca17cbc02747d1c38d215e0d1ec3034d0b191dd3d9f53d87ac0-primary.sqlite.bz2
            │   ├── abe4d1b1ef5603845547c04240b9c226db3ef0bdc8b0a425f7ca12fb718dcccc-primary.xml.gz
            │   ├── fedcc1d8efcb4e60ad43a420bfb9827585318992846d777524865dc2e7d5b4d2-filelists.sqlite.bz2
            │   └── repomd.xml
            └── RPMS
                └── samba-4.7.3-1.el7.x86_64.rpm

8 directories, 16 files

createrepo のインストール

createrepo は標準リポジトリで提供されています。

# yum info createrepo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Available Packages
Name        : createrepo
Arch        : noarch
Version     : 0.9.9
Release     : 28.el7
Size        : 94 k
Repo        : base/7/x86_64
Summary     : Creates a common metadata repository
URL         : http://createrepo.baseurl.org/
License     : GPLv2
Description : This utility will generate a common metadata repository from a directory of rpm
            : packages.

yum でインストールします。

yum -y install createrepo

/usr/bin 配下にインストールされました。

# which createrepo
/usr/bin/createrepo

createrepo を使って自前リポジトリを作成する

ここからは概ね、以下の流れで作業します。

  1. ディレクトリを作成する
  2. パッケージを配置(コピー)する
  3. createrepo でメタデータを作成する

まず、ディレクトリを作成します。

mkdir -p ~/pub/centos/7/x86_64/RPMS
mkdir -p ~/pub/centos/7/noarch/RPMS

次に各々のディレクトリへパッケージをコピーします。

cp ~/samba-4.7.3-1.el7.x86_64.rpm -p ~/pub/centos/7/x86_64/RPMS
cp ~/sig9-release-centos-7-0.el7.noarch.rpm ~/pub/centos/7/noarch/RPMS

最後に createrepo でメタデータを作成します。

createrepo ~/pub/centos/7/x86_64
createrepo ~/pub/centos/7/noarch

リポジトリを利用する

今回は「リポジトリを追加してくれるパッケージ」として sig9-release-centos-7-0.el7.noarch.rpm を作成し、リポジトリ上に配置しました。 これを yum インストールするだけでリポジトリが追加されます。 手動でリポジトリを追加する場合は /etc/yum.repos.d/ 配下に、例えば /etc/yum.repos.d/myrepo.repo といったファイルを以下のような内容で作成します。

[myrepo]
name=my repo
baseurl=http://my-repo.example.com/pub/OS/RELEASEVER/$basearch/
gpgcheck=0
enabled=1

これで baseurl として指定した URL が参照されるようになります。

参考

createrepo のヘルプ表示

# createrepo --help
Usage: genpkgmetadata.py [options]

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -q, --quiet           output nothing except for serious errors
  -v, --verbose         output more debugging info.
  --profile             output timing/profile info.
  -x EXCLUDES, --excludes=EXCLUDES
                        files to exclude
  --basedir=BASEDIR     basedir for path to directories
  -u BASEURL, --baseurl=BASEURL
                        baseurl to append on all files
  -g GROUPFILE, --groupfile=GROUPFILE
                        path to groupfile to include in metadata
  -s SUMTYPE, --checksum=SUMTYPE
                        specify the checksum type to use (default: sha256)
  -p, --pretty          make sure all xml generated is formatted
  -c CACHEDIR, --cachedir=CACHEDIR
                        set path to cache dir
  -C, --checkts         check timestamps on files vs the metadata to see if we
                        need to update
  -d, --database        create sqlite database files: now default, see --no-
                        database to disable
  --no-database         do not create sqlite dbs of metadata
  --update              use the existing repodata to speed up creation of new
  --update-md-path=UPDATE_MD_PATH
                        use the existing repodata  for --update from this path
  --skip-stat           skip the stat() call on a --update, assumes if the
                        filename is the same then the file is still the same
                        (only use this if you're fairly trusting or gullible)
  --split               generate split media
  -i PKGLIST, --pkglist=PKGLIST
                        use only the files listed in this file from the
                        directory specified
  -n INCLUDEPKG, --includepkg=INCLUDEPKG
                        add this pkg to the list - can be specified multiple
                        times
  -o OUTPUTDIR, --outputdir=OUTPUTDIR
                        <dir> = optional directory to output to
  -S, --skip-symlinks   ignore symlinks of packages
  --changelog-limit=CHANGELOG_LIMIT
                        only import the last N changelog entries
  --unique-md-filenames
                        include the file's checksum in the filename, helps
                        with proxies (default)
  --simple-md-filenames
                        do not include the file's checksum in the filename
  --retain-old-md=RETAIN_OLD_MD
                        keep around the latest (by timestamp) N copies of the
                        old repodata
  --distro=DISTRO       distro tag and optional cpeid:
                        --distro'cpeid,textname'
  --content=CONTENT_TAGS
                        tags for the content in the repository
  --repo=REPO_TAGS      tags to describe the repository itself
  --revision=REVISION   user-specified revision for this repository
  --deltas              create delta rpms and metadata
  --oldpackagedirs=OLDPACKAGE_PATHS
                        paths to look for older pkgs to delta against
  --num-deltas=NUM_DELTAS
                        the number of older versions to make deltas against
  --read-pkgs-list=READ_PKGS_LIST
                        output the paths to the pkgs actually read useful with
                        --update
  --max-delta-rpm-size=MAX_DELTA_RPM_SIZE
                        max size of an rpm that to run deltarpm against (in
                        bytes)
  --workers=WORKERS     number of workers to spawn to read rpms
  --compress-type=COMPRESS_TYPE
                        which compression type to use