linux下的modem撥接
在寬頻接入還沒有走進千家萬戶之時,我們要連上互連網,還是要驅“貓”,所以對於許多網民而言,Modem是一個十分可愛的東西。Windows對Modem提供了很好的支援,使得安裝Modem十分簡單。但是在Linux下安裝這個可愛的東西時,卻並不是那麼好辦呀。
一、 認清Modem
我們都知道,電腦處理的是數字資訊,而電話線路則是類比資訊,而Modem就是用來做數字資訊和類比資訊之間的轉換的。
當電腦要將資訊傳出來時,Modem將其調製成為類比訊號,然後通過電話線傳送出去。
而當資訊通過電話線傳送到電腦時,Modem將其從類比訊號解調成數字資訊,這樣就能夠傳給電腦,讓電腦識別。
從這裡大家就應該不難理解它的學名:“數據機”了。
Modem可謂是五花八門,下面我們一起來理清這些“類型”:
1. 按照Modem的速率進行分類:
也就是Modem調製的速度,我們使用單位bps來衡量。Bps的全稱是Bit per second,也就是表示每秒多少位。
最早是2400bps,後來發展到9600bps、14.4Kbps、28.8Kbps、33.6Kbps、56Kbps。
大家是否記得,通常我們使用一個33.6Kbps的Modem下載時,每秒鐘的傳輸速度最大也就4K左右,可能大家對這個速度會有一些疑惑。其實這個問題很簡單,這個4K代表的是4K Byte,而33.6Kbps則是33.6K Bit,1Byte=8Bit。
2. 按照外形進行分類:
1) 外置式Modem,也稱外貓
這種Modem的外形是一個小盒子,它通過串口與電腦相連。
2) 內建式Modem,也稱內貓
這種Modem的外形則是與顯卡、音效卡、網卡相似,是通過插在電腦主板的ISA插槽或PCI插槽中使用的。
3. 按照實現原理來分:
1) 硬貓:顧名思義,使用硬體電路實現的MODEM;
2) 軟貓:隨著CPU速度的提高,使用軟體將CPU類比成為MODEM的DSP。使用這種MODEM,就需要軟體的支援。Windows中提供了這種軟體支援,因此,軟貓又常被稱為Win貓,這種MODEM的特點是便宜但佔用資源厲害。筆者認為,硬貓價格已經很低,使用這種軟貓沒有什麼意義。
二、 Linux對Modem的支援
首先,我們一起來看一下Linux對於MODEM的支援情況:
1. Linux對軟貓支援有限,我的建議是你別買軟貓這種東西。如果你真的需要驅動這種軟貓,參見本篇的第八部分:驅動軟貓。
2. 對於外置式MODEM而言,可謂是配置最簡單的裝置,只需插入某個串列口,再對這個串列口進行相應的配置就可以使用了。
3. 對於內建式MODEM而言,也是通過串列口來進行使用的,但有些內建式MODEM並不能被Linux所認識(畢竟是插在主板上的,是一種虛擬方式來使用串列口的),我們將在第七部分:驅動內貓中說明。
4. 在Linux中,MODEM的速率並不影響Linux的支援。
總而言之一句話:在Linux中使用MODEM,都是通過序列埠來進行的。只要系統能夠找到這個序列埠,就可以通過序列埠來通訊。因此,驅動MODEM的思路就是:
1) 對於外置式MODEM與能夠被Linux系統識別的內建式MODEM,只需直接使用序列埠對其操作就行了;
2) 對於那些Linux不能夠識別的內建式MODEM,我們先得想辦法讓它被Linux系統識別,然後才能夠使用第1種方式來操作。
三、 Linux下的串列口
在Linux下,所有的裝置都表現成為一個檔案形式,對裝置的操作也就與對檔案的操作一樣了。這些所有代表裝置的檔案都存放在“/dev”目錄下。
序列埠也不例外,不過有些特別的是,每個序列埠對應的不僅是一個檔案,而是兩個。其中一個是用於拔入,而另一個則用於拔出。
1) 用來拔出的的裝置檔案名稱是ttySx,其中最後一個x是個數字,從0開始編號,與DOS串列口名的對應關係是:
DOS下的名稱 Linux下的名稱
COM1 /dev/ttyS0
COM2 /dev/ttyS1
COM3 /dev/ttyS2
COM4 /dev/ttyS3
…… ……
2) 而用來拔入的裝置檔案則是caux,其中最後一個x也是個數字,也是從0開始編號,與DOS串列口名的對應關係是:
DOS下的名稱 Linux下的名稱
COM1 /dev/cau0
COM2 /dev/cau1
COM3 /dev/cau2
COM4 /dev/cau3
…… ……
不過現在許多Linux發行版本似乎已經不對拔入、拔出加以區分了,都統一使用ttySx命名了。如果在你的系統的/dev目錄中找不到ttySx的話,則需要自己手動建立,如:
# cd /dev
# ./MAKEDEV ttyS0
每個序列埠都均需使用IRQ與I/O地址資源在,一般來說COM1和COM3共用IRQ3,而COM2和COM4共用IRQ4(如下表所示):
序列埠 IRQ I/O地址
/dev/cau0、/dev/ttys0 4 0x3f8
/dev/cau1、/dev/ttys1 3 0x2f8
/dev/cau2、/dev/ttys2 4 0x3e8
/dev/cau3、/dev/ttys3 3 0x2e8
通常,在Linux系統中,每一個裝置都需有一個唯一的IRQ號,也就是說如果有三個串列裝置的話,就必須把閒置IRQ中斷拿過來用了。例如:
/sbin/setserial /dev/ttyS0 irq 3 (COM1口上接著滑鼠,中斷號為3)
/sbin/setserial /dev/ttyS1 irq 4 (COM2口上接著一個MODEM,中斷號為4)
/sbin/setserial /dev/ttyS2 irq 5 (COM3口上還有一個MODEM,而IRQ3已經佔用,因此只得使用閒置IRQ5)
我們只需將這些命令放在/etc/rc.d/rc.local檔案中,這樣就可以保證每次啟動Linux時就完成設定。
我們可以使用兩個簡單的命令來查看一下是否存在IRQ和I/O地址的衝突:
cat /proc/interrupts 查看IRQ中斷號
cat /proc/ioports 查看I/O地址
四、 使用MODEM拔號上網
通常,我們是通過MODEM拔打ISP提供的拔號服務電話號碼,從而連入Internet的,在Linux系統中,整個過程為:
1.準備好相應的軟體
做為拔號上網的用戶端所需的程式有chat和pppd,如果你的機器上還沒有這兩個程式,就要安裝它們,它們包含在ppp軟體包中(如ppp-2.3.7-2.i386.rpm)。
chat程式的用途是撥號並等待提示,根據提示輸入使用者名稱和密碼等登入資訊。而pppd的用途則是建立並維持與伺服器的ppp串連,傳輸資料。
另外,為了測試方便,我們還需要一個名為minicom的軟體。不過通常這些軟體都已經會在安裝Linux系統時安裝了。
2.使用minicom測試拔號
我們可以通過minicom軟體來測試MODEM是否工作正常。
1) 首先以root身份登入系統,然後運行命令:minicom -s。這將會啟動一個文本對話方塊的配置介面。在這個配置介面中,我們可以使用上、下方向鍵在菜單中選擇,用Enter鍵選中命令。
2) 測試數據機的關鍵在於設定序列埠。我們在此選擇Serial prot setup,進入序列埠配置菜單。如果對這裡的項目需要修改,只需按相應的字母鍵就可以了。
3) 首先我們應設定串列裝置(選擇A Serial Device)。這時,要將這個位置變為相應的裝置檔案,例如,如果數據機串連在第2個串口上.則要將其設定為/dev/ttys1,因為Minicom用於輸出串連。不過,由於Minicom預設是使用/dev/modem來標識MODEM的,因此,你可在此之前執行命令:ln /dev/ttys1 /dev/modem。這樣會省去不少麻煩。
4) 然後我們根據所串連的系統要求裝置MODEM參數(選擇E Bps/Par/Bits),在這裡需要設定的包括速率(Bps)、同位位元(Par)、資料位元和停止位(Bits)。其中速率裝置為MODEM的最高連線速度,通常可以是MODEM速度的4倍。例如,對於1.44kbPs的數據機,應選擇57.6kbps.對於28.8kbps的數據機.應選擇115.2kbps。而對於資料位元的設定,通常是無奇偶位、8個資料位元和1個停止位。例如:38400 8N1。
5) 完成之後.按Enter鍵鍵返回serial port setup菜單、再接Enter鍵,返回主菜單。有了這些資訊,就可以測試數據機了。選擇Save setup as df1將配置儲存為預設配置.然後選Exit退出安裝介面。
6) 開啟Minicom程式,如果出現Ok提示,則數據機設定正確可以開始正常工作。
7) 可以輸入'AT'並按Enter鍵進行測試。這時,回到OK資訊。如果一切順利,則可以開始撥號。看看是否正常進接.輸入"ATD163"。此時,應該聽到串連的聲音,然後看到串連資訊和遠程系統的資訊提示:
ATD163
CONNECT 115200
這時,就說明你的MODEM已經可以使用了。
8)最後按CTRL+A,Q退出Minicom。
3.設定DNS網域名稱解析
在Linux中,要設定DNS網域名稱需要編輯設定檔/etc/resolv.conf,在最後加入一行:
nameserver xxx.xxx.xxx.xxx (如:nameserver 202.101.103.55)
其中IP地址是ISP提供的網域名稱伺服器的IP地址。
4.手動拔號上網
下面,我們就在命令列上手動完成拔號上網工作:
1) 首先,運行minicom,然後輸入Ctrl-A,再敲D, 將會出現一個拔號介面,此時選擇manual(手動),並輸入ISP的電話號碼,數據機一陣亂響之後,會有幾聲音樂響,並在螢幕上提示按任意鍵繼續。
2) 接著,螢幕上就會出現你ISP的資訊,根據提示輸入你的username和password,(有可能還會要求你選擇ppp串連還是slip串連等)如果成功的話,就會出現一些垃圾字元。
3)這時,輸入CTRL+A再按Q,退出minicom。
注意,不是按X,那樣就會斷開這次拔號
4) 接著,我們使用pppd建立ppp串連,也就是執行命令:
pppd debug lock modem crtscts defaultroute /dev/ttyS1 115200&
命令說明:
deubg 使其在/var/log/messages中記錄下相關調試資訊;
lock 鎖定串列口裝置
modem 說明使用MODEM的控制訊號
crtscts 說明使用硬體資料流控制
defaultroute 在本機路由表中加入一項預設路由
/dev/ttyS1 指出Modme所在連接埠
115200 說明串列口的速率
& 表示使其在後台運行。
一會兒之後,ppp串連就會建立,這時你可以試一試:
a. 運行ifconfig,你將看到ppp0的網路介面,這個介面的IP地址就是對端伺服器給你分配的IP地址;
b.運行route,你會發現對端伺服器的IP地址被加入路由表了;
c.ping一下遠方的主機,應該能夠連通。
你還可以在另一個虛擬控制台上運行:
tail -f /var/log/messages
這時,你可以觀察到動態pppd日誌資訊。
4) 如果要斷開這次串連的話,只需執行命令:
killall pppd
5.通過指令碼程式自動拔號上網
安裝了ppp軟體包後,會產生/etc/ppp和/usr/doc/ppp-x.x.x(其中x.x.x是版本號碼)兩個目錄,pppd的設定檔都存放在/etc/ppp目錄中,而/usr/doc/ppp-x.x.x則存放著pppd的相關文檔,在這個目錄下有一個名為scripts的子目錄,這個目錄中有幾個有用的檔案:
 ppp-on-dialer:一個負責拔打電話,並輸入所需登入資訊的指令碼程式(實現了當時我們通過minicom完成的工作);
 ppp-on:負責啟動原生pppd,與伺服器端的pppd進行對話,實現端對端串連;
 ppp-off:負責中斷連線的一個指令碼。
下面,我們就使用它們來簡化我們的拔號上網工作:
1) 首先,將它們複製一份到/etc/ppp目錄中;
2) 編輯ppp-on檔案,將以下幾部分根據你的實際情況修改:
TELEPHONE=8163
ACCOUNT=8163
PASSWORD=8163
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS0 38400
註:這些內容在ppp-on檔案中都是有的,不是新增,而是修改它的值。
3) 修改ppp-on-dialer檔案,將以下幾部分根據你的ISP的實際情況做相應的修改:
username: $ACCOUNT
assword: $PASSWORD
" select(1~3):" 1
註:“:”左邊的內容都是拔號時會問你的,右邊的都是相應的回答。這些內容在我們當時使用minicom做測試拔號時就會看到了。
4) 為三個指令碼賦予可執行許可權,也就是執行命令:
chmod +x ppp-on ppp-on-dialer ppp-off
5) 到此,我們就可以執行/etc/ppp-on完成拔號上網,執行/etc/ppp-off斷開網路連接了。
五、 使用kppp軟體完成拔號上網
對於習慣使用了圖形化介面的Windows使用者而言,這些晦澀的命令列操作,會嚇走一大堆人的,別急,現在我們就介紹一種圖形化的拔號上網軟體kppp,只要你安裝了KDE,就可以使用這個軟體。使用它拔號上網很簡單:
1) 運行Kppp:如下圖所示,先點擊“K”按鈕,選擇Internet,然後選擇Kppp:
2) 單擊Kppp面板上的Setup按鈕,將出現如下圖的介面:
首先,我們單擊“New…”按鈕,進行Accounts的設定;
3) 接著,我們選擇“Device”進行相應的設定:
4) 設定完成後,按OK按鈕退出,返回Kppp主畫面:
5) 填入Login ID和Password,再按Connect按鈕,就可以開始拔號了,拔號成功了,會在任務條上出現一個MODEM似的小表徵圖,就像Windows中的網路連接示意表徵圖一樣。開始衝浪吧。
六、 驅動內貓
對於大多數內貓而言,Linux系統能夠自己識別到,那隻需用前面的方法使用它就行了。而如果你的Linux無法識別它的話,就需要讓Linux系統識別到它。通常我們可以採用兩種方法:
1、 對於一些隨插即用裝置而言,我們可以使用isapnptools工具解決這一問題:
1) 首先以root使用者登陸,然後運行命令/sbin/pnpdump > /etc/isapnp.conf,將你機器上所有的隨插即用裝置資訊寫入檔案/etc/isapnp.conf中。
2) 接下來需要為該裝置分配IRQ與I/O資源:
a.根據該裝置在Windows中查看其所佔資源,當然這要你在本機上裝有Windows;
b.或者自已動手為其分配資源,只要不衝突就行了。(已指派的資源可以從/proc/interrupts、/proc/ioports、/proc/dma查到)
3) 然後從isapnp.conf中找到你要驅動的裝置,然後去掉它們前面的注釋號“#”,將填入它們的INT(IRQ號)、IO(IO地址)及DMA等。
4) 設定完成後,我們就可以執行以下命令驅動該裝置:
/sbin/isapnp /etc/isapnp.conf
5)如果該命令沒有出錯的話,就會在螢幕上列印出相關的硬體資訊,你只需將該句命令寫入/etc/rc.d/rc.local就可以使得每次啟動Linux時,都自動驅動該裝置。
2、 如果你能夠找到該款內貓的驅動程式的話,那也可以採用安裝驅動程式的方法。採用這種方法,大致的步驟如下:
1) 下載驅動程式套件;
2) 解壓驅動程式套件,然後運行make,完成編譯;
3) 使用insmod將驅動程式模組加入核心;
4) 然後在/dev目錄下建立一個裝置,命令如下:
cd /dev
mknod 驅程模組名 c 127 1
5) 然後建立一個名為modem的符號連結,使其指向剛剛建立的裝置;
6) 這樣,我們就可以使用前面的方法來操作MODEM了。
由於對於不同的MODEM,驅動程式不同,因此無法一一細解,只能是將安裝的思路整理出來,供大家參考。
七、 驅動軟貓
由於軟貓的生產廠商不願公開軟貓的技術,也不願意開發Win9x/NT以外的驅動程式。因此Linux對其的支援就十分有限。
如果你的MODEM封裝盒上注有"HCF" , "WinMODEM" 或 "soft MODEM" 字樣的話,就很可能是軟貓。如果你想在Linux下使用它,那一定要去www.linmodems.org看一看。該網站中有一些軟貓的驅動程式,目前已有支援Cirrus Logic(CL-MD5620DT)、 Conexant (Rockwell) HSF、ESS ES56T-PI、MODEMs (PCI)、 Lucent LT WinMODEM、 Pc Tel等晶片的軟貓驅動程式。
下面我就以CL-MD5620DT為例(其他品牌類似),說明一下軟貓的驅動方法,希望對軟貓使用者有一些指導和參照。
1. 從www.linmodems.org中下載其驅動程式clmodem-0.3.0+gg.tar;
2. 執行以下命令,解開這個tar包:
# tar - xvf CLMODEM-0.3.0+gg.tar
3. 由於該驅動程式不支援PnP(隨插即用),因此需要手工配置IRQ與I/O地址,我們可以通過執行cat /proc/pci |more命令來擷取其IRQ與I/O資源佔用情況。從該命令的輸出中你可以看到類似下面的一段資訊:
Bus 0, device 13, function 0:
Communication controller: Cirrus Logic Unknown device (rev 1).
Vendor id=1013. Device id=4000.
Medium devsel. IRQ 10.
Non-prefetchable 32 bit memory at 0xebffe000 [0xebffe000].
I/O at 0xe 000 [0xe001].
從中,我們可以得知,其資源佔用情況:IRQ=10;I/O地址=0xe0000。
4. 然後我們修改驅動程式中的clm_config.h檔案,將其前兩行根據其輸出修改:
#define CLM_BASE_IO_ADDRESS 0xe000
#define CLM_IRQ 10
5. 然後在驅動程式目錄中執行make命令,編譯驅動程式;
6. 接著使用insmod命令將該模組裝載入核心:
/sbin/insmod clm.o
若要每次啟動Linux時自動載入該模組,可將該句加入/etc/rc.d/rc.modules檔案。
7. 使用mknod命令建立裝置:
mknod /dev/clm c 121 0
8. 最後,將/dev/modem連結為/dev/clm:
ln /dev/modem /dev/clm
好了,Linux已經可以識別你的軟貓了,你就可以前面的方法拔號上網了。