- 使用VI编辑器: 适合教学时直接修改配置文件。
- 使用UCI进行编辑: 适合教学时使用,更适合用于自己开发的第三方程序修改配置文件。
- 使用SCP下载到本地编辑: 适合教学和系统的测试,文件通过SCP工具下载到本地修改,完成后再上传到服务器上(要注意使用Notepad++或editplus或ue这类支持unix格式文本文件编辑器)
VI编辑器介绍
vi(Visual Interface)是Linux上最通用的标准编辑器,几乎99.99%的Linux发行版中都包含它。vi可以在不需要图形界面的情况下实现对文件的查看、修改、删除、查找、替换等众多功能。vi的操作,适用于通过串口直接修改文件,以及通过ssh远程登入系统修改文件。 在OpenWRT中,系统允许通过vi编辑器直接修改UCI配置文件,从而实现对系统的配置。
VI的操作方法
在本节我们就简单的介绍下VI的基本操作方法。
vi指令语法: vi [文件名]
如果指定的文件名不存在,将会在内存中自动创建一个空文件,等待保存时保存到磁盘上。如果文件名存在则将打开该文件。vi在打开文件后有两种工作模式:
- vi指令模式: 在这个模式下,不能对文件做修改,指令输入内容在屏幕的左下方显示。
- vi编辑模式: 在编辑模式下,可以对文件内容进行修改,删减,或增加。在OpenWRT的系统下,我们可以输入键盘上的主键盘区内容,也可以使用上下左右箭头按键调整位置。
两种模式切换: 在指令模式下,按键盘上的字母"i"既进入编辑模式(insert方式),这个时候可对文件进行修改编辑。在编辑模式下按键盘的esc键,即可返回指令模式,可以输入指令。 vi支持的指令列表,所有指令都要输入":"作为指令开头,以回车作为指令结束:
退出vi编辑器指令,放弃对文件的修改: :q! 退出vi编辑器: :q 保存当前内容: :w 保存退出: :wq 强制保存退出: :wq! 搜索字符: :/[字符内容]
操作举例:
键盘输入 i 进入编辑模式,然后可以随便输入一些字符(这时已经可以写文字了)
保存退出:进入指令模式,输入保存退出指令:wq 该文件即保存。再次使用vi /tmp/test打开文件即可看到文件保存内容。
认识UCI
众所周知,在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举例):
启动脚本--->/etc/config/samba(UCI解码器)--->/etc/samba/samba.conf--->启动samba服务
OpenWRT下配置处理流程(samba举例):
uci命令--->UCI编解码器--->/etc/config/samba
由于uci配置文件非常适合人机交互,因此如果你是需要人工修改配置,也可以简单的使用常见的vi编辑器直接修改配置:
vi /etc/config/samba
默认的OpenWRT系统拥有以下几个配置文件,随着软件包的增加系统配置文件数量也会增加:
dhcp 路由器的DHCP服务,面向LAN口下计算机提供IP地址分配服务 dropbear SSH服务 firewall 路由转发,端口转发,防火墙规则 fstab 外部存储器配置 network WAN / LAN 网络配置 system 时间服务器时区配置 wireless 无线网络配置
UCI配置文件格式
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文件的读写有两种方式:
- UCI文件的读写可以通过OpenWRT附带的uci指令来完成,这种读写方式可以用于命令行也可以用于自己开发的WEB程序来操作。
- 直接使用系统的vi编辑器直接修改UCI文件,所做的修改也可以被系统所识别。
UCI指令读取配置
语法格式: uci [<options>] <command> [<arguments>] 查看类语法:
uci get <config>.<section>[.<option>] 取得一个键的值 或根据段的名字取得类型
uci show [<config>[.<section>[.<option>]]] 显示出全部 / 配置文件 / 段 / 键 的完整格式
uci changes [<config>] 显示出全部 / 配置文件 的未保存修改(经过commit语法保存后就不再有记录)
变更类语法:
uci add <config> <section-type> 增加一个匿名段配置到配置文件中
uci set <config>.<section>[.<option>]=<value> (增加/修改)一个有名字的段 / 增加一个段中的键和值
uci add_list <config>.<section>.<option>=<string> 增加一个列表集合数据到配置文件中
uci del_list <config>.<section>.<option>=<string> 删除一个指定值的列表集合数据
uci delete <config>[.<section>[[.<option>][=<id>]]] 删除一个 段 / 键 / 指定值的键
uci commit [<config>] 将变更保存在文件中,或保存全部变更到各自文件
UCI在读取的时候优先显示内存中的缓存,其次显示文件中的。UCI在进行变更的时候只变更内存的,如果要使变更生效需要执行commit将其写入文件。 来举个例子。首先产生一个用来做测试的样本测试:
root@OpenWrt:~# cp /etc/config/system /etc/config/mytest
查看当前状态:
取出mytest.ntp.server的值:
增加一个名为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
查看都修改了啥:
保存修改:
root@OpenWrt:~# uci commit mytest
看看文件有啥变化:
举例,开启wifi功能:
root@OpenWrt:/# uci set wireless.radio0.disabled=0
root@OpenWrt:/# uci commit wireless
让wifi开启生效:
root@OpenWrt:/# wifi
使用SCP进行文件传输
SCP(Secure copy)是OpenWRT中的SSH附带的文件传输功能,SCP在操作上类似FTP可以实现一个安全的数据文件传输。
SCP适用于调试阶段的程序文件上下载,从而进行快速测试,这是个非常不错的工具。
第一步:正式开放SSH
在默认的情况下由于没有密码,所以SSH无法登入。首先修改系统超级账户密码,在提示中填写两次新密码:
root@OpenWrt:/# passwd
完成后重启SSH的服务:
root@OpenWrt:/# /etc/init.d/dropbear restart
第二步: 安装WinSCP
大家可以使用一个winscp的工具实现这个操作。winscp工具已经放在了教学服务器上,下载地址为http://182.92.3.46/hoowa/openwrt/tools/winscp439setup.zip。安装这个工具软件,然后让你的电脑连接到开发板的wifi上(在上边案例中,你已经开启过wifi了,对吗?),同时打开软件。
第三步: 点击新建
主机名填写IP地址,默认的开发板是192.168.1.1
端口填写22
用户名填写root
密码就填写刚才设置的那个密码
文件协议选择SCP
点击连接, 连接过程中有提示找不到group指令,没关系直接确认就行了。
第四步:文件处理
登入后,操作起来就像FTP工具一样,左侧是你的电脑,右侧是开发板系统,你可以上载下载文件。
在本章,我们介绍了三种进行配置编辑的方法,请选择其中一种最为你进行后续操作所使用的方式即可。其他的用到了再回来学习也可以的。
到这里,我们在硬件部分的第一次操作基本完成,接下来将进入软件环节,来学习如何配置出一个具备完整功能的路由系统来。
最后,大家现在可以开始提问,在雷锋网(公众号:雷锋网)文章评论、公众号「宅客」:letshome、QQ群:196302618、邮箱:DIYRouter#163.com都可以提交,问题我将会在下章的时候统一解答。需要提醒下,我并不是高手,我回答问题有三个原则:1、我会的我直接回答 2、我不太会的我看着回答 3、我不会的我瞎忽悠 所以我给的答案是否正确需要大家自行判断。