Добро пожаловать на планету openSUSE

Это агрегатор блогов, собирающий посты членов openSUSE сообщества

Для того чтобы добавить ваш блог в агрегатор, пожалуйста прочтите инструкцию.


Понедельник
12. Октябрь 2015


face

Имеется следующая конфигурация. Два звуковых устройства, оба управляются одним и тем же модулем snd-hda-intel. Первое устройство отвечает за звуковой канал в HDMI, встроенной в процессор графической системы. Второй устройство — обычный интегрированный на материнскую плату аудио-контроллер.

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]
Пользователи жалуются, что звук не работает. Проблема состоит в том, что YaST создаёт следующую конфигурацию в 50-sound.conf:
options snd slots=snd-hda-intel,snd-hda-intel
alias snd-card-0 snd-hda-intel
alias snd-card-1 snd-hda-intel
Здесь snd-card-0 — звуковое устройство "по умолчанию". Очевидно, что в таком подходе ситуация, когда один и тот же модуль отвечает за два устройства, обрабатывается не корректно. Кто из устройств первый попал в функцию azx_probe модуля, тот и станет snd-card-0. В нашем случае, это не то устройство, которое нам хотелось бы. Это можно проверить, сделав
ls -l /sys/class/sound/card0/device
lrwxrwxrwx 1 root root 0 окт 9 21:36 /sys/class/sound/card0/device -> ../../../0000:00:03.0

Для восстановления правильного порядка предлагается делать следующее.
Во-первых, внимательно изучив исходники модуля, добавляем в 50-sound.conf:
options snd-hda-intel index=1,0
Во-вторых, надеемся, что при следующих загрузках порядок инициализации не будет меняться случайным образом, потому-что кто первый попадет в функцию azx_probe, тот теперь и будет card1. И это всё происходит в 2015 году, когда повсюду systemd и прочий udev, а звуковую карту за её DeviceId привязать нельзя.

Суббота
26. Сентябрь 2015


face

Любопытно, но готового пакета с Popcorn-Time для OpenSUSE не нашлось во всей OBS. В сети имеется установочный скрипт, который по идее должен ставить приложение, но скрипт, увы, устарел и больше не работает. Если вы хотите поставить Popcorn-Time вручную, то это сделать совсем не сложно. Но гораздо удобнее всё же воспользоваться обновлённым скриптом, который я сделал. Скрипт протестирован на OpenSUSE 13.2 64 bit.

Скачать.


Четверг
10. Сентябрь 2015


face

Намедни глянул свежий релиз OpenSUSE 42.1 Leap Milestone2. Система очень приятная и отличается замечательной стабильностью. Но сейчас не об этом. Дело в том, что не все заметили тот факт, что команда OpenSUSE не просто изменила нумерацию версий, но и перешла к другому способу формирования новых версий.

Судите сами. Раньше у нас были номерные версии OpenSUSE (13.1 затем 13.2…), которые считались стабильными. Параллельно сообществом поддерживалась нестабильная версия Factory и нестабильная роллинг-версия Tumbleweed. Вопрос на засыпку: какую версию ставить в продакшн на предприятии в небольшую фирму? Из всех перечисленных версий на эту роль лучше всего годился обычный номерной релиз, но и у него были слабые места. Во-первых, не все номерные релизы OpenSUSE получались удачными. Во-вторых, даже годовой график выпуска релизов был не таким удобным, как LTS-версии у Ubuntu. Что касается коммерческого SLES/SLED, то данные продукты являются именно продуктами — то есть бесплатно ими пользоваться трудно, да и смысла в этом мало. Сайт коммерческой SUSE позволяет скачать пробную версию системы, но получать обновления она будет только первые 60 дней. Для SOHO это неудобно.

Было бы здорово иметь бесплатный и свободный аналог CentOS, который бы завоевал бы сердца админов локалхостов и небольших контор… И этот аналог появился — OpenSUSE Leap. Основной смысл этой принципиально новой версии заключается в предоставлении свежих версий пользовательских программа на базе корпоративной системы SUSE Linux Enterprise (SLE). По сути, это будет ответ на Ubuntu LTS, которая используется как надёжная база с долговременной поддержкой во многих настольных дистрибутивах, включая Linux Mint и ElementaryOS. Однако роль OpenSUSE Leap всё же больше склоняется к корпоративному применению, о чём недвусмысленно сказано в примечании к недавнему релизу:

“Milestone 2 is realistic to use for non-critical production servers,” said members of the openSUSE release team.

Источник

Это важное замечание для всех, кто сейчас использует OpenSUSE 13.2. Версия Leap не является её продолжением и поэтому будет слегка неуклюже смотреться на домашнем десктопе. Настоящая десктопная версия — это OpenSUSE Tumbleweed, который после ноября 2014 г. считается стабильным и протестированным дистрибутивом несмотря на то, что это роллинг-дистрибутив.

Мне вспоминается 2003 год, когда Red Hat объявила, что после Red Hat Linux 9 выйдет Fedora Core 1. Тогда тоже все считали, что Федора будет естественным продолжением старой системой. В действительности же, бизнес перешёл на RHEL и CentOS, а Fedora стала экспериментальной и нестабильной версией.

Сейчас OpenSUSE делает похожее, но с поправкой на более высокое качество релизов: Tumbleweed гораздо удобнее в использовании чем Fedora, а Leap проще настроить под себя по сравнению с CentOS.

Переход с KDE4 на Plasma5 — отдельная большая тема, об этом позже!


Понедельник
17. Август 2015


face

Иногда, когда ядро Linux испытывает проблемы, одними из способов сбора отладочной информации являются консоль последовательного порта или сетевая консоль. Сразу обратим внимание, что второй вариант имеет как недостатки, например, предполагает, что сетевая подсистема ядра остается функциональной во время возникновения проблем, так и преимущества, например, можно сконфигурировать удаленно.

Полное описание сетевой консоли находится в документации ядра. Для настройки достаточно добавить в modprobe.d/99-local.conf:

options netconsole netconsole=@/,514@192.168.10.7/00:0C:29:F3:92:97
Здесь, 514 - номер UDP порта, 192.168.10.7 - IP удаленного хоста куда будет отсылаться информация, 00:0C:29:F3:92:97 - его MAC адрес, если его не указать явно то будет использоваться широковещательный адрес FF:FF:FF:FF:FF:FF, что может затруднить передачу информации в зависимости от настроек сетевого оборудования.
И загрузить модуль netconsole или, по желанию, поставить его на автозагрузку при старте системы.

После загрузки модуля netconsole, сетевая консоль начинает немедленно функционировать, а в системном журнале можно увидеть примерно следующее:
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

Данные приходят в самом простом текстовом виде и их можно читать самым простым способом:
netcat -u -l 514
Если у нас в наличии есть syslog-ng — можно использовать его следующим образом:
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);
};

Проверить, что всё работает можно следующим образом:
echo '<7>Hello world!' > /dev/kmsg
dmesg -n 8
Сообщение должно появиться в журнале и быть передано по сети на удаленный хост.

Вторник
11. Август 2015


face

Ядро Linux периодически ломается, иногда это происходит на стадии загрузки. Одним из методов исследования проблемы является удаленная отладка с использованием последовательного порта.

Опции конфигурации ядра должны быть такими:

CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
Кроме того, драйвер последовательного порта должен быть включен в состояние Y.

Далее нам понадобятся отладочные символы и исходные коды ядра, которые находятся в пакетах -debuginfo и -debugsource. Скорее всего, архитектуры удаленной и локальной системы не будут совпадать, так как особенно часто ядро Linux не работает на архитектуре armv7l, поэтому просто распакуем данные следующим образом:
> 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
В текущей директории будет создана поддиректория /usr содержащая отладочные символы и исходные коды в стандартной иерархии. Кроме того, нам понадобятся сами бинарные файлы ядра:
> 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

Далее, следует подключить последовательный порт, и открыть удаленную консоль следующим, например, образом:
> screen /dev/ttyUSB0 115200
и начать загрузку целевого устройства. Для активации механизма kgdb потребуется добавить параметры командной строки ядра в загрузчике:
U-Boot# setenv append "kgdboc=ttyO0,115200 kgdbwait"
U-Boot# boot

Если все пойдет правильно, то загрузка ядра остановится после примерно следующих строк:
[    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>
kdb ождает ввода команд, среди прочего доступна команда help, выводящая список базовых команд. На этом консоль можно закрыть: Ctrl-A :quit и открыть отладчик gdb.

Для начала установим пути к отладочным символам и исходным кодам и загрузим объектный файл ядра целевой системы (внимание, сначала этот файл нужно будет распаковать командой gz).
(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.
После этого нужно подключиться к целевой системе:
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
0xc031dc08 in arch_kgdb_breakpoint () at ../arch/arm/include/asm/outercache.h:142

Далее можно использовать отладчик как обычно. Через команду monitor доступны все команды из консоли kdb, среди них есть достаточно полезные, например dmesg или lsmod:
(gdb) monitor lsmod
Module Size modstruct Used by
musb_am335x 1431 0xbf000278 1 (Loading) 0xbf000000 [ ]
Обратите внимание, что команда lsmod любезно нам показывает адрес 0xbf000000, куда в памяти загружен модуль musb_am335x. Этот адрес нужен чтобы отлаживать код из модуля:
(gdb) add-symbol-file /tmp/dbg/lib/modules/4.2.0-rc4-1.gaf243bc-default/kernel/drivers/usb/musb/musb_am335x.ko 0xbf000000

Понедельник
11. Май 2015


face

Разработчики systemd продолжают вести нас в светлое будущее. В udev уже давно реализован механизм Predictable Network Interface Names, который представляет из себя кусочек кода на C, заполняющий переменные ID_NET_NAME_* исходя из свойств расположения физического сетевого устройства.

Считается, что подобный подход дает больше информации, чем прибитие гвоздями имен интерфейсов eth? к MAC-адресам в 70-persistent-net.rules. Однако, не обходится без недостатков. Например, при запуске системы под гипервизором VMWare ESXi, единственный сетевой интерфейс у меня называется eno16777728. Устройства, определяемые в DTB для одноплатных компьютеров на базе ARM, не поддерживаются схемой именования и имеют обычные имена eth?. А при подключении USB устройств, типа мобильных телефонов или модемов, схема именования генерирует скорее неустойчивые имена, потому-что в имя входит расположение устройства на шине USB, которое изменится при следующем подключении, таким образом придется настраивать интерфейс заново, потому-что предыдущие сохраненные настройки будут относиться к интерфейсу с другим именем.

К счастью, udev заполняет переменную ID_NET_NAME_MAC, представляющую имя интерфейса, основанное исключительно на его MAC-адресе. По-умолчанию, эта переменная не используется, но можно поменять стандартное поведение для USB-устройств. Один способ - через настройку udev, второй - используя systemd.link, файл, используемый systemd, для конфигурации сетевых интерфейсов.

Создадим файл /etc/systemd/network/90-usb.link следуя инструкции:

[Match]
Path=*-usb-*
[Link]
NamePolicy=mac
Юнит-файл состоит из двух секций: [Match] для описания устройств к которым он относится и [Link] для описания того, что с ними делать. В примере выше мы просим systemd использовать политику именования основанную на MAC-адресах для всех устройств подключенных через USB. После выполнения systemctl daemon-reload можно подключить устройство и увидеть его интерфейс с именем enx112233445566. Достаточно длинное, но уникальное (в известных пределах) и не изменится при следующем подключении устройства.

Кроме изменения имени через systemd.link можно настроить WOL, MTU, ограничить скорость на интерфейсе, назначить устройству другой MAC-адрес.

Пятница
20. Март 2015


face

Имеется диск с тремя разделами sda1 (/boot), sda2 (swap), sda3 (/). Необходимо увеличить размер раздела /boot за счет swap.

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

# 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

Используем parted для того, чтобы сначала уменьшить и передвинуть второй раздел, а затем расширить первый на освободившееся место. Так как второй раздел - swap, то его мы просто передвинем, не заботясь о содержимом. Иначе говоря, сначала мы совсем сломаем, а потом заново её разметим.

# 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

Для изменения раздела используется команда resize номер_раздела начало конец

(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

К сожалению в этот момент оно само подмонтировало всё назад, поэтому нужно снова отмонтировать первый раздел. Раздел swap в данный момент уже должен быть работоспособен, потому-что mkswap на нем выполнился сам автоматически. К сожалению, я не нашел способа отключить всю эту самодеятельность.

# umount /dev/sda1
# e2fsck -p /dev/sda1

Снова идем в parted:

# 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.

Готово, parted не только изменил размер раздела, но еще и молча расширил для нас файловую систему, а теперь предупреждает о необходимости обновить загрузчик.

Вторник
30. Декабрь 2014


face

Показать список подтомов можно командой btrfs subvolume list /. Выберем какой-нибудь, например /var/lib/pgsql.
Создадим новую конфигурацию (профиль) для этого подтома: snapper -c pgsql create-config /var/lib/pgsql, здесь pgsql произвольное имя:

# snapper list-configs
Config | Subvolume
-------+---------------
root | /
pgsql | /var/lib/pgsql

Далее, все команды нужно выполнять с ключом -c pgsql, чтобы оперировать нужным профилем.

# snapper -c pgsql get-config
...
NUMBER_CLEANUP | yes
NUMBER_LIMIT | 50
NUMBER_LIMIT_IMPORTANT | 10
NUMBER_MIN_AGE | 1800

Здесь NUMBER_CLEANUP разрешает удалять старые снимки если их число превышает NUMBER_LIMIT и одновременно возраст (в секундах) больше NUMBER_MIN_AGE.

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

Здесь соответствующая настройка разрешает автоматическое создание снимков раз в час. Команда TIMELINE_CLEANUP удаляет старые снимки, используя следующие правила: удаляется снимок только если он старше TIMELINE_MIN_AGE секунд и одновременно после удаления останутся TIMELINE_LIMIT_* снимков с соответствующими интервалами.
Таким образом, в вышеописанном стандартном случае всегда будут доступны снимки: 10 с интервалом в час с текущего момента, 10 с интервалом в один день с текущего момента, 10 с интервалом в один месяц и так далее.

Вторник
19. Август 2014


face

Когда требуется локально пересобрать пакет под одну из архитектур ARM, например для тестирования сборки, можно воспользоваться следующим медленным подходом.

osc build --clean --alternative-project openSUSE:Factory:ARM qemu armv7l name.spec

Здесь указывается, что используется альтернативный проект для сборки — openSUSE:Factory:ARM (версию подставить по желанию), используется репозиторий qemu, который есть в этом проекте. Поэтому и указывается этот альтернативный проект.

Несмотря на то, что в данном примере указана архитектура armv7l, технически, это x86_64. В среду сборки будет установлен бинарный транслятор qemu, работающий через подсистему ядра binfmt. При инициализации ядро настраивается таким образом, что при виде сигнатуры ELF для архитектуры ARM вызывает бинарик как qemu-arm /usr/bin/..., подобно тому, как при виде символов "#!" в начале исполняемого файла вызывается указанный интерпретатор. Работает поэтому достаточно медленно.

К сожалению, с пакетами kiwi такое не проходит.

Вторник
08. Июль 2014


face

BeagleBone Black — одноплатный компьютер на основе процессора TI AM3358 (Cortex-A8), выпущенный весной прошлого года:


На нем вполне успешно может загрузиться и даже работать openSUSE 13.1. Готовые образы для нанесения на microSD карточку находятся здесь. Эти же самые образы должны в теории работать и на BeagleBone. Конечно, пока все на этапе интеграции и поиска ошибок, поэтому имеется подробная инструкция по запуску:
  1. Скачать, распаковать и сделать dd на карточку образ системы *.raw.xz
  2. Подключить отладочный TTL-RS232 порт (можно использовать, например, такой, но важно помнить, что разработчики BeagleBone Black не поставили на свою плату преобразователь уровней и сигнал с отладочного RS232 идет в виде 3.3V. Подключение через обычный COM-порт на большом компьютере обречено на провал.), руководствуясь распиновкой. Используя screen /dev/ttyUSB0 115200, во-первых, можно будет легко видеть все этапы начиная от работы u-boot. Во-вторых, запустится Yast2 firstboot и попросит вас задать root пароль, завести пользователя, установить временную зону и системное время (аналогично тому, как это происходит на соответствующем этапе установки с DVD), а для этого потребуется интерактивное взаимодействие.
  3. Помните, что для загрузки с внешней карты памяти при подаче питания на устройство нужно удерживать кнопку S2 (она же boot select switch). Подсказка — загрузившись с SD карты можно подмонтировать раздел встроенной MMC памяти и переименовать или удалить файл загрузчика MLO, после этого загрузка будет всегда начинаться с SD, но загрузиться с MMC больше не получится.

Технические подробности (тем, кто хочет продолжить ковыряния) изложены в списке рассылки: http://lists.opensuse.org/opensuse-arm/2014-01/msg00001.html.

Понедельник
28. Апрель 2014


face

Как-то так получилось, что в последнее время часто переустанавливаю систему — то обновляю, то сбои непонятные, то эксперименты разные. И часто забываю название программы, которую использую для ограничения времени игр моего старшего сына.
Это программа timekpr, которая уже вроде давно перестала обновляться, но лучшего варианта для моих целей пока я не нашел.
Главная задача — ограничить время работы моего сына. Сейчас это 1 час в день. Возможностей программы достаточно, чтобы он не смог играть больше часа, в его возрасте и часа многовато.
Раньше и сейчас эту программу легко найти по поиску на сайте opensuse.org, легкая установка в один клик, несложные настройки. Если у кого-нибудь возникнут вопросы — пишите, помогу с настройкой


Понедельник
27. Январь 2014


face


ATSAMD20-XPRO оценочный набор для новой серии микроконтроллеров Atmel ATSAMD20 на ядре Cortex-M0+. Выглядит следующим образом:

Купить в России можно например тут: Дельта Электроника.

Этот пост о том как подключать эту плату в GNU/Linux. Плата снабжена интерфейсом micro-USB для отладки, реализуемым через отдельную микросхему. Atmel называет это «Embedded Debugger», анонсируется наличие виртуального последовательного интерфейса (прикрученного к основному чипу) и собственно средств отладки и программирования.

При подключении появляется устройство:
Bus 001 Device 010: ID 03eb:2111 Atmel Corp.

[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

Устройство, как видно, отдает нам виртуальный последовательный интерфейс на /dev/ttyACM? и интерфейс CMSIS-DAP на /dev/hid*.

В openocd недавно добавили поддержку этого интерфейса. Пока пакеты openocd с поддержкой CMSIS-DAP доступны здесь:

В пакетах есть небольшой баг, связанный с тем, что udev стремится поставить на /dev/hidraw* группу владельца plugdev, которая по-умолчанию в системе не существует и в пакете не создается. openocd будет искать свой devel-project и потом попадет в Factory.

Запускаем и убеждается, что таки оно работает:
> 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


Понедельник
08. Июль 2013


face

Xen умеет пробрасывать USB-устройства (по отдельности) в гостевые непривилегированные домены. Для этого используется механизм, называемый PVUSB (подозреваю, что сокращение от Para-Virtualized USB), концептуально состояний из модулей usbbk (Xen USB backend driver) и xen_hcd (Xen USB Virtual Host Controller driver). Соответственно, первый модуль съедает устройство в dom0, делая его недоступным для других драйверов, а все URB отправляет через гипервизор в нужный выбранный домен, где их получает перавиртуальный контроллер. Утверждается, что потеря производительности минимальна.

Вся конструкция управляется несколькими командами. Посмотреть, какие устройства доступны:

# xm usb-list-assignable-devices
4-2 : ID 067b:2303 Prolific Technology Inc. USB-Serial Controller
Создать в домене паравиртуальный USB хост контроллер: xm usb-hc-create Domain UsbVer PortNum, где параметры — название домена, версия USB (поддерживаются 1 и 2) и количество USB-портов. После этого, в гостевом домене с помощью lsusb видно появившийся контроллер. Для удаления есть обратная команда xm usb-hc-destroy

Для присваивания устройства есть команда xm usb-attach Domain HostNum PortNum Device, где параметры — название домена, номер хост контроллера (их можно хоть пачку создать), номер порта на виртуальном контроллере, первая колонка выдачи usb-list-assignable-devices. Обратная команда — xm usb-destroy. При этом, в dom0 устройство пропадет на глазах у изумленного драйвера:
[12129.803899] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0
[12129.803938] pl2303 4-2:1.0: device disconnected
но появится в гостевом домене:
# 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

Важное замечание. Если в гостевом домене ничего не появилось, кроме записей в dmesg:
[12332.892117] usb 1-1: new full-speed USB device number 70 using vusb
[12332.892126] usb 1-1: parent hub has no TT
то скорее всего, устройство не поддерживает USB 2.0, к которому его прицепили, нужно сделать другой контроллер с правильным параметром UsbVer.

Кроме того, устройство можно прибить гвоздями в конфигурационном файле домена:
vusb=['usbver=1, numports=4, port_1=4-2']
Список литературы:

Пятница
05. Июль 2013


Matwey Kornilov: Elixir

08:24 UTC

face

Больше маргинальных языков в openSUSE. Elixir — основываясь на Erlang, является еще более маргинальным языком.

Брать здесь — http://software.opensuse.org/package/elixir.


Понедельник
17. Июнь 2013


face

Сеть в Xen работает по принципу виртуального моста, как рассказывается здесь: http://wiki.xen.org/wiki/Xen_Networking.

Сначала, надо сделать этот самый мост. В /etc/sysconfig/network/ifcfg-br0 надо написать буквально следующее:

BOOTPROTO='dhcp4'
# как для простого интерфейса, можно и статический адрес задать
BRIDGE='yes'
BRIDGE_FORWARDDELAY='0'
BRIDGE_PORTS='eth0 eth1'
BRIDGE_STP='on'
# если два активных физических интерфейса в мост собраны,
# то пакеты могут и по кругу пойти без Spanning Tree Protocol.
STARTMODE='auto'
ifcfg-eth0 и ifcfg-eth1 лучше просто удалить, чтобы не мешались.

Теперь у нас есть самый настоящий мост, который можно вписывать в параметры конфигураций доменов: http://xenbits.xen.org/docs/4.2-testing/misc/xl-network-configuration.html.

Дальше запускаем домены, и проверяем, что появились их бэкендные интерфейсы:
# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.52540035c714 yes eth0
eth1
vif1.0

Дальше настраиваем внутренний интерфейс домена, как это происходит обычно.

Воскресенье
28. Апрель 2013


face

Сбои в ядре Linux приводят к возникновению чрезвычайно разнообразных симптомов. Некоторые авторы дают следующую неполную классификацию проблем, с которыми может столкнуться пользователь:

  • kernel oops — проблема при выполнении кода в ядре, например кто-нибудь попытался разыменовать нулевой указатель. С кем из программистов на C такого не случалось?
  • kernel panic — кто-то попытался разыменовать нулевой указатель в обработчике прерываний. После чего ядро уходит в полную несознанку и начинает мигать caps-lock-ом.
  • soft lockup ­— что-то заблокировалось (вероятно наткнувшись на не освобожденную блокировку), несмотря на это прерывания продолжают обрабатываться. Хорошее упражнение — попинговать машину или попытаться зажечь numlock.
  • hard lockup — компьютер жужжит вентиляторами и ни на что не реагирует. Провести какую-то диагностику в этом случае особенно сложно. Проблема может быть вызвана как вышедшим из строя железом, так и неаккуратной обработкой прерываний.
кроме того, можно добавить:
  • hung — индуцированное неправильной блокировкой последовательное попадание всех или большинства процессов системы в состояние TASK_UNINTERRUPTIBLE (известного так-же как D-состояние, по обозначению в top или ps). Согласно книге Р.Лава такой «наводящий ужас» процесс нельзя убить, завершить, и вообще что-то с ним сделать. При этом с точки зрения пространства пользователя программа просто заблокирована на каком-то системном вызове (например ввода-вывода). При попадании в подобное состояние всех критических процессов системы можно получить симптом похожий на soft lockup.
Получить как можно более подробную информацию о сути возникающей проблемы важно как для правильного написания сообщения об ошибке, так и для временного переконфигурирования системы с целью избегания выполнения проблемного кода и повышения её живучести.

К счастью, ядро обладает неким набором средств первичной самодиагностики, пригодным для постановки примерного диагноза. Согласно, видимо всеобщей, философской парадигме, наиболее устойчивыми и надежными являются наиболее простые подсистемы, поэтому сообщения ядра имеет смысл искать в текстовой и последовательной консолях. Конечно, при достаточном уровне везения нужное сообщение будет сброшено syslog-демону, записано на диск, отправлено по сети на удаленный syslog-демон и прочее, но при недостаточном везении монитор (и фотоаппарат на телефоне), клавиатура и COM-порт являются последней надеждой.

printk


Одним из механизмов общения ядра с внешним миром является printk. При неправильной настройке сообщение скорее всего будет просто потеряно как не обладающее значимостью. Для настройки используется /proc/sys/kernel/printk, соответствующий ему параметр sysctl, утилита klogconsole, SysRq-клавиша и т.п. Ядро обладает восемью уровнями важности сообщений, поэтому установка уровня в 8 заведомо напечатает все на консоль.

sysrq


Магическая кнопка включается в /proc/sys/kernel/sysrq или соответствующим ему параметром sysctl. Предлагается просто записать туда 1, несмотря на то, что новые ядра позволяют изысканный контроль над функционалом. В данной ситуации незачем себя ограничивать, хотя для нормальной работы разумно ограничить функционал на случай случайных нажатий. Если осталась рабочая терминальная сессия (например удаленная сессия по ssh), можно использовать как альтернативу, например, echo b > /proc/sysrq-trigger; с последовательной консоли поведение активируется кнопкой 'break'.

Важно помнить, что SysRq-w, например, выдает сообщение с уровнем KERN_INFO, то есть выдача printk должна быть настроена правильно, чтобы можно было что-то увидеть. Полный список команд SysRq.

softlockup_panic


Параметр ядра softlockup_panic или параметр kernel.softlockup_panic для sysctl включают панику ядра при обнаружении soft lockup. Описание внутреннего устройства. Включение паники позволит остановить выполнение системы и проанализировать выдачу, снабженную трассировкой, хотя контроль блокировки исполняется постоянно. Существует аналогичный механизм отслеживания hard lockup для многопроцессорных систем (если остались живые процессоры — есть шанс что сработает), с соответствующим параметром hardlockup_panic. Время срабатывания обычно в пределах одной минуты.

hung_task_timeout_sec


Механизм отслеживания процессов, надолго застрявших в состоянии TASK_UNINTERRUPTIBLE, параметры настраиваются через sysctl и /proc:
  • kernel.hung_task_panic — включает/отключает панику при обнаружении не прерываемого процесса;
  • kernel.hung_task_warnings — счетчик сообщений. Иными словами, если паника отключена, будет сообщено о таком количестве зависших процессов;
  • kernel.hung_task_timeout_secs — сколько секунд процесс должен непрерывно пробыть в TASK_UNINTERRUPTIBLE, чтобы вызвать сообщение. По умолчанию бывает либо выключено (0), либо очень большое число порядка 10 минут.
Сообщения снабжаются трассировкой, которая подсказывает в какой подсистеме происходит сбой.


Суббота
13. Апрель 2013


face

There was a discussion 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.


Generated at: 2013-04-13 05:27:41.044818
RequestPending timeProjectPackage
13171680 dayssystem:managementpuppet
253591227 daysYaST:Web:STABLEwebyast-vendor_en
319531158 daysMoblin:Factorygnome-session
336431138 daysMoblin:Factorygnome-settings-daemon
336441138 daysMoblin:Factorydalston
338681136 daysMoblin:Factoryicon-theme-dmz-cursors
389051081 daysMoblin:2.0dalston
55428855 dayssecurity:CASACASA-kwallet
55429855 dayssecurity:CASACASA_auth_token_client
55431855 dayssecurity:CASACASA_auth_token_server
69864705 dayssystem:wicdwicd
72401681 daysisv:dell:communitypython-ctypes-rhel
74258661 daysnet-snmp
74259661 daysnet-snmp
74260661 daysnet-snmp
75895644 daysnetwork:ifolder:server_stable
110363387 daysMaemo:Mer:Extras:Importopengfx
123245315 daysisv:microsoftRHEL6
131196236 daysopenSUSE:11.0:Update:Test
134952206 daysBanshee:Legacyipod-sharp
134958206 daysBanshee:Legacypodsleuth
134959206 daysBanshee:Legacyndesk-dbus-glib
134960206 daysBanshee:Legacyndesk-dbus
136458195 daysGNOME:Evolution:mapievolution-mapi
137714184 daysMaemo:Mer:Extras:Import
138490177 daysdevel:languages:lualuaexpat
145153121 daysgames:WorldForgewfmath
145154121 daysgames:WorldForgeskstream
145155121 daysgames:WorldForgelibwfut
145156121 daysgames:WorldForgelibdevil
145162119 daysdevel:languages:luatolua++
145501119 daysNovell:NTSsupportutils-plugin-susecloud
145520119 daysisv:ownCloud:communitypatchinfo
14764094 daysdevel:languages:lualua-lgi
14764194 daysdevel:languages:lualua51-lgi
15140966 daysArch:Extra
15153565 daysArch:Core
15399064 daysMono:Beta
15475664 daysVirtualization:openSUSE11.4
15475964 daysspins:open-pc:kde
15568254 daysApache:Modulesapache2-mod_authz_unixgroup
15568354 daysApache:Modulespwauth
15806535 daysApache:Modulesapache2-mod_authn_sasl
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd.64
15808934 daysopenSUSE:Evergreen:11.4drbd


Воскресенье
24. Февраль 2013


face

При командах выполняемых на удаленном URL, типа copy или merge, subversion иногда требует несколько соединений. Для облегчения работы, можно применить стандартную возможность ssh — использовать одно TCP/IP соединение для нескольких сессий.

Чтобы не испортить настройки клиентского ssh, в секции [tunnels] файла конфигурации ~/.subversion/config зададим нужные настройки как параметры командной строки:

ssh = $SVN_SSH ssh -o "ControlMaster=auto" -o "ControlPath=/home/user/.ssh/svn_ssh-%r@%h:%p" -o "ControlPersist=60"

При этом соединение будет создаваться каждый раз при необходимости, и закрываться через 60 секунд после того, как оно становится невостребованным. ControlPersist=yes оставит соединение навсегда, что, вероятно, не очень безопасно, но зато позволяет комфортно исполнять разные команды, типа commit или update в течении работы, если расходы на создание соединения велики.

Воскресенье
17. Февраль 2013


face

quilt — это система контроля патчей, в каком-то смысле предыдущая ступень эволюции систем контроля версий.

Пусть есть rpm-пакет и нужно обновить его версию, используя новый архив исходных кодов. При этом патчи останутся старыми, и не гарантируется, что они наложатся на новую версию, или не потребуется вмешательство человека, из-за того, что какой-то патч устарел. После того, как новый архив получен и Version: исправлен, можно прибегнуть к помощи quilt:

quilt setup libdc1394.spec

Эта команда создаст новую директорию в которой будут лежать распакованные исходные коды, символическая ссылка на директорию patches (хранит сами файлы патчей) и файл series (хранит порядок в котором патчи нужно применять). quilt не всегда успешно справляется с патчами, которые завернуты в %if.

Идеологически происходит следующее, у нас есть команда quilt, что-то вроде аналога git или hg, дерево исходников и стек патчей. Стек патчей в чем-то аналогичен ревизиям в системах контроля версий. Используя стек можно переходить от текущего состояния к следующему (применяя патч, quilt push) или к предыдущему (откатывая, quilt pop). Первоначально, мы находимся в самом нижнем состоянии (не модифицированные исходные коды):
>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

Дальше попробуем наложить первый патч (здесь потребовалась предварительная обработка из-за хитрой структуры директорий в конкретном случае),
>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

И так далее, пока не закончится весь стек патчей, но скорее всего так просто он не закончится. Задача — обновляя патчи, устранить конфликты. После принудительного применения (quilt push -f) следует вручную просмотреть все конфликтные места и исправить их нужным образом. Каждый патч отслеживает только некоторое число файлов (quilt files), но если отредактирован файл не из списка, то его нужно добавить (quilt add). После того как все исправлено, нужно обновить текущий патч: quilt refresh (это такой аналог commit, который исправляет текущий наложенный патч, основываясь на рабочей директории и предыдущей спрятанной копии)
>quilt refresh
Патч patches/libdc1394-v4l-2.6.38.patch обновлён




Вторник
22. Январь 2013


face

(Пере)запускалка camsource (программы для показывания картинок с веб-камер) с помощью udev:

SUBSYSTEM=="video4linux", ACTION=="add", RUN+="/usr/bin/camsource -r /etc/camsource.conf"

Запускается на старте (когда udev обнаруживается usb-устройства), и перезапускается при их перетыкании (или перетыкивании).

Можно было бы сделать более красиво, т.е. использовать события "add" и "remove" и переменную DEVICE. Однако этому мешает, во-первых, использование нескольких источников в моей конфигурации (и camsource -k выключил бы сразу все), во-вторых какой-то встроенный глюк в самой программе. Дело в том, что запускаясь, процесс почему-то уходит в состояние зомби, и в /proc/NNNNN/fd оказывается пустота. А при использовании параметра [device] код ищет процесс именно по файловым дескрипторам. Иначе говоря, этот параметр вообще не работает.

Применив фантазию к udev, можно например включать трансляцию видео-потока. Что даже удобнее, чем вписывание не комплектуемых init.d-скриптам запуска camsource, ffserver и т.п. во всякие странные места типа /etc/init.d/boot.local.

Суббота
19. Январь 2013


face

Сервис для OBS под названием tar_scm позволяет автоматически создавать архивы из указанных репозиториев систем контроля версий исходных кодов. Естественно, имеет много параметров, описание которых не так просто найти. На головном web-интерфейсе взаимодействие с сервисами куда-то с недавних пор вообще пропало, там хоть какие-то подсказки содержались.

versionformat — один из самых любопытных параметров, позволяющих хоть как-то оформить название архива, для последующего действия сервиса set_version.

  • Для git в это поле можно указать:
    • @PARENT_TAG@ — bash любезно заменит на ближайший тег
    • поля из --pretty=format для последнего по времени коммита — полный список внизу, какой-то смысл в данной ситуации имеют %ct %cd %h (UNIX таймштамп, дата YYYYMMDD, короткий хэш коммита), причем дефисы будут любезно удалены по дороге sed'ом (даты будут получается в духе 20121221).
  • Для mercurial (hg):
    • поля из --template для последнего по времени коммита — полный список внизу. Огромное богатство для фантазии, есть встроенная опция для latesttag. Во время написания этого текста, не было способа выдать дату в виде YYYYMMDD, без дефисов. Сейчас все дефисы удаляются sed'ом, однако последняя версия tar_scm может быть еще не загружена на головной сервис.
  • svn понимает только %r — номер ревизии

  1. github: obs-service-tar_scm
  2. git show(1)
  3. hg templates

Воскресенье
16. Декабрь 2012


face

Широко анонсированный конец света начал потихоньку наступать. Спустя пару месяцев с момента написания моего предыдущего поста shadow-utils vs. pwdutils, основной разработчик pwdutils Торсен Кукук (Thorsten Kukuk) взял и «тихо и незаметно» выпилил pwdutils из следующего релиза openSUSE 12.3 в пользу shadow (Вероятно восклицая в этот момент «Стой и не шевелись! Я тебя породил, я тебя и убью!»).

Репортаж с места события:


Возрадуемся же необходимости оборачивать свои spec-файлы очередными несвежими условными операторами, впрочем я уже давно и так это делаю:
%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

p.s. Неужели pam_unix2.so будет следующей жертвой унификации?

Суббота
06. Октябрь 2012


face

Существуют два пакета утилит: shadow-utils и pwdutils (применяется в SUSE). Служат они для одной цели — редактирования групп и пользователей, но при этом значения набора параметров отличаются. Среди шестерки утилит user{add,mod,del} и group{add,mod,del}, к счастью, наблюдается некоторая систематика.

В shadow-utils следующие параметры имеют всегда одинаковое значение (в pwdutils отсутствуют, если явно не указано обратное):

КлючЗначение
-Dизменяет значения по умолчанию
-Kkey=value для значений по умолчанию
-Rзапускать в chroot
-Zпользователь SELinux

При этом ключи pwdutils другое (в shadow-utils отсутствуют, если явно не указано обратное):
КлючЗначение
-DDN для LDAP
-Pпуть к /etc/passwd и /etc/shadow

Кроме этого, для каждой команды присутствуют индивидуальные особенности. Их условно можно поделить на три группы: ключ означает разные вещи; ключ отсутствует в одной из реализаций; ключ присутствует, значение совпадает, но это не отражено в документации.

С проблемами первой условной группы можно было бы бороться используя явные длинные названия. Это делает скрипт более длинным, но и более явным. Однако, для -e длинные варианты отличаются: --expiredate и --expire.

useradd

КлючShadowPwd
-Mне создавать /homeнет
-Nне создавать группу пользователюнет
-Uсоздать пользователю одноименную группумаска umask для домашней директории
-bбазовый каталог, вместо /homeнет
-lне добавлять в lastlogнет

usermod

КлючShadowPwd
-Aнетдобавить в группу (аналог -a -G)
-Rзапускать в chrootудалить из группы
-a(вместе с -G) добавить в группунедокументированный

groupadd

КлючShadowPwd
-fне ругаться, если группа уже естьнедокументированный

groupmod

КлючShadowPwd
-Aнетдобавить пользователя в группу
-Rзапускать в chrootудалить пользователя из группы
-nпереименоватьнедокументированный

Вторник
12. Июнь 2012


Matwey Kornilov: Mercurial

14:37 UTC

face

Минимальная инфраструктура для работы с распределенной системой контроля версий Mercurial настраивается следующим образом.

Во-первых, нужно где-то разместить репозитории. Поскольку никаких других рекомендаций не поступало, по аналогии с cvs и svn будем класть все в /srv/hg/repos. Во-вторых, нужно обеспечить теперь доступ разным пользователям, которые счастливо существуют на компьютере и что-то там делают. Основная инструкция тут: http://mercurial.selenic.com/wiki/MultipleCommitters. Краткая инструкция: по аналогии с cvs и svn, создаем системную группу hg, системного пользователя hg, добавляем всех пользователей в группу hg.

Схема создания нового репозитория выглядит следующим образом:

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

Mercurial >1.0 сам, о чудо, разбирается с правами доступа и делает так, чтобы все кому надо могли туда писать. Вообще говоря, данный подход (пулить всем вместе в один репозиторий) полностью противоречит идеологии hg.

В-третьих, никак не обойтись без веб-интерфейса. В /usr/share/doc/packages/mercurial живет пример под названием hgweb.cgi. Кладем его в /srv/hg/bin/hgweb.fcgi и меняем примерно следующим образом (чтобы через FastCGI работал):
#!/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()

Конфигурация для lighttpd (обычно кладется куда-нибудь в /etc/lighttpd/vhosts.d/hgweb.conf):
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",
))
)

Что писать в /srv/hg/config подсказывают в hg help hgweb:
[paths]
/ = /srv/hg/repos/*
/home/user = /home/user/hg/**

Последняя строчка для того, чтобы пользователям было не обидно, там они хранят свои личные репозитории. Вот только . Поля "Description" и "Contact" настраиваются в .hg/hgrc персонально для каждого репозитория. Кроме того, теперь через http возможно анонимное клонирование.

Matwey Kornilov: Link

11:03 UTC

face

В openSUSE перерабатывают страницу software.opensuse.org и придумали полезную вещь, встраиваемый в веб-страницы виджет с информацией о пакетах; инструкция здесь.

Выглядит примерно так:


Вторник
03. Апрель 2012


face

Так получилось, что в ходе экспериментов весь мой зоопарк операционных систем рухнул, и пришлось (о стыд!) переустанавливать систему (главную, из под которой загружается все остальное) из-под Виндовс. И тут всплыли несколько особенностей, о которых знает мало кто из пользователей моей любимой операционной ситемы — потому что они не пользуются надстройкой над dos другими системами или очень редко (как и я, впрочем).

Главное, чего не написано в описании процесса создания установочной флешки — программа требует образ в формате raw, вернее, файл с таким расширением. И в прошлый раз (при попытке установить любимую систему другу-виндузятнегу) на этом у меня получилась большая заминка, а точнее — установку не получилось сделать. В этот раз, так как деваться было некуда, интуиция подсказала мне просто переименовать гибридный образ (который был сделать точно по описанию из документации, смотрите на портале opensuse) — было изменено расширение с iso на raw. И все прошло успешно, система установлена.

Небольшое добавление к предыдущей статье — перед созданием флешки через imagewriter образ (установочный) был переделан в гибридный, и поэтому все прошло нормально. Перед этим были попытки записать обычный скачанный образ на флешку, но умная программа отказывалась это делать. Теперь все в порядке


Четверг
15. Март 2012


face


В openSUSE 12.1 postfix был откручен(750685) от SuSEconfig, поэтому запускать тот самый волшебный скрипт теперь надо так:

MD5DIR=/var/adm/SuSEconfig/md5 /usr/sbin/SuSEconfig.postfix

Все остальное работает как раньше: /etc/sysconfig/postfix, /etc/sysconfig/mail остаются в силе. Базы алиасов пересобираются сами при rcpostfix restart.




face

Недавно попробовал установить новую версию моего любимого дистрибютива с флешки.

Так как свободной флешки больше 4 гигабайт в наличии не оказалось, установку делал с образа LiveKDE 12.1 — с планами доустановить необходимый софт позже через интернет.

В версии 11.4 весь необходимый софт ( openSUSe studio и все прилагающиеся необходимые пакеты) были установлены, запись дистрибютива на флешку прошел без сучка и задоринки. И сама установка прошла как по маслу, тем более что с флешки установка идёт быстрее, чем с СД или ДВД. Установил, настроил, добавил необходимые русификационные пакеты — и вот, всё работает, все замечательно. Новая версия пока у меня нареканий не вызвала, правда, в ней я работаю не часто


Среда
29. Февраль 2012


face

Хочу особо отметить сотрудников в деле распостранения информации об моей любимой операционке — интернет-журнал Хвост http://www.xboct.org/wiki/ Рекомендую всем для прочтения


Суббота
31. Декабрь 2011


face

Отправил собираться новую версию.

Заодно осилил source service для build service. Первый приз получает сервис под названием download_files (надо в файл _service в проекте воткнуть вот это):

<services>
<service name="download_files">
<param name="recompress">yes</param>
</service>
</services>

Он не просто прочитает spec-файл и попытается скачать все файлы для которых там есть полный url в строчке Source, он к тому-же (это же чудо!) перепакует их сам в нужный формат и сам разберется что скачивать. Например, допустим, Source0 указан вот так: ftp://ftp.eso.org/pub/midaspub/11SEP/sources/%{version}.tar.bz2, при этом на самом сервере нет архива tar.bz2, там есть только tar.gz. Так вот, умный сервис скачает такой архив, который там физически есть, и перепакует его в такой, который нужен.

Документации (как и во всем opensuse) нет, поэтому предлагается смотреть в /usr/lib/obs/service и там можно прочитать в исходниках какие сервисы есть, какие у них параметры и что делают.

p.s. Вообще, считаю, следующий гениальный шаг будет когда build service научится сам автоматически отслеживать хранилища типа PyPi, CPAN, etc и автоматом собирать новые пакеты и пересобирать обновленные. Закоммитил ты свой модуль новый питонный в PyPi, а он через 15 минут уже есть для opensuse в виде пакета. Красота.

<- Текущие записи в блогах