воскресенье, 25 мая 2008 г.

Debian-Way установка Google Earth

Казалось бы, можно как и предлагает Google, установить это приложение прямо из GoogleEarthLinux.bin, но это не отражает правильного поведения в случае Debian-Like дистрибутивов. Во-первых, это приведет к установке в систему файлов, не отслеживаемых пакетным менеджером, во-вторых это может быть неудобным, если вам хочется установить это приложение на много однородных систем и регулярно обновлять его. В-третьих, для установки этого приложения в Debian есть специальный способ.


Итак, что же надо сделать, чтобы установить Google Earth?

1. Необходимо установить утилиту для создания пакетов .deb из его инсталлятора:
$ sudo aptitude install googleearth-package

2. Необходимо скачать оригинальный .bin дистрибутив с google.com:
Перейти на страницу загрузки

3. А теперь надо натравить (1) на (2)!

$ make-googleearth-package --file /tmp/GoogleEarthInstaller.bin

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

В итоге всех манипуляций, мы получим что-то похожее на "googleearth_4.3.7204.836+0.5.4-1_i386.deb", который можно устанавливать в систему, выкладывать в свой репозитарий (для внутреннего пользования) и т.д.

суббота, 24 мая 2008 г.

Смена CPU Affinity - привязки процесса к процессорам в SMP-системе

Давеча этот вопрос был задан, но ответ не сразу нашелся даже в google.
Суть его - как заставить процесс использовать не все процессоры, а только определенные? Для этого в SMP существует понятие "CPU Affinity Mask".
Для этого существует утилита taskset, входящая либо в пакет util-linux, либо schedutil.

taskset 0x00000001 command

заставит команду использовать только 1-й процессор системы

Вместо битовой маски можно использовать и просто список процессоров, а используя ключ -p - менять маску для уже запущенных процессов:
taskset -c 0,3 -p 12345

среда, 21 мая 2008 г.

Как не терять историю команд?

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



shopt -s histappend
PROMPT_COMMAND='history -a; history -n'





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



("Кросспост" с Полезные советы по Linux)

суббота, 10 мая 2008 г.

X.org 7.3, Debian Sid и клавиатура

После aptitude upgrade неожиданно обнаружил, что в иксах перестали работать старые комбинации клавиш (Ctrl-Alt-F1, например, гг). В поисках проблемы наткнулся на пакет xkb-data-legacy, который заменяет новый xkb-data - это решает проблему.

Но позже adjkerntz с #linux подсказал, в чем проблема - дело в том что вариант winkeys из новой версии xkb-data убрали, поэтому XkbVariant из конфига надо убирать.

Итак, я снова установил xkb-data и стер ",winkeys" из конфига xorg.conf - и полет нормальный!

суббота, 26 апреля 2008 г.

Excel, сетевые принтеры и тормоза

Как ни странно, жалобу пользователя на "долго открывается Excel" пришлось решать именно с помощью Wireshark. Ибо задержки, примерно похожие на ожидание таймаута ARP =)... как-то связаны обычно с сетью.

А что же делает Excel при запуске? Оно зачем-то лезет за сетевыми принтерами. И если эти принтеры находятся на недоступном сервере, он исключительно противно тормозит при запуске. Вот так все просто. Как лечить без удаления принтеров - пока не знаю.

четверг, 3 апреля 2008 г.

О туннелях в linux

Те, кто все-таки читал Linux Advanced Routing and Traffic Control HOWTO знают, что с помощью ip tunnel add можно создать ipip, gre или sit туннель. Но вчера случайно возник вопрос:
dpmmsrv:/home/stasikos# ip tun add gre0 local 192.168.20.250
ioctl: No buffer space available

Но:
dpmmsrv:/home/stasikos# ip tun sh
gre0: gre/ip remote any local any ttl inherit nopmtudisc

Да и вообще странно, что его нельзя удалить:

dpmmsrv:/home/stasikos# ip tun del gre0
ioctl: Operation not permitted


То же самое можно заметить, если вы создали ipip-туннель с именем tunl0, или sit-туннель с именем sit0.

Да, можно гуглить по этой ошибке. Скорее всего ответ вы найдете только в этой статье, если будете искать ответ на вопрос "как удалить tunl0".

Вот, ответ - по крайней мере до 2.6.22 (выше не проверял) - удалять туннели с именами tunl0, gre0, sit0 не удается.

Если почитать документацию к iproute2, можно заметить, что эти туннели называются "base devices". Это специальные устройства, у которых remote и local адреса устанавливаются в "any", и это конечный пункт для туннелированных пакетов, если они не попадают в критерии другого туннеля.
Туннель с другим именем с remote any local any создать нельзя. Нет, система не ругается, но туннель просто не создаст:
dpmmsrv:/home/stasikos# ip tun add gre1   
dpmmsrv:/home/stasikos# ip tun sh gre1
ioctl: No such device

Но если указать хотя-бы один адрес - ради бога, вот он:
dpmmsrv:/home/stasikos# ip tun add gre1 local 192.168.20.250
dpmmsrv:/home/stasikos# ip tun sh gre1
gre1: gre/ip remote any local 192.168.20.250 ttl inherit

Да, и такой туннель легко удаляется:
dpmmsrv:/home/stasikos# ip tun del gre1
dpmmsrv:/home/stasikos# ip tun sh gre1
ioctl: No such device


Полный ответ на этот вопрос есть в исходных кодах модулей ядра, которые и включают поддержку туннелирования. Откроем, например, net/ipv4/ip_gre.c.
В нем есть вот такие вот строки:
/* Fallback tunnel: no source, no destination, no key, no options */
static int ipgre_fb_tunnel_init(struct net_device *dev);

Вот это вот и есть gre0 устройство, которое создается при инициализации модуля:
(в __init)

ipgre_fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "gre0",
ipgre_tunnel_setup);

Причем в функциях конфигурирования и удаления туннелей мы заметим особые случаи попыток удаления и перенастройки этого fallback tunnel, которые и вызывают появление ошибки ioctl:Operation is not permitted:

case SIOCDELTUNNEL:
err = -EPERM;
if (!capable(CAP_NET_ADMIN))
goto done;

if (dev == ipgre_fb_tunnel_dev) {
err = -EFAULT;
if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p
)))
goto done;
err = -ENOENT;
if ((t = ipgre_tunnel_locate(&p, 0)) == NULL)
goto done;
err = -EPERM;
if (t == ipgre_fb_tunnel_dev->priv)
goto done;
dev = t->dev;
}
err = unregister_netdevice(dev);
break;


Как раз где-то тут оно и намеренно выдает эту ошибку.

P.S. Ничего страшного в том что туннель останется, нет.