Это был пролог. Теперь же ближе к сути. Имееться старый dialin сервер (PIII, FreeBSD 4.6) с модемным пулом в 12 Зикселей, обслуживает около трех-четырех одновременных подключений. Задача: Перенести это все дело на отдельный, относительно новый сервер (2*Dual Xeon 2,2; 2048 RAM; 160GB Raid-0;1Gbps link). Строго говоря, такая конфигурация для таких целей не то что слишком хорошая, она просто нереальная. Задействовано будет около 1% мощностей, но поскольку другой машины просто небыло, а старый сервер уже вот вот прикажет долго жить, было решено сделать на чем есть, а незадействованные ресурсы потом придумаем как использовать, хоть поднять несколько виртуальных машин для грубых экспериментов. Основная задача DialIn в нашей организации - предоставление интернета на скорости около 56Kbps, а так же пропуск некоторых пользователей к корпоративному почтовому серверу.
Специально для всей этой кухни закупили две платки Moschip MCS 9865. В графе поддерживаемых драйверов значиться Linux Kernel 2.6.14 & above. Хмм... Нативная поддержка в Линукс это уже что-то. В качестве дистрибутива был выбран Debian 5.0 Lenny. Ну что ж все в сборе, можно приступать.
Поехали
Инсталяция Debian'а самая стандартная, благо сейчас с установкой Линукса может справиться любой школьник. Я использовал текстовый режим, из компонентов остаавил только базовую систему, больше ничего не требуеться. После установки несем сервер его будущий дом, тобишь серверную, подключаем там все модемы к RS232-портам, само собой питание и сеть. Все дальнейшие действия совершаем удаленно, с рабочего места.
Собственно что нам нужно сделать:
- Собрать и подгрузить драйвер для MCS9865.
- Настроить mgetty для приема вызовов.
- Настроить PPP для установления связи.
- Создать правила файрволла.
- Забыть о сервере.
И сразу же получаем:dialin:~# сp /media/cdrom/drivers/Linux/MCS9865_Linux.tar.gz ~/dialin:~# tar zxvf MCS9865_Linux.tar.gz
dialin:~# cd MCS9865_Linux
dialin:~# make
make -C /lib/modules/2.6.26-2-686/build/ SUBDIRS=/root/MCS9865_Linux modulesНу что же, мы не ищем легких путей. Открываем файл mcs9865.c на 2068-ой строке и видим:
make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-686'
CC [M] /root/MCS9865_Linux/mcs9865.o
/root/MCS9865_Linux/mcs9865.c: In function ‘serial9865_probe’:
/root/MCS9865_Linux/mcs9865.c:2068: error: ‘SA_SHIRQ’ undeclared (first use in this function)
/root/MCS9865_Linux/mcs9865.c:2068: error: (Each undeclared identifier is reported only once
/root/MCS9865_Linux/mcs9865.c:2068: error: for each function it appears in.)
make[2]: *** [/root/MCS9865_Linux/mcs9865.o] Ошибка 1
make[1]: *** [_module_/root/MCS9865_Linux] Ошибка 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.26-2-686'
make: *** [default] Ошибка 2
//Register a ISRДа, я знаю о чем вы подумали, использовать goto плохо, это влечет за собой уменьшение толщины озонового слоя... Сейчас речь не об этом. Как говорил нам make ‘SA_SHIRQ’ undeclared,
if ((retval = request_irq(dev->irq, serial9865_interrupt,SA_SHIRQ,"mcs9865-serial",&serial9865_ports[retval])))
goto disable;
а благодаря гуглу мы узнаем что SA_SHIRQ уже два года как deprecated и что заменить его нужно на волшебный IRQF_SHARED. После всех этих шаманств, командуем:
make && make installИ драйвер должен нормально собраться, проинсталлироваться и подгрузиться как модуль. Проверяем модули и выдачу lspci:
dialin:~/MCS9865_Linux# lsmod | grep mcs9865Как видим все отлично поставилось и определилось. В /dev/ появились 4 устройства ttyD0-D3, и 4 ttyS0-S3. Что-то тут не то. Как видно по выводу lspci, имеються две платы-контроллеры с двумя портами на борту и к ним подсоединены по две двухпортовые железки. Тоесть всего портов должно быть 12, а у нас 8. После непродолжительного гугления выяснилось что по умолчанию Линукс отображает только 4 устройства /dev/ttyS и чтобы увеличить это число нужно при загрузке передать ядру параметр 8250.nr_uarts=x, где х - необходимое количество устройств. Приводим /boot/grub/menu.lst к следующему виду:
mcs9865 16736 2
mcs9865_isa 2500 0
dialin:~/MCS9865_Linux# lspci -v | grep -i "NetMos"
03:01.0 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:01.1 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:01.2 Communication controller: NetMos Technology Device 9865
03:02.0 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:02.1 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:02.2 Communication controller: NetMos Technology Device 9865
default 0
timeout 5
color cyan/blue white/blue
title Debian GNU/Linux, kernel 2.6.26-2-686
root (hd0,0)
kernel /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro 8250.nr_uarts=16
initrd /initrd.img-2.6.26-2-686
title Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root (hd0,0)
kernel /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro single
initrd /initrd.img-2.6.26-2-686
Перезагружаемся, логинимся и видим:
То что нужно. Теперь ставим необходимое ПО:dialin:/boot/grub# ls -l /dev/tty[SD]*
crw-rw---- 1 root dialout 201, 0 Ноя 3 13:37 /dev/ttyD0
crw-rw---- 1 root dialout 201, 1 Ноя 3 08:00 /dev/ttyD1
crw-rw---- 1 root dialout 201, 2 Ноя 3 08:00 /dev/ttyD2
crw-rw---- 1 root dialout 201, 3 Ноя 3 08:00 /dev/ttyD3
crw-rw---- 1 root dialout 4, 64 Ноя 3 08:00 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 Ноя 3 08:00 /dev/ttyS1
crw-rw---- 1 root dialout 4, 74 Ноя 3 08:00 /dev/ttyS10
crw-rw---- 1 root dialout 4, 75 Ноя 3 08:00 /dev/ttyS11
crw-rw---- 1 root dialout 4, 76 Ноя 3 08:00 /dev/ttyS12
crw-rw---- 1 root dialout 4, 77 Ноя 3 08:00 /dev/ttyS13
crw-rw---- 1 root dialout 4, 78 Ноя 3 08:00 /dev/ttyS14
crw-rw---- 1 root dialout 4, 79 Ноя 3 08:00 /dev/ttyS15
crw-rw---- 1 root dialout 4, 66 Ноя 3 08:00 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 Ноя 3 08:00 /dev/ttyS3
crw-rw---- 1 root dialout 4, 68 Ноя 3 08:00 /dev/ttyS4
crw-rw---- 1 root dialout 4, 69 Ноя 3 08:00 /dev/ttyS5
crw-rw---- 1 root dialout 4, 70 Ноя 3 08:00 /dev/ttyS6
crw-rw---- 1 root dialout 4, 71 Ноя 3 08:00 /dev/ttyS7
crw-rw---- 1 root dialout 4, 72 Ноя 3 08:00 /dev/ttyS8
crw-rw---- 1 root dialout 4, 73 Ноя 3 08:00 /dev/ttyS9
dialin:/boot/grub#
dialin:/boot/grub# aptitude install uucp mgetty pppГоворим init'у что будем использовать модемы:
dialin:~# vim /etc/inittabИ так далее для всех остальных модемов. Пару слов о том что все это значит. 23 - указывает на каких уровнях запуска (runlevels) будет действовать запись, respawn заставляет init перезапускать mgetty после отсоединения пользователей, число после -n, говорит через сколько звонков модем должен поднять трубку. Чтобы изменения вступили в силу, перезапускаем init:
D0:23:respawn:/sbin/mgetty -D -n 3 ttyD0
D1:23:respawn:/sbin/mgetty -D -n 3 ttyD1
D2:23:respawn:/sbin/mgetty -D -n 3 ttyD2
dialin:~# kill -1 1Теперь переходим к настройке mgetty. Собственно все опции храняться в трех файлах, директории /etc/mgetty.В /etc/mgetty/login.config вписываем строчку
/AutoPPP/ - a_ppp /usr/sbin/pppd file /etc/ppp/options.serverЭтим мы указываем что mgetty будет стартовать pppd при поднятии трубки модемом, а параметры будет брать из файла /etc/ppp/options.server.
Далее на очереди файл mgetty.config. Он описывает параметры для каждого из модемов, строки инициализации, скорость, лог файлы для каждого. Мы просто скопировали этот файл со старого сервера. Примерный вид:
########################################
# 884544
### ZyXEL U-3xxxx ##
rings 1
port ttyD0
init-chat "" \d\d\d+++\d\d\dATQ0E1V1H0 OK ATL0M0S0=0 OK AT&K3 OK
statistics-chat "" AT OK ATI2 OK
statistics-file /tmp/modem1.log
modem-type cls2
data-only y
Понятно, что для каждого типа модема строка инициализации должна быть своя. Теперь настраиваем ppp. Создаем файлик /etc/ppp/options.server, в нем содержаться общие параметры для всех модемов. Мы запишем в него только одну строку:
dialin:~# echo "lock" > /etc/ppp/options.serverТеперь создадим конфигурационные файлы для каждого порта. Имя нужно составлять таким образом: options.
В этих файлах храняться настройки соединения. Мы туда впишем такие строки:
modem
crtscts
-detach
require-pap
refuse-chap
proxyarp
login
ms-dns 4.2.2.2
ms-dns 4.2.2.1
ms-dns 193.193.193.100
172.16.81.12:10.10.5.202
Комментариев нет:
Отправить комментарий