雑木林

頭の中の整理と忘れないための確認メモ

リポジトリの複製やパッケージの一括取得

クラウド化が叫ばれて久しい今日ですが、検証環境や社内システムはインターネットに接続しないことを前提に作られていることもあり、必要なパッケージの入手に苦労することがしばしばあります。そんな時に外部と通信可能な端末に必要なリポジトリを予め複製しておけば、非インターネット接続環境でも依存性などに悩まされることなくパッケージが導入できるようになります。
今回はその手順で試行錯誤した内容を記載します。

リポジトリと同期しよう

手っ取り早いのが公開されているリポジトリと同期することです。
同期するのに用いるコマンドは定番のrsyncです。
たとえば、EPEL7を取得したい場合は、以下のようなイメージです

[root@localhost epel]# rsync -rptv rsync://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/ ./
Welcome to JAIST Public Mirror Service (ftp.jaist.ac.jp).
If you have any problem, please contact ftp-admin@jaist.ac.jp.
.
.
.

常に同期する場合は--deleteオプションなどを加えておくと、削除された場合も反映してくれます。
個人的によく理研のサーバを用いるのですが、パスの指定がちょっと違うようです。
例えば上記に示したEPEL7は以下のパスになります。

http://ftp.riken.jp/pub/Linux/fedora/epel/7/x86_64/
ftp://ftp.riken.jp/11/fedora/epel/7/x86_64/
rsync://ftp.riken.jp/fedora/epel/7/x86_64

JAISTの場合はブラウザで見たまんまで問題なかったのですが、
コンテンツの配置方法の違いなのか、理研からrsyncをする場合、
ルートディレクトリ以下につける値は、以下から選ぶようです。

scientificlinux Scientific Linux (SL)  (approx 1614 GB)
SLC             Scientific Linux CERN (SLC) (approx 1508 GB)
centos          Centos Linux  (approx 120 GB)
fedora          Entire Fedora distributions (approx 1016 GB)
fedoralegacy    fedoralegacy Project          (approx 65 GB)
redhat          RedHat Linux distribution (approx 621 GB)
opensuse        OpenSuse Linux distribution (approx 383 GB)
ubuntu          Ubuntu Linux (approx  824 GB)
ubuntu-releases Ubuntu Linux iso Image (45 GB)
ubuntu-jp       Ubuntu Linux iso Image (23 GB)
debian          Debian Linux distribution (approx 907 GB)
debian-cd       Debian-cd Linux distribution (approx 302 GB)
debian-cdimage  Debian cd archives (old release) (approx 5.3 TB )
debian-backports        Debian Backports  (approx 33 GB)
debian-archive  Debian-archive Linux distribution (approx 443 GB)
MandrivaLinux   MandrivaLinux distribution (approxy 840 GB)
pclinuxos       pclinuxos (approx 39 GB)
mepis           mepis community Linux (approx 22 GB)
vine            Vine Linux distribution (approx 211 GB)
slackware       Slackware Linux distribution (approx 83 GB)
gentoo          Gentoo Linux (approx 56 GB)
linuxmint       Linux Mint  (8 GB)
momonga         momonga Linux (apporx 207 GB)
sabayon         sabayon Linux (apporx 52 GB)
simosnet        simosnet live-CD  (144 GB)
fuduntu         Fuduntu Linux
manjaro         manjaro Linux (50-100 GB)
porteus         porteus Linux
knoppix         knoppix (knoppix, knoppix-dvd, knoppix-jp)
kernel          Linux kernel at ftp.funet.fi  (approx 250 GB)
kernel.org      kernel.org Linux kernel archive  (approx 138 GB)
freshrpms       rpm rep. at freshrpms.net (approx 9 GB)
atrpms          rpm rep. at atrpms.net (approx 70 GB)
repoforge       repoforge rpm rep  (approx 140 GB)
rpmfusion       rpmfusion rpm rep  (approx 205 GB)
dries           Dries rpm rep  (approx 20 GB)
jpackage        Java software packages for Linux (approx 21 GB)
freebsd         FreeBSD (approx. 603 GB)
netbsd          NetBSD (approx. 420  GB)
openbsd         OpenBSD (approx. 206 GB)
sunfreeware     Sun Freeware (approx. 60GB)
cygwin          cygwin pc archive  (approx 7 GB)
ctan            CTAN TeX archive (apporx. 13 GB)
cpan            Comprehensive Perl Archive Network (approx. 5 GB)
apache          Apache archive (apporx. 21 GB)
samba           samba/rsync archive (approx. 3 GB)
openoffice      OpenOffice (approx. 105 GB)
gnu             GNU Operating System  (approx. 45 GB)
ROOT            The Root system at root.cern.ch (102 GB)
X11             X11  (approx. 185 GB)
cernlib         CERN Program Library (approx. 14 GB)
sagemath        Sage - Open Source Mathmatics Software (17GB)
hirensbootcd    Hiren's BootCD for Windows PC

他のやり方を模索する

anonymousFTPが公開されていれば特に悩むことなく上記で必要なパッケージ群およびリポジトリファイルが入手可能ですが、httpのみで公開されていたりする場合、rsyncによる同期が使えないため困ってしまいます。そこで、yumdownloaderを使って利用可能なパッケージを根こそぎダウンロードする仕組みを作ってみました。

動作内容

  1. yum list allで取得可能なパッケージ一覧を出力する
  2. 出力結果を整形する(余計な行や改行を整形)
  3. yumdownloaderでパッケージをリポジトリ毎に取得する
  4. createrepoでリポジトリを作成する

実装

#!/bin/bash

#文字コード指定
LANG=C

#パッケージリスト
PACKAGE_LIST=packagelist.txt

#ベースディレクトリ
BASE_DIR=/tmp/rpms/

#ディレクトリ作成
mkdir -p $BASE_DIR


# パッケージリストを取得
yum list > $BASE_DIR$PACKAGE_LIST

# パッケージリストから@(インストール済みマーク)を除去する
sed -i -u 's/@//g' $BASE_DIR$PACKAGE_LIST

# 不要な行を除去(力技)
grep -v "Loaded plugins" $BASE_DIR$PACKAGE_LIST | grep -v "Installed Packages" | grep -v "Available Packages" > $BASE_DIR$PACKAGE_LIST.tmp

#改行コードを再整形
tr '\n' ' ' < $BASE_DIR$PACKAGE_LIST.tmp | awk  '{
        for ( i = 1; i <=NF ; i++){
                if (i %3 == 0 ){
                        print($i);
                }else{
                        printf("%s ",$i);
                }
                fflush();
        }
}' > $BASE_DIR$PACKAGE_LIST
sync

# リポジトリ毎にファイルをダウンロードする
while read line; do
        package=`echo $line | awk -F ' ' '{ print $1 } { fflush() }'`
        dir=`echo $line | awk -F ' ' '{ print $3 } { fflush() }'`

        #リポジトリ毎にディレクトリ作成
        if [ ! -d $BASE_DIR$dir ]
        then
                mkdir -p $BASE_DIR$dir
        fi

        #パッケージのダウンロード
        yumdownloader --skip-broken --destdir=$BASE_DIR$dir $package

done < $BASE_DIR$PACKAGE_LIST

rm -f $BASE_DIR$PACKAGE_LIST.tmp

使い方

正直なんの捻りもないですが…。

  1. yumdonloaderを使うためにyum-utilsを導入する
  2. リポジトリ作成用にcreaterepoを導入する
  3. 上記を適当なファイルに保存する
  4. 保存したファイルに実行権限を付けて実行する

動作画面

動かすとこんな感じ。(fastestmirrorが邪魔だった)

[root@localhost ~]# ./download.sh 
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.iij.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.iij.ad.jp
No Match for argument Loading
Nothing to download
.
.
.
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.iij.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.iij.ad.jp
zziplib-utils-0.13.62-5.el7.x86_64.rpm                     |  35 kB   00:00     
Spawning worker 0 with 16635 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@localhost ~]# ls -l /tmp/rpms/
合計 1780
drwxr-xr-x. 2 root root  16384  4月 23 08:31 anaconda
drwxr-xr-x. 2 root root 442368  4月 23 11:46 base
drwxr-xr-x. 2 root root      6  4月 23 08:28 base:
drwxr-xr-x. 2 root root 413696  4月 23 11:46 epel
drwxr-xr-x. 2 root root     40  4月 23 08:28 epel-release-latest-7.noarch
drwxr-xr-x. 2 root root      6  4月 23 08:28 epel:
drwxr-xr-x. 2 root root   4096  4月 23 11:07 extras
drwxr-xr-x. 2 root root      6  4月 23 08:28 extras:
drwxr-xr-x. 2 root root      6  4月 23 08:28 hostfile
-rw-r--r--. 1 root root 685010  4月 23 08:28 packagelist.txt
drwxr-xr-x. 2 root root   4096  4月 23 11:54 repodata
drwxr-xr-x. 2 root root   8192  4月 23 11:46 rpmforge
drwxr-xr-x. 2 root root     55  4月 23 08:31 rpmforge-release-0.5.3-1.el7.rf.x86_64
drwxr-xr-x. 2 root root      6  4月 23 08:28 rpmforge:
drwxr-xr-x. 2 root root      6  4月 23 08:28 speeds
drwxr-xr-x. 2 root root  20480  4月 23 11:46 updates
drwxr-xr-x. 2 root root      6  4月 23 08:28 updates:

あとは適当にリポジトリファイルを作れば利用可能になります。

[root@localhost ~]# cat /etc/yum.repos.d/test.repo
[test]
name=Test
baseurl=file:///tmp/rpms/
enabled=1
gpgcheck=0