OpenWRT 使用札记
更新日期:
使用 TPLINK TL-WR720N V3 无线路由刷 OpenWRT 固件的学习整理。
基础知识
系统结构
MTD(Memory Technology Devices,内存技术设备)是用于访问内存类设备 (ROM、FLASH) 的 Linux 驱动子系统。它的主要目的使 FLASH 类设备更加容易被访问,为此它在硬件和上层提供了一个抽象的接口,使得在操作系统下我们可以像操作硬盘一样操作这个设备。仔细观察过 Linux 启动信息的朋友会看到这么一段话:
[ 0.690000] 5 tp-link partitions found on MTD device spi0.0
[ 0.700000] Creating 5 MTD partitions on "spi0.0":
[ 0.700000] 0x000000000000-0x000000020000 : "u-boot"
[ 0.710000] 0x000000020000-0x00000012a290 : "kernel"
[ 0.730000] 0x00000012a290-0x0000007f0000 : "rootfs"
[ 0.760000] 0x000000300000-0x0000007f0000 : "rootfs_data"
[ 0.760000] 0x0000007f0000-0x000000800000 : "art"
[ 0.770000] 0x000000020000-0x0000007f0000 : "firmware"
这些信息表示当前系统识别到的 FLASH 分区。我们可以用电脑中的计算器计算一下,打开计算器,选择科学型、十六进制,输入名为 art 的分区容量用(800000-7f0000)结果为 10000(十六进制),这个时候点击十进制,系统会自动将结果转换为十进制,再除以 1024 结果为 64(K) 表示这个分区容量为 64 k。在 OpenWRT 的系统中现在对 Atheros 方案实现了自动查找分区结尾。
上面的几个分区,我来说明下(分区名称、分区容量、分区作用):
"u-boot":128KB,设备初始化程序+引导程序代码本身
"kernel" :1MB,存放系统内核的二进制代码,按照x86下的讲法是Raw分区,就是这里只有内核的二进制,不存在文件系统。
"rootfs":6.7MB,完整的系统文件包含只读和可写
"rootfs_data":4.9MB,在rootfs中的可写部分的位置
"art":64KB,EEPROM分区,在Atheros的方案中这个分区保存了无线的硬件参数
"firmware":7.9MB,完整的固件位置包含了除"u-boot"和"art"之外全部的内容
看的晕了? 这,我马上画个简单的图给大家看看:
这个是它的分区逻辑。请不要太在意这个地方,有点晕也没关系,继续往后面看,这个地方留着后边慢慢理解。
在系统中,可以执行以下指令查看当前系统分区:
系统的文件结构
系统的第一次启动:
- 首先 uboot 启动了 Kernel 完成之后,由 Kernel 加载”ROM 分区” (就是 rootfs 减去 rootfs_data 得到的那一块分区)
- ROM 分区采用的是 Linux 内核支持的 SquashFS 文件系统 (一种压缩只读文件系统),加载完毕后将其挂载到
/rom
目录 (同时也挂载为根文件系统)。 - 系统将使用 JFFS2 文件系统格式化 rootfs_data 这部分并且将这部分挂载到
/overlay
目录。 - 将
/overlay
透明挂载为/
分区。 - 将一部分内存挂载为
/tmp
目录。
这个时候大家一定有一个问题:到底根文件系统是哪个?这个是 OpenWRT 设计的一个优点,它采用了一种叫 Overlay 透明挂载技术,首先将 /rom 挂载为 / 根文件,然后再用 /overlay 覆盖在 / 之上,这样,当你进行文件系统的变更,修改,所做的操作将在 overlay 中记录。 rom 是不改变的。而最简单的恢复出厂设置方法,即是删除掉 /overlay下所有文件。
大致上而言,系统的启动流程类似 CentOS 这类 x86 下的发行版。由于本文读者多是熟悉 Linux 的朋友,关于系统的启动流程不做详细解释了。
基本指令
OpenWRT 下系统的基本指令没有使用 x86 下的指令包,因为那些指令包容量太大。它使用的是 Busybox 项目。
Busybox 是一个集成了一百多个常用 Linux 命令和工具的软件包 (OpenWRT 下编译可以选择要哪些指令)。除了包含常规指令之外,Busybox 还包含了 grep、find、mount 以及 telnet、http 等复杂工具。其被戏称为 Linux 下的瑞士军刀。
Busybox 在 80% 的情况下与 x86 下的标准指令是完全相同的,有 20% 的情况一些指令的细节参数是不支持的。
常用来需要配置的文件夹和内容:
/etc/ 存放着系统全部的配置文件
/etc/init.d/ 存放着启动的服务脚本
/etc/config/ 存放着OpenWRT的配置文件包括网络等等
/tmp/ 临时文件之外还存放着动态的配置文件
/tmp/TZ 就是系统启动后所使用的时区参数
.....
其它还有很多,我们就不一一介绍。
软件包管理
在 OpenWRT 下使用的软件包管理技术叫做 OPKG,它是一个轻量级的软件包技术,已经成为开源嵌入式的事实标准,它类似 CentOS 下的 YUM,可以实现对预编译的二进制软件下载。
输入 opkg 即可看到整个软件的完整帮助信息。语法格式:opkg [参数…] 子命令 [子参数…],参数有:
update 下载服务器上可用的软件包列表
upgrade <包名> 升级软件包
install <包名> 安装软件包
configure <包名> 配置某一个软件包
remove <包名> 卸载软件包
info [pkg|regexp] 显示出指定软件包的信息
系统命令远比我介绍的要多的多,而且这些命令是我们最常用的。本着深入浅出的态度,大家根据自己的能力,希望学更多的童鞋可以自己详细查看下 opkg 的帮助文档。
opkg 配置文件在 /etc/opkg.conf
可以配置源等参数。
更新 opkg 的包列表,请注意,每次操作 opkg 下载之前都要先执行一次 opkg update
,确保包列表是同步的。
实际操作
刷机
之前已经刷过一次 OpenWRT 了,这里说下在 OpenWRT 命令行界面的刷新方法:
cd /tmp/
wget xxxxx
mtd -r write 你的固件文件名.bin firmware
reboot
登陆 SSH
默认是无法通过 SSH 登陆,先通过 Telnet 192.168.1.1
登陆后配置 root 密码才可以登陆。
WAN/LAN 网络设置
网络配置文件为 /etc/config/network
,修改参考如下:
root@OpenWrt:~# vi /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
### LAN口设置修改,基本不用修改 ###
config interface 'lan'
option ifname 'eth1'
option type 'bridge'
option proto 'static'
option ipaddr '192.169.1.1'
option netmask '255.255.255.0'
### WAN口PPPoE ###
config interface 'wan'
option ifname 'eth0'
##### option proto 'dhcp'
option proto 'pppoe'
option 'username' 'user'
option 'password' 'password'
Wi-FI 设置
Wi-FI 配置文件为 /etc/config/wireless
,下面是设置 Wi-FI 名称为 wr-ow
,采用 psk2
认证方式、密码 123456
。
root@OpenWrt:~# vi /etc/config/wireless
config wifi-device radio0
option type mac80211
option channel 11
option hwmode 11ng
option path 'platform/ar933x_wmac'
option htmode HT20
list ht_capab SHORT-GI-20
list ht_capab SHORT-GI-40
list ht_capab RX-STBC1
list ht_capab DSSS_CCK-40
# REMOVE THIS LINE TO ENABLE WIFI:
##### option disabled 1
config wifi-iface
option device radio0
option network lan
option mode ap
option ssid wr-ow
##### option encryption none
option encryption psk2
option key 123456
支持 USB
WR720 有一个 USB 接口,可以接入 USB 存储设备。USB要先格式化 OpenWRT 可识别分区,我是在 Debian 下面格式化为 ext4 分区格式的。
先查询接入系统的 USB 硬盘,使用 dmesg 显示信息
[ 242.090000] usb 1-1: new high-speed USB device number 2 using ehci-platform
说明是接口是 USB 2.0,需要 kmod-usb2 模块,固件缺省已安装
接下来只需安装 kmod-usg-storage、kmod-fs-ext4内核模块,其他模块已缺省安装,执行:
root@OpenWrt:~# opkg install kmod-usb-storage kmod-fs-ext4
root@OpenWrt:~#reboot
启动后,查看是否已经支持:
root@OpenWrt:~# ls /dev/sda*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3
支持 extroot
WR720N 只有 4 MB Flash 存储,根分区放到 Flash上很小,没有空间安装多个软件;并且大部分软件缺省安装到根分区、安装到其他分区很困难,解决办法就是把根分区加载外部(USB)存储上。处理如下。
安装 block-mount
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install block-mount
root@OpenWrt:~# reboot
复制 Flash 根分区文件到外部存储
root@OpenWrt:~# mkdir /mnt/sda1
root@OpenWrt:~# mount /dev/sda1 /mnt/sda1
root@OpenWrt:~# mkdir -p /tmp/cproot
root@OpenWrt:~# mount --bind / /tmp/cproot/
root@OpenWrt:/# tar -C /tmp/cproot/ -cvf - . | tar -C /mnt/sda1 -xf -
root@OpenWrt:/# umount /dev/sda1
修改 fstab
root@OpenWrt:~# vi /etc/config/fstab
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
### USB硬盘的第一个分区用作根分区###
config 'mount'
option target '/'
option device /dev/sda1
option fstype ext4
option options rw,sync
option enabled '1'
option enabled_fsck 0
重启后看到根分区是你的 USB 存储设备了。