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
- редкая гадость, однако :-)

lame 3.98

Тихо и незаметно (новость powered by LOR :-) ) на свет появился lame 3.98.

lame - наиболее продвинутый mp3 encoder, распространяемый по GPL.

Changelog:

  • Новая VBR psymodel

  • По-человечески поддерживаются ID3 теги

  • Много багов исправлено


Собственно, из-за ID3 тегов можно обновится.

ksocrat


ksocrat - словарь. Конечно, программа не лучше, чем stardict, но в отличие от последнего ksocrat написан на QT 3, чем мне очень импонирует :-)

Автор программы - Zavolzhsky Alexandr, а словари предоставлены компанией "Арсенал".

Как установить:

Все дороги ведут на сайт программы, где вы можете скачать исходные коды, русско-английский и англо-русский словари (других, к сожалению, нет).

Компиляция и установка до боли просты:

./configure && make && su -c 'make install'

Словари распакуйте следующим образом:

su -c 'tar -x --directory=/ -jf NAME'

(здесь NAME - ksocrat-ruen-dic-1.0.1.tar.bz2 или ksocrat-enru-dic-1.0.1.tar.bz2)

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

  • Русско-английский и англо-русский словари        -        Негусто, но большинству пользователей хватает;

  • Встраивание в трей (гарантируется для KDE 3)        -        Словарь всегда под рукой;

  • Автоопределение языка, на котором введено слово

  • Пословесный перевод фраз

  • Словари просто отредактировать

  • Перевод содержимого буфера обмена


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

К достоинствам программы можно отнести ее простоту, быстродействие, QT'шность (все относительно, конечно) и интеграцию с треем.

Минусы - последняя версия датирована 2004-м годом, у программы мало словарей, нет возможности перевода выделенного слова (это очень вкусная фича из stardict'а), нет версии под QT 4.

Заключение:

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

Ссылки:

Сайт программы (впрочем, я повторяюсь)

Автоматизация - find + sed + xine (смотрим мультфильмы)

Дано: каталог с кучей avi'шек ("Розовая пантера", но это не принципиально :-) ), распиханных по подкаталогам.

Задача: все мультфильмы с помощью xin'а просмотреть в произвольном порядке.

Решение: открываем консоль, переходим в каталог и выполняем:

find ./ -name "*.avi" | sed s/.\\/// > 1.m3u && xine --loop=shuffle --auto-play=fh 1.m3u

Здесь:

  • find ./ -name "*.avi"        -    Находит все файлы с расширением "avi" в данном каталоге;

  • sed s/.\\/// > 1.m3u        -        Полученный предыдущей командой список переправляем в sed, который удаляет все вхождения "./" во всех строках. Результат сохраняется в плейлисте 1.m3u;

  • xine --loop=shuffle --auto-play=fh 1.m3u        -        Собственно, запускаем xine. "--loop=shuffle" предписывает ему проигрывать плейлист в случайном порядке, а "--auto-play=fh" вынуждает развернуть окно вопроизведения на весь экран ("f") и скрыть окно управления плеером ("h").


* Собственно, мне было удобно "загнать" всю эту последовательность в скрипт.

** К сожалению, xine не может (или я не умеют) добавлять в свой плейлист содержимое каталогов рекурсивно - вот и приходится выкручиваться.

htop

Есть такая отличная программа - top называется. Вы ее знаете ;-) top меряет загруженность системы - расход памяти, использование процессоров и т.п. вещи. Но у top'а есть одна особенность - он очень уж неудобен, особенно для новичков. Может быть, есть что-нибудь поудобнее top'а? Есть. И называется эта программа htop.

htop - как вы уже смогли понять, это консольная программа для мониторинга вашей системы.

1) Установка

*Зависимости: ncurses

  • Исходные коды

    Скачать программу можно с помощью страницы скачивания htop'а на sourceforge.

    * За срез development-версии отвечает svn:

    svn co https://htop.svn.sourceforge.net/svnroot/htop/trunk htop

    Я загрузил htop с помощью svn (я люблю все самое свежее :-) ).

    Скомпилируем и установим программу:

    ./configure --prefix=/usr && make && su -c 'make install' && echo "Install completed"

    Если на экране у вас появилось:

    Install completed

    то установка прошла успешно.

  • Ubuntu

    Запустите "Add/Remove Applications", выберите категорию "System tools" и "All Open Source Applications", выберите "htop" и, наконец, щелкните по "Apply Changes".

    *На момент написания поста в репозитории Ubuntu доступен htop версии 0.6.6


----------

По окончании процесса установки запустите htop, выполнив в консоли:

htop

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

Итак, htop у вас запущен. Вот так программа выглядит у меня:



Интерфейс:
  • Верхний левый угол: суммарная статистика по системе - использование CPU в процентах, реальное использование памяти (т.е. суммарный объем действительно занятых физических страниц оперативной памяти (!)), реальное использование swap'а.

  • Верхний правый угол: данные о количестве запущенных процессах, об аптайме и т.п.

  • Основное поле: список процессов с данными о них.


На основном поле особый интерес представляют поля:

  • PID        -        идентификатор процесса;

  • USER        -        имя пользователя - владельца процесса;

  • PRI        -        текущий приоритет процесса (влияет на процессорное время, отводимое процессу) (значение по умолчанию - 20; чем меньше приоритет, тем больше времени отводится процессу => он выполняется быстрее);

  • VIRT        -        размер виртуальной (! не реальной) памяти, выделенной процессу;

  • CPU%        -        интенсивность использования процессом процессора;

  • MEM%        -        процент потребления реальной памяти процессом;

  • TIME+        -        время работы процесса;

  • Command        -        команда, которой процесс запущен.

Сочетания клавиш для работы с htop:

  • F1, h        -        Отобразить помощь (здесь и далее - вернуться обратно вы сможете с помощью Esc);

  • F2, S        -        Настройка htop (Meters и Columns настраивают соответственно поля в верхнем правом углу и колонки в основной области; Display Options и Colors - настраивают опции отображения и цвета, используемые в программе);

  • F5        -        Установить древовидный режим отображения (корни - родительские, а листья - дочерние процессы) (нажмите еще раз F5, чтобы вернуться к режиму отображения по умолчанию);

  • F6        -        Позволяет выбрать колонку для сортировки процессов (на основном поле);

  • M, P, T        -        Сортировать процессы по, соответственно, реальному потреблению памяти/использованию процессора/времени выполнения;

  • -, +        -        Повзоляет понижать/повышать приоритет процесса (доступно только для суперпользователя);

  • s        -        Вызвать strace для выбранного процесса;

  • Пробел, U        -        Позволяют, соответственно, отметить процесс и снять отметки со всех процессов (маркировка процессов нужна для массовой рассылки сигналов);

  • F9        -        Отправить определенный сигнал всем маркированным (если таковые имеются) и выбранному процессу (нужный сигнал можно выбрать в прилагающемся списке :-) );

  • F10        -        Выйти из htop



Как видите - все довольно просто. htop'ом просто "рулить" с помощью функциональных клавиш (посмотрите на нижнюю панель - она не даст вам запутаться в функциях клавиш F1-10).

*Во вполне понятном "man htop" приведены также дополнительные клавиши для управления htop'ом.

3) Оценка

htop очень приятная на вид (цветная :-) !) и интуитивно понятная программа. Даже не читая man, можно быстро разобраться, что к чему. "man htop", кстати, также довольно четко описывает программу и принципы работы с нею. Возможно, top несколько более функционален, но htop более чем сгодится для наших скромных нужд.

Минусы - старая версия пакета в официальном репозитории Ubuntu и зависимость от ncurses. Оба минуса, по большому счету, смехотворны.

4) Ссылки

Сайт разработчиков

Статические и динамические библиотеки в Linux

Статические и динамические библиотеки в Linux


Здравствуйте.

Сегодня мы поговорим о библиотеках в Linux (подозреваю также, что многие описанные здесь вещи возможны и в других *nix-операционных системах, но это требует проверки :-) ).

Мы рассмотрим:

1) Статические библиотеки (создание с помощью Assembler, C/C++; подключение и использование в программах на Assembler,C/C++);
2) Динамические библиотеки (создание с помощью Assembler, C/C++; подключение и использование в программах на C/C++l, Python).

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

Часть 1.

Статические библиотеки.

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

В Linux, как правило, файл-статическая_библиотека имеет расширение ".a"

2) Статические библиотеки на языке C.

Исходный код библиотеки:

######################
#include <stdio.h>

extern int hello()
{
printf("Hello world! I'm static library\n");
return 0;
};

######################

Сохраните его в файле static.c

Ключевое слово extern необходимо для того, чтобы функция была видна в программе.

Теперь скомпилируем (! без линковки) библиотеку:

gcc -c static.c -o static.o
(на выходе имеем файл static.o, содержащий объектный код нашей библиотеки)

ar rc libMY_STATIC.a static.o

ar упаковывает несколько (! Это важно. Дело не ограничивается только одним объектным файлом) объектных файлов в одну статическую библиотеку. Статическая библиотека имеет расширение ".a", при этом ее название должно начинаться с "lib" (дань традиции).
Параметры ar:
r - предписывает заменять старые версии объектных файлов новыми - необходим для переупаковки библиотеки;
c - создать статическую библиотеку, если та еще не существует.

Проиндексируем функции внутри библиотеки для более быстрой линковки:

ranlib libMY_STATIC.a

Итак, мы получили статическую библиотеку libMY_STATIC.a.

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

Исходный текст программы (C):

######################
#include <stdio.h>

int main()
{
int x = hello();
printf("Return code: %d\n",x);
return 0;
}

######################

Сохраните его в файле program1.c

Способы связывания библиотеки и программы:

- Скомпилируем и слинкуем (в том числе с нашей библиотекой) нашу программу:

gcc program1.c libMY_STATIC.a

(предполагается, что в качестве аргумента gcc будут переданы полные пути (!) к вашим библиотекам)

И запустим:

./a.out

На выходе получим:

Hello world! I'm static library
Return code: 0


Отлично!

- Скомпилируйте с помощью команды:

gcc program1.c -L. -lMY_STATIC -o a1.out

Смысл аргументов:

-L - путь к каталогу, содержащему наши библиотек (используйте "-L -L - название нашей библиотеки (это важно - название (!), а не имя файла - собственно, если библиотека имеет своим именем "libBLABLABLA.a", то ее названием будет "BLABLABLA" - т.е. имя без приставки "lib" и расширения ".a") (для нескольких библиотек используйте "-l -l ...")

Запустите файл a1.out на выполнение и удостовертесь, что результаты те же, что и в предыдущем пункте.

- Видоизменим предыдущий способ - уберем аргументы "-L":

В начале проверим значение переменной LD_LIBRARY_PATH и содержимое файла /etc/ld.so.conf:

echo $LD_LIBRARY_PATH ; cat /etc/ld.so.conf

На экране появился некоторый список каталогов - это те каталоги, в которых система ищет библиотеки при их линковке с программой (еще к таким каталогам относятся:
/lib
/usr/lib
. Поместите libMY_STATIC.a в один из этих каталогов:

(Я, к примеру, засуну нашу библиотеку в каталог /usr/lib):

su -c 'cp libMY_STATIC.a /usr/lib'
(в Ubuntu - sudo cp libMY_STATIC.a /usr/lib)
ldconfig
(ldconfig обновляет кеш данных о библиотеках линковщика)

Теперь скомпилируем и запустим нашу программу:

gcc program1.c -lMY_STATIC -o a2.out
./a2.out


Результат:

Hello world! I'm static library
Return code: 0


Бинго! Кстати, таким вот способом вы можете подключать к своей программе любые статические библиотеки из приведенных выше каталогов.

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

3) Статические библиотеки на языке Assembler.

Представьте, что вам необходимо оптимизировать выполнение некоторых действий в вашей программе. Разумеется, вы может применить ключевое слово asm (если пишите программу на C/C++), но лучшим решением будет создание оптимизированной вами библиотеки на языке Assembler и подключение ее к вашей программе. Давайте попробуем:

*Кстати, углубляться в процесс компиляции библиотеки и ее линковки с вашей программой я не буду (!). Этот процесс идентичен полностью (!) тому же процессу для библиотек, написанных на языке C.

Итак, имеем вот такую программу:

######################
#include <stdio.h>

int main()
{
printf("Hello world!\n");
return 0;
};

######################

Сохраните ее в файле program2.c

Скомпилируйте ее и запустите:

gcc program2.c
./a.out


Я получил:

Hello world!


Отлично.

Я привел этот пример, чтобы показать действительно возможность оптимизации программы с помощью библиотеки на Assembler'е. Вы можете заметить, что вызов printf в main() не оптимален, т.к. printf, по крайней мере, один раз использует цикл while для поиска вхождений конструкций "%..." в строку. Это не оптимально, т.к. очевидно, что таковых символов у нас нет. Оптимизируем нашу программу с помощью библиотеки на Assebmler'е:

######################
.text
.globl my_printf

my_printf:
movl $4,%eax
xorl %ebx,%ebx
incl %ebx
movl $hw,%ecx
movl $hw_e,%edx
int $0x80
xorl %eax,%eax
ret

.data
hw:
.string "Hello world!\012"
hw_e = . - hw

######################

Сохраните исходный код библиотеки в файле static2.s

Это AT&T наречие Assembler'а.

.globl my_printf - "my_printf" описывается как глобальная (видимая в других объектных файлах) последовательность
my_printf: - начало описание функции my_printf
movl $4,%eax - поместим 4 в eax (4 - номер системного вызова write)
xorl %ebx,%ebx и incl %ebx - поместим в ebx единицу - номер STDOUT
movl $message,%ecx - в ecx запишем адрес начала сообщения
movl $message_l,%edx - в edx поместим адрес конца сообщения
int $0x80 - произведем системный вызов write
xorl %eax,%eax - в eax - код возврата (0)
ret - вернемся в вызывающую процедуру
.data - секция данных (разумеется, мы могли бы передавать выводимую строку как параметр, но тогда вычисление ее конца потребовало бы от нас дополнительных усилий, что, согласитесь, лениво :-) )

Теперь получим библиотеку:

gcc -c static2.s -o static2.o
ar rc static2.a static2.o
ranlib static2.a


На выходе имеем статическую библиотеку static2.a

Теперь напишем программу, использующую эту статическую библиотеку (язык C):

######################
#include <stdio.h>

int my_printf();

int main()
{
int x = my_printf();
return 0;
}

######################

Сохраните текст программы в файле program3.c

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

Скомпилируем и слинкуем программу с библиотекой, после чего запустим программу на выполнение:

gcc program3.c static2.a
./a.out


На выходе получим:

Hello world!


* Принцип линкования статических библиотек с программами на Assembler'е аналогичен принципу для программ на C. Просто, когда будете использовать статические библиотеки в Assembler'е, помните о соглашениях C по передаче аргументов в функцию и возвращению результата.

4) Статические библиотеки на языке C++.

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

extern "C"

(экспортировать как функцию на C - т.е. без расширения имен).

* Кстати, используйте g++ вместо gcc, если захотите протестировать приведенные выше примеры.

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

extern "C" PROTOTYPE

Где PROTOTYPE - прототип импортируемой функции.

* При подключении статических библиотек на C++ к программе на C сопряжено с некоторыми трудностями - т.к. при компиляции и линковки программы необходимо будет также вручную подключить системные библиотеки для реализации функционала, предоставляемого библиотекой Standart C++ сверх того, что предоставляет библиотека Standart C.

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

Часть 2.

Динамические библиотеки (shared).

1) Динамическая библиотека - библиотека, подключаемая к программе в момент выполнения. Это означает, что при создании библиотеки производится не только ее компиляция, но и линковка с другими, нужными ей, библиотеками (!).

Динамические библиотеки полезны в случаях, если:
- Важно не перекомпилировать всю программу, а только перекомпилировать ту часть, которая реализует определенные функции - тогда эти функции выносятся в динамическую библиотеку;
- Важно использовать в программах на C библиотеки, подготовленные на C++ и при этом избежать лишних трудностей с линковкой программы;
- Кроме того, динамические библиотеки позволяют экономить место на жестком диске и в оперативной памяти, если одна и таже библиотека используется несколькими программами.

В Linux, обычно, динамические библиотеки имеют расширение ".so".

2) Подготовим исходный код динамической библиотеки (пример на C++).

Исходный код динамической библиотеки по принципам создания ничем (!) не отличается от исходного кода статических библиотек.

Здесь мы подготовим некоторый пример, который в дальнейшем будем использовать повсеместно во всей части 2.

Итак, исходный код библиотеки (C++):

######################
#include <iostream>
using namespace std;

#include <dynamic.h>

extern "C" int hello()
{
cout<<"Hello world!\n I'm function hello()"<<endl;
return 0;
}

######################

Сохраните приведенный код в файле dynamic.cpp.

* Кстати, внутри динамической библиотеки вы можете описать следующие функции:
void _init() - будет вызвана при инициализации динамической библиотеки (загрузки ее в память);
void _fini() - будет вызвана при выгрузке из памяти динамической библиотеки.

3) Компиляция и линковка динамических библиотек.

Давайте получим динамическую библиотеку:

Получим файл с объектным кодом:

g++ -fPIC -c dynamic.cpp -o dynamic.o

(используйте gcc для программ на С и Assembler'е)

Здесь:

-fPIC - использовать относительную адресацию в переходах подпрограмм - во избежание конфликтов при динамическом связывании

А теперь из объектного файла получим библиотеку:

g++ -shared -olibdynamic.so dynamic.o

(используйте gcc для программ на С и Assembler'е)

libdynamic.so - имя результирующей библиотеки;
-shared - предписывает создать динамическую (т.е. "разделяемую") библиотеку.

* Именуйте динамические библиотеки следующим способом:

libNAME.so

Это традиция ;-)

Итак, на выходе мы имеем libdynamic.so - нашу динамическую библиотеку.

4) Использование динамической библиотеки в программе на C/C++.

- Связывание с библиотекой во время компиляции программы (C/C++):

------ Подготовим исходный код нашей программы:

(С)

######################

int main()
{
int x = hello();
printf("Return code: %x\n",x);
return 0;
}

######################

Сохраните его в файле Dprogram1.c

ИЛИ

(С++)

######################
#include <stdio.h>

extern "C" int hello();

int main()
{
int x = hello();
printf("Return code: %x\n",x);
return 0;
}

######################

Сохраните его в файле Dprogram1.cpp

(единственное отличие, как вы можете заметить, в ключевом слове extern - см. часть 1 пункт 4)

------ Теперь добьемся того, чтобы система смогла найти нашу библиотеку. Поместим libdynamic.so в один из каталогов:

из списка:

echo $LD_LIBRARY_PATH
/lib
/usr/lib


или из списка:

cat /etc/ld.so.conf
и выполните потом "ldconfig"

------ И, наконец, скомпилируем программу и слинкуем ее с библиотекой:

gcc ИСХОДНИК -lИМЯ_БИБЛИОТЕКИ -o РЕЗУЛЬТИРУЮЩИЙ_БИНАРИК

В нашем случае: gcc Dprogram1.c -L/home/amv/c/libs/ -ldynamic

(используйте g++ для программы на C++)

Запустим на исполнение полученный файл:

./a.out

В итоге должно получится:

Hello world!
I'm function hello()
Return code: 0


- Связывание с библиотекой во время исполнения программы (C/C++):

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

Исходный код примера (C):

######################
#include <dlfcn.h>
#include <stdio.h>

int main()
{
void *handle = dlopen("libdynamic.so",RTLD_LAZY);
int(*fun)(void) = dlsym(handle,"hello");
int x = (*fun)();
dlclose(handle);
printf("Return code: %d\n",x);
return 0;
};

######################

Сохраните его в файле Dprogram2.c

В dlfcn.h определены следующие функции:

void* dlopen("PATH_AND_NAME",FLAG) - загружает в память динамическую библиотеку с полным именем PATH_AND_NAME и возвращает ее описатель (HANDLE) (NULL в случае неудачи). FLAG - флаги, описанные в "man dlopen";
void* dlsym(HANDLE,"NAME") - возвращает указатель на функцию/переменную, импортируемую из библиотеки;
int dlclose(HANDLE) - выгружает библиотеку из памяти;
const char *dlerror() - получить сообщение о последней возникшей ошибке (NULL - если ошибок не произошло с момента последнего вызова dlerror).

* Посмотрите на досуге вот этот перевод "man dlopen": Привет, OpenNET

Выполняем:

gcc -ldl Dprogram2.c

(используйте g++ для программы на C++)

Запустим на исполнение полученный файл:

./a.out

В итоге должно получится:

Hello world!
I'm function hello()
Return code: 0


* Важно! Нет необходимости помещать библиотеку в один из специальных каталогов, модифицировать переменные окружения и выполнять "ldconfig"

- Использование динамической библиотеки в программе на Python:

Все предельно просто.

------ Поместим libdynamic.so в один из каталогов:

из списка:

echo $LD_LIBRARY_PATH
/lib
/usr/lib


или из списка:

cat /etc/ld.so.conf
и выполните потом "ldconfig"

------ python:

Исходный текст программы на python'е:

######################
#!/usr/bin/python
import ctypes

dl = ctypes.cdll.LoadLibrary("libdynamic.so")
dl.hello()

######################

Модуль ctypes входит в стандартную поставку модулей python версии 2.5 и выше.

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

Фуф. Мы проделали довольно большую работу, но ведь это только верхушка айсберга.

P.S. Я намерено пропустил тему "Perl и динамические библиотеки" - сейчас мне просто лениво разбирать свои старые примеры. Могу только сказать, что за динамические библиотеки в Perl ведает модуль DynaLoader (и не только он), который является, по сути, оболочкой для dlfcn.h. Почитайте perldoc DynaLoader ;-)

UPDATE: 25.07.2008