最近在阿里云买的服务器又要到期了,与当时还是大学生时相比,费用提高了不少,从一个月9块9变成了一个月50多,虽说现在有了工作,但还是觉得这部分钱花的有点浪费。于是,找到了它 -- 树莓派,我将用它来替代我的阿里云服务器,下面将会记录它从一块板子变成服务器的心理历程。

系统的安装

准备工作

我需要用到以下东西:

  • 树莓派(我的是Raspberry Pi 3 china 版)
  • SD卡(我买了个闪迪32G的)
  • 卡托或读卡器(你懂的)
  • 网线(虽说它自带无线网卡,但第一次装系统还是需要网线的)
  • 电源(输出电流要达到2A,不然可能会莫名重启)
  • 电脑(我的是Mac系统,Window系统不做介绍)

下载系统

对树莓派支持的系统做了对比之后,最终选择了RASPBIN JESSIN LITE版,两个原因:一是因为我原本的阿里云服务器是Ubuntu的系统,它可以完美移植。二是因为仅用来当服务器用,不需要桌面,占用空间小。下载成功后解压出系统镜像文件img格式的。

制作启动盘

一、将SD卡插入电脑,并查看是否已挂载,输入如下命令:

diskutil list

此时表示电脑已挂载该SD卡。

注意:如果该SD卡有多个分区,需要使用diskutil unmount /dev/disk2s1命令卸载分区。

二、将系统刷入SD卡

sudo dd bs=4m if=2017-07-05-raspbian-jessie-lite.img  of=/dev/disk2

说明:2017-07-05-raspbian-jessie-lite.img指上面下载的系统文件,/dev/disk2指SD卡地址(千万不要写错了!)

大概三分钟左右,会出现下载的提示:

411+1 records in
411+1 records out
1725629563 bytes transferred in 382.196554 secs (4515032 bytes/sec)

此时,说明系统已经成功刷入SD卡。

三、卸载设备

diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk1 was successful

得到如上信息,说明卸载成功。

四、开启SSH登录

新版本的系统,默认关闭了SSH功能,我们需要手工开启,才能使用SSH连接,系统更新日志里有具体说明,只需要在系统根目录新建一个空白的ssh文件即可。

启动并连接系统

启动系统

启动系统比较简单,将SD卡插入树莓派中,连接上网线并接通电源,如果我们看到树莓派及网线接口的灯亮了,说明它系统已经启动并连接上了网络。

连接系统

要想通过SSH对连接树莓派,首先我们需要知道它当前分配的IP地址是多少?这个有很多方法,请自行百度(我的是连接的自己的路由器,登录后台看一下就知道了)。

知道了IP地址就可以直接连接了,树莓派默认的账号是pi,pndc是raspberry

ssh pi@192.168.31.170
pi@192.168.31.170's password:

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

此时说明成功连接到了树莓派,大功告成~

配置无线连接及静态IP

一、配置无线

sudo vim /etc/wpa_supplicant/wpa_supplicant.conf

在最下面加入如下代码:

# config wifi
network={
    ssid="phper"
    psk="xiaohe888"
}

二、配置静态IP

sudo vim /etc/dhcpcd.conf

在最下面加入如下代码:

# config static ip
interface wlan0
    static ip_address=192.168.31.170/24
    static routers=192.168.31.1
    static domain_name_servers=192.168.31.1

更新软件源

系统自带的软件源为国外地址,速度比较慢,我们可以把它换成国内的,如阿里云的:

sudo vim /etc/apt/sources.list
#deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi

# 注释掉原来的软件源,新加上阿里云的软件源
deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main contrib non-free
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main contrib non-free

上报当前IP地址到邮箱

背景

因为树莓派大部分情况下是通过SSH进行连接,所以必须知道当前的IP地址是多少,而它又没有显示器可供显示,所以我这里写了一个脚本,每当树莓派开机时自动把当前IP地址发送到一个自己的邮箱里,这样子就再也不怕那天因为找不到IP而烦恼了。ps:还有人写了一个脚本让树莓派把IP地址语音播报出来,也是6了一逼。 - 传送门

配置邮件客户端

既然要发邮件,就是用到Linux下的邮件程序和邮件客户端,这里我用到的是muttmsmtp,因为我们只是发送邮件所以有它们就足够了。

一、安装

sudo apt-get install msmtp
sudo apt-get install mutt

二、添加配置文件

在用户目录添加msmtp的配置文件


vim /home/double/.msmtprc # 配置如下内容

account default
host smtp.126.com         # smtp服务器地址
from mesfreeman@126.com   # 发件人邮箱
auth plain                # 授权方式
user mesfreeman           # 发件人
password xxxhoihei        # 邮箱密码
logfile ~/msmtp.log       # 日志文件

在用户目录添加mutt的配置文件

vim /home/double/.muttrc      # 配置如下内容

set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="mesfreeman"
set from=mesfreeman@126.com
set envelope_from=yes

保存并退出,至些配置完成。

三、发送测试邮件

echo “我是邮件的内容” | mutt -s “我是邮件标题” double.he@qq.com

过一分钟左右,如果在double.he@qq.com邮箱中能收到该邮箱说明,配置成功。如果没有收到请检查配置文件配置是否正确以及邮箱是否被误以为垃圾邮件而拦截。

IP地址上报脚本

这里是用Shell来写的,你也可以使用其它语言,脚本如下:

#!/bin/bash

# check network availability
while true
do
  TIMEOUT=5
  SITE_TO_CHECK="www.126.com"
  RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1`
  if [ "x$RET_CODE" = "x200" ]; then
  echo "Network OK, will send mail..."
  break
  else
  echo "Network not ready, wait..."
  sleep 1s
  fi
done

# get the ip address, eg: 192.168.31.170
ETH0_IP_ADDR=$(hostname -I)

# send the email
echo "Raspberry pi current ip address is $ETH0_IP_ADDR" | mutt -s "Raspberry Pi" mesfreeman@126.com

将脚本加入开机自动执行

只需要向/etc/rc.local文件中添加上面的脚本就可以了,如下:

reportIpToMail.sh >> /home/double/msmtp.log

注意:如果要让脚本开机时自动执行,请合理分配脚本权限或者把邮件客户端配置文件放在root目录,否则无法正常发送邮件。

内网穿透

背景

树莓派连接的是我们家里的网络,而大部分网络提供商并不提供公网IP(具说电信的可以),所以我们并不能在外网的情况下访问到我们的树莓派,这就导致了我们在树莓派上搭建的网站只能自己访问。因此我们需要将内网IP映射到一个公网IP上,使树莓派像阿里云服务器一样可以随时随地的访问,而这个技术就叫内网穿透

目前最常用的内网穿透解决方案有两种:ngrokfrp。这两种方式都支持自行的搭建,但是如果想搭建一个内网穿透服务器,就必须有一个支持外网的云服务器作为中转站。

你肯定会想我都有外网的云服务器了还要折腾内网的干啥?其实我第一次也是这么想的,不过后来深入了解后发现有一些特殊的使用场景,比如微信本地开发。但是我却是不想花钱买云服器才折腾树莓派的,我就想有没有提供这个服务的,于是我找到这个幸运星 - sunny-ngrok内网穿透服务提供商,而且它的免费服务已经够我使用的啦,在此表示忠心的感谢。

实现步骤

下面我们就以sunny-ngrok作为内网穿透服务器,让树莓派支持外网访问。

一、生成隧道ID

sunny-ngrok官网注册账号,登录后选择隧道管理 -> 开通隧道,根据提示填写信息即可,完成后点击隧道管理查看生成的隧道ID。

二、下载客户端

sunny-ngrok官网下载相应的客户端(树莓派要下载Linux ARM版本的才行)

三、启动客户端

将下载好的客户端上传至树莓派,我这里上传到了/root/projects/sh目录下,也可以直接放在/etc/bin目录下。输入如下命令即可启动客户端

./sunny clientid xxxxxhiwfjo # 后面字符串即上上面生成的隧道ID,如果有多个以逗号分隔

如果启动成功的话,你会看到如下界面

小问题

完成上面步骤树莓派其实已经实现内网穿透,我们已经可以通过访问 http://aool.ngrok.cc 访问到我们树莓派了,但是如果我们把命令行窗口关闭的话,客户端会自动断掉,那么怎么解决这个问题呢?这里就用到了一个命令nohup,后台挂起进程,我们可以这样子写

nohup ./sunny clientid xxxxxhiwfjo

这样子即使我们关闭了命令行窗口,进程依然存在

但这样子还有一个问题:如果那天我们的树莓派需要重启,岂不是又要手动开启,因此我们可以像上面的上报IP地址一样的方式处理 -- 把它加入到开机自启动,如下

未完待续 ~