天天看点

【硬创邦】跟hoowa学做智能路由(六):系统基础配置

  在这一章当中,我们将介绍在openwrt系统下的编辑和配置的基础指令和操作知识,因为后续的章节主要用于介绍如何配置路由的相关功能,在配置的操作时我们需要掌握编辑和处理的方法。 本章中,编辑和配置的基础方法我们分为三种,三种方式都可以操作成功。分别为:

使用vi编辑器: 适合教学时直接修改配置文件。

使用uci进行编辑: 适合教学时使用,更适合用于自己开发的第三方程序修改配置文件。

使用scp下载到本地编辑: 适合教学和系统的测试,文件通过scp工具下载到本地修改,完成后再上传到服务器上(要注意使用notepad++或editplus或ue这类支持unix格式文本文件编辑器)

vi(visual interface)是linux上最通用的标准编辑器,几乎99.99%的linux发行版中都包含它。vi可以在不需要图形界面的情况下实现对文件的查看、修改、删除、查找、替换等众多功能。vi的操作,适用于通过串口直接修改文件,以及通过ssh远程登入系统修改文件。 在openwrt中,系统允许通过vi编辑器直接修改uci配置文件,从而实现对系统的配置。

在本节我们就简单的介绍下vi的基本操作方法。

vi指令语法: vi [文件名]

如果指定的文件名不存在,将会在内存中自动创建一个空文件,等待保存时保存到磁盘上。如果文件名存在则将打开该文件。vi在打开文件后有两种工作模式:

vi指令模式: 在这个模式下,不能对文件做修改,指令输入内容在屏幕的左下方显示。

vi编辑模式: 在编辑模式下,可以对文件内容进行修改,删减,或增加。在openwrt的系统下,我们可以输入键盘上的主键盘区内容,也可以使用上下左右箭头按键调整位置。

两种模式切换: 在指令模式下,按键盘上的字母"i"既进入编辑模式(insert方式),这个时候可对文件进行修改编辑。在编辑模式下按键盘的esc键,即可返回指令模式,可以输入指令。 vi支持的指令列表,所有指令都要输入":"作为指令开头,以回车作为指令结束:

退出vi编辑器指令,放弃对文件的修改: :q! 退出vi编辑器: :q 保存当前内容: :w 保存退出: :wq 强制保存退出: :wq! 搜索字符: :/[字符内容]

操作举例:

<a href="http://static.leiphone.com/uploads/2014/05/195.jpg"></a>

键盘输入 i 进入编辑模式,然后可以随便输入一些字符(这时已经可以写文字了)

<a href="http://static.leiphone.com/uploads/2014/05/338.jpg"></a>

保存退出:进入指令模式,输入保存退出指令:wq 该文件即保存。再次使用vi /tmp/test打开文件即可看到文件保存内容。

众所周知,在linux下各种软件包有各种不同的配置脚本,每个配置脚本的语法格式和操作方式不同,这样的设计虽然可以体现出各软件包自身的优势,同时也增加了智能路由产品开发的难度。在这一点上openwrt下的uci技术无疑是一种创新。

uci是(unified configuration interface)集中式配置信息管理接口的缩写,他是openwrt引进的一套配置参数管理机制。uci管理了openwrt下最主要的系统配置,并且提供了简单,容易,标准化的人机交互接口。uci的管理包含了网络配置,无线配置,系统信息配置等作为路由器的系统主要配置参数。uci可以帮助开发人员快速的开发出基于openwrt的智能路由产品的控制界面(诸如浏览器界面,手机界面等)。

在openwrt下有大量的软件包的配置实用了uci兼容模式。大量的应用程序其实都有他们自己的配置文件,比如samba的配置文件默认是/etc/samba/samba.conf,但是在openwrt下samba软件包使用的配置方式也是uci。当执行/etc/init.d/samba start的时候,启动脚本将通过uci的shell解码器分析/etc/config/samba配置文件,并且生成需要的/etc/samba/samba.conf配置,来完成配置。

openwrt下服务软件加载流程(samba举例):

启动脚本---&gt;/etc/config/samba(uci解码器)---&gt;/etc/samba/samba.conf---&gt;启动samba服务

openwrt下配置处理流程(samba举例):

uci命令---&gt;uci编解码器---&gt;/etc/config/samba

由于uci配置文件非常适合人机交互,因此如果你是需要人工修改配置,也可以简单的使用常见的vi编辑器直接修改配置:

vi /etc/config/samba

默认的openwrt系统拥有以下几个配置文件,随着软件包的增加系统配置文件数量也会增加:

dhcp 路由器的dhcp服务,面向lan口下计算机提供ip地址分配服务 dropbear ssh服务 firewall 路由转发,端口转发,防火墙规则 fstab 外部存储器配置 network wan / lan 网络配置 system 时间服务器时区配置 wireless 无线网络配置

uci默认情况下只处理/etc/config中的配置文件,通过参数指定也可以让它来处理其它位置的配置文件。uci的配置文件同xml不同(xml的设计更适应机器读取),而uci配置文件的设计对于人读取非常友好。所以即使你手工修改这些配置也是没有任何问题的。

uci文件内容格式举例:

config 'example' 'test' option 'string' 'some value' option 'boolean' '1' list 'collection' 'first item' list 'collection' 'second item'

从config开始一直到下一个config出现中间的内容表示一个段配置(以下均用section表达),其作用类似编程语言中的{}作用,是表示一个区域数据。

section开始语法: config '类型' '名字'

其中上面例子的example就是这个配置的类型,而test就是这个配置的名字。uci允许"匿名"的配置存在所以可能存在只有"类型"而没有"名字"的配置。

参数定义语法: option '键' '值'

option表示当前的配置中的键/值定义语法。上面例子定义了一个键为'string',值为'some value'的配置参数。

列表定义语法: list '集合名字' '值'

list表示一种集合参数,uci会根据相同集合名字生成一个数组(以上例子数据中包含'first item'和'second item'两个值)给予相应的软件包使用。 uci允许的参数格式:

option example value option 'example' value option example "value" option "example" 'value' option 'example' "value"

当遇到上面错误的时候,uci还是可以很好的工作,但是如果遇到下面的格式,uci将出现问题:

option 'example" "value' option example some value with space

还有一点非常重要:尽量使用常规字符去处理器uci,特殊字符(acsii标准之外)有可能会破坏数据结构的完整性。

uci文件的读写有两种方式:

uci文件的读写可以通过openwrt附带的uci指令来完成,这种读写方式可以用于命令行也可以用于自己开发的web程序来操作。

直接使用系统的vi编辑器直接修改uci文件,所做的修改也可以被系统所识别。

语法格式: uci [&lt;options&gt;] &lt;command&gt; [&lt;arguments&gt;] 查看类语法:

uci get &lt;config&gt;.&lt;section&gt;[.&lt;option&gt;] 取得一个键的值 或根据段的名字取得类型 uci show [&lt;config&gt;[.&lt;section&gt;[.&lt;option&gt;]]] 显示出全部 / 配置文件 / 段 / 键 的完整格式 uci changes [&lt;config&gt;] 显示出全部 / 配置文件 的未保存修改(经过commit语法保存后就不再有记录)

变更类语法:

uci add &lt;config&gt; &lt;section-type&gt; 增加一个匿名段配置到配置文件中 uci set &lt;config&gt;.&lt;section&gt;[.&lt;option&gt;]=&lt;value&gt; (增加/修改)一个有名字的段 / 增加一个段中的键和值 uci add_list &lt;config&gt;.&lt;section&gt;.&lt;option&gt;=&lt;string&gt; 增加一个列表集合数据到配置文件中 uci del_list &lt;config&gt;.&lt;section&gt;.&lt;option&gt;=&lt;string&gt; 删除一个指定值的列表集合数据 uci delete &lt;config&gt;[.&lt;section&gt;[[.&lt;option&gt;][=&lt;id&gt;]]] 删除一个 段 / 键 / 指定值的键 uci commit [&lt;config&gt;] 将变更保存在文件中,或保存全部变更到各自文件

uci在读取的时候优先显示内存中的缓存,其次显示文件中的。uci在进行变更的时候只变更内存的,如果要使变更生效需要执行commit将其写入文件。 来举个例子。首先产生一个用来做测试的样本测试:

root@openwrt:~# cp /etc/config/system /etc/config/mytest

查看当前状态:

<a href="http://static.leiphone.com/uploads/2014/05/433.jpg"></a>

取出mytest.ntp.server的值:

<a href="http://static.leiphone.com/uploads/2014/05/518.jpg"></a>

增加一个名为mytest类型为hello的段到mytest文件中:

root@openwrt:~# uci set mytest.mytest=hello

增加一个配置到这个段中:

root@openwrt:~# uci set mytest.mytest.enable=1

修改mytest.@system[0].hostname这个参数:

root@openwrt:~# uci set mytest.@system[0].hostname=hoowa

删除掉一个ntp.server的值:

root@openwrt:~# uci del_list mytest.ntp.server=2.openwrt.pool.ntp.org

查看都修改了啥:

<a href="http://static.leiphone.com/uploads/2014/05/614.jpg"></a>

保存修改:

root@openwrt:~# uci commit mytest

看看文件有啥变化:

<a href="http://static.leiphone.com/uploads/2014/05/77.jpg"></a>

举例,开启wifi功能:

root@openwrt:/# uci set wireless.radio0.disabled=0 root@openwrt:/# uci commit wireless

让wifi开启生效:

root@openwrt:/# wifi

scp(secure copy)是openwrt中的ssh附带的文件传输功能,scp在操作上类似ftp可以实现一个安全的数据文件传输。

scp适用于调试阶段的程序文件上下载,从而进行快速测试,这是个非常不错的工具。

在默认的情况下由于没有密码,所以ssh无法登入。首先修改系统超级账户密码,在提示中填写两次新密码:

root@openwrt:/# passwd

完成后重启ssh的服务:

root@openwrt:/# /etc/init.d/dropbear restart

大家可以使用一个winscp的工具实现这个操作。winscp工具已经放在了教学服务器上,下载地址为http://182.92.3.46/hoowa/openwrt/tools/winscp439setup.zip。安装这个工具软件,然后让你的电脑连接到开发板的wifi上(在上边案例中,你已经开启过wifi了,对吗?),同时打开软件。

<a href="http://static.leiphone.com/uploads/2014/05/85.jpg"></a>

主机名填写ip地址,默认的开发板是192.168.1.1 端口填写22 用户名填写root 密码就填写刚才设置的那个密码 文件协议选择scp

点击连接, 连接过程中有提示找不到group指令,没关系直接确认就行了。

登入后,操作起来就像ftp工具一样,左侧是你的电脑,右侧是开发板系统,你可以上载下载文件。

<a href="http://static.leiphone.com/uploads/2014/05/99.jpg"></a>

在本章,我们介绍了三种进行配置编辑的方法,请选择其中一种最为你进行后续操作所使用的方式即可。其他的用到了再回来学习也可以的。

到这里,我们在硬件部分的第一次操作基本完成,接下来将进入软件环节,来学习如何配置出一个具备完整功能的路由系统来。

最后,大家现在可以开始提问,在雷锋网(公众号:雷锋网)文章评论、公众号「宅客」:letshome、qq群:196302618、邮箱:diyrouter#163.com都可以提交,问题我将会在下章的时候统一解答。需要提醒下,我并不是高手,我回答问题有三个原则:1、我会的我直接回答 2、我不太会的我看着回答 3、我不会的我瞎忽悠 所以我给的答案是否正确需要大家自行判断。

继续阅读