После обновления на openSUSE 11.2 перестали запускаться некоторые задачи cron'а. Описаны они были в отдельном файле, расположенном в /etc/cron.d и запускаться должны быть не от root, а от некоторого системного пользователя. Но вместо выполнения, в /var/log/messages обнаружились только записи вида "/usr/sbin/cron[47852]: Permission denied".
Ошибка, прямо скажем, не очень информативного содержания. openSUSE использует vixie-cron, снабженный дополнительными патчами, один из которых обеспечивает работу с PAM. В пакете идет так-же и файл /etc/pam.d/crond с настройками.
Исполнению скрипта мешал модуль pam_unix2.so(разработанный Thorsten Kukuk), т.к. этот модуль новой версии считает, что аккаунт заблокирован, если в файле /etc/shadow на месте пароля записан символ '!'. По некоторому стечению обстоятельств так и оказалось. Еще туда можно записать '*', как говорится, почувствуйте разницу.
"Argument list too long"
Какое количество аргументов можно запихнуть в командную строку? Как хорошо известно, исполнение новой программы запускается той или иной вариацией функции exec. А функции эти иногда могут возвращать ошибку E2BIG. Дословно процитировав man, можно было бы воскликнуть: "The total number of bytes in the environment (envp) and argument list (argv) is too large."
В Linux константа ARG_MAX определена в файле include/linux/limits.h, где так и написано 131072 байтов (это на переменные окружения и аргументы командной строки вместе).
Где-то между 2.6.22 и 2.6.23 ситуация немного изменилась, посмотрев в функцию get_arg_page(), что в файле fs/exec.c, можно заметить, что теперь размер ограничен четвертью стека, и, следовательно, может быть неограничен вовсе, т.к. размер стека может быть изменен перед запуском процесса, используя команду ulimit -s.
Простенький скрипт позволяющий поиграть с размером области для аргументов. Будет работать только на системах с ядрами новее, чем 2.6.23. На более старых всегда будет один и тот же результат — 131072.
В Linux константа ARG_MAX определена в файле include/linux/limits.h, где так и написано 131072 байтов (это на переменные окружения и аргументы командной строки вместе).
Где-то между 2.6.22 и 2.6.23 ситуация немного изменилась, посмотрев в функцию get_arg_page(), что в файле fs/exec.c, можно заметить, что теперь размер ограничен четвертью стека, и, следовательно, может быть неограничен вовсе, т.к. размер стека может быть изменен перед запуском процесса, используя команду ulimit -s.
Простенький скрипт позволяющий поиграть с размером области для аргументов. Будет работать только на системах с ядрами новее, чем 2.6.23. На более старых всегда будет один и тот же результат — 131072.
#!/bin/sh
EXEBIN=/bin/true
pattern=$(perl -e 'print ("x" x 4095)."\n";')
ulimit -s $1
ulimit -s
arg=$pattern
while $EXEBIN $arg
do
echo -n .
arg="$arg $pattern"
done
echo $? ${#arg}
Обновление на openSUSE 11.2.
Сегодня успешно обновил openSUSE 11.1 до openSUSE 11.2 прямо на ходу, с помощью zypper dup. Процесс от начала обновления, до начала написания заметки в блоге занял ровно четыре часа.
Восемь шагов к совершенству:
Замечу лишь, что при попытке сделать zypper in zypper было обновлено несколько пакетов, и после этого система оказалась в некоторой некондиции. Сначала я пробовал сделайть апдейт используя DVD, но dup сказал: "/bin/mount: error while loading shared libraries: libvolume_id.so.1: cannot open shared object file: No such file or directory". Поэтому нужно заранее позаботиться о наличии статически слинкованного mount в нужном месте, если необходимо использование DVD.
Новый zypper обладает параметром commit.downloadMode в конфигурационном файле /etc/zypp/zypp.conf. Его можно установить в позицию DownloadInAdvance, если существует недоверие к надежности используемого инетрнет-канала. Это заставит zypper сначала скачать все пакеты, затем их установить.
Все запущенные программы вместе с kde продолжали выполнятся в течение всего процесса обновления, но при попытке выйти из kde после успешного апгрейда упала парочка программ, запустив окна отчета об ошибке.
Восемь шагов к совершенству:
- zypper mr -a -d
- zypper ar http://download.opensuse.org/distribution/11.2/repo/non-oss/ openSUSE-11.2-non-oss
- zypper ar http://download.opensuse.org/distribution/11.2/repo/oss/ openSUSE-11.2-oss
- zypper ar -f http://download.opensuse.org/update/11.2/ openSUSE-11.2-updates
- zypper refresh
- zypper in zypper
- zypper dup
- SuSEconfig
Замечу лишь, что при попытке сделать zypper in zypper было обновлено несколько пакетов, и после этого система оказалась в некоторой некондиции. Сначала я пробовал сделайть апдейт используя DVD, но dup сказал: "/bin/mount: error while loading shared libraries: libvolume_id.so.1: cannot open shared object file: No such file or directory". Поэтому нужно заранее позаботиться о наличии статически слинкованного mount в нужном месте, если необходимо использование DVD.
Новый zypper обладает параметром commit.downloadMode в конфигурационном файле /etc/zypp/zypp.conf. Его можно установить в позицию DownloadInAdvance, если существует недоверие к надежности используемого инетрнет-канала. Это заставит zypper сначала скачать все пакеты, затем их установить.
Все запущенные программы вместе с kde продолжали выполнятся в течение всего процесса обновления, но при попытке выйти из kde после успешного апгрейда упала парочка программ, запустив окна отчета об ошибке.
Настройка часового пояса
В этом сообщении собрана некоторая информация о настройке часового пояса в вашей(и не только вашей) системе.
В настоящее время, шкала времени на Земле построена на атомных стандартах частоты и называется TAI, хотя на практике используется другая шкала — UTC, отличающаяся от TAI на целое число секунд. Находясь в некоторой точке на Земле можно заметить, что местное гражданское время устанавливается административно, и, как правило, отличается на целое количество часов от UTC, момент восхода Солнца зависит от долготы вашего положения, и только UTC остается постоянным во всех точках Земли в один и тот же момент времени.
glibc использует файл /etc/localtime для определение настроек по-умолчанию, обычно этот файл является либо копией, либо символической ссылкой на один из заранее приготовленных файлов в /usr/share/zoneinfo. Необходимо выбрать тот, который вам необходим и использовать его.
Второй способ — использование переменной среды окружения TZ, о которой рассказывается тут: TZ Variable. Переменная имеет несколько форматов, позволяющих либо напрямую задать свойства вашего часового пояса(смещение, относительно всемирного времени и моменты перехода на летнее/зимнее), либо использовать один из подготовленных файлов в /usr/share/zoneinfo(например Europe/Moscow). Утилита tzselect позволит вам правильно задать значение переменной, основываясь на вашем местоположении и знаниях географии. Переменную TZ, прописанную в .profile, можно использовать как альтернативный способ задания часового пояса для конкретного пользователя(например если он работает удаленно).
uclibc, который используется в busybox и множестве встраиваемых устройств, от будильников до стиральных машин, не поддерживает /etc/localtime и /usr/share/zoneinfo (Glibc vs. uClibc differences). Необходимо использовать только переменную TZ, значение которой может быть глобально задано в файле /etc/TZ в качестве значения по-умолчанию. Символические имена для TZ типа Europe/Moscow тоже не допускаются. Значение для Москвы выглядит таким образом:
MSK-3MSD,M3.5.0,M10.5.0/3
Тут написано: часовой пояс MSK, три часа к западу, летний пояс MSD на час больше, действует с последнего воскресенья марта, по последнее воскресенье октября, смена пояса происходит в 3 часа. Для произвольного часового пояса можно составить используя описание Environment Variable Definition.
В настоящее время, шкала времени на Земле построена на атомных стандартах частоты и называется TAI, хотя на практике используется другая шкала — UTC, отличающаяся от TAI на целое число секунд. Находясь в некоторой точке на Земле можно заметить, что местное гражданское время устанавливается административно, и, как правило, отличается на целое количество часов от UTC, момент восхода Солнца зависит от долготы вашего положения, и только UTC остается постоянным во всех точках Земли в один и тот же момент времени.
glibc использует файл /etc/localtime для определение настроек по-умолчанию, обычно этот файл является либо копией, либо символической ссылкой на один из заранее приготовленных файлов в /usr/share/zoneinfo. Необходимо выбрать тот, который вам необходим и использовать его.
Второй способ — использование переменной среды окружения TZ, о которой рассказывается тут: TZ Variable. Переменная имеет несколько форматов, позволяющих либо напрямую задать свойства вашего часового пояса(смещение, относительно всемирного времени и моменты перехода на летнее/зимнее), либо использовать один из подготовленных файлов в /usr/share/zoneinfo(например Europe/Moscow). Утилита tzselect позволит вам правильно задать значение переменной, основываясь на вашем местоположении и знаниях географии. Переменную TZ, прописанную в .profile, можно использовать как альтернативный способ задания часового пояса для конкретного пользователя(например если он работает удаленно).
uclibc, который используется в busybox и множестве встраиваемых устройств, от будильников до стиральных машин, не поддерживает /etc/localtime и /usr/share/zoneinfo (Glibc vs. uClibc differences). Необходимо использовать только переменную TZ, значение которой может быть глобально задано в файле /etc/TZ в качестве значения по-умолчанию. Символические имена для TZ типа Europe/Moscow тоже не допускаются. Значение для Москвы выглядит таким образом:
MSK-3MSD,M3.5.0,M10.5.0/3
Тут написано: часовой пояс MSK, три часа к западу, летний пояс MSD на час больше, действует с последнего воскресенья марта, по последнее воскресенье октября, смена пояса происходит в 3 часа. Для произвольного часового пояса можно составить используя описание Environment Variable Definition.
Формат даты для RPM
Просто оставлю здесь команду для получения текущей даты в формате rpm-spec, для последующего вписывания в раздел %changelog
LANG=C date +"%a %b %d %Y"
%changelog
* Sat Oct 03 2009 - email@host.com
- log message
AVR32: Atmel NGW100
Рассказ о маленьком одомашненном роутере. В качестве роутера я использую Atmel NGW100 Network Gateway Kit, плату на процессоре AT32AP7000. Розничная цена, для справки, чуть менее $100. Один из серьезных недостатков — не имеет USB-host контроллера, однако может подсоединяться как USB-устройство, таким образом сразу до трех сетевых интерфейсов доступно для использования(два Ethernet и один USB). Две флеш-микросхемы по 8Mb, оперативная память — 32Mb, устройство для чтения SD-карт, вывод программатора JTAG и много выводов GPIO, которые могут быть использованы произвольным образом.
AVR32 — это RISC-архитектура процессоров, выпускаемых компанией Atmel, основанная на ARM. На двух флеш-модлях NGW100 расположен загрузчик U-Boot и файловые системы ОС Busybox/Linux. Все свежие исходники и готовые бинарные образы можно взять на сайте Atmel. Исходники представляют собой модифицированный BuildRoot, куда положены все необходимые для сборки и работы с архитектурой AVR32 патчи для GCC, U-Boot, Linux.
После года вполне успешной работы, я решил обновить систему на роутере, добавив туда блек-джек и шлюх новых приложений. Процессор AT32AP7000 экспортирует терминал через COM-порт, поэтому кабель RS232 облегчает работу с платой: соедините ваш компьютер и NGW100 и используйте minicom или какой-нибудь другой терминал для связи, вам будет доступна командная строка загрузчика U-Boot(необходимо быстро нажать пробел, когда об этом просят, иначе начинается загрузка), а так-же командная строка ОС, когда она загрузится. Так-же приветствуется наличие TFTP-сервера на вашем компьютере, поскольку загрузка образов через KERMIT происходит достаточно долго. Исходники и инструкции для сборки полностью доступны на сайте Atmel.
К процессу конфигурации и сборки никаких комментариев добавить невозможно, поскольку тут все достаточно очевидно и инструкции доступны. После распаковки исходников:
# make atngw100_defconfig
# make menuconfig
# make source
# make
После компиляции получится три файла: образ u-boot, образ корневой файловой системы и /usr в формате jffs2. Все образы также доступны в готовом виде на сайте Atmel.
На странице AVRFreaks Firmware_upgrade доступны исчерпывающие инструкции по обновлению микрокодов. Общая схема обновления примерно следующая: находясь в командной строке загрузчика uBoot необходимый образ загружается в оперативную память, используя тот или иной канал связи(TFTP, KERMIT, SD-карта, etc.); снимается защита с нужного участка флеш-памяти и образ копируется на флеш-память. Загрузчик uBoot, корневая файловая система и настройки uBoot располагаются на первом флеш-модуле, файловая система /usr полностью занимает второй. Чтобы обновить загрузчик, можно воспользоваться либо программкой flash-upgrade, доступной на сайте Atmel, либо непосредственно загрузить образ uBoot, как описывается на сайте AVRFreaks. Если при обновлении загрузчик окажется поврежден, то для его восстановления понадобится программатор JTAG.
Проверьте, чтобы у вас загружается правильное ядро, у меня почему-то получилось так, что загрузчик искал ядро в /uImage, а лежало оно в /boot/uImage. для этого нужно соответствующим образом изменить переменную окружения загрузчика (bootcmd=fsload /boot/uImage;bootm). На странице U-Boot command reference есть полный список команд U-Boot с описаниями.
Обновление корневой файловой системы выглядит следующим образом: загружается её образ, очищается место для корневой системы, образ копируется на флеш. Команда копирования принимает три аргумента, последний из которых — размер копируемой области в шестнадцатеричном формате:
> set ipaddr 192.168.0.50
> set serverip 192.168.0.1
> tftp 0x90000000 rootfs.avr32.jffs2-root
> protect off 0x20000 0x7EFFFF
> erase 0x20000 0x7EFFFF
> cp.b 0x90000000 0x20000 0xSIZE
> protect on all
Обновление файловой системы /usr производится из успешно(но с ошибками из-за рассогласования версий файловых систем) загруженной операционной системы, вначале образ загружается в директорию /tmp (обратите внимание, что /tmp смонтирован в ramdisk, попытка временно разместить образ в другом месте не увенчается успехом по двум причинам: не хватит места, скорость записи на флеш очень медленная), устройство /dev/mtd3 отмонтируется, очищается и туда копируется содержимое образа:
> tftp -g -r rootfs.avr32.jffs2-usr 192.168.0.1
> flash_eraseall /dev/mtd3
> dd if=/tmp/rootfs.avr32.jffs2-usr of=/dev/mtd3 bs=1056
> reboot
Обновленная операционная система полностью готова к дальнейшей настройке и использованию.
Небольшое добавление: почему-то busybox 1.13.1 обладает очень интересным поведением: ifup гасит DHCP-клиент сразу после того, как тот получит IP-адрес, это означает, что когда аренда адреса истечет, никто её не обновит. Поэтому перед сборкой busybox надо найти busybox.config в target/device и выключить там опцию CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP, включив CONFIG_APP_UDHCPC.
Будет использовать DHCP-клиент из набора busybox, однако в такой конфигурации он будет запущен постоянно.
Еще одно небольшое добавление: возможно придется использовать патч busybox-1.13.1-bindtodevice.patch, исправляющий проблемы с падением udhcpc во время попытки обновить аренду.
AVR32 — это RISC-архитектура процессоров, выпускаемых компанией Atmel, основанная на ARM. На двух флеш-модлях NGW100 расположен загрузчик U-Boot и файловые системы ОС Busybox/Linux. Все свежие исходники и готовые бинарные образы можно взять на сайте Atmel. Исходники представляют собой модифицированный BuildRoot, куда положены все необходимые для сборки и работы с архитектурой AVR32 патчи для GCC, U-Boot, Linux.
После года вполне успешной работы, я решил обновить систему на роутере, добавив туда блек-джек и шлюх новых приложений. Процессор AT32AP7000 экспортирует терминал через COM-порт, поэтому кабель RS232 облегчает работу с платой: соедините ваш компьютер и NGW100 и используйте minicom или какой-нибудь другой терминал для связи, вам будет доступна командная строка загрузчика U-Boot(необходимо быстро нажать пробел, когда об этом просят, иначе начинается загрузка), а так-же командная строка ОС, когда она загрузится. Так-же приветствуется наличие TFTP-сервера на вашем компьютере, поскольку загрузка образов через KERMIT происходит достаточно долго. Исходники и инструкции для сборки полностью доступны на сайте Atmel.
К процессу конфигурации и сборки никаких комментариев добавить невозможно, поскольку тут все достаточно очевидно и инструкции доступны. После распаковки исходников:
# make atngw100_defconfig
# make menuconfig
# make source
# make
После компиляции получится три файла: образ u-boot, образ корневой файловой системы и /usr в формате jffs2. Все образы также доступны в готовом виде на сайте Atmel.
На странице AVRFreaks Firmware_upgrade доступны исчерпывающие инструкции по обновлению микрокодов. Общая схема обновления примерно следующая: находясь в командной строке загрузчика uBoot необходимый образ загружается в оперативную память, используя тот или иной канал связи(TFTP, KERMIT, SD-карта, etc.); снимается защита с нужного участка флеш-памяти и образ копируется на флеш-память. Загрузчик uBoot, корневая файловая система и настройки uBoot располагаются на первом флеш-модуле, файловая система /usr полностью занимает второй. Чтобы обновить загрузчик, можно воспользоваться либо программкой flash-upgrade, доступной на сайте Atmel, либо непосредственно загрузить образ uBoot, как описывается на сайте AVRFreaks. Если при обновлении загрузчик окажется поврежден, то для его восстановления понадобится программатор JTAG.
Проверьте, чтобы у вас загружается правильное ядро, у меня почему-то получилось так, что загрузчик искал ядро в /uImage, а лежало оно в /boot/uImage. для этого нужно соответствующим образом изменить переменную окружения загрузчика (bootcmd=fsload /boot/uImage;bootm). На странице U-Boot command reference есть полный список команд U-Boot с описаниями.
Обновление корневой файловой системы выглядит следующим образом: загружается её образ, очищается место для корневой системы, образ копируется на флеш. Команда копирования принимает три аргумента, последний из которых — размер копируемой области в шестнадцатеричном формате:
> set ipaddr 192.168.0.50
> set serverip 192.168.0.1
> tftp 0x90000000 rootfs.avr32.jffs2-root
> protect off 0x20000 0x7EFFFF
> erase 0x20000 0x7EFFFF
> cp.b 0x90000000 0x20000 0xSIZE
> protect on all
Обновление файловой системы /usr производится из успешно(но с ошибками из-за рассогласования версий файловых систем) загруженной операционной системы, вначале образ загружается в директорию /tmp (обратите внимание, что /tmp смонтирован в ramdisk, попытка временно разместить образ в другом месте не увенчается успехом по двум причинам: не хватит места, скорость записи на флеш очень медленная), устройство /dev/mtd3 отмонтируется, очищается и туда копируется содержимое образа:
> tftp -g -r rootfs.avr32.jffs2-usr 192.168.0.1
> flash_eraseall /dev/mtd3
> dd if=/tmp/rootfs.avr32.jffs2-usr of=/dev/mtd3 bs=1056
> reboot
Обновленная операционная система полностью готова к дальнейшей настройке и использованию.
- ATNGW100 Network Gateway Kit
- Wikipedia: AVR32
- U-Boot
- AVR32 Open Source
- BuildRoot
- AVRFreaks Firmware_upgrade
- U-Boot command reference
Небольшое добавление: почему-то busybox 1.13.1 обладает очень интересным поведением: ifup гасит DHCP-клиент сразу после того, как тот получит IP-адрес, это означает, что когда аренда адреса истечет, никто её не обновит. Поэтому перед сборкой busybox надо найти busybox.config в target/device и выключить там опцию CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP, включив CONFIG_APP_UDHCPC.
Будет использовать DHCP-клиент из набора busybox, однако в такой конфигурации он будет запущен постоянно.
Еще одно небольшое добавление: возможно придется использовать патч busybox-1.13.1-bindtodevice.patch, исправляющий проблемы с падением udhcpc во время попытки обновить аренду.
D-Bus
D-Bus -- это шина сообщений или один из способов взаимодействия процессов между собой в операционной системе GNU/Linux, используемая практически во всех современных дистрибутивах. Выполняемые процессы часто хотят взаимодействовать между собой; пайпы(pipes), общая память(shared memory), RPC, и т.п. -- все это обеспечивает обмен информацией между ними.
D-Bus представляет свой альтернативный способ такого взаимодействия. Сам демон dbus занимается маршрутизацией сообщений, рассылаемый приложениями друг другу. Концепция dbus примерно следующая: существуют
Каждое подключение к демону имеет свое имя, например org.kde.kopete.
Таким образом приложения, зная друг друга по такому имени, могут работать с объектами друг друга.
Возникает вопрос, а как нам узнать конкретные пути объектов и имена методов, чтобы можно было сделать что-то действительно полезное? В этом помогает способность объектов смотреть внутрь себя, подобно одноименному методу психологических исследований. Каждый объект, даже если о нем заранее ничего не известно, имеет интерфейс org.freedesktop.DBus.Introspectable в котором есть один вызов Introspect.
Попросим у корневого объекта подключения org.freedesktop.DBus рассказать о себе:
В ответ возвращается строка, содержащая XML файл с описанием, из которого можно узнать, какие доступны интерфейсы, какие в них есть методы и какие есть дочерние узлы, т.е. объекты типа /Name
Узнать имена подключений:
Следует отметить, что существуют системная (--system) и сессионая (--session) шины. Первая из них общая для всех процессов, вторая предназначена для пользовательских процессов и запускается в момент входа в систему (например запуска сессии KDE).
Получить массив, содержащий список контактов запущенного kopete:
Сделает погромче музыку:
Выключит компьютер (без всяких root'овских прав):
В качестве заключения, d-bus к сожалению умеет хорошо работать лишь в рамках одного компьютера.
Ссылка на сайт: http://dbus.freedesktop.org
D-Bus представляет свой альтернативный способ такого взаимодействия. Сам демон dbus занимается маршрутизацией сообщений, рассылаемый приложениями друг другу. Концепция dbus примерно следующая: существуют
- объекты, которым ставятся в соответствие их пути с целью адресации, например /org/freedesktop/Hal/devices/computer;
- каждый объект имеет один или более интерфейсов, например org.freedesktop.DBus.Introspectable;
- каждый интерфейс содержит набор методов и сигналов, методы можно вызывать как функцию, передавая параметры и получая возвращаемое значение, а на сигналы можно подписываться и получать уведомления в соответсвующий момент.
Каждое подключение к демону имеет свое имя, например org.kde.kopete.
Таким образом приложения, зная друг друга по такому имени, могут работать с объектами друг друга.
Интроспекция
Возникает вопрос, а как нам узнать конкретные пути объектов и имена методов, чтобы можно было сделать что-то действительно полезное? В этом помогает способность объектов смотреть внутрь себя, подобно одноименному методу психологических исследований. Каждый объект, даже если о нем заранее ничего не известно, имеет интерфейс org.freedesktop.DBus.Introspectable в котором есть один вызов Introspect.
Попросим у корневого объекта подключения org.freedesktop.DBus рассказать о себе:
dbus-send --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.Introspectable.Introspect
В ответ возвращается строка, содержащая XML файл с описанием, из которого можно узнать, какие доступны интерфейсы, какие в них есть методы и какие есть дочерние узлы, т.е. объекты типа /Name
Несколько примеров
Узнать имена подключений:
dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply / org.freedesktop.DBus.ListNames
Следует отметить, что существуют системная (--system) и сессионая (--session) шины. Первая из них общая для всех процессов, вторая предназначена для пользовательских процессов и запускается в момент входа в систему (например запуска сессии KDE).
Получить массив, содержащий список контактов запущенного kopete:
dbus-send --dest=org.kde.kopete --type=method_call --print-reply /Kopete org.kde.Kopete.contacts
Сделает погромче музыку:
dbus-send --dest=org.mpris.amarok --type=method_call --print-reply /Player org.freedesktop.MediaPlayer.VolumeSet int32:95
Выключит компьютер (без всяких root'овских прав):
dbus-send --system --dest=org.freedesktop.Hal --type=method_call --print-reply /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
В качестве заключения, d-bus к сожалению умеет хорошо работать лишь в рамках одного компьютера.
Ссылка на сайт: http://dbus.freedesktop.org
Подписаться на:
Сообщения (Atom)