リポジトリの複製やパッケージの一括取得
クラウド化が叫ばれて久しい今日ですが、検証環境や社内システムはインターネットに接続しないことを前提に作られていることもあり、必要なパッケージの入手に苦労することがしばしばあります。そんな時に外部と通信可能な端末に必要なリポジトリを予め複製しておけば、非インターネット接続環境でも依存性などに悩まされることなくパッケージが導入できるようになります。
今回はその手順で試行錯誤した内容を記載します。
リポジトリと同期しよう
手っ取り早いのが公開されているリポジトリと同期することです。
同期するのに用いるコマンドは定番の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を使って利用可能なパッケージを根こそぎダウンロードする仕組みを作ってみました。
動作内容
実装
#!/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
使い方
正直なんの捻りもないですが…。
動作画面
動かすとこんな感じ。(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