tag:blogger.com,1999:blog-39541360863753385412024-03-01T08:39:17.543+03:000x2207Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.comBlogger43125tag:blogger.com,1999:blog-3954136086375338541.post-5319899907987219442015-10-12T11:00:00.000+03:002015-10-12T11:00:11.685+03:00Настройка звука в конфигурации с несколькими одинаковыми звуковыми картамиИмеется следующая конфигурация. Два звуковых устройства, оба управляются одним и тем же модулем <tt>snd-hda-intel</tt>. Первое устройство отвечает за звуковой канал в HDMI, встроенной в процессор графической системы. Второй устройство — обычный интегрированный на материнскую плату аудио-контроллер.<br />
<pre>00:03.0 Audio device [0403]: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller [8086:0c0c] (rev 06)
00:1b.0 Audio device [0403]: Intel Corporation 9 Series Chipset Family HD Audio Controller [8086:8ca0]</pre>Пользователи жалуются, что звук не работает. Проблема состоит в том, что YaST создаёт следующую конфигурацию в <tt>50-sound.conf</tt>:<br />
<pre>options snd slots=snd-hda-intel,snd-hda-intel
alias snd-card-0 snd-hda-intel
alias snd-card-1 snd-hda-intel</pre>Здесь <tt>snd-card-0</tt> — звуковое устройство "по умолчанию". Очевидно, что в таком подходе ситуация, когда один и тот же модуль отвечает за два устройства, обрабатывается не корректно. Кто из устройств первый попал в функцию <tt>azx_probe</tt> модуля, тот и станет <tt>snd-card-0</tt>. В нашем случае, это не то устройство, которое нам хотелось бы. Это можно проверить, сделав<br />
<pre>ls -l /sys/class/sound/card0/device
lrwxrwxrwx 1 root root 0 окт 9 21:36 /sys/class/sound/card0/device -> ../../../0000:00:03.0</pre><br />
Для восстановления правильного порядка предлагается делать следующее.<br />
Во-первых, внимательно изучив исходники модуля, добавляем в <tt>50-sound.conf</tt>:<br />
<pre>options snd-hda-intel index=1,0</pre>Во-вторых, надеемся, что при следующих загрузках порядок инициализации не будет меняться случайным образом, потому-что кто первый попадет в функцию <tt>azx_probe</tt>, тот теперь и будет <tt>card1</tt>. И это всё происходит в 2015 году, когда повсюду systemd и прочий udev, а звуковую карту за её DeviceId привязать нельзя.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-77174736545176210942015-08-17T11:00:00.000+03:002015-08-17T11:00:06.010+03:00Удаленная сетевая консоль ядра LinuxИногда, когда ядро Linux испытывает проблемы, одними из способов сбора отладочной информации являются консоль последовательного порта или сетевая консоль. Сразу обратим внимание, что второй вариант имеет как недостатки, например, предполагает, что сетевая подсистема ядра остается функциональной во время возникновения проблем, так и преимущества, например, можно сконфигурировать удаленно.<br />
<br />
<a href="https://www.kernel.org/doc/Documentation/networking/netconsole.txt">Полное описание</a> сетевой консоли находится в документации ядра. Для настройки достаточно добавить в <tt>modprobe.d/99-local.conf</tt>:<br />
<pre>options netconsole netconsole=@/,514@192.168.10.7/00:0C:29:F3:92:97</pre>Здесь, <tt>514</tt> - номер UDP порта, <tt>192.168.10.7</tt> - IP удаленного хоста куда будет отсылаться информация, <tt>00:0C:29:F3:92:97</tt> - его MAC адрес, если его не указать явно то будет использоваться широковещательный адрес <tt>FF:FF:FF:FF:FF:FF</tt>, что может затруднить передачу информации в зависимости от настроек сетевого оборудования.<br />
И загрузить модуль <tt>netconsole</tt> или, по желанию, поставить его на автозагрузку при старте системы.<br />
<br />
После загрузки модуля <tt>netconsole</tt>, сетевая консоль начинает немедленно функционировать, а в системном журнале можно увидеть примерно следующее:<br />
<pre>May 1 18:57:51 192.168.10.4 kernel: [162255.522603] netconsole: local port 6665
May 1 18:57:51 192.168.10.4 kernel: [162255.522673] netconsole: local IP 0.0.0.0
May 1 18:57:51 192.168.10.4 kernel: [162255.522710] netconsole: interface eth0
May 1 18:57:51 192.168.10.4 kernel: [162255.522746] netconsole: remote port 514
May 1 18:57:51 192.168.10.4 kernel: [162255.522784] netconsole: remote IP 192.168.10.7
May 1 18:57:51 192.168.10.4 kernel: [162255.522826] netconsole: remote ethernet address 00:0c:29:f3:92:97
May 1 18:57:51 192.168.10.4 kernel: [162255.522881] netconsole: local IP 192.168.10.4
May 1 18:57:51 192.168.10.4 kernel: [162255.523032] console [netcon0] enabled
May 1 18:57:51 192.168.10.4 kernel: [162255.523349] netconsole: network logging started</pre><br />
Данные приходят в самом простом текстовом виде и их можно читать самым простым способом:<br />
<pre>netcat -u -l 514</pre>Если у нас в наличии есть <tt>syslog-ng</tt> — можно использовать его следующим образом:<br />
<pre>source s_remote_udp {
network(transport("udp") ip(0.0.0.0) port(514));
};
filter f_remote_remhost {
netmask(192.168.10.4);
};
destination d_remote_remhost {
file("/var/log/remote/remhost.log");
};
log {
source(s_remote_udp);
filter(f_remote_remhost);
destination(d_remote_remhost);
};</pre><br />
Проверить, что всё работает можно следующим образом:<br />
<pre>echo '<7>Hello world!' > /dev/kmsg
dmesg -n 8</pre>Сообщение должно появиться в журнале и быть передано по сети на удаленный хост.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-89196476510471405872015-08-11T11:00:00.000+03:002015-08-11T11:00:06.832+03:00Удаленная отладка ядра Linux Ядро Linux периодически ломается, иногда это происходит на стадии загрузки. Одним из методов исследования проблемы является удаленная отладка с использованием последовательного порта.<br />
<br />
Опции конфигурации ядра должны быть такими:<br />
<pre>CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y</pre>Кроме того, драйвер последовательного порта должен быть включен в состояние <tt>Y</tt>.<br />
<br />
Далее нам понадобятся отладочные символы и исходные коды ядра, которые находятся в пакетах <tt>-debuginfo</tt> и <tt>-debugsource</tt>. Скорее всего, архитектуры удаленной и локальной системы не будут совпадать, так как особенно часто ядро Linux не работает на архитектуре armv7l, поэтому просто распакуем данные следующим образом:<br />
<pre>> rpm2cpio kernel-default-base-debuginfo-4.2.rc4-1.1.gaf243bc.armv7hl.rpm | cpio -id
> rpm2cpio kernel-default-debuginfo-4.2.rc4-1.1.gaf243bc.armv7hl.rpm | cpio -id
> rpm2cpio kernel-default-debugsource-4.2.rc4-1.1.gaf243bc.armv7hl.rpm | cpio -id</pre>В текущей директории будет создана поддиректория <tt>/usr</tt> содержащая отладочные символы и исходные коды в стандартной иерархии. Кроме того, нам понадобятся сами бинарные файлы ядра:<br />
<pre>> rpm2cpio kernel-default-base-4.2.rc4-1.1.gaf243bc.armv7hl.rpm | cpio -id
> rpm2cpio kernel-default-4.2.rc4-1.1.gaf243bc.armv7hl.rpm | cpio -id</pre><br />
Далее, следует подключить последовательный порт, и открыть удаленную консоль следующим, например, образом:<br />
<pre>> screen /dev/ttyUSB0 115200</pre>и начать загрузку целевого устройства. Для активации механизма <tt>kgdb</tt> потребуется добавить параметры командной строки ядра в загрузчике:<br />
<pre>U-Boot# setenv append "kgdboc=ttyO0,115200 kgdbwait"
U-Boot# boot</pre><br />
Если все пойдет правильно, то загрузка ядра остановится после примерно следующих строк:<br />
<pre>[ 3.753423] 44e09000.serial: ttyO0 at MMIO 0x44e09000 (irq = 154, base_baud = 3000000) is a OMAP UART0
[ 4.497783] console [ttyO0] enabled
[ 4.502387] STMicroelectronics ASC driver initialized
[ 4.507960] KGDB: Registered I/O driver kgdboc
[ 4.512673] KGDB: Waiting for connection from remote gdb...
Entering kdb (current=0xdb0b3480, pid 1) on processor 0 due to Keyboard Entry
[0]kdb> </pre>kdb ождает ввода команд, среди прочего доступна команда <tt>help</tt>, выводящая список базовых команд. На этом консоль можно закрыть: <tt>Ctrl-A :quit</tt> и открыть отладчик <tt>gdb</tt>.<br />
<br />
Для начала установим пути к отладочным символам и исходным кодам и загрузим объектный файл ядра целевой системы (внимание, сначала этот файл нужно будет распаковать командой <tt>gz</tt>).<br />
<pre>(gdb) set debug-file-directory /tmp/dbg/usr/lib/debug
(gdb) directory /tmp/dbg/usr/src/debug/kernel-default-4.2.rc4/linux-4.2-rc4/linux-obj
(gdb) file /tmp/dbg/boot/vmlinux-4.2.0-rc4-1.gaf243bc-default
Reading symbols from /tmp/dbg/boot/vmlinux-4.2.0-rc4-1.gaf243bc-default...Reading symbols from /tmp/dbg/usr/lib/debug/boot/vmlinux-4.2.0-rc4-1.gaf243bc-default.debug...done.
done.</pre>После этого нужно подключиться к целевой системе:<br />
<pre>(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
0xc031dc08 in arch_kgdb_breakpoint () at ../arch/arm/include/asm/outercache.h:142</pre><br />
Далее можно использовать отладчик как обычно. Через команду <tt>monitor</tt> доступны все команды из консоли kdb, среди них есть достаточно полезные, например <tt>dmesg</tt> или <tt>lsmod</tt>:<br />
<pre>(gdb) monitor lsmod
Module Size modstruct Used by
musb_am335x 1431 0xbf000278 1 (Loading) 0xbf000000 [ ]</pre>Обратите внимание, что команда <tt>lsmod</tt> любезно нам показывает адрес <tt>0xbf000000</tt>, куда в памяти загружен модуль <tt>musb_am335x</tt>. Этот адрес нужен чтобы отлаживать код из модуля:<br />
<pre>(gdb) add-symbol-file /tmp/dbg/lib/modules/4.2.0-rc4-1.gaf243bc-default/kernel/drivers/usb/musb/musb_am335x.ko 0xbf000000</pre>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-14087929317135210712015-05-11T12:32:00.001+03:002015-05-11T12:32:26.119+03:00Устойчивые имена сетевых интерфейсовРазработчики systemd продолжают вести нас в светлое будущее. В udev уже давно реализован механизм <a href="http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/">Predictable Network Interface Names</a>, который представляет из себя кусочек кода на C, заполняющий переменные <tt>ID_NET_NAME_*</tt> исходя из свойств расположения физического сетевого устройства.<br />
<br />
Считается, что подобный подход дает больше информации, чем прибитие гвоздями имен интерфейсов <tt>eth?</tt> к MAC-адресам в <tt>70-persistent-net.rules</tt>. Однако, не обходится без недостатков. Например, при запуске системы под гипервизором VMWare ESXi, единственный сетевой интерфейс у меня называется <tt>eno16777728</tt>. Устройства, определяемые в DTB для одноплатных компьютеров на базе ARM, не поддерживаются схемой именования и имеют обычные имена <tt>eth?</tt>. А при подключении USB устройств, типа мобильных телефонов или модемов, схема именования генерирует скорее неустойчивые имена, потому-что в имя входит расположение устройства на шине USB, которое изменится при следующем подключении, таким образом придется настраивать интерфейс заново, потому-что предыдущие сохраненные настройки будут относиться к интерфейсу с другим именем.<br />
<br />
К счастью, udev заполняет переменную <tt>ID_NET_NAME_MAC</tt>, представляющую имя интерфейса, основанное исключительно на его MAC-адресе. По-умолчанию, эта переменная не используется, но можно поменять стандартное поведение для USB-устройств. Один способ - через настройку udev, второй - используя <a href="http://www.freedesktop.org/software/systemd/man/systemd.link.html">systemd.link</a>, файл, используемый systemd, для конфигурации сетевых интерфейсов.<br />
<br />
Создадим файл <tt>/etc/systemd/network/90-usb.link</tt> следуя инструкции:<br />
<pre>[Match]
Path=*-usb-*
[Link]
NamePolicy=mac
</pre>Юнит-файл состоит из двух секций: <tt>[Match]</tt> для описания устройств к которым он относится и <tt>[Link]</tt> для описания того, что с ними делать. В примере выше мы просим systemd использовать политику именования основанную на MAC-адресах для всех устройств подключенных через USB. После выполнения <tt>systemctl daemon-reload</tt> можно подключить устройство и увидеть его интерфейс с именем <tt>enx112233445566</tt>. Достаточно длинное, но уникальное (в известных пределах) и не изменится при следующем подключении устройства.<br />
<br />
Кроме изменения имени через systemd.link можно настроить WOL, MTU, ограничить скорость на интерфейсе, назначить устройству другой MAC-адрес.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com4tag:blogger.com,1999:blog-3954136086375338541.post-86873068102820722512015-03-20T23:07:00.000+03:002015-03-20T23:07:00.064+03:00Изменение размера раздела Имеется диск с тремя разделами sda1 (/boot), sda2 (swap), sda3 (/). Необходимо увеличить размер раздела /boot за счет swap.<br />
<br />
Сначала отмонтируем все разделы и проверим файловую систему.<br />
<pre># swapoff /dev/sda2
# umount /dev/sda1
# e2fsck /dev/sda1
e2fsck 1.42.6 (21-Sep-2012)
/dev/sda1: clean, 49/14056 files, 47157/56196 blocks
</pre><br />
Используем <tt>parted</tt> для того, чтобы сначала уменьшить и передвинуть второй раздел, а затем расширить первый на освободившееся место. Так как второй раздел - swap, то его мы просто передвинем, не заботясь о содержимом. Иначе говоря, сначала мы совсем сломаем, а потом заново её разметим. <br />
<br />
<pre># parted /dev/sda
GNU Parted 2.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 120103200s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 112454s 112392s primary ext2 boot, type=83
2 112455s 1686824s 1574370s primary linux-swap(v1) type=82
3 1686825s 120101939s 118415115s primary reiserfs type=83</pre><br />
Для изменения раздела используется команда <tt>resize номер_раздела начало конец</tt><br />
<br />
<pre>(parted) resize 2 224973 1686824
WARNING: you are attempting to use parted to operate on (resize) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
(parted) print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 120103200s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 112454s 112392s primary ext2 boot, type=83
2 224973s 1686824s 1461852s primary linux-swap(v1) type=82
3 1686825s 120101939s 118415115s primary reiserfs type=83</pre><br />
К сожалению в этот момент оно само подмонтировало всё назад, поэтому нужно снова отмонтировать первый раздел. Раздел swap в данный момент уже должен быть работоспособен, потому-что mkswap на нем выполнился сам автоматически. К сожалению, я не нашел способа отключить всю эту самодеятельность.<br />
<br />
<pre># umount /dev/sda1
# e2fsck -p /dev/sda1
</pre><br />
Снова идем в <tt>parted</tt>:<br />
<br />
<pre># parted
GNU Parted 2.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 120103200s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 112454s 112392s primary ext2 boot, type=83
2 224973s 1686824s 1461852s primary linux-swap(v1) type=82
3 1686825s 120101939s 118415115s primary reiserfs type=83
(parted) resize 1 63 224972
WARNING: you are attempting to use parted to operate on (resize) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
(parted) quit
Warning: You should reinstall your boot loader before rebooting. Read section 4 of the Parted User documentation for more
information.
Information: You may need to update /etc/fstab. </pre><br />
Готово, <tt>parted</tt> не только изменил размер раздела, но еще и молча расширил для нас файловую систему, а теперь предупреждает о необходимости обновить загрузчик. Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-83083159221835122602014-12-30T16:16:00.000+03:002014-12-30T16:16:22.319+03:00snapper: настройка снимков подтомовПоказать список подтомов можно командой <tt>btrfs subvolume list /</tt>. Выберем какой-нибудь, например <tt>/var/lib/pgsql</tt>.<br />
Создадим новую конфигурацию (профиль) для этого подтома: <tt>snapper -c pgsql create-config /var/lib/pgsql</tt>, здесь <tt>pgsql</tt> произвольное имя:<br />
<pre># snapper list-configs
Config | Subvolume
-------+---------------
root | /
pgsql | /var/lib/pgsql
</pre><br />
Далее, все команды нужно выполнять с ключом <tt>-c pgsql</tt>, чтобы оперировать нужным профилем.<br />
<br />
<pre># snapper -c pgsql get-config
...
NUMBER_CLEANUP | yes
NUMBER_LIMIT | 50
NUMBER_LIMIT_IMPORTANT | 10
NUMBER_MIN_AGE | 1800
</pre><br />
Здесь <tt>NUMBER_CLEANUP</tt> разрешает удалять старые снимки если их число превышает <tt>NUMBER_LIMIT</tt> и одновременно возраст (в секундах) больше <tt>NUMBER_MIN_AGE</tt>.<br />
<br />
<pre>TIMELINE_CLEANUP | yes
TIMELINE_CREATE | yes
TIMELINE_LIMIT_DAILY | 10
TIMELINE_LIMIT_HOURLY | 10
TIMELINE_LIMIT_MONTHLY | 10
TIMELINE_LIMIT_YEARLY | 10
TIMELINE_MIN_AGE | 1800
</pre><br />
Здесь соответствующая настройка разрешает автоматическое создание снимков раз в час. Команда <tt>TIMELINE_CLEANUP</tt> удаляет старые снимки, используя следующие правила: удаляется снимок только если он старше <tt>TIMELINE_MIN_AGE</tt> секунд и одновременно после удаления останутся <tt>TIMELINE_LIMIT_*</tt> снимков с соответствующими интервалами.<br />
Таким образом, в вышеописанном стандартном случае всегда будут доступны снимки: 10 с интервалом в час с текущего момента, 10 с интервалом в один день с текущего момента, 10 с интервалом в один месяц и так далее.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-23898668487097204442014-08-19T12:56:00.001+04:002014-08-19T12:56:06.998+04:00OBS: локальная сборка под ARMКогда требуется локально пересобрать пакет под одну из архитектур ARM, например для тестирования сборки, можно воспользоваться следующим медленным подходом.<br />
<br />
<pre>osc build --clean --alternative-project openSUSE:Factory:ARM qemu armv7l name.spec</pre><br />
Здесь указывается, что используется альтернативный проект для сборки — <tt>openSUSE:Factory:ARM</tt> (версию подставить по желанию), используется репозиторий <tt>qemu</tt>, который есть в этом проекте. Поэтому и указывается этот альтернативный проект.<br />
<br />
Несмотря на то, что в данном примере указана архитектура armv7l, технически, это x86_64. В среду сборки будет установлен бинарный транслятор qemu, работающий через подсистему ядра binfmt. При инициализации ядро настраивается таким образом, что при виде сигнатуры ELF для архитектуры ARM вызывает бинарик как <tt>qemu-arm /usr/bin/...</tt>, подобно тому, как при виде символов "#!" в начале исполняемого файла вызывается указанный интерпретатор. Работает поэтому достаточно медленно.<br />
<br />
К сожалению, с пакетами kiwi такое не проходит.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-42893400048722303772014-01-02T15:19:00.000+04:002014-07-08T10:48:54.106+04:00openSUSE 13.1 на BeagleBone Black<a href="http://beagleboard.org/Products/BeagleBone+Black">BeagleBone Black</a> — одноплатный компьютер на основе процессора TI AM3358 (Cortex-A8), выпущенный весной прошлого года:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfEJdjXmxvpOeqO5aNgeYvkPzNihTXNFoZd6nFMwzEKNybDgrU1EaWYVXHoXTz_Ox6VlyP5_sBDrzdLtYGWw1EjZbvhWt3gvrYV1CfopQLEGk4Do0R3OEsXZsvgmgVgHjIcxlH6SVPGIT1/s1600/DSC00002.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfEJdjXmxvpOeqO5aNgeYvkPzNihTXNFoZd6nFMwzEKNybDgrU1EaWYVXHoXTz_Ox6VlyP5_sBDrzdLtYGWw1EjZbvhWt3gvrYV1CfopQLEGk4Do0R3OEsXZsvgmgVgHjIcxlH6SVPGIT1/s320/DSC00002.JPG" /></a></div><br />
На нем вполне успешно может загрузиться и даже работать openSUSE 13.1. Готовые образы для нанесения на microSD карточку находятся <a href="http://download.opensuse.org/repositories/devel:/ARM:/13.1:/Contrib:/Beaglebone/images/">здесь</a>. Эти же самые образы должны в теории работать и на <a href="http://beagleboard.org/Products/BeagleBone">BeagleBone</a>. Конечно, пока все на этапе интеграции и поиска ошибок, поэтому имеется подробная инструкция по запуску:<br />
<ol><li>Скачать, распаковать и сделать <tt>dd</tt> на карточку образ системы <tt>*.raw.xz</tt></li>
<li>Подключить отладочный TTL-RS232 порт (можно использовать, например, <a href="http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=141127391596">такой</a>, но важно помнить, что разработчики BeagleBone Black не поставили на свою плату преобразователь уровней и сигнал с отладочного RS232 идет в виде 3.3V. Подключение через обычный COM-порт на большом компьютере обречено на провал.), руководствуясь <a href="http://elinux.org/Beagleboard:BeagleBoneBlack#Hardware_Files">распиновкой</a>. Используя <tt>screen /dev/ttyUSB0 115200</tt>, во-первых, можно будет легко видеть все этапы начиная от работы u-boot. Во-вторых, запустится Yast2 firstboot и попросит вас задать root пароль, завести пользователя, установить временную зону и системное время (аналогично тому, как это происходит на соответствующем этапе установки с DVD), а для этого потребуется интерактивное взаимодействие.</li>
<li>Помните, что для загрузки с внешней карты памяти при подаче питания на устройство нужно удерживать кнопку S2 (она же boot select switch). Подсказка — загрузившись с SD карты можно подмонтировать раздел встроенной MMC памяти и переименовать или удалить файл загрузчика <tt>MLO</tt>, после этого загрузка будет всегда начинаться с SD, но загрузиться с MMC больше не получится.</li>
</ol><br />
Технические подробности (тем, кто хочет продолжить ковыряния) изложены в списке рассылки: <a href="http://lists.opensuse.org/opensuse-arm/2014-01/msg00001.html">http://lists.opensuse.org/opensuse-arm/2014-01/msg00001.html</a>.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-5933763899101499892013-12-14T11:51:00.001+04:002014-01-27T19:53:56.440+04:00Atmel ATSAMD20-XPRO<br />
<a href="http://www.atmel.com/tools/atsamd20-xpro.aspx">ATSAMD20-XPRO</a> оценочный набор для новой серии микроконтроллеров Atmel ATSAMD20 на ядре Cortex-M0+. Выглядит следующим образом:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-lC648_sJxW0/Uqsy6JRwXtI/AAAAAAAACHg/IZ90Ub_-lRs/s1600/DSC00001.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-lC648_sJxW0/Uqsy6JRwXtI/AAAAAAAACHg/IZ90Ub_-lRs/s320/DSC00001.JPG" /></a></div>Купить в России можно например тут: <a href="http://www.deltel.ru/">Дельта Электроника</a>.<br />
<br />
Этот пост о том как подключать эту плату в GNU/Linux. Плата снабжена интерфейсом micro-USB для отладки, реализуемым через отдельную микросхему. Atmel называет это «Embedded Debugger», анонсируется наличие виртуального последовательного интерфейса (прикрученного к основному чипу) и собственно средств отладки и программирования.<br />
<br />
При подключении появляется устройство:<br />
<pre>Bus 001 Device 010: ID 03eb:2111 Atmel Corp.</pre><br />
<pre>[13761.329235] usb 1-1.5: New USB device found, idVendor=03eb, idProduct=2111
[13761.329240] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[13761.329242] usb 1-1.5: Product: EDBG CMSIS-DAP
[13761.329245] usb 1-1.5: Manufacturer: Atmel Corp.
[13761.329247] usb 1-1.5: SerialNumber: ATML1873040200000110
[13761.330868] hid-generic 0003:03EB:2111.000A: hiddev0,hidraw3: USB HID v1.11 Device [Atmel Corp. EDBG CMSIS-DAP] on usb-0000:00:1a.0-1.5/input0
[13761.330964] cdc_acm 1-1.5:1.1: ttyACM0: USB ACM device</pre><br />
Устройство, как видно, отдает нам виртуальный последовательный интерфейс на <tt>/dev/ttyACM?</tt> и интерфейс <a href="http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php">CMSIS-DAP</a> на <tt>/dev/hid*</tt>.<br />
<br />
В <a href="http://openocd.sourceforge.net/">openocd</a> недавно добавили поддержку этого интерфейса. Пока пакеты openocd с поддержкой CMSIS-DAP доступны здесь:<br />
<iframe src="http://software.opensuse.org/download/package.iframe?project=home%3amatwey%3aatsamd20_xpro&package=openocd"></iframe><br />
В пакетах есть небольшой баг, связанный с тем, что udev стремится поставить на <tt>/dev/hidraw*</tt> группу владельца plugdev, которая по-умолчанию в системе не существует и в пакете не создается. openocd будет искать свой devel-project и потом попадет в Factory.<br />
<br />
Запускаем и убеждается, что таки оно работает:<br />
<pre>> openocd -f /usr/share/openocd/scripts/board/atmel_samd20_xplained_pro.cfg
Open On-Chip Debugger 0.8.0-dev-snapshot (2013-12-13-18:45)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'cmsis-dap'
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
adapter speed: 500 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
Info : CMSIS-DAP: FW Version = 01.0F.00DB
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1
Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)
Info : CMSIS-DAP: Interface ready
Info : clock speed 500 kHz
Info : IDCODE 0x0bc11477
Info : at91samd20j18.cpu: hardware has 4 breakpoints, 2 watchpoints
</pre><br />
<ul><li><a href="http://openocd.sourceforge.net/doc/html/index.html">Инструкция к openocd</a></li>
</ul>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-64170090577795641842013-07-08T16:55:00.000+04:002013-07-08T16:55:43.377+04:00Xen: проброс USB устройствXen умеет пробрасывать USB-устройства (по отдельности) в гостевые непривилегированные домены. Для этого используется механизм, называемый PVUSB (подозреваю, что сокращение от Para-Virtualized USB), концептуально состояний из модулей <tt>usbbk</tt> (Xen USB backend driver) и <tt>xen_hcd</tt> (Xen USB Virtual Host Controller driver). Соответственно, первый модуль съедает устройство в dom0, делая его недоступным для других драйверов, а все URB отправляет через гипервизор в нужный выбранный домен, где их получает перавиртуальный контроллер. Утверждается, что потеря производительности минимальна.<br />
<br />
Вся конструкция управляется несколькими командами. Посмотреть, какие устройства доступны: <pre># xm usb-list-assignable-devices
4-2 : ID 067b:2303 Prolific Technology Inc. USB-Serial Controller</pre>Создать в домене паравиртуальный USB хост контроллер: <tt>xm usb-hc-create Domain UsbVer PortNum</tt>, где параметры — название домена, версия USB (поддерживаются 1 и 2) и количество USB-портов. После этого, в гостевом домене с помощью lsusb видно появившийся контроллер. Для удаления есть обратная команда <tt>xm usb-hc-destroy</tt><br />
<br />
Для присваивания устройства есть команда <tt>xm usb-attach Domain HostNum PortNum Device</tt>, где параметры — название домена, номер хост контроллера (их можно хоть пачку создать), номер порта на виртуальном контроллере, первая колонка выдачи <tt>usb-list-assignable-devices</tt>. Обратная команда — <tt>xm usb-destroy</tt>. При этом, в dom0 устройство пропадет на глазах у изумленного драйвера:<pre>[12129.803899] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0
[12129.803938] pl2303 4-2:1.0: device disconnected</pre>но появится в гостевом домене: <pre># lsusb
Bus 001 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub</pre><br />
Важное замечание. Если в гостевом домене ничего не появилось, кроме записей в dmesg: <pre>[12332.892117] usb 1-1: new full-speed USB device number 70 using vusb
[12332.892126] usb 1-1: parent hub has no TT</pre>то скорее всего, устройство не поддерживает USB 2.0, к которому его прицепили, нужно сделать другой контроллер с правильным параметром <tt>UsbVer</tt>.<br />
<br />
Кроме того, устройство можно прибить гвоздями в конфигурационном файле домена: <pre>vusb=['usbver=1, numports=4, port_1=4-2']</pre>Список литературы:<br />
<ul><li><a href="http://doc.opensuse.org/products/draft/SLES/SLES-xen_sd_draft/cha.xen.config.html#sec.xen.config.pvusb">Assigning USB Devices with PVUSB</a></li>
<li><a href="http://www.xen.org/files/xensummit_intel09/PVUSBStatusUpdate.pdf">Status Update of PVUSB</a></li>
</ul>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-35080817261145440482013-07-05T12:24:00.001+04:002013-07-05T12:24:22.101+04:00ElixirБольше маргинальных языков в openSUSE. <a href="http://elixir-lang.org/">Elixir</a> — основываясь на Erlang, является еще более маргинальным языком.<br />
<br />
Брать здесь — <a href="http://software.opensuse.org/package/elixir">http://software.opensuse.org/package/elixir</a>.<br />
Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-62218581387570023292013-06-17T20:31:00.001+04:002013-06-17T20:31:43.673+04:00Настройка сети в XenСеть в Xen работает по принципу виртуального моста, как рассказывается здесь: <a href="http://wiki.xen.org/wiki/Xen_Networking">http://wiki.xen.org/wiki/Xen_Networking</a>.<br />
<br />
Сначала, надо сделать этот самый мост. В <tt>/etc/sysconfig/network/ifcfg-br0</tt> надо написать буквально следующее:<br />
<pre>BOOTPROTO='dhcp4'
# как для простого интерфейса, можно и статический адрес задать
BRIDGE='yes'
BRIDGE_FORWARDDELAY='0'
BRIDGE_PORTS='eth0 eth1'
BRIDGE_STP='on'
# если два активных физических интерфейса в мост собраны,
# то пакеты могут и по кругу пойти без Spanning Tree Protocol.
STARTMODE='auto'
</pre><tt>ifcfg-eth0</tt> и <tt>ifcfg-eth1</tt> лучше просто удалить, чтобы не мешались.<br />
<br />
Теперь у нас есть самый настоящий мост, который можно вписывать в параметры конфигураций доменов: <a href="http://xenbits.xen.org/docs/4.2-testing/misc/xl-network-configuration.html">http://xenbits.xen.org/docs/4.2-testing/misc/xl-network-configuration.html</a>.<br />
<br />
Дальше запускаем домены, и проверяем, что появились их бэкендные интерфейсы:<br />
<pre># brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.52540035c714 yes eth0
eth1
<b>vif1.0</b></pre><br />
Дальше настраиваем внутренний интерфейс домена, как это происходит обычно.<br />
Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com1tag:blogger.com,1999:blog-3954136086375338541.post-182115440750957442013-04-13T15:59:00.002+04:002013-04-28T15:09:57.266+04:00Диагностика ядра LinuxСбои в ядре Linux приводят к возникновению чрезвычайно разнообразных симптомов. <a href="http://en.opensuse.org/openSUSE:Bugreport_kernel">Некоторые авторы</a> дают следующую неполную классификацию проблем, с которыми может столкнуться пользователь:<br />
<ul><li>kernel oops — проблема при выполнении кода в ядре, например кто-нибудь попытался разыменовать нулевой указатель. С кем из программистов на C такого не случалось?</li>
<li>kernel panic — кто-то попытался разыменовать нулевой указатель в обработчике прерываний. После чего ядро уходит в полную несознанку и начинает мигать caps-lock-ом.</li>
<li>soft lockup — что-то заблокировалось (вероятно наткнувшись на не освобожденную блокировку), несмотря на это прерывания продолжают обрабатываться. Хорошее упражнение — попинговать машину или попытаться зажечь numlock.</li>
<li>hard lockup — компьютер жужжит вентиляторами и ни на что не реагирует. Провести какую-то диагностику в этом случае особенно сложно. Проблема может быть вызвана как вышедшим из строя железом, так и неаккуратной обработкой прерываний.</li>
</ul>кроме того, можно добавить:<br />
<ul><li>hung — индуцированное неправильной блокировкой последовательное попадание всех или большинства процессов системы в состояние TASK_UNINTERRUPTIBLE (известного так-же как D-состояние, по обозначению в <tt>top</tt> или <tt>ps</tt>). Согласно книге Р.Лава такой «наводящий ужас» процесс нельзя убить, завершить, и вообще что-то с ним сделать. При этом с точки зрения пространства пользователя программа просто заблокирована на каком-то системном вызове (например ввода-вывода). При попадании в подобное состояние всех критических процессов системы можно получить симптом похожий на soft lockup.</li>
</ul>Получить как можно более подробную информацию о сути возникающей проблемы важно как для правильного написания сообщения об ошибке, так и для временного переконфигурирования системы с целью избегания выполнения проблемного кода и повышения её живучести. <br />
<br />
К счастью, ядро обладает неким набором средств первичной самодиагностики, пригодным для постановки примерного диагноза. Согласно, видимо всеобщей, философской парадигме, наиболее устойчивыми и надежными являются наиболее простые подсистемы, поэтому сообщения ядра имеет смысл искать в текстовой и последовательной консолях. Конечно, при достаточном уровне везения нужное сообщение будет сброшено syslog-демону, записано на диск, отправлено по сети на удаленный syslog-демон и прочее, но при недостаточном везении монитор (и фотоаппарат на телефоне), клавиатура и COM-порт являются последней надеждой.<br />
<br />
<h2>printk</h2><br />
Одним из механизмов общения ядра с внешним миром является printk. При неправильной настройке сообщение скорее всего будет просто потеряно как не обладающее значимостью. Для настройки используется <tt>/proc/sys/kernel/printk</tt>, соответствующий ему параметр sysctl, утилита <tt>klogconsole</tt>, SysRq-клавиша и т.п. Ядро обладает восемью уровнями важности сообщений, поэтому установка уровня в 8 заведомо напечатает все на консоль.<br />
<br />
<h2>sysrq</h2><br />
Магическая кнопка включается в <tt>/proc/sys/kernel/sysrq</tt> или соответствующим ему параметром sysctl. Предлагается просто записать туда 1, несмотря на то, что новые ядра позволяют изысканный контроль над функционалом. В данной ситуации незачем себя ограничивать, хотя для нормальной работы разумно ограничить функционал на случай случайных нажатий. Если осталась рабочая терминальная сессия (например удаленная сессия по ssh), можно использовать как альтернативу, например, <tt>echo b > /proc/sysrq-trigger</tt>; с последовательной консоли поведение активируется кнопкой 'break'.<br />
<br />
Важно помнить, что SysRq-w, например, выдает сообщение с уровнем <tt>KERN_INFO</tt>, то есть выдача printk должна быть настроена правильно, чтобы можно было что-то увидеть. <a href="https://www.kernel.org/doc/Documentation/sysrq.txt">Полный список команд SysRq</a>.<br />
<br />
<h2>softlockup_panic</h2><br />
Параметр ядра <tt>softlockup_panic</tt> или параметр <tt>kernel.softlockup_panic</tt> для sysctl включают панику ядра при обнаружении soft lockup. <a href="http://lhwdb.org/doc/lockup-watchdogs.txt">Описание внутреннего устройства</a>. Включение паники позволит остановить выполнение системы и проанализировать выдачу, снабженную трассировкой, хотя контроль блокировки исполняется постоянно. Существует аналогичный механизм отслеживания hard lockup для многопроцессорных систем (если остались живые процессоры — есть шанс что сработает), с соответствующим параметром <tt>hardlockup_panic</tt>. Время срабатывания обычно в пределах одной минуты.<br />
<br />
<h2>hung_task_timeout_sec</h2><br />
Механизм отслеживания процессов, надолго застрявших в состоянии TASK_UNINTERRUPTIBLE, параметры настраиваются через sysctl и <tt>/proc</tt>:<br />
<ul><li>kernel.hung_task_panic — включает/отключает панику при обнаружении не прерываемого процесса;</li>
<li>kernel.hung_task_warnings — счетчик сообщений. Иными словами, если паника отключена, будет сообщено о таком количестве зависших процессов;</li>
<li>kernel.hung_task_timeout_secs — сколько секунд процесс должен непрерывно пробыть в TASK_UNINTERRUPTIBLE, чтобы вызвать сообщение. По умолчанию бывает либо выключено (0), либо очень большое число порядка 10 минут.</li>
</ul>Сообщения снабжаются трассировкой, которая подсказывает в какой подсистеме происходит сбой.<br />
<br />
Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-52631648074430187812013-02-24T15:35:00.001+04:002013-02-24T15:35:50.815+04:00svn+ssh: коллективные соединенияПри командах выполняемых на удаленном URL, типа <tt>copy</tt> или <tt>merge</tt>, subversion иногда требует несколько соединений. Для облегчения работы, можно применить стандартную возможность ssh — использовать одно TCP/IP соединение для нескольких сессий. <br />
<br />
Чтобы не испортить настройки клиентского ssh, в секции <tt>[tunnels]</tt> файла конфигурации <tt>~/.subversion/config</tt> зададим нужные настройки как параметры командной строки:<br />
<pre>ssh = $SVN_SSH ssh -o "ControlMaster=auto" -o "ControlPath=/home/user/.ssh/svn_ssh-%r@%h:%p" -o "ControlPersist=60"</pre><br />
При этом соединение будет создаваться каждый раз при необходимости, и закрываться через 60 секунд после того, как оно становится невостребованным. <tt>ControlPersist=yes</tt> оставит соединение навсегда, что, вероятно, не очень безопасно, но зато позволяет комфортно исполнять разные команды, типа <tt>commit</tt> или <tt>update</tt> в течении работы, если расходы на создание соединения велики.Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-33297116629108221592013-02-17T11:51:00.000+04:002013-02-17T11:51:13.675+04:00quilt и rpm<tt>quilt</tt> — это система контроля патчей, в каком-то смысле предыдущая ступень эволюции систем контроля версий. <br />
<br />
Пусть есть rpm-пакет и нужно обновить его версию, используя новый архив исходных кодов. При этом патчи останутся старыми, и не гарантируется, что они наложатся на новую версию, или не потребуется вмешательство человека, из-за того, что какой-то патч устарел. После того, как новый архив получен и <tt>Version:</tt> исправлен, можно прибегнуть к помощи <tt>quilt</tt>:<br />
<pre>quilt setup libdc1394.spec</pre><br />
Эта команда создаст новую директорию в которой будут лежать распакованные исходные коды, символическая ссылка на директорию <tt>patches</tt> (хранит сами файлы патчей) и файл <tt>series</tt> (хранит порядок в котором патчи нужно применять). <tt>quilt</tt> не всегда успешно справляется с патчами, которые завернуты в <tt>%if</tt>.<br />
<br />
Идеологически происходит следующее, у нас есть команда <tt>quilt</tt>, что-то вроде аналога <tt>git</tt> или <tt>hg</tt>, дерево исходников и стек патчей. Стек патчей в чем-то аналогичен ревизиям в системах контроля версий. Используя стек можно переходить от текущего состояния к следующему (применяя патч, <tt>quilt push</tt>) или к предыдущему (откатывая, <tt>quilt pop</tt>). Первоначально, мы находимся в самом нижнем состоянии (не модифицированные исходные коды):<br />
<pre>>quilt top
Нет применённых патчей
>quilt applied
Нет применённых патчей
>quilt unapplied
patches/libdc1394.no-x11.patch
patches/libdc1394.ac.patch
patches/libdc1394-swab_fix.patch
patches/libdc1394.raw1394_set_iso_handler.patch
patches/libdc1394-v4l-2.6.38.patch
patches/libdc1394-visibility.patch
</pre><br />
Дальше попробуем наложить первый патч (здесь потребовалась предварительная обработка из-за хитрой структуры директорий в конкретном случае),<br />
<pre>>quilt push
Наложение патча patches/libdc1394.no-x11.patch
patching file libdc1394-1.2.2/examples/Makefile.am
patching file libdc1394-2.2.1/configure.in
Текущий патч: patches/libdc1394.no-x11.patch
>quilt top
patches/libdc1394.no-x11.patch
>quilt applied
patches/libdc1394.no-x11.patch</pre><br />
И так далее, пока не закончится весь стек патчей, но скорее всего так просто он не закончится. Задача — обновляя патчи, устранить конфликты. После принудительного применения (<tt>quilt push -f</tt>) следует вручную просмотреть все конфликтные места и исправить их нужным образом. Каждый патч отслеживает только некоторое число файлов (<tt>quilt files</tt>), но если отредактирован файл не из списка, то его нужно добавить (<tt>quilt add</tt>). После того как все исправлено, нужно обновить текущий патч: <tt>quilt refresh</tt> (это такой аналог commit, который исправляет текущий наложенный патч, основываясь на рабочей директории и предыдущей спрятанной копии)<br />
<pre>>quilt refresh
Патч patches/libdc1394-v4l-2.6.38.patch обновлён</pre><ul><li><a href="http://pwet.fr/man/linux/commandes/quilt">man quilt</a></li>
</ul><br />
<br />
<br />
Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-50429172346295361192013-01-22T17:33:00.000+04:002013-01-22T17:33:43.950+04:00udev и camsource(Пере)запускалка <tt>camsource</tt> (программы для показывания картинок с веб-камер) с помощью udev:<br />
<br />
<pre>SUBSYSTEM=="video4linux", ACTION=="add", RUN+="/usr/bin/camsource -r /etc/camsource.conf"</pre><br />
Запускается на старте (когда udev обнаруживается usb-устройства), и перезапускается при их перетыкании (или перетыкивании).<br />
<br />
Можно было бы сделать более красиво, т.е. использовать события "add" и "remove" и переменную DEVICE. Однако этому мешает, во-первых, использование нескольких источников в моей конфигурации (и camsource -k выключил бы сразу все), во-вторых какой-то встроенный глюк в самой программе. Дело в том, что запускаясь, процесс почему-то уходит в состояние зомби, и в /proc/NNNNN/fd оказывается пустота. А при использовании параметра [device] код ищет процесс именно по файловым дескрипторам. Иначе говоря, этот параметр вообще не работает.<br />
<br />
Применив фантазию к udev, можно например включать <a href="http://0x2207.blogspot.ru/2012/08/blog-post.html">трансляцию видео-потока</a>. Что даже удобнее, чем вписывание не комплектуемых init.d-скриптам запуска <tt>camsource</tt>, <tt>ffserver</tt> и т.п. во всякие странные места типа <tt>/etc/init.d/boot.local</tt>.<br />
Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-48689412442294418492013-01-19T15:55:00.000+04:002013-01-19T15:55:46.646+04:00OBS tar_scm: versionformatСервис для OBS под названием tar_scm позволяет автоматически создавать архивы из указанных репозиториев систем контроля версий исходных кодов. Естественно, имеет много параметров, описание которых не так просто найти. На головном web-интерфейсе взаимодействие с сервисами куда-то с недавних пор вообще пропало, там хоть какие-то подсказки содержались.<br />
<br />
<tt>versionformat</tt> — один из самых любопытных параметров, позволяющих хоть как-то оформить название архива, для последующего действия сервиса <tt>set_version</tt>.<br />
<br />
<ul><li>Для git в это поле можно указать:<br />
<ul><li><tt>@PARENT_TAG@</tt> — bash любезно заменит на ближайший тег</li>
<li>поля из <tt>--pretty=format</tt> для последнего по времени коммита — полный список внизу, какой-то смысл в данной ситуации имеют <tt>%ct %cd %h</tt> (UNIX таймштамп, дата YYYYMMDD, короткий хэш коммита), причем дефисы будут любезно удалены по дороге sed'ом (даты будут получается в духе 20121221).</li>
</ul></li>
<li>Для mercurial (hg):<br />
<ul><li>поля из <tt>--template</tt> для последнего по времени коммита — полный список внизу. Огромное богатство для фантазии, есть встроенная опция для <tt>latesttag</tt>. Во время написания этого текста, не было способа выдать дату в виде YYYYMMDD, без дефисов. Сейчас <a href="https://github.com/openSUSE/obs-service-tar_scm/commit/daf1e1456e7d6269c3d45c3aea3ccc200f79686f">все дефисы удаляются</a> sed'ом, однако последняя версия tar_scm может быть еще не загружена на головной сервис.</li>
</ul></li>
<li>svn понимает только <tt>%r</tt> — номер ревизии</li>
</ul><br />
<ol><li><a href="https://github.com/openSUSE/obs-service-tar_scm">github: obs-service-tar_scm</a></li>
<li><a href="http://www.kernel.org/pub/software/scm/git/docs/git-show.html">git show(1)</a></li>
<li><a href="http://www.selenic.com/mercurial/hg.1.html#templates">hg templates</a></li>
</ol>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com8tag:blogger.com,1999:blog-3954136086375338541.post-28865851620216110382012-12-16T14:52:00.000+04:002012-12-16T14:52:56.518+04:00pwdutils RIPШироко анонсированный конец света начал потихоньку наступать. Спустя пару месяцев с момента написания моего предыдущего поста <a href="/2012/10/shadow-utils-vs-pwdutils.html">shadow-utils vs. pwdutils</a>, основной разработчик pwdutils Торсен Кукук (Thorsten Kukuk) взял и «тихо и незаметно» выпилил pwdutils из следующего релиза openSUSE 12.3 в пользу <a href="http://pkg-shadow.alioth.debian.org/">shadow</a> (Вероятно восклицая в этот момент «Стой и не шевелись! Я тебя породил, я тебя и убью!»).<br />
<br />
Репортаж с места события:<br />
<ul><li><a href="https://features.opensuse.org/314473">https://features.opensuse.org/314473</a></li>
<li><a href="https://build.opensuse.org/package/view_file?expand=1&file=README.changes-pwdutils&package=shadow&project=Base%3ASystem">README.changes-pwdutils</a> (самый полный список различий смотрите <a href="/2012/10/shadow-utils-vs-pwdutils.html">тут</a>)</li>
<li><a href="http://lists.opensuse.org/archive/opensuse-packaging/2012-11/msg00096.html">http://lists.opensuse.org/archive/opensuse-packaging/2012-11/msg00096.html</a> — первые поломки не заставили себя долго ждать</li>
</ul><br />
Возрадуемся же необходимости оборачивать свои spec-файлы очередными несвежими условными операторами, впрочем я уже давно и так это делаю:<br />
<pre>%if 0%{?fedora} || 0%{?rhel_version} || 0%{?centos_version}
%define usermod_A /usr/sbin/usermod -a -G
%else
%define usermod_A /usr/sbin/usermod -A
%endif</pre><br />
p.s. Неужели <tt>pam_unix2.so</tt> будет следующей жертвой унификации?<br />
Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-46217496031123370612012-10-20T13:27:00.000+04:002013-04-13T09:30:32.681+04:00OBS submit request topThere was a <a href="http://lists.opensuse.org/opensuse-buildservice/2012-10/msg00036.html">discussion</a> on submit requests. Adrian Schröter and Jos Poortvliet suggested to use OBS api to generate some kind of reports on pending times. Here is a test (I will publish this python script on github or something like that). I've filtered out all "home:" projects and built following table. To my surprise, there are only a little stalled requests.<br />
<style>
.more_year {background-color: #330000;}
.more_month {background-color: #660000;}
.more_weak {background-color: #666633;}
</style><br />
<br />
<div class="generated_at">Generated at: 2013-04-13 05:27:41.044818</div><table class="requests"><tr><th>Request</th><th>Pending time</th><th>Project</th><th>Package</th></tr><tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/1317">1317</a></td>
<td>1680 days</td><td><a href="https://build.opensuse.org/project/show?project=system%3Amanagement">system:management</a></td><td><a href="https://build.opensuse.org/package/show?project=system%3Amanagement&package=puppet">puppet</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/25359">25359</a></td>
<td>1227 days</td><td><a href="https://build.opensuse.org/project/show?project=YaST%3AWeb%3ASTABLE">YaST:Web:STABLE</a></td><td><a href="https://build.opensuse.org/package/show?project=YaST%3AWeb%3ASTABLE&package=webyast-vendor_en">webyast-vendor_en</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/31953">31953</a></td>
<td>1158 days</td><td><a href="https://build.opensuse.org/project/show?project=Moblin%3AFactory">Moblin:Factory</a></td><td><a href="https://build.opensuse.org/package/show?project=Moblin%3AFactory&package=gnome-session">gnome-session</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/33643">33643</a></td>
<td>1138 days</td><td><a href="https://build.opensuse.org/project/show?project=Moblin%3AFactory">Moblin:Factory</a></td><td><a href="https://build.opensuse.org/package/show?project=Moblin%3AFactory&package=gnome-settings-daemon">gnome-settings-daemon</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/33644">33644</a></td>
<td>1138 days</td><td><a href="https://build.opensuse.org/project/show?project=Moblin%3AFactory">Moblin:Factory</a></td><td><a href="https://build.opensuse.org/package/show?project=Moblin%3AFactory&package=dalston">dalston</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/33868">33868</a></td>
<td>1136 days</td><td><a href="https://build.opensuse.org/project/show?project=Moblin%3AFactory">Moblin:Factory</a></td><td><a href="https://build.opensuse.org/package/show?project=Moblin%3AFactory&package=icon-theme-dmz-cursors">icon-theme-dmz-cursors</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/38905">38905</a></td>
<td>1081 days</td><td><a href="https://build.opensuse.org/project/show?project=Moblin%3A2.0">Moblin:2.0</a></td><td><a href="https://build.opensuse.org/package/show?project=Moblin%3A2.0&package=dalston">dalston</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/55428">55428</a></td>
<td>855 days</td><td><a href="https://build.opensuse.org/project/show?project=security%3ACASA">security:CASA</a></td><td><a href="https://build.opensuse.org/package/show?project=security%3ACASA&package=CASA-kwallet">CASA-kwallet</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/55429">55429</a></td>
<td>855 days</td><td><a href="https://build.opensuse.org/project/show?project=security%3ACASA">security:CASA</a></td><td><a href="https://build.opensuse.org/package/show?project=security%3ACASA&package=CASA_auth_token_client">CASA_auth_token_client</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/55431">55431</a></td>
<td>855 days</td><td><a href="https://build.opensuse.org/project/show?project=security%3ACASA">security:CASA</a></td><td><a href="https://build.opensuse.org/package/show?project=security%3ACASA&package=CASA_auth_token_server">CASA_auth_token_server</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/69864">69864</a></td>
<td>705 days</td><td><a href="https://build.opensuse.org/project/show?project=system%3Awicd">system:wicd</a></td><td><a href="https://build.opensuse.org/package/show?project=system%3Awicd&package=wicd">wicd</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/72401">72401</a></td>
<td>681 days</td><td><a href="https://build.opensuse.org/project/show?project=isv%3Adell%3Acommunity">isv:dell:community</a></td><td><a href="https://build.opensuse.org/package/show?project=isv%3Adell%3Acommunity&package=python-ctypes-rhel">python-ctypes-rhel</a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/74258">74258</a></td>
<td>661 days</td><td><a href="https://build.opensuse.org/project/show?project=net-snmp">net-snmp</a></td><td><a href="https://build.opensuse.org/package/show?project=net-snmp&package="></a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/74259">74259</a></td>
<td>661 days</td><td><a href="https://build.opensuse.org/project/show?project=net-snmp">net-snmp</a></td><td><a href="https://build.opensuse.org/package/show?project=net-snmp&package="></a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/74260">74260</a></td>
<td>661 days</td><td><a href="https://build.opensuse.org/project/show?project=net-snmp">net-snmp</a></td><td><a href="https://build.opensuse.org/package/show?project=net-snmp&package="></a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/75895">75895</a></td>
<td>644 days</td><td><a href="https://build.opensuse.org/project/show?project=network%3Aifolder%3Aserver_stable">network:ifolder:server_stable</a></td><td><a href="https://build.opensuse.org/package/show?project=network%3Aifolder%3Aserver_stable&package="></a></td></tr>
<tr class="request, more_year">
<td><a href="https://build.opensuse.org/request/show/110363">110363</a></td>
<td>387 days</td><td><a href="https://build.opensuse.org/project/show?project=Maemo%3AMer%3AExtras%3AImport">Maemo:Mer:Extras:Import</a></td><td><a href="https://build.opensuse.org/package/show?project=Maemo%3AMer%3AExtras%3AImport&package=opengfx">opengfx</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/123245">123245</a></td>
<td>315 days</td><td><a href="https://build.opensuse.org/project/show?project=isv%3Amicrosoft">isv:microsoft</a></td><td><a href="https://build.opensuse.org/package/show?project=isv%3Amicrosoft&package=RHEL6">RHEL6</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/131196">131196</a></td>
<td>236 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3A11.0%3AUpdate%3ATest">openSUSE:11.0:Update:Test</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3A11.0%3AUpdate%3ATest&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/134952">134952</a></td>
<td>206 days</td><td><a href="https://build.opensuse.org/project/show?project=Banshee%3ALegacy">Banshee:Legacy</a></td><td><a href="https://build.opensuse.org/package/show?project=Banshee%3ALegacy&package=ipod-sharp">ipod-sharp</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/134958">134958</a></td>
<td>206 days</td><td><a href="https://build.opensuse.org/project/show?project=Banshee%3ALegacy">Banshee:Legacy</a></td><td><a href="https://build.opensuse.org/package/show?project=Banshee%3ALegacy&package=podsleuth">podsleuth</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/134959">134959</a></td>
<td>206 days</td><td><a href="https://build.opensuse.org/project/show?project=Banshee%3ALegacy">Banshee:Legacy</a></td><td><a href="https://build.opensuse.org/package/show?project=Banshee%3ALegacy&package=ndesk-dbus-glib">ndesk-dbus-glib</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/134960">134960</a></td>
<td>206 days</td><td><a href="https://build.opensuse.org/project/show?project=Banshee%3ALegacy">Banshee:Legacy</a></td><td><a href="https://build.opensuse.org/package/show?project=Banshee%3ALegacy&package=ndesk-dbus">ndesk-dbus</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/136458">136458</a></td>
<td>195 days</td><td><a href="https://build.opensuse.org/project/show?project=GNOME%3AEvolution%3Amapi">GNOME:Evolution:mapi</a></td><td><a href="https://build.opensuse.org/package/show?project=GNOME%3AEvolution%3Amapi&package=evolution-mapi">evolution-mapi</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/137714">137714</a></td>
<td>184 days</td><td><a href="https://build.opensuse.org/project/show?project=Maemo%3AMer%3AExtras%3AImport">Maemo:Mer:Extras:Import</a></td><td><a href="https://build.opensuse.org/package/show?project=Maemo%3AMer%3AExtras%3AImport&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/138490">138490</a></td>
<td>177 days</td><td><a href="https://build.opensuse.org/project/show?project=devel%3Alanguages%3Alua">devel:languages:lua</a></td><td><a href="https://build.opensuse.org/package/show?project=devel%3Alanguages%3Alua&package=luaexpat">luaexpat</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145153">145153</a></td>
<td>121 days</td><td><a href="https://build.opensuse.org/project/show?project=games%3AWorldForge">games:WorldForge</a></td><td><a href="https://build.opensuse.org/package/show?project=games%3AWorldForge&package=wfmath">wfmath</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145154">145154</a></td>
<td>121 days</td><td><a href="https://build.opensuse.org/project/show?project=games%3AWorldForge">games:WorldForge</a></td><td><a href="https://build.opensuse.org/package/show?project=games%3AWorldForge&package=skstream">skstream</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145155">145155</a></td>
<td>121 days</td><td><a href="https://build.opensuse.org/project/show?project=games%3AWorldForge">games:WorldForge</a></td><td><a href="https://build.opensuse.org/package/show?project=games%3AWorldForge&package=libwfut">libwfut</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145156">145156</a></td>
<td>121 days</td><td><a href="https://build.opensuse.org/project/show?project=games%3AWorldForge">games:WorldForge</a></td><td><a href="https://build.opensuse.org/package/show?project=games%3AWorldForge&package=libdevil">libdevil</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145162">145162</a></td>
<td>119 days</td><td><a href="https://build.opensuse.org/project/show?project=devel%3Alanguages%3Alua">devel:languages:lua</a></td><td><a href="https://build.opensuse.org/package/show?project=devel%3Alanguages%3Alua&package=tolua%2B%2B">tolua++</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145501">145501</a></td>
<td>119 days</td><td><a href="https://build.opensuse.org/project/show?project=Novell%3ANTS">Novell:NTS</a></td><td><a href="https://build.opensuse.org/package/show?project=Novell%3ANTS&package=supportutils-plugin-susecloud">supportutils-plugin-susecloud</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/145520">145520</a></td>
<td>119 days</td><td><a href="https://build.opensuse.org/project/show?project=isv%3AownCloud%3Acommunity">isv:ownCloud:community</a></td><td><a href="https://build.opensuse.org/package/show?project=isv%3AownCloud%3Acommunity&package=patchinfo">patchinfo</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/147640">147640</a></td>
<td>94 days</td><td><a href="https://build.opensuse.org/project/show?project=devel%3Alanguages%3Alua">devel:languages:lua</a></td><td><a href="https://build.opensuse.org/package/show?project=devel%3Alanguages%3Alua&package=lua-lgi">lua-lgi</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/147641">147641</a></td>
<td>94 days</td><td><a href="https://build.opensuse.org/project/show?project=devel%3Alanguages%3Alua">devel:languages:lua</a></td><td><a href="https://build.opensuse.org/package/show?project=devel%3Alanguages%3Alua&package=lua51-lgi">lua51-lgi</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/151409">151409</a></td>
<td>66 days</td><td><a href="https://build.opensuse.org/project/show?project=Arch%3AExtra">Arch:Extra</a></td><td><a href="https://build.opensuse.org/package/show?project=Arch%3AExtra&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/151535">151535</a></td>
<td>65 days</td><td><a href="https://build.opensuse.org/project/show?project=Arch%3ACore">Arch:Core</a></td><td><a href="https://build.opensuse.org/package/show?project=Arch%3ACore&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/153990">153990</a></td>
<td>64 days</td><td><a href="https://build.opensuse.org/project/show?project=Mono%3ABeta">Mono:Beta</a></td><td><a href="https://build.opensuse.org/package/show?project=Mono%3ABeta&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/154756">154756</a></td>
<td>64 days</td><td><a href="https://build.opensuse.org/project/show?project=Virtualization%3AopenSUSE11.4">Virtualization:openSUSE11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=Virtualization%3AopenSUSE11.4&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/154759">154759</a></td>
<td>64 days</td><td><a href="https://build.opensuse.org/project/show?project=spins%3Aopen-pc%3Akde">spins:open-pc:kde</a></td><td><a href="https://build.opensuse.org/package/show?project=spins%3Aopen-pc%3Akde&package="></a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/155682">155682</a></td>
<td>54 days</td><td><a href="https://build.opensuse.org/project/show?project=Apache%3AModules">Apache:Modules</a></td><td><a href="https://build.opensuse.org/package/show?project=Apache%3AModules&package=apache2-mod_authz_unixgroup">apache2-mod_authz_unixgroup</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/155683">155683</a></td>
<td>54 days</td><td><a href="https://build.opensuse.org/project/show?project=Apache%3AModules">Apache:Modules</a></td><td><a href="https://build.opensuse.org/package/show?project=Apache%3AModules&package=pwauth">pwauth</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158065">158065</a></td>
<td>35 days</td><td><a href="https://build.opensuse.org/project/show?project=Apache%3AModules">Apache:Modules</a></td><td><a href="https://build.opensuse.org/package/show?project=Apache%3AModules&package=apache2-mod_authn_sasl">apache2-mod_authn_sasl</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158089">158089</a></td>
<td>34 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3AEvergreen%3A11.4">openSUSE:Evergreen:11.4</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3AEvergreen%3A11.4&package=drbd.64">drbd.64</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158556">158556</a></td>
<td>32 days</td><td><a href="https://build.opensuse.org/project/show?project=windows%3Amingw%3Awin32">windows:mingw:win32</a></td><td><a href="https://build.opensuse.org/package/show?project=windows%3Amingw%3Awin32&package=mingw32-cross-nsis">mingw32-cross-nsis</a></td></tr>
<tr class="request, more_month">
<td><a href="https://build.opensuse.org/request/show/158558">158558</a></td>
<td>32 days</td><td><a href="https://build.opensuse.org/project/show?project=windows%3Amingw%3Awin32">windows:mingw:win32</a></td><td><a href="https://build.opensuse.org/package/show?project=windows%3Amingw%3Awin32&package=mingw32-cross-nsis-plugin-zipdll">mingw32-cross-nsis-plugin-zipdll</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/159540">159540</a></td>
<td>28 days</td><td><a href="https://build.opensuse.org/project/show?project=Java%3Abase">Java:base</a></td><td><a href="https://build.opensuse.org/package/show?project=Java%3Abase&package=clojure">clojure</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/159797">159797</a></td>
<td>25 days</td><td><a href="https://build.opensuse.org/project/show?project=security%3Anetfilter">security:netfilter</a></td><td><a href="https://build.opensuse.org/package/show?project=security%3Anetfilter&package=SuSEfirewall2">SuSEfirewall2</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/159894">159894</a></td>
<td>25 days</td><td><a href="https://build.opensuse.org/project/show?project=drivers%3Anic">drivers:nic</a></td><td><a href="https://build.opensuse.org/package/show?project=drivers%3Anic&package=r8168">r8168</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160430">160430</a></td>
<td>22 days</td><td><a href="https://build.opensuse.org/project/show?project=network%3Aha-clustering%3AFactory">network:ha-clustering:Factory</a></td><td><a href="https://build.opensuse.org/package/show?project=network%3Aha-clustering%3AFactory&package=corosync">corosync</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160446">160446</a></td>
<td>22 days</td><td><a href="https://build.opensuse.org/project/show?project=security%3Apasswordmanagement">security:passwordmanagement</a></td><td><a href="https://build.opensuse.org/package/show?project=security%3Apasswordmanagement&package=password-store">password-store</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160510">160510</a></td>
<td>22 days</td><td><a href="https://build.opensuse.org/project/show?project=network%3Atelephony%3Aasterisk-11">network:telephony:asterisk-11</a></td><td><a href="https://build.opensuse.org/package/show?project=network%3Atelephony%3Aasterisk-11&package="></a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160725">160725</a></td>
<td>20 days</td><td><a href="https://build.opensuse.org/project/show?project=isv%3AownCloud%3Acommunity">isv:ownCloud:community</a></td><td><a href="https://build.opensuse.org/package/show?project=isv%3AownCloud%3Acommunity&package="></a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160726">160726</a></td>
<td>20 days</td><td><a href="https://build.opensuse.org/project/show?project=isv%3AownCloud%3Acommunity">isv:ownCloud:community</a></td><td><a href="https://build.opensuse.org/package/show?project=isv%3AownCloud%3Acommunity&package=owncloud">owncloud</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160727">160727</a></td>
<td>20 days</td><td><a href="https://build.opensuse.org/project/show?project=isv%3AownCloud%3Acommunity">isv:ownCloud:community</a></td><td><a href="https://build.opensuse.org/package/show?project=isv%3AownCloud%3Acommunity&package=qtkeychain">qtkeychain</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160794">160794</a></td>
<td>19 days</td><td><a href="https://build.opensuse.org/project/show?project=network%3Astorage">network:storage</a></td><td><a href="https://build.opensuse.org/package/show?project=network%3Astorage&package=bcache-tools">bcache-tools</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160846">160846</a></td>
<td>19 days</td><td><a href="https://build.opensuse.org/project/show?project=X11%3AwxWidgets">X11:wxWidgets</a></td><td><a href="https://build.opensuse.org/package/show?project=X11%3AwxWidgets&package=wxWidgets">wxWidgets</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160961">160961</a></td>
<td>18 days</td><td><a href="https://build.opensuse.org/project/show?project=Archiving%3ABackup">Archiving:Backup</a></td><td><a href="https://build.opensuse.org/package/show?project=Archiving%3ABackup&package=rsync">rsync</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160962">160962</a></td>
<td>18 days</td><td><a href="https://build.opensuse.org/project/show?project=Archiving%3ABackup">Archiving:Backup</a></td><td><a href="https://build.opensuse.org/package/show?project=Archiving%3ABackup&package=librsync">librsync</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/161043">161043</a></td>
<td>18 days</td><td><a href="https://build.opensuse.org/project/show?project=Archiving%3ABackup">Archiving:Backup</a></td><td><a href="https://build.opensuse.org/package/show?project=Archiving%3ABackup&package=dkopp">dkopp</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/160885">160885</a></td>
<td>17 days</td><td><a href="https://build.opensuse.org/project/show?project=KDE%3AQt50">KDE:Qt50</a></td><td><a href="https://build.opensuse.org/package/show?project=KDE%3AQt50&package=libqt5-qtwebkit">libqt5-qtwebkit</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/161474">161474</a></td>
<td>16 days</td><td><a href="https://build.opensuse.org/project/show?project=X11%3ACinnamon%3AFactory">X11:Cinnamon:Factory</a></td><td><a href="https://build.opensuse.org/package/show?project=X11%3ACinnamon%3AFactory&package=cinnamon-screensaver">cinnamon-screensaver</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/161616">161616</a></td>
<td>15 days</td><td><a href="https://build.opensuse.org/project/show?project=security%3Apasswordmanagement">security:passwordmanagement</a></td><td><a href="https://build.opensuse.org/package/show?project=security%3Apasswordmanagement&package="></a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/162321">162321</a></td>
<td>10 days</td><td><a href="https://build.opensuse.org/project/show?project=Apache%3AModules">Apache:Modules</a></td><td><a href="https://build.opensuse.org/package/show?project=Apache%3AModules&package=apache2-mod_authn_otp">apache2-mod_authn_otp</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/162491">162491</a></td>
<td>9 days</td><td><a href="https://build.opensuse.org/project/show?project=utilities">utilities</a></td><td><a href="https://build.opensuse.org/package/show?project=utilities&package=byobu">byobu</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/162528">162528</a></td>
<td>9 days</td><td><a href="https://build.opensuse.org/project/show?project=filesystems">filesystems</a></td><td><a href="https://build.opensuse.org/package/show?project=filesystems&package=libvshadow">libvshadow</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/162537">162537</a></td>
<td>9 days</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3ATools">openSUSE:Tools</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3ATools&package=obs-service-verify_file">obs-service-verify_file</a></td></tr>
<tr class="request, more_weak">
<td><a href="https://build.opensuse.org/request/show/162581">162581</a></td>
<td>8 days</td><td><a href="https://build.opensuse.org/project/show?project=vdr">vdr</a></td><td><a href="https://build.opensuse.org/package/show?project=vdr&package="></a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162074">162074</a></td>
<td>7 days, 22 hours</td><td><a href="https://build.opensuse.org/project/show?project=devel%3AopenSUSE%3AFactory%3Alegal-queue">devel:openSUSE:Factory:legal-queue</a></td><td><a href="https://build.opensuse.org/package/show?project=devel%3AopenSUSE%3AFactory%3Alegal-queue&package=which">which</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162691">162691</a></td>
<td>7 days, 21 hours</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3A12.3%3AUpdate">openSUSE:12.3:Update</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3A12.3%3AUpdate&package=pesign-obs-integration.1510">pesign-obs-integration.1510</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162691">162691</a></td>
<td>7 days, 21 hours</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3A12.3%3AUpdate">openSUSE:12.3:Update</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3A12.3%3AUpdate&package=pesign-obs-integration.1510">pesign-obs-integration.1510</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162691">162691</a></td>
<td>7 days, 21 hours</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3A12.3%3AUpdate">openSUSE:12.3:Update</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3A12.3%3AUpdate&package=pesign-obs-integration.1510">pesign-obs-integration.1510</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162691">162691</a></td>
<td>7 days, 21 hours</td><td><a href="https://build.opensuse.org/project/show?project=openSUSE%3A12.3%3AUpdate">openSUSE:12.3:Update</a></td><td><a href="https://build.opensuse.org/package/show?project=openSUSE%3A12.3%3AUpdate&package=pesign-obs-integration.1510">pesign-obs-integration.1510</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/158276">158276</a></td>
<td>7 days, 16 hours</td><td><a href="https://build.opensuse.org/project/show?project=devel%3AopenSUSE%3AFactory%3Alegal-queue">devel:openSUSE:Factory:legal-queue</a></td><td><a href="https://build.opensuse.org/package/show?project=devel%3AopenSUSE%3AFactory%3Alegal-queue&package=sazanami-fonts">sazanami-fonts</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162931">162931</a></td>
<td>7 days, 6 hours</td><td><a href="https://build.opensuse.org/project/show?project=filesystems">filesystems</a></td><td><a href="https://build.opensuse.org/package/show?project=filesystems&package=libsmdev">libsmdev</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162932">162932</a></td>
<td>7 days, 6 hours</td><td><a href="https://build.opensuse.org/project/show?project=filesystems">filesystems</a></td><td><a href="https://build.opensuse.org/package/show?project=filesystems&package=libsmraw">libsmraw</a></td></tr>
<tr class="request, more_day">
<td><a href="https://build.opensuse.org/request/show/162933">162933</a></td>
<td>7 days, 6 hours</td><td><a href="https://build.opensuse.org/project/show?project=filesystems">filesystems</a></td><td><a href="https://build.opensuse.org/package/show?project=filesystems&package=libodraw">libodraw</a></td></tr>
</table>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com2tag:blogger.com,1999:blog-3954136086375338541.post-18899627178359948472012-10-06T18:30:00.000+04:002012-10-06T18:30:07.564+04:00shadow-utils vs. pwdutilsСуществуют два пакета утилит: <a href="http://pkg-shadow.alioth.debian.org/">shadow-utils</a> и pwdutils (применяется в SUSE). Служат они для одной цели — редактирования групп и пользователей, но при этом значения набора параметров отличаются. Среди шестерки утилит <tt>user{add,mod,del}</tt> и <tt>group{add,mod,del}</tt>, к счастью, наблюдается некоторая систематика.<br />
<br />
В shadow-utils следующие параметры имеют всегда одинаковое значение (в pwdutils отсутствуют, если явно не указано обратное):<br />
<table width="100%"><tr><th>Ключ</th><th>Значение</th></tr>
<tr><td>-D</td><td>изменяет значения по умолчанию</td></tr>
<tr><td>-K</td><td>key=value для значений по умолчанию</td></tr>
<tr><td>-R</td><td>запускать в chroot</td></tr>
<tr><td>-Z</td><td>пользователь SELinux</td></tr>
</table><br />
При этом ключи pwdutils другое (в shadow-utils отсутствуют, если явно не указано обратное):<br />
<table width="100%"><tr><th>Ключ</th><th>Значение</th></tr>
<tr><td>-D</td><td>DN для LDAP</td></tr>
<tr><td>-P</td><td>путь к /etc/passwd и /etc/shadow</td></tr>
</table><br />
Кроме этого, для каждой команды присутствуют индивидуальные особенности. Их условно можно поделить на три группы: ключ означает разные вещи; ключ отсутствует в одной из реализаций; ключ присутствует, значение совпадает, но это не отражено в документации.<br />
<br />
С проблемами первой условной группы можно было бы бороться используя явные длинные названия. Это делает скрипт более длинным, но и более явным. Однако, для <tt>-e</tt> длинные варианты отличаются: --expiredate и --expire.<br />
<br />
<h2>useradd</h2><table width="100%"><tr><th>Ключ</th><th>Shadow</th><th>Pwd</th></tr>
<tr><td>-M</td><td>не создавать /home</td><td>нет</td></tr>
<tr><td>-N</td><td>не создавать группу пользователю</td><td>нет</td></tr>
<tr><td>-U</td><td>создать пользователю одноименную группу</td><td>маска umask для домашней директории</td></tr>
<tr><td>-b</td><td>базовый каталог, вместо /home</td><td>нет</td></tr>
<tr><td>-l</td><td>не добавлять в lastlog</td><td>нет</td></tr>
</table><br />
<h2>usermod</h2><table width="100%"><tr><th>Ключ</th><th>Shadow</th><th>Pwd</th></tr>
<tr><td>-A</td><td>нет</td><td>добавить в группу (аналог -a -G)</td></tr>
<tr><td>-R</td><td>запускать в chroot</td><td>удалить из группы</td></tr>
<tr><td>-a</td><td>(вместе с -G) добавить в группу</td><td>недокументированный</td></tr>
</table><br />
<h2>groupadd</h2><table width="100%"><tr><th>Ключ</th><th>Shadow</th><th>Pwd</th></tr>
<tr><td>-f</td><td>не ругаться, если группа уже есть</td><td>недокументированный</td></tr>
</table><br />
<h2>groupmod</h2><table width="100%"><tr><th>Ключ</th><th>Shadow</th><th>Pwd</th></tr>
<tr><td>-A</td><td>нет</td><td>добавить пользователя в группу</td></tr>
<tr><td>-R</td><td>запускать в chroot</td><td>удалить пользователя из группы</td></tr>
<tr><td>-n</td><td>переименовать</td><td>недокументированный</td></tr>
</table>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-11941513935879831802012-06-12T18:37:00.000+04:002012-06-12T18:37:19.489+04:00MercurialМинимальная инфраструктура для работы с распределенной системой контроля версий Mercurial настраивается следующим образом. <br />
<br />
Во-первых, нужно где-то разместить репозитории. Поскольку никаких других рекомендаций не поступало, по аналогии с cvs и svn будем класть все в <tt>/srv/hg/repos</tt>. Во-вторых, нужно обеспечить теперь доступ разным пользователям, которые счастливо существуют на компьютере и что-то там делают. Основная инструкция тут: <a href="http://mercurial.selenic.com/wiki/MultipleCommitters">http://mercurial.selenic.com/wiki/MultipleCommitters</a>. Краткая инструкция: по аналогии с cvs и svn, создаем системную группу <tt>hg</tt>, системного пользователя <tt>hg</tt>, добавляем всех пользователей в группу <tt>hg</tt>.<br />
<br />
Схема создания нового репозитория выглядит следующим образом:<br />
<pre>cd repos/
mkdir test
chown -R hg:hg test
cd test/
hg init
chown -R hg:hg .hg
chmod -R g+w .hg
chmod g+s .hg .hg/store .hg/store/data
</pre><br />
Mercurial >1.0 сам, о чудо, разбирается с правами доступа и делает так, чтобы все кому надо могли туда писать. Вообще говоря, данный подход (пулить всем вместе в один репозиторий) полностью противоречит идеологии hg.<br />
<br />
В-третьих, никак не обойтись без веб-интерфейса. В <tt>/usr/share/doc/packages/mercurial</tt> живет пример под названием <tt>hgweb.cgi</tt>. Кладем его в <tt>/srv/hg/bin/hgweb.fcgi</tt> и меняем примерно следующим образом (чтобы через FastCGI работал):<br />
<pre>#!/usr/bin/python
config = "/srv/hg/config"
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
from flup.server import fcgi
application = hgweb(config)
fcgi.WSGIServer(application).run()
</pre><br />
Конфигурация для lighttpd (обычно кладется куда-нибудь в <tt>/etc/lighttpd/vhosts.d/hgweb.conf</tt>):<br />
<pre>fastcgi.server += (
"/hg" => ((
"bin-path" => "/srv/hg/bin/hgweb.fcgi",
"socket" => socket_dir + "/hgweb.sock",
"max-procs" => 1,
"check-local" => "disable",
"fix-root-scriptname" => "enable",
))
)
</pre><br />
Что писать в <tt>/srv/hg/config</tt> подсказывают в <tt>hg help hgweb</tt>:<br />
<pre>[paths]
/ = /srv/hg/repos/*
/home/user = /home/user/hg/**
</pre><br />
Последняя строчка для того, чтобы пользователям было не обидно, там они хранят свои личные репозитории. Вот только . Поля "Description" и "Contact" настраиваются в <tt>.hg/hgrc</tt> персонально для каждого репозитория. Кроме того, теперь через http возможно анонимное клонирование.<br />Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-7657999762224929382012-06-12T14:59:00.001+04:002012-06-12T15:03:05.055+04:00В openSUSE перерабатывают страницу software.opensuse.org и придумали полезную вещь, встраиваемый в веб-страницы виджет с информацией о пакетах; <a href="http://software.opensuse.org/download/doc">инструкция здесь</a>.<br />
<br />
Выглядит примерно так:<br />
<iframe style="border: 0; overflow-x: visible; overflow-y: scroll; width: 100%; display: block; margin: auto; " src="http://software.opensuse.org/download/package.iframe?project=science&package=eso-midas&fcolor=c0c0c0&bcolor=1c1c1c"></iframe>Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com2tag:blogger.com,1999:blog-3954136086375338541.post-81199633805637242962012-03-15T10:39:00.000+04:002012-03-15T10:39:51.019+04:00postifx в SuSEconfig<br />
В openSUSE 12.1 postfix был откручен(<a href="https://bugzilla.novell.com/show_bug.cgi?id=750685">750685</a>) от <tt>SuSEconfig</tt>, поэтому запускать тот самый волшебный скрипт теперь надо так: <pre>MD5DIR=/var/adm/SuSEconfig/md5 /usr/sbin/SuSEconfig.postfix</pre><br />
Все остальное работает как раньше: <tt>/etc/sysconfig/postfix</tt>, <tt>/etc/sysconfig/mail</tt> остаются в силе. Базы алиасов пересобираются сами при <tt>rcpostfix restart</tt>.<br />
<br />
<br />
<br />Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0tag:blogger.com,1999:blog-3954136086375338541.post-21118403435956482722011-12-31T12:09:00.000+04:002011-12-31T12:16:07.852+04:00ESO Midas 11SEP1.2Отправил собираться новую версию. <br />
<br />
Заодно осилил source service для build service. Первый приз получает сервис под названием download_files (надо в файл <tt>_service</tt> в проекте воткнуть вот это):<br />
<pre><services>
<service name="download_files">
<param name="recompress">yes</param>
</service>
</services></pre><br />
Он не просто прочитает spec-файл и попытается скачать все файлы для которых там есть полный url в строчке <tt>Source</tt>, он к тому-же (это же чудо!) перепакует их сам в нужный формат и сам разберется что скачивать. Например, допустим, <tt>Source0</tt> указан вот так: <tt>ftp://ftp.eso.org/pub/midaspub/11SEP/sources/%{version}.tar.bz2</tt>, при этом на самом сервере нет архива tar.bz2, там есть только tar.gz. Так вот, умный сервис скачает такой архив, который там физически есть, и перепакует его в такой, который нужен.<br />
<br />
Документации (как и во всем opensuse) нет, поэтому предлагается смотреть в <tt>/usr/lib/obs/service</tt> и там можно прочитать в исходниках какие сервисы есть, какие у них параметры и что делают.<br />
<br />
p.s. Вообще, считаю, следующий гениальный шаг будет когда build service научится сам автоматически отслеживать хранилища типа PyPi, CPAN, etc и автоматом собирать новые пакеты и пересобирать обновленные. Закоммитил ты свой модуль новый питонный в PyPi, а он через 15 минут уже есть для opensuse в виде пакета. Красота.<br />Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com2tag:blogger.com,1999:blog-3954136086375338541.post-65119743127458562352011-08-08T20:32:00.000+04:002011-08-08T20:32:05.796+04:00dhcp клиентыВ openSUSE 11.4 оказалось два dhcp-клиента: dhclient (авторства ISC из пакета dhcp-client) и dhcpcd (почему-то версии 3.2.3 авторства авторов dhcpcd из одноименного пакета). Кстати, последний наотрез отказался удаляться, объясняя это тем, что пакет с mkinitrd от него зависит.<br />
<br />
Переключаются они между собой в файле <tt>/etc/sysconfig/network/dhcp</tt>, там есть соответствующая переменная <tt>DHCLIENT_BIN</tt>.<br />
<br />
p.s. А все это для чего. Утром словил с <tt>dhcpcd</tt> вот это:<br />
<br />
<pre>wlan0: offered 192.168.1.1 from 192.168.0.1 `host.local'
wlan0: got subsequent offer of 192.168.1.2, ignoring
wlan0: checking 192.168.1.1 is available on attached networks
wlan0: ARPOP_REPLY received from 192.168.1.1 (00:12:34:56:78:9a)</pre><br />
И пришлось использовать dhcp-клиент, который сделал мне хорошо. Matwey V. Kornilovhttp://www.blogger.com/profile/10954558557636278561noreply@blogger.com0