четверг, 26 февраля 2009 г.

Редактирование тегов mp3 в Linux (Debian)

Решил объединить две статьи о редактировании id3-тегов в mp3-файлах, попутно обновив часть перекодирование тегов. Раньше я выполнял перекодирование id3-тегов из CP1251 в Unicode с помощью самосборного deb-пакета mp3unicode. Через некоторое время я нашёл ей более подходящую альтернативу в репозитории Debian.

Введение

У меня есть довольно большая коллекция музыки в формате mp3. Естественно большую коллекцию нужно каким-то образом упорядочивать, очень помогают в этом теги id3.

Если я граблю новый компакт-диск в mp3-файлы, в первую очередь в простановке тегов может помочь cd-text - информация, которая может находиться уже на самом диске. Затем, если cd-text на диске не обнаружен, стоит попытаться воспользоваться функцией поиска информации на сервере cddb. При наличии неполной информации в тегах можно воспользоваться сервером MusicBrainz для получения недостающих полей.

Если я копирую mp3-файлы у друзей, перед занесением в свою коллекцию, я проверяю наличие тегов. Бывает, что теги неполные, поэтому лучше запросить поиск информации на сервере cddb. Бывает, однако, что русскоязычных исполнителей в cddb найти не удаётся, поэтому приходится довольствоваться имеющимися тегами.

Теги id3 бывают трёх версий:
  • id3v1 - содержит поля "исполнитель", "альбом", "год", "композиция", "комментарий", "жанр",
  • id3v1.1 - содержит дополнительное поле "номер дорожки",
  • id3v2 - содержит гибкую структуру полей, позволяет добавлять собственные поля. (Собственно широко распространены две подверсии - id3v2.3 и id3v2.4, но для этой статьи это не важно).
Теги idv1 и id3v1.1 представляют собой практически одно и то же. Эти теги по стандарту поддерживают хранение информации только в кодировке ASCII, то есть поддерживает хранение только латинских букв, цифр и знаков препинания. Однако требования стандарта многие плееры и редакторы id3-тегов игнорируют, и считают что в тегах допустимы любые символы из системной 8-байтной кодировки. Естественно при смене системной кодировки символы вне диапазона ASCII будут отображаться неправильно. Поскольку на территории России широко распространена операционная система Windows, в большинстве случаев системной 8-байтовой кодировкой является cp1251. Становится понятно, что большинство mp3-файлов имеют теги в кодировке cp1251.

В Linux некоторые плееры позволяют указывать 8-байтную кодировку для idv3-тегов и для отображения информации в списке воспроизведения перекодируют текст на лету. Другие плееры занимают принципиальную позицию и строго придерживаются стандарта. Они отображают правильно только текст в ASCII-кодировке.

Однако выход из этой ситуации есть. Теги id3v2 поддерживают хранение текста в кодировке Unicode, и поэтому проблем с кодировками у них нет.

Так вот, когда ко мне попадают файлы с тегами id3v1 в кодировке cp1251, и для этих файлов не удалось найти информацию на сервере cddb, я могу воспользоваться программой, которая перекодирует id3v1-теги в теги id3v2.

Перекодирование id3-тегов из CP1251 в Unicode

Рецепт, видимо, подсмотрел здесь: http://vnaum.com/stuff/mp3tags.html Хотя не уверен, может быть взял из другого места.

Для этого ставим пакет mutagen, позволяющий редактировать различные виды музыкальных тегов:
# aptitude install python-mutagen
Переходим в каталог с музыкой, скопированной у друзей, пользующихся Windows. Ищем в текущем каталоге файлы по расширению mp3, для каждого из найденных файлов меняем кодировку, удаляем теги версии 1, записываем теги версии 2:
$ find . -iname "*.mp3" -print0 | xargs -0 mid3iconv -e CP1251 -d --remove-v1
Описание опций:
-d - выводить на экран исправленные теги,
-e [codepage] - исходная кодировка тегов,
-remove-v1 - удалить исходные теги версии 1.

Я перепробовал несколько программ для редактирования тегов, в том числе EasyTag и Kid3. Эти программы хорошо справляются с ASCII-текстом, но при использовании символов из Unicode, они обе сходят с ума и начинают прописывать в теги всякую чушь. К сожалению с их помощью я успел загубить теги в mp3-треках нескольких исполнителей, поэтому пользоватьcя в дальнейшем ими я не собираюсь.

Редактирование id3-тегов из графического интерфейса

Поиск в репозитории программ для редактирования id3-тегов из графического интерфейса дал следующие результаты:

1. Kid3 - использует KDE, в etch совершенно не пригоден для редактирования id3v2-тегов, хотя соответствующая форма для редактирования id3v2 имеется. В lenny научился понимать теги id3v2.3 и id3v2.4, вполне пригоден для редактирования. Имеется лишь одно небольшое неудобство - отсутствие дерева для навигации по файловой системе, заточен в первую очередь на индивидуальное редактирование тегов отдельных треков.

2. EasyTag - использует GTK, в etch проставлял id3v2-теги так, что некоторые программы их не понимали, в lenny не проверял, но скриншот сделал:

3. TagTool - использует GTK, совершенно кривое поделие,

4. Пакет mp3info-gtk и утилита gmp3info из него - подвержена той же болезни, что и её консольный собрат - поддерживает только id3v1 и id3v1.1.

Состоит из двух раздельных окон. В первом окне можно выбрать mp3-файл (только один), который будем редактировать. После выбора файла нужно нажать кнопку "Ok".

После этого первое окно закроется, откроется второе, в котором можно отредактировать теги выбранного файла. После закрытия второго окна программа завершается и для редактирования тегов другого файла нужно запускать её заново.

5. Ex Falso - использует GTK+ и библиотеку mutagen, программа отличная, пользуюсь с удовольствием. Все необходимые функции имеются.

Несколько особняком от графических утилит для редактирования id3-тегов стоит программа Picard, предназначенная для поиска информации о mp3-треках по базе данных MusicBrainz. Для собственно редактирования id3-тегов она малопригодна.

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

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

Для редактирования новых тегов, как я уже заметил выше по тексту, я пользуюсь программой Ex Falso.

Это GTK+ программа, поэтому выглядит она не очень красиво, но зато прекрасно умеет проставлять теги, которые одинаково правильно читаются в большинстве программ. Во всяком случае amaroK читает их прекрасно.

Установить программу лучше вместе с рекомендованными зависимостями:
# aptitude install --with-recommends exfalso
При этом также будут установлены плагины для получения информации из баз данных CDDB и MusicBrainz, которыми я успешно пользуюсь. Есть ещё довольно большое количество плагинов, один из которых может пригодиться и вам.

При обновлении с Etch на Lenny в Ex Falso пропал плагин, умеющий запрашивать информацию из MusicBrainz. Вместо него можно воспользоваться программой Picard, которую можно установить следующей командой:
# aptitude install picard
Выбору риппера компакт-дисков я посвятил отдельную статью CD-рипперы в Linux. Для прослушивания музыки пользуюсь в основном Amarok.

понедельник, 23 февраля 2009 г.

deb-пакет и сценарии для запуска PPPoE сервера

На всякий случай решил разместить собранный мною в предыдущей статье deb-пакет pppoe_3.8-3_i386.deb. Если кому понадобится, но лень собирать - можете взять готовый пакет по этой ссылке, он собран с pppoe-server, поддерживающим работу в режиме ядра.

Теперь продолжим настройку pppoe-server. Для запуска и остановки pppoe-server я набросал следующий сценарий /etc/init.d/pppoe-server:
#!/bin/sh

### BEGIN INIT INFO
# Provides:          pppoe-server
# Required-Start:    $network $syslog
# Required-Stop:     $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Roaring Peguin PPPoE server
# Description:       Roaring Peguin PPPoE server
### END INIT INFO

CONFIG=/etc/default/pppoe-server

if test -f $CONFIG
then
  . $CONFIG
else
  echo "PPPoE server: No config-file!"
fi

if test x$RUN = xno
then
  echo "PPPoE Server: disabled."
  exit
fi

if test x"$OPTIONS" = x
then
  echo "PPPoE server: no options defined!"
  exit
fi

if test x$PIDFILE = x
then
  PIDFILE=/var/run/pppoe-server.pid
fi

case $1 in
  start)
    echo -n "Starting PPPoE server: "
    /usr/sbin/pppoe-server -F $OPTIONS &
    echo $! > $PIDFILE
    echo "pppoe-server."
    ;;
  stop)
    echo -n "Stopping PPPoE server: "
    kill `cat $PIDFILE`
    rm $PIDFILE
    echo "pppoe-server."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "Usage: $0 start|stop|restart"
  ;;
esac
Сразу же сделаем его исполняемым:
# chmod +x /etc/init.d/pppoe-server
Можно также сразу прописать ссылки на его запуск и остановку в каталоги rcX.d:
# update-rc.d pppoe-server defaults
Теперь займёмся настройкой сервера. Тут всё просто - все настройки сервера хранятся в файле /etc/default/pppoe-server. Настройки являются обычными переменными оболочки и их всего три:
# Run pppoe-server at startup
RUN="yes"

# Options, that provided to pppoe-server
OPTIONS="-k -I eth1 -L 192.168.0.1"

# File with PID of pppoe-server
PIDFILE="/var/run/pppoe-server.pid"
Переменная RUN задаёт, нужно ли запускать PPPoE сервер при загрузке системы (no - не запускать, yes или любое другое значение означает запускать).

Переменная OPTIONS задаёт опции, которые будут переданы напрямую в pppoe-server. Все настройки указанные в этой переменной были взяты из моей предыдущей статьи.

Переменная PIDFILE задаёт расположение файла, в котором хранится идентификатор работающего процесса pppoe-server. Если эта переменная не задана, по умолчанию будет использоваться файл /var/run/pppoe-server.pid.

На этом пока всё. Следующая цель - настройка pppoe-relay, хотя мне не на чем его тестировать: нужно три компьютера и две изолированные Ethernet-сети, подключенные к компьютеру, на которм будет запускаться pppoe-relay.

Ссылки:
How to LSBize an Init Script - как составить мета-теги в сценарии инициализации

Последнее редактирование: 10 мая 2009 года.

воскресенье, 22 февраля 2009 г.

Настройка PPPoE-сервера в Debian

Продолжаю тему пакета RP-PPPoE. На этот раз я решил настроить PPPoE-сервер из этого пакета. PPPoE-сервер, как и клиент, может работать в двух режимах: в режиме ядра и в пространстве пользователя.

Но прежде чем перейти к описанию настройки сервера, опишу настройки клиента. И клиент и сервер находятся в пакете pppoe Debian. Таким образом установка сервера и клиента весьма просты:
# aptitude install pppoe
1. Настройка тестового PPPoE-клиента

Клиент настраивался в режиме ядра, маршрут по-умолчанию не устанавливался, номер создаваемого интерфейса был прописан постоянным - 2.

Ниже - содержимое файла /etc/ppp/peers/dsl-provider, содержащий настройки тестового клиента:
user test
plugin rp-pppoe.so
eth1
noipdefault
usepeerdns
persist
noauth
#defaultroute
unit 2
Для пользователя test в файл /etc/ppp/chap-secrets добавим такую строчку:
test            *               testpasswd      *
На этом настройка клиента закончена. После того, как будет настроен сервер, мы установим подключение при помощи команды:
# pon dsl-provider
2. Настройка PPPoE-сервера в пространстве пользователя

Тут особых сложностей тоже не возникло. В файле /etc/ppp/pppoe-server-options были прописаны следующие опции:
auth
require-chap
ms-dns 81.30.199.5
ms-dns 81.30.199.94
noipdefault
noipx
nodefaultroute
noproxyarp
netmask 255.255.255.255
logfile /var/log/pppoe-server.log
Опция auth заставляет потребовать у удалённого клиента аутентификации, опция require-chap указывает способ аутентификации CHAP.

Опции ms-dns передают клиенту IP-адреса DNS-серверов, которые клиент воспринимает если в его настройках указазана опция usepeerdns.

Опция noipdefault не позвояет соглашаться с настройками IP-адресов, полученных от клиента, noipx отключает согласование протокола IPX, nodefaultroute запрещает добавлять маршрут по умолчанию через клиента, noproxyarp запрещает серверу создавать для клиентов ARP-записи на Ethernet-интерфейсах (эта опция нужна только если клиентам выдаются IP-адреса, пересекающиеся с IP-адресами Ethernet-сети, чтобы PPPoE-клиенты и компьютеры в локальной сети могли беспрепятственно обмениваться трафиком).

Опция "netmask 255.255.255.255" задаёт маску PPP-соединения у клиента и сервера, опция "
logfile /var/log/pppoe-server.log" предписывает вести серверу журнал. Пользы от этого журнала не очень много, т.к. в нём нет отметок времени.

По-умолчанию сервер передаёт в pppd также ещё и следующие опции: nodetach, noaccomp, nobsdcomp, nodeflate, nopcomp, novj, novjccomp, default-asyncmap.

Все опции по-умолчанию имеют приоритет над опциями из файла /etc/ppp/pppoe-server-options. Все опции, кроме первой и последней, отключают различные виды сжатия. Первая и последняя опции, на мой взгляд, спорные. Первая указывает pppd не отделяться от управляющего терминала. Какой может быть управляющий терминал, если pppd запущен из демона, то есть из программы, которая сама не имеет управляющего терминала? Последняя опция предписывает pppd не согласовывать параметр asyncmap и принудительно экранировать все управляющие символы, что не имеет особого смысла, поскольку Ethernet-среда ни коим образом не интерпретирует управляющие символы. Возможно эта опция предназначена для DSL-линии. Она, будучи последовательной линией, может использовать асинхронный режим приёма/передачи, в котором приёмник сообщает передатчику о готовности или неготовности к приёму информации с помощью специальных символов XON или XOFF.

Заведём тестового пользователя в файле /etc/ppp/chap-secrets на PPPoE-сервере, добавив строчку:
test            *               testpasswd              192.168.0.2
Последнее поле сообщает IP-адрес, который будет назначен этому клиенту в случае успешной аутентификации.

Теперь запустим сервер. У сервера есть несколько важных опций:
-I - задаёт имя интерфейса, на котором сервер будет ожидать соединений,
-L - задаёт собственный IP-адрес сервера внутри канала PPP,
-p - позволяет задать файл, содержащий список IP-адресов, выдаваемых клиентам внутри канала PPP,
-O - позволяет задать другой файл вместо используемого по умолчанию /etc/ppp/pppoe-server-options,
-N - позволяет указать максимальное количество одновременных соединений, по умолчанию 64.
Я запустил так:
# pppoe-server -I eth1 -L 192.168.0.1
Сервер запускается и переходит в фоновый режим. После этого запускаем на другом компьютере PPPoE-клиента:
# pon dsl-provider
Связь успешно установилась и на клиенте был создан интерфейс ppp2 с IP-адресами 192.168.0.2 и 192.168.0.1, на на сервере был создан интерфейс ppp0 с IP-адресами 192.168.0.1 и 192.168.0.2.
Теперь можно проверить работу связи. Для этого я на клиенте запустил команду:
$ ping -S 192.168.0.2 192.168.0.1
А на сервере запустил команду:
# tcpdump -i ppp0
Можно было увидеть, что клиент получает от сервера отклики на эхо-запросы, а сервер принимает и отправляет ICMP-сообщения "echo request" и "echo reply".

3. Настройка PPPoE-сервера в режиме ядра

Здесь, казалось бы, всё просто: добавляем серверу опцию -k и вперёд, но оказалось всё не так просто. В Debian pppoe-server собран без поддержки режима ядра и наотрез отказывается принимать опцию -k. Я решил собрать pppoe самостоятельно из deb-src. Направление для мыслей задал вот этот багрепорт: #298185 - pppoe-server: invalid option -- k - Debian Bug report logs. После долгого процесса копания по опциям получилось такое mini-how-to:

Устанавливаем зависимости для построения pppoe:
# apt-get build-dep pppoe
Скачиваем и распаковываем в текущий каталог исходники:
# apt-get source pppoe
Переходим в каталог rp-pppoe-3.8/src и выполняем конфигурирование:
# cd rp-pppoe-3.8/src
# ./configure
Теперь в только что созданном файле config.h нужно заменить строчку
/* #undef HAVE_LINUX_KERNEL_PPPOE */
на строчку
#define HAVE_LINUX_KERNEL_PPPOE 1
Теперь выходим из каталога src и выполняем сборку, указав путь к плагину rp-pppoe.so, который как раз и реализует поддержку PPPoE-сеансов на уровне ядра:
# cd ..
# ./debian/rules PLUGIN_PATH=/usr/lib/pppd/2.4.4/rp-pppoe.so
Собираем пакет и устанавливаем его:
# ./debian/rules binary
# cd ..
# dpkg -i pppoe_3.8-3_i386.deb
Заморозим пакет в системе, чтобы предотвратить его автоматическое обновление:
# echo pppoe hold | dpkg --set-selections
С этого момента нужно как минимум при каждом обновлении системы просматривать список обновлений. Если для pppoe будет выпущено обновление, закрывающее уязвимость, необходимо будет собрать пакет из свежих исходников заново, снять фиксацию пакета в системе с помощью команды:
# echo pppoe install | dpkg --set-selections
Затем заменить пакет новым и заново зафиксировать. Всё это - неизбежная плата за использование самосборного пакета. Конечно можно автоматизировать пересборку пакета, написав shell-скрипт, запускающий в нужной последовательности все указанные команды и заменяющий нужную строчку с помощью sed.

Так или иначе, теперь в системе установлен пакет с PPPoE-сервером, позволяющим поддерживать PPPoE-соединения на уровне ядра. Для запуска сервера в этом режиме, к команде описанной в предыдущем разделе нужно добавить опцию -k:
# pppoe-server -I eth1 -L 192.168.0.1 -k
Можно проверить связь так же, как это было описано выше, у меня всё заработало.

Осталось написать стартовые скрипты для запуска PPPoE-сервера и добавить их в систему.

суббота, 21 февраля 2009 г.

Эмуляторы VirtualBox и QEmu в Debian

Решил посмотреть на DragonFly BSD 2.2 и файловую систему Hammer. А для этого соответственно нужен компьютер. Запускать на настольном компе не хотелось, т.к. для этого пришлось бы отказаться от привычной "рабочей" среды. Поэтому я решил запустить DragonFly в эмуляторе - так и привычная среда останется на месте и смотреть на систему можно будет долго и внимательно :)

Решил попробовать два эмулятора - VirtualBox и QEmu.

Для начала решил поставить VirtualBox. Среда нормально запускалась, но эмулировать отказывалась наотрез - не признавала версию своего модуля ядра vboxdrv. Пробовал устанавливать пакет с модулем, собранным специально для моего ядра, но VirtualBox не хотел признавать и его.

Затем решил поставить QEmu. QEmu нормально запустился, всё-таки сообщив о том, что он не может получить доступ к устройству /dev/kqemu. Это устройство создаётся модулем ядра и позволяет существенно ускорить скорость эмуляции: этот модуль позволяет выполнять инструкции эмулируемого процессора непосредственно на реальном процессоре.

Собрать модуль kqemu мне тоже не удалось, компилятор ругался на отсутствие регистров rax и т.п. Это регистры 64-битного процессора. Не смотря на то, что я пользуюсь 32-битной системой, у меня установлено ядро linux-image-2.26-1-amd64, заточенное на 64-битный процессор. Соответственно для 64-битного ядра нужно собирать 64-битный модуль, а компилятор наотрез отказывался признавать существование 64-битных процессоров, поскольку сам был заточен на 32-битную среду.

Ну что ж, подумал я, копаться с компиляцией я не стану - это непроизводительная трата времени. И решил поставить ядро linux-image-2.26-1-686. После перезагрузки в новое ядро, как и ожидалось, у меня отвалился модуль nvidia. Я соответственно залогинился в консоли под root'ом и решил его восстановить, заодно установив и модуль kqemu:
# aptitude install module-assistant
# m-a a-i nvidia
# m-a a-i kqemu
Дальше я перезапустил kdm:
# /etc/init.d/kdm restart
И вошёл в KDE.

Теперь я решил вновь установить VirtualBox с модулями для нового ядра:
# aptitude install virtualbox-ose-modules-2.6.26-1-686 virtualbox-ose
Дальше нужно загрузить модуль ядра vboxdrv. Чтобы он сразу создал устройство /dev/vboxdrv с нужными правами доступа, перезапустим udev. Пакет добавил к udev новые правила и нужно, чтобы они вступили в силу:
# /etc/init.d/udev restart
Теперь подгрузим ядро и посмотрим права доступа к устройству /dev/vboxdrv:
# modprobe vboxdrv
# ls -la /dev/vboxdrv
Видим, что право доступа имеют пользователь root и группа vboxusers. Добавим себя в группу vboxusers (с сделал это с помощью vi):
# vi /etc/group
Теперь, чтобы получить права группы, в которую мы себя добавили, нужно перелогиниться. Я вышел и вошёл в KDE.
Запускаем VirtualBox OSE - графический интерфейс программы показался мне сильно похожим на Virtual PC, в котором я года два назад по необходимости запускал Windows 98.
Ниже - скриншот основного экрана программы с созданной виртуальной машиной DragonFly BSD.

К сожалению, практически сразу после загрузки с образа диска, система зависала и продолжала отъедать 70-99% процессорного времени компьютера, не подавая никаких признаков жизни:

Окно с изображением экрана эмулируемой системы захватывает клавиатуру. Чтобы эмулируемая система "отпустила" клавиатуру, нужно нажать комбинацию клавиш, указанную в строке статуса окна в правом нижнем углу, у меня это была правая клавиша Ctrl.

Никакие попытки поменять настройки эмулируемой машины не дали результата и загрузка системы неизбежно застывала на одном и том же месте. Попытки загрузить DragonFly BSD в безопасном режиме или режиме без поддержки ACPI результатов тоже не принесли.

Далее я решил попробовать QEmu. Система уже до этого зарекомендовала себя положительным образом, правда без поддержки эмуляции на уровне ядра системы. Именно поэтому я и решил попробовать VirtualBox, но он меня разочаровал, о чём и написано выше.

Итак, приведём в чувство установленный только что модуль kqemu. Во-первых, пакет с модулем kqemu тоже добавляет правило к udev, поэтому если вы не перезапустили udev при установке VirtualBox, сделайте это сейчас:
# /etc/init.d/udev restart
Подгрузим новый модуль ядра и посмотрим на права доступа к устройству:
# modprobe kqemu
# ls -la /dev/kqemu
Правила udev предписывают давать доступ на чтение и запись в это устройство любым пользователям системы. Если вы не хотите, чтобы это было так, можете создать группу для пользователей qemu и дать права доступа к устройству только им. Эти правила находятся в файле /etc/udev/rules.d/91-permissions.rules. Строчку:
KERNEL=="kqemu",                MODE="0666"
Можно заменить на такую:
KERNEL=="kqemu",                MODE="0660",                GROUP="kqemu"
Затем добавить в систему группу kqemu, перезапустить udev и перезагрузить модуль kqemu:
# groupadd kqemu
# /etc/init.d/udev restart
# rmmod kqemu
# modprobe kqemu
Теперь можете добавить себя в только что созданную группу и перелогиниться.

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

Продолжим установку qemu:
# aptitude install qemu
Теперь создадим файл размером 1 гигабайт, который будет использоваться в качестве образа диска эмулируемой системы. Для этого я воспользовался командой dd (официальная документация qemu рекомендует создавать образ дисков с помощью утилиты qemu-img):
# dd if=/dev/zero /home/stupin/dfbsd-disk.bin bs=1M count=1024
Запустить новую виртуальную машину можно таким образом:
$ qemu -cdrom /home/stupin/dfbsd-2.2.0_REL.iso -hda /home/stupin/dfbsd-disk.bin -boot d
Последняя опция указывает произвести загрузку с образа компакт-диска. Окно эмулируемой системы захватывает клавиатуру, отключить захват можно с помощью одновременного нажатия клавиш Ctrl и Alt (когда клавиатура захвачена, эта комбинация клавиш высвечивается в заголовке окна).

QEmu на удивление легко преодолел рубеж загрузки, на котором останавливался VirtualBox и я установил систему на виртуальный диск. С настройкой сети я пока не заморачивался, хотя без неё как без воздуха, разобраться с настройкой и настроить всё равно придётся. Кроме всего прочего, QEmu производит впечатление количеством эмулируемых архитектур (x86, x86_64, Sparc32, Sparc64, PowerPC, ARM, MIPS - в том числе поддерживается эмуляция одного процессора на другом) и возможностями проброса вовнутрь эмулируемой системы USB-устройств реального компьютера, возможностью создания снимков системы (все изменения, которые система будет производить с диском будут записываться в отдельный файл снимка, так что систему легко можно откатить до прежнего состояния), эмуляцией последовательный устройств ввода/вывода, эмуляции графических и сетевых адаптеров разных моделей.

Также в репозитории Debian я нашёл два графических интерфейса для запуска QEmu: qemu-launcher и qemulator.

Первый запускался и показывал окно с настройками, но образы виртуальных машин запускать отказывался:

Второй же оказался довольно приятным и вполне рабочим:

С помощью него я легко запустил ранее созданную с помощью консольной версии эмулятора виртуальную машину:

Дело осталось за немногим - разобраться с настройкой сети и можно будет пощупать Hammer.

Ссылки:
  1. Документация пользователя эмулятора процессора QEMU - перевод документации на русский язык, датированный 2006 годом. Описанного там вполне достаточно, чтобы понять что из себя представляет qemu и начать им пользоваться.
  2. QEMU - Debian - Linux - TUN/TAP - network bridge - документация по настройке сети. Её я изучу попозже и поподробнее.

среда, 11 февраля 2009 г.

Пакет RP-PPPoE

Решил объединить три своих заметки о пакете RP-PPPoE.

1. О пакете

RP-PPPoE (Roaring Peguin PPP over Ethernet) - это пакет программ, предназначенных для работы с PPPoE-соединениями. В пакет входят клиент, сервер, релей, различные служебные утилиты и сценарии, модуль для PPP-демона, обеспечивающий поддержку соединений PPPoE в режиме ядра Linux.

Пакет написан Дэвидом Сколлом, домашняя страница проекта находится по адресу http://www.roaringpenguin.com/pppoe/.

Клиента можно использовать для подключения к сети DSL-провайдера или Ethernet-провайдера, раздающего доступ к интернет через PPPoE-соединения. Сервер и агент ретрансляции можно использовать для построения серверов доступа небольших Ethernet-провайдеров.

2. Переводы man-страниц

2.1. man pppoe(8) - PPPoE-клиент пространства пользователя
2.2. man pppoe-server(8) - PPPoE-сервер пространства пользователя
2.3. man pppoe-relay(8) - PPPoE-агент ретрансляции пространства пользователя
2.4. man pppoe-sniff(8) - поиск в сети нестандартных кадров PPPoE
2.5. man pppoe-connect(8) - сценарий для управления каналом PPPoE
2.6. man pppoe-start(8) - сценарий для установки канала PPPoE
2.7. man pppoe-stop(8) - сценарий для закрытия канала PPPoE
2.8. man pppoe-setup(8) - сценарий для настройки PPPoE-клиента Roaring Penguin
2.9. man pppoe-status(8) - сценарий просмотра состояния канала PPPoE
2.10. man pppoe.conf(5) - файл конфигурации, используемый pppoe-start(8), pppoe-stop(8), pppoe-status(8) и pppoe-connect(8)
2.11. man pppoe-wrapper(1) − SUID-посредник для включения и отключения PPPoE-соединений

Переводы страниц руководства выполнены на сайте коллективных переводов http://translated.by. Несмотря на то, что это сайт коллективных переводов, в переводе мне никто не помогал, поэтому все переводы были выполнены мной.

Результаты перевода размещены на сайте http://manpages.ylsoftware.com/. Автор сайта http://ylsoftware.com/ Вадим Калинников aka MooSE любезно предложил место для размещения моих переводов man-страниц.

Несмотря на то, что в названии страниц 2.1-2.3 написано, что программы работают в пространстве пользователя, из самой документации чётко видно, что каждая программа может работать в связке с модулем ядра Linux.

На некоторых системах можно встретить сценарии 2.5-9 под именами, в которых pppoe заменено на adsl: adsl-connect, adsl-start, adsl-stop, adsl-setup и adsl-status. По содержанию это абсолютно те же самые сценарии.

Использования сценариев и конфигурационного файла, описанных в пунктах 2.5-2.11, на мой взгляд, следует избегать. В большинстве систем обычно имеются собственные сценарии настройки соединений точка-точка.

В частности, в Debian PPPoE-соединения нужно настраивать точно так же, как и любые другие PPP-соединения, создав соответствующий файл в каталоге /etc/ppp/peers. В этом файле нужно указать все необходимые опции демона pppd. Управлять соединениями можно с помощью сценариев pon и poff. Подробнее настройки рассмотрены ниже.

3. Модуль rp-pppoe.so

Перед тем, как приступить к описанию настройки, я хочу рассказать о модуле rp-pppoe.so демона pppd. Этот модуль работает в связке с модулем ядра Linux для поддержки PPPoE-соединений.

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

При обработке PPPoE-пакетов драйвером ядра переключений контекста не происходит. Это позволяет добиться высокой производительности PPPoE-содеинений и сильно снизить нагрузку на центральный процессор.

Модуль rp-pppoe.so входит в состав пакета pppd, однако документацию на него мне найти не удалось. Поэтому я решил заглянуть в webgit и посмотреть исходники плагина. На странице по ссылке http://git.ozlabs.org/?p=ppp.git;a=blob;f=pppd/plugins/rp-pppoe/plugin.c;h=e94494b96cc08587e05def9f7f1ec5023dc8bd9a;hb=HEAD я нашёл следующие опции:

3.1. device name - PPPoE device name

Первая опция не имеет названия. Её значение должно быть указано сразу после строчки подключения плагина. В ней передаётся имя Ethernet-интерфейса, подключенного к ADSL-модему.

Эта опция соответствует опции -I pppoe-клиента, работающего в пространстве пользователя.

3.2. rp_pppoe_service - Desired PPPoE service name

Желаемое имя службы PPPoE.

Соответствует опции -S pppoe.

3.3. rp_pppoe_ac - Desired PPPoE access concentrator name

Желаемое имя концентратора доступа PPPoE.

Соответствует опции -C pppoe.

3.4. rp_pppoe_sess - Attach to existing session (sessid:macaddr)

Подключиться к существующему сеансу идентификатор_сеанса:mac_адрес.

Соответствует опции -e pppoe.

3.5. rp_pppoe_verbose - Be verbose about discovered access concentrators

Сообщать об обнаруженных концентраторах доступа.

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

3.6. pppoe-mac - Only connect to specified MAC address

Подключаться только к указанному MAC-адресу.

У этой опции нет аналогов в pppoe.

4. Настройка PPPoE-интерфейсов в Debian

Произведём настройку интерфейсов. В файл /etc/network/interfaces впишем следующие строки:
auto eth0
iface eth0 inet manual

auto dsl-provider
iface dsl-provider inet ppp
  pre-up /sbin/ifconfig eth0 up
  provider dsl-provider
eth0 - Ethernet-интерфейс, к которому подключен кабель от провайдера.
dsl-provider - имя файла в каталоге /etc/ppp/peers/ с настройками подключения к провайдеру.

Эти настройки заставят систему пытаться установить PPPoE-соединение сразу после загрузки компьютера. Чтобы соединение было успешно установлено, нужно прописать настройки в файле /etc/ppp/peers/dsl-provider. Настроить PPPoE-соединение можно одним из двух способов: с использованием описанного выше модуля rp-pppoe.so, работающего совместно с PPPoE-модулем ядра или используя pppoe-клиент, работающий в пространстве пользователя.

5. Настройка подключения с использованием модуля rp-pppoe.so

Сначала нужно убедиться, что ваше ядро имеет поддержку модуля PPPoE. Попробуем загрузить PPPoE-модуль ядра вручную:
# modprobe -q pppoe
Теперь посмотрим, существует ли файл /proc/net/pppoe. Если модуль был вкомпилирован в ядро статически или модуль успешно загрузился, то этот файл должен появиться. Если нет - нужно разбираться с конфигурацией вашего ядра. Не будем отвлекаться на это, поскольку подавляющее большинство современных дистрибутивов Linux позволяет загрузить этот модуль приведённой выше командой.

Теперь займёмся настройкой подключения. Для этого в файле /etc/ppp/peers/dsl-provider пропишем настройки подключения:
# Здесь указываем имя пользователя, с которым pppd будет подключаться к dsl-провайдеру.
# Пароль для соединения будет взят из файла /etc/ppp/pap-secrets или /etc/ppp/chap-secrets
user "ваш_логин"

# Указываем загрузить модуль
plugin rp-pppoe.so

# Указываем интерфейс, к которому подключен модем
eth0

# Говорим, что провайдер выдаёт IP-адрес динамически
noipdefault

# Пытаемся получить IP-адреса DNS-серверов провайдера
usepeerdns

# Использовать это соединение как маршрут по умолчанию
defaultroute

# Заставить pppd переподключаться при обрыве соединения
persist

# Не запрашивать пароль у удалённого партнёра
noauth

Далее в файле /etc/ppp/pap-secrets или /etc/ppp/chap-secrets нужно указать имя и пароль для подключения:
ваш_логин * ваш_пароль *
Имя используемого файла зависит от метода аутентификации, затребованного PPPoE-сервером, но в большинстве случаев это будет файл chap-secrets.

Теперь можно воспользоваться обычными для Debian командами pon для установки подключения и poff для закрытия подключения:
# pon dsl-provider
# poff dsl-provider
6. Настройка подключения с использованием pppoe-клиента, работающего в пространстве пользователя

Файл /etc/ppp/peers/dsl-provider в этом случае практически идентичен предыдущему, за исключением того, что теперь вместо опции plugin используется опция pty, запускающая программу-посредник pppoe:
user ваш_логин
pty "pppoe -I eth0 -T 80 -m 1452"
noipdefault
usepeerdns
defaultroute
persist
noauth
Как и в предыдущем случае, для установки и закрытия подключения можно воспользоваться командами pon и poff:
# pon dsl-provider
# poff dsl-provider
За кадром остались настройка PPPoE-сервера и релея. Возможно я когда-нибудь за них возьмусь и дополню статью соответствующими разделами.

Ссылки на использованные для подготовки статьи материалы:
  1. Домашняя страница RP-PPPoE
  2. Сайт коллективных переводов
  3. Страницы руководства Debian
  4. Мой проект перевода страниц руководства
  5. Web-интерфейс Git-репозитория программы pppd
  6. Настройка PPPoE-соединений в Debian
  7. Настройка pppoe в Debian GNU/Linux на примере провайдера TeNeT