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
└── 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:
 * extras:
 * updates:
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         :
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

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 といったファイルを以下のような内容で作成します。

name=my repo

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


createrepo のヘルプ表示

# createrepo --help
Usage: [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
                        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
  -o OUTPUTDIR, --outputdir=OUTPUTDIR
                        <dir> = optional directory to output to
  -S, --skip-symlinks   ignore symlinks of packages
                        only import the last N changelog entries
                        include the file's checksum in the filename, helps
                        with proxies (default)
                        do not include the file's checksum in the filename
                        keep around the latest (by timestamp) N copies of the
                        old repodata
  --distro=DISTRO       distro tag and optional cpeid:
                        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
                        paths to look for older pkgs to delta against
                        the number of older versions to make deltas against
                        output the paths to the pkgs actually read useful with
                        max size of an rpm that to run deltarpm against (in
  --workers=WORKERS     number of workers to spawn to read rpms
                        which compression type to use