在树莓派3上搭建监控系统

之前用过tsar做监控,但没有基于浏览器的图表展示,而且tsar收集数据很频繁,容易写坏SD卡。后来一直用Xively SaaS服务,但因为服务在国外,访问速度一直不尽人意。直到今天早上读到InfoQ的一篇文章才知道了Prometheus,看了一下介绍后发现Prometheus的以下特点非常合适在树莓派上部署:

  1. 采用Go实现支持,天然支持跨平台,配置相当简单,维护和二次开发的成本小;
  2. 采集数据支持Pull和Push模式,可以自定义不同采集点的采样频率,适合轻量型应用降低能耗;
  3. 二次计算和查询方式很灵活
  4. 自带 Grafana数据可视化工具;
  5. 可配置的内存+磁盘存储大小,采用的时间序列文件和Level DB做索引效率较高,不会让监控软件本身消耗过多的树莓派计算和存储资源
[Read More]

树莓派3初体验

树莓派基金会今年推出的新品Raspberry Pi 3已经到手,官方宣传性能比树莓派2代快50%,比树莓派1代快10倍,第一次使用的64位四核处理器(博通BCM2837)配备了ARM Cortex-A53处理器,内置了802.11 b/g/n 2.4GHz WIFI和蓝牙4.1,显卡没变,还是双核VideoCore IV(并不支持4K视频)。CPU升级也对能耗有了更高的要求,官方说法最好是使用5V 2.5A的电源输入(iPad充电器),实测在无外设的情况下,2A的电流输出也可以让Pi 3正常运行。价格和树莓派2也一样,官方售价税前35美金,国内可以在淘宝上买到,238元一枚,点此购买

image

我深深的认为每个程序员都需要有一块树莓派,24*7的运行在家里的网络上 ,投入成本在300人民币以内(树莓派加电源:250,SD卡:50),每年电费在10元以内。树莓派支持各种编程语言的开发,安装体验各种操作系统非常简单,丰富的外部接口,支持很多类型的传感器和控制器外设,可以让你轻松设计和实现智能硬件,技术让生活更美好~

外观

树莓派3的规格大小则和树莓派2完全一样,你甚至可以直接用树莓派2的外壳,完全贴合。

image

背面看略有不同,中间的芯片是1G内存,树莓派3的内存速度快了1倍,右边是CF卡插槽,树莓派2是回弹式卡槽(取出CF卡时只要往力再摁一下就会弹出),树莓派3可能为了降低成本或是因为板卡空间的问题改成了更紧凑的插入式,装上外壳后取出的时候有点费劲,我需要用瑞士军刀的镊子夹出来。

image

(下图是树莓派3)

安装启动

如果你不需要GUI,推荐安装Raspbian Jessie Lite,大小只有298.3M,下载完成后解压缩成img文件后用dd命令写到CF卡上去。你也可以下载NOOBS完整安装。

WIFI

编辑无线配置文件/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="<无线AP的名称>"
   psk="<无线密码>"
}

如果有多个无线网络可以接入,增加network即可

修改好后如果没有自动生效连上网络可以通过以下命令强制生效

ifdown wlan0
ifup wlan0

非常重要的一点是:如果你希望无线网络一直连接,需要关闭掉无线模块的电源管理,否则没有网络流量后,WIFI会自动关闭。。。

sudo iwconfig wlan0 power off

测试wifi速度:从通过网线连接到极路由2的Mac拷贝文件到树莓派3上,内置网卡的传输速度在4MB/s左右,如果换上300Mbps的USB无线网卡EDUP EP-N1557则可以达到9MB/s左右,速度要快1倍。结论是内置的wifi模块速度只有150Mbps,如果对网络速度要求较高,最稳定的方法还是插根网线。

安装好nginx后,用ab测试最简单的HTML网页性能,树莓派3可以轻松超过1000 QPS,满足个人网站的性能需求。

CPU

树莓派3使用的4核Cortex-A53 BCM2837 SoC为了向下兼容,架构上和树莓派2使用的4核Cortex-A7 BCM2836差不多,在32位模式运行下,速度要快50~60%(时钟频率1.2GHz vs 900MHz),尽管CPU已经支持64位,官方的操作系统Raspbian还是32位,当然树莓派3内存只有1G,运行64位操作系统可能会有点累,。 如果要体验真64位系统,目前可以考虑带2G内存,千兆网口的ODROID-C2,可装Ubuntu 16.04和Android 5.1。

一般情况下,不带散热片的CPU温度在45度左右,我有个脚本会每五分钟上传一下温度:https://personal.xively.com/feeds/1480103458

Node.js

安装5.0.0

wget https://nodejs.org/dist/v5.0.0/node-v5.0.0-linux-armv7l.tar.gz
tar -xvf node-v5.0.0-linux-armv7l.tar.gz 
cd node-v5.0.0-linux-armv7l
sudo cp -R * /usr/local/

升级

[Read More]

在树莓派上运行Docker

Docker

Docker是目前非常流行的代码运行容器,操作系统虚拟化,运维自动化架构和开源的解决方案。

Docker的基础是Linux容器(LXC)技术,相比传统的VM虚拟化技术, LXC更轻量,性能更好。

Docker采用Golang语言开发,在LXC基础上Docker进行了封装,简化了容器的管理。

[Read More]

使用树莓派搭建低成本,便携,多用户的弱网模拟器:高效测试手机App在弱网下的可用性

背景

我们的手机经常会处于弱网情况下,电梯里,高铁上,在地铁站,电影院里。。。如果手机应用不针对弱网做优化,就会出现:白屏页面刷不出来,界面卡死,错误提示一堆,菊花转不停,用户抓狂。。。

移动应用开发团队应该将App在弱网下的可用性作为一个重要的性能指标,在设计和开发阶段考虑在弱网下的体验。

[Read More]

用16M的SD卡启动树莓派,在U盘上安装和运行Linux

树莓派官方的操作系统Raspbian最少需要4G的SDCard,如果你恰好有比较小的SD卡怎么办呢?设计上树莓派只能从SD卡引导启动,但我们可以在SD卡上装一个最小的引导系统,然后把树莓派引导到U盘上启动。SD卡连续运行,读写比较频繁也容易损坏(我已经坏掉3张了。。。),相比之下U盘价格便宜些,读写速度可以比SD卡还高。

制作引导SD卡

这个引导系统只需要16M容量的SD卡,先把SD卡格式化成FAT(windows),然后拷贝下面的文件到根目录。

git clone https://github.com/hugozhu/mini_raspbian_boot

修改 cmdline.txt 中的 root=/dev/mmcblk0p2root=/dev/sda2 以指定用U盘启动

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait cgroup_enable=memory

安装操作系统Raspbian到U盘

方法和安装到SD卡一样,在Mac上使用 dd 命令安装,在Windows上可以用win32diskimager:

sudo dd bs=1m if=2015-01-31-raspbian.img of=/dev/disk4 #/dev/disk4

扩展分区

如果你的U盘容量大于4G,那么上一步安装完后,你的U盘只能看到4G空间,大容量的SD卡的这个问题可以通过自带的raspi-config命令来解决。 Linux下可以用fdisk来解决,我的方法是把该U盘插到已经正常启动的树莓派的USB口上,正常识别后,执行sudo fdisk /dev/sda

  1. p后打印出分区表:
/dev/sda1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sda2          122880     6399999     3138560   83  Linux
  1. 记住/dev/sda2的起始点122880',然后按d,删除掉二个分区,接着按n重新创建一个分区,起始点就设置为122880`,结束点可以设置为最大

  2. 最后按w保存新的分区表

插上引导SD卡和系统U盘后树莓派就可以愉快的运行起来了,如果U盘的速度足够快,你会发现系统还变快了。

参考文章

  1. http://www.raspberrypi.org/boot-from-a-16mb-sd-card/

用Telegram和树莓派交互

如果你的树莓派不能通过路由器端口转发直接从家庭网络外访问,你还可以用类似聊天App一样的方式来和防火墙后的树莓派轻松交互,通过命令来控制树莓派。

Telegram

image

Telegram是一个跨平台的即时通讯软件,客户端和通讯及加密协议完全公开且开源。官方有正式发布Android,iOS,Mac OS X, Web等客户端版本;Telegram允许多端同时登录。我们在手机上安装Telegram客户端,同时在树莓派上用同一个帐号或另一个帐号也登录Telegram,那么就可以用手机和树莓派聊天了,更高级的一些用法可以是把树莓派帐号加到群聊中,实现类似微软小冰的功能;也可以由树莓派主动向你的手机Push消息实现提醒功能。

安装telegram-cli

Linux的Telegram客户端telegram-cli源代码在 https://github.com/vysheng/tg,按照Readme在树莓派上编译好。telegram-cli支持消息事件对lua脚本中的函数进行回调,支持的函数列表在:https://github.com/vysheng/tg/blob/master/README-LUA,也支持外部程序通过telegram-cli侦听的端口发送交互命令(一次连接只能一个命令)

Lua交互脚本

脚本命名为:tg_raspberrypi.lua

now = os.time()

chat = "树莓派通知" -- telegram的会话名称

safe_commands = {}
safe_commands["uptime"]  = "uptime"
safe_commands["w"]       = "w"
safe_commands["ps"]      = "ps ax"
safe_commands["netstat"] = "netstat -na"
safe_commands["df"]      = "df"
safe_commands["ss"]      = "ss"
safe_commands["free"]    = "free"

function on_msg_receive (msg)
	if msg.out then
	    return
	end
	if msg.text then
		-- mark_read(msg.from.print_name)	
		-- vardump(msg)
		cmd = string.lower(trim(msg.text))
		if cmd == "ping" then
			send_msg (chat, 'pong', ok_cb, false)
		elseif safe_commands[cmd] ~= nil then
			send_msg (chat, exec(safe_commands[cmd]), ok_cb, false)
		end
	end
end

function on_our_id (id)
end
 
function on_secret_chat_created (peer)
end
 
function on_user_update (user)
end
 
function on_chat_update (user)
end
 
function on_get_difference_end ()
end
 
function on_binlog_replay_end ()
end

function exec(cmd)
   local output = ""
   f = assert (io.popen (cmd))
   for line in f:lines() do
     output = output .. "\n" .. line
   end -- for loop
   f:close()
   return output
end	

function trim(s)
  return (s:gsub("^%s*(.-)%s*$", "%1"))
end

function vardump(value, depth, key)
  local linePrefix = ""
  local spaces = ""
  
  if key ~= nil then
    linePrefix = "["..key.."] = "
  end
  
  if depth == nil then
    depth = 0
  else
    depth = depth + 1
    for i=1, depth do spaces = spaces .. "  " end
  end
  
  if type(value) == 'table' then
    mTable = getmetatable(value)
    if mTable == nil then
      print(spaces ..linePrefix.."(table) ")
    else
      print(spaces .."(metatable) ")
        value = mTable
    end		
    for tableKey, tableValue in pairs(value) do
      vardump(tableValue, depth, tableKey)
    end
  elseif type(value)	== 'function' or 
      type(value)	== 'thread' or 
      type(value)	== 'userdata' or
      value		== nil
  then
    print(spaces..tostring(value))
  else
    print(spaces..linePrefix.."("..type(value)..") "..tostring(value))
  end
end

print(exec("uptime"))

启动telegram-cli

第一次启动

第一次启动telegram-cli会需要你输入手机号码,输入短信验证码后登录,成功登录后会在~/.telegram-cli下保存登录信息,后面就不需要再登录了。

[Read More]

用树莓派2代打造智能家庭路由

家里的宽带上下行都有10Mbps了吧?除了可以BT下载外还能让你的移动设备在外的时候也能科学上网。

区别于在海外架设VPN服务:

  • 国内和大部分国外网站都可以直连而不降低速度;不像海外VPN所有流量(国内和国外网站)都要经过海外服务器,速度有一定的延迟
  • 这个方案代理可以使用免费的Goagent服务;或低成本的ssh帐号;而租用海外VPS服务器自建服务或购买VPN帐号费用较高些;
  • 利用的是家里的宽带,只有树莓派的硬件成本,没有主机托管成本;

假设家里的路由器IP地址为:192.168.1.1,树莓派2的IP地址为:192.168.1.3,以下是需要安装和设置步骤。

PPTP和L2TP VPN Server

首先在树莓派上安装和设置VPN服务器,移动设备就可以通过运营商网络连接回家里的树莓派(iPhone和Android都内置了PPTP和L2TP客户端),这样移动设备将以树莓派为路由访问网站,通过一些设置我们可以让树莓派提供科学上网服务。

关于PPTP和L2TP VPN设置和安装可以参考: http://hugozhu.myalert.info/2013/03/01/setup-l2tp-pptp-openvpn-on-ubuntu.html

但在树莓派上安装L2TP时不能直接apt-get install openswan,需要手动下载来安装,原因是因为最新的版本在协议上有些不兼容:

wget http://snapshot.raspbian.org/201403301125/raspbian/pool/main/o/openswan/openswan_2.6.37-3_armhf.deb
sudo dpkg -i openswan_2.6.37-3_armhf.deb

假设VPN服务端的local ip我们设置为192.168.3.1,PPTP客户端IP分配区间为:192.168.3.200~192.168.3.210,L2TP 客户端IP分配区间为:192.168.3.100~192.168.3.110,我们可以通过iptables对IP来源为192.168.3.0/24网段的流量做特殊的处理以达到科学上网的目的。

完成这一步后,需要在路由器上设置端口转发,使得使用运营商网络如移动4G的手机可以通过PPTP或L2TP连到树莓派上。

PPTP需要设置的端口转发 - tcp: 1723

L2TP需要设置的端口转发 - tcp: 50, udp: 500,4500,1701

两种VPN服务相比较:PPTP拨号速度比较快,但是不安全;L2TP有加密,相对安全。

Redsocks2

redsocks2是一个透明TCP代理,其实现使用了libevent库,性能较好,其最大的特点是如果目标IP可以直连则不会转发流量给加密代理,如果IP不能直连(通过连接超时判断)则会将流量转发给加密代理。这样可以将最少的流量转发到代理上,访问一般的国外网站如yahoo.com也不会经过代理而减速,在配置方面则做到了零配置,不需要手工维护网站名单。代理也能支持很多中类型,如socks5, shadowsocks, goagent, http-proxy等,redsocks2安装和配置可以见链接: http://github.com/hugozhu/redsocks

这里我们假设redsocks2的端口使用12345

iptables

使用iptables我们可以将VPN客户端192.168.3.0/24的流量转发到redsocks5的端口12345

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t nat -A PREROUTING -s 192.168.3.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 12345 #转发VPN客户端的HTTP流量到端口12345
sudo iptables -t nat -A PREROUTING -s 192.168.3.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 12345 #转发VPN客户端的HTTPS流量到端口12345
sudo iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE #转发VPN客户端的TCP流量到网络出口,并进行IP伪装;如果树莓派使用无线网卡则将eth0改成wlan0

DNS加固

上面的设置我们解决了VPN拨号到树莓派的客户端通过redsocks2透明代理分流为直连或通过加密代理连接和访问目标网站,我们还需要解决一下DNS查询被纂改为不存在的IP地址的问题。

[Read More]