Thursday, August 27, 2009

Закладки на тему...

Все посты состоящие лишь из ссылок на другие сайты и блоги вынесены в отдельный блог   http://bookmarks-on-topic.blogspot.com/
Сcылки на страницы или ресурсы по конкретной теме оформлены как отделные записи с соответствующими тэгами. Все остальные ссылки на сайты и блоги - в разделе Links.

Wednesday, August 19, 2009

Монтирование файловых систем vfat (FAT/FAT32)

vfat - реализация файловых систем MS-DOS FAT/FAT32 в Linux. man mount(8)

Типичный набор опций монтирования vfat для UTF-8 локали (пропускаем опции значение по-умолчанию которых нас устаривает):

uid=user_name,gid=group_name,fmask=0113,dmask=0002,codepage=866,utf8,shortname=winnt,quiet

Для не-UTF8 локали, а это скорей всего KOI8-R локаль (не забывая теперь обязательное для RHEL/CentOS 'utf8=no'):

uid=user_name,gid=group_name,fmask=0113,dmask=0002,codepage=866,iocharset=koi8-r,utf8=no,shortname=winnt,quiet

или учитывая что 'uni_xlate' отключает 'utf8', тем боле что уж лучше видеть закодированные имена файлов/директорий с которыми можно как-то обращаться чем неразличимые строчки из '?':

uid=user_name,gid=group_name,fmask=0113,dmask=0002,codepage=866,iocharset=koi8-r,uni_xlate,shortname=winnt,quiet

user_name и group_name - имена пользователя и группы которым предоставляется доступ на чтение/запись в монтируемый раздел FAT/FAT32 в соответствии с установленными fmask и dmask

Общие опции монтирования варьируются в зависимости от того, монтируем через командную строку или через запись в /etc/fstab, или в зависимости от необходимости автомонтирования при загрузке, режима rw/ro, или предоставления возможности монтирования/размонтирования раздела пользователями. Обычно используются: rw,async
В целях безопасности для FAT/FAT32 разделов можно явно указать: nodev,nosuid,noexec
Для ускорения можно использовать: noatime,nodiratime

Опции монтирования перечислены в man mount(8) в разделах 'Mount options for fat' и 'Mount options for vfat'.
Mount options for fat
=====================

blocksize=512 / blocksize=1024 / blocksize=2048
Set blocksize (default 512).
Размер блока ввода/вывода.


uid=value and gid=value
Set the owner and group of all files. (Default: the uid and gid of the current process.)

Поскольку в FAT/FAT32 нет поддержки прав владения и доступа к файлам и директориям, то весь
раздел по-умолчанию монтируется с идентификаторами uid и gid владельца процесса
осуществляющего монтирование. Можно указать нужного пользователя и группу от имени которого
будет монтироваться раздел FAT/FAT32. Это могут быть как числовые значения идентификаторов
так и имена пользователя/группы, по крайней мере из командной строки проходит простое
задание имени пользователя/группы.



umask=value
Set the umask (the bitmask of the permissions that are not present). The default is the umask
of the current process. The value is given in octal.

dmask=value
Set the umask applied to directories only. The default is the umask of the current process.
The value is given in octal.

fmask=value
Set the umask applied to regular files only. The default is the umask of the current process.
The value is given in octal.

umask, dmask, fmask - маски прав доступа для файлов/директорий (umask) либо отдельно для
директорий (dmask) и отдельно для файлов (fmask). Фактически через них устанавливаются права
владельца (u), группы (g) и прочих пользователей (o) для всех файлов и дерикторий на монтируемом
разделе vfat. Задаётся в виде восьмиричного числа. (Кстати запись восьмеричного значения
не обязательно должна начинаеться с нуля.)



check=value
Three different levels of pickyness can be chosen:
r[elaxed]
Upper and lower case are accepted and equivalent, long name parts are truncated
(e.g. verylongname.foobar becomes verylong.foo), leading and embedded spaces are
accepted in each name part (name and extension).
n[ormal]
Like "relaxed", but many special characters (*, ?, <, spaces, etc.) are rejected.
This is the default.
s[trict]
Like "normal", but names may not contain long parts and special characters that
are sometimes used on Linux, but are not accepted by MS-DOS are rejected.
(+, =, spaces, etc.)

Управляет проверкой создаваемых имён файлов/директорий на разделе vfat, чтоб они соответсвовали
принятым в FAT/FAT32 правилам и ограничениям. По-умолчанию 'n[ormal]'.



codepage=value
Sets the codepage for converting to shortname characters on FAT and VFAT filesystems.
By default, codepage 437 is used.

Параметр монтирования который лучше указать. Задаёт досовскую кодовую страницу в которой
сохраняются создаваемые короткие (в формате 8.3) досовские имена файлов и директорий.
Тем кто ещё работал в досе и настраивал её эту цифру не забыть - для нормального
чтения/сохранения русских имён - codepage=866



conv=b[inary] / conv=t[ext] / conv=a[uto]
The fat file system can perform CRLF<-->NL (MS-DOS text format to UNIX text format) conversion
in the kernel. The following conversion modes are available:
binary - No translation is performed. This is the default.
text - CRLF<-->NL translation is performed on all files.
auto - CRLF<-->NL translation is performed on all files that don’t have a "well-known
binary" extension. The list of known extensions can be found at the beginning
of fs/fat/misc.c (as of 2.0, the list is:
exe, com, bin, app, sys, drv, ovl, ovr, obj, lib, dll, pif, arc, zip, lha, lzh,
zoo, tar, z, arj, tz, taz, tzp, tpz, gz, tgz, deb, gif, bmp, tif, gl, jpg, pcx,
tfm, vf, gf, pk, pxl, dvi).
Programs that do computed lseeks won’t like in-kernel text conversion.
Several people have had their data ruined by this translation. Beware!
For file systems mounted in binary mode, a conversion tool (fromdos/todos) is available.

Попытки облегчить перенос текстовых файлов из UNIX-like системы в MS-DOS путём автоматичексой
замены CRLF<-->NL на лету. Лучше пользоваться если нужно для конкретных файлов командными
утилитами конвертации dos2unix и unix2dos из одноимённых пакетов, или же универсальной iconv
идущей в составе пакета glibc-common.



cvf_format=module
Forces the driver to use the CVF (Compressed Volume File) module cvf_module instead of
auto-detection. If the kernel supports kmod, the cvf_format=xxx option also controls
on-demand CVF module loading.

cvf_option=option
Option passed to the CVF module.

cvf_format, cvf_option - параметры указывающие на конкретный модуль CVF и его опций
для загрузки ядром. Что это такое не хочется разбираться.



debug
Turn on the debug flag. A version string and a list of file system parameters will be printed
(these data are also printed if the parameters appear to be inconsistent).

Судя по описанию включает вывод строки с версией и параметрами файловой системы при
монтировании раздела FAT/FAT32.



fat=12 / fat=16 / fat=32
Specify a 12, 16 or 32 bit fat. This overrides the automatic FAT type detection routine.
Use with caution!

Вместо автоопределения типа FAT можно указать конкретную её версию.


iocharset=value
Character set to use for converting between 8 bit characters and 16 bit Unicode characters.
The default is iso8859-1.
Long filenames are stored on disk in Unicode format.

Вот этот параметр следует указать, если используется не-UTF8 пользовательская/системная локаль.
Как написано длинные имена файлов и директорий сохраняются в разделе VFAT в формате Юникод.
Для того чтобы при передаче в настроенные на не-UTF8 локаль пользовательске приложения,
символы из Юникод конвертировались в подходящий для этой локали восьмибитный код, необходимо
задать нужную табицу преобразования iocharset.
По-умолчанию, если не указывать, iocharset=ascii, т.е. подразумевается что длинные имена
файлов/каталогов состоят из символов из набора ASCII, для которых производится тривиальное
(один-в-один) преобразование кодов Unicode<-->ASCII.
Для KOI8-R локали следует указать таблицу преобразования символов в коды KOI8-R из символов
Юникод - iocharset=koi8-r (посмотреть можно в /usr/share/i18n/charmaps/KOI8-R.gz).
Задание iocharset имеет смысл только если в системе (или для конкретного пользователя,
для которого монтируется раздел) используется не-UTF8 локаль.
Для UTF-8 локали опцию iosharset пропускаем и монтировать раздел необходимо со специально
предназанченной для этого случая самостоятельной опцией 'utf8' (см. описание далее).



quiet
Turn on the quiet flag. Attempts to chown or chmod files do not return errors, although they fail.
Use with caution!

Подавляет сообщения об ошибке при попытке выполнить 'chown' или 'chmod' для файлов на разделе
FAT/FAT32. Вообще, хоть и предупреждают пользоваться этой опцией с осторожностью, но она делает
повседневную работу с разделами vfat более удобной, прозрачно пропуская запросы приложений
на выполнение неподдерживаемых FAT/FAT32 функций, которые время от времени постоянно возникают.
Например, при создании резервной копии редактируемого файла в gedit или при использованиий rsync
с обычной опцией '-a'. Просто нужно помнить что раздел с которым работаешь - FAT/FAT32 и
учитывать, что помещённые на него файлы всегда приобретают владельца и режим доступа указанный
при монтировании. В отсутствие этой опции помнить об этом также приходится, потому что постоянно
получаешь ошибки выполнения операции бэкапа (нужно например специально прописывать опции rsync)
или предупреждения при перемещении файлов из-за невозможности сменить их владельца и время.
Осмотрительность надо проявлять при обратных операциях - получения файлов с разделов vfat
с установкой владельца.



sys_immutable, showexec, dots, nodots, dotsOK=[yes|no]
Various misguided attempts to force Unix or DOS conventions onto a FAT file system.

Различные с переменным успехом попытки привести в соответсвие Unix- и DOS- соглашения для
файловой системы FAT. Пример и описание использования параметра 'showexec' можно посмотреть в этой одной из редких не содержащих ошибочных сведений статье: http://citkit.ru/articles/147/



Mount options for vfat
======================

uni_xlate
Translate unhandled Unicode characters to special escaped sequences. This lets you backup
and restore filenames that are created with any Unicode characters. Without this option,
a ’?’ is used when no translation is possible. The escape character is ’:’ because it is
otherwise illegal on the vfat filesystem. The escape sequence that gets used, where u is
the unicode character, is: ’:’, (u & 0x3f), ((u>>6) & 0x3f), (u>>12).

Это тоже полезная опция при работе в не-UTF8 локали. В длинных именах файлов/директорий
могут встречаться любые символы Юникод, в том числе и не попадающие в тот набор из 256
символов, который указан в таблице конвертации в параметре iocharset=. Такие символы
отображаются как ’?’, или если указана данная опция они представляются специальными
escape-последовательностями. Символ экранирования - двоеточие ’:’, потому что он запрещён
в досовских именах и точно никогда в них не встречается. Потенциально при этой включённой
опции можно управляться с файлами имена которых содержат любые из символов Юникод.
Имена выглядят забавно: например файл с именем 'тест' будет показываться
как ':0442:0435:0441:0442'. Фаил с таким именем можно создать, скопировать,
записать, переименовать например в ':0442:0435:0441:0441', и это будет досовское имя 'тесс'.
Но вот например синхронизация директорий с такими escape-последовательностями в имени
с помощью rsync не будет работать, очевидно потому что rsync ничего не знает о подобных
преобразованиях имён.



posix
Allow two files with names that only differ in case.

Разрешает создание двух файлов с именами различающимися только регистром.


nonumtail
First try to make a short name without sequence number, before trying name~num.ext.

При создании короткого досовского имени пытается сначала создать его без обычных тильды
с номером в конце имени.



utf8
UTF8 is the filesystem safe 8-bit encoding of Unicode that is used by the console.
It can be be enabled for the filesystem with this option.
If ‘uni_xlate’ gets set, UTF8 gets disabled.

Включает UTF-8 кодирование символов Юникод при передачи их в пользовательские приложения
работающие в UTF-8 локали. Очевидно что это то, что нужно в обычных условиях.
Если установлена опция 'uni_xlate', то опция 'utf8' отключается.

Теоретически в UTF-8 локали можно не использовать опцию 'utf8', а задать iocharset=utf8.
В исходниках fs/fat/inode.c встречаем такое предупреждение:

            1105         /* UTF-8 doesn't provide FAT semantics */
1106 if (!strcmp(opts->iocharset, "utf8")) {
1107 printk(KERN_ERR "FAT: utf8 is not a recommended IO charset"
1108 " for FAT filesystems, filesystem will be case sensitive!\n");
1109 }

shortname=[lower|win95|winnt|mixed]
Defines the behaviour for creation and display of filenames which fit into 8.3 characters.
If a long name for a file exists, it will always be preferred display. There are four modes:
lower - Force the short name to lower case upon display;
store a long name when the short name is not all upper case.
win95 - Force the short name to upper case upon display;
store a long name when the short name is not all upper case.
winnt - Display the shortname as is;
store a long name when the short name is not all lower case or all upper case.
mixed - Display the short name as is;
store a long name when the short name is not all upper case.
The default is "lower".

Определяет то, как создаются и отображаются имена файлов и директорий которые сами по себе
имеют формат 8.3. Если для файла существует длинное имя, то будет выводиться оно,
т.к. всегда имеет приоритет. Имеется четыре режима, как описано. По-умолчанию - "lower".
Думается что более естественно использовать "winnt".



---
После монтирования раздела проверить опции с которыми он смонтировался можно по 'cat /proc/mounts'.

В RedHat/CentOS замечена одна особенность: vfat раздел всегда монтируется с включённой опцией 'utf8', даже если она не указана в командной строке. Это происходит также в не-UTF8 локали, что приводит к тому что имена файлов состоящие из не-ascii символов отображаются неверно (как обычно это выглядит когда юникод строку пытаются вывести с помощью какой-либо кодовой таблицы из 256 восьмибитовых символов). Это является результатом патча бага Анаконды https://bugzilla.redhat.com/show_bug.cgi?id=181963, когда вместо исправления ошибки в настройках инсталляторя просто пропатчили ядро на предмет чтобы по умолчанию vfat разделы монтировались с включённой опцией 'utf8', т.к. типа всё равно все уже давно работают только в UTF-8 локали. Но при этом забыли упомянуть в man-странице как отключать эту опцию https://bugzilla.redhat.com/show_bug.cgi?id=515149

В том же fs/fat/inode.c можно посмотреть недокументированные параметры, которые можно задать для управления опциями, в том числе для отключения 'utf8':
    905 static match_table_t vfat_tokens = {
906 {Opt_charset, "iocharset=%s"},
907 {Opt_shortname_lower, "shortname=lower"},
908 {Opt_shortname_win95, "shortname=win95"},
909 {Opt_shortname_winnt, "shortname=winnt"},
910 {Opt_shortname_mixed, "shortname=mixed"},
911 {Opt_utf8_no, "utf8=0"}, /* 0 or no or false */
912 {Opt_utf8_no, "utf8=no"},
913 {Opt_utf8_no, "utf8=false"},
914 {Opt_utf8_yes, "utf8=1"}, /* empty or 1 or yes or true */
915 {Opt_utf8_yes, "utf8=yes"},
916 {Opt_utf8_yes, "utf8=true"},
917 {Opt_utf8_yes, "utf8"},
918 {Opt_uni_xl_no, "uni_xlate=0"}, /* 0 or no or false */
919 {Opt_uni_xl_no, "uni_xlate=no"},
920 {Opt_uni_xl_no, "uni_xlate=false"},
921 {Opt_uni_xl_yes, "uni_xlate=1"}, /* empty or 1 or yes or true */
922 {Opt_uni_xl_yes, "uni_xlate=yes"},
923 {Opt_uni_xl_yes, "uni_xlate=true"},
924 {Opt_uni_xl_yes, "uni_xlate"},
925 {Opt_nonumtail_no, "nonumtail=0"}, /* 0 or no or false */
926 {Opt_nonumtail_no, "nonumtail=no"},
927 {Opt_nonumtail_no, "nonumtail=false"},
928 {Opt_nonumtail_yes, "nonumtail=1"}, /* empty or 1 or yes or true */
929 {Opt_nonumtail_yes, "nonumtail=yes"},
930 {Opt_nonumtail_yes, "nonumtail=true"},
931 {Opt_nonumtail_yes, "nonumtail"},
932 {Opt_err, NULL}
933 };

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