ATI Catalyst 8.8, btanks 0.8

К сожалению, новый fglrx все то же унылое ... решето, каким и был до этого

Апофеоз, это, конечно:

XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
after 7448 requests (7447 known processed) with 0 events remain

при завершении fgl_glxgears

В предверии Unreal 2007 for Linux я присматриваю себе новую видеокарту - и ей станет, похоже, станет что-нибудь из линейки GeForce - исключительно из-за fglrx'а

---------------------------------------------------------------------

Кстати, на днях вышел btanks 0.8 - красивая игрушка для офиса/посиделок с друзьями. Собственно, авторам спасибо за "scons install", а то установка btanks до этого требовала отдельного бубна

MPD (Music Player Daemon)

Введение

Для тех, кто в танке: mpd (Music Player Daemon) - это музыкальный плеер с клиент-серверной архитектурой. Вы запускаете сервер (собственно, mpd), указывая, где расположена ваша музыкальная коллекция, после чего подключаетесь к mpd клиентской программой, с помощью которой получаете возможность управлять сервером. Музыку воспроизводить сам mpd => нет необходимости держать запущенным определенный клиент.

Такая организация работы дает несколько больших плюсов:

  • Воспроизведение вынуждено прерывается только после останова сервера (логины/логауты, запуски/остановы XWindow никоим образом на проигрывание музыки не влияют)

  • Плеер доступен и с других компьютеров, объединенных в сеть с тем, на котором mpd выполняется

  • Вы можете запустить сотню клиентов, каждый из которых будет выполнять свою функцию - например, если ваш клиент не поддерживает скроблинг, то запустите еще один, который целенаправленно будет отсылать данные на last.fm и иже с ним


Возможности mpd:

  • Поддержка форматов Ogg Vorbis, FLAC, OggFLAC, MP2, MP3, MP4/AAC, MOD, Musepack и WAV

  • Удалённое управление MPD через сеть (+поддержка IPv6)

  • Потоковое HTTP воспроизведение FLAC, OggFLAC, MP3 и Ogg Vorbis

  • Читает и кэширует информацию метаданных (теги) — (ID3 (id3v1 и id3v2)), комментарии Vorbis и теги MP4

  • MPD умеет перекодировать теги

  • Поддержка буфера при проигрывании (предотвращает пропуски при высокой загруженности или большом времени отклика сети)

  • Поддержка плавного наложения/плавного перехода (Crossfading)

  • Поддержка прокрутки

  • Сохранение, загрузка и управление плейлистами (в формате m3u)

  • Контроль громкости (OSS, ALSA и програмные микшеры)

  • Поддержка широкого диапазона аудио устройств (OSS, ALSA, Sun, esd, ARts, PulseAudio и др.)

  • Демон тестирован на GNU/Linux, FreeBSD, OpenBSD, NetBSD, Solaris и HP-UX


Сервер

Как ни странно, серверная часть mpd называется "mpd". Здесь вы можете забрать пакеты с исходными кодами/бинарными сборками mpd. Текущая стабильная версия mpd - 0.13.2, датируется июнем сего года. Сделать snapshoot с проекта можно с помощью cvs:

svn co https://svn.musicpd.org/mpd/trunk mpd

Я использую Slackware и поэтому компилирую mpd из исходников. К слову, компиляция и установка осуществляется банальным

./configure --prefix=/usr
make
su -c 'make install'

Кстати, в Slackware 12.1 доустановите faad2 - это библиотека, используемая mpd для воспроизведения mp4/aac. Взять faad2 можно на официальном сайте проекта. Компилировать так:

./bootstrap
./configure --with-mp4v2 --prefix=/usr
make
su -c 'make install'

Перед запуском сервера необходимо отредактировать конфигурационный файл. Сделайте:

cp MPD_SRC_DIR/doc/mpdconf.example ~/.mpdconf
mkdir ~/.mpd
mkdir ~/.mpd/playlists

(Здесь MPD_SRC_DIR - папка с исходниками mpd)
Таким образом, главным конфигурационным файлом будет "~/.mpdconf", каталог "~/.mpd" будет главным каталогом программы (в нем будут располагаться логи, коллекционная база данных, файл с данными о текущем статусе плеера) , а в "~/.mpd/playlists" будут лежать созданные вами плейлисты.

* Кстати, по умолчанию mpd ищет нужные файлы сначала в "/etc", а потом в "HOME" запустившего пользователя. Скорее всего, вам понадобится запускать несколько серверов mpd для разных пользователей - таким образом, целесообразней создавать файлы настройки в домашних каталогах, а не в "/etc"

Отредактируем "~/.mpdconf". Умолчательные настройки хороши, однако кое-что все же нужно "допилить":

  • В секции "REQUIRED PATHS" вместо "~" впишите полные пути к домашнему каталогу пользователя (необходимо, если вы будете запускать mpd root'ом - я делаю именно так, т.к. mpd стартует у меня при загрузке системы из специального демона)

  • Повторите предыдущий пункт для секции "OPTIONAL PATHS" (и обязательно снимите комментарий с "pid_file" и "state_file"

  • Снимите комментарий с полей "bind_to_address" и "port" (порт, на котором будет висеть mpd). Кстати, поскольку у меня запущено несколько mpd, в поле "port" содержаться разные значения для каждого сервера

  • Раскомментируйте поле "password" и отредактируйте его следующим образом: ПАРОЛЬ@read,add,control,admin - таким образом, при подключении к mpd клиентом с паролем "ПАРОЛЬ" вы получите права на чтение потока и всяческое управление им (добавление/удаление треков, останов/запуск и т.п.)

  • Раскомментируйте поле "default_permissions" и установите его в "read" - таким образом, клиенты, подключившиеся к серверу без пароля, смогут только читать поток

  • Поля "filesystem_charset" и "id3v1_encoding" я рекомендую установить в вашу общесистемную кодировку (у меня - "UTF-8"). С "filesystem_charset" все ясно, а вот с "id3v1_encoding" возникает соблазн поставить "CP1251" и получить удобочитаемые русские теги - однако, в этом случае при создании базы треков mpd постоянно вылетает и я счел меньшим злом перекодировать все треки из "CP1251" в "UTF-8" с помощью EasyTag, чем решать проблему копанием в mpd

  • Удобства ради раскомментируйте поле "save_absolute_paths_in_playlists" и установите его в "yes"


Теперь создадим базу треков в коллекции:

mpd --create-db

ИЛИ

mpd --create-db /home/USER/.mpdconf

* Этими же командами вы можете базу данных обновить
** Здесь и далее "USER" - имя текущего пользователя

Запуск:

mpd

ИЛИ

mpd /home/USER/.mpdconf

Останов:

mpd --kill

ИЛИ

mpd --kill /home/USER/.mpdconf

Как вы могли заметить, уникальность каждого запущенного сервера mpd в его конфигурационным файле

Напоследок, демон "rc.mpd" для Slackware:

#!/bin/sh
#
# Start/stop/restart the MPD server.
#

mpd_start() {
echo "Start mpd"
/usr/bin/mpd /home/USER/.mpdconf
/usr/bin/scmpc -f /usr/share/scmpc/scmpc.conf
}

mpd_stop() {
echo "Stop mpd"
/usr/bin/mpd --kill /home/USER/.mpdconf
killall scmpc
}

mpd_restart() {
mpd_stop
sleep 2
mpd_start
}

case "$1" in
'start')
mpd_start
;;
'stop')
mpd_stop
;;
'restart')
mpd_restart
;;
*)
mpd_start
esac

* scmpc - клиент для mpd, отсылающий информации на last.fm о текущем треке. О нем я расскажу немного позже

Консольные клиенты

Собственно, наиболее популярны два консольных клиента - mpc и ncmpc.

mpc

mpc - неитерактивный консольный клиент для mpd. Скачать его (в виде пакета с исходным кодом) можно с официального сайта mpd - вот отсюда (текущая версия 0.12.1)

Установка:

./configure --with-default-host="[PASSWORD@]HOST" --with-default-port="PORT" --prefix=/usr
make
su -c 'make install'

Здесь --with-default-host и --with-default-port указывают, к какому серверу mpd mpc должен подключаться по умолчанию. [PASSWORD@] можно опустить. Если опустить эти два аргумента, то умолчательным сервером будет localhost:6600 (без пароля)

Использование:

mpc COMMAND ARG
mpc --help

Здесь COMMAND - команда серверу, а ARG - аргументы команды. Полный список команд можно получить при вызове mpc с ключом "--help"

Переменные среды MPD_HOST и MPD_PORT определяют, к какому серверу необходимо подключаться. Формат их значений идентичен формату значений ключей --with-default-host и --with-default-port скрипта configure

* Кстати, в MPC_SRC_DIR/doc лежит файл mpc-bashrc - добавьте содержимое этого файла в ~/.bashrc и вы получите удобное дополнение по TAB для mpс

ncmpc

ncmpc - в отличие от mpc, интерактивный клиент для mpd. Официальный сайт проекта - текущая версия: 0.11.1

Как обычно, я устанавливаю ncmpc из исходных кодов:

./configure --with-default-host="[PASSWORD@]HOST" --with-default-port="PORT" --prefix=/usr
make
su -c 'make install'

Запускаем ncmpc:

ncmpc

* Переменные среды MPD_HOST и MPD_PORT определяют, к какому серверу необходимо подключаться. Формат их значений идентичен формату значений ключей --with-default-host и --with-default-port скрипта configure

Управляется ncmpc в основном с клавиатуры, однако доступна и мышь. Функциональные клавиши:

  • F1 - помощью (список сочетаний клавиш)

  • F2 - плейлист

  • F3 - просмотр коллекции

  • F5 - поиск трека по тегамv


Графические клиенты

GUI'вых клиентов великое множество, однако ж мне понравились только два: sonata и qmpdclient

Sonata

Sonata - графический клиент для mpd, написанный на python с помощью gtk2. Sonata многое чего умеет (правда не осиливает очередь воспрозведения) - включая скроблинг и управление из консоли, но я предпочел ей qmpdclient

Официальный сайт Sonata - текущая версия: 1.5.2

QMPDClient

QMPDClient - графический клиент для mpd, написанный на C++ с помощью QT4. Красив и удобен, сворачивается в трей и выводит сообщения о проигрываемой композиции, управляется с помощью мультимедийной клавиатуры. Общаться с last.fm не умеет, однако это поправимо с помощью клиента под названием scmpc

Скачать QMPDClient можно отсюда - текущая версия: 1.0.9

Я устанавливаю клиент из исходных кодов:

tar xzf qmpdclient-1.0.9.tar.gz
cd qmpdclient-1.0.9
wget -c http://havtknut.tihlde.org/qmpdclient/files/translations/ru_RU.ts
qmake-qt4
make
su -c 'make install'

* ru_RU.ts - исходный код локализации

Запустить QMPDClient можно следующим образом:

qmpdclient &

Другие клиенты

Собственно, очень хотелось бы сделать еще пару вещей с mpd:

  1. Отправлять данные о проигрываемом треке на last.fm

  2. Управлять mpd с помощью web-интерфейса

  3. Слушать mpd'овский поток из Windows


Last.fm

Есть две альтернативы:

  1. Sonata - в минусе у Sonat'ы ее графический интерфейс - связь с last.fm прервется с остановом X'ов

  2. Использовать консольный неинтерактивный клиент, заточенный под скроблинг: список таковых можно найти здесь


Я пошел по второму пути и выбрал клиент под названием scmpc

Официальный сайт scmpc - текущая версия: 0.2.2 датирована декабрем 2006-го, однако работает "на ура"

Зависимости, которые нужно удовлетворить в Slackware 12.1:

Компиляция и установка scmpc:

./configure --with-default-host="[PASSWORD@]HOST" --with-default-port="PORT" --prefix=/usr
make
su -c 'make install'

Настройка scmpc (я использую last.fm только одним пользователем):

su -c 'cp SCMPC_SRC_DIR/examples/scmpc.conf /usr/share/scmpc/scmpc.conf'
su -c 'mkdir /var/lib/scmpc'

Здесь SCMPC_SRC_DIR - путь к каталогу с исходным кодом scmpc

Кое-какие замечания относительно /usr/share/scmpc/scmpc.conf:

  • Расскоментируйте поля log_level, log_file, pid_file, cache_file

  • Расскоментируйте поля host, port, timeout - первые два указывают, с каким сервером mpd scmpc работает

  • В поля username и password впишите ваш логин и пароль для last.fm


Запуск scmpc:

/usr/bin/scmpc -f /usr/share/scmpc/scmpc.conf

Останов:

killall scmpc

Примечание:

Q: Все хвалят mpdscribble, почему ты его не используешь?
A: mpdscribble тянет за собой libsoup, а та в свою очередь gnome-common. В-общем, устанавливать Gnome ради клиента для mpd мне лениво

Web-клиенты

Посмотрите полный список web-клиентов вот здесь

Windows-клиент

Проблема взаимоотношений Windows и mpd подробно описана здесь

В Windows я использую QMPDClient. Скачать версию 1.0.9 для Windows можно по этой ссылке

Почитать

Fuse и Python

1. Вводная

Fuse - это проект, предоставляющий программисту функционал для написания драйвера для произвольной файловой системы. Fuse (в Linux) включает в себя модуль ядра, используемый различными программами для связи с драйвером ФС (который является, по существу, исполняемым файлом).

Стратегия разработки драйвера проста - необходимо реализовать некоторый набор функций с определенными прототипами, указатели на которых передать модулю ядра (с помощью вызова некоторой функции - т.н. fuse_main) - после чего при обращении к ФС будут вызываться именно те функции из драйвера, указатели на которые были переданы в fuse_main. Нетрудно догадаться, что диапазон применения fuse очень и очень широк - с ее помощью можно разработать самые "неожиданные" ФС :-)

Плюсы fuse:
  • Код драйвера ФС выполняется в user-space - сразу исчезают многие проблемы, возникающие при отладке модуля ядра

  • У fuse есть много "привязок" к разным ЯП (кроме C, это еще и Python, например)

  • Простые принципы разработки драйверов (простое API)

  • Стабильность, надежность и защищенность



Подробности разработки драйверов ФС на C/C++ для fuse можно узнать в статье: "Разработка собственной файловой системы с помощью FUSE" (ibm.com Россия).

Однако в этой статье я расскажу, как написать драйвер, используя python.

2. Установка "привязок" к fuse для python

Все просто. Для начала получим исходный код "привязок":

Проследуйте на страницу FUSEWiki - FusePython и выберите понравившийся вам способ загрузки.

Я использовал Mercurial:

hg clone http://mercurial.creo.hu/repos/fuse-python-hg

После загрузки перейдите в каталог с исходниками fuse-python и сделайте:

python setup.py build
su -c 'python setup.py install'


Вы получите модуль fuse, в котором содержаться вся необходимые классы.

3. Небольшой пример

Давайте напишем драйвер для "игрушечной" виртуальной ФС.

В начале - каркас драйвера:
  1. Первым делом мы импортируем нужные модули:

    import os,stat
    import fuse

  2. Теперь необходимо сообщить fuse-python какую ее версию мы используем:

    fuse.fuse_python_api = (0, 2)

  3. Описываем базовый для нашего драйвера класс (он будет наследовать класс fuse.Fuse):

    class simpleFS(fuse.Fuse):
      #функции
      #TODO

  4. Описываем функцию, которая будет "запускать" наш драйвер:

    def runSimpleFS():
      usage='Simple FS ' + fuse.Fuse.fusage
      fs = simpleFS(version="%prog " + fuse.__version__,usage=usage,dash_s_do='setsingle')
      fs.parse(errex=1)
      fs.main()


    Как вы могли заметить, принципиально важными являются вызов конструктора fuse.Fuse (с правильным списком аргументов), вызов fs.parse() и вызов fs.main(). fs.main() это и есть как раз та самая fuse_main. Указатели на функцию в fuse-python подменяются функциями-членами_класса fuse.Fuse.

    Важное замечание: после вызова fs.main() драйверу перестает быть доступной консоль, из которой, собственно, драйвер и был запущен. В частности, теряется связь с STDIN, STDOUT, STDERR - т.е. мы сможем догадаться об исключенях только по результатам работы драйвера.

  5. Вызываем runSimpleFS():

    runSimpleFS()


Каркас готов.

Теперь давайте определимся с тем, что будет представлять из себя наша ФС:
  1. 2 каталога - '/' и '/simple' - оба с правами 0555 и root.root в качестве пользователя.группы_пользователя

  2. 1 файл - '/README' (0444 root.root)


Реализация нашего класса:

  1. Конструктор. В нем принципиально важно вызвать конструктор базового класса со всеми переданными в конструктор simpleFS аргументами (а self.README - содержимое файла '/README'):

    def __init__(self, *args, **kw):
      fuse.Fuse.__init__(self, *args, **kw)
      self.README = 'This is simple FS\n'

  2. Пользовательские действия с ФС (системные вызовы и прочее). На каждой такой функции в fuse.Fuse стоит "заглушка". Нам остается только переопределить нужные нам функции:


    # getattr вызывается при получении информации об объекте ФС. Например, при использовании команды ls

    def getattr(self, path):
      # В объекте fuse.Stat() вернем интересующую информацию
      st = fuse.Stat()
      # "Режим" - права доступа, тип объекта
      st.st_mode = 0
      # Номер inode
      st.st_ino = 0
      st.st_dev = 0
      # Количество ссылок на объект
      st.st_nlink = 0
      # ID владельца объекта
      st.st_uid = 0
      # ID группы владельца объекта
      st.st_gid = 0
      # Размер объекта
      st.st_size = 0
      # Временные штампы
      st.st_atime = 0
      st.st_mtime = 0
      st.st_ctime = 0
      if path == '/' or path == '/simple':
        # Каталоги
        st.st_mode = stat.S_IFDIR | 0755
        st.st_nlink = 3
      elif path == '/README':
        # Файлы
        st.st_mode = stat.S_IFREG | 0444
        st.st_nlink = 1
        st.st_size = len(self.README)
      else:
        # path не существует
        return -errno.ENOENT
      return st

    # readdir вызывается при попытке просмотра содержимого каталога. Например, при использовании ls

    def readdir(self, path, offset):
      # В каждом каталоге есть '.' и '..'
      yield fuse.Direntry('.')
      yield fuse.Direntry('..')
      if path == '/':
        # Кроме того, в '/' есть еще и 'README' и 'simple'
        yield fuse.Direntry('README')
        yield fuse.Direntry('simple')

    # open вызывается при попытки открыть файл. Мы должны проверить флаги доступа - наш единственный файл '/README' доступен только на чтение

    def open(self, path, flags):
      if path != '/README':
        return -errno.ENOENT
      accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
      if (flags & accmode) != os.O_RDONLY:
        # Ошибка доступа
        return -errno.EACCES

    # read вызывается при попытки прочитать данные из файла
    # offset - смещение в читаемом файле
    # size - размер считываемого ("запрощенного") блока
    # read возвращает считанные символы

    def read(self, path, size, offset):
      if path != '/README':
        return -errno.ENOENT
      slen = len(self.README)
      if offset < slen:
        if offset + size > slen:
          size = slen - offset
        buf = self.README[offset:offset+size]
      else:
        buf = ''
      return buf

    # statfs вызывается в ответ на запрос информации о ФС

    def statfs(self):
      # Вернем информацию в объекте класса fuse.StatVfs
      st = fuse.StatVfs()
      # Размер блока
      st.f_bsize = 1024
      st.f_frsize = 1024
      st.f_bfree = 0
      st.f_bavail = 0
      # Количество файлов
      st.f_files = 2
      # Количество блоков
      # Если f_blocks == 0, то 'df' не включит ФС в свой список - понадобится сделать 'df -a'
      st.f_blocks = 4
      st.f_ffree = 0
      st.f_favail = 0
      st.f_namelen = 255
      return st


Вот и все. Драйвер готов (исходный код драйвера лежит здесь).

Проверка:

mkdir smpfs
python simplefs.py smpfs
ls -la smpfs/
ls -la smpfs/simple
cat smpfs/README
df
su -c 'umount smpfs'


Заметьте, что первым параметром в скрипт передается точка монтирования (каталог 'smpfs' в нашем случае).

В случае, если этого примера вам показалось мало - посмотрите в каталог 'example' дистрибутива fuse-python. Там есть кое-что интересное.

4. Почитать



5. BashOrgFS

Здесь лежит моя поделка на заданную тему. bash.org.ru представлен в виде файловой системы.

Монтировать так:

./bashorg ТОЧКА_МОНТИРОВАНИЯ.

Заранее - это просто пример. Используйте на свой страх и риск. Предварительно читайте README ;-)

6. За сим все. Успехов!

arora

(по мотивам LOR'а)

Проскальзывала на днях новость об очередном "броузере на qt/webkit". Называется сие поделие - "arora". В-целом - неплохо. Мне понравилось.

Сайт программы. Вам понадобится QT > 4.3 (у меня - 4.4).

Итак, у aror'ы есть:
  • История

  • Закладки (храняться в XBEL-формате (это хорошо, ибо konqueror хранит свои в нем же - процесс импорта сводится к паре кликов))

  • Табы

  • Оригинальный "бар" загрузки страницы (фон строки ввода адреса)

  • javascript

  • Широкий спектр настроек

  • plug-in'ы (flash обещают в версиях собранных с QT 4.5)


Стоит заметить, что arora некорректно обрабатывает некоторые сайты (например, ВКонтакте), кушает приличный кусок памяти (правда, меньший чем opera 9.50 при большем количестве открытых вкладок), падает (редко, но падает же) и нет никакого внутреннего или поддержки внешнего хранилища данных/паролей (особенно досадно, конечно).

Скриншоты:


(flash'а еще нет, зато есть оригинальный бар загрузки страницы)

KDE4

Наконец-то дошли руки до KDE4.

Версия: в итоге ею стал срез svn от 4-го августа.

Компилировал: как release (вместо debugfull по умолчанию). Система - моя любимая Slackware 12.1.

Проблемы при компиляции: clucene вывел меня из себя, однако ларчик открывался просто - нужно было всего лишь обновить cmake до версии 2.6 (в Slackware 12.1 по умолчанию - 2.4).

Проблемы при использовании:
  • kget красив и функционален, но "вываливается" после завершения каждой закачки

  • amarok 2 и k3b (они, конечно, не часть KDE4, но все же) совершенно не юзабельны

  • Скорость работы оставляет желать лучшего


Мораль: жду KDE 4.2. Учитывая, какими темпами KDE 4 взрослеет (я последний раз пробовал кеды в апреле сего года), я думаю, KDE 4.2 будет "самое оно".

/dev/bashorg

Руководствуясь принципом "Just for fun" сделал вот такую вот занимательную вещицу. В архиве исходные коды для модуля ядра - модуль этот создает устройство /dev/bashorg, через которое становится доступна rss-лента всеми (не)любимого сайта.

Перед компиляцией обязательно почитайте README.

Зачем делалось:
  • У меня очень много свободного времени

  • Давно хотел портировать програмку из user-space в kernel-space (реализовалось все макросами и дописыванием функций сетевого взаимодействия)

  • Интересно было поработать с сетевым взаимодействием в kernel-space


Кстати: я (то бишь автор) никакой ответственности за (сюда вставить название катаклизма) не несу. На всякий случай :-)

Полезные ссылки:

KDE 4 - kdesupport (development version) - впечатления

Компиляция свежего kdesupport:

  1. В kdesupport/soprano/index/tstring.cpp используются ни где более не определенные функции _tcslen и _tcscmp. Возникает ошибка при компиляции

    Лечил так:

    _tcslen заменил на wcslen (1 вхождение)
    _tcscmp заменил на wcscmp (1 вхождение)

    Патч не привожу, ибо лениво

    P.S. Правьте исходник на свой страх и риск, потому как решение лично мной еще не протестировано (хотя kdesupport собрался на "ура")

  2. Поддержку CLucene лучше не включать

UTF-8 и man

Если локаль консоли установлена в ru_RU.UTF-8, весьма вероятны проблемы с man'ом - страницы на русском выводятся некорретно, ровно как и диагностические сообщения man'а.

С помощью Wiki Archlinux'а (ссылку запамятовал, но, думаю, Google поможет) я решил эти проблемы следующим образом:

  1. Скачиваем исходники man отсюда (текущая версия 1.6f)

  2. Патчим, компилируем и устанавливаем man:

    tar xzf man-1.6f.tar.gz
    cd man-1.6f
    iconv -f koi8-r -t utf-8 msgs/mess.ru \
    > /tmp/mess.ru
    mv /tmp/mess.ru ./msgs/
    echo "$ codeset=UTF-8" > msgs/mess.ru.codeset
    ./configure +lang en,ru -confdir /usr/lib \
    +fhs --prefix=/usr
    make
    su -c 'make install'
    cd ..
    rm -Rf man-1.6f

  3. В "/usr/lib/man.conf" заменить:

    NROFF /usr/bin/nroff -Tlatin1 -mandoc

    на

    NROFF iconv -f utf8 -t koi8r | /usr/bin/nroff -Tlatin1 -mandoc -c | iconv -f koi8r -t utf8


После всех манипуляций man в моей Slackware 12.1 заработал как надо, чего и вам желаю :-)

UTF-8 и консоль Slackware

Ядро

Убедитесь, что опции:
  • "File systems/Native language support" - установлена в "*"

  • "File systems/Native language support/Default NLS Option" - "utf8"

  • "File systems/Native language support/NLS UTF-8" - "*"

Начало

CTRL-ALT-F1

Войдите в систему как root. Сделайте (чтобы "убить" X'ы на всякий случай):

init 3

keymap

Установим keymap-файл:

  1. Отсюда загрузите файл с keymap

  2. Поместите этот файл в "/usr/share/kbd/keymaps/i386/qwerty"

  3. Создайте файл "/etc/rc.d/rc.keymap" следующего содержания:
    #!/bin/sh
    # Load the keyboard map. More maps are in /usr/share/kbd/keymaps.
    if [ -x /bin/loadkeys ] ; then
         kbd_mode -u
         /bin/loadkeys ru-winkeys-uni_ct_sh.kmap
         for n in 1 2 3 4 5 6; do
             echo -n -e '\033%G' > /dev/tty$n
         done
    fi

  4. Права доступа к "/etc/rc.d/rc.keymap" установите в 755

lang

Теперь необходимо правильно настроить переменные среды, содержащие информацию о локали:

  1. Создайте файл "/etc/profile.d/lang.sh" следующего содержания:
    #!/bin/sh
    # Set the system locale (default C is the same as en_US):
    export LANG="ru_RU.UTF-8"
    export LC_ALL="ru_RU.UTF-8"

  2. Права доступа к "/etc/profile.d/lang.sh" установите в 755

font

Наконец, настроим консольный шрифт для ru_RU.UTF-8:

  1. Создайте файл "/etc/rc.d/rc.font" следующего содержания:
    #!/bin/sh
    setfont cyr-sun16.psfu

  2. Создайте файл "/etc/profile.d/font.sh" следующего содержания:
    #!/bin/bash
    if [ "` tty | grep pts `" == "" ]
    then
         setfont cyr-sun16.psfu
    fi

  3. Поставьте права доступа 755 на оба файла

Перезагрузка

По окончании вы получите консоль ru_RU.UTF-8, с переключением на русский по CTRL-SHIFT.

Slax

Собственно, о Slax знают все. Это еще один live-cd/usb дистрибутив Linux.

В этой статье я кое-что расскажу о скриптах проекта linux-live (с помощью которых и создан Slax), опишу процесс создания своих собственных модулей для Slax и процесс получения своей версии Slax со своими модулями внутри, после чего я покажу, как создать несколько "специальных" модулей (с руссификацией и настройками пользователя), а в конце приведу полезные ссылки (для "почитать").

Плюсы и минусы Slax

Плюсы Slax'а (собственно, за что его стоит использовать):

  • Slax очень легко масштабируется - вы можете быстро и просто включить в вашу копию программы нужные вам файлы (к примеру - установки программ)

  • В 189 мегабайт (версия 6.0.7) входит много чего - KDE 3.5.9, KOffice, gcc, perl, mplayer

  • Поскольку Slax, все же, легко масштабируется, вы легко сможете выкинуть ненужный софт (KOffice, например, или сразу всю KDE)

  • Slax построен на основе самого последнего релиза Slackware - и значит относительно устойчив

  • Slax позволяет целиком загрузить себя в оперативную память

Минусы:

  • Отсутствие некоторых важных программ все-таки вынуждает "допиливать" дистрибутив под себя

  • Отсутствие python'а, консольного клиента для ftp и vim'а (см. предыдущий пункт :-) )

  • KDE. Для mini-cd - слишком тяжело

  • Отсутствие руссификации (я покажу, как это исправить)


linux-live

Проект linux-live живет здесь.

Собственно, он нацелен на быстрое и простое получение своего собственного live-cd из любой установки linux.

Каким образом это происходит? Собственно, процесс описан в тамошнем howto, вкратце все просто:

  1. Загружаем linux

  2. Включаем поддержку aufs и squashfs (возможно, еще и LZMA) в ядре с помощью патчей от linux-live (кстати, можно использовать precompiled ядро, скачиваемое с сайта проекта)

  3. Расспаковываем пакет со скриптами, правим конфиг

  4. Запускаем скрипт build

  5. Запускаем соотв. скрипт для получения ISO или bootable usb disk



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

Slax

Отсюда вы сможете скачать текущую (6.0.7) версию Slax'а (скачайте cd версию).

* Я думаю, понадобится какой-нибудь эмулятор для тестирования. VirtualBox там или Qemu.

Последовательность приготовлений такая:


mkdir my_slax
cd my_slax
wget -c http://www.slax.org/get_slax.php?download=iso
#Предполагается, что образ называется slax-6.0.7.iso - текущая версия
mkdir bla-bla-bla
su
mount slax-6.0.7.iso bla-bla-bla -o loop
cp -R bla-bla-bla disk
chown -R ВАШ_ПОЛЬЗОВАТЕЛЬ.users disk
umount bla-bla-bla
exit
rmdir bla-bla-bla
ls


Итого получим:


  • disk - содержимое образа

  • slax-6.0.7.iso - оригинальный образ



Добавляем модули

Собственно, теперь добавим пару чужих модулей.

Здесь находится официальный репозиторий. Модулей там маловато, но кое-что есть.

К примеру, python и telnet:

Скачаем модуль с python-2.5.2 и модуль с telnet-1.5 - получаем python-2.5.2-i486-1.lzm и telnet-1.5.lzm (модули slax'а имеют расширение lzm).

Теперь сделаем:


cd disk/slax
ls


Получим:


amv@amv:~/trash/my_slax/disk/slax$ ls
base/ cheatcodes.txt LICENSE make_iso.bat* modules/ requirements.txt slaxsave.zip
changelog.txt GNU_GPL livecd.sgn make_iso.sh* optional/ rootcopy/ tools/


Здесь:


  • base - содержит базовые модули slax'а (к примеру, для удаления koffice - достаточно удалить модуль base/005-koffice.lzm)

  • cheatcodes.txt - опции загрузки slax'а (бывает полезно)

  • make_iso.* - скрипты для создания iso из текущего "дерева" (собственно, они создадут live-cd bla-bla-bla.iso из нашего каталога my_slax/disk)

  • modules - это пользовательские модули, которые будут загружены при загрузке системы

  • optional - модули, загружаемые по выбору пользователя с помощью специального менеджера после загрузки системы

  • tools - скрипты из проекта linux-live - именно с их помощью происходит создание пользовательских модулей



Поместим python-2.5.2-i486-1.lzm в modules/ (чтобы python был всегда с нами :-) ), а telnet-1.5.lzm в optional (кому как, а я telnet'ом, чаще всего, звездные войны смотрю).

Соберем нашу версию slax'а:


./make_iso.sh ../../my_slax_1.iso
cd ../../
ls


Имеем:


amv@amv:~/trash/my_slax$ ls
disk/ linux-live-6.2.4/ my_slax_1.iso python-2.5.2-i486-1.lzm slax-6.0.7.iso telnet-1.5.lzm


Здесь, собственно, my_slax_1.iso - это наш live-cd. На очереди - тестирование. Кто как, а я призову на помощь qemu:


qemu -m 512 -boot d -cdrom my_slax_1.iso


* "-m 512" - это объем оперативки, который я выделил для виртуальной машины. Можете опустить этот параметр, но на объеме, меньшем 256M, Slax и Qemu чувствуют себя плохо
** По субъективным ощущениям, VirtualBox с Slax'ом работает быстрее уже на 256-и мб. оперативной памяти у виртуального компьютера. Причина неизвестна.

Когда Slax загрузится, откройте konsole (на панели ее значок - второй справа) и запустите в ней python. Он должен заработать.

Каким образом подключить optional-модули? Все просто! Менеджер модулей здесь: "K/System/Slax Module manager". Запустите его: перед вами появится окно, содержащее список всех загруженных модулей. Внизу справа - кнопка "Add a new module" - добавление новых модулей (модуль telnet-1.5.lzm лежит в /mnt/live/mnt/hdc/slax/optional/). Внизу слева - кнопка "Remove selected modules" - позволяет выгрузить выбранный модуль.

* После загрузки модуля telnet-1.5.lzm попробуйте запустить telnet в konsole
** Как вы понимаете, подключаемые модули могут лежать на другом носителе - вам необходимо просто смонтировать носитель и подключить модуль с помощью менеджера. Кстати, Slax можно целиком загрузить в ОП (если ее объем позволяет) и тогда cd-привод будет свободен.

Закройте qemu.

Создание своих собственных модулей

Теперь давайте самостоятельно создадим пару модулей для Slax.

Модуль - это некоторый файл с расширением lzm. Файл этот - архив и содержит в себе что-то вроде "патча" на корневую систему (при загрузке lzm-файл распаковывается в "/", при этом новые файлы добавляются, а существующие заменяются). По большому счету lzm-модуль не отличается от rpm, deb, tgz пакетов. Важно, что происходит только распаковка - и более никаких действий.

Сделайте (мы находимся в my_slax):


ls disk/slax/tools


Должно получится:


amv@amv:~/trash/my_slax$ ls disk/slax/tools/
activate* deactivate* deb2lzm* dir2lzm* liblinuxlive lzm2dir* mksquashfs* tgz2lzm* unsquashfs* WIN/


Нас интересуют:


  • deb2lzm - утилита получения модуля из deb'а

  • dir2lzm - утилита получения модуля из произвольного каталога (к примеру, файлы из bla-bla-bla/bin при загрузке модуля пойдут в /bin)

  • tgz2lzm - утилита получения модуля из tgz-пакета (для Slackware)

  • lzm2dir - утилита распаковки модуля в произвольный каталог



tgz2lzm

Сделаем модуль из какого-нибудь полезного Slackwar'ного пакета.

! Важно! Вам понадобится набор утилит для управления пакетами Slackware. Способ получения этого набора утилит, если у вас не Slackware, описан в следующем пункте.

Скачайте ncftp-3.2.1.

Теперь сделаем:


su -c 'disk/slax/tools/tgz2lzm ncftp-3.2.1-i486-1.tgz ncftp-3.2.1-i486-1.lzm && chown ВАШ_ПОЛЬЗОВАТЕЛЬ'


В итоге получим ncftp-3.2.1-i486-1.lzm - модуль с отличным ftp-клиентом.

* Мы можем свободно пользоваться пакетами для Slackware 12.1, поскольку Slax 6.0.7 построен на основе 12.1-й версии.

dir2lzm

Теперь попробуем сделать модуль из произвольного каталога. Для экспериментов возьмем ht-2.0.14 (это шестнадцатеричный редактор и не только). Приступим (текущий каталог - "my_slax"):


mkdir env
wget -c http://prdownloads.sourceforge.net/hte/ht-2.0.14.tar.gz
tar xzf ht-2.0.14.tar.gz
cd ht-2.0.14
./configure --prefix=`pwd`/../env/
make && make install
cd ..
disk/slax/tools/dir2lzm env ht.lzm


В итоге - на выходе мы получили модуль ht.lzm своего собственного приготовления. Теперь, после загрузки этого модуля в Slax'е, в каталоге "/bin" появится файл "ht" - исполняемый бинарик программы.

Вы можете напихать много разного мусора в "env/" и получить на выходе модуль. Чем мы и займемся, собственно.

* Кстати, попробуйте ncftp...lzm и ht.lzm в работе.

Кое-какие модули "специального" приготовления

Руссификация Slax

Она предельно проста - и основана на моем опыте внедрения ru_RU.UTF-8 в моей установке Slackware.

Для начала обзаведемся системой управления пакетами от Патрика. В предыдущем разделе я говорил, что не пользователи Slackware могут не делать пакета из ncftp...tgz, но теперь сделать пакет из tgz'шки нам придется.

Страница загрузки pkgtools-12.1.0

Итак, имеем пакет pkgtools-12.1.0-noarch-7.tgz. "Установим" его (мы находимся в каталоге "my_slax/"):


mkdir pkgtool
cd pkgtool
cp ../pkgtools-12.1.0-noarch-7.tgz ./
tar xzf pkgtools-12.1.0-noarch-7.tgz
rm -Rf bin usr var install pkgtools-12.1.0-noarch-7.tgz
tree
cd ..
export PATH="`pwd`/pkgtool/sbin/:"$PATH
echo $PATH


Получим:


amv@amv:~/trash/my_slax/pkgtool$ tree
.
`-- sbin
|-- explodepkg
|-- installpkg
|-- makebootdisk
|-- makepkg
|-- pkgtool
|-- removepkg
`-- upgradepkg
1 directory, 7 files
...
amv@amv:~/trash/my_slax$ echo $PATH
/home/amv/trash/my_slax/pkgtool/sbin/:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/java/bin:/usr/lib/java/jre/bin:/usr/lib/qt/bin:/usr/share/texmf/bin:.:/home/amv/env/bin/


Нужно, чтобы installpkg находился в одном из каталогов переменной PATH (что, собственно, и происходит).

Теперь скачиваем отсюда локализацию для kde и делаем (мы находимся в каталоге "my_slax"):


disk/slax/tools/tgz2lzm kde-i18n-ru-3.5.9-noarch-1.tgz kde-i18n-ru-3.5.9-noarch-1.lzm


На выходе получим kde-i18n-ru-3.5.9-noarch-1.lzm.

Отлично. Теперь нужно добавить поддержку ru_RU.UTF-8 в консоле. Это тема для отдельной статьи, поэтому я просто приведу ссылку на мой модуль, который, собственно, это и делает.

Поместите оба полученных модуля в disk/slax/modules и пересоберите образ - русский язык должен появится.

Настройки пользователя

Итак, нам нужно сохранить между сеансами настройки вашего пользователя (в Slax). Разумеется, можно их сохранять на отдельный носитель, но это не есть кошерно.

Выход прост: загрузите Slax в эмуляторе (обязательно необходимо подключение по сети), настройте DE должным образом, после чего загрузите на свою основную машину каталог "/root" из Slax'а (например, в наш каталог "env/") - вам останется только собрать новый модуль, в котором будет только домашний каталог Slax'овского root'а со всеми сделанными вами изменениями.

Почитать



Примечания

Собственно, заметите неточность или ошибку - пишите, обязательно поправлю :-)

Пускаем QEMU в сеть

(Это перепечатка статьи в моем ЖЖ'шном блоге)

Что есть: Linux Slackware 12, QEMU 0.9.1, live-cd с Линуксом (я взял Gentoo install-x86-minimal-2007.0 - загружается быстро, X-ов нет, links имеется (он мне понадобился для тестирования)), реальный (физически существующий) интерфейс с подключением к Интернет (у меня сетевая карта eth0, подключенная к Спарку).

Итак, приступим.

Настрока ядра реальной системы

Нам нужны следующие опции:


Networking Options -> Network packet filtering framework - поддержка iptables (конкретно - ветка IP: Netfilter configuration - Netfilter для IPv4, обратите внимание на поддержку NAT)
Device Drivers->Network device support->Universal TUN/TAP device driver - эмуляция сетевых интерфейсов (отметьте как M).


После компиляции мы получим несколько модулей (если, конечно, все предлагаемые опции мы отмечали как M). Модули для iptables подгружаются самой iptables. Модуль для TUN/TAP называется tun, его подгружать мы будем сами.

Установка UML Utilites (User-mode Linux Utilites) и Iptables

UML Utilites предоставляет программку под названием "tunctl", которая, собственно, и создает виртуальный сетевой интерфейс.

Проверьте, есть ли эта программка у вас ("tunctl BLAH BLAH BLAH" выведет краткую справку). Если tunctl у вас не наблюдается - прошу на сайт проекта. Загрузить исходники можно отсюда (нас интересует подкатегория "tools"). (сайт у UML ... довольно not user-friendly!)

Iptables - суть есть firewall. Для тех, кто не в танке - прост как дифференциальное уравнение. Страница программы. Я использую iptables v1.3.8.

Создаем псевдо-сетевую_карту

$real_ip - ip адрес нашего реального интерфейса (в моем случае - eth0). Это адрес реальной системы во внешней сети.
$host_ip - ip адрес виртуального интерфейса в реальной системе.
$virt_ip - ip адрес виртуального интерфейса в виртуальной системе (загруженной на сэмулированном с помощью QEMU компьютере).
$broadcast - широковещательный адрес для сети, содержащей $host_ip и $virt_ip.

Между виртуальным и реальным интерфейсом в реальной системе необходимо будет настроить переброску (форвадинг) пакетов.

Сделайте:


host_ip='192.168.0.2'
virt_ip='192.168.0.3'
real_ip='IP_РЕАЛЬНОГО_ИНТЕРФЕЙСА'
broadcast='192.168.0.1'


Создаем виртуальный интерфейс:


ic=`su -c 'modprobe tun && tunctl -b -u $NAME && chmod 666 /dev/net/tun'`


Где $NAME - имя пользователя, который выполнил данную команду.

В ic будет записано имя созданного интерфейса. Скорее всего это будет "tap0".

(Кстати, вам необходимо знать пароль к учетной записи root'а ;-) )

Поднимаем виртуальный интерфейс в реальной системе:


su -c "ifconfig $ic up $host_ip netmask 255.255.255.0 broadcast $broadcast && echo 1 > /proc/sys/net/ipv4/ip_forward"


Настройка iptables

Файл /proc/sys/net/ipv4/ip_forward содержит одну единственную цифру. 0 - переброска пакетов между интерфейсами запрещена, 1 - разрешена.


su -c "iptables -t nat -L && iptables -t nat -A POSTROUTING -s $virt_ip -j MASQUERADE"


Устанавливаем маскарадинг для всех пакетов, пришедших с $virt_ip (с виртуальной системы). Команда "iptables -t nat -L" выводит текущее состояние таблицы nat.

Запуск QEMU


mac=$(echo -n EE:AE:B0:BF; for i in `seq 1 2`; do echo -n `echo ":$RANDOM$RANDOM" | cut -n -c -3`; done)
qemu $OPTIONS -net nic,vlan=0,macaddr=$mac,model=rtl8139 -net tap,vlan=0,ifname=$ic,script=no


Первой строчкой мы генерируем mac-адрес для виртуального интерфейса в виртуальной системе. Вторая строчка - непосредственно запуск qemu. Замените $OPTIONS на другие, нужные вам, опции (к примеру, у меня: OPTIONS='-boot d -cdrom install-x86-minimal-2007.0.iso' - загрузится с cd-образа Gentoo, воспринимая его как полноценный cd-диск).

Настройка виртуальной системы

Итак, мы загрузились. Теперь необходимо настроить полученную систему. Общая идея: создать сетефой интерфейс, настроить гейт по умолчанию, настроить DNS.

Реализация (для unix-open_source-like системы - будь то Linux или FreeBSD):

host_ip='192.168.0.2'
virt_ip='192.168.0.3'
broadcast='192.168.0.1'
ifconfig eth0 up $virt_ip netmask 255.255.255.0 broadcast $broadcast
route add default gw $host_ip
echo "nameserver $DNS" > /etc/resolv.conf


Где $DNS - адрес вашего DNS сервера (чтобы узнать его, сделайте "cat /etc/resolv.conf" в реальной системе и внимательно посмотрите на строки, начинающиеся с "nameserver" - это именно ваши сервера DNS).

* Разумеется, учитывайте, что данные команды нужно выполнить от имени пользователя root (посмотрите, как вас зовут: "whoami", и если в вашем паспорте не указано "root" - сделайте "sudo su -" - обычно это работает).

Использование

Пользуйтесь на здоровья. Обе ваши системы - реальная и виртуальная - имеют выход в сеть. Следующими командами можно проверить корректность работы ;-) :


ping 192.168.0.2
ping www.blogger.com


Уничтожение виртуального интерфейса и очистка таблицы firewall'а NAT

После завершения выполнения QEMU сделайте:

su -c 'rmmod tun && iptables -t nat --flush'


При удалении модуля tun уничтожаться все виртуальные интерфейсы, а действие "flush" очистит таблицу firewall'а NAT.

Замечу, что в некоторых руководствах рекомендуют перед всем этим выполнить (на тот случай, если модуль tun выгружать не нужно или выгрузить не возможно):


su -c "tunctl -d $i &> /dev/null"


Примечание (к вопросу о DNS - пункт 8)

Команда:


echo "nameserver $DNS" > /etc/resolv.conf


Довольно неудобна в том случае, если вы используете DHCP для определения $host_ip. К примеру, следуя unix-way, я написал скрипт для поднятия сетевого интерфейса на виртуальном компьютере. Скрипт записан на образ флоппи-дискеты, а образ подключается непосредственно к виртуальной машине. Так вот. Куда удобнее (а для моего скрипта - единственный выход) делать:


echo "nameserver $host_ip" > /etc/resolv.conf


Запросы DNS будут, в таком случае, следовать в реальную систему. В реальной системе можно, конечно, поднять BIND (для домашней сети, кстати, очень удобно - вы сможете иметь доступ ко всем компьютерам с помощью символьных имен), но можно воспользоваться средствами iptables. Просто сделайте в пункте 6 еще и:


iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination $DNS


Т.е. пакеты, пришедшие на порт 53 в формате udp (DNS-запросы), перенаправлять на хост $DNS - являющийся внешним DNS-сервером. Если вы решите написать скрипт для запуска QEMU с поддержкой сети, распарсить /etc/resolv.conf и присвоить DNS ip-адрес одного из серверов DNS не составит труда.

Вся последовательность действий по выводу виртуальной машины в сеть автоматизируется с помощью скрипта. Если вы используете в качестве виртуальной системы unix-like систему - вы сможете автоматизировать настройку сети и в ней - просто напишите скрипт, его поместите на образ флоппи-дискетки - и пользуйтесь!

Кое-что о Qemu

Предисловие

Qemu - это отличный эмулятор компьютера. Достоинства:


  • Является Open Source программой

  • Отлично справляется с такими системами, как Haiku, MenuetOS (чего не умеет VirtualBox)

  • Имеет свой "ускоряющий модуль" kqemu (хотя может работать и без него)

  • Является консольной программой (вы можете применять Qemu и в отсутствие X-ов)

  • Имеет кучу всяких разных настроек - даже способов организации сетевого подключения сэмулированного компьютера там по меньшей мере 3

  • Возможность подключения к сэмулированному компьютеру
  • ...



Зачем статья - отсылать к ней при возникновении разных вопросов.

Установка

Сайт Qemu

С компиляцией gcc 4.0.0 и выше возникают проблемы, поэтому я рекомендую скачать бинарную сборку (текущая версия 0.9.1) отсюда. Там обыкновенный tar.gz, который распаковывается в /.

"Ускоряющий модуль" kqemu (текущая версия, гарантированно работающая с qemu 0.9.1, - 1.3.0pre11) скачивается оттуда же. Его бинарной сборки нет, вам придется собирать модуль из исходных кодов (потребуются исходные коды Вашего ядра).

Корректная сборка kqemu с gcc 4.0.0 и выше не гарантируется. Собственно, собрать модуль у меня получилось только после наложения самопального патча:

(для 2.6.25.*)


--- kqemu-linux.c 2007-02-07 00:02:00.000000000 +0300
+++ kqemu-linux.c_true 2008-04-30 14:39:04.000000000 +0400
@@ -16,6 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <linux/sched.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/errno.h>


После сборки загрузите модуль и поставьте корректные права на /dev/kqemu:


su -c 'modprobe kqemu && chmod 777 /dev/kqemu'


Работа

Нет ничего сложного, кроме того, что qemu - консольная программа. Запустите qemu без параметров, чтобы узнать, как его использовать.

Если Вы не используете режим "-nographic", вам могут пригодится сочетания клавиш:

  • CTRL-ALT-f - полноэкранный режим и обратно

  • CTRL-ALT - освободить захваченные qemu мышь и клавиатуру

  • CTRL-ALT-1 - (переключится на виртуальную консоль qemu за номером 1) дисплей эмулируемого компьютера

  • CTRL-ALT-2 - консоль управления qemu (очень пригодится Вам для управления доступа qemu к съемным дисками)



Для создания образов жестких дисков Вы должны использовать "qemu-img". Стоит заметить, что поддерживаются диски разных форматов, но самый продвинутый - qcow2 (а умолчательный - raw). Поэтому для создания образа используйте:


qemu-img create -f qcow2 NAME SIZE


Где:

  • NAME - имя результирующего файла

  • SIZE - размер образа (допускаются суффиксы вроде: "M", "G")



* С помощью "qemu-img convert" всегда можно сконвертировать образ из одного формата в другой.

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

AQemu

AQemu - отличный графический front end для qemu. Если Вы использовали VirtualBox только из-за его удобного GUI, то Вам стоит посмотреть на AQemu.

AQemu разрабатывается в рамках Северо-Кавказской LUG, текущая версия - 0.4. Программа весьма стабильна, красива и удобна. Единственное "но" - работает с Qt4 (по мне, так Qt4 - просто шикарная весчь).

Плюсы:


  • Русский язык

  • Qt4 (да, да - возможно кому-то не нравится)

  • Удобная организация интерфейса - каждый винтик "по делу", что называется

  • Мастер для начинающих

  • Куча всяких настроек (корректно перенесено все "настроечное" многообразие qemu в GUI)

  • Подключить эмулируемый компьютер к сети можно в два-три щелчка (это мне особенно нравится - я вспоминаю свои мучения при подключении qemu через tun/tap)

  • Панелька управления виртуальной машиной

  • Разные там шаблоны и т.п. мелочь



Минусы (их немного):


  • Мелкие досадные баги (к примеру, иногда при создании образа диска вылетает диагностическое сообщение о невозможности этот образ создать - хотя фактически он создается и становится доступен)

  • Отсутствие вменяемой справки (а очень хотелось - новичкам aqemu понравилося бы)

  • Разные изменения в расположении файлов от релиза к релизу (при обновлении до 0.4 пришлось вручную редактировать ~/.config/ANDronSoft/AQEMU.conf)



Что почитать про qemu



P.S. Пост полностью подготовлен в Vim, который, как обычно, рулит :-)

По мотивам LOR'а

Просмотрел сейчас сводку по "главно-страничным" темам на LOR'е (за 10 дней). Итак, имхо (!), самое достойное:
  • Battle Tanks 0.8-RC1 - редкостное глюкалово. Игра сама по себе интересная (особенно для сетевых покатушек в офисе), но вот ее нелюбовь к fglrx меня просто убила (учитывая то, что я не пользуюсь compiz'ом). В-общем, грустно. Авторы - доводите игру до ума.

  • Что придёт на смену xorg.conf? - gconf, в данном случае, зло, "реестроподобный велосипед" - потенциальный источник путаницы; нынешний xorg.conf вполне справляется со своей работой

  • Diamond Fighters v.0.9.1 - неплохой клон "танчиков". Игра и вправду отличное, но, к сожалению, короткая. Ждем, когда авторы откроют исходники (жаль, что они на Pascal'е)

  • Начато портирование OCR CuneiForm под Linux - выложенная alpha у меня не собралась (Slackware 12.1 gcc 4.2.3). Очень досадно, учитывая то, что нормальных ocr для работы с русским в linux нет. До сих пор работаю с FineReader в Win2003 SP1

  • Линус Торвальдс обдумывает новую схему нумерации версий ядра Linux - коротко: представленная им идея - бредовая. Пусть уж лучше: 14.08.2008. Так будет понятнее

  • ALSA 1.0.17 - эхх, помню, было дело - звук на машине со Slackware 11 и AC97. Кррррасота! Перекомпиляция ядра + отдельная компиляция alsa. А сколько я шел к этому решению! Все-таки некоторые драйверописатели и дистростроители иногда(!) могут быть редкостными скотами

  • Linux 2.6.26 - много чего интересного, но переползать на домашней машине не буду - пока не проянится ситуация с ati (кто виноват в багах? - кривые модули agpgart и amd64_agp или все-таки сам fglrx)

  • 11 мифов о KDE4 - эт я в предвкушении KDE 4.1 начитался комментов. В целом - с мифами согласен. Насчет форка - это с KDE рано или поздно произойдет - имхо, Nokia прикроет лавочку QT - библиотека сдуется и ее форкнут - а вместе с QT и KDE

Мелочи

random_watching.py, о котором я писал здесь, мною был сегодня обновлен. Пофиксены два мелких бага.

Написал небольшую программку - позволяет просмотреть все видеофайлы в указанной дирректории с помощью xine. Изюминка в том, что программа обрабатывает также некоторый oldlist - файлы, которые прописаны в oldlist, исключаются из списка воспроизведения.

-----------------------------------------------------------------------

Вышел ATI Catalyst 8.7. Уже скачал и сейчас буду тестировать. Очень надеюсь на исправленные баги с lock/unlock'ами экрана и завершении сессии.

Настройка VIM

Так уж случилось, что Vim я пользую уже почти три года - он отлично подходит в виде IDE для 80% проектов, он бесподобен в роли "читалки" для разнообразных текстов, он отлично справляется с редактированием разных конфигов, а иногда я даже пишу в нем письма - короче говоря, Vim - мое все. И замечательно, что он консольный и кроссплатформенный.

Вот так мой vim выглядит (пишу небольшой эмулятор микропроцессора):


Vim умеет, кроме всего прочего, следующие вещи:
  • Проверка орфографии для русского языка (с помощью aspell)

  • Работа с ctags (навигация по классам/функциям/макросам открытых файлов с исходным кодом) через удобное окно (плагин taglist.vim - с корректной установкой документации для этого плагина пришлось повозиться - я изменил taglist.txt на taglist2.txt и проделал то же внутри файла (первая строка))

  • Работа с метками с помощью вспомогательной панели (плагин showmarks.vim)

  • Удобное автодополнение (плагин supertab.vim)

  • Работа с X-вым буфером обмена и буфером обмена gpm'а (средняя кнопка мыши)

  • Подсветка синтаксиса для огромного количества языком и конфигов (даже мой любимый erlang не забыли)

  • Метки - локальные и глобальные

  • Механизм сессий (тьфу, меня аж покоробило)

  • ...
* Перед использованием vim в slackware 12.1 перекомпилируйте его - для включения возможности работы с X-вым буфером - эта возможность достигается уже на N-ом уровне компиляции

** Немного в сторону - aspell и настроенная в нем поддержка русского языка моментально делает жизнь в KDE намного приятнее. Хоты бы в kmail или kopete

Для начала - мой vimrc:

" Кодировка скрипта - utf-8
scriptencoding utf-8

"Отключаем режим совместимости с vi
set nocompatible
" Отключаем backup'ы
set nobackup
" При поиске - игнорировать регистр
set ic
" Нумерация строк
set nu
" Не выгружать буфер при переходе на другой файл
set hidden
" Умолчательная кодировка
set termencoding=utf-8
" do incremental searching
set incsearch
" keep 50 lines of command line history
set history=50
" show the cursor position all the time
set ruler
" display incomplete commands
set showcmd
" Время обновления окна = 0 миллисекунд (делаем из vim "редактор реального времени")
set updatetime=0
" Отключение звукового сигнала (на всякий случай - системный динамик у меня всегда отключен уже в ядре)
set novisualbell

" Кое-какие автозамены
iabbrev ### ############################################################################
iabbrev --- ----------------------------------------------------------------------------

" Автовставка моих копирайтов
com AMV call amv#amv_copyright()
com VERZHAK call amv#verzhak_copyright()
com GPLv3 call amv#gplv3()
map :call amv#amv_copyright()
map :call amv#verzhak_copyright()
map :call amv#gplv3()

" Проверка орфографии
" - включить/выключить проверку
map :call amv#toggle_spell()

" Убрать из режима вставки
" (Теперь будет вставляться )
imap < F1>

" Копирование/вставка в/из буфер обмена X
" (этот буфер называется +)
map "+y
map "+p

" Автозавершение скобок
imap { {}O
imap [ []
imap ( ()

" Отключаем детей Уганды
set shortmess+=I

" statusline
set laststatus=2
" Первый вариант statusline
" set statusline=%<%f\ -\ Буффер:\ %2n[%M%R%W]\ \|\ Под\ курсором\ -\ %3b[0x%2B]\ \|\ Строка\ -\ %5l[%3p%%]\ Колонка\ -\ %2c
" Второй вариант statusline (рабочий)
set statusline=%<%f\ -\ Буффер:\ %2n[%M%R%W]\ \|\ Строка\ -\ %5l[%3p%%]\ Колонка\ -\ %2c\ \|\ %{Tlist_Get_Tagname_By_Line()}

" Исправление отступов после вставки gpm'ом (и т.п.)
inoremap u:set paste.:set nopastegi

" Найти ту-ду во всех неудаленных буферах
com TODO call amv#is_have_string_in_buffer("TODO")
map :TODO

" Открыть все файлы из текущей папки
com OpenAll call amv#open_all()

" Вывести список всех локльных/глобальных/локальных_и_глобальных отметок
" (Интересно, можно ли сделать проще?)
com LM marks qazxswedcvfrtgbnhyujmkiolp
com GM marks QAZXSWEDCVFRTGBNHYUJMKIOLP
com AM marks qazxswedcvfrtgbnhyujmkiolpQAZXSWEDCVFRTGBNHYUJMKIOLP
com LMarks LM
com GMarks GM
com AMarks AM

" Быстрое сохранение сессии
map :mks!

" Открыть окно тегов по
nnoremap :TlistToggle
" Окно тегов не открывается автоматически
let Tlist_Auto_Open=0
" Если кроме окна тегов более не открыто ни одного окна - покинуть vim
let Tlist_Exit_OnlyWindow=1
" Окно тегов располагается справа
let Tlist_Use_Right_Window=1

" Отображать панель с marks по умолчанию (plugin/showmarks.vim)
let showmarks_enable=1

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Поддержка мыши

set mouse=a
set mousemodel=popup

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Подсветка синтаксиса

" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Отступы - если автокоманды поддерживаются, то одним способом, иначе - другим

" Only do this part when compiled with support for autocommands.
if has("autocmd")

" Enable file type detection.
" Use the default filetype settings, so that mail gets 'tw' set to 72,
" 'cindent' is on in C files, etc.
" Also load indent files, to automatically do language-dependent indenting.
filetype plugin indent on

" Put these in an autocmd group, so that we can delete them easily.
augroup vimrcEx
au!

" For all text files set 'textwidth' to 78 characters.
autocmd FileType text setlocal textwidth=78

" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid or when inside an event handler
" (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif

augroup END

else

set autoindent " always set autoindenting on

endif " has("autocmd")

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Кое-что еще (разные другие настройки из vimrc.orig, которые я не стал удалять)

" allow backspacing over everything in insert mode
set backspace=indent,eol,start

" Don't use Ex mode, use Q for formatting
map Q gq
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


amv.vim

Кроме разнообразных чужих плагинов у меня есть один самопальный - собственно, в него я складирую все свои функции (amv.vim лежит в ~/.vim/plugin). Вот его содержимое:


" Открыть все файлы из текущей папки
" Не спускаясь при этом рекурсивно в папки (!)

function amv#open_all()
         let fl = split(system("ls"),'\n')
         for x in fl
                 exe "new ".x
         endfor
         bfirst
         only
         ls
endf

" Данная функция проверяет все существующие (неудаленные) буферы на
" нахождение в них подстроки из str
function amv#is_have_string_in_buffer(str)
         for bf in range(1,bufnr("$"))
                 let name = bufname(bf)
                 let num = 0
                 let sp = []
                 if bufloaded(bf)
                         let sp = getbufline(bf,1,"$")
                 else
                         if buflisted(bf) && filereadable(name)
                                 let sp = readfile(name)
                         endif
                 endif
                 for x in sp
                         if match(x,a:str) > -1
                                 let num = num + 1
                         endif
                 endfor
                 if num > 0
                         echo "Buffer: ".bf." (file ".name.") содержит ".a:str." ".num." раз(а)"
                 endif
         endfor
endf

" Toggle проверку орфографии

function amv#toggle_spell()
         if &spelllang == "ru"
                 set nospell spelllang=
         else
                 set spell spelllang=ru
         endif
endf

function amv#amv_copyright()
         a
         " Здесь мой копирайт для amv
.
endf

function amv#verzhak_copyright()
         a
         " Здесь мой копирайт для verzhak
.
endf

function amv#gplv3()
         a
         " Здесь лежит GPLv3
.
endf


Собственно, vim содержит в себе мощный язык программирования, способный автоматизировать не только эти - примитивные - действия. Кстати, vim поддерживает возможность написания plugin'ов для себя на других яп - c, python, ruby.

Я вернулся

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

Окончание обзора Enlightenment будет в августе, раньше не успею (к сожалению).

Enlightenment - часть вторая: E16

Итак, приступим к настройке E16. Собственно, ничего особенного сложного я вам не открою.

Запустите E16.

Управление:

Можно настроить keybindings для клавиатуры и работают все три кнопки мыши. Средняя кнопка - вызывает "Общее меню" - там будет всё: настройки, меню приложений, доступные действия над e16, меню тем и т.п. Правая кнопка - меню "Настройка E16" - первый пункт ("Enlightenment Settings") это общее окно настройки, все остальные пункты лишь отображают вкладки этого окна. Левая кнопка мыши вызывает меню приложений - оно настраивается с помощью конфигурационных файлов и умолчательно содержит кое-какие "мертвые пункты" (у меня, например, отродясь не было rxvt).

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

Окна:

Щелкните левой кнопкой мыши, в появившемся меню запустите произвольную графическую программу (например, xterm) и экспериментируете на нем.

Двойной щелчок по заголовку свернет окно в полоску заголовка, а не развернет. Свертывание окна убирает окно с экрана, а его значок помещает в Iconbox (это такое окошко в нижнем правом углу). Щелкнув по значку в Iconbox'е вы развернете окно в прежнее положение.

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

Щелкните правой кнопкой мыши по заголовку окна - вы получите меню окна. Кроме стандартных "развернуть/свернуть" и т.п. доступна фиксация разных параметров окна (см. подменю "Miscellanous"), существует механизм групп окон (совместное управление набором окон) (см. подменю "Window Groups"), изменения стиля окна (подменю "Set Border Style") и много чего еще.

E16, вообще, по части управления окнами - довольно гибкая штука.

Темы:

Умолчательная тема - winter. Щелкните левой кнопкой мыши - если в появившемся меню вы прочитали "Перезапуск" (предпоследний пункт), значит шрифты Vera данной темы работают как надо. Если вместо "Перезапуск" были нечитабельные квадраты или прочая ерунда - у e16 проблемы с вашей локалью - смотрите [2].

Если вы хотите другую тему - вам опять же нужно прочитать [2]. Скажу, что много тем обретается на freshmeat [3]. Вы скачиваете архив и распаковываете его в ~/.e16/themes - получаете либо каталог с некоторым именем (это имя - название темы, запомните его) или набор каталогов и файлов - тогда вам нужно поместить весь этот зоопарк в один каталог (имя которого будет названием темы). Далее, вы запускаете E16:

e16 --theme NAME

где NAME - название темы (кстати, e16 по умолчанию использует тему последнего запуска, помните об этом); или щелкаете средней кнопкой мыши и в появившемся меню выбираете "Themes->NAME", где NAME - опять же название темы. Единственная проблема - шрифты. Скорее всего ваша локаль не будет поддерживаться - и весь русский язык - сообщения E16, названия окон и т.п. будут выводится крякозябликами. Тут необходимо будет дописать тему - подробнее процесс изложен здесь [2].

Поэкспереминтируйте с темами после, для ознакомления winter вполне пригодна.

Настройка:

Щелкните правой кнопкой мыши по свободному пространству рабочего стола и в появившемся меню выберите "Enlightenment Settings". Появится окно конфигурации E16 с множеством вкладок.

Умолчательные настройки, кстати, довольно удобны, и я покажу только те, которые изменил сам или, может быть, в первую очередь измените вы:
  • Move/Resize -> Режимы изменения размера -> установить в "Как есть"        -        При изменении размера окна будет отображаться само окно, а не его границы или что-то еще

  • Move/Resize -> Move/Resize Geometry Info Position -> установить в "Don't show"        -        При перемещении или изменении размера окна не будут отображаться его размеры и координаты в всплывающем окне

  • Move/Resize -> Update window while moving (установить)        -        При перемещении окно будет обновляться

  • Placement -> Переключаться на рабочий стол, где появляется диалог (снять)

  • Desks -> Рабочие столы = 1        -        Будет отображаться только один Pager (они называют такую "матрицу" - собственно, рабочим столом, но я, по старинке, называю рабочим столом только квадратик в "матрице")

  • Areas -> установить 6x1        -        Именно здесь можно установить размер вашего Pager'а

  • Pagers -> Pager Mode -> установить в "Simple"        -        Стиль Pager'а (мне нравится Simple)

  • Pagers -> Увеличивать иконки окон при прохождении курсора (снять)        -        Отключает довольно неудобный режим увеличения иконо при прохождении курсора по Pager'у

  • Menus -> Animated display of menus (установить)        -        Выглядит симпатично

  • Tooltips -> Показывать подсказки (целых два пункта)        -        Снимите галочки, если раздражает

  • Background         -        Устанавливает фон (все фоны лежат в ~/e16/backgrounds; поместите в этот каталог вашу картинку, чтобы потом установить ее как фон)
Меню:

Установки меню лежат в ~/.e16/menus/

Каталоги и файлы *.menu - это подменю (их названия - соотв. названия подменю). Содержимое файлов *.menu - пункты меню (каждая строка такого файла - пункт). Пункт имеет вот такой вид:

"NAME" "IMG" exec "PROGRAM"

Здесь: NAME - имя пункта меню; IMG - полный путь к значку; PROGRAM - программа для запуска.

Заключение:

Фуф. Обзор получился небольшим, но, я надеюсь, полезным. Обязательно почитайте блог sda00 [1] - этот человек знает почти все о E16 и E17 и его блог просто интересно читать.

Почитать:
  1. Блог sda00

  2. Статья sda00 о e16 и темах к нему

  3. Темы к E16 на freshmeat

Enlightenment - часть первая: Установка (E16 и E17)

Давайте поговорим о славном DE под названием Enlightenment. Даже, знаете, фактически о двух DE - 16 и 17 версиях E.

Преамбула

Давным-давно, во времена alpha KDE 4, у меня появились огромные сомнения в будущем Кед. Нужно было уходить с морально устаревшей тройки (хотя бы через пару лет), но 4-я была (и есть сейчас) очень и очень плохой. Я стал пробывать - и остановился на Enlightenment (Gnome - на gtk, icewm - некрасив и далее по списку).

Я собираюсь описать установку обоих версий, тонкости настройки и работы в e16 и e17 и, наконец, приведу обзор ресурсов, посвященных данной теме.
E16
  1. Загрузить исходные коды проекта можно со страницы Download сайта проекта (также там есть пакеты с бинариками для Fedora/Redhat, Debian'а, Suse и ebuild для Gentoo).

    Загрузить исходные коды библиотеки imlib2 можно отсюда. Imlib2 - это такая графическая библиотека, которую E вовсю пользует.

  2. Установка из исходных кодов:

    • Imlib2. Мой архив с исходными кодами называется imlib2-1.4.1.tar.bz2:

      tar xjf imlib2-1.4.1.tar.bz2
      cd imlib2-1.4.1
      ./configure
      make
      su -c 'make install'
      cd ..

    • E16 - у меня пакет называется e16-0.16.8.13.tar.gz:

      tar xzf e16-0.16.8.13.tar.gz
      cd e16-0.16.8.13
      ./configure --enable-modules --enable-dbus\
      --enable-xscrnsaver
      make
      su -c 'make install'
      cd ..

    • * Мы включим поддержку dbus, скринсейверов и модулей - расширений на всякий случай.

  3. Запуск E16. Давайте запустим Enlightenment 16 с помощью Xnest (X server в окне - почитайте мой предыдущий пост, он совсем короткий):

    Xnest :20 & xterm -display :20
    (в xterm, в окне Xnest) e16

  4. Настройка и использование: Смотрите Enlightenment - часть 2: E16
E17

В отличие от E16, для E17 нам нужно скачать с помощью CVS и собрать целый зоопарк программ и библиотек.

Попробуем провернуть дело с помощью автоматизирующего процесс скрипта.
  1. Приготовления. Давайте создадим "сборочный" каталог и перейдем в него:

    mkdir e17
    cd e17


  2. Установочный скрипт. Найти его можно здесь

  3. Получение и компиляция E17. У нас с вами есть скрипт easy_e17.sh. Установочная дирректория - /opt/e17 (по умолчанию), дирректория для среза cvs - ./cvs . Начнем:

    • Стандартный вариант:

      su -c 'export LOGNAME=root && sh easy_e17.sh -i -d --cvspath=`pwd`/cvs '

      Вам потребуется много чего: sqlite, mpd и pam - лишь верхушка айсберга. Аргументы:

      • -i         -         получить cvs-срез, выполнить компиляцию и установку

      • -d         -         установить также документацию

      • --cvspath=DIR         -         указывает каталог (DIR) расположения полученного среза

    • Кое-что отключим:

      su -c 'export LOGNAME=root && sh easy_e17.sh -i -d --skip=MODULE --cvspath=`pwd`/cvs '

      Где MODULE - те модули, которые вы не хотите устанавливать. Такая необходимость может возникнуть, если требуется отключить некоторые модули, которые не подходят вам по зависимостям. Например, я делаю так:

      su -c 'export LOGNAME=root && sh easy_e17.sh -i -d --skip=emphasis,mpdule --cvspath=`pwd`/cvs '

      т.е. отключаю модули, связанные с mpd (в т.ч. e-плеер)

    • Только компиляция и установка, без синхронизации cvs-среза:

      su -c 'export LOGNAME=root && sh easy_e17.sh -i -d -s --cvspath=`pwd`/cvs '

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

    • Мой способ:

      su -c 'export LOGNAME=root && sh easy_e17.sh -i -d --cvspath=`pwd`/cvs '
      su -c 'export LOGNAME=root && sh easy_e17.sh -i -d -s --skip=emphasis,mpdule --cvspath=`pwd`/cvs '


      Я делал именно так, ибо был не уверен в зависимостях

    • Некоторые другие аргументы скрипта:

      • -u, --update         -         обновить установку e17

      • --cvsupdate         -         обновить только срез

      • -c, --clean         -         произвести make clean для всех модулей и библиотек

  4. Запуск:

    Xnest :20 & xterm -display :20
    (в xterm, в окне Xnest) /opt/e17/bin/enlightenment_start



  5. Настройка и использование: Смотрите Enlightenment - часть 3: E17

Заключение


Сами понимаете - куда проще установить e16. Он идеально (имхо) подходит для самосборных установок - у меня есть LFS на флешке и там именно e16. И, кстати, e16 красив.

E17 - нечто другое. Графика на уровне, композитный графический движок (вам не понадобится 3D ускорение на карте), куча дополнительных модулей - просто замечательно, но минус огромный - e17 до сих пор в разработке, некоторые компоненты нестабильны (плагин - файловый менеджер использовать решительно нельзя), нет пакетов (только cvs). Однако, e17 легковесен и красив настолько, чтобы заменить собой KDE4 и новые выпуски Gnome (только в плане DE, разумеется). У меня e17 крутится паралельно с KDE3 и KDE4.

Карманный XWindow (Xnest)

Представьте - вам срочно понадобился запущенный XServer, но переключаться между консолями не очень-то хочется. Как быть?

Ответ прост - используйте Xnest (он входит в стандартную поставку XOrg).

Использование:

Xnest :NEW_DISPLAY & PROGRAM -display :NEW_DISPLAY

Здесь:
  • NEW_DISPLAY - номер "дисплея" (нумерация с 0; поставьте, к примеру, 33)

  • PROGRAM - имя запускаемой программы

Unreal 2004 и Linux

Итак, вопрос - как запустить свою Windows-установку Unreal 2004 в Linux?

Ответ:
  1. Открываем консоль

  2. Копируем windows-версию в каталог $HOME/UT2004 и переходим в него командой cd

  3. Патч: скачиваем патч для игры, распаковываем его в каталог $HOME/UT2004/UT2004-Patch/ и копируем содержимое этого каталога в $HOME/UT2004:

    wget -c http://treefort.icculus.org/ut2004/ut2004-lnxpatch3369-2.tar.bz2
    tar -xjf ut2004-lnxpatch3369-2.tar.bz2
    cp -fr UT2004-Patch/* ./

  4. Входим в систему как root:

    su -

  5. Удовлетворим зависимости:

    • Устанавливаем freealut и openal - Сайт проекта

    • Устанавливаем SDL (с префиксом /usr) - Сайт проекта и сделаем:

      ln -s /usr/lib/libSDL-X.Y.so.Z ./
      (/usr/lib/libSDL-X.Y.so.Z - ваша библиотека)

  6. Выйдем из сеанса root:

    exit

  7. (Это обязательно делать из-под обычного пользователя (не root)(!))

    mkdir $HOME/.ut2004

  8. Запуск:

    $HOME/UT2004/System/ut2004-bin


Некоторые замечания:

  • Почитайте вот это - инструкция для Gentoo, она на немецком. И еще - она великолепна

  • Для звука вам потребуется поддержка OSS (наличие /dev/dsp) - OSS отлично эмулируется ALS'ой

  • Кстати, если у вас видеокарта с чипсетом ATI - используете fglrx

  • Unreal 2007 for Linux обещан, но еще не вышел, хотя должен был появится весной

random_watching.py

Написал небольшую программку - позволяет просмотреть все видеофайлы в указанной дирректории с помощью xine. Изюминка в том, что программа обрабатывает также некоторый oldlist - файлы, которые прописаны в oldlist, исключаются из списка воспроизведения.

Скачивать здесь (кстати, Яndex.Диск рулит).

Зависимости: Python, libmagic (сделайте обязательно симлинк по имени libmagic.so)

Мелочи для python

import os

os.path.abspath(filename)      -    Получить абсолютный путь для filename

os.path.exists(filename)     -    Проверить, существует ли файл с именем filename

Определяем тип файла в Python

Работаем с помощью magic-последовательностей. Определение происходит с помощью libmagic.so (библиотека для C, заголовочный файл - magic.h, почитайте также "man libmagic"). Используем библиотеку с помощью ctypes.cdll.

Вот такой вот класс:


import ctypes

class CMagic:
   __mgc = None
   __cookie = None

   def __init__(self):
     #Загружаем libmagic.so
     self.__mgc = ctypes.cdll.LoadLibrary("libmagic.so")
     #Создаем новый cookie (требуется для
     #работы с magic-последовательностями)
     #0x10 | 0x400 = MAGIC_MIME (константа
     #декларируется в magic.h)
     self.__cookie = self.__mgc.magic_open(0x10 | 0x400)
     #Загружаем в __cookie
     #/etc/file/magic.mime (т.к. указано None)
     self.__mgc.magic_load(self.__cookie, None)

   def __del__(self):
     #Закрываем __cookie
     self.__mgc.magic_close(self.__cookie)

   def getMType(self,filename):
     #Получаем информацию о файле
     result = self.__mgc.magic_file(self.__cookie,filename)
     #magic_file возвращает const char*,
     #mimetype.value - это строка по указателю
     mimetype = ctypes.c_char_p(result)
     rez = mimetype.value
     return rez

   def is_video(self,filename):
     #Проверяем, является ли файл
     #- видео файлом
     mime = self.getMType(filename)
     if mime.count("video"):
       return 1
     return 0

Некоторые новости последней недели

(ссылки на opennet)

Opera 9.51

Больше всего мне понравилось вот это: Saving of images is no longer recorded in transfers.

bugfix-релиз.

Формат PDF утвержден в качестве международного стандарта ISO

Анонсирован финальный релиз Gentoo Linux 2008.0

Нужно будет пощупать.

Видеокарты ATI - установка драйверов от производителя

(данный how-to я уже публиковал в своем блоге в ЖЖ)

Как установить драйвер от разрабочика для видеокарты ATI в Linux.

-------------------------------------------
Intro
Необходимость установки драйверов от производителя для карт ATI в Linux - включение 3D ускорения, т.к. со всем остальным драйвера, включенные в ядро. прекрасно справляются.
-------------------------------------------

1)Скачать установочный файл с www.ati.com

Это здесь

Выбираем нужную платформу (Linux x86 или Linux x86_64) -> модель и серию карты
Нажимаем "Go"
Нажимаем на "ATI Driver Installer" -> начнется скачивание файла ati-driver-installer-X.XX.X-x86.x86_64.run (~55M)

2)Войдите в систему как root

3)Определение поддержки agp:

lsmod | grep agp

У меня появилось:

amd64_agp 9672 1
agpgart 27056 2 amd64_agp


Для корректной поддержки agp необходимо два модуля. Первый - agpgart, второй - зависит от материнской платы (для моей это amd64_agp)

Если модули появились - идем дальше. Вполне возможно, что второй модуль - не тот, что нужен вам, но это мы проверим при тестировании.
Одного из (или обоих) модулей нет:

find /lib/modules/`uname -r` -name "*agp*" - ищем модули, содержащие в названии agp, для вашего ядра

Если нашли agpgart и кучу других модулей - идем дальше - загрузку нужных модулей мы настроим впоследствии.
Модули не найдены или не найден agpgart - необходима перекомпиляция ядра. См. примечание 2.

4)Настройка XOrg.

Необходимо отредактировать конфигурационный файл /etc/X11/xorg.conf
Это производится с помощью программы aticonfig.
Сделайте: aticonfig - для получения справки. Самый простейший способ сконфигурировать XOrg: aticonfig --initial

5)Редактирование /etc/fstab

В /etc/fstab добавьте строку:
tmpfs /dev/shm tmpfs defaults 0 0

6)reboot

7)Загрузка модулей

Для корректной работы необходимо, чтобы были загружены три модуля: fglrx, agpgart и модуль, специфичный для вашей материнской платы (у меня - amd64_agp). Для просмотра загруженных модулей используйте команду lsmod.

а)Есть все три модуля - переходите к тестированию

б)Некоторых модулей нет - необходимо:

CTRL+ALT+F1
Войти как root
init 3
find /lib/modules/`uname -r` -name "*agp*"
modprobe ИМЯ_МОДУЛЯ
init 5 (или init 4 - в slackware)


Если нет модуля, специфичного для вашей материнской платы - эксперементируем с существующими модулями, пока при тестировании не будет положительных результатов -> попробовали - завершили XOrg - загрузили другой модуль - запустили XOrg - попробывали

После всех манипуляций у вас будут три модуля, необходимые для работы драйвера - их нужно будет загружать при загрузке системы - для этого:
в /etc/rc.d/rc.modules нужно добавить 'modprobe ИМЯ_МОДУЛЯ' (для slackware)
в /etc/modules добавить названия модулей (для mandriva)

8)Тестирование

Чтобы протестировать драйвер я делаю:

fgl_glxgears

(Появляется куб, а в терминале - результаты измерения fps)

glxinfo | grep "OpenGL"

У меня появляется:

OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: ATI RADEON 9600 Series
OpenGL version string: 2.0.6400 (8.35.5)
OpenGL extensions:


Этот вывод говорит о том, что OpenGL у меня работает -> драйвера установлены правильно (а главное - правильно загружены модули поддержки agp)

Если одна из у вас работают неправильно - вполне возможно, что третий нужный нам модуль (кроме agpgart и fglrx) - тот, который отвечает за поддержку материнской платы - на самом деле вашу материнскую плату не поддерживает -> перейдите к пункту 8 и попробуйте другой модуль.
-------------------------------------------
Примечание:
Если модули agpgart и специфичные *agp* для материнской платы не скомпилированы в ядре -> необходима перекомпиляция.
Конкретно, необходимо:
Device drivers -> Character devices

/dev/agpgart - модуль

(все support, кроме нужного вам support убрать)
нужный support - модуль

Direct Rendering Manager - убрать

Под support понимается модуль, поддерживающий вашу материнскую плату. В принципе - можно оставить все support.
-------------------------------------------

Заключение:

Кстати, а свежайшие на данный момент драйвера -
ati-driver-installer-8-6-x86.x86_64.run
- редкая гадость, однако :-)