Saturday, December 26, 2009

Минимальная установка CentOS 5.4

Минимальная штатная установка CentOS-5.4 получается когда при инсталляции снимаются отметки напротив всех разделов в окне Package Selection (текстовый инсталлятор) и, не забывая выбрать опцию Customize software selection, отключаются все группы пакетов в окне Package Group Selection.
Всего при этом устанавливается ~192 пакета, однако даже среди них не все являются необходимыми для работы сервера на котором не требуется наличие графической оболочки.

Вот список пакетов которые были удаелны (слева) и добавлены (справа) в процессе последующей настройки сервера:
atk
bitstream-vera-fonts
                    bzip2
cairo
cups-libs
dhcpv6-client
ecryptfs-utils-75
fontconfig
freetype
gnu-efi
                    gpg-pubkey-e8562897-459f07a4
                    gpm
                    groff
gtk2
hicolor-icon-theme
iptables-ipv6
libjpeg-6b
libpng
libtiff
libX11
libXau
libXcursor
libXdmcp
libXext
libXfixes
libXft
libXi
libXinerama
libXrandr
libXrender
                    lsof
                    man
pango
rhpl
trousers
                    vsftpd
wireless-tools-28
xorg-x11-filesystem

Вообще удивляет наличие таких пакетов как TrueType шрифты bitstream-vera-fonts, fontconfig и freetype, множество иксовых библиотек (все libX*, ), gtk2, иконок hicolor-icon-theme, wireless-tools-28 в минимальной установке сервера предназначенного исключительно для работы в текстовом режиме. Как и зачем они попадают в инсталляцию и что думают по этому поводу те, кто их прописывал для установки не понятно, как не понятно и дефолтное отсутствие man, хотя все пакеты исправно устанвливают свои ман-страницы. Наверное ни один нормальный человек не сможет на память пользоваться всеми нужными ключами команд, которые могут понадобиться во время настройки и работы.

Удалённые пакеты все вместе с друг-дружкой деинсталлируются без нарушения зависимостей, кроме пакета iptables-ipv6, который требуется для утилиты конфигурации system-config-securitylevel-tui (текстовый вариант гномовской панели управления system-config-securitylevel) для настройки selinux и фаервола.

system-config-securitylevel-tui обеспечивает настройку только базового функционала файрвола сохраняя свои данные в файле /etc/sysconfig/system-config-securitylevel) и перезаписывает вручную внесённые настройки iptables. Так что этой утилитой лучше либо не пользоваться совсем либо пользоваться только ей. Формальное отсутствие пакета из зависимости не как не сказывается на её работе, тем более что IPv6 в системе всё равно отключен.

Как отключить поддержку IPv6 сказано в вики CentOS FAQ:
http://wiki.centos.org/FAQ/CentOS5#head-47912ebdae3b5ac10ff76053ef057c366b421dc4
Сперва требуется Установить опцию "NETWORKING_IPV6=no" в /etc/sysconfig/network (по умолчанию в инсталляции это так и есть). Далее если сделать как сказано для 5.4 и прописать в /etc/modprobe.d/disable-ipv6 строчку "options ipv6 disable=1", то модуль ядра ipv6 всё-равно будет загружаться. Поэтому если в системе не устанавливается демон iSCSI-инициатора для которого он нужен, можно добавить также строчку "install ipv6 /bin/true" что предотвратит загрузку модуля ipv6, а также добавить сточку "install ip6_tables /bin/true" чтобы предотвратить загрузку этого модуля ядра в случае использования system-config-securitylevel-tui (он загружается этой утилитой при сохранении настроек).

Приведённый список был получен сравнением отсортированных данных из файла /root/install.log и вывода команды rpm -qa с помощью утилиты comm -3. Кандидаты на удаление выбирались по назначению (например, избавиться от ненужных пакетов поддержки IPv6), а также большинство из удаляемых пакетов было найдено при просмотре списка пакетов, деинсталляция которых не приводит к нарушению каких-либо зависимостей для других пакетов. Перечень таких пакетов теоретически доступных для безопасного удаления не приводящего к нарушению зависимостей можно получить по команде:
for p in $(rpm -qa); do [[ $(rpm -q --whatrequires "$p" ) == "no package"* ]] && echo "$p" >>no_package_requires; done
for p in $(rpm -qa | sed 's/-[0-9]\+.*$//'); do [[ $(rpm -q --whatrequires "$p" ) == "no package"* ]] && echo "$p" >>no_package_requires; done
В общем случае посторение и просмотр этого списка требуется повторить пару раз т.к. после деинсталляции некоторых пакетов теоретически могут появиться новые доступные для удаления ненужные пакеты от которых ранее существовали зависимости.

Saturday, September 19, 2009

Nautilus и файлы MIME-типа application/octet-stream

В Gnome Desktop файловый менеджер Nautilus использует классификацию файлов в соответсвии с MIME-типами (Content-type) содержимого файлов. В частности это напрямую используется для задания программ используемых по-умолчанию для открытия файлов по двойному клику на имени файла или из контекстного меню 'Open with'.

В настройках Nautilus для отображения папок в режиме 'View as List' я всегда заменяю колонку 'Type' на 'MIME Type'.

Можно заметить что умная программа пытается распознать тип файла при обращении к нему именно по содержанию файла, а не по его расширению. Иногда это приводит к ошибке, например файл /etc/yum.conf распознаётся как application/x-cisco-vpn-settings.

Нераспознанные по содержимому файлы определяются MIME-типом, который соответствует произвольным двоичным данным - application/octet-stream. При попытке открыть такие файлы по двойному клику Nautilus просто и незатейливо выдаёт окошко:
Couldn't display "имя_файла".

Зачастую когда возникает желание взглянуть на содержимое нужного файла данных, либо просто некоего незнакомого файла, он оказывается именно application/octet-stream.

Но это как бы не должно быть сильно неудобно, ведь в любом случае для файла можно задать приложение или команду для его открытия через пункт контекстного меню 'Open with Other Application...'. В этом случае в соответствии с расширением, которое имеет имя файла в системе регистрируется новый MIME-тип 'application/x-extension-расширение_файла', и все файлы попадающие под соответсвующий glob pattern считаются принадлежащими этому MIME-типу и открываются указанным приложением или командой.

Чтоб посмотреть нужный файл через 'Open with Other Application...' я обычно выбираю по ситуации либо gedit (пункт Text Editor), либо в строке 'Use a custom command' задаю команду 'gnome-terminal --geometry=127x41 -x less', т.к. через less в териминале если будет нужно потом можно выйти в vim и далее посмотреть/отредактировать файл в hex-формате с помощью xxd.

Пользовательская база данных созданных MIME-типов располагается в директории  ~/.local/share/mime,
основной конфигурационный файл  ~/.local/share/mime/packages/Override.xml
Подробнее об этом можно прочитать здесь:  http://www.freedesktop.org/wiki/Specifications/AddingMIMETutor
А регистрация связи между MIME-типом файла и приложением которое может его открывать происходит с помощью .desktop-файлов в директории  ~/.local/share/applications
Про .desktop-файлы на сайте freedesktop.org можно найти следующую ссылки:
http://www.freedesktop.org/wiki/Howto_desktop_files
http://standards.freedesktop.org/desktop-entry-spec/latest/

Наводкой на инфу на freedesktop.org о добавлении собственных MIME-типов послужило найденное описание некой похожей ситуации:
http://linux.seindal.dk/2004/07/01/nautilus-2-6-and-mime-types/

Однако приём с автоматическим добавлением нового MIME-типа через пункт контекстного меню 'Open with Other Application...' не рабоает если у имени файла нет расширения. При попытке воспользоваться им Nautilus выдаёт ошибку:
Could not add application
Could not add application to the application database


Обычно я этим не заморачивался, просто если нужно было иметь дело с такими файлами откравал консоль и смотрел/редактировал их через less/vim. Но в случае когда имеешь много файлов данных (например дампов) с похожими друг на друга длинными именами, которые неудобно открывать вручную через консоль из-за множества escape'ов и различающихся цифр в имени, это уже станвится не так здорово. Очевидно что превращать всякий раз файл типа application/octet-stream в некий другой MIME-тип создавая и регистрируя его в системе для каждого файла или группы файлов по glob pattern это не совсем то что нужно. Фактически всё что требуется это просто задать для Nautilus некую универсальную программу-просмоторщих любого файла любого имеющегося MIME-типа, ну или хотябы уж для файлов типа application/octet-stream. Сделать через меню Nautilus это нельзя. Можно попробовать вручную создать .desktop-файл для открытия файлов MIME-типа application/octet-stream. Программой просмоторщиком может служить тот-же less запущенный в gnome-terminal.

.desktop-файлы - это текстовые файлы с расширением '.desktop', содержащие нужные параметры настройки в виде переменных с присвоенными им значениями. В Gnome с ними происходит такая штука: в Nautilus они отображаются без расширения '.desktop' и не под тем именем под которвм лежат в файловой системе, а под именем определённым в самом файле. Эта странность определённым образом напоминает распространённую ситуацию со специальными папками и файлами в Windows Explorer, когда вместо фактического листинга директории или фактического файла на диске показывается некое содержимое папки или некий эелемент в соответствии с теми представлениями которые посчитали нужным создать разработчики GUI для этой директории или файла. Я надеялся не увидеть в Linux таких "концепций". Зачем разработчики Gnome переняли этот опыт не понятно (хотя судя по всему это сделано по-видимому для того, чтобы иметь возможность отображать название одного и того же .desktop-файла под разными именами, на языке соответствующем пользовательской локали). Да и вообще стоит сказать спасибо что это простой текстовый файл, а не xml-формат - редкое явление для конфигурационных файлов в Gnome Desktop. Наверное забыли переделать, а может просто не поддались всеобщей мании использовать xml-формат везде где ни попадя, не только как формат файлов для обмена информацией между компьютерами или программами, но и для самых простых конфигурационных файлов предназначенных исключительно для создания и редактирования человеком, заставляя его работать на подобие машины, набирая бессмсленную кучу ненужных тэгов и следить чтоб все они были корректно закрыты -- в общем создать неудобства для человека для удобства автоматической обработки файла. (Ну ладно, это конечно всё лирика.)

Для привязки в Nautilus нужной программы-просмоторщика к файлам MIME-типа application/octet-stream достаточно в директории  ~/.local/share/applications  создать файл с любым именем и расширением '.desktop' следующего содержания:
[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=mime octet-stream viewer
MimeType=application/octet-stream;
Exec=gnome-terminal --geometry=127x41 -x less %f
Type=Application
Terminal=false
NoDisplay=true
Затем проверить его на ошибки с помощью утилиты desktop-file-validate и выполнить команду обновления базы данных update-desktop-database для этой директории:
[mike@localhost ~]$ vim .local/share/applications/mime-octet-stream-viewer.desktop
[mike@localhost ~]$ desktop-file-validate .local/share/applications/mime-octet-stream-viewer.desktop 
[mike@localhost ~]$ update-desktop-database .local/share/applications
После этого в Nautilus в контекстном меню для файлов MIME-типа application/octet-stream пункт 'Open' будет называться 'Open with "mime octet-stream viewer"' и при двойном клике на имени файла будет запускаться в Gnome Terminal его просмотр с помощью утилиты less.

Friday, September 11, 2009

bash-scripting: три способа узнать содержится ли подстрока в строке

Если нужно узнать содержится ли в некой строке (пускай она хранится в переменной) некая подстрока (другая переменная), например, присутствует ли некий путь $DIR в переменной $PATH, то, есть как минимум три способа это сделать.

Способ 1:

echo "$PATH" | /bin/egrep -q "(^|:)$DIR($|:)"
TEST=$?


Или чуть проще:

/bin/egrep -q "(^|:)$DIR($|:)" <<< "$PATH"
TEST=$?


Достоинства: простота, элегантность.
Недостатки: необходимость использования пусть и стандартной, но внешней утилиты.

Способ 2 (наш антисимметричный ответ чемберлену):

[ "$PATH" = "$DIR" -o \
  "${PATH##$DIR:}" != "$PATH" -o \
  "${PATH%%:$DIR}" != "$PATH" -o \
  "${PATH/:$DIR:}" != "$PATH" ]
TEST=$?


Достоинства: "хм...".
Недостатки: "о, это чёэто ваще такое тут!?"
В общем достоинства этого способа противоположны недостаткам первого. С недостатками, как видно, аналогично.

Способ 3 (попытка примирения):

[[ "$PATH" == "$DIR" || "$PATH" == "$DIR":* || "$PATH" == *:"$DIR" || "$PATH" == *:"$DIR":* ]]
TEST=$?

Wednesday, September 2, 2009

Системная консоль

Системная консоль - консоль на которую посылаются сообщения ядра.

В Documentation/serial-console.txt, описывается настройка системной консоли на терминальное устройство, подключаемое через последовательный порт. Но ещё в этом документе раскрывается общий порядок выбора устройства, на котором будет производится ввод/вывод системной консоли. Вот цитата и перевод с комментариями из этого файла, касающийся порядка выбора этого устройства (вообще там дальше по тексту приводится полный пример как настроить консоль на последовательный порт, так что если такое вдруг понадобится, то следует обращаться к этому документу):

 --------------------- Documentation/serial-console.txt ----------------------
/                                                                             \

It is possible to specify multiple devices for console output. You can
define a new kernel command line option to select which device(s) to
use for console output.
Имеется возможность указывать несколько устройств для консольного вывода.
Вы можете задать параметр командной строки ядра чтобы выбрать какие
устройства использовать для консольного вывода.

The format of this option is:
Формат опции такой:

        console=device,options

        device:         tty0 for the foreground virtual console
                             для первого виртуального терминала (виртуальной
                             консоли)
                        ttyX for any other virtual console
                             для остальных виртуальных терминалов (консолей)
                        ttySx for a serial port
                              для последовательного порта
                        lp0 for the first parallel port
                            для первого параллельного порта
                        ttyUSB0 for the first USB serial device
                                для первого USB устройства

        options:        depend on the driver. For the serial port this
                        defines the baudrate/parity/bits/flow control of
                        the port, in the format BBBBPNF, where BBBB is the
                        speed, P is parity (n/o/e), N is number of bits,
                        and F is flow control ('r' for RTS). Default is
                        9600n8. The maximum baudrate is 115200.
                        опции зависят от драйвера устройства.
                        Для последовательного порта здесь определяются опции
                        для скорости соединения/чётности/разрядности/режима
                        управления портом в формате BBBBPNF где BBBB это
                        скорость, P режим контроля чётности (n/o/e),
                        N - количество разрядов, и F - режим управления
                        потоком ('r' для RTS). По-умолчанию значение '9600n8'.
                        Максимальная скорость 115200. 

You can specify multiple console= options on the kernel command line.
Output will appear on all of them. The last device will be used when
you open /dev/console. So, for example:
Вы можете указать опцию 'console=' несколько раз в командной строке ядра.
Вывод появится на всех этих устройствах. Последнее из указанных устройств будет
использоваться как устройство /dev/console. Так например:

        console=ttyS1,9600 console=tty0

defines that opening /dev/console will get you the current foreground
virtual console, and kernel messages will appear on both the VGA
console and the 2nd serial port (ttyS1 or COM2) at 9600 baud.
определяет что устройство /dev/console будет связано с текущим виртуальным
терминалом, и сообщения ядра будут появляться одновременно как на VGA консоли
так и на втором последовательном порте (ttyS1 или COM2) на скорости 9600 бод.

Note that you can only define one console per device type (serial, video).
Следует заметить что вы можете определить только по одной системной консоли
на каждый тип устройства (последовательный порт, видеоустройство).

If no console device is specified, the first device found capable of
acting as a system console will be used. At this time, the system
first looks for a VGA card and then for a serial port. So if you don't
have a VGA card in your system the first serial port will automatically
become the console.
Если не указано никакого устройства для консоли (как это обычно и бывает),
то будет использовано первое найденное устройство способное работать в качестве
системной консоли. В настоящее время система сначала просматривает устройства
VGA видеокарт и потом последовательный порт. Так что если у вас нет в системе
VGA видеокарты, то первый последовательный порт автоматически станет системной
консолью.

You will need to create a new device to use /dev/console. The official
/dev/console is now character device 5,1.
Вам будет нужно создать новое устройство для того чтобы использовать
/dev/console. /dev/console является символьным устройством с номером 5,1.

(You can also use a network device as a console.  See
Documentation/networking/netconsole.txt for information on that.)
(Вы также можете использовать стевую карту в качестве системной консоли.
См. информацию в Documentation/networking/netconsole.txt по этому поводу.)

\                                                                             /
 --------------------- Documentation/serial-console.txt ----------------------

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