Чего бы еще пожелать?
Создание моих первых приложений в Kylix прошло без проблем и неожиданностей. Камнем преткновения при создании реального приложения стало отсутствие современных средств для визуальной разработки и отладки отчетов и шаблонов веб-страниц. Было бы прекрасно создать такой инструмент - причем сделать его полиморфным для генерации как HTML-шаблонов, так и отчетов в распространенных форматах PDF, PostScript, TeX.
Другим крайне полезным инструментом мог бы стать интегрированный UML-редактор со встроенной поддержкой отображения как существующих, так и пользовательских CLX-классов, и автоматической генерацией кода и таблиц. Фактически многие UML-редакторы третьих производителей поддерживают CLX-классы, но встроенный инструмент мог бы работать на уровне максимальной интеграции.
Конечно, применение RAD провоцирует легкомысленное отношение к кодированию, так что вместе с Kylix в Linux придут и "кудесники от Access". Мы живем в эпоху массового производства, с этим уже поздно бороться - и все же: будете писать на Kylix - делайте это хорошо, плз!
Что поправить в свеже-проинсталлированном Linux
Я знаю единственный дистрибутив Linux, который можно было
использовать сразу, не ковыряясь в его конфиг-файлах, в пользовательском окружении, и т.п. - Slackware 1.0 образца 1994 года.
Все последующие релизы Slackware, а тем паче RedHat перед употреблением требуют хирургического вмешательства.
fstab: Пропал диск C:, где дискетки A:, B:
Проблемы:
Как работать с досовскими дискетами? RedHat предполагает, что настоящий unixоид пользуется дискетками формата ext2, и не встречается с FAT-овскими досовскими флоппи.
Не подключаются досовские разделы жесткого диска.
Потому что инсталлятор "забыл" сделать mount-point для них.
Что делать с CDROM-ом?
Лечение: Создать соответствующие каталоги
mkdir /a
mkdir /b
mkdir /cdrom
mkdir /dos
mkdir /dosd
В файле /etc/fstab добавить/исправить строчки:
/dev/fd0 /a msdos defaults,user,umask=000,noauto 0 0
/dev/fd1 /b msdos defaults,user,umask=000,noauto 0 0
/dev/cdrom /cdrom iso9660 defaults,user,ro,exec,dev,suid,noauto 0 0
/dev/hda1 /dos msdos defaults,user,umask=000 0 0
Crontab: масса излишних работ
crontab root'а лежит у RedHat в нестандартном месте - /etc/crontab . Может быть для БОЛЬШОГО много пользовательского internet-сервера и нужен такой огромный список планируемых работ, но все равно, рекомендую на него посмотреть, сократить частоту запуска раз эдак в 10, а кое-что совсем закомментировать.
Конкретно: сократить частоту atrun
0,10,20,30,40,50 * * * * root /usr/sbin/atrun
Документация как основа успеха
Вопрос успешности того или иного продукта часто зависит от наличия доступной и удобной документации. Признаюсь откровенно: документация по Delphi очень долгое время была для меня главным источником информации по многим аспектам Windows. Думаю, многие скажут то же самое. Замечательный Delphi Help содержит в себе исчерпывающую и доступную информацию не только по Паскалю, но также и по Win API, Win32 и технологии OLE/COM. Вполне естественно было ожидать такого же качества и от Kylix. Понятно, что вы не найдете здесь описания Win32, но зато представлены сведения о доступных разработчику средствах из арсенала Linux - libc, XFree и, конечно, полные сведения о компонентах CLX. Справка Kylix Help выполнена в формате HyperHelp и внешне больше похожа на справку в Windows 3.11, но поскольку оглавление и поиск в наличии - то это не вызывает никаких неудобств.
Доступ к базам данных
Если под Windows возможно несколько методов доступа к базам данных, то для Linux единственным методом является прямое подключение к SQL-серверу через прилагаемый драйвер. Из компонентов доступа "на выбор" только dbExpress, через который поддерживаются распространенные базы данных: DB2, Informix, Interbase, MySQL, Oracle и PostgreSQL.
Фактически dbExpress - это очень тонкий и прозрачный уровень, непосредственно переводящий запросы в сервер. При запросах к базам данных dbExpress порождает локальные копии данных, освобождая сеанс с сервером. В процессе запроса предусмотрены трансформации данных, вычисляемые поля и запросы с параметрами. После запроса пользователь работает с полученной копией данных, внося изменения в удаленные таблицы в режиме пакетных транзакций. Для оптимизации трафика применяются режимы групповой пересылки обновлений, а также отложенная загрузка BLOB-объектов.
После получения локального набора данных значения столбцов поступают в привязанные к данным элементы управления по упрощенной схеме. То есть исключаются дополнительные передачи данных, как происходит в случае ODBC или ADO. Такой подход поощряет делать клиентскую часть приложений "тонкой", перенося бизнес-логику в хранимые процедуры на сервер баз данных. Это, в свою очередь, делает приложения эффективнее, снижает трафик и делает уровень бизнес-логики независимым от платформы.
Дополнительно к внешним источникам данных в Kylix входит персональная, основанная на XML база данных - MyBase. Таблицы этой БД хранятся полностью в памяти, поскольку она рассчитана на молниеносную производительность. Код поддержки MyBase встраивается в сам откомпилированный модуль и занимает около 300 Кб, так что не требует ни отдельных файлов, ни отдельной инсталляции. Тем не менее, эта "детка" понимает синтаксис SQL 92, сложные отношения между таблицами, декларативную целостность, триггеры и так далее. Полезной окажется также и возможность непосредственного создания таблиц MyBase как результата запроса к внешним данным.
/Etc/inittab: RedHat стирает экран перед выводом Login:
Проблема: перед тем, как вывести приглашение login, стирается экран. Кстати, из-за этого сбрасывается русский алфавит и перекодировку koi2alt приходилось восстанавливать ручками
echo -e '\033(K'
Лечение: В /etc/inittab поправить строчки запуска getty (добавить "--noclear")
1:12345:respawn:/sbin/mingetty --noclear tty1
. . .
/Etc/rc.d : Лишние команды при начальной загрузке
Проблема: при начальной загрузке запускается большое количество
излишних сервисов (что особенно нервирует на домашних standalone машинах)
Лечение: Зайти в каталог /etc/rc.d/rc3.d и переименовать "лишние" файлы:
mv S45pcmcia s45pcmcia
. . .
/Etc/skel: Лажовое пользовательское окружение
Проблема: Выставляется безумное значение переменной PS1.
Не отрабатывается пользовательский .profile
Лечение: Удалить в домашнем каталоге файлы
.bash_logout
.bash_profile
Исправить файл .bashrc на
PS1='\u@tty2:\w/\$ ' export PS1
Чтобы прекратить "осчастливливание" всех своих юзеров, проделать ту же операцию в каталоге /etc/skel
/Etc/sysconfig/network-scripts/ : Некорректные установки статического роутинга
Проблема: Если пытаться устанавливать статический роутинг сетей через "control-panel -- Network" - то не работает.
Лечение: Либо добавить команды
route add -net network.address gw your-host
в файл /etc/rc.d/rc.local
Либо исправить в конце /etc/sysconfig/network-scripts/ifup-routes
grep "$1 " /etc/sysconfig/static-routes | while read device args; do
route add -$args $device
done
на
grep "$1 " /etc/sysconfig/static-routes | while read device args; do
route add -$args # $device
##########
done
Index of /operating_systems/linux
- | ||||
07-Jul-2010 06:08 | - | |||
24-Feb-2005 03:12 | - | |||
28-Dec-2003 19:18 | - | |||
13-Apr-1998 00:00 | 1.8K | |||
13-Apr-1998 00:00 | 3.8K | |||
08-Feb-2006 19:39 | - | |||
09-Jun-2004 19:11 | - | |||
30-Nov-2004 00:48 | - | |||
09-Jun-2004 19:11 | - | |||
24-Aug-2006 01:47 | - | |||
08-Feb-2006 19:39 | - | |||
16-Apr-2008 02:38 | - | |||
02-Dec-2004 02:15 | - | |||
07-Dec-2004 04:23 | - | |||
25-Mar-2005 01:26 | - | |||
30-Nov-2004 00:22 | - | |||
29-Apr-2004 02:30 | - | |||
27-May-2004 01:29 | - | |||
30-Aug-2004 22:42 | - | |||
25-Apr-2004 18:55 | - | |||
18-Apr-2006 03:25 | - | |||
16-Apr-2008 02:38 | - | |||
07-Oct-2004 05:14 | - | |||
25-Jan-2005 07:58 | - | |||
07-Oct-1999 17:50 | 112K | |||
07-Oct-1999 17:50 | 124K | |||
07-Oct-1999 17:51 | 144K | |||
07-Oct-1999 17:51 | 90K | |||
07-Oct-1999 17:33 | 101K | |||
07-Oct-1999 17:51 | 24K | |||
07-Oct-1999 17:51 | 4.1K | |||
07-Oct-1999 17:51 | 19K | |||
07-Oct-1999 17:51 | 12K | |||
07-Oct-1999 17:50 | 24K | |||
07-Oct-1999 17:50 | 21K | |||
07-Oct-1999 17:51 | 36K | |||
24-Jan-2006 00:52 | - | |||
10-Feb-2006 13:05 | - | |||
28-Dec-2003 19:18 | - | |||
07-Jun-2004 21:40 | - | |||
05-Sep-2005 18:39 | - | |||
28-Dec-2003 19:18 | - | |||
02-Dec-2004 01:32 | - | |||
21-Oct-2004 01:29 | - | |||
29-Oct-1999 17:28 | 4.5K | |||
13-Apr-1998 00:00 | 1.9K | |||
11-May-2006 00:43 | - | |||
16-Apr-2008 02:38 | - | |||
20-May-2004 05:37 | - | |||
21-Jul-2004 19:47 | - | |||
02-Dec-2004 04:52 | - | |||
20-May-2004 22:19 | - | |||
01-Apr-2004 17:31 | - | |||
31-Aug-2004 03:43 | - | |||
09-Jun-2004 19:10 | - | |||
14-Dec-2004 22:10 | - | |||
19-Sep-2006 00:18 | - | |||
10-Feb-2006 13:05 | - | |||
17-Feb-2005 09:21 | - | |||
25-Jan-2005 03:03 | - | |||
13-Apr-1998 00:00 | 12K | |||
10-Feb-2006 13:05 | - | |||
18-Jan-2005 00:13 | - | |||
17-May-2004 20:15 | - | |||
20-May-2004 05:30 | - | |||
05-Aug-2004 01:43 | - | |||
18-Apr-2006 04:18 | - | |||
05-Sep-2005 19:28 | - | |||
28-Dec-2003 19:18 | - | |||
10-May-2006 22:17 | - | |||
10-May-2006 22:23 | - | |||
13-Apr-1998 00:00 | 1.6K | |||
Apache/2.2.16 (Debian) Server at citforum.ru Port 80
Инсталляция
Официальные требования к целевой платформе разработки следующие:
Intel Pentium II/500 МГц;
256 Мб RAM (обратите на этот параметр особое внимание!);
CD-ROM;
SVGA;
мышь;
место на диске:
-250 Мб Open Ed.,
-350 Мб Pro Ed.,
-500 Мб Enterprise Ed.
Система тестировалась на таких дистрибутивах:
Red Hat® Linux 7.2;
Mandrake™ 8.2;
SuSE® Linux 7.3.
Впрочем, вы можете установить Kylix практически на любой дистрибутив Linux и BSD, однако в некоторых случаях придется проделать установку библиотек и настройку путей вручную. Перед установкой системы можно убедиться, что ваш дистрибутив Linux удовлетворяет требованиям Kylix'а, а именно:
некоторые версии загрузчика libc могут привести к нарушению данных при загрузке и выгрузке общих объектов, в результате чего возникают ошибки сегментации в совсем других программах. Kylix тоже подвержен этой "болезни" и не станет инсталлироваться, если установлена эта версия libc. Эта проблема решена в libc 2.2 или в патче к 1.2.1;
Kylix и полученные приложения требуют glibc версии 1.2.1 или более поздней, ядро версии, как минимум, 2.2 и библиотеку libjpeg 6.2.
Все современные дистрибутивы Linux удовлетворяют этим условиям, но часто указанные библиотеки скрываются под различными типами инсталляции. Например, ASP Linux 7.3, установленный в режиме "экспресс-инсталляция", не обладает всеми необходимыми компонентами, и инсталляция вылетит с кодом ошибки 10. С другой стороны, Red Hat 7.1, установленный в режиме Workstation, не вызывает никаких проблем с Kylix.
Для проверки валидности вашей системы существует специальная утилита - borpretest - расположенная в одноименном каталоге на дистрибутивном диске. Для выполнения всех проверок в автоматическом режиме запустите командный файл /mnt /cdrom /borpretest /testsystem. Это не даст 100-процентной гарантии: на том же ASP данный тест выдает Looks Good, но инсталляция не завершается. Так что на тест надейся, но если что - придется устанавливать недостающие пакеты вручную.
В положительном случае вы увидите сообщения, подобные тем, что показаны на рисунке.
Если borpretest обнаружит какие-то проблемы, то с вопросом о том, как их решить, обращайтесь к файлу /mnt /cdrom /PREINSTALL. После проверки системы (или без таковой) запускаете /mnt /cdrom /setup.sh. Инсталляция предлагает на выбор несколько типичных опций (вроде путей инсталляции и устанавливаемых компонент) - но в основном отличается исключительной прямолинейностью. Фактически все сводится к тому, чтобы трижды ответить Ok.
Важное замечание: вы можете инсталлировать Kylix под административным (root) или пользовательским аккаунтом. В первом случае файлы приложения будут размещены в каталоге /usr /local /kylix3, причем примеры попадут только к вам в домашний каталог - и чтобы сделать их доступными другим, вам придется или скопировать, или назначить пользователям доступ к этим файлам в режиме чтения. Если Kylix устанавливается обычным пользователем, то все файлы, и программы и данные попадут в подкаталог домашнего каталога.
Вместе с Kylix'ом на диске (в каталоге /dev/cdrom/jre) находится также и инсталляция Java RunTime версии 1.3.1. Это пакет rpm.bin, предназначенный для установки через командный процессор sh. Обратите внимание: на самом пакете не установлен флаг исполнения, поэтому запустить установку с лазерного диска вы не сможете. Для инсталляции Java вам понадобится скопировать его куда-то:
rm /tmp/j2re* [mount -t iso9660cd9660 /dev/cdrom /mnt/cdrom/cdrom] cd /mnt/cdrom/jre/* /tmp [umount /dev/cdrom] chmod 777 /tmp/j2re* /tmp/j2re* rm /tmp/j2re*
Как вылечить локализацию в Linux
From: Ales Popov
NM) libc-5.2.18, ld.so-1.7.14...
Вот в этой библиотеке дело ^^^^^^^^^^ !
Можно просто взять ее с CD Linux.Yes или пересобрать эту библиотеку.
Только надо в сырцах исправить, - это вот с того сидюка:
=== Begin 11.r ===
Eugene Shakhtarin
Локализация koi8-r для версии libc 5.2.18 (ELF).
Сделано в Linux kernel 1.3.57, gcc 2.7.2.
Описание механизма генерации locale находится здесь:
http://es-sun2.fernuni-hagen.de/public/mirrors/GCC-experimental/Intro
Стандарты charmap и locale находятся здесь:
В дистрибутиве libc 5.2.18 функция libc/locale/ctype.c неисправна, а именно, в операторе (is_upper ? toupper_done : tolower_done) |= BIT (token); выражение BIT (token) равно 0 вместо необходимой 1 и tolower_done получает значение 0, даже когда tolower таблица сформирована. ctype.c далее принимает решение заменить tolower на умолчание.
Для починки требуется замена в libc/locale/ctype.c:
/*
static unsigned short toupper_done = 0;
static unsigned short tolower_done = 0;
*/
static unsigned toupper_done = 0;
static unsigned tolower_done = 0;
Вот соответствующий патч:
*** ctype.c.orig Tue Jan 16 19:02:43 1996
--- ctype.c Tue Jan 16 19:03:23 1996
***************
*** 54,59 ****
--- 54,63 ----
/* Remember which class or conversion is already done. */
static unsigned short class_done = 0;
+ /*
static unsigned short toupper_done = 0;
static unsigned short tolower_done = 0;
+ */
+ static unsigned toupper_done = 0;
+ static unsigned tolower_done = 0;
#define SYNTAX_ERROR \
Здесь находятся http://eugene.mplik.ru/pub/Linux/utils/nls/locale/libc-5.2.18.fix/:
ctype.c -- 6534 исправленный вариант ctype.c
localedef.gz -- 53833 программа, оттранслированная для отладчика с ключем -g
Трансляция localedef.c (и locale.c):
make SHARED= programs
В libc 5.2.18 поддержка LC_COLLATE не реализована вообще.
Для генерации базы данных locale для koi8-r в депозитарии
нет готовых исходных данных.
Исходные данные для генерации koi8-r находятся здесь:
http://eugene.mplik.ru/pub/Linux/utils/nls/locale/share/nls/charmap/KOI8-R
http://eugene.mplik.ru/pub/Linux/utils/nls/locale/share/nls/locale/ru_RU
Эти данные подготовлены на основе стандартов ISO 10646 (Unicode), RFC-1489 и депозитария
Файлы KOI8-R и ru_RU не являются официальными документами и не обладают никаким формальным статусом. Они сделаны для личного употребления, не имеют ограничений на тиражирование, и гарантия их пригодности для каких-либо определенных целей абсолютно
отсутствует.
Генерация базы данных locale для koi8-r.
7.1) Создать каталоги
mkdirhier /usr/share/nls/charmap
mkdir /usr/share/nls/locale
mkdir /usr/share/locale
7.1) Разместить описания KOI8-R и ru_RU в каталогах
/usr/share/nls/charmap/KOI8-R
/usr/share/nls/locale/ru_RU
7.2) Построить описание категорий koi8-r в каталоге /usr/share/locale/koi8-r/
localedef -c -i /usr/share/nls/locale/ru_RU -f KOI8-R koi8-r
Уже готовый набор описаний категорий koi8-r, полученный описанным методом, находится в http://eugene.mplik.ru/pub/Linux/utils/nls/locale/share/locale/koi8-r/
Использование построенной локализации koi8-r.
8.1) Определить переменную командной среды
export LANG=koi8-r
После этого программы, созданные на базе libc 5.2.18 с учетом locale,
будут локализованы соответствующим образом.
8.2) Для интернационализации создаваемой программы необходимо применить
функцию setlocale (см. man setlocale), например:
#include
#include
main()
{
int c, C;
setlocale(LC_ALL, "");
c='й';
C=toupper(c);
printf("%c\n", C);
C='Й';
c=tolower(C);
printf("%c\n", c);
}
Компилирование ядра Linux
# cd /usr/src/linux/
# make config или # make { menuconfig | xconfig }
Смысл конфигурационных параметров ядра разъясняется здесь
# make dep
# make clean
# make zlilo
# make modules
# rm -r /lib/modules/2.0.18
# make modules_install
# reboot
Это все.
Компилирование ядра с поддержкой автозагрузки модулей
0) cd /usr/src/linux
1) make menuconfig
Where I enable the features I want as odules
(for vfat support you should answer M for FAT and VFAT)
Besides, the kernel must be compiled with modversion
and kerneld support enabled.(This is the second submenu in
the config - select all the 3 items).
2) make install
At the end the old kernel (if it's /vmlinuz) will be renamed
/vmlinuz.old and the new will be /vmlinuz.
This option calls the script /usr/src/linux/arch/i386/boot/install.sh
which does the above renaming and runs lilo.If you don't want lilo just
comment out the last line in that script.
3) make modules
4) rm /lib/modules/2.0.0 (or move to another location)
5) make modules_install
6) VERY IMPORTANT to make linux boot the new kernel.
If you use lilo do not edit /usr/src/linux/arch/i386/boot/install.sh,
it will install it automaticly,if not then you are using either
loadlin or bootdisk.Either way update your bootdisk or loadlin kernel
(on your dos partition I guess).
7) Reboot linux.
Конфигурация XDM
Проблема: Поставляемый с RedHat файл Xsession неработоспособен.
Лечение: Поправьте в /etc/X11/xdm/Xsession нижний фрагмент текста на
примерно такой:
################## moshkow #############################
sysprofile=/etc/profile
profile=$HOME/.profile
[ -f "$sysprofile" ] && . $sysprofile
[ -f "$profile" ] && . $profile
[ -f "$resources" ] resources=$HOME/.Xdefaults
[ -f "$resources" ] resources=$HOME/.Xresources
[ -f "$startup" ] startup=$HOME/.xinitrc
[ -f "$startup" ] startup=$HOME/.xsession
[ -f "$startup" ] startup=/usr/lib/X11/xinit/xinitrc
if [ -f "$startup" ]; then
xrdb -load "$resources"
exec sh "$startup"
fi
################## moshkow #############################
Конфигурационные файлы и запуск AMD
echo "Starting automount..."
rm -f /tmp/amd.log
/usr/local/etc/amd -l /tmp/amd.log \
/net /etc/amd.net \
/home /etc/amd.home
/usr/local/etc/amq # выдает текущее состояние автомаунтера
/etc/amd.net :---------------------------------------------
/defaults type:=host;fs:=${autodir}_mnt/${rhost}/root;rhost:=${key}
* opts:=rw,nosuid,grpid
---------------------------------------------------------------------------
/etc/amd.home :---------------------------------------------
/defaults opts:=rw,intr,grpid,nosuid;type:=nfs
moshkow rhost:=moon;rfs:=/export/home/moshkow
petrov rhost:=pulsar;rfs:=/export/home/pulsar/ivanov
---------------------------------------------------------------------------
Конфигурирование tcp-wrapper'а
По умолчанию все сервисы в /etc/inetd.conf открыты.
Рекомендуется ограничить доступ к своей машине, оставив его только доверенным хостам и своей локальной сети.
Перекрыть доступ снаружи на узловую машину: В файл /etc/hosts.deny вставить строчку
ALL : ALL
Открыть доступ на узловую машину с машин локальной сети 195.0.1.0
В файл /etc/hosts.allow вставить строчки
ALL : \
127.0.0.1
ALL : \
195.0.1.0/255.255.255.0
А какой версии sendmail на вашей машине?
Кстати CERT советует ставить Sendmail 8.8.5. Более ранние версии позволяют удаленно выполнять любые команды от имени суперпользователя на вашей машине.
httpd: дырявые cgi-скрипты
Штатная поставка Apach-httpd имеет cgi-скрипт /home/httpd/cgi-bin/phf, который позволяет выполнять произвольные команды на вашей машине от имени юзера nobody
Kylix
Kylix - революционная для своего времени Delphi-подобная среда разработки для Linux и других систем, поддерживающих бинарные форматы Linux. Kylix совмещает в себе визуальные и текстовые возможности разработки приложений - так, как это принято в современных инструментах - и позволяет создавать приложения с графическим интерфейсом для Linux в сжатые сроки.
При ближайшем рассмотрении современный Kylix в третьей инкарнации содержит в себе две оболочки IDE: для разработки приложений на языке, который Borland именует "языком Delphi" и который известен также как объектный Паскаль. Кроме того, в Kylix можно разрабатывать программы на С++ в оболочке, воспроизводящей CBuilder. Следует признать, что работа по переносу стиля и ощущения Delphi/CBuilder была проделана немалая - с первого взгляда отличить Kylix от Delphi практически невозможно (не считая KDE widgets).
Linux: приключения с VPN микрорайонного масштаба
В этой заметке я расскажу о своем общении с провайдером микрорайонного масштаба. Какого провайдера и из какого микрорайона - не скажу (кроме того, что речь идет о городе-герое Москве), так как, по полученным мною сведениям, все они примерно одинаковы, так что обижать никого не хочу. Надеюсь, что изложенное далее будет полезным и за пределами описанной местности - для тех, кто придерживается нестандартной ориентации в отношении используемых операционок.
Сменив некоторое время назад место жительства, я озаботился подключением к Сети. Прежнее мое логово было подключено к Интернету посредством выделенки от средне-крупного московского провайдера, о котором я не могу сказать ничего плохого, кроме хорошего. Однако в окрестностях нового моего обиталища равноценных предложений не обнаружилось.
Конечно, в качестве почти универсального (для Москвы) варианта оставался Стримм - но от них я очень долго не мог получить ответа на запрос о пригодности моей телефонной линии (надо сказать, что у соседей по подъезду Стримм работал вполне успешно).
И вот тут я и наткнулся на предложение микрорайонного масштаба, показавшееся мне весьма привлекательным: бесплатное подключение, безлимитный тариф - 600 рублев для скоростей 200/128 Кбит/с (входящей и исходящей, соответственно). То есть примерно то же самое, что было у меня раньше (и за те же примерно деньги, соответствующие среднестатистическим московским реалиям сегодняшнего дня). Поэтому я опрометчиво не задал никаких технических вопросов. Впрочем, если бы и задал - это мало чего изменило бы, ведь ответа от Стримма все еще не было, а других альтернатив на горизонте микрорайона не просматривалось.
В общем, оставил я заявку на подключение. Обещали сделать это в течении двух недель. И слово свое сдержали, монтажники появились день, если не изменяет память, на двенадцатый (замечу, что от их офиса до моего дома по кривой - метров 200).
Что такое бесплатное подключение в микрорайонных условиях - распространяться особо не буду, это легко представит себе каждый, кто пользовался бесплатными услугами на постсоветских пространствах. Отмечу только - сетевая карта (если не имеется собственной - у меня была, встроенная в ноутбук) в понятие бесплатности не входит. Как и любые другие аксессуары, за исключением собственно витой пары. Хотя, нужно отдать должное моим монтажникам, на кабель они не поскупились, кинув его с двойным, как минимум, запасом (о прокладке при бесплатном подключении речи, разумеется, тоже не было).
Дальше было еще несколько мелких заморочек, на которых останавливаться не буду. В итоге все кончилось тем, что сеть физически была подключена, и лампочка на моей сетевухе замигала. А после этого началось самое интересное.
Дело в том, что ни на одной моей машине уже в течении многих лет нет никакого намека на Windows. А есть лишь Linux или (иногда - и) какая-либо из BSD-систем. В частности, в тот момент (и по сию пору) стоял на ней Linux Kubuntu Dapper (5-я пре-релизная версия). А вот как подключать его к сети - провайдеры не имели ни малейшего представления. И даже задали вопрос - а почему бы мне не поставить Windows для подключения к Инету? На что я резонно ответил, что, подобно той даме, что в раннеперестроечные времена написала известную статью в журнале "Огонек", принципами не поступаюсь. И скорее готов отказаться от услуг провайдера, не способного обеспечить в своей сети работу машины под свободной операционкой.
Дело осложнялось тем, что никакого DHCP-сервера у провайдера не имелось - внутрисетевые IP выдавались статически. А имелась зато авторизация по VPN, снискавшая уже нежную "любовь" среди линуксоидов. И в адрес которой я на Linux-форумах слышал много слов (все больше нежных и ласковых, исконно русских, от бороны, что называется).
Ну, пока до отказа дело не дошло - отпустив ребят, я решил, что настроить сеть самому будет для меня делом чести, подвига и геройства. Должен признаться, что мой сетевой опыт до сего времени не намного поднимался над нулевым уровнем - вот заодно и решил сузить пробелы в своем образовании.
Итак, уходя, провайдеры оставили мне, кроме мигающей лампочки, также конверт со следующим содержимым:
внутрисетевой IP-адрес;
маску подсети;
IP-адреса шлюза, 1-го и 2-го DNS;
имя (не адрес) VPN-сервера - внутреннее, в форме труляля.ok;
пароль и логин для авторизации на нем;
прочие мелочи, вроде URL интранет-сервера (с характерным именем www.ok), страницы личной статистики, и так далее.
Очевидно, что для начала следовало настроить доступ к внутренней сети провайдера. Сделать это в моих условиях трояко: руками из командной строки, текстовым редактором через конфигурационные файлы и автоматически - средствами администрирования Kubuntu (точнее, средствами, которые Kubuntu заимствовала от своего умолчального десктопа - KDE).
Чисто ручной способ сводится к вводу команды ifconfig с указанием имени сетевого интерфейса (в данном случае - eth0), собственного IP-адреса и маски подсети. На нем я задерживаться не буду - детали можно посмотреть в man ifconfig.
Для ручной настройки достаточно было вписать в файл /etc/network/interfaces (напоминаю - речь идет о Kubuntu, то есть с точки зрения конфигурирования, практически о Debian - в более иных дистрибутивах потребовалось бы править другие конфиги) строки следующего вида:
# Указание на статически внутрисетевой IP iface eth0 inet static # Собственно внутрисетевой IP address # Полученная от провайдера маска подсети # В большинстве случаев она именно такова netmask 255.255.255.0 # IP-адрес шлюза gateway # IP-адреса 1-го и 2-го сервера имен, через пробел dns-nameservers
# Предписание запускать сетевую службу при старте машины auto eth0
Наконец, автоматизированный метод - это вызов через K-меню KDE пункта System Setting, и выбор в секции Сеть и Интернет иконки Настройка сети. Этот метод применим для всех пользователей KDE - разве что в других дистрибутивах понадобится вызывать KCC (KDE Control Center), а уж в нем отыскивать, где настраивается сеть.
Но в принципе ничего сложного тут нет. Посредством соответствующей кнопки нужно перейти в режим администратора, введя пароль (обычного пользователя - в Kubuntu, root'а - в большинстве прочих дистрибутивов. Далее из списка на первой вкладке (Network Interfaces) выбирается нужный интерфейс (скорее всего, eth0 - рис. 1), щелчок на нем правой клавишей вызывает контекстное меню, в котором следует указать пункт Configure interface. А затем в появившейся панели остается только вбить полученные от провайдера свой IP'шник, сетевую маску и Gateway (он же шлюз - рис. 2). После чего, перейдя на вкладку Domain Name Systen, последовательно добавить адреса первичного и вторичного DNS-серверов.
Рис. 2. ...и его конфигурирование
Проверка правильности настройки сети осуществляется в три этапа. Сначала командой
$ ifconfig eth0
смотрим, соответствуют ли сетевые параметры вывода тому, что было нами указано (впрочем, при ручном вводе они и не могут быть иными). Затем командой
$ ping www.ok
пропинговываем интранет-сервер провайдера. И, наконец, заходим на этот самый интранет-сайт через браузер, указав в его адресной строке URL - www.ok.
Я проделал все эти действия успешно, в результате чего получил доступ к внутреннему FTP-серверу (не буду говорить о его содержании). Но ни малейшего Интернета, разумеется, не было. Так что настала пора переходить к снастройке VPN-подключения.
Это дело требует в первую очередь поддержки протокола PPTP (Point-to-Point Tunneling Protocol). Клиентская его часть (а большего в данном случае и не требуется) обеспечивается пакетом, который в deb-клонах носит название pptp-linux. Авторское его имя, кажется, - linux-pptp, во FreeBSD он зовется pptp-client, в других системах и дистрибутивах возможны и иные имена - в каждом конкретном случае это следует уточнить штатными средствами системы пакетного менеджмента.
Впрочем, пакет этот вовсе и не обязан присутствовать в произвольном дистрибутиве. Так, в репозитории Archlinux я его не обнаружил. Так что пользователям этого дистрибутива придется начинать настройку VPN с ручной сборки linux-pptp (или написания build-файла для его построения).
Однако, на мое счастье, в Kubuntu такой пакет имелся - и, более того, находился даже на дистрибутивном диске, хотя и не устанавливался по умолчанию при инсталляции системы. И с зависимостями у него оказалось небогато - все-то что
Depends: libc6 (>= 2.3.4-1), ppp (>= 2.4.2)
каковые и так имели место быть установленными. Так что, выполнив
$ dpkg -i /media/cdrom/pool/main/p/pptp-linux
я легко получил поддержку искомого протокола. А дальше, как обычно бывает в Linux'е, "средь мира дольного, для сердца вольного", лежали "два пути". Правда, в данном случае их оказалось целых три:
загрузить pptp руками из командной строки;
использовать скрипт для установки VPN-соединения;
прибегнуть к какому-либо front-rnd-конфигуратору.
От "ручного запуска" я отказался - да это и не решение задачи, каждый раз запускать pptp руками. Обратившись по началу к напрашивающемуся варианту - скриптовому запуску. И надо заметить, что скриптов для этого дела в сети можно раскопать немало. Например, решение, претендующее на универсальность, . Вариант для Gentoo . А при необходимости находится и очень внятное пошаговое не где-нибудь, а в Debian (на сей предмет есть и - правда, на английском). Да и на форумах нашей тематики тема эта была жевана-пережевана. В общем, казалось бы, недостатка в информации не предвиделось.
Ан не тут-то было. Ни один из найденных мной скриптов "в лоб", после соответствующей коррекции реалий, не заработал. Причем ситуация была самая скверная: нельзя сказать, что они не работали вообще (сообщений об ошибках не поступало), но и назвать это работой язык не поворачивался. А именно: VPN-соединение после отработки, например, специально Debian'овского скрипта устанавливалось. Это можно было видеть и через ps (соответствующие процессы в списке присутствовали), и через ifconfig -a, который показывал появление интерфейса ppp0. Но держалось оно считанные мгновения, не позволявшие даже запустить команду ping. Однако из этого следовал и позитивный вывод - видимо, что-то не так в консерватории, то есть в параметрах, данных провайдером. Как станет ясным из дальнейших событий, так оно и оказалось.
Оставалась последняя надежда - автоматический конфигуратор. Таковой поначалу обнаружился в единственном числе, выступая под именем pptpconfig. В репозитории Ubuntu его не оказалось, но можно, кроме исходников и rpm'ок, найти также и deb-пакеты, причем вместе с основными зависимостями - php-pcntl и php-gtk-pcntl. Правда, последние тянут за собой рекурсивно зависимости собственные. Тем не менее, с помощью модема, dpkg и чьей-то матери задача установки pptpconfig решаема. По крайней мере, мне это сделать удалось.
Обращение с pptpconfig достаточно подробно на сайте http://pptpclient.sourceforge.net, а также, как ни странно, на интранет-сайте моего провайдера (на примере Mandrake и Suse).
И так, pptpconfig запускается с правами администратора, то есть в Ubuntu/Kubuntu так:
$ sudo pptpconfig
После чего перед глазами появляется следующее окно (рис. 3).
В соответствующие поля формы вбиваем имя туннеля (то есть соединения - в моем случае оно могло быть произвольным набором символов), IP'адрес VPN-сервера (говорят, что можно и его внутрисетевое имя, но у меня это не сработало), полученные от провайдера логин и пароль (поле Domain остается пустым).
Откуда взялся адрес VPN-сервера? Ведь, как вы помните, провайдер оставил мне в конвертике только его внутрисетевое имя. Определит адрес по URL можно различными путями, я воспользовался командой
$ host труляля.ok
каковая и выдала мне искомый IP'шник.
Заполнив таким образом форму Server, я, в соответствие с инструкциями, перешел на закладку Encryption, где, вместо отмеченного по умолчанию пункта MPPE, включил пункт, говорящий про EAP (рис. 4).
Теперь остается только кнопкой Add добавить новосозданный туннель в список и, отметив его курсором, нажать кнопку Start для проверки. Нажатие ее приводит к открытию нового окна (рис. 5), в котором проверку можно выполнить посредством кнопки Ping.
К моей радости, пинги с новым внутренним сервером прошли успешно. Более того, команда
$ ifconfig -a
показала наличие интерфейса ppp0 (никуда теперь не исчезающего) с новыми параметрами - моим IP-адресом (прежний, для eth0, начинался со 192, этот же - со 172), адресом P-t-P (он, собственно, и пинговался при тесте) и новой маской подсети.
Теперь, в соответствие с инструкцией, оставалось последнее действие: сделать только что созданный канал доступным для программ. Для этого останавливаю соединение (кнопкой Stop в любом из двух окон) и в окне настройки перехожу на вкладку Routing, включаю в ней пункт All to Tunnel вместо умолчального Client to Lan (рис. 6) и кнопкой Start активизирую туннель заново. Теоретически после этого можно, например, выйти в Интернет любым браузером.
В этот момент радость моя и закончилась. Попытки открыть какой-либо сайт успехом не увенчались. Пинги не проходили ни на один внешний URL. Более того, и внутрисетевые URL'ы пинговаться перестали.
Так и пребывал бы я в растерянности, если бы не советы знакомых админов - пропинговать внешние сервера не по URL, а по IP-адресам. И - о чудо - пинги пошли. Стало ясно, что дело в настройках DNS. просмотр файла /etc/resolv.conf показал, что вместо прежних их адресов появились новые - совершенно мифического облика. Ничтоже сумняшеся, я вписываю туда IP своего служебного DNS-сервера. После чего наконец обретаю выход в Интернет.
Теперь у меня вроде все нормально - но получать имена со стороны не есть правильно с точки зрения быстродействия. Надо найти способ сделать это внутренними силами сети провайдера. Благо, в окне настройки pptpconfig для этого имеется соответствующая закладка - DNS, в которой по умолчанию сервера имен определяются автоматически (рис. 7). И, как показала практика, неправильно. Однако никто не мешает отключить автоматику и вписать в соответствующую строку адрес DNS-сервера провайдера (с моим служебным сервером имен это прошло нормально). Если бы не одно но: для этого адрес этот хорошо бы знать.
Теоретически узнать IP сервера имен можно было бы, вероятно, спросить у провайдера непосредственно. Однако дело происходит в выходные дни, и попытки дозвониться до их службы техподдержки успехом не увенчались. А ждать до понедельника - терпения не хватало. И тогда я, временно оставив DNS с моей службы, прибег к команде nslookup. Данная с аргументом - доменным именем, она выводит как адрес используемого сервера имен, так и реальный IP, к которому это имя привязано:
$ nslookup name.ru Server: IP Address: IP#port
Name: name.ru Address: IP
Теперь оставалось только перебрать доменные имена моего провайдера (благо, их было немного) и методом ползучего эмпиризма определить IP того из них, которое сошло бы за DNS-сервер, после чего вписать его в строку соответствующей закладки окна VPN-конфигуратора (см. рис. 7). С этого момента я наконец смог наслаждаться полноценным Интернетом...
Правда, пока для этого требуется не только вызвать pptpconfig из командной строки терминала через sudo, но и запустить собственно соединение кнопкой Start. Что не то чтобы обременительно - но создает чувство некоторого дискомфорта, заствляя вспомнить старое, но недоброе модемное время.
Вторая проблема устраняется легко. В окне конфигуратора нужно перейти к закладке Miscellaneous, в которой включить пункт Start tunnel when this programm starts и, на всякий пожарный случай, Reconnect is disconnected (рис. 8, смысл, думаю, понятен без перевода).
Решения первой задачи я пока не нашел. Вследствие особенностей дистрибутивов Kununtu (отсутствия root-аккаунта как такового) со стандартными средствами типа запуска от имени другого пользователя, у меня ничего не вышло. Придется думать дальше. Ну и если кто подскажет - буду весьма признателен.
Какой вывод можно сделать из моей истории? Перефразируя слова Александра Дюма, заключаю: не следует верить ни тому, что говорят провайдеры, ни тому, что говорят их враги. Соединение VPN в Linux наладить вполне можно. Нужно только, если это не получается с первой же попытки, затратить некоторое время на перебор вариантов. Используя прямые IP, не полагаясь на данные, полученные при подключении.
Я понимаю, что все описанное выше способно вызвать у профессионального сетевика лишь ироническую улыбку. Однако как пользовательское решение оно вполне работает - и для меня (а также, подозреваю, большинства обычных пользователей) это главное.
Кстати говоря, описанный метод настройки VPN - далеко не единственный. Прошерстив через
$ apt-cache search vpn
репозитории Ubuntu (с чего, собственно, и нужно было бы начать по хорошему, если бы не нетерпеливое вожделение Сети), я обнаружил несколько VPN-клиентов и немало front-end'ов для них, например - kvpnc, предназначенный, как явствует из имени, специально для KDE. И, следовательно, более подходящий для использования в Kubuntu. Возможно, что с какими-то из этих программ результата можно было бы добиться быстрее и проще. Впрочем, этот вопрос я надеюсь исследовать и описать в ближайшее время.
Автор выражает признательность Игорю Борейко, системному администратору , и Стену, админу сайта , за ценные советы и моральную поддержку.
Lpd: удаленная печать - permition denied
Проблема: RedHat host по умолчанию не дозволяет печатать на своем принтере удаленным lpr клиентам.
Лечение: (вообще-то так оно и должно быть - security)
В файл /etc/hosts.lpd вписать все хосты, которым дозволено печатать.
Настраиваемые параметры ядра
Проблема: На сильно загруженных системах начинается игра в нехватку:
cannot fork try again, no more filedescriptors, no more pty...
Лечение: Увеличьте настраиваемые параметры и перекомпилируйте ядро.
Число псевдотерминалов (а следовательно число xterm'ов, телнетов...)
/usr/src/linux/include/linux/tty.h
#define NR_PTYS 256 /* этот параметр трогать не рекомендуется */
И не забудьте mknod для большего числа pty
Максимальное число процессов
/usr/src/linux/include/linux/tasks.h
#define NR_TASKS 512
#define MIN_TASKS_LEFT_FOR_ROOT 4
Число файлдескрипторов и открытых файлов.
/usr/src/linux/include/linux/fs.h
#define NR_OPEN 256
#define NR_FILE 1024
/usr/src/linux/include/linux/limits.h:
#define NR_OPEN 256
Настройка временной зоны в Linux
Временная зона в Linux задается файлом /etc/localtime
Этот файл является симлинком на один из готовых описаний временной зоны, немерянное количество которых лежит в /usr/lib/zoneinfo
Например для Москвы подойдет такая операция:
ln -s /usr/lib/zoneinfo/Europe/Moscow /etc/localtime
Файл с описанием временной зоны компилируется из текстового описания командой zic (См. man zic )
Пример описания временной зоны с переключением на летнее время для Украины:
------------ Cut here ------------------------------
Rule dst 1982 maximum - Apr lastSun 2:00 1 "EET DST"
Rule dst 1982 maximum - Oct lastSun 2:00 0 EET
Zone EET 2:00 dst %s
------------ Eof here ------------------------------
Во Free случай абсолютно аналогичный. Например поправить /usr/src/share/zoneinfo/europe
Rule Russia 198? max - Sep lastSun 2:00s 0 K
Rule Russia 1996 max - Oct lastSun 2:00s 0 K
Затем в той-же директории make install (там этот zic и запускается).
Подключение АЦТ и мультиплексоров в Linux
Некоторое количество мультиплексоров поддерживается ядром Linux. См. исходники ядра...
Подключение алфавитно-цифрового терминала к ком-порту
Кабель предполагается трех-проводный нульмодемный - tx,rc и ground. Не забудьте закоротить DTR/CTS/RTS.
Сетап терминала:
Mode Line-mode
Data bits 8
Parity NONE
Stop bit 1
Port protocol XON/XOFF
Port speed 9600
В RedHat'е не забудьте проинсталлировать RPM getty_ps - его часто забывают установить при начальной инсталляции.
В файле /etc/gettydefs иметь строку
DT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #@S login: #DT9600
В файл /etc/inittab вписать строчку
Терминал подключен к COM2
f2:12345:respawn:/sbin/getty ttyS1 DT9600
Подключение мультиплексора AST Fourport
Интеллектуальный мультиплексор AST Fourport. Цена около $140 за 4 порта. Интеллектуальность заключается в том, что на все 4 порта поедается одно прерывание. А так же в том, что в этой карте порты имеют 16450 uartы, а значит максимальная скорость на них - 19200.
На карте масса джамперов. Базовый режим STANDART не применять! В нем генерятся порты COM1-COM4 со стандартными для них base-адресами (что вполне приемлемо), и на каждый порт отводится собственное прерывание (что категорически неприемлемо для переполненной картами расширения PC)
Джамперы поставить в режим ENHANSE, переписать на бумажку установленное IRQ (Например 5) и base-адреса, выделенные портам 1-4.
AST Fourport к Plug-n-playным картам НЕ относится. Поэтому зайти в BIOS-setup Pnp-config и поставить IRQ 5 - "Used by ISA" (По умолчанию там стоит "ICU")
RedHat не озаботился сделать специальные файлы для COM-портов 3-... поэтому сделайте их руками:
mknod /dev/cua4 c 5 68
mknod /dev/cua5 c 5 69
mknod /dev/cua6 c 5 70
mknod /dev/cua7 c 5 71
mknod /dev/ttyS4 c 4 68
mknod /dev/ttyS5 c 4 69
mknod /dev/ttyS6 c 4 70
mknod /dev/ttyS7 c 4 71
В файл /etc/rc.d/rc.serial вставить строчки:
#!/bin/sh
# AST FourPort Card IRQ 5 uart 16450 Vector 2BF ENHANSE
setserial -va /dev/cua4 irq 5 port 0x02a0 uart 16450
setserial -va /dev/cua5 irq 5 port 0x02a8 uart 16450
setserial -va /dev/cua6 irq 5 port 0x02b0 uart 16450
setserial -va /dev/cua7 irq 5 port 0x02b8 uart 16450
В файле /etc/gettydefs иметь строку
AST9600# B4800 CS8 CLOCAL # B4800 SANE -ISTRIP CLOCAL #@S login: #AST9600
В файл /etc/inittab вписать строчки
# Dlya AST Fourport skorost stawitx w dwa raza medlennee terminala
f2:12345:respawn:/sbin/getty ttyS1 DT9600
f4:2345:respawn:/sbin/getty ttyS4 AST9600
f5:2345:respawn:/sbin/getty ttyS5 AST9600
f6:2345:respawn:/sbin/getty ttyS6 AST9600
f7:2345:respawn:/sbin/getty ttyS7 AST9600
В файл /etc/profile вписать строчки
case `tty` in
*ttyS?) TERM=vt100 export TERM ;; # Или какие у вас терминалы
esac
Обратите внимание на два тонких момента:
AST Fourport имеет не 16550A, а только 16450 uartы
Скорость терминала 9600, а порт ставится параметрами GETTY в
4800 (sic ?!) Почему, не знаю, но только так он работает.
Построение переносимого кода
В основе переносимого кода Delphi-Kylix лежит независимый от платформы формат модулей и архитектура CLX. Последнее обозначает Borland Component Library for Cross-Platform. В результате компиляции строятся файлы в естественном для Linux формате ELF, а также в формате общих библиотек.so. Как и Delphi, Kylix использует прямую компиляцию в процессорные команды, то есть скорость приложений сопоставима с кодом на С++.
Как и в случае с Delphi, разработчик может (в ущерб переносимости) использовать системные функции, а также вызовы Linux API и других специфичных для платформы библиотек. Если вы разрабатываете компонент CLX, используя вызовы низкого уровня, и хотите сделать его универсальным,- можете использовать условную компиляцию, проверяя, определены ли символы LINUX и WIN32 соответственно c помощью предложения $IFDEF/#ifdef. Для абсолютных экстремалов по-прежнему существует возможность писать фрагменты кода на inline-ассемблере.
Для того чтобы писать переносимый код, предназначенный для обоих платформ, не следует использовать другие (кроме изоляции системных вызовов) особенности платформы: реестр Windows, вызовы оконных функций SendMessage и PostMessage и т.п. Не следует также забывать, что в Linux имена файлов и каталогов всегда учитывают регистр, так что следует обратить внимание на их правильное написание, в случаях когда имена задаются литерально.
Приложения для Linux - вариант Kylix
Арсений Чеботарёв
“Компьютеры + Программы”
Проблема наличия или отсутствия пользовательских программ часто мешает повсеместному распространению Linux. С другой стороны, делать приложения "for Linux only" не всегда целесообразно, потому что Windows, да и другие "оси", еще никто не отменял.
Желательно получить приложение, которое "если что" можно выпустить в версии для нескольких ОС, получая в результате простор для маневра. Вариантов для этого несколько:
использовать Delphi и Kylix. Если проект уже разработан на Delphi - и особенно с использованием переносимых компонент - то задача еще более упрощается. Полученное приложение может работать на обеих платформах, или говоря более сложным языком - в гетерогенных средах. У Kylix есть несколько преимуществ перед остальными вариантами: мощный оптимизированный код, знакомый многим разработчикам интерфейс, доступность самой системы. К недостаткам можно отнести ограниченный ареал применения - только на системах Linux с определенным набором библиотек, хотя распространение Kylix это только вопрос времени;
использовать Java и, например, ONE Studio, на "обеих трех" платформах. Это тоже очень хороший вариант: приложения не потребуют перекомпиляции, доставку можно осуществлять по интернету, да еще и не одним способом. Единственный drawback - это определенные требования, предъявляемые к системам разработки и выполнения, в частности к объему памяти и к пропускной способности сети;
вариант номер три - использовать характерные для Unix средства разработки, делая пользовательский интерфейс на Tk/Tcl и/или courses. В качестве языка написания логики удобно использовать perl, Python или, если вам так проще,- C. Это во многом героический путь, поскольку инструменты разработки таких программ не отличаются интуитивной понятностью - например, на изучение Emacs может уйти полгода. Зато полученный код будет самым "честным" и легко переносимым на все открытые платформы;
сравнительно сложный, хоть и самый универсальный путь - создание полнометражного веб-приложения, например, на perl или PHP. Это потребует некоторых условий, таких как наличие собственного (виртуального) сервера с широкими полномочиями - зато такое приложение будет совершенно нейтрально к среде выполнения. Говоря по правде, это решение совсем несправедливо занимает предпоследнее место - просто это отдельный разговор, не совсем касающийся того, о чем я собираюсь рассказать;
пятый путь - запускать приложения в режиме эмуляции ОС. Эта тема будет рассмотрена в данном номере. Из числа универсальных виртуальных машин выделяются VMWare и VirtualPC. Большой недостаток всех этих эмуляторов - проблемы совместимости и, кроме того, падение производительности (примерно вдвое). Ко всему прочему, такие методы, по сути, не относится к методам кроссплатформенной разработки.
В дальнейшем мы рассмотрим Kylix с, так сказать, гуманитарной точки зрения. Подразумевается, что я не ставлю себе цели научить вас программировать - и, тем более, не собираюсь описывать пункты меню. Моя задача - показать вам, что в той или иной среде разработки может оказаться полезным и как с минимальным дискомфортом установить инструмент на свой компьютер. Остальное, как говорится, RTFM.
Profile: Как расправиться с неудобным приглашением bash
Проблема:
Приглашение командного интерпретатора bash во первых невразумительно, а во вторых в разных окошках оно разное.
Лечение: Приглашение задается переменной окружения PS1. Наивен, кто считает, что достаточно установить ее в своем пользовательском .profile . Увы, следы кривого окружения надо выкорчевывать с корнем.
В файлах /etc/profile /etc/skel/.bashrc $HOME/.profile добавьте/исправьте команду
PS1='\u@tty2:\w/\$ ' export PS1
Файл /etc/bashrc уничтожьте. Все что было в нем разумного (IMHO - ничего в нем разумного нет) верните на свое законное место в /etc/profile
Profile: Проблемы с кирилицей из-за кривого окружения
Проблема: vi рисует русские буквы восьмиричными кодами. Less рисует русские буквы шестнадцатеричными кодами. Bash не позволяет ввести в командной строке русских букв и мерзко пищит при этом.
Лечение: В /etc/profile добавьте команды
LC_CTYPE=iso_8859_1 export LC_CTYPE # Это спасает русские буквы в VI
LC_LOCALE=iso_8859_1 export LC_LOCALE # Это спасает русские буквы в VI
LESS="-e -r" export LESS # Чтоб less русские буквы не калечил
Расположение ядра /vmlinuz или /boot/vmlinuz ?
Проблема: заморочки с ядром. С инсталляции рабочее ядро
кладется в /boot/vmlinuz и /etc/lilo.conf затачивается под него, а при перекомпиляции, по команде make zlilo ядро забрасывается в /vmlinuz
Лечение: Поправить /etc/lilo.conf ручками, и сказать lilo
Разное. Нерешенные проблемы
Команда man по завершении просмотра стирает экран с мануалом.
Называется "а у тебя ведь хорошая память? Isn't it?"
После перекомпиляции ядра ВСЕ модули, пришедшие с дистрибутивом
перестают работать. Их остается только уничтожить. Но iBCS
уничтожать жалко - а он скомпилирован почему-то под версию ядра
2.0.13 вместо 2.0.18. Приходится искать исходник iBCS и
перекомпилировать.
RedHat
В дистрибутиве Linux RedHat 4.0 автомонтировщик есть. Достаточно его проинсталлировать, и он сразу начинает работать.
Возможно, захочется подправить параметры. Они в файле
/etc/amd.conf
RedHat: отсутствует pcnfsd
Проблема: PC с клиентами NFS не получают доступ к сетевому диску.
Лечение: то, что нужно вписать в /etc/exports хотя-бы такую строчку
/ (rw)
это, полагаю, особого удивления вызывать не должно. Но, в RedHat не входит демон pcnfsd !
Скомпилируйте pcnfsd из исходников, или возьмите его из RedHatовского Contrib'а или из Slackware, и добавьте запуск rpc.pcnfsd в файл активизации nfsserver'а
/etc/rc.d/rc3.d/S60nfs
daemon rpc.mountd
daemon rpc.nfsd
+ daemon rpc.pcnfsd
echo
Самодостаточные видеодиски на базе GeeXboX
Автор: Genie
E-mail: genie[at]nsk[dot]ru
Сайт:
Не один раз у каждого бывало, что принесенный к другу/подруге диск с фильмом не показывался правильно по причине отсутствия кодеков для этого формата на компьютере с Windows.
Обычно, для таких случаев на диски с фильмом записываются кодеки, с которыми этот фильм проигрывается нормально. Но вот незадача: через некоторое время все эти кодеки превращают компьютер в нечто малоприятное для использования.
Поэтому, существует другой, более либеральный, по отношению к Windows, способ.
Это — запись «самодостаточных» видеодисков, когда, в дополнение к собственно самому фильму, записывается маленький Linux. Чтобы посмотреть этот фильм в вышеописанном случае — достаточно загрузиться с него — и фильм вы гарантированно посмотрите!
Для создания таких дисков необходимо совсем немного:
— Linux-система, способная записывать диски;
— специально собранная Linux-система на основе mplayer.
В этот раз при создании своих дисков будем использовать .
Идем на сайт, скачиваем iso-образ, содержимое этого образа (папочку GEEXBOX) копируем на жесткий диск. Или скачиваем и распаковываем GeeXboX ISO Generator. Обязательно надо будет сменить разрешения на файлы:
[user@host:~/cd-content]$ chmod u+w GEEXBOX
Так как на диске они хранятся без этого аттрибута (реально нам надо права на запись только к одному файлу — GEEXBOX/boot/isolinux.bin).
Чтобы собрать диск, нам необходимо расположить в одной папочке содержимое GEEXBOX и видеофайлы, которые будем таким образом просматривать (русских символов в именах лучше не делать).
[user@host:~/cd-content]$ ls
GEEXBOX video1.avi video2.avi
[user@host:~/cd-content]$ ls GEEXBOX
bin.tar.bz2 boot etc sbin usr
[user@host:~/cd-content]$ ls GEEXBOX/boot
boot.catalog initrd.gz isolinux.bin
isolinux.cfg ldlinux.sys vmlinuz
В дополнение к этому, нам, русскоговорящим, в отличие от авторов GeeXboX-а, надо бы русские шрифты положить, чтобы читать субтитры. Кракозяблики не каждый же читать умеет.
Я для этого использую шрифты, включенные в пакет от . Можно их и сгенерировать, но не в этом суть. Из этого пакета нам надо файлы:
[user@host:~/cd-content]$ ls -aFl ~/.mplayer/font/
итого 332
drwxr-xr-x 2 user user 4096 10 02:08 ./
drwxr-xr-x 3 user user 4096 10 02:08 ../
-rw-r--r-- 1 user user 18300 12 2001 arpi_osd_a.raw
-rw-r--r-- 1 user user 18300 12 2001 arpi_osd_b.raw
-rw-r--r-- 1 user user 4055 12 2001 arpi_progress_a.raw
-rw-r--r-- 1 user user 4055 12 2001 arpi_progress_b.raw
-rw-r--r-- 1 user user 129536 22 2001 CP1251-a.raw
-rw-r--r-- 1 user user 129536 22 2001 CP1251-b.raw
-rw-r--r-- 1 user user 10565 22 2001 font.desc
Этими файлами заменяем те, что
Этими файлами заменяем те, что находятся в GeeXboX:
[user@host:~/cd-content]$ rm GEEBOX/usr/share/mplayer/font/*raw
[user@host:~/cd-content]$ cp ~/.mplayer/font/* GEEXBOX/usr/share/mplayer/font/
Итак, все готово для создания нашего диска.
[user@host:~/cd-content]$
mkisofs -R -J -b GEEXBOX/boot/isolinux.bin \
-c GEEXBOX/boot/boot.catalog -o ../cd.iso -no-emul-boot \
-boot-load-size 4 -boot-info-table -U -iso-level 3 ./
Образ диска сформирован. Осталось его записать на диск:
[user@host:~/cd-content]$ cd ..
[user@host:~]$ cdrecord --device 0,0,0 \
--driver generic-mmc-raw -eject -v cd.iso
Приятного просмотра!
Ну а теперь немного для тех, кто хотел бы скрыть папочку GEEXBOX от любопытных (и не очень) глаз пользователей Windows.
Так как расширение Joliet — это изобретение Microsoft, то Windows, увидев его на диске, не обращает внимания на присутствие RockRidge расширения. А Linux — смотрит файлы везде. Поэтому, можно часть содержимого диска скрывать от глаз Windows и пользователей, ее использующих. Чем мы сейчас и займемся.
За это отвечает опция -hide-joliet. Ею и воспользуемся.
[user@host:~/cd-content]$ mkisofs -R -J -b GEEXBOX/boot/isolinux.bin \
-c GEEXBOX/boot/boot.catalog -o ../cd.iso -no-emul-boot -boot-load-size 4 \
-boot-info-table -hide-joliet
GEEXBOX -U -iso-level 3 ./
Полученный образ записываем на диск аналогично указанному выше.
Security:
Штатная поставка sendmail 8.7.5 имеет security hole -
локальный юзер имеет возможность получить root права.
Штатная поставка sendmail 8.7.5 неработоспособна вообще -
примерно четверть всех писем не доставляется по причине delivery
errors
Единственный метод лечения - upgrade до версии 8.8.5, у
которого этот bug залечен
Поставляемый с RedHat 3.0 mount имеет security hole -
локальный юзер имеет возможность получить root права.
Произведите update на исправленную версию,
ftp://ftp.redhat.com/pub/redhat/redhat-3.0.3/i386/updates/RPMS/mount-2.5k-1.i386.rpm
или снимите setuid-бит с команд mount/umount
# chmod u-s /bin/mount /bin/umount
Сетевые возможности
Встроенные в Kylix протоколы интернета широко и исчерпывающе представлены палитрами компонент Indy, которые названы так в честь независимых разработчиков. Палитр, ни много ни мало, целых пять:
Clients. С TCP, UDP, HTTP, POP3, SMTP все ясно. Не поленились реализовать также и, например, Gopher и IRC. Для приверженцев командной строки существуют telnet, rsh и rexec - так что опытный администратор может построить исключительно удобные для него инструменты удаленного администрирования;
Servers. Реализованы практически все распространенные в Сети серверы. На этой же палитре в наличии также два полезных компонента для построения туннельных подсетей - Tunnel Master и Tunnel Slave;
Misc. В эту категорию попали различные кодировщики, например MIME и UUEncode,- так же как и ряд дополнительных компонентов. Несколько компонентов упрощают организацию многопоточного выполнения, характерного для асинхронных сетевых запросов;
Intercepts. Перехватчики трафика, или фильтры, созданы для "навешивания" кода на другие протоколы с целью ведения журналов отладки, для кодирования-декодирования и сжатия трафика "на лету";
IO Handlers. Смысл всех этих компонент - заменить чтение сокетов на более привычный асинхронный поточный ввод-вывод. Весьма полезным и интересным компонентом является ограничитель пропускной способности - на его основе можно строить качественные и надежные приложения.
Веб-программирование представлено двумя поколениями инструментов. Во-первых, это компоненты палитры Internet, представляющие традиционный для Delphi набор WebDispatcher + PageProducer. Несколько сложная на практике технология - в частности, из-за отсутствия встроенного визуального редактора шаблонов. В Kylix, что естественно, сервер приложений взаимодействует с сервером Apache. Хорошей новостью является тот факт, что такое приложение, перенесенное в среду Windows, станет работать и с Apache для Windows.
Второй подход к веб-программированию - компоненты, представленные на WebSnap.
BizSnap, WebSnap, DataSnap
Эти технологии напрямую связаны с такими вещами, как XML, SOAP и веб-сервисы. Несмотря на довольно прихотливую терминологию и наличие нескольких трудных мест, в основе веб-сервисов лежит несколько простых принципов: для представления данных и удаленных команд используется протокол HTTP, поверх которого передаются специально оформленные в формате SOAP блоки XML данных. Подобно тому как класс ActiveX или JavaBean способен самостоятельно перечислять свои методы и тип их параметров, точно так же Web Services, установленные на сервере, могут быть исследованы с помощью протокола WSDL. Таким же образом в виде XML организованы вызовы и возврат значений удаленных объектов в модели CORBA. Частным, но исключительно важным типом передаваемых в XML данных являются таблицы как результат запросов к СУБД - фактически многие SQL-серверы представляют результаты запросов именно в этом виде.
Из-за обширности темы на этом я и закончу, а всех, кто интересуется данными технологиями, отсылаю к документации по Snap'ам.
Slackware
В штатную поставку Slackware Linux автомонтировшик не в ходит.
Приходится добывать, компилировать и сетапить его самостоятельно.
Звать его AMD, имеется он, например, на sunsite.unc.edu
Startx: Экономим один виртуальный терминал и немного памяти
Проблема:
После запуска X, startx занимает один виртуальный терминал, и оставляет за собой два sleeped процесса.
Лечение: В файле /usr/bin/X11/startx исправить строчку
xinit $clientargs -- $serverargs
на
exec xinit $clientargs -- $serverargs &
Trim log files
увеличить размер при котором log-файл удаляется с 16 до 256kb
Если используется uucp то добавить чистку uucp-ишых log-файлов.
Проблема: В Redhat Linux ежедневно пускается команда updatedb, создающая индекс для locate. Однако в этот индекс попадают файлы только
из корневого каталога.
Лечение: исправить ключи команды updatedb в файле /etc/cron.daily/updatedb.cron
с
--localpaths='' --netpaths='/'
на
--localpaths='/' --netpaths=''
а еще он стер мой
Нормально можно поставить RedHat с CD или по NFS.
А вот с локального жесткого диска...
#$%^#$&&^)#%$@$&^*%%^
а еще он стер мой файл /etc/hosts, /etc/httpd/conf/*, переименовал /etc/sendmail.cf, /etc/lilo.conf
Короче, я-то поставил. А Вы?
Присылайте свои советы/замечания/дополнения по поводу всего
вышесказанного
Максим Мошков.
Заметки о Linux-консоли
, UNIX4all
Обновления материалов Алексея Федорчука публикуются на http://unix.ginras.ru
содержание
Жесткий диск WD10EARS с сектором 4КБ.Подготовка к эксплуатации в Linux.
Виталий Розизнаный AKA Rozik, R.LAB
Исходя из специфики работы автору приходится регулярно приобретать различные новые жесткие диски, как правило для сохранения посекторных копий с неисправных накопителей.
На этот раз для этих целей был приобретен терабайтный винчестер фирмы Western Digital, модель WD10EARS-00Y5B1. В винчестере используется технология «Advanced Format», что в переводе на русский означает новый внутренний (низкоуровневый) формат с размером сектора 4096 байт (4 КБ) вместо устоявшегося за десятки лет стандартного 512-байтного сектора.
Теоретически, никаких особых нюансов в работе с этим винчестером быть не должно, т. к. он представляется как обычный НЖМД со стандартным сектором 512 Байт (разумеется, это эмулируется самим накопителем), что видно из его идентификационных данных, обозначенных на наклейке — LBA: 1953525168. Подверждение этому получаем и (забегая немного наперед) программно:
root@tazik001:~# hdparm -I /dev/sdb | grep LBA48
LBA48 user addressable sectors: 1953525168
root@tazik001:~# hdparm -I /dev/sdb | grep Sector\ size
Logical/Physical Sector size: 512 bytes
Тем не менее, производитель почему-то настойчиво акцентирует внимание на предварительной подготовке накопителя для работы в «устаревших» системах, о чем пишет на крышке самого накопителя и дополнительно дублирует на наклейке на упаковочном кульке. Причем явно указана только Windows XP. Для остальных ОС «drive is ready for use as is», что можно интерпретировать как «подготовки не требует», так и «ешьте, что дают :) ».
Разумеется, мы зададимся вопросом, есть ли особенности в работе этого HDD в Linux, раз ни прямо ни косвенно об этом не упоминается.
Исследования ведутся на IBM-PC совместимом компьютере, собранном на базе материнской платы ECS KV2 Extreme (чипсет VIA K8T880+VT8237R с дополнительным контроллером PATA+SATA на SiS 180, к которому и подключается испытуемый винчестер), процессор Athlon64 3700+, 1ГБ ОЗУ. Установлен частично русифицированный Slackware-12.1, проапгрейжен hdparm с 8.6 до 9.27.
Как издавна на Руси повелось, перво-наперво ориентируемся в пространстве:
root@tazik001:~# fdisk -l
Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders Units = цилиндры of 16065 * 512 = 8225280 bytes Disk identifier: 0x000945ef
Устр-во Загр Начало Конец Блоки Id Система /dev/sda1 1 127 1020096 b W95 FAT32 /dev/sda2 128 5099 39937590 83 Linux /dev/sda3 * 5100 10071 39937590 7 HPFS/NTFS /dev/sda4 10072 121601 895864725 7 HPFS/NTFS
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders Units = цилиндры of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000
На диске /dev/sdb отсутствует верная таблица разделов
Уточняем устройство для экспериментов:
root@tazik001:~# hdparm -i /dev/sdb | grep Model
Model=WDC WD10EARS-00Y5B1, FwRev=80.00A80, SerialNo=WD-WCAV55974950
Тест скорости чтения:
root@tazik001:~# hdparm -t /dev/sdb
/dev/sdb: Timing buffered disk reads: 302 MB in 3.01 seconds = 100.48 MB/sec
Тест скорости чтения посредством dd: root@tazik001:~# dd if=/dev/sdb of=/dev/null bs=128K count=20000
20000+0 записей считано 20000+0 записей написано скопировано 2621440000 байт (2,6 GB), 24,372 c, 108 MB/c
Тест скорости записи посредством dd: root@tazik001:~# dd if=/dev/zero of=/dev/sdb bs=128K count=20000
20000+0 записей считано 20000+0 записей написано скопировано 2621440000 байт (2,6 GB), 24,2364 c, 108 MB/c
Теперь создаём один основной раздел на всю «поляну»: root@tazik001:~# fdisk /dev/sdb
Команда (m для справки): n
Действие команды e расширенный p основной раздел (1-4) p
Номер раздела (1-4): 1
Первый цилиндр (1-121601, по умолчанию 1): Используется значение по умолчанию 1 Последний цилиндр или +size или +sizeM или +sizeK (1-121601, по умолчанию 121601): Используется значение по умолчанию 121601
Команда (m для справки): p
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders Units = цилиндры of 16065 * 512 = 8225280 bytes Disk identifier: 0x15f317bf
Устр- во Загр Начало Конец Блоки Id Система /dev/sdb1 1 121601 976760001 83 Linux
Команда (m для справки): w
Таблица разделов была изменена!
Вызывается ioctl() для перечитывания таблицы разделов. Синхронизируются диски.
Форматируем новый раздел: root@tazik001:~# mkfs.reiserfs /dev/sdb1
Монтируем файловую систему раздела: root@tazik001:~# mount /dev/sdb1 /mnt/hd
Проверяем скорость записи данных в файловую систему. (Для наблюдения за скоростью здесь и в последующих аналогичных случаях на втором терминале вводим watch -n60 killall -SIGUSR1 dd, либо, чтоб не топтать лишний раз клавиши, запишем команду в файл и сделаем его исполняемым.)
root@tazik001:~# dd if=/dev/zero of=/mnt/hd/000.dd bs=128K count=100000
16140+0 записей считано 16140+0 записей написано скопировано 2115502080 байт (2,1 GB), 56,9052 c, 37,2 MB/c 32379+0 записей считано 32379+0 записей написано скопировано 4243980288 байт (4,2 GB), 117,056 c, 36,3 MB/c 46439+0 записей считано 46439+0 записей написано скопировано 6086852608 байт (6,1 GB), 177,719 c, 34,2 MB/c 65859+0 записей считано 65859+0 записей написано скопировано 8632270848 байт (8,6 GB), 237,151 c, 36,4 MB/c 75811+0 записей считано 75811+0 записей написано скопировано 9936699392 байта (9,9 GB), 297,219 c, 33,4 MB/c 90639+0 записей считано 90639+0 записей написано скопировано 11880235008 байт (12 GB), 357,965 c, 33,2 MB/c 100000+0 записей считано 100000+0 записей написано скопировано 13107200000 байт (13 GB), 399,318 c, 32,8 MB/c
Оба-на! Скорость записи втрое ниже ожидаемой. (Между делом замечу, что скорость чтения этого же файла вполне на уровне — около 100 МБ/сек. Баг вылазит только на записи.)
Может ReiserFS «глючная» :) ? Проверим «грязным хаком» :) . Сначала отмонтируемся:
root@tazik001:~# umount /dev/sdb1
Потом сотрем содержимое нулевого сектора: root@tazik001:~# dd if=/dev/zero of=/dev/sdb count=1
А потом создадим новую файловую систему прямо на жестком диске как на дискете (ключ -f — форсировать выполнение ни о чем не предупреждая): root@tazik001:~# root@tazik001:~# mkfs.reiserfs -f /dev/sdb
Монтируем: root@tazik001:~# mount /dev/sdb /mnt/hd
Пишем: root@tazik001:~# dd if=/dev/zero of=/mnt/hd/000.dd bs=128K count=100000
17877+0 записей считано 17877+ 0 записей написано скопировано 2343174144 байта (2,3 GB), 27,8018 c, 84,3 MB/c 53827+0 записей считано 53827+0 записей написано скопировано 7055212544 байта (7,1 GB), 87,8909 c, 80,3 MB/c 89724+0 записей считано 89724+0 записей написано скопировано 11760304128 байт (12 GB), 148,018 c, 79,5 MB/c 100000+0 записей считано 100000+0 записей написано скопировано 13107200000 байт (13 GB), 165,614 c, 79,1 MB/c
Совсем другое дело! Видим, что проблема не в файловой системе. Видим также, что винчестеру совершенно не нравится традиционная MS-DOS MBR совместимая разметка с началом раздела на 63-м стандартном 512-байтном секторе, с номером, не кратным размеру нового «хардверного» сектора в 4 КБ (8 «традиционных» секторов по 512 Б). Попробуем обойти это. Отмонтируем файловую, очищаем 0-й сектор для дальнейшей работы: root@tazik001:~# umount /dev/sdb
root@tazik001:~# dd if=/dev/zero of=/dev/sdb count=1
Попробуем создать fdisk'ом раздел с началом на 64-м секторе. Для ввода границ раздела в секторах (LBA), а не в стандартном LCHS применим ключ -u. Акцентирую внимание на том, что fdisk по умолчанию предлагает сектор 63! root@tazik001:~# fdisk -u /dev/sdb
Команда (m для справки): n
Действие команды e расширенный p основной раздел (1-4) p
Номер раздела (1-4): 1
Первый сектор (63-1953525167, по умолчанию 63): 64
Последний сектор или +size или +sizeM или +sizeK (64-1953525167, по умолчанию 1953525167): Используется значение по умолчанию 1953525167
Команда (m для справки): p
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders, всего 1953525168 секторов Units = секторы of 1 * 512 = 512 bytes Disk identifier: 0x5e5c7cb9
Устр-во Загр Начало Конец Блоки Id Система /dev/sdb1 64 19535251671 976762552 83 Linux
Команда (m для справки): w
Таблица разделов была изменена!
Вызывается ioctl() для перечитывания таблицы разделов. Синхронизируются диски.
Форматируем, монтируем: root@tazik001:~# mkfs.reiserfs /dev/sdb1
root@tazik001:~# mount /dev/sdb1 /mnt/hd
Проверяем скорость записи на раздел: root@tazik001:~# dd if=/dev/zero of=/mnt/hd/000.dd bs=128K count=100000
2889+0 записей считано 2889+0 записей написано скопировано 378667008 байт (379 MB), 4,32944 c, 87,5 MB/c 42386+0 записей считано 42386+0 записей написано скопировано 5555617792 байта (5,6 GB), 64,369 c, 86,3 MB/c 87304+0 записей считано 87304+0 записей написано скопировано 11443109888 байт (11 GB), 124,384 c, 92,0 MB/c 100000+0 записей считано 100000+0 записей написано скопировано 13107200000 байт (13 GB), 140,365 c, 93,4 MB/c
В целом недурно и значительно ближе к максимально возможной скорости записи.
При организации 2-х и более первичных разделов придерживаемся того же правила: начало каждого раздела должно быть на секторе с номером, кратным как минимум 8-ми. Для этого рассчитываем на калькуляторе кратным 8-ми (минус 1 сектор) номер последнего сектора предыдущего раздела и вводим его fdisk'ом . Требуемый «правильный» номер начального сектора следующего раздела fdisk предложит по умолчанию сам.
В этом примере номер сектора второго раздела я подобрал кратным 64-м: root@tazik001:~# fdisk -u /dev/sdb
Команда (m для справки): n
Действие команды e расширенный p основной раздел (1-4) p
Номер раздела (1-4): 1
Первый сектор (63-1953525167, по умолчанию 63): 64
Последний сектор или +size или +sizeM или +sizeK (64-1953525167, по умолчанию 1953525167): 976639999
Команда (m для справки): n
Действие команды e расширенный p основной раздел (1-4) p
Номер раздела (1-4): 2
Первый сектор (976640000-1953525167, по умолчанию 976640000): Используется значение по умолчанию 976640000 Последний сектор или +size или +sizeM или +sizeK (976640000-1953525167, по умолчанию 1953525167): Используется значение по умолчанию 1953525167
Команда (m для справки): p
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders, всего 1953525168 секторов Units = секторы of 1 * 512 = 512 bytes Disk identifier: 0x17d66173
Устр- во Загр Начало Конец Блоки Id Система /dev/sdb1 64 976639999 488319968 83 Linux /dev/sdb2 976640000 1953525167 488442584 83 Linux
Команда (m для справки): w
Таблица разделов была изменена!
Вызывается ioctl() для перечитывания таблицы разделов. Синхронизируются диски.
Форматируем, монтируем, проверяем скрость записи: root@tazik001:~# mkfs.reiserfs /dev/sdb2
root@tazik001:~# mount /dev/sdb2 /mnt/hd
root@tazik001:~# dd if=/dev/zero of=/mnt/hd/000.dd bs=128K count=100000
33765+0 записей считано 33765+0 записей написано скопировано 4425646080 байт (4,4 GB), 51,3811 c, 86,1 MB/c 72486+0 записей считано 72486+0 записей написано скопировано 9500884992 байта (9,5 GB), 111,47 c, 85,2 MB/c 100000+0 записей считано 100000+0 записей написано скопировано 13107200000 байт (13 GB), 153,375 c, 85,5 MB/c
Working good!
Рассмотрим совсем запущенный случай для логического тома в расширенном разделе.
Т. к. во времена господства MS-DOS расширенный раздел был придуман для программной эмуляции еще одного (второго) жесткого диска на свободном пространстве уже имеющегося накопителя, то для организации первого логического тома в расширенном разделе fdisk предложит нам создать его начальный сектор с номером n+63, где n — начальный сектор расширенного раздела. Нам же необходимо для соблюдения условия кратности 8-ми сектор n+64.
Т. е., сначала нам надо организовать расширенный раздел с номером начального сектора, кратным 8-ми. После чего будем создавать логический том в расширенном разделе также с начальным сектором, кратным восьми.
Отмонтируем и удалим fdisk'ом 2-й основной раздел. После чего на его месте создадим расширенный со вложенным логическим томом. root@tazik001:~# fdisk -u /dev/sdb
Команда (m для справки): p
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders, всего 1953525168 секторов Units = секторы of 1 * 512 = 512 bytes Disk identifier: 0x00054d40
Устр-во Загр Начало Конец Блоки Id Система /dev/sdb1 64 976639999 488319968 83 Linux
Команда (m для справки): n
Действие команды e расширенный p основной раздел (1-4) e
Первый сектор (976640000-1953525167, по умолчанию 976640000): Используется значение по умолчанию 976640000 Последний сектор или +size или +sizeM или +sizeK (976640000-1953525167, по умолчанию 1953525167): Используется значение по умолчанию 1953525167
Команда (m для справки): p
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders, всего 1953525168 секторов Units = секторы of 1 * 512 = 512 bytes Disk identifier: 0x00054d40
Устр-во Загр Начало Конец Блоки Id Система /dev/sdb1 64 976639999 488319968 83 Linux /dev/sdb2 976640000 1953525167 488442584 5 Расширенный
Команда (m для справки): n
Действие команды l логический (5 или более) p основной раздел (1-4) l
Первый сектор (976640063-1953525167, по умолчанию 976640063): 976640064
Последний сектор или +size или +sizeM или +sizeK (976640064-1953525167, по умолчанию 1953525167): Используется значение по умолчанию 1953525167
Команда (m для справки): p
Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders, всего 1953525168 секторов Units = секторы of 1 * 512 = 512 bytes Disk identifier: 0x00054d40
Устр-во Загр Начало Конец Блоки Id Система /dev/sdb1 64 976639999 488319968 83 Linux /dev/sdb2 976640000 1953525167 488442584 5 Расширенный /dev/sdb5 976640064 1953525167 488442552 83 Linux
Команда (m для справки): w
Таблица разделов была изменена!
Вызывается ioctl() для перечитывания таблицы разделов. Синхронизируются диски.
root@tazik001:~# mkfs.reiserfs /dev/sdb5
root@tazik001:~# mount /dev/sdb5 /mnt/hd
root@tazik001:~# dd if=/dev/zero of=/mnt/hd/000.dd bs=128K count=100000
6585+0 записей считано 6585+0 записей написано скопировано 863109120 байт (863 MB), 11,2747 c, 76,6 MB/c 37947+0 записей считано 37947+0 записей написано скопировано 4973789184 байта (5,0 GB), 72,3125 c, 68,8 MB/c 68410+0 записей считано 68410+0 записей написано скопировано 8966635520 байт (9,0 GB), 131,587 c, 68,1 MB/c 99030+0 записей считано 99030+0 записей написано скопировано 12980060160 байт (13 GB), 191,798 c, 67,7 MB/c 100000+0 записей считано 100000+0 записей написано скопировано 13107200000 байт (13 GB), 193,386 c, 67,8 MB/c
Working very good! Что и требовалось доказать.
Отмонтируем раздел для дальнейших экспериментов: root@tazik001:~# umount /dev/sdb5
В свою очередь WD предлагает нам свой вариант согласования старой разметки с новым низкоуровневым форматом путем установки перемычки на контакты 7-8. В этом случае винчестер сдвигает трансляцию на 1 сектор (512 Б), «подсовывая» под начало раздела свой «родной» 64-й сектор, вместо 63-го. Для пущей понятности наглядно продемонстируем, что в этом случае происходит.
Очистим первые 500 секторов для дальнейшей работы: root@tazik001:~# dd if=/dev/zero of=/dev/sdb count=500
Создадим новый раздел классическим методом и отформатируем: root@tazik001:~# fdisk /dev/sdb
root@tazik001:~# mkfs.reiserfs /dev/sdb1
Посмотрим содержимое сектора 0: root@tazik001:~# hdparm --read-sector 0 /dev/sdb
/dev/sdb: reading sector 0: succeeded 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 8ba4 c746 0000 0100 0001 fe83 ffff 003f 0000 5982 7470 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 aa55
Визуально напоминает :) живую таблицу разделов (сигнатура aa55) с одним разделом Линукс (тип 83).
Почитаем сектор 191 — в нем живет рейзерэфэсный суперблок: root@tazik001:~# hdparm --read-sector 191 /dev/sdb
/dev/sdb: reading sector 191: succeeded 0b30 0e8e ce00 0e8d 2013 0000 0012 0000 0000 0000 2000 0000 0400 0000 0f87 3caf 0384 0000 001e 0000 0000 0000 1000 03cc 0002 0001 6552 7349 7245 4632 0073 0000 0003 0000 0002 1d1d 0002 0000 0000 0000 0001 0000 d748 2bfc fd2a bd4f 9d95 4612 4d4c 605d 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0000 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Прошу поверить на слово — это именно он :) . Выключаем тазик: root@tazik001:~# halt
Cтавим перемычку на контакты 7-8. Включаемся. root@tazik001:~# fdisk -l
Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders Units = цилиндры of 16065 * 512 = 8225280 bytes Disk identifier: 0x000945ef
Устр-во Загр Начало Конец Блоки Id Система /dev/sdb1 1 127 1020096 b W95 FAT32 /dev/sdb2 128 5099 39937590 83 Linux /dev/sdb3 * 5100 10071 39937590 7 HPFS/NTFS /dev/sdb4 10072 121601 895864725 7 HPFS/NTFS
Диск /dev/sdb: 1000. 2 ГБ, 1000204886016 байт 255 heads, 63 sectors/track, 121601 cylinders Units = цилиндры of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000
На диске /dev/sdb отсутствует верная таблица разделов
Раздел как ветром сдуло. Куда ж он делся? «Пошукаем псису»: root@tazik001:~# hdparm --read-sector 0 /dev/sdb
/dev/sdb: reading sector 0: succeeded 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
root@tazik001:~# hdparm --read-sector 191 /dev/sdb
/dev/sdb: reading sector 191: succeeded 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Пусто. Поищем суперблок в окрестностях: root@tazik001:~# hdparm --read-sector 190 /dev/sdb
reading sector 190: succeeded 0b30 0e8e ce00 0e8d 2013 0000 0012 0000 0000 0000 2000 0000 0400 0000 0f87 3caf 0384 0000 001e 0000 0000 0000 1000 03cc 0002 0001 6552 7349 7245 4632 0073 0000 0003 0000 0002 1d1d 0002 0000 0000 0000 0001 0000 d748 2bfc fd2a bd4f 9d95 4612 4d4c 605d 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0000 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Вот он! Оказался на 190-м секторе. Соответственно, таблица разделов сейчас находится на секторе -1 (минус 1), т. е. не в пользовательской зоне и она недоступна штатными средствами.
Если сейчас в таком виде, с установленной перемычкой 7-8, создать классическую разметку и отформатировать новоиспеченный раздел, то таблица разделов окажется на «заводском» 1-м секторе. Но начало раздела — на «удобном» винчестеру «заводском» 64-м, суперблок — на 192-м. Т. е. логика раздела и ФС будет кратна «хардверному» сектору в 4 КБ и ничего тормозить не будет. Разумеется, перемычку после этих операций снимать будет нельзя!
Это есть весьма оригинальное «хардверное» решение проблемы от WD, и для создания единственного основного раздела вполне успешно заменяет «пляски с бубном» в fdisk. К сожалению, трюк с перемычкой работает только для одного основного раздела на весь объем устройства, либо же только для первого основного раздела. Если всё делать «по умолчанию», то для следующих после первого основных разделов, либо логических томов в расширенном разделе, кратность будет опять переломана, и работа в рамках всех разделов, кроме первого, будет идти с тормозами, и никакие перемычки здесь уже не помогут.
В целом мы убедились, что проявленная багофича связана с тяжелым наследием разметки дисков по умолчанию, совместимым с классическим MS-DOS MBR.
При создании же посекторных копий других дисков на исследуемый диск тем же dd, либо отказоустойчивыми ddrescue и dd_rescue, без учёта имеющихся логических структур, в связи со вполне приемлемой эмуляцией 512-байтного сектора, никаких критических сбоев в работе замечено не было. Вкупе с демократичной ценой, винчестер демонстрирует приличные скоростные характеристики при последовательных записи и чтении и низкую рабочую температуру, характерную для всех накопителей WD Green. И после внимательного ознакомления с написанным материалом может однозначно быть рекомендован к эксплуатации в Линукс.
Актуальность данных
При классифицировании трафика необходимо следить за актуальностью границ сетей, т.к. интернет - динамичная система. Можно использовать актуальные копии статических списков сетей, с которыми у вашего головного провайдера заключены пиринговые соглашения (и, соответственно, трафик, связанный с ними, тарифицируется по-иному), периодически скачивая их от ISP. Альтернативой может быть использование протоколов динамической маршрутизации, например - RIP, с помощью которых можно получать границы пиринговой сети (если ваш головной ISP предоставляет такую услугу).
По отношению к тарифной сетке справедливо то же самое - ваша билинговая система должна всегда производить расчеты, основанные на актуальных для вашей организации тарифах.
Бизнес-специфика
Если упустить некоторые пункты из нижеописанного на этапе проектирования - потом возможно прийдется подвергать систему серьезной модификации уже на этапе эксплуатации, что крайне нежелательно. Основные технические требования, диктуемые бизнесом: гибкость, точность расчетов, устойчивость к сбоям.
Бухгалтерия
Полезно подумать об интеграции вашего биллинга в общую бухгалтерию вашей организации, например - с 1С или еще чем-то, что у вас используется для этих целей.
При планировании структуры базы данных учтите тот факт, что у одного абонента может быть несколько разных счетов (на разные услуги), и он по идее должен иметь возможность либо объединять, либо изолировать их. Еще довольно часто встречается ситуация, когда несколько разных пользователей работают с одним счетом.
Система должна в идеале позволять работать в кредит.
Коллекторы
Услуги могут быть разными (например - VPN-доступ, dial-up пул, обычный неинкапсулированный трафик, Proxy, VoIP, etc), надо обеспечить доставку ядру системы в единообразном виде информации о том, какой тип услуги, какой абонент, в каком объеме и в какое время потребил. В худшем случае для каждого из типов услуг прийдется разрабатывать свой коллектор, но если повезет - что-то удастся унифицировать. Технологии, которые могут помочь при создании коллекторов - SNMP, Radius, NetFlow.
Лицензирование
Если у вас 100% легальный бизнес, необходимо использовать только сертифицированные в Министерстве связи РФ решения. Проблема в том, что иногда они не доступны по цене, выбор их не богат, да и зачастую эти решения далеки от идеала. В целом, вопрос с наличием лицензии на биллинг каждый решает для себя сам.
Многоуровневая база данных
Многоуровневая БД нужна для того, чтобы не работать все время с массивами максимально детальной информации, т.к. это значительно может снизить быстродействие всей системы.
Логично выделить 3 уровня:
максимально детализированная информация без какой-либо обработки классифицированная и первично агрегированная информация оперативная информация
База первого уровня может понадобиться для разрешения спорных моментов с клиентами. Важно сохранять ее в исходном виде, т.к. возможно будет необходимо постфактум произвести перерасчет выставленных к оплате счетов с учетом скорректированных тарифов или, например, уточненных границ сетей, по которым делится трафик.
Не для каждого сервиса можно получить детализированную информацию о соединениях, но к этому надо стремиться. По крайней мере, при подсчете трафика через Web Proxy это решается автоматически, использование NetFlows тоже позволяет делать полную детализацию. Минусом является значительный объем, требующийся для хранения всех этих данных. Однако, т.к. эта информация нужна не очень часто, ее более логично хранить в виде обычных файлов, а не в базе - это уменьшит нагрузку на ваш сервер БД и является более компактным способом хранения.
База второго уровня компактнее, чем первая, поэтому ее можно хранить за более продолжительный период времени. Например, после классификации трафика можно не хранить информацию о локальном трафике, если за него не взимается плата. Также с большой долей вероятности можно считать одним соединением несколько соединений с одним и тем же хостом, произошедшие в приблизительно одно время (типичная ситуация с многопоточными сетевыми клиентами).
Оперативная информация - наиболее грубая по отношению к остальным двум базам, но зато операции с ней можно совершать очень быстро, что позволяет сократить время реакции системы, которое будет обсуждаться ниже. На основе этой базы осуществляется принятие решений о предоставлении или прекращении предоставления услуг конкретному клиенту.
Отключение абонентов
Если для вашей организации приемлемым является предоставление услуг в кредит, желательно предоставить каждому отдельному пользователю самому принимать решение о том, будет ли он немедленно отключен при исчерпании средств на счете, или же продолжит работать в кредит.
Погрешность расчетов
Как показывает практика, учет трафика может работать с ненулевой погрешностью, а при больших объемах потребления даже доли процента - это уже значительные деньги. Чтобы застраховаться от подобных неприятных особенностей, можно учитывать это в тарифах, хотя это уже не технический вопрос.
Помимо всего прочего, есть еще паразитный трафик. Ничего с ним поделать нельзя, нужно просто помнить о нем, если у вас много реальных IP-адресов.
Если вы перепродаете трафик, не забудьте при расчетах о том, что ваш головной ISP может под мегабайтом понимать вовсе не 1048576 байт, а, например, 1000000, что в результате дает почти 5% расхождения. Дополнительные проблемы могут составлять направления - некоторые головные провайдеры выставляют счета за входящий трафик, некоторые - за исходящий, а в ряде случаев учитывается превышающее направление.
Практический пример
Разберем теперь конкретные варианты технической реализации такой системы. Например - биллинг для небольшой локальной сети, продающей трафик.
Один из часто используемых способов простого учета трафика - использование счетчиков iptables на пограничном маршрутизаторе. Плюсы такого решения - простота и гибкость, возможность разграничения типов трафика на уровне правил пакетного фильтра. Минусы - прийдется весь трафик, который вы хотите учитывать, маршрутизировать через один PC, что, в общем-то, не сильно критично при небольшой загрузке. В качестве коллектора в таком случае может выступать небольшой PERL-скрипт, анализирующий вывод iptables. При этом рекомендую использовать флаг -Z, который обнуляет счетчики iptables после вывода их значений - так вы избежите потенциально возможного переполнения счетчиков, регистрируя лишь разницу между измерениями.
Рис. 2. Структура цепочек правил iptables
Модуль разграничения доступа, по сути, является простым скриптом, модифицирующий набор правил файрвола, что в результате открывает или закрывает доступ определенному клиенту.
В случае использования VPN (например, для продажи трафика это одно из наиболее оптимальных решений, т.к. в сетях, построенных на дешевых хабах без возможности Port Security, идентификация пользователя по IP является крайне ненадежным решением) вполне логично интегрировать модуль авторизации клиентов в скрипты /etc/ppp/ip-up и /etc/ppp/ip-down, которые вызываются демоном pppd при подъеме и опускании ppp интерфейса (а зачастую VPN-соединения представляют собой по сути, соединения, использующие PPP как транспорт для инкапсулированного трафика). Аналогичным образом можно организовать авторизацию для dial-up соединений.
Завершает основную часть системы небольшой демон (или просто программа, с определенной периодичностью вызываемая средствами crond), который анализирует оперативную информацию и на ее основе принимает решения об отключении абонентов, если у них на счету закончились средства (в таком случае просто соответствующее правило файрвола меняется на запрещающее). По сути, этот компонент и заключает в себя основную часть бизнес-логики, т.к. именно он ответственен за финансовые расчеты.
Модуль административного интерфейса и веб-статистики являются достаточно тривиальными задачами, и их вряд ли стоит подробно рассматривать. Единственное, на чем хочется акцентировать внимание - это то, что эти модули должны быть разработаны с максимальным учетом бизнес-спефики, которая обсуждалась выше.
Схема системы
Исходя из задач и запросов бизнеса, можно набросать схему системы. Чтобы не обсуждать какого-то абстрактного сферического коня в вакууме, будем рассматривать типовой пример оператора связи, продающего трафик абонентам.
коллекторы информации о потребленных услугах система аутентификации абонентов ядро (бизнес-логика) многоуровневая БД модуль авторизации модуль анализа типов трафика (локальный, пиринговый, etc) модуль разграничения доступа модуль статистики административный интерфейс для ручного управления абонентами интерфейс управления счетами абонентов и тарифами для отдела продаж
Рис. 1. Структура биллинговой системы ISP
Основной принцип проектирования системы - строгая модульность, которая в последствии позволит легко модернизировать отдельные компоненты системы в зависимости от меняющихся задач бизнеса. Как в любой сложной системе, придется искать компромисс между сверхуниверсальным комбайном и узкоспециализированным решением.
Статистические отчеты
Помимо классического уже веб-интерфейса к статистической информации о потребленных услугах и состоянии счета неплохо предоставлять клиентам услугу рассылки наиболее важной для него информации на e-mail или посредством SMS.
Тарифы
Сразу же желательно продумать систему задания тарифов, даже если вы изначально занимаетесь всего лишь продажей трафика по одной фиксированной цене. Технически эту задачу можно формализовать так: тарифы должны рассчитываться в кусочно-линейной зависимости от некоторого параметра - либо времени суток и дня недели, либо объема уже потребленных абонентом услуг. При этом желательно, чтобы система позволяла не очень технически грамотному персоналу управлять тарифными планами.
Кроме этого, очень желательно хранить архив тарифов для возможности восстановления счетов спустя время.
Учет перспективы
Задумайтесь над тем, какие с какими услугами ваш биллинг должен будет уметь работать, при этом планируйте на будущее. Сегодня наиболее часто считают трафик, но завтра могут возникнуть потребности в новых услугах - платный контент, VoIP, веб-хостинг, что-нибудь еще.
Конечно, для малого бизнеса это не так актуально, но вполне вероятно, что в перспективе у вас возникнет необходимость работать с платежами по временным картам доступа.
Устойчивость к сбоям
Биллинг считает деньги, поэтому нужно быть предельно аккуратным. При сбоях (которые все равно будут, ничего идеального нет) система должна по умолчанию блокировать доступ, т.е. политика "запрещено по умолчанию". Естественно, жизненно необходима надежная система резервного копирования данных. Помните, что стоимость дополнительного дискового пространства зачастую намного меньше финансовых потерь, связанных с утерей информации.
Время реакции системы
Принятие решения о блокировке абонента при окончании средств на его счету на практике происходит не мгновенно, этот факт тоже надо учитывать. Например, если блокировка срабатывает раз в минуту - при скорости соединения 1 Мбит/с абонент может скачать лишних 7,5 мегабайт в худшем случае.
программный комплекс, осуществляющий учет объема
Биллинговая система - программный комплекс, осуществляющий учет объема потребляемых абонентами услуг, расчет и списание денежных средств в соответствии с тарифами компании.
Не обязательно бежать писать свою биллинговую систему после прочтения этого материала, вполне возможно, что эта информация поможет вам сориентироваться и выбрать для себя биллинг из уже предлагаемых решений (как коммерческих, так и некоммерческих), которых уже понаделано достаточное количество. Однако, зная извечную склонность системных администраторов (и линуксоидов в особенности) к изобретению велосипедов, не исключено, что кто-то на базе этих рекомендаций создаст биллинг своей мечты. Весомыми аргументами в пользу разработки собственного биллинга являются цена коммерческих аналогов и несовершенство некоторых широко распространенных решений среднего ценового диапазона.
Итак, постараемся подумать над тем, как создать биллинг на базе Linux и open source ПО.
Чтобы спланировать внутреннюю архитектуру полнофункциональной
Чтобы спланировать внутреннюю архитектуру полнофункциональной биллинговой системы, в первую очередь нужно выделить задачи, которые она должна решать.
сбор информации о потребляемых услугах (аккаунтинг) аутентификация и авторизация абонентов контроль денежных средств на счетах абонентов и списание средств в соответствии c действующей тарифной сеткой пополнение счетов абонентов внесение изменений в тарифы предоставление статистики по операциям (клиентская и операторская части)
Кстати, не стоит путать аутентификацию и авторизацию - это разные понятия. Так, аутентификация - процедура идентификации пользователя (обычно сводящаяся к проверке указываемых им данных на совпадение с хранящимися в системе). Авторизация - процесс принятия решения о правомерности доступа пользователя к какому-то конкретному ресурсу (например, к файлу на диске или к определенной услуге связи).
Если вы все же решили
Если вы все же решили создать свою собственную биллинговую систему, то пусть она всегда считает точно, не доставляя вам лишних хлопот.
Статья написана по материалам доклада на семинаре, посвященном применению Linux и open source ПО, прошедшем 29.10.05 в г. Томске.
PS: автор благодарит за конструктивные замечания по теме статьи.