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

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

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


Суббота
19. Май 2012


face
Дистрибутивы SUSE/openSUSE используют в работе консольный менеджер пакетов zypper, настройки которого скрыты далеко от глаз пользователя и далее мы рассмотрим их.
zypper работает на базе движка ZYpp (или libzypp) и поэтому имеется два конфигурационных файла, это /etc/zypp/zypp.conf и /etc/zypp/zypper.conf
Рассмотрим, что можно сделать с помощью того и другого.

zypp.conf

arch = s390
Параметр определяющий архитектуру процессора и, соответственно, того какие пакеты будет использовать zypper. По умолчанию архитектура определяется автоматически и менять значение данного параметра строго не рекомендуется. Если это всё же происходит, то придётся заново скачать и установить все пакеты, которые были установлены ранее и отличаются от заданной вновь архитектуры. Всё же это является способом для смены архитектуры всего установленного ПО в системе, к примеру, если вы установили сборку под i586, а ваш процессор поддерживает 64-хбитную архитектуру.

cachedir = /var/cache/zypp
Параметр отвечающий за местоположение кэша zypper. По умолчанию это /var/cache/zypp

metadatadir = /var/cache/zypp/raw
Каталог для хранения метаданных, которые загружаются из репозиториев. По умолчанию это {cachedir}/raw, где {cachedir} это значение параметра cachedir. Изменение значения требует последующего обновления и загрузки метаданных из всех подключенных репозиториев.

solvfilesdir = /var/cache/zypp/solv
Каталог для хранения файлов .solv, получаемых в результате обработки загруженных метаданных из репозиториев. По умолчанию это {cachedir}/solv, где {cachedir} это значение параметра cachedir.

packagesdir = /var/cache/zypp/packages
Путь к каталогу в котором будут храниться загружаемые пакеты. По умолчанию это {cachedir}/packages, где {cachedir} это значение параметра cachedir.

configdir = /etc/zypp
Каталог хранения конфигурационного файла. По умолчанию это /etc/zypp

reposdir = /etc/zypp/repos.d
Путь к каталогу, в котором должны храниться файлы .repo с данными подключенных репозиториев. Значение по умолчанию {configdir}/repos.d, где {configdir} это значение параметра configdir.

servicesdir = /etc/zypp/services.d
Каталог хранения файлов .service. По умолчанию это {configdir}/services.d, где {configdir} это значение параметра configdir.

repo.add.probe = false
Проверка доступа к репозиторию при его добавлении. По умолчанию отключена и проверка осуществляется при первом вызове команды zypper ref. Полезно включить, если у вас бывают проблемы с доступом к репозиториям.

repo.refresh.delay = 60
Параметр определяющий промежуток времени в минутах до следующего автообновления метаданных подключенных репозиториев. По умолчанию его значение равно 10 минутам. При значении 0, автообновление метаданных будет происходить каждый раз. Не влияет на то, будет происходить автообновление вообще или нет.

repo.refresh.locales = ru
Список локалей по которым zypper должен определять, описания пакетов на каком языке он должен получать с метаданными. Не все репозитории это поддерживают, а описания на английском языке загружаются в любом случае.

download.max_concurrent_connections = 5
Количество одновременных соединений при загрузке пакетов. По умолчанию значение равно 5.

download.min_download_speed = 0
Минимальная скорость загрузки (задаётся в байтах в секунду) перед разрывом соединения. Параметр может использоваться для предотвращения атак на серверы предоставляющие обновления на очень низкой скорости. По умолчанию ограничение не установлено.

download.max_download_speed = 0
Максимальная скорость загрузки (задаётся в байтах в секунду). Ограничения по умолчанию нет.

download.max_silent_tries = 5
Максимальное количество попыток подключения к репозиторию, которое автоматически будет производиться без обращения к пользователю.

download.use_deltarpm = true
Параметр отвечающий за то, отдавать предпочтения пакетам в .delta.rpm или простым .rpm пакетам. Использование .delta.rpm позволяет уменьшить нагрузку на сетевой трафик, но при этом создание пакета rpm для последующей установки будет производиться на локальной машине, что на короткое время увеличит нагрузку на оперативную память и процессор.

download.use_deltarpm.always = false
Параметр указывающий zypp всегда использовать deltarpm. Не имеет эффекта, если параметру download.use_deltarpm задано значение true.

download.media_preference = download
Параметр определяющий предпочтение источнику загрузки пакета при наличии одинаковой его версии в обоих типах источников. Источником для данного параметра служит web-репозитории и медиа-носитель (CD, DVD). Доступные значения для параметра - download (загружать из web-репозиториев) и volatile (предпочитать медиа-носитель). По умолчанию установлено первое. 

commit.downloadMode =
Политика транзакций zypp. Возможные значения:
DownloadOnly - только загружать пакеты в кэш без дальнейшей установки.
DownloadInAdvance - сначала загрузить все пакеты в кэш, потом начать установку.
DownloadInHeaps - порционная загрузка и установка пакетов

vendordir = /etc/zypp/vendors.d
Определение каталога содержащего файлы описаний специфичных для разных поставщиков типа nvidia. По умолчанию это {configdir}/vendor.d, где {configdir} это значение параметра configdir.

solver.onlyRequires = false
Устанавливать только необходимые зависимости пакетов. Параметр позволяющий избежать предложений установки рекомендуемых пакетов, в число которых входят языковые пакеты, а также требуемые для какого-либо аппаратного обеспечения. По умолчанию отключено.

solver.allowVendorChange = false
Разрешить по умолчанию смену поставщика при обновлении (действует как zypper dup вместо zypper up). Строго не рекомендуется к включению и по умолчанию отключено.

solver.cleandepsOnRemove = false
Параметр указывающий удалять зависимости пакета при его удалении. По умолчанию отключено и строго не рекомендуется.

solver.checkSystemFile = /etc/zypp/systemCheck
Файл содержащий список пакетов необходимых для работы запущенной системы. Служит для информирования пользователя при попытке удаления пакетов из системы, которые есть в списке. По умолчанию содержит только glibc и расположен в {configdir}/systemCheck, где {configdir} это значение параметра configdir.

solver.upgradeTestcasesToKeep = 2
Параметр указывающий сколько тестов разрешения зависимостей следует сохранять при апгрейде дистрибутива (так называется выполнение операции zypper dup). Тесты размещаются в /var/log/updateTestcase-, где - дата выполнения zypper dup. Результаты тестов разрешения зависимостей нужны, чтобы прилагать их к сообщениям об ошибках в https://bugzilla.novell.com/, в случае их возникновения. Чтобы отключить сохранение этих тестов, выставьте значение "0". Если хотите сохранять все отчёты о тестах, то следует выставить значение "-1". По умолчанию равно 2.

solver.upgradeRemoveDroppedPackages = true
Параметр предписывает удалять пакеты отсутствующие в репозиториях на момент выполнения апгрейда (zypper dup). По умолчанию включено.

multiversion = provides:multiversion(kernel)
Значение параметра определяет какие одинаковые пакеты имеющие разные версии могут быть установлены в систему. В значение принимается как название пакетов, так и то, что ими предоставляется. По умолчанию список пуст.

multiversion.kernels = latest,running
Список пакетов предоставляющих ядро Linux, которые могут сосуществовать в системе параллельно друг другу. По умолчанию не удаляется любое ядро, если в предыдущем параметре задано значение provides:multiversion(kernel). Пакеты могут определяться следующим образом:

2.6.32.12-0.7 - Определённая версия ядра
latest             - Последняя версия ядра
latest-N         - Последнее ядро имеющее версию, определённую вместо "N"
running         - Оставлять ядро, которое запущенно в данный момент
oldest           - Оставлять ядро с самой старой версией (так называемое GA (Genetic Algorithm) ядро)
oldest+N      - То же, что и предыдущее, но с определением версии ядра

locksfile.path = /etc/zypp/locks
Определение местоположения lock-файла. По умолчанию это {configdir}/locks, где {configdir} это значение параметра configdir. Значение может быть любым.

locksfile.apply = true
Блокирование lock-файла сразу после запуска zypp. По умолчанию включено.

update.datadir = /var/adm
Каталог в котором будут располагаться "элементы обновления". Под таковыми подразумеваются сообщения и скрипты. По умолчанию это каталог /var/adm.

update.messagesdir = /var/adm/update-messages
Каталог для хранения сообщений при обновлении. По умолчанию это {update.datadir}/update-messages, где {update.datadir} это значение параметра update.datadir.

update.scriptsdir = /var/adm/update-scripts
Каталог для хранения скриптов при обновлении. По умолчанию это {update.datadir}/update-scripts, где {update.datadir} это значение параметра update.datadir.

update.messages.notify = single | /usr/lib/zypp/notify-message -p %p
Параметр определяющий поведение zypp при работе с сообщениями, которые поступают от обновляемых пакетов. zypp может подготовить сообщение об обновлении и перенаправить его содержимое в выбранном формате на командную строку. Формат сообщений может быть следующим:
single - отправлять сообщение в командную строку по отношению к каждому сообщению об обновлении.
none   - не использовать перенаправление, сразу отправлять сообщение в командную строку.
digest - один вызов командной строки на все сообщения обновлений.
bulk   - один вызов командной строки на всё содержимое всех сообщений, разделяемых по нажатию Ctrl-L.

Возможные сокращения для подстановки:
%p     - идентификатор пакета вида название-версия-релиз.архитектура
%P     - полный путь к файлу с сообщениями обновлений

Значение по умолчанию: single | /usr/lib/zypp/notify-message -p %p

rpm.install.excludedocs = no
Исключить из устанавливаемых пакетов файлы документации. Позволяет немного сэкономить дисковое пространство. По умолчанию отключено.

history.logfile = /var/log/zypp/history
Местоположение файла для истории выполненных операций. Лог истории описан на странице http://en.opensuse.org/Libzypp/Package_History. По умолчанию это /var/log/zypp/history

credentials.global.dir = /etc/zypp/credentials.d
Каталог для хранения данных о полномочиях (credentials). По умолчанию это /etc/zypp/credentials.d

credentials.global.file = /etc/zypp/credentials.cat
Путь к файлу содержащему список пользователей вида логин:пароль для доступа к libzypp. По умолчанию это /etc/zypp/credentials.cat

zypper.conf

Конфигурационный файл непосредственно самого zypper может быть не только системным и располагаться в /etc/zypp/, но и пользовательским. Во втором случае он должен иметь путь $HOME/.zypper.conf


Секция [main]

showAlias = false
Отображать псевдоним репозитория вместо его названия. По умолчанию отключено.

repoListColumns = Anr
Столбцы, которые должны отображаться в выводе команды 'zypper lr' (вывести список всех репозиториев). Доступные значения (возможны любые их сочетания):

a - псевдоним репозитория
n - название репозитория
r - статус использования автообновления репозиторием
u - ссылка
p - приоритет
Номер и статус репозитория будут отображаться в любом случае. Значение по умолчанию: anr

Секция [solver]

installRecommends = no
Параметр отвечающий за установку мягких зависимостей (рекомендуемых пакетов). По умолчанию включено.

forceResolutionCommands = remove
Параметр указывает поведение zypper при разрешении зависимостей. По умолчанию происходит удаление. Возможные значения (могут быть просто перечислены): remove, install, update, patch, verify
При указанном вручную параметре --no-force-resolution, значение в конфигурационном файле эффекта не имеет.

Секция [color]

useColors = never
Параметр определяет использовать ли zypper цветовую окраску при выводе. Значение по умолчанию - never, то есть никогда не использовать. Кроме never возможны значения always (всегда) и autodetect (автоопределение).

background = dark
Значение определяет фон в выводе zypper. Доступны значения dark (тёмный) и light (светлый). По умолчанию фон тёмный (dark).

result = white
Цвет вывода результатов операций zypper. Доступные значения: любой цвет (по-английски).

msgStatus = grey
Цвет статусных сообщений и отображающегося прогресса выполнения операций. По умолчанию - серый (grey). Доступные значения: любой цвет (по-английски).

msgError = red
Цвет сообщений об ошибках. По умолчанию красный (red). Можно указать любой другой (по-английски).

msgWarning = yellow
Цвет предупреждений. По умолчанию жёлтый (yellow). Можно указать любой другой (по-английски).

highlight = lightcyan
Цвет подсветки вывода zypper. По умолчанию светло-голубой (lightcyan). Можно указать любой другой (по-английски).

promptOption = grey
Цвет диалогов. По умолчанию серый (grey). Можно указать любой другой (по-английски).

Секция [obs]

baseUrl = http://download.opensuse.org/repositories/
Базовый путь к репозиториям openSUSE Build Service. Используется при обработке таких запросов как obs://project/platform URI

platform = openSUSE_11.3
Целевая платформа для репозиториев openSUSE Build Service. Используется при обработке таких запросов как obs://project/platform URI


Словарь терминов:


Service - клиентская часть протокола Repository Index Service (RIS) для управления пакетами. Repository Index Service (RIS) в отличие от обычного репозитория может предлагать более одного репозитория программного обеспечения, которые в свою очередь могут быть изменены администратором или поставщиком сервиса. Repository Index Service является расширением службы Novell Update специально для управления обновлениями SUSE Linux Enterprise.

Product - группа пакетов необходимая для установки определённого продукта (такого как openSUSE, openSUSE-Addon-NonOss или codecs-set).


Дополнительные ресурсы информации:



Вторник
15. Май 2012


face

Всем привет. В одной из прошлых статей я писал о мультипротокольном кроссплатформенном мессенджере MDC. Напомню, MDC – мессенджер с поддержкой протоколов ICQ, Mail.ru и других. Но главной его фишкой является возможность хранить историю на сервере и объединять контакты из разных протоколов. На момент написания статьи в моем репозитории был собран пакет MDC.

С тех пор много воды утекло. Был открыт исходный код MDC. Но почему-то его разработка была заброшена. На сегодняшний день последней версией мессенджера так и осталась 1.0.4.3. В связи с этим  я не придал значения тому, что с выходом openSUSE 12.1 не был собран rpm-пакет для этой версии дистрибутива. И как оказалось, напрасно. На почту мне стали приходить письма с просьбой собрать rpm-пакет MDC для последней версии дистрибутива openSUSE. Должен признать, что по причине занятости я немного повременил со сборкой. Но теперь пакет собран и выложен в моей домашнем репозитории. Прошу любить и жаловать.

Если у вас еще не добавлен мой репозиторий:

#zypper ar http://download.opensuse.org/repositories/home:/tuoma/openSUSE_12.1/  home:tuoma

И устанавливаем MDC:

#zypper in mdc

Для любителей поклацать мышкой, все тоже самое можно сделать в YaST :)

В свою очередь хотелось бы выразить сожаление по поводу того, что мессенджер пока не развивается. Задумка довольно таки интересная и реализация неплохая. Так что будем надеяться, что разработчики продолжат в ближайшем будущем развивать свое детище по имени MDC.

Искренне ваш.



face

Поскольку я планирую неоднократно обращаться к теме создания и модификации систем размещения данных и их модификации средствами YaST, для ориентировки в этом подразделе размещаю его общее содержание. (more…)


face

А теперь давайте вернёмся в начальное окно программы Partitioner, вспомним, что там внизу слева притулился пункт Настройки и посмотрим, что же через него можно настроить. (more…)


face

Большинство опций монтирования — общие для всех файловых систем. С них-то мы и начнём — на примере файловой системы ext4, рассматриваемой в качестве опорного умолчального варианта. (more…)


face

А теперь давайте вернёмся немного назад и посмотрим, как можно управлять параметрами форматирования раздела в зависимости от определённой для него файловой системы. И начнём с умолчальной ext4. (more…)


face

При запуске Partitioner’а для начала появляется грозное окно, вопрошающее нас — а вообще понимаем ли мы, что творить собрались? (more…)


face

Наконец-то собрался с силами сравнить быстродействие файловой системы ext4 с различными опциями журналирования и без журнала вовсе. На сей предмет у меня на диске ещё при инсталляции был припасён неразмеченный пуско диска размером около 45 настоящих гигабайт. Теперь настало время его разметить, разместить на нём соответствующую файловую систему и пристУпить. (more…)


Понедельник
14. Май 2012


face
Менеджер пакетов в Arch Linux по умолчанию не очень сильно функционален, но зато имеет как минимум три "обёртки":
  1. pacmatic
  2. powerpill
  3. yaourt
Что удивительно: если о последних двух в рунете достаточно информации, то о первом почему-то ни слова, хотя он упоминается в Enhancing Arch Linux Stability.

Появился он не так давно, но уже явно используется. Что же отличает его от оригинального pacman и собратьев?
  • Каждый раз при запуске ищет файлы *.pacnew в /etc, после чего, в случае их нахождения, предлагает обновить существующие. При этом каждый файл сравнивается с помощью diff. Изменения можно просмотреть, пропустить, либо удалить (когда и так всё хорошо, например). То есть некая функциональность dispatch-conf. Всё это происходит в vimdiff.
  • Проверяет rss ленту Arch и выводит новости в консоль перед обновлением (выглядит это не очень привлекательно)
Если этих причин кому-то будет достаточно, то вперёд:
yaourt -Sy aur/pacmatic

Суббота
12. Май 2012


face

Чтобы уверенно обращаться с относительными важно запомнить несколько простых условных обозначений. (more…)


face

Путь к файлу или каталогу (path) определяет их точное положение в файловой иерархии. Различаются пути абсолютные и относительные. (more…)


face

Как было сказано в предыдущей шпаргалке, вид приглашения командной строки может быть настроен в очень широких пределах. Обычно этим пользуются и майнтайнеры дистрибутивов, и пользователи, осознавшие важность этой, казалось бы, косметической опции. (more…)


Пятница
11. Май 2012


face

На предыдущих страницах я рассказал обо всех новшествах, которые меня лично интересовали больше всего. Но не обо всех, которые имеют место быть в версии 4.10. (more…)


face

Второе из обещанных новшеств свежей версии Xfce — это режим тайлинга в её оконном менеджере. Достижение чего тоже требует некоторых, хотя и несложных, действий. (more…)


Четверг
10. Май 2012


face
Завтра (10-го мая 2012) в 0:00 UTC (03:00 по московскому времени) произойдёт запланированное отключение части инфраструктуры openSUSE. Простой ожидается примерно в течение 3-х часов, что может затронуть openSUSE wiki (например en.opensuse.org и соответственно ru.opensuse.org), проекты использующие wordpress (news.opensuse.org и lizards.opensuse.org) и форум forums.opensuse.org.


Среда
09. Май 2012


face

Чтобы ознакомиться с новыми возможностями главной управляющей панели Xfce, вызываем через пункт Настройки стартового меню Диспетчер настроек, который, если мне не изменяет память, выглядит точно так же, как и в предыдущих версиях: (more…)


face

Ожидание выхода Xfce 4.10 прогрессивной общественностью во многом было обусловлено давно обещанными новыми возможностями её интерфейса. И ожидания эти оказались не напрасными: изменений в интерфейсе среды оказалось не очень много, и они не носили революционного характера, как в некоторых других средах (на которые не будем указывать пальцем). Но все они — реально полезны. (more…)


Вторник
08. Май 2012


face

Рассказывая об установке среды Xfce, я забыл упомянуть об одном обстоятельстве, которое может быть важным для многих: о пакетах языковой поддержки. Без них даже в правильно русифицированной средствами, например, YaST системе, эта среда будет говорить с вами на чистейшем английском языке. (more…)


Воскресенье
06. Май 2012


face

ВНИМАНИЕ!!! Следуйте советам, приведенным ниже, только в том случае, если вы четко понимаете, что вы делаете. Автор не несет ответственности за любые последствия, вызванные манипуляциями, о которых пойдет речь далее.

Продолжение. Начало тут

Теперь самое время, посмотреть чего же мы все-таки добились нашими действиями. Ведь первоначальная задача стояла во включении ASPM для PCI Express. Кстати, предварительно не мешает указать в параметрах ядра pcie_aspm=force и перегрузиться. # dmesg | grep ASPM

[ 0.000000] PCIe ASPM is forcibly enabled

[ 1.783332] ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it

[ 1.931463] ACPI _OSC control for PCIe not granted, disabling ASPM

Как видим, ядро выругалось на метод _OSC и не захотело включать ASPM. Собственно, метод _OSC определяет возможности и детали некоторого устройства и является дочерним для этого устройства.

Теперь смотрим, что же с ним не так.

# dmesg | grep _OSC

[ 1.921997] \_SB_.PCI0:_OSC invalid UUID

[ 1.921999] _OSC request data:1 8 1f

[ 1.931408] \_SB_.PCI0:_OSC invalid UUID

[ 1.931409] _OSC request data:1 1f 1f

[ 1.931413] pci0000:00: Requesting ACPI _OSC control (0x1d)

[ 1.931457] \_SB_.PCI0:_OSC invalid UUID

[ 1.931459] _OSC request data:1 0 1d

[ 1.931462] pci0000:00: ACPI _OSC request failed (AE_ERROR), returned control mask: 0x1d

[ 1.931463] ACPI _OSC control for PCIe not granted, disabling ASPM

То есть можно сделать вывод о том, что методу _OSC не понравился идентификатор нашей шины PCI. Лезем в спецификацию ACPI и смотрим пример реализации этого метода для шины PCI Express. После чего ищем этот метод в нашем исходнике DSDT. У меня например до правки он был таким:

Device (PCI0) // Это начало секции PCI

{

//буфер, который теоретически содержит правильный идентификатор и с которым производится сравнение

Name (GUID, Buffer (0×10)

{

/* 0000 */ 0x5B, 0x4D, 0xDB, 0×33, 0xF7, 0x1F, 0x1C, 0×40,

/* 0008 */ 0×96, 0×57, 0×74, 0×41, 0xC0, 0x3D, 0xD7, 0×66

})

Name (SUPP, Zero)

Name (CTRL, Zero)

//Собственно сам метод

Method (_OSC, 4, Serialized)

{

Store (Arg3, Local0)

CreateDWordField (Local0, Zero, CDW1)

CreateDWordField (Local0, 0×04, CDW2)

CreateDWordField (Local0, 0×08, CDW3)

If (LAnd (LEqual (Arg0, GUID), NEXP))

{

Store (CDW2, SUPP)

Store (CDW3, CTRL)

If (Not (And (CDW1, One)))

{

If (And (CTRL, One))

{

NHPG ()

}

If (And (CTRL, 0×04))

{

NPME ()

}

}

If (LNotEqual (Arg1, One))

{

Or (CDW1, 0×08, CDW1)

}

If (LNotEqual (CDW3, CTRL))

{

Or (CDW1, 0×10, CDW1)

}

Store (CTRL, CDW3)

Store (CTRL, OSCC)

Return (Local0)

}

Else

{

Or (CDW1, 0×04, CDW1)

Return (Local0)

}

}

 

После правки метод _OSC (привожу только его):

 

Method (_OSC, 4, Serialized)

{

Store (Arg3, Local0)

CreateDWordField (Local0, Zero, CDW1)

CreateDWordField (Local0, 0×04, CDW2)

CreateDWordField (Local0, 0×08, CDW3)

// Check for proper UUID

If(LEqual(Arg0,ToUUID(“33DB4D5B-1FF7-401C-9657-7441C03DD766″)))

{

Store (CDW2, SUPP)

Store (CDW3, CTRL)

If(LNotEqual(And(SUPP, 0×16), 0×16))

{

And(CTRL,0x1E,CTRL)

}

And(CTRL,0x1D,CTRL)

If (Not (And (CDW1, One)))

{

If (And (CTRL, One))

{

NHPG ()

}

If (And (CTRL, 0×04))

{

NPME ()

}

}

If (LNotEqual (Arg1, One))

{

Or (CDW1, 0×08, CDW1)

}

If (LNotEqual (CDW3, CTRL))

{

Or (CDW1, 0×10, CDW1)

}

Store (CTRL, CDW3)

Store (CTRL, OSCC)

Return (Local0)

}

Else

{

Or (CDW1, 0×04, CDW1)

Return (Local0)

}

}

После этого нужно опять скомпилировать нашу таблицу DSDT и снова проделать манипуляции по включению ее в initrd, описанные выше.

После этого вот что мне сказал dmesg:

~> dmesg | grep _OSC

[ 1.941655] pci0000:00: Requesting ACPI _OSC control (0x1d)

[ 1.942228] pci0000:00: ACPI _OSC control (0x1d) granted

~> dmesg | grep ASPM

[ 0.000000] PCIe ASPM is forcibly enabled

[ 1.785347] ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it


Последняя строка должна нас смутить. Лезем в исходники ядра:

static int __init acpi_pci_init(void)

{

int ret;

 

if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) {

printk(KERN_INFO”ACPI FADT declares the system doesn’t support MSI, so disable it\n”);

pci_no_msi();

}

if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) {

printk(KERN_INFO”ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it\n”);

pcie_no_aspm();

}

ret = register_acpi_bus_type(&acpi_pci_bus);

if (ret)

return 0;

pci_set_platform_pm(&acpi_pci_platform_pm);

return 0;

}

и видим, что эта запись выводится в том случае, если ACPI сообщает о том, что ASPM не поддерживается. Но как мы помним, благодаря патчу от Мэтью Гаррета ASPM будет все-равно включен.

И напоследок хочу напомнить вам, что если у вас процессор core iX, то результата эти действия не принесут. Думаю, это из-за того, что контроллер PCI Express встроен в процессоры Intel Core iX. В этом случае лучше уж приобрести рулонный газон и украсить свой сад. Пользы будет больше и отличный фон для кустарников и деревьев будет радовать не только ваш глаз, но и ваших близких и друзей.

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

До новых встреч.



face

ВНИМАНИЕ!!! Следуйте советам, приведенным ниже, только в том случае, если вы четко понимаете, что вы делаете. Автор не несет ответственности за любые последствия, вызванные манипуляциями, о которых пойдет речь далее.

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

Как я уже писал в предыдущей статье, проблема с ASPM в Линуксе была решена включением патча от Мэтью Гаррета в ядро linux начиная с версии 3.3.

Патч действует только в системах, в которых в сообщениях ядра появляется «ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it».

В принципе, в большинстве случаев вполне достаточно обновиться до новой версии ядра и проблема исчерпана. Но, к сожалению, не всегда все гладко получается и в этом случае. Самый главный подводный камень кроется в реализации ACPI производителем ноутбука.

Справка из вики:

Интерфейс ACPI организуется путём размещения в определённой области оперативной памяти нескольких таблиц, содержащих описание аппаратных ресурсов и программных методов управления ими. Каждый тип таблицы имеет определённый формат, описанный в спецификации. Кроме того, таблицы, содержащие методы управления устройствами и обработчики событий ACPI, содержат код на языке AML (ACPI Machine Language) — машинно независимый набор инструкций, представленный в компактной форме. Операционная система, поддерживающая ACPI, содержит интерпретатор AML, который транслирует инструкции AML в инструкции центрального процессора, выполняя таким образом методы или обработчики событий.

Некоторые из этих таблиц полностью или частично хранят статические данные в том смысле, что от запуска к запуску системы, они не изменяются. Статические данные, как правило, создаются производителем материнской платы или BIOS и описываются на специальном языке ASL (ACPI Source Language), а затем компилируются в представление на AML.

Так вот, по каким-то совершенно непонятным причинам разработчики BIOS не считают нужным придерживаться стандартов в описании таблиц. В пору, конечно, в очередной раз заподозрить разработчиков в сговоре с пресловутым Мелкософтом. Впрочем, многие производители железа грешат составлением совместных бизнес планов с разработчиками софта. Судить, о том, насколько подобное бизнес планирование выгодно для обоих, не будем. Можем лишь предположить, что если звезды зажигаются… то есть такие договоренности происходят, значит это кому-то нужно. Впрочем, не стоит сбрасывать со счетов и банальную халатность.

Итак, прежде всего нас интересует таблица DSDT, которая содержит описание устройств материнской платы. Для того чтобы нам ее получить, нужно сначала обзавестись необходимым инструментарием. Для этого ставим пакет acpica. После чего выполняем команды:

# acpidump > myacpi.dat

# acpixtract -a myacpi.dat

В результате мы получим все таблицы в бинарном виде. Для того, чтобы получить исходник таблицы DSDT:

# iasl -d DSDT.dat

На выходе мы получаем файл DSDT.dsl, который можно просмотреть обычным текстовым редактором и в случае знания языка ASL, даже что-то понять :) Мы же пойдем методом научного тыка. Пробуем скомпилировать полученный исходник обратно в бинарный вид:

# iasl -sa DSDT.dsl

В результате мы получим файл DSDT.aml и кучу ошибок в консоли :) Например:

 

DSDT.dsl 3060: Name (_T_1, Zero)

Remark 5111 – Use of compiler reserved name ^ (_T_1)

DSDT.dsl 3061: Name (_T_0, Zero)

Remark 5111 – Use of compiler reserved name ^ (_T_0)

DSDT.dsl 4191: Method (WM00, 3, NotSerialized)

Warning 1088 – ^ Not all control paths return a value (WM00)


Собственно, указывается номер строки в исходнике и содержимое ошибки.

Первые 2 ошибки говорят о том, что используется имя, зарезервированное компилятором и устраняются довольно просто. Достаточно заменить _T_X на T_X. Третья ошибка, как вы понимаете, указывает на то, что в методе не всегда возвращается какое-либо значение. Идем к нужной строке и смотрим содержимое метода:

 

Method (WM00, 3, NotSerialized)

{

Store (“00″, MTNM)

If (LEqual (Arg1, 0×06))

{

WMIS (Arg1, Arg2)

Return (DI00)

}

}

Как видим, в случае не выполнения условия If метод действительно не вернет ничего. Допишем его так:

Method (WM00, 3, NotSerialized)

{

Store (“00″, MTNM)

If (LEqual (Arg1, 0×06))

{

WMIS (Arg1, Arg2)

Return (DI00)

}

Return (0×00)

}


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

У меня в результате получилось:

 

Intel ACPI Component Architecture

ASL Optimizing Compiler version 20110316-64

Copyright (c) 2000 – 2011 Intel Corporation

ASL Input: DSDT.dsl – 10014 lines, 336764 bytes, 3609 keywords

AML Output: DSDT.aml – 36671 bytes, 862 named objects, 2747 executable opcodes

Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 17 Optimizations


Даже если вы не знаете языка ASL, можно обратиться в гугл, способы исправления основных ошибок в исходнике ASL, как правило, уже давно описаны на многих форумах.

После правки таблицы DSDT нам нужно каким-то образом указать ядру использовать именно его. Один и возможных способов — это включить ее в initrd. Для этого выполняем команды:

 

# cat DSDT.aml >> /boot/<Имя_нового_initrd>

# cat /boot/<Имя_существующего_initrd> >> /boot/<Имя_нового_initrd>


После этого правим секцию загрузчика, и указываем Начальный RAM-диск как /boot/<Имя_нового_initrd>, после чего перегружаемся, выбирая исправленную секцию при загрузке.

Теперь смотрим, как определилась наша таблица DSDT:

 

# dmesg | grep DSDT

[ 0.000000] DSDT ACPI table found in initrd – size: 36671

[ 0.000000] ACPI: DSDT @ 0x0000000096ff0000 Phys table override, replaced with:

[ 0.000000] ACPI: DSDT 0000000096e2f000 08F3F (v01 ACRSYS ACRPRDCT 00000000 INTL 20110316)

[ 1.832955] ACPI: EC: Look up EC in DSDT


Как мы видим, наша правленная таблица была успешно подхвачена из initrd.

Продолжение следует.

 



face

Так или иначе, но думаю, что с установкой Xfce мы справимся. Теперь надо обеспечить её запуск. Сделать это, понятно, можно самыми разными способами. (more…)


face

Пользователи openSUSE получили возможность знакомства с Xfce 4.10 практически одновременно со всем прогрессивным человечеством. Чтобы полюбоваться новой версией, им надо для начала подключить дополнительный репозиторий. (more…)


face

В последних числах апреля сего года свершилось событие, которого так долго ожидали все, кто так и не смог до конца проникнуться величием большевистской мысли KDE 4-й ветки, и кто, тем более, не примкнул к меньшевикам с GNOME 3 и его Shell’ом. А именно, вышел релиз версии 4.10 рабочей среды Xfce. Который не замедлил появиться и в репозитории openSUSE. (more…)


face
Способы сделать резервную копию корневого раздела, который находится в режиме чтения-записи и активно используется:

  • С помощью tar:

# tar --one-file-system -jcf /mnt/another/backup.tar.bzip2 /


Затарит, после чего сожмёт с помощью bzip2.
Аналогичным образом можно сделать бэкап сжатый gzip:

# tar --one-file-system -zcf /mnt/another/backup.tar.gzip /


А можно вообще ничем не сжимать:

# tar --one-file-system -cf /mnt/another/backup.tar /



  • С помощью fsarchiver:

# fsarchiver savefs -Aaz 9 /mnt/another/backup.fsa /dev/sda1


Получается архив lzma максимального сжатия. Опции "A" и "a" указывают не обращать внимания на то, что раздел смонтирован rw и не использовать Acl и user-xattr. Минус данного способа очевиден: нужно иметь fsarchiver на live cd, если разворачивать бэкап предполагается с него.

  • С помощью cp
Как ни странно бэкап можно сделать простым копированием:

# cp -ax / /mnt/another/backup


Плюс такого метода очевиден - скорость работы, но бэкап опять же получается не сжатым и будет занимать ценные гигабайты. 
-a, --archive
По возможности сохраняет структуру и атрибуты исходных файлов при копировании (но не сохраняет структуру каталогов). Эквивалентно заданию опций -dpPR.
-x, --one-file-system
Пропускать подкаталоги, которые расположены на файловых системах, отличных от той, где начиналось копирование.


  • С помощью YaST(2)

Для YaST2 существует модуль yast2-backup, посредством которого возможно создание резервных копий довольно в простом и удобном способе. Примечание: если вы собираетесь не только создавать резервные копии, но и восстанавливать когда-нибудь из них то, что зарезервировано, то логично будет также установить модуль yast2-restore. Рассмотрим создание резервной копии корневого раздела с ручным запуском:
Запустите YaST и в разделе "Система" зайдите в модуль "Резервирование системы":
Добавьте новый профиль из меню кнопки управления профилями. Профиль можно назвать, например, "system backup" (только без кавычек). Следующим шагом будет указание расположения архива с резервной копией и выбор типа архива:
В следующем окне ничего изменять не требуется, если только вы не знаете точно что вам это действительно нужно:
Шаг 3-й и последний - ограничение поиска. Здесь можно задать исключения, например, добавить каталог /home:
Вы вернётесь к главному окну, где выбрав созданный профиль, можно будет создать резервную копию простым нажатием одноимённой кнопки.

Дополнительная информация:

face

download.opensuse.org

Как сообщил Will Stephenson download.opensuse.org отмечает 1-е мая. То есть, к сожалению, ещё не совсем оправился после внезапной и трагической смерти двух жёстких дисков обеспечивающих его работу. Рекомендуется использовать зеркала для доступа к пакетной базе репозиториев. Список зеркал можно найти здесь.

Информация для тех, кто не знает как заменить адрес репозитория на его зеркало:

Для замены адреса репозитория на его зеркало, запустите YaST2, либо yast и зайдите в модкль управления репозиториями программного обеспечения:
Выберите репозиторий и нажмите на кнопку "Редактировать":
В открывшемся окне "Сервер и каталог" при выбранном пункте замените "Редактировать весь URL" замените download.opensuse.org на адрес из нового зеркала, например, mirror.yandex.ru/opensuse (я использую зеркала Яндекса, потому что Яндекс локален для моего провайдера)
Аналогично нужно поступить со всеми остальными репозиториями. Данную операцию также можно проводить путём редактирования файлов *.repo находящихся в /etc/zypp/repos.d

Packman

packman.inode.at в не рабочем состоянии и список его зеркал вы можете найти здесь. В списке кстати почему-то отсутствует зеркало packman на Яндексе, которое даёт определённые преимущества для пользователей в России. А вот скрипт на перле от Pascal Bleser для замены адреса репозитория packman:
perl -p -i.old -e \
's,^(baseurl=).*(/suse/.+)$,${1}http://ftp.halifax.rwth-aachen.de/packman${2}, if /^baseurl=.*packman\.inode\.at.*/' \
/etc/zypp/repos.d/*packman*.repo

Суббота
05. Май 2012


face

Хочу напомнить, что для всех русскоязычных пользователей openSUSE есть переводы официальной документации. Documentation Team предоставляет возможность отправлять им переводы, и наша команда не перестает работать над его улучшением. Обновляя периодически пакеты в documentation-репозитории, мы стараемся создать как можно более качественную и понятную документацию для русскоязычных новичков в GNU/Linux.
Каждый из вас может следить за процессом перевода. Для этого совсем не обязательно вникать в процесс работы команды переводчиков, “клонировать” git-хранилища или что-то в этом роде. Просто подключите documentation-репозиторий и установите/обновите интересующие вас пакеты:

> sudo zypper ar -f \
http://download.opensuse.org/repositories/Documentation/openSUSE_Factory Documentation

> zypper se 'opensuse*_ru*'
Loading repository data...
Reading installed packages...

S | Name                      | Summary                                          | Type      
--+---------------------------+--------------------------------------------------+-----------
  | opensuse-kvm_ru-pdf       | openSUSE manual: KVM Guide (PDF, Russian)        | package   
  | opensuse-manuals_ru       | Complete set of openSUSE Manuals (HTML, Russian) | package   
  | opensuse-manuals_ru       | Complete set of openSUSE Manuals (HTML, Russian) | srcpackage
  | opensuse-reference_ru-pdf | openSUSE manual: Reference (PDF, Russian)        | package   
  | opensuse-security_ru-pdf  | openSUSE manual: Security Guide (PDF, Russian)   | package   
  | opensuse-startup_ru-pdf   | openSUSE manual: Start-Up (PDF, Russian)         | package   
  | opensuse-tuning_ru-pdf    | openSUSE manual: Tuning Guide (PDF, Russian)     | package

> sudo zypper in opensuse-startup_ru-pdf
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  opensuse-startup_ru-pdf 

1 new package to install.
Overall download size: 9.4 MiB. After the operation, additional 10.0 MiB will be used.
Continue? [y/n/?] (y): 
Retrieving package opensuse-startup_ru-pdf-12.1.8762-27.7.noarch (1/1), 9.4 MiB (10.0 MiB unpacked)
Retrieving: opensuse-startup_ru-pdf-12.1.8762-27.7.noarch.rpm [done (1.6 MiB/s)]
Installing: opensuse-startup_ru-pdf-12.1.8762-27.7 [done]

> rpm -ql opensuse-startup_ru-pdf
/usr/share/doc/manual/opensuse-startup_ru-pdf
/usr/share/doc/manual/opensuse-startup_ru-pdf/book.opensuse.startup_ru.pdf
/usr/share/help/opensuse-startup_ru-pdf.document

> okular /usr/share/doc/manual/opensuse-startup_ru-pdf/book.opensuse.startup_ru.pdf &


face

В одном из прежних набросков мы занимались настройкой внешнего вида YaST — но это относилось только к его запуску в среде KDE. Очевидно, что в других рабочих средах команды типа kdesu и systemsettings ничем не помогут за их отсутствием. (more…)


Пятница
04. Май 2012


face
Многие пользователи Linux используют виртуальные машины и у каждого свои причины. Выбор инструментов для этого только падает зачастую по принципу популярности, наличия под рукой простой инструкции. Я и сам раньше использовал VirtualBox именно по причине кажущейся простоты. Чего там... скачать и установить средства разработки типа gcc, make, исходников ядра и чего-нибудь вместе с самим VirtualBox и надеяться, что проблем не возникнет. Но в openSUSE благодаря YaST2, и модулю yast2-vm существует способ работы с виртуальными машинами намного проще, не прибегая к помощи консоли и страшных команд.

Почему kvm, а не VirtualBox

  • kvm уже в ядре Linux и поэтому вам не нужно компилировать модули стороннего производителя типа Oracle
  • kvm поддерживает аппаратную виртуализацию, которая существует в процессорах довольно давно, что позволяет достичь следующего пункта
  • Производительность использования процессора, которая заметна сразу "не вооружённым взлядом"
  • KSM, снижающий использование оперативной памяти хоста гостевыми операционными системами
  • Возможность выбора клиента для графики (qemu-kvm, spicy, spice-client, клиенты к vnc)

Установка и первый запуск

Сразу после установки модуля yast2-vm, в меню приложений появится подменю "Виртуализация" с такими пунктами как:

  1. Relocation Server Configuration (примечание: перенос конфигурации сервера)
  2. Установить гипервизор и инструменты
  3. Создание виртуальных машин

Это меню KDE. Легко можно обойтись и без него, так как всё это доступно и в YaST:

Что ж, установим таки гипервизор и инструменты.
Но прежде чем начинать, подключите репозиторий Virtualization, так как на данный момент только в нём libvirt имеет поддержку Spice. Если вы работаете в XFCE, то убедитесь, что в автозагрузке у вас есть агент аутентификации PolicyKit или он хотя бы просто запущен. Следующий скриншот должен помочь вам в решении этой задачи:
В ином случае вы получите сообщение об ошибке о невозможности авторизации пользователя.
YaST даёт на выбор KVM и Xen. Я выбрал KVM просто потому что, мне не хотелось переустанавливать модуль ядра для видеокарты от Nvidia, так как при выборе Xen устанавливается другое ядро. После выбора гипервизора, YaST предложит установить необходимые пакеты для работы, на что, естественно, стоит согласиться. По завершении установки пакетов YaST предложит настроить сетевой мост. Вся настройка опять же заключается в ответе "Да" на заданный вопрос. Также от вас потребуется (о, ужас!) - перезагрузить систему:
Собственно, после перезагрузки система будет готова заводить виртуальные машины. Что тоже является достаточно тривиальной задачей:
Для того, чтобы создать виртуальную машину, выберем в меню пункт "Создание виртуальных машин" и после ввода пароля запустится помощник создания виртуальных машин, который сразу расскажет зачем он вообще нужен:
Следующим шагом будет выбор существующего образа или же установка ОС с нуля:
Поскольку предполагается, что мы это делаем впервые, то логично выбрать именно первый пункт, то есть "Мне необходимо установить операционную систему."
После чего помощник предлагает выбрать ОС, которую вы собираетесь устанавливать. В качестве примера я выбрал openSUSE 12, а устанавливать буду openSUSE 12.2 Milestone 3.

В следующем (последнем) окне производятся окончательные настройки, такие как имя и описание виртуальной машины, начальный и максимальный объём памяти, количество процессоров для виртуальной машины и другие параметры, в том числе и указание источника загрузки:
Вот и всё. После нажатия на кнопку "ОК" начинается волшебство и запускается собственно загрузка с образа (или что вы там указали загружать ;))

В случае чего, настройки виртуальной машины доступны в virt-manager. А о том как использовать SPICE с виртуальной машиной хорошо описано здесь.

  Интеграция мыши и общий буфер обмена

К сожалению, данный функционал не активируется по умолчанию, хотя пользователи VirtualBox, например, к такому наверняка уже привыкли и относятся как к чему-то обыденному. Начнём с первого. На данный момент единственным способом получить "интеграцию мыши" с kvm является использование SPICE, о котором я кратко упомянул выше. И именно поэтому установка kvm, virt-manager и прочего должна производиться из репозитория Virtualization. В openSUSE 12.2 этого делать скорее всего не придётся, так как поддержка SPICE будет уже интегрирована. Также потребуется spice-vdagent, который обеспечивает механизм для взаимодействия ресурсов гостевой ОС и хоста (такие как интеграция мыши и общий буфер). Взять его можно в репозитории домашнего проекта robverduijn. На всякий случай упомяну и про spice-xpi - плагин для браузеров совместимых с Mozilla plugin API (например Firefox и Chromium): его вы можете найти в репозитории у jasonbrooks. Итак, собственно, как использовать чудо SPICE?
Установите клиент из репозитория Virtualization:
zypper in -r Virtualization spice-client


В менеджере виртуальных машин (virt-manager) откройте виртуальную машину и в меню вид выберите пункт "Подробности". Здесь добавьте в список оборудования графический сервер SPICE:
После чего добавьте канальное устройство spicevmc:

После запуска виртуальной машины, к ней будет можно подключиться с помощью одного из клиентов spice. Выбор не велик: это либо консольный spice-client, либо spicy из пакета spice-gtk. Подключение с помощью первого осуществляется посредством команды
spicec --host 0.0.0.0 -p 5900


Подсказка: возврат мыши от гостевой ОС к хосту делается сочетанием клавиш Shift+F12.

Подключение с помощью графического клиента из spice-gtk осуществляется из его (spicy) окна в котором остаётся прописать только порт:
Обратите внимание, что в spicy меню "Options" присутствуют пункты о мыши, буфере обмена, размере экрана и т.д., однако, на данный момент они мало чем полезны, так как гостевой ОС нужен агент spice. Установим и добавим его в автозагрузку:
zypper in -r 'Spice (openSUSE_12.1)' spice-vdagent





chkconfig spice-vdagentd on


Рекомендую сделать перезагрузку. При следующей загрузке в статусной строке spicy вы должны увидеть сообщение mouse: client, agent: yes
А элементарная проверка покажет совместную работу хоста и гостя с буфером обмена:

Общие папки

Общие папки достаточно просто добавляются с помощью virt-manager:
В виртуальной машине вам останется только смонтировать каталог командой
mount -t 9p -otrans=virtio,version=9p2000.L /hostshare_name /destination_folder

Где /hostshare_name - название каталога, который вы выбрали на хосте, а /destination_folder - пункт назначения в гостевой системе. Результат сих операций таков:

Дополнительная полезная информация и использованные ресурсы:

face

Вчера вечером, случайно найдя видео на youtube о Lords of the Realm II, мысленно погрузился в детство. Как же приятно окунуться в воспоминания о том прекрасном времени, навеяные той музыкой. Мне было тогда лет 10-11, и программы, за которыми я провел тогда столько времени, я люблю до сих пор.
Итак, что же такое Lords of the Realm II? Это пошаговая стратегия с тактическими битвами в реальном режиме, разработанная Impressions Games и изданная компанией Sierra Entertainment в конце 1996 года. Возможно вы слышали об играх серии Total War. Они были популярны где-то в 2005/06 году, т.е. почти через 10 лет после выхода Lords of the Realm II. Однако в них нет ничего нового. Ничего нового, кроме графики. Первый шаг в направлении этого жанра был сделан именно Sierr’ой, и сделан он был настолько успешно, что на года занял сердца и умы юных игровых стратегов :) 15 лет прошло с момента выхода этой замечательной игры, однако до сих пор геймеры обсуждают её на многих игровых форумах.

Я думаю, что этот пост не был бы столь интересен, если бы я не рассказл о том, как запустить Lords of the Realm II сегодня. Да не просто запустить, а в GNU/Linux, да что б без необходимости установки Windows.
Что ж… без проблем ;)
На “игровой” машине у меня openSUSE 12.1 с дефолтным (свободным/открытым) nvidia видео-драйвером. Никаких лишних телодвижений делать не надо. Просто устанавливаем wine:

> sudo zypper in wine

После этого ищем ISO образ самого диска. Я его нашел тут. Скачиваем, запускаем:

> wine LotR2RusSetup.exe

Запускается инсталлятор. У меня русифицированный ISO образ, поэтому в окне установщика вместо букв каракули. Это ничуть не затрудняет процесс устновки, т.к. ничего важного в процессе спрашивать не будут. Единственное, что я не сразу понял, это вопрос о расположении игры: С:/Programm_Files/Lords of the Realms 2? Сначала я переписал адрес на /home/alex/games, но этого делать не стоит. Надо просто кликать “далее” (или как там оно называется). Прокликав “далее”, и прождав пару минут, я установил игру. Все (где-то сотня файлов) копируется в ~/.wine/drive_c/Program Files/Lords of the Realms 2, в том числе и LORDS2.EXE. Теперь просто запускаем его в том же wine и… наслаждаемся игрой :)

> wine LORDS2.EXE

Разрешение экрана автоматически переключается на 256 цветов, и никаких проблем с запуском игры нет.



Воскресенье
29. Апрель 2012


face
Проект Packman, который на протяжении многих лет благородно служил поставщиком всяких мультимедиа программ и прочего не свободного программного обеспечения, наконец-то обзавёлся собственным багтрекером. Теперь туда можно отправлять запросы на добавление пакетов и собственно сообщения об ошибках.

Об этом сообщает Pascal Bleser в своём блоге.

Старые записи в блогах ->