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

вторник, 10 февраля 2009 г.

Мобильный интернет в Debian GNU/Linux.

Так уж получилось, что последнее время к "нормальному" интернету доступа нет. Поэтому приходится пользоваться мобильными технологиями(как-никак на дворе 21-ый век).
Итак, путь первый - выход через мобильный телефон.
У меня Sony Ericsson k320i. usb-шнурок шёл в комплекте. При подключении к компьютеру телефон спрашивает, в каком режиме ему работать: передача файлов или режим телефона. В данном случае выбираем второе. Перед подключением я запустил tail -f /var/log/messages и получил такие строки:
Feb 10 10:06:51 damned kernel: usb 2-3: new full speed USB device using ohci_hcd and address 3
Feb 10 10:06:51 damned kernel: usb 2-3: configuration #1 chosen from 1 choice
Feb 10 10:06:52 damned kernel: cdc_acm 2-3:1.1: ttyACM0: USB ACM device
Feb 10 10:06:52 damned kernel: cdc_acm 2-3:1.3: ttyACM1: USB ACM device
Feb 10 10:06:52 damned kernel: usbcore: registered new driver cdc_acm
Feb 10 10:06:52 damned kernel: drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters
Отсюда видно, что у меня появилось два новых устройства: /dev/ttyACM0 и /dev/ttyACM1. Дальше всё просто:
Создаём файлы настройки pppd(обязательно должен быть установлен пакет ppp).

# cat /etc/ppp/chap-secrets
mts * mts
# cat /etc/ppp/pap-secrets
mts * mts
# cat /etc/ppp/options | grep -v "#"
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
# cat /etc/ppp/peers/mts | grep -v "#"
user "mts"
connect "/usr/sbin/chat -v -f /etc/chatscripts/mts"
/dev/ttyACM0
noipdefault
usepeerdns
defaultroute
persist
noauth
# cat /etc/ppp/chat/mts
ABORT BUSY
ABORT 'NO CARRIER'
""
ATZ OK
AT+CGDCONT=1,"IP","internet.mts.ru" OK
ATDT*99***1#
CONNECT ""

Как видно, я использую mts. Основные параметры, типа номера дозвона, точки доступа, логина, пароля и т.д., можно узнать у мобильного оператора, так что с этим проблем быть не должно. Что касается того, что у меня продублированы логин с паролем и в chap, и в pap - это потому, что я так и не узнал, какой именно тип авторизации надо использовать, и для верности прописал оба. Хуже не будет. Ну и самое главное - это устройство модема, которое я узнал из messages.
В принципе, всё.
Подключение идёт командой pppd call mts. Я для удобства сделал скриптик:

#!/bin/bash
sudo /usr/sbin/pppd call mts

и добавил пользователя в /etc/sudoers, чтобы не логиниться под рутом каждый раз для выхода в инет.
Скорость, конечно, оставляет желать лучшего, но жить можно.
Но постоянно включать/выключать телефон со временем надоедат. Да и ко всему прочему денег много уходит, если пользоваться таким интернетом постоянно, а подключенный мной тариф "Ночной безлимитный" неудобен тем, что работать приходится только ночью. Поэтому было решено купить GPRS-модем.

Путь второй. ZTE MF626 USB Modem.

Тут всё чуть сложнее. Дело в том, что эта замечательная железка, сразу не определилась. В голове промелькнули мысли о пересборке ядра, но как всегда, гугл спас. Довольно быстро нашлась ссылка: http://ru.gentoo-wiki.com/wiki/MF626.
Беглый просмотр не обрадовал. Однако, после прочтения треда, из которого появилась эта статья, стало немного проще.
Сперва, запускаю, как обычно tail -f /var/log/messages и подключаю модем. Как и предсказано в статье, он определяется, как ZeroCD:
Feb 10 09:17:40 damned kernel: usb 1-1: new high speed USB device using ehci_hcd and address 5
Feb 10 09:17:40 damned kernel: usb 1-1: configuration #1 chosen from 1 choice
Feb 10 09:17:40 damned kernel: scsi6 : SCSI emulation for USB Mass Storage devices
Feb 10 09:17:45 damned kernel: Vendor: ZTE Model: USB SCSI CD-ROM Rev: 2.31
Feb 10 09:17:45 damned kernel: Type: CD-ROM ANSI SCSI revision: 00
Feb 10 09:17:45 damned kernel: sr1: scsi3-mmc drive: 0x/52x cd/rw xa/form2 cdda tray
Feb 10 09:17:45 damned kernel: sr 6:0:0:0: Attached scsi generic sg2 type 5

Если тут же заглянуть в dmesg, видно, что в устройствах он называется /dev/sr1 (на других машинах может быть иначе). Пробую eject /dev/sr1.
В messages вижу следующее:
Feb 10 09:19:57 damned kernel: usb 1-1: USB disconnect, address 5
Feb 10 09:20:02 damned kernel: usb 1-1: new high speed USB device using ehci_hcd and address 6
Feb 10 09:20:02 damned kernel: usb 1-1: configuration #1 chosen from 1 choice
Feb 10 09:20:02 damned kernel: scsi7 : SCSI emulation for USB Mass Storage devices
Feb 10 09:20:07 damned kernel: Vendor: ZTE Model: MMC Storage Rev: 2.31
Feb 10 09:20:07 damned kernel: Type: Direct-Access ANSI SCSI revision: 02
Feb 10 09:20:07 damned kernel: sd 7:0:0:0: Attached scsi removable disk sdb
Feb 10 09:20:07 damned kernel: sd 7:0:0:0: Attached scsi generic sg2 type 0

Т.е. выходит, что всё определилось без пересборки ядра или изменений внутренних настроек модема, предложенных в статье. В очередной раз говорю про себя "спасибо" разработчикам debian(а меня только недавно на gentoo сманивали).
Смотрим, как именно определилось с помощью cat /proc/bus/usb/devices

T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=19d2 ProdID=0031 Rev= 0.00
S: Manufacturer=ZTE, Incorporated
S: Product=ZTE CDMA Technologies MSM
S: SerialNumber=1234567890ABCDEF
C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I: If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I: If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=2ms
E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms

Устройство мы видим, но драйвер ещё не подгружен.
Подгружаю: modprobe usbserial vendor=0x19d2 product=0x031
Параметры vendor и product указаны в выводе предыдущей команды. В принципе, для данного модема они есть и в статье с гентушной вики.
В messages видно, что устройства создались:
Feb 10 09:43:00 damned kernel: usbcore: registered new driver usbserial
Feb 10 09:43:00 damned kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.0: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB0
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.1: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB1
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.3: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB2
Feb 10 09:43:00 damned kernel: usbcore: registered new driver usbserial_generic
Feb 10 09:43:00 damned kernel: drivers/usb/serial/usb-serial.c: USB Serial Driver core

Отлично. В статье(и особенно в исходном треде) много говорилось про сложности работы с этими устройствами, однако для меня оказалось важным только одно: для основной работы используется именно третий интерйес, т.е. /dev/ttyUSB2.
Поэтому в настройках pppd создаю такой файл:
# cat /etc/ppp/peers/mts_modem | grep -v "#"
user "mts"
connect "/usr/sbin/chat -v -f /etc/chatscripts/mts"
/dev/ttyUSB2
noipdefault
usepeerdns
defaultroute
persist
noauth

Все остальные настройки совершенно такие же, как и при подключении через телефон.
Всё. Готово. Теперь, скомандовав pppd call mts_modem, я оказываюсь в интернете. Никаких проблем с разрывами соединения, описанных в статье, у меня не было. Поэтому и окончательное доведение до ума вышло проще. Достаточно ограничиться созданием правил в udev(обращаю внимание, что правила немного отличаются от приведённых в статье):
# cat /etc/udev/rules.d/z80_usb_modem.rules

SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", RUN+="/usr/bin/eject /dev/sr1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x031"

И изменении в скрипте для запуска инета mts на mts_modem.
Система: Debian GNU/Linux Etch 4.0r6
# uname -a
Linux damned 2.6.18-6-k7 #1 SMP Fri Dec 12 17:19:09 UTC 2008 i686 GNU/Linux

Дополнение.
Так как модем остаётся подключённым к системе постоянно, нет надобности стартовать соединение вручную, поэтому я решил написать небольшой скрипт:
# cat /etc/init.d/gprs_inet.sh
#! /bin/sh

PATH=/sbin:/bin

start () {
echo "Starting GPRS Internet Connection..."
/usr/bin/eject /dev/sr1 2>/dev/null
# Задержка нужна, потому как между отключением ZeroCD и стартом
# собственно модема, проходит время.
/bin/sleep 10
/usr/sbin/pppd call mts_modem
echo "GPRS Connection Established."
}

stop () {
echo "Stoping GPRS Connection..."
/usr/bin/killall pppd 2>/dev/null
echo "GPRS Connection is stopped."
}

case "$1" in
start)
start
;;
restart)
stop
start
;;
stop)
stop
;;
*)
echo "Usage: gprs_inet.sh [start|restart|stop]" >&2
exit 0
;;
esac


Этот скрипт сохраняется в /etc/init.d/ и добавляется в загрузку/останов с помощью команды update-rc.d gprs_inet.sh defaults