跟 UMU 一起玩 OpenWRT(入门篇6):挂接 U 盘

需求

DIR-505 有一个 USB2.0 接口,给它带来了很大的扩展性,我们可以插 U 盘、移动硬盘等,来做文件共享,或者离线下载等。接下来就先搞定 U 盘,主要参考资料:http://wiki.openwrt.org/doc/howto/usb.storage

安装

1. 安装 USB 和存储器的内核模块

1
2
3
opkg update
opkg install kmod-usb-storage
opkg install kmod-scsi-generic

2. 安装文件系统内核模块

1
opkg install kmod-fs-ext4

3. 安装应用工具

USB 辅助工具、分区、格式化工具,这些非必要,看情况安装:

1
opkg install usbutils fdisk e2fsprogs

调试

1. 测试能否识别 U 盘

不插 U 盘时,输入 lsusb,显示如下

1
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

插入 U 盘后,再 lsusb,发现多了一条,这说明工作正常:

1
2
Bus 001 Device 002: ID 0603:0908 Novatek Microelectronics Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

2. 分区

如果 U 盘需要重新分区,请用 fdisk,这里不具体介绍,也可以在 Windows 上用 diskpart 完成,如果您还在路由器上操作,可以参考这个:http://www.leiphone.com/diy-a-smart-router-topic-increase-memory-3.html,第一步: 对设备进行分区。

分区完后,查看一下 /dev 目录里有没有出现硬盘符和分区符:

1
ls /dev | grep sd

上面装了 ext4 文件系统的驱动,因为这个对 OpenWRT 最合适,如果原来不是这个格式,那么安装了 e2fsprogs 后就可以用下面命令格式化了:

1
mkfs.ext4 /dev/sda1

3. 挂载

接下来用 mount 挂接,头尾行是必须,中间的三行是一种防止未挂接好就被写入的机制:

1
2
3
4
5
mkdir /mnt/usb
touch /mnt/usb/USB_DISK_NOT_PRESENT
chmod 555 /mnt/usb
chmod 444 /mnt/usb/USB_DISK_NOT_PRESENT
mount /dev/sda1 /mnt/usb

到这里就可以通过 /mnt/usb 来访问 U 盘了,不过工作才完成一半而已……下面还要让 U 盘能开机自动加载,主要参考:http://wiki.openwrt.org/doc/techref/block_mount 和 http://wiki.openwrt.org/doc/uci/fstab。先安装程序:

1
opkg install block-mount blkid

如果您比较珍惜存储空间,可以不用安装 blkid,block-mount 就行。用 blkidblock info,查看分区的 UUID。比如用 blkid,则 UMU 的 U 盘是显示:

1
2
/dev/mtdblock7: TYPE="squashfs"
/dev/sda1: UUID="16e381bc-d9bb-40fd-9e98-410b346931ef" TYPE="ext4"

接下来输入 block detect 查看一下:

1
2
3
4
5
6
7
8
9
10
11
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'
config 'mount'
    option target '/mnt/sda1'
    option uuid '16e381bc-d9bb-40fd-9e98-410b346931ef'
    option enabled '0'

生成配置文件,并把上面的 target 改为您想要的,enabled 值改为 1:

1
2
3
4
block detect > /etc/config/fstab
uci set fstab.@mount[-1].target='/mnt/usb'
uci set fstab.@mount[-1].enabled=1
uci commit fstab

参考

本文介绍的都是精简过的必须操作,其它可选项请自行参考:http://wiki.openwrt.org/doc/uci/fstab

跟 UMU 一起玩 OpenWRT(入门篇5):升级固件

问题

OpenWRT 的主线于 2014-06-19 06:07:37 UTC 更新了固件,如果不跟随升级,安装内核模块时会失败,比如以下命令:

1
2
opkg update
opkg install kmod-hid

解决

升级固件:

1
2
3
cd /tmp
wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-dir-505-a1-squashfs-sysupgrade.bin
sysupgrade openwrt-ar71xx-generic-dir-505-a1-squashfs-sysupgrade.bin

跟 UMU 一起玩 OpenWRT(入门篇4):配置网络

前情

在上篇《跟 UMU 一起玩 OpenWRT(入门篇3):工作模式开关》中介绍了如何通过 GPIO 读取获得当前工作模式,现在来实现这个开关的功能。

配置开机启动脚本

主要配置 rc.local 脚本,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
read_gpio() {
(echo $1 > /sys/class/gpio/export) >& /dev/null
(echo "in" > /sys/class/gpio/gpio$1/direction) >& /dev/null
return `cat /sys/class/gpio/gpio$1/value`;
}

read_gpio 19;
v=$?;
read_gpio 20;
v=$v$?;
read_gpio 21;
v=$v$?;
read_gpio 22;
v=$v$?;
read_gpio 23;
v=$v$?;
case "$v" in
11000) v="4th";;
10001) v="ap";;
11001) v="repeater";;
01001) v="hotspot";;
*) v="error";;
esac

if [ "$v" != "error" ]; then
old=`cat /etc/config/working_mode`
if [ "$v" != "$old" ]; then
echo "$v" > /etc/config/working_mode
cp /etc/config/$v/* /etc/config/
logger "working mode: $old -> $v"
else
logger "working mode: $old"
fi
fi

exit 0

根据工作模式配置网络

上一步加的代码是,开机自动复制配置文件覆盖到 /etc/config/ 下,配置文件不需要全部,只要 firewall、network 和 wireless 就行了。按工作模式命名,创建三个目录:

1
2
3
mkdir /etc/config/ap
mkdir /etc/config/repeater
mkdir /etc/config/hotspot

后面,我们会把配置文件写好了,放在这些目录里。

ap 模式

下面以 ap 为例,此模式是网口做 WAN,无线做 LAN,WAN 以 ADSL 接入为例,其它情况自行变通:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uci set wireless.@wifi-device[0].disabled=0;
uci set wireless.@wifi-iface[0].ssid='umu618.com';
uci set wireless.@wifi-iface[0].encryption='psk2+ccmp';
uci set wireless.@wifi-iface[0].key='WiFi 密码';
uci commit wireless;
wifi

uci delete network.lan.ifname
uci delete network.lan.type
uci add network interface
uci rename network.@interface[-1]='wan'
uci set network.@interface[-1].ifname='eth1'
uci set network.@interface[-1]._orig_ifname='eth1'
uci set network.@interface[-1]._orig_bridge='false'
uci set network.@interface[-1].proto='pppoe'
uci set network.@interface[-1].username='宽带账号'
uci set network.@interface[-1].password='宽带密码'
uci commit network

cp /etc/config/firewall /etc/config/ap/
cp /etc/config/network /etc/config/ap/
cp /etc/config/wireless /etc/config/ap/

repeater 模式

再来说一下 repeater,网口做 LAN,无线做一个 AP Client 和一个 AP。注意,以下命令以初始化的配置文件为基础,请事先备份、还原,不要在配置过前面的 ap 模式后直接继续配置,可能会有问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
uci add network interface
uci rename network.@interface[-1]='wwan'
uci set network.@interface[-1].proto='dhcp'
uci commit network
uci set wireless.@wifi-device[0].disabled=0;
uci set wireless.@wifi-iface[0].ssid='umu618.com';
uci set wireless.@wifi-iface[0].encryption='psk2+ccmp';
uci set wireless.@wifi-iface[0].key='WiFi 密码';

uci add wireless wifi-iface
uci set wireless.@wifi-iface[-1].network='wwan'
uci set wireless.@wifi-iface[-1].ssid='现有 WiFi 名字'
uci set wireless.@wifi-iface[-1].device='radio0'
uci set wireless.@wifi-iface[-1].mode='sta'
uci set wireless.@wifi-iface[-1].bssid='现有无线路由器的 MAC 地址'
uci set wireless.@wifi-iface[-1].encryption='psk2+ccmp'
uci set wireless.@wifi-iface[-1].key='现有 WiFi 密码'
uci commit wireless;
wifi

uci get firewall.@zone[1].network
uci show firewall.@zone[1]
uci set firewall.@zone[1].network='wan wan6 wwan'
uci commit firewall
/etc/init.d/firewall restart

cp /etc/config/firewall /etc/config/repeater/
cp /etc/config/network /etc/config/repeater/
cp /etc/config/wireless /etc/config/repeater/

小米路由使用经验

槽点

小米路由比极路由 1S 还早买,但用了一周后就决定把他收起来了……

  1. 0.4.58 的版本,下载功能根本不能用,人品真差,同样的种子,1S 就可以下载!有朋友也这样,看来不是个例。

  2. 发烧……您说替代 NAS 吧,就一个硬盘而已,缓存还只有 8MB,一天就开机 9 小时左右,每天下班都是暖手宝。

  3. 太 TM 贵了,收起来还有点浪费啊!

优点

话说回来,UMU 是看好小米路由的,配置真心高,虽然大部分人不需要,但也提一下优点:

  1. 千兆网口啊!高富帅家里怎么能没有千兆独享的宽带?

  2. USB 啊!尼玛,插个 USB 声卡就可以做窃听器了,您造吗?扩展性超高,堪称智能……前提是 root。

  3. 信号超好啊!虽然天线内置,但有 4 根啊,秒杀极路由 1S。重点还很稳定,Windows、MAC OS、Android、iOS、WP 各种设备都一起连上来,MAC OS 和 iOS 都不会掉线哦!

  4. 11AC 超快啊!干扰少啊!

  5. 黑色垃圾桶的造型,让您放在角落也毫无违和感,它真的很像另一个角落的垃圾桶。(风扇有声,放角落才不会吵)

极路由 1S 使用经验

优点

基本全在硬件上:

  1. 不贵,性价比不错;

  2. 铝合金外壳,体型小巧,散热性好;

  3. MicroUSB 电源接口,停电时可以用移动电源供电(最近宿舍跳闸停电三次,还不得不提一下,这绝对是优点!);

  4. 两根天线,信号还行,虽然不如小米路由,但考虑到价格还是过得去。

  5. 可以插 SD 卡,这个能秒杀很多传统路由。

缺点

主要缺点在软件上:

  1. 不稳定,每个开发版都应该吐槽,办公室的 MAC OS 机器一连上来就出现一天死一次的问题,CPU 占用率超高!

  2. 定位很忽悠。您说智能吧,只是界面和使用流程得到一点点优化,再说面向极客吧……极客需要那些给小白用的界面?这明显是面向装逼的初级技术人员。一天死一次,就不要说极客了……

  3. 服务态度问题。App 不支持 Windows Phone。注册个账号哟手机,然后 UMU 手机换号了,联系了官方客服、在论坛上问了,都不让改,让 UMU 再注册一个账号……逛了几周的论坛,发现各位坛友大部分是小白,所以官方不断发一些扫盲的科普文,品质和逼格都不高,可以说根本没有极客间的交流。

硬件上的明显缺点:

  1. 不贴防滑贴在办公桌上很容易滑……设计硬伤!

  2. 没有 USB,明显少了很多扩展性,还敢自称智能?

个人观点

最近有朋友让 UMU 推荐路由器,UMU 还是建议他们买极路由 1S,回来刷 OpenWRT,自己整吧!

跟 UMU 一起玩 OpenWRT(入门篇3):工作模式开关

DIR-505 有一个工作模式开关,可以设定三个模式,但刷了 OpenWRT 后,默认没有任何功能,我们可以利用 GPIO 读取获得开关的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh

read_gpio() {
(echo $1 > /sys/class/gpio/export) >& /dev/null
(echo "in" > /sys/class/gpio/gpio$1/direction) >& /dev/null
return `cat /sys/class/gpio/gpio$1/value`;
}

read_gpio 19;
v=$?;
read_gpio 20;
v=$v$?;
read_gpio 21;
v=$v$?;
read_gpio 22;
v=$v$?;
read_gpio 23;
v=$v$?;
case "$v" in
10001) v="ap";;
11001) v="repeater";;
01001) v="hotspot";;
11000) v="4th";;
*) v="error";;
esac
echo $v;

按照 OpenWRT 官网资料(http://wiki.openwrt.org/toh/d-link/dir-505#buttons),有一款 DIR-505L 的开关是四个档位的,DIR-505 其实也有,但外壳把第四个档位给挡住了,掰不到。如果您足够蛋疼,可以用刻刀给它开开口……

我们可以在开机脚本(/etc/rc.local)里加入判断代码,根据档位做不同配置,以实现不同用途。

安全性堪忧的门禁系统

天天刷卡开门,不知道大家有没有考虑到门禁的安全性。按照 UMU 的设想,门禁的原理应该是:刷卡器获得卡信息,到服务器比较,若合法,则服务器下令开门。但现实中,有的门禁却不是这样的,下令开门的不是服务器,而是刷卡器!!!

UMU 与门禁的亲密接触发生在 2013-11-13,第二次不小心被关在厕所,忘记带卡,结果出不来,想起第一次是多么惨,最后让住公司附近的同事过来拯救。但总不能第二次又麻烦人家吧!于是开始了研究破解,不到 5 分钟,门就被打开了……

原理:这套门禁系统是直接由刷卡器控制门的开关的,所以在刷卡器这边就可以打开门,不需要经过服务器认证,我们要做的就是找到 OPEN 针脚,把它和 GND 针脚接起来,门就开了。

理论上说,门禁刷卡器很好拆,即使不好拆,一把锤子就能砸烂,所以对入侵者来说,只要具备野蛮和电路知识,破解的难度是相当低啊!

不罗嗦,上图!这是要破解的门禁刷卡器。

47#602-1

徒手温柔地打开……

47#602-2

去掉排线,就可以看到 OPEN 的针脚了:

47#602-3

连接 OPEN 和 GND,门就开了!

47#602-4

微软面试题:为什么 Shell 脚本自动把字符串 10001 当成二进制,输出 17?

注解

这并非是“微软公司”的面试题,而是稣想出来“让人微软”的题。

题目

1
2
3
4
5
6
7
#!/bin/sh
test() {
v='10001';
return $v;
}
test;
echo $?

运行后输出 17(二进制 10001 的十进制 17),解释一下?

解答(2023-01-17 新增)

返回值是个 Byte 呀!10001 是 0x2711,所以被截断为 0x11,那就是 17。即:

10001 mod 256 = 17

本题设置的陷阱正是“二进制 10001 的十进制等于 17”,误导人真有一套。

跟 UMU 一起玩 OpenWRT(入门篇2):连上路由器

登录

刚刚刷好 OpenWRT 的 DIR-505,默认没有开启 WiFi,所以只能用网线连接,连起来后,将电脑的网卡配置为 192.168.1.X,或者自动获得地址也行。

默认也没有开启 SSH,只能用 telnet 192.168.1.1 来连,连上后改 root 密码:

1
passwd root

改好密码后,先不要关闭 telnet,因为一关闭,下次就连不上了。马上用 SSH 客户端(推荐使用 putty,文件复制、编辑则推荐 winscp)连一下路由器:

1
ssh 192.168.1.1

如果连接失败,需要在 telnet 会话下开启 SSH 服务:

1
2
/etc/init.d/dropbear enable
/etc/init.d/dropbear start

开启 WiFi

用有线连接比较麻烦,接下来开启 WiFi,实现无线连接:

1
2
3
4
5
6
uci set wireless.@wifi-device[0].disabled=0;
uci set wireless.@wifi-iface[0].ssid='umu618.com';
uci set wireless.@wifi-iface[0].encryption='psk2+ccmp';
uci set wireless.@wifi-iface[0].key='password';
uci commit wireless;
wifi

改时区

时间都用网络同步,所以使用正确的时区很重要,要改为当地的时区,比如 UMU 使用台北时间:

1
2
3
4
5
uci set system.@system[0].zonename='Asia/Taipei';
uci set system.@system[0].timezone='CST-8';
uci commit system;

echo CST-8 > /etc/TZ;

改机器名

个性化,非必要:

1
2
3
4
5
6
echo 'DIR-505' > /proc/sys/kernel/hostname;

uci set system.@system[0].hostname='DIR-505';
uci commit system;

/etc/init.d/dnsmasq restart;

改欢迎语

个性化,非必要:

1
vi /etc/banner