Friday, August 14, 2009

Подключение yum-репозитария пакетов с исходными текстами (SRPMS)

Иногда возникает желание взглянуть на исходные тексты. Можно всегда скачать нужный source rpm через http или ftp, но хотелось бы это делать более единообразным образом как для бинарных пакетов.

Yum не работает с репозитариями для source rpm.

Погуглив нашёл ссылку на блог: http://www.imminentweb.com/technologies/yum-download-source-rpm

В основном репозитарии существует пакет yum-utils с утилитами для облегчения работы или для выполнения дополнительных служебных функций связаных с использованием yum-репозитарев. man yum-utils(1):
       debuginfo-install - install debuginfo packages and their dependencies
package-cleanup - manage package cleanup, duplicates, orphaned packages and outstanding dependency problems
repo-graph - outputs a full package dependency list in dot format
repo-rss - generates an RSS feed from one or more repositories
repoclosure - reads metadata of repositories, checks dependencies and displays list of unresolved dependencies
repodiff - takes two or more repositories, returns a list of added, removed or changed packages
repomanage - manages a directory of rpm packages, returns a list of newest or oldest packages in a directory
repoquery - query yum repositories and get additional information on the them
reposync - synchronize a remote yum repository to a local directory using yum to retrieve packages
repotrack - track packages and its dependencies and downloads them
yum-builddep - installs missing dependencies to build a specified package
yum-complete-transaction - finds incomplete or aborted yum transactions and attempts to complete them
yumdownloader - downloads packages from yum repositories including source RPMs
Среди них - yumdownloader - может скачивать пакеты в нужную директорию, разрешать и скачивать зависимости пакетов, показывать полные URL закачек и работать с репозитариями пакетов с исходными кодами.

Остаётся только создать файл конфигурации для нового репозитария.
По ссылке http://www.imminentweb.com/technologies/yum-download-source-rpm уже записан один репозитарий. Если посмотреть на структуру директорий ftp-заркала CentOS, то видно что это исходники для бинарного репозитария [base]. Необходимо добавить репозитарии SRPMS для остальных имеющихся бинарных репозитариев ([updates], [addons], [extras], [centosplus], [contrib]). Также лучше настроить источники на российские зеркала.

Все зеркала можно узнать из файла в кэше yum, например для основного (base) репозитария:
[root@hq1 ~]# cat /var/cache/yum/base/mirrorlist.txt
http://mirror.svk.su/centos/5.3/os/i386/
http://mirror.corbina.net/pub/Linux/centos/5.3/os/i386/
http://mirror.yandex.ru/centos/5.3/os/i386/
http://ftp.funet.fi/pub/mirrors/centos.org/5.3/os/i386/
http://centos.siirappi.com/centos/5.3/os/i386/
http://centos.ustc.edu.cn/centos/5.3/os/i386/
http://centos.yubis.org/5.3/os/i386/
http://ftp.daum.net/centos/5.3/os/i386/
http://mirror.khlug.org/centos/5.3/os/i386/
http://centos.mirror.cdnetworks.com/5.3/os/i386/
[root@hq1 ~]# cat /var/cache/yum/base/mirrorlist.txt >> /etc/yum.repos.d/CentOS-SRPMS.repo
[root@hq1 ~]# vim /etc/yum.repos.d/CentOS-SRPMS.repo
### michaelus <--->

[base-SRPMS]
name=CentOS-$releasever - Base SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/os/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/os/SRPMS/
http://mirror.yandex.ru/centos/$releasever/os/SRPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
Проверяем:
[mike@hq1 ~]$ sudo yum repolist
Loaded plugins: allowdowngrade, changelog, downloadonly, list-data, merge-conf, priorities, protectbase, verify, versionlock
base-SRPMS | 951 B 00:00
primary.xml.gz | 308 kB 00:02
base-SRPMS 1186/1186
repo id repo name status
addons CentOS-5 - Addons enabled : 0
adobe-linux-i386 Adobe Systems Incorporated enabled : 17
base CentOS-5 - Base enabled : 2,508
base-SRPMS CentOS-5 - Base SRPMS enabled : 1,186
extras CentOS-5 - Extras enabled : 312
updates CentOS-5 - Updates enabled : 415
repolist: 4,438
Пробуем закачать (посмотреть URL):
[mike@hq1 ~]$ yumdownloader --urls --source kernel
Loaded plugins: priorities, protectbase, versionlock
primary.xml.gz | 308 kB 00:02
base-SRPMS 1186/1186
primary.xml.gz | 282 kB 00:02
updates 415/415
1161 packages excluded due to repository protections
Reading version lock configuration
No source RPM found for kernel-2.6.18-128.1.14.el5.i686
No source RPM found for kernel-2.6.18-128.4.1.el5.i686
No source RPM found for kernel-2.6.18-128.1.6.el5.i686
No source RPM found for kernel-2.6.18-128.2.1.el5.i686
No source RPM found for kernel-2.6.18-128.1.1.el5.i686
No source RPM found for kernel-2.6.18-128.1.16.el5.i686
No source RPM found for kernel-2.6.18-128.el5.i686
No source RPM found for kernel-2.6.18-128.1.10.el5.i686
Nothing to download
Получаем фиг. Замечаем строку сообщения: "1161 packages excluded due to repository protections". Это практически столько пакетов как раз в репозитарии base-SRPMS, замечаем также сообщение что yumdownloader использует установленный плагин yum-protectbase. Пробуем с отключёнными плагинами:
[mike@hq1 ~]$ yumdownloader --noplugins --urls --source kernel
No source RPM found for kernel-2.6.18-128.1.14.el5.i686
No source RPM found for kernel-2.6.18-128.4.1.el5.i686
No source RPM found for kernel-2.6.18-128.1.6.el5.i686
No source RPM found for kernel-2.6.18-128.2.1.el5.i686
No source RPM found for kernel-2.6.18-128.1.1.el5.i686
No source RPM found for kernel-2.6.18-128.1.16.el5.i686
No source RPM found for kernel-2.6.18-128.1.10.el5.i686
http://mirror.svk.su/centos/5/os/SRPMS//kernel-2.6.18-128.el5.src.rpm
Всё ОК, за исключением того что исходники для апдейтов ядра не найдены, что понятно т.к. у нас подключён только репозитарий исходников для базового бинарного репозитария.

Если посмотреть код yumdownloader, то можно увидеть что там используется дополнительная неописанная в man page логика обработки списка системных репозитариев:
     82     def setupSourceRepos(self):
83 # enable the -source repos for enabled primary repos
84 archlist = rpmUtils.arch.getArchList() + ['src']
85 # Ok, we have src and bin repos. What we want to do here is:
86 #
87 # 1. _enable_ source repos for which the bin repos are enabled.
88 # 2. _disable_ the _other_ src repos.
89 #
90 # ...also we don't want to disable the src repos. for #1 and then
91 # re-enable them as then we get annoying messages and call .close() on
92 # them losing the primarydb data etc.
93
94 # Get all src repos.
95 src_repos = {}
96 for repo in self.repos.findRepos('*-source'):
97 src_repos[repo.id] = False
98
99 # Find the enabled bin repos, and mark their respective *-source repo.
100 # as good.
101 for repo in self.repos.listEnabled():
102 if repo.id not in src_repos:
103 srcrepo = '%s-source' % repo.id
104 if srcrepo in src_repos:
105 src_repos[srcrepo] = True
106
107 # Toggle src repos that are set the wrong way
108 for repo in self.repos.findRepos('*-source'):
109 if repo.isEnabled() and not src_repos[repo.id]:
110 repo.close()
111 self.repos.disableRepo(repo.id)
112 if not repo.isEnabled() and src_repos[repo.id]:
113 self.logger.info('Enabling %s repository' % repo.id)
114 repo.enable()
115 # Setup the repo, without a cache
116 repo.setup(0)
117 # Setup pkgSack with 'src' in the archlist
118 self._getSacks(archlist=archlist, thisrepo=repo.id)
Т.е. для каждого активного бинароного репозитария ищется соответсвующее ему имя репозитария с суфиксом '-source' и если этот репозитарий выключен, то он разблокируется в предположении что типа это репозитарий с исходниками соответсвующими бинарному репо (и наоборот).

Добавим по образу и подобию остальные репозитарии:
### michaelus <--->

[base-SRPMS]
name=CentOS-$releasever - Base SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/os/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/os/SRPMS/
http://mirror.yandex.ru/centos/$releasever/os/SRPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


[updates-SRPMS]
name=CentOS-$releasever - Updates SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/updates/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/updates/SRPMS/
http://mirror.yandex.ru/centos/$releasever/updates/SRPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


[addons-SRPMS]
name=CentOS-$releasever - Addons SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/addons/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/addons/SRPMS/
http://mirror.yandex.ru/centos/$releasever/addons/SRPMS/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


[extras-SRPMS]
name=CentOS-$releasever - Extras SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/extras/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/extras/SRPMS/
http://mirror.yandex.ru/centos/$releasever/extras/SRPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


[centosplus-SRPMS]
name=CentOS-$releasever - Plus SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/centosplus/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/centosplus/SRPMS/
http://mirror.yandex.ru/centos/$releasever/centosplus/SRPMS/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


[contrib-SRPMS]
name=CentOS-$releasever - Contrib SRPMS
baseurl=http://mirror.svk.su/centos/$releasever/contrib/SRPMS/
http://mirror.corbina.net/pub/Linux/centos/$releasever/contrib/SRPMS/
http://mirror.yandex.ru/centos/$releasever/contrib/SRPMS/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

И выведем их список через yum:
[mike@hq1 ~]$ sudo yum repolist
Loaded plugins: allowdowngrade, changelog, downloadonly, list-data, merge-conf, priorities, protectbase, verify, versionlock
adobe-linux-i386 | 951 B 00:00
base-SRPMS | 951 B 00:00
updates-SRPMS | 951 B 00:00
primary.xml.gz | 37 kB 00:00
updates-SRPMS 122/122
extras-SRPMS | 951 B 00:00
primary.xml.gz | 37 kB 00:00
extras-SRPMS 155/155
http://mirror.svk.su/centos/5/addons/SRPMS/repodata/repomd.xml: [Errno 14] HTTP Error 404: Not Found
Trying other mirror.
http://mirror.corbina.net/pub/Linux/centos/5/addons/SRPMS/repodata/repomd.xml: [Errno 14] HTTP Error 404: Not Found
Trying other mirror.
http://mirror.yandex.ru/centos/5/addons/SRPMS/repodata/repomd.xml: [Errno 14] HTTP Error 404: Not Found
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: addons-SRPMS. Please verify its path and try again
Видим, что для директории addons/SRPMS/ на зеркале не создана база repodata (несмотря что в репозитарии нет ни одного пакета, эта структура должан быть создана, как например для репозитария [contrib]). Видимо упустили, можно написать багрепорт, но проще просто выключить это репо.
[mike@hq1 ~]$ sudo yum  repolist
Loaded plugins: allowdowngrade, changelog, downloadonly, list-data, merge-conf, priorities, protectbase, verify, versionlock
base-SRPMS | 951 B 00:00
updates-SRPMS | 951 B 00:00
extras-SRPMS | 951 B 00:00
base | 1.1 kB 00:00
updates | 951 B 00:00
addons | 951 B 00:00
extras | 1.1 kB 00:00
repo id repo name status
addons CentOS-5 - Addons enabled : 0
adobe-linux-i386 Adobe Systems Incorporated enabled : 17
base CentOS-5 - Base enabled : 2,508
base-SRPMS CentOS-5 - Base SRPMS enabled : 1,186
extras CentOS-5 - Extras enabled : 312
extras-SRPMS CentOS-5 - Extras SRPMS enabled : 155
updates CentOS-5 - Updates enabled : 415
updates-SRPMS CentOS-5 - Updates SRPMS enabled : 122
repolist: 4,715
Пробуем закачать (посмотреть URL):
[mike@hq1 ~]$ yumdownloader --noplugins --urls --source kernel
primary.xml.gz | 37 kB 00:00
updates-SRPMS 122/122
primary.xml.gz | 37 kB 00:00
extras-SRPMS 155/155
http://mirror.svk.su/centos/5/updates/SRPMS//kernel-2.6.18-128.4.1.el5.src.rpm
Теперь загружаются исходники для последней установленной версии ядра. Загрузить можно также и промежуточную версию пакета, для этого следует указать полное имя пакета включая его версию (часть имени до расширения *.src.rpm).
[root@hq1 ~]# yumdownloader --noplugins --destdir /usr/local/src/redhat/SRPMS/ --source kernel-2.6.18-128.el5

No comments:

Post a Comment