标签 干货 下的文章

文章更新

20170525 初次成文

问题提出

在实际网络环境中,树莓派常常处于内网环境下,由于内外网相互隔离的原因,我们无法在外网访问处于内网中的树莓派。为了解决这个问题,"内网穿透"技术应运而生。

FRP是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https协议。在这篇文章中,小苏将为大家介绍FRP服务端和客户端的配置,通过FRP,让树莓派穿透内网,使大家在外网环境下也能轻松访问处于内网中的树莓派~

本篇文章只做抛砖引玉目的 ,请大家在看完文章之后再仔细阅读一下FRP官方文档以了解详情~

解决方案

FRP是一个免费开源的项目,其代码托管在Github上:

FRP项目:
https://github.com/fatedier/frp/
FRP官方中文说明文档:
https://github.com/fatedier/frp/blob/master/README_zh.md
Release页面:
https://github.com/fatedier/frp/releases

FRP分为客户端程序和服务端程序两部分,其中,我们需要一台拥有公网IP的机器作为服务端。在Release页面,我们可以下载到已经编译好的适用于不同架构/平台的程序压缩包,每个程序压缩包中包含此架构/平台下的客户端和服务端。

截至本文发稿前,FRP的最近版本为0.10.0,这是一个包含了很多改动的版本,如果你使用的是旧版的frp程序,需要将客户端和服务端同时升级并重新配置。

由于树莓派的CPU是arm架构,所以我们需要下载frp_0.10.0_linux_arm.tar.gz,解压此文件后将得到:

frp_0.10.0_linux_arm
 ├─ LICENSE#版权许可
 ├─ frpc#arm架构的frp客户端程序
 ├─ frpc.ini#frp客户端配置说明文件
 ├─ frpc_min.ini#frp客户端最小化配置文件
 ├─ frps#arm架构的frp服务端程序
 ├─ frps.ini#frp服务端配置说明文件
 └─ frps_min.ini#frp客户端最小化配置文件

由于我们只需要arm架构的客户端程序,所以我们只需要其中的frpc这个文件,至于客户端配置文件,之后小苏会提供。

相似的,我们还需要获取FRP服务端程序,在此次配置过程中,小苏使用一台Debian系统,64位CPU的vps作为服务端载体,所以小苏需要在Release页面下载frp_0.10.0_linux_amd64.tar.gz,解压文件后得到:

frp_0.10.0_linux_amd64
 ├─ LICENSE#版权许可
 ├─ frpc#amd64架构的frp客户端程序
 ├─ frpc.ini#frp客户端配置说明文件
 ├─ frpc_min.ini#frp客户端最小化配置文件
 ├─ frps#amd64架构的frp服务端程序
 ├─ frps.ini#frp服务端配置说明文件
 └─ frps_min.ini#frp客户端最小化配置文件

相应的,frps这个文件是我们所需要的,其配置文件小苏之后会提供。

客户端(frpc)配置

得到所需文件后,我们开始配置frp的客户端程序:

使用SFTP连接到树莓派,将frpc传到树莓派的/bin目录,并且登入SSH,执行以下命令:

sudo chmod +x /bin/frpc
sudo touch /bin/frpc.ini
sudo vim /bin/frpc.ini

将以下内容粘贴进frpc.ini中,依实际情况修改后并保存(文末也提供单独的ini配置文件供大家使用):

[common]
server_addr = 123.123.123.123    #服务器公网IP
server_port = 7000    #frp服务端口,需与frps.ini相同
privilege_token = 123456      #特权模式密钥,需与frps.ini相同

log_file = /bin/frpc.log    #日志文件存储路径
log_level = info    #日志记录级别
log_max_days = 3    #日志最大存储天数
pool_count = 5
tcp_mux = true

[ssh]    #服务名称,可自定义
type = tcp    #协议类型(tcp)
local_ip = 127.0.0.1
local_port = 22    #本地SSH服务端口
remote_port = 2200    #穿透后SSH服务访问端口

[web]    #服务名称,可自定义
type = http    #协议类型(http)
local_ip = 127.0.0.1
local_port = 80    #本地web服务端口
use_encryption = false
use_compression = true
subdomain = web    #二级域名,建议与此项的服务名称"web"设置为相同
custom_domains = web.frp.com    #自定义域名

服务端(frps)配置

相似的,将frps文件上传到服务器的/bin目录下,登陆SSH,执行以下命令(命令基本相同,只不过上面是frpc这里是frps):

sudo chmod +x /bin/frpc
sudo touch /bin/frps.ini
sudo vim /bin/frps.ini

将以下内容粘贴到frps.ini中,依实际情况修改后保存(文末提供单独的ini配置文件供大家使用):

[common]
bind_addr = 0.0.0.0
bind_port = 7000    #frp服务端口,需与frpc.ini相同
vhost_http_port = 80    #http服务端口
vhost_https_port = 443    #https服务端口
dashboard_port = 7500    #控制台端口
privilege_token = 123456    #特权模式密钥,需与frpc.ini相同

log_file = /bin/frps.log    #日志文件存储路径
log_level = info    #日志记录级别
log_max_days = 3    #日志最大存储天数
max_pool_count = 5
authentication_timeout = 900

subdomain_host = frp.com    #服务端绑定域名
tcp_mux = true

值得说明的是,frps.ini中subdomain_host的域名需要泛解析到服务器的公网IP(比如*.frp.com),这个时候,如果客户端frpc.ini文件中的subdomain属性有定义(如web),则此服务绑定的域名为web.frp.com。

如果frpc.ini中定义了custom_domains属性,那么可以将custom_domains中提到的自定义域名解析到服务器所在的公网IP,方可正常使用该自定义域名访问此项服务。

在frps.ini中,vhost_http_port的值一旦被指定(如80),那么所有客户端中web服务映射到服务器中的端口都相同(都为80,比如http://web.frp.com:80),vhost_https_port同理。

dashboard_port属性指定了服务器的控制台端口(以7500为例),访问服务器ip:该端口(如http://123.123.123.123:7500),即可进入控制面板来查看frp服务的状态信息(默认用户名和密码都为admin)。

frpc.ini和frps.ini中注释未提到的内容可以在官方文档或压缩包中自带的配置说明文件frpc.ini/frps.ini中找到,未提到的内容大多为官方推荐配置,可直接应用。为节省篇幅,这里不再赘述。

测试frps服务(服务端)

配置文件配置完毕后,我们可以尝试在服务器端执行以下命令以启动frps服务:

(sudo) /bin/frps -c /bin/frps.ini

执行完毕后,frps服务将会在前台启动,且终端应该不会有输出(若终端有输出,可能在启动过程中出现了某些错误)。这时候我们使用Ctrl+C终止程序,执行cat命令查看日志文件:

(sudo) cat /bin/frps.log

如果日志文件中没有错误信息,那么说明frps服务端配置且启动正常。
Screenshot_20170525-215330~01.png

测试frpc服务(客户端)

类似的,在客户端(树莓派)中我们需要执行以下命令启动frpc服务:

sudo /bin/frpc -c /bin/frpc.ini

同理,执行完毕后,终端应该不会有输出,使用Ctrl+C终止程序,执行cat命令查看日志文件:

sudo cat /bin/frpc.log

若未出现错误信息,则说明frpc客户端配置且启动正常。
Screenshot_20170525-215015~01.png

启动FRP服务

将启动脚本(文末提供)startfrpc.sh传到客户端(树莓派)的/bin中,将启动脚本startfrps.sh传到服务端的/bin中,并且使用以下命令赋予这两个脚本可执行权限。

值得注意的是,在启动脚本中需要用到curl程序,## 若客户端/服务端中未安装curl,则应先安装curl## 。

sudo chmod +x /bin/startfrpc.sh #在客户端中执行
sudo chmod +x /bin/startfrps.sh #在服务端中执行

赋予可执行权限之后,在终端执行以下命令即可启动FRP:

sudo startfrpc.sh #客户端启动脚本
(sudo) startfrps.sh #服务端启动脚本

  

开机自启FRP服务

接下来,我们将让frps/frpc服务开机启动:

编辑客户端(树莓派)/etc/rc.local文件,在exit 0之前添加以下代码行:

# Start Frpc
/bin/startfrpc.sh >> /dev/null 2>&1

编辑服务端/etc/rc.local,在文件末尾添加以下代码行(如果文件末行为exit 0,则应该将以下内容添加到exit 0之前):

# Start Frps
/bin/startfrps.sh >> /dev/null 2>&1

这时,关机并重新启动客户端和服务端,待开机后,在客户端或者服务端中执行以下命令:

ps -A | grep frp

若返回类似结果则证明frps/frpc服务启动成功:

客户端:

1920 ?        00:00:00 startfrpc.sh
1925 ?        00:00:15 frpc

服务端:

1920 ?        00:00:00 startfrps.sh
1925 ?        00:00:15 frps

停止FRP服务

我们可以使用相同的命令查看FRP服务的PID,比如在服务端中执行:

ps -A | grep frp

例如终端返回:

1920 ?        00:00:00 startfrps.sh
1925 ?        00:00:15 frps

可以得到这两个进程的PID为1920和1925,我们可以使用kill命令杀掉这两个进程来停止FRP服务:

(sudo) kill 1920 1925

  
客户端停止流程同理。

资源下载

FRP.zip

解压此压缩包将会得到以下文件,对文件按需修改后按文章内容操作即可:

FRP
├─ frpc
│ ├── frpc.ini#未添加注释的示例frpc.ini
│ ├── frpc_note.ini#添加注释的示例frpc.ini
│ └── startfrpc.sh#frpc启动脚本
└─ frps
├── frps.ini#未添加注释的示例frps.ini
├── frps_note.ini#添加注释的示例frps.ini
└── startfrps.sh#frps启动脚本

文章更新

20170410 初次成文

问题提出

其实这篇文章构思很久了,拖到现在才写...原因就在于在Linux Deploy上部署图形环境是一件坑多活累的工作:一来是因为兼容性原因,部署好的图形界面环境存在数量可观的Bug,并且小苏也无力解决这些Bug。二来是因为基础的Linux环境才是图形界面环境部署的前提,而最近由于各种原因,使用原始的部署方法已经越来越难部署成功基础的Linux环境了。

但这样看来,第一点倒不是什么大问题:毕竟手机不是为运行专业的Linux发行版而生,所以存在Bug是难免的,只要图形界面能部署成功并且大家可以正常进入图形界面,小苏的任务就完成了。问题就在于第二点:由于国内网络运营商的DNS污染与镜像源站的同步原因,基础的Linux环境能否正常部署成功都是个问题,更别说图形界面的部署了。

解决方案

所以在这篇文章中,小苏将直接使用上一篇文章中提到的的方法,在此基础上部署图形环境:

Linux Deploy:使用Repository部署Linux系统

因为作者的Repository中包含了基础的Linux环境组件,我们可以将作者的Repository导入镜像来直接部署好Linux基础环境,再在此环境之上部署图形界面。这么一来,基础的Linux环境是否部署成功就不是我们担心的问题了。

所以在这里,小苏默认你已经阅读完上一篇文章的内容,并且根据上一篇文章的方法成功部署了基础的Linux环境。

进入Linux Deploy,点击右下角的"下载"图标进入配置界面,保持其他选项不变,修改以下配置项:

INIT:
打勾:启用自定义脚本执行
(INIT的其他配置保持不变)

图形界面:
打勾:允许图形界面启动
图形子系统:VNC
图形化界面设定:保持默认配置
桌面环境:按需选择,小苏这里选择的是Xfce
(实际上小苏也推荐大家选择Xfce,原因在于XTerm太过简陋,LXDE桌面环境倒是好一些,但是"ubuntu-lxde_arm"这个Repository是免费的,可以直接导入作者为我们部署好的ubuntu+ssh+lxde+vnc环境,而Mate桌面环境需要下载更多的软件包和依赖组件,且Bug数量更为可观)

2017-04-10_5_12_10_下午.jpg

2017-04-10_5_12_23_下午.jpg

2017-04-10_5_12_29_下午.jpg

配置完毕后,回到主界面,按下"菜单键",选择"配置"让我们刚才的的设置生效:

2017-04-10_5_21_25_下午.jpg

2017-04-10_5_21_31_下午.jpg

配置完毕后,点击底部的"停止"按钮停止Linux系统,再点击"启动"按钮启动Linux系统,接着我们登入SSH,在终端中执行:

sudo apt-get install ttf-wqy-zenhei #安装中文字库

中文字库安装完毕后,执行以下命令启动VNC:

vncserver

终端会返回以下结果:

New 'X' desktop is localhost:1

Starting applications specified in /home/android/.vnc/xstartup
Log file is /home/android/.vnc/localhost:1.log

证明vncserver已启动成功。

(注意,在某些时候,第一次执行vncserver命令时系统将要求你设定一个小于8位数的VNC密码,你需要输入两次密码之后提交,VNC密码设定完成之后还会有一个提示,不用理会,键入n提交即可)

进入图形界面

接着我们使用VncViewer来连接到我们刚刚部署好的的图形界面:

打开VncViewer,点击右下角的"+"按钮添加VNC会话:

Address:
127.0.0.1:5901
Name:
Localhost - Ubuntu@Xfce

其中,"Address"项为VNC服务器所在的地址。由于我们需要连接本机的VNC服务器,所以填写127.0.0.1即可,此外我们还需要在地址后指定VNC端口,因为刚刚终端返回的信息:New 'X' desktop is localhost:1指定了此次桌面会话号为1,所以端口就为5900+1=5901。如果我们开启了多个虚拟桌面,它们的会话号为2,3,4...,那么各自的端口即为5902,5903,5904...依次类推。并且,服务器地址与端口之间需要用英文冒号隔开。"Name"项为用户为此VNC会话指定的地址,我们为了区别其他会话,填写的是Localhost - Ubuntu@Xfce,实际上随便填写什么都可以。

这些信息填写完毕后,点击"CREATE"按钮提交:

2017-04-10_7_03_42_下午.jpg

2017-04-10_7_03_47_下午.jpg

确认信息无误后,点击下面绿色的"CONNECT"按钮开始连接VNC会话(如果你之前没有设定过VNC密码,但在连接VNC连接过程中仍然需要你输入密码时,那么你可以输入android用户的密码试试):

2017-04-10_7_08_13_下午.jpg

2017-04-10_7_08_19_下午.jpg

好了...图形界面的部署过程到此为止,剩下的你们自己折腾吧(/doge脸)~

可能遇到的问题

  1. 当你开启了一个VNC会话,停止Linux系统再启动Linux系统后,再次执行vncserver命令,系统可能会报出以下错误:

2017-04-10_9_03_44_下午.jpg

这时候,你可以执行以下两条命令:

rm -rf /tmp/.X[1-9]-lock
rm -rf /tmp/.X11-unix/X[1-9]

执行完毕后,再执行vncserver,会话号就会被重置为1了。为了防止每次停止再启动Linux系统后带来的这个问题,我们可以编辑/etc/rc.local文件,在此文件的exit 0之前插入这两条命令:

sudo vim /etc/rc.local #编辑/etc/rc.local

2017-04-10_9_13_26_下午.jpg

编辑完成后,保存即可,进行这步操作后,在启动Linux系统后和停止Linux系统之前,Linux Deploy都会替我们执行这两条命令,这样一来之后就不会再报错了~

  1. vncserver默认的分辨率是1024×768,但市面上的大部分手机屏幕的分辨率都是720P(1280×720),1080P(1920×1080),甚至2K(2560×1440),vncserver默认的1024×768分辨率可能会造成VNC画面不能填充满屏幕的情况,这时候,我们有必要修改VNC分辨率以适应屏幕,经过测试,拿小苏的1080P屏幕来说,将分辨率设为为720P可使VNC图像充满屏幕且不影响显示效果。调节方法就是在每次执行vncserver命令时在后面加上-geometry参数,例如我需要把VNC分辨率调为720P(1280×720),那么在启动vncserver时,执行:

vncserver -geometry 1280x720

即可将新开启的VNC虚拟会话屏幕分辨率设为1280×720。值得注意的是,命令中的1280x720里的x是小写字母x,而不是数学中的乘号×

下面是1280×720分辨率和1024×768分辨率的对比(将VNC Viewer画面缩小到最小):

2017-04-10_9_41_37_下午.jpg

2017-04-10_9_41_42_下午.jpg

很明显,在小苏的1080P屏幕上,将VNC分辨率设为1280×720可使图像填充满屏幕且视觉效果更佳。

如果你觉得每次启动vncserver时输这么一长串命令有点儿麻烦,那么可以编辑~/.bashrc文件,在下图所示的位置增加一行alias定义:

vim ~/.bashrc #编辑~/.bashrc

alias vncserver='vncserver -geometry 1280x720' 

2017-04-10_9_50_55_下午.jpg

之后,每次执行vncserver命令后,新开启的VNC会话的分辨率都会被设为1280×720。

资源下载(VNC Viewer)

酷市场:

http://www.coolapk.com/apk/com.realvnc.viewer.android

Google Play:

https://play.google.com/store/apps/details?id=com.realvnc.viewer.android

文章更新
20170408 初次成文

问题提出:
在之前的文章中,小苏为大家介绍过使用常规方式和使用镜像方式部署Linux系统的方法,但是这两种方法各有利弊:

使用常规方式部署时,镜像大小可以灵活调节,但这种方法需要设备在连接网络的情况下下载大量数据,由于运营商的DNS污染或者由于镜像源站同步的原因,即使更换软件源为国内镜像源,部署时也总会出现部署失败的提示。使用镜像方式部署Linux系统时,虽然可以免去部署时下载大量数据的麻烦,但是使用别人部署好的镜像,初始实现的功能依别人部署好的镜像而定,不能个性化定制系统,也不能调整镜像大小。

所以,有没有一种部署成功率比较高,又不需要从软件源站下载大量数据,且可以灵活调整镜像大小的部署方式呢?

答案当然是肯定的。那就是先在Linux Deploy中部署和安装所需要的环境和软件包,然后使用Linux Deploy的导出功能,将Rootfs打包为tar.gz文件,之后,我们只需要将此tar.gz文件导入Linux Deploy,就可以完整还原打包时的Linux系统了。

解决方案:
贴心的作者为我们做好了一些基础的Rootfs以方便我们部署Linux系统,这些Rootfs放置在Linux Deploy的"Repository"中,有些遗憾的是,这些Repository大多是需要到Play商店购买后才能被导入进Linux Deploy中的,但是小苏注意到,有一些Repository似乎可以无需购买,直接导入,比如debian_arm这个Repository:

2017-04-08_4_36_14_下午.jpg

导入此Repository后,回到Linux Deploy主界面,点击右下角的"下载"图标进入配置界面,我们可以看到"源地址"已经被配置为一个远程服务器上的tgz(tar.gz)文件:

2017-04-08_4_37_54_下午.jpg

我们观察这项配置:

http://hub.meefik.ru/rootfs/debian_arm.tgz

似乎就是http://hub.meefik.ru/rootfs/加上Linux Deploy中各"Repository"的名称。

我们拿一个需要付费的的Repository试一下:

http://hub.meefik.ru/rootfs/archlinux_arm.tgz

2017-04-08_4_48_17_下午.jpg

2017-04-08_4_50_19_下午.jpg

似乎还真的是可用的...
所以...看起来这是个彩蛋(喵喵脸)...

于是,在Linux Deploy中,各Repository的真实地址如下:

开始配置:
我们可以根据这些Repository下的提示,修改配置文件,由于各Repository的发行版,架构和版本都已经在说明中指定了,比如ubuntu_arm这个Repository:

ubuntu_arm
Ubuntu 16.04 LTS (Xenial Xerus) ARM base system.)

在描述中指定了此Repository对应的发行版是Ubuntu,版本是Xenial,架构为ARM(armhf)。这也意味着,我们必须在配置界面填写与选择的Repository相同的信息。比如我们选定ubuntu_arm这个Repository来部署Linux系统,那么我们只需要进行以下几步操作:

1.下载此tar.gz文件:

http://hub.meefik.ru/rootfs/ubuntu_arm.tgz

并且记好此文件的路径,下面以下路径为例:
/storage/emulated/0/Download/ubuntu_arm.tgz

2.新建一个配置文件,进入配置界面,做以下配置(未提到的项请保持默认设置):

Containerization method:chroot
发行版:Ubuntu
架构:armhf
发行版版本:xenial
源地址:/storage/emulated/0/Download/ubuntu_arm.tgz
(即刚刚下载的tgz文件存放的路径)
安装类型:文件
(即使用"镜像"方式部署Linux系统)
安装路径:自定
(安装路径代表镜像文件存放的路径,下图以/storage/emulated/0/Linux/ubuntu_arm.img为例)
镜像大小:自定
(即部署完成后,Linux系统的"本地磁盘"大小,下图以1024m为例,不建议超过4096m)
用户名:android
(即部署完成后,系统默认的普通用户)
密码:自定
(此普通用户的密码,下图以sun12345为例)
Privileged user:root messagebus
(这一项照着填就好)
本地化:zh_CN.UTF8
(即部署完成后,Linux系统的语言环境,zh_CN.UTF8指语言环境为中文,如果喜欢英文语言环境,选择en_US.UTF8即可)
SSH:
打勾:允许SSH服务器启动("SSH"的其他项保持默认设置)

2017-04-08_7_10_07_下午.jpg

3.配置完成后,我们就可以开始部署Linux系统了。在部署之前,小苏强烈建议大家挂国外梯子进行部署。因为在Repository中,作者使用各发行版的官方软件源作为软件源,这样一来,一是服务器节点远离中国,软件包下载速度一般都很慢,二是在我国ipv6还未普及,使用官方软件源在部署过程中有一定几率解析到ipv6地址,出现无法连接到服务器的情况并造成部署失败的情况。

挂好梯子后,我们回到Linux Deploy的主界面,按下菜单键,选择"安装"开始部署:

2017-04-08_7_20_02_下午.jpg

2017-04-08_7_20_53_下午.jpg

我们可以看到,从开始部署(19:15:19)到完成部署(19:17:05),仅仅用了1分44秒的时间就可部署完毕。并且整个过程中只需要下载附加组件(本次部署只启用了SSH连接,所以在部署过程中只下载了SSH有关的软件包,如果你启用了图形界面,在这个过程中还会下载图形环境和VNC等组件)。

如果你想部署图形界面,请看这篇文章:

Linux Deploy:部署图形界面环境

资源下载:
如果上面的官方Repository下载太慢或者无法下载的话,可以试试小苏离线到PCloud中的Repository:

PCloud:
https://my.pcloud.com/publink/show?code=kZVAOIZuQvQ3cdywbVO1WUMpW135Rfy1MjV
(但在网络通畅的情况下小苏还是首推官方的Repository,毕竟PCloud免费账户每月只有50G的下载流量/doge脸)

文章更新

20170328 初次成文
20170417 更正了有关Autojump的内容

问题提出

今天小苏要为大家介绍的是如何在树莓派上安装和配置zsh,zsh和系统默认的bash一样,都是Linux系统的一种Shell。相对于默认的bash来说,zsh的长处在于自定义与可扩展程度强,人性化程度高。在写这篇文章之前,小苏拿"树莓派 zsh"做关键词在Google上搜索了一下,搜索结果中似乎没有文章能比较系统地介绍如何在树莓派上安装和配置树莓派,所以干脆自己写一篇喽~

正文开始(以下内容默认针对于树莓派的默认用户pi):

安装zsh

首先我们执行以下命令查看一下系统对各Shell的支持情况:

cat /etc/shells

在终端返回的结果中,可能会看到/bin/zsh/usr/bin/zsh的字样,如果没有看到也没关系,我们可以接着进行下一步:

sudo apt-get update #更新软件源索引
sudo apt-get install zsh #安装zsh

zsh安装完成后,再次执行:

cat /etc/shells

不出意外的话,终端应该会返回包含/bin/zsh`0或/usr/bin/zsh字样的结果了。

基础配置

下面我们使用oh-my-zsh来配置zsh,oh-my-zsh是一个快速&自动化配置zsh的项目,项目地址:https://github.com/robbyrussell/oh-my-zsh

cd ~
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh #下载并执行oh-my-zsh自动配置脚本

执行此命令后,脚本将会下载zsh所需的资源和配置文件至~/oh-my-zsh/目录,并将根据你的系统环境变量完成对zsh的配置。

接着,我们可以执行以下命令将zsh切换为此用户的默认Shell(可能需要pi用户的密码):

chsh -s /bin/zsh #无需加sudo

退出终端并再次登录终端,这时命令指示符应该有变化了,说明zsh的基础配置完成。

进阶配置

接着我们对zsh进行"进阶配置"(这里先说配置,之后会对这些配置进行解释):

我们通过更改~/.zshrc文件来对zsh进行进一步的配置:

cd ~
vim .zshrc #编辑zsh配置文件

根据小苏的习惯,对此文件的更改如下(以下内容已包含在原文件中,我们仅需要对其进行修改即可):

ZSH_THEME="blinks"    #将zsh的主题更改为blinks
ENABLE_CORRECTION="true"    #(去掉ENABLE前的"#")打开zsh的自动纠错功能
plugins=(git sudo)    #为zsh添加git和sudo插件

将以下内容添加到文件的末尾以重定向默认命令或添加自定义命令:

# Alias Settings
alias ll='ls -all'
alias vi='vim'
alias ps='ps -A'
alias ifconfig='sudo ifconfig'

其中,alias ifconfig='sudo ifconfig'这一句比较重要,如果不加此内容,在pi用户下可能会出现无法执行ifconfig命令的情况。

我们还可以安装Autojump插件,以实现快捷定位常用目录(需要在安装之前配置Python环境):

cd ~
git clone git://github.com/joelthelion/autojump.git #从Github克隆Autojump项目
cd autojump
sudo chmod 755 install.py
./install.py #执行安装脚本,安装Autojump

在脚本执行结果的末尾,你将会看到类似这样的内容(实际内容可能不一样):

[[ -s /home/pi/.autojump/etc/profile.d/autojump.sh ]] && source /home/pi/.autojump/etc/profile.d/autojump.sh
autoload -U compinit && compinit -u

复制终端中这段内容,添加到~/.zshrc文件末尾即可启用Autojump。接着,我们可以执行以下命令重载.zshrc文件以更新zsh配置:

source .zshrc #重载zsh配置文件

关于"进阶配置"的解释

1.开启自动纠错:

当纠错功能开启后,当你键入的命令被zsh判定为"可能错误的命令"时,将会提示你是否将此命令重定向为"zsh认为可能正确的命令",比如键入iconfig命令时,zsh将会返回以下提示:

zsh: correct 'iconfig' to 'ifconfig' [nyae]?

键入 y 即可将刚刚输入的iconfig命令重定向到ifconfig命令:

2017-03-28_6_21_49_下午.jpg

2.开启sudo插件:

开启sudo插件后,如果遇到上一条命令因为未在命令头部添加sudo命令而保存的情况时,只需要双击"Esc"键,即可自动为刚才键入的最后一条命令补全sudo。

3.重定向默认命令或添加自定义命令:

在.zshrc文件中添加alias字段即可重定向默认命令或添加自定义命令,如在终端中执行ll命令,相当于执行ls -all文件,执行ps命令则相当于执行ps -A命令:

2017-03-28_6_22_11_下午.jpg

4.添加并启用Autojump插件:

启用Autojump插件后,插件将记录你经常定位的目录,存储到数据库中,当之后想要访问此目录时,只需要键入:

j <目录简称>

即可快速定位。比如/var/www/html是我经常定位的目录。如果我想快捷访问此目录,只需要键入:

j html

即可快速定位。

Screenshot_20170417-101520.png

参考资料

oh-my-zsh配置你的zsh提高shell逼格终极选择:
http://yijiebuyi.com/blog/b9b5e1ebb719f22475c38c4819ab8151.html

高效Linux之autojump的安装、配置与使用:
http://www.linuxdiyf.com/linux/13711.html

文章更新

20170221 初次成文
20170418 修改"SSH配置"内容

不务正业的小苏又来了~

这些日子小苏入了一款适用于树莓派的Dac扩展板,可以将音频文件解码为模拟信号通过3.5mm插孔或者通过双莲花插口输出。相应的,需要专用的系统Volumio2来驱动这块Dac扩展板。

为什么要专门写这篇文章呢?因为在可被百度搜索到的中文网页中,有关Volumio配置的中文文章少之又少,不得已,小苏只好把目光转向了谷歌。在爬了若干英文资料后,小苏终于解决了一个又一个的坑,成功配置好了Volumio2。

在这篇文章中,小苏使用的扩展板型号是PiFi Dac+ V2.0,Volumio版本为发文时的最新版Volumio2.041 (2016-12-12)。

折腾记录

1.系统烧写:

烧写Volumio的步骤和烧写Raspbain的步骤是一样的。在Windows下可以使用win32diskimager烧写镜像至SD卡,在Linux下可以使用dd命令烧写镜像。Windows下烧写镜像的文章有很多,如果你想在Linux下烧写镜像,可以参考这篇文章:

Linux命令行烧录树莓派镜像至SD卡 - 树莓派实验室

稍稍告诉你,如果你有两张SD卡,并且其中的一张安装了Rasbain或者其他适配于树莓派的Linux系统时,也可以在树莓派上使用dd命令,将镜像烧写到另一张SD卡。

Volumio的镜像文件可以在这里下载到:

https://github.com/volumio/Volumio2/releases

2.上电开机:

将Volumio镜像烧写到SD卡后,将SD卡插入树莓派,将Dac扩展板下的插槽插入树莓派的GPIO引脚后,就可以上电开机了。上电后,Dac扩展板上的红色指示灯(电源指示灯)会亮起,代表扩展板通电正常。初次开机花费的时间比较长,可能需要5分钟左右的时间,在这段时间内,Volumio会自动执行系统初始化,扩展SD卡分区等工作。等待这些工作进行完毕后,Volumio会开启一个名为"Volumio",密码为"volumio2"(注意大小写,密码中的"v"为小写,热点名称中的"V"为大写)的热点方便用户配置。这个热点的开启也标志着Volumio开机成功。

3.语言配置:

连接此热点后,我们可以通过在浏览器地址栏中输入:http://volumio.local或者http://192.168.211.1/来登陆Volumio的WebUI。由于Volumio的WebUI语言默认为英文,所以我们需要依次点击"齿轮图标" - APPEARANCE - Select Language - 简体中文 来将WebUI的语言设置为简体中文(下图为语言变更前的截图,点击"Save"按钮后语言就会被更改为中文了~)。

Screenshot_20170220-223357.png

4.Dac设置:

直插Dac扩展板之后是不能直接播放声音的。还需要在"播放选项"中对Dac进行一番设置。小苏的设置图如下:

Screenshot_20170220-222914.png

按照图中设置完毕后,对于DAC Model设置这一块,做出更改后理论上是不需要重启就可以生效的(仅仅是对于我这块PiFi Dac+ v2.0或者是对于HiFiBerry Dac+来说,其他板子还是需要重启才能生效的),但是为了保险起见,小苏还是推荐大家在更改DAC Model后进行一次重启操作("齿轮图标" - 关机 - 重启),确保驱动正常工作无误。

5.SSH配置:

Volumio默认开启了SSH服务,所以当你的设备与树莓派处在同一WIFI网络下时,可以通过SSH连接到树莓派。这也就意味着你可以通过SSH连接到Linux终端对树莓派进行命令行操作,也可以通过SFTP连接到树莓派进行文件的传输与管理操作。因为Volumio基于Rasbain,所以Volumio在终端的很多操作与Rasbain相似。值得说明的是,在Volumio2.0中,默认的SSH帐号不是pi而是volumio,默认的密码不是raspberry而是volumio。也就是说,在Volumio中,登陆SSH的默认帐号密码都是volumio

通过SSH连接到终端后,终端会输出以下欢迎界面:

Screenshot_20170220-234000.png

因为Volumio基于Rasbain,所以我们可以像在Rasbain上一样,对Volumio进行更换软件源,安装软件等操作。详情可以参考我的这篇文章:

树莓派折腾记:琐碎小笔记

同时,给Volumio执行sudo apt-get upgrade等升级命令是无法正常升级的,原因是Volumio的正常运行需要某些包的支持,升级后可能导致这些新版本的包不再兼容Volumio而损坏系统,所以不要给Volumio执行升级(upgrade)操作,即使你这么做了,你也无法升级成功。

6.播放音乐

进行了前面那么多配置,终于到了最激动人心的时刻了。Volumio支持播放本地音乐(即存放在SD卡中的音乐文件),USB存储中的音乐(即标准USB存储设备中的音乐文件),还支持播放NAS中的音乐。当你插入USB存储设备或者连接到NAS后,Volumio会自动挂载这些设备并在"Browse界面" - 音乐库中显示出来。那么问题来了,本地音乐应该放到什么地方呢?是不是把音乐文件放到SD卡的任何一个目录Volumio都能识别并且能在"音乐库"中显示出来呢?

当然不是~

对于本地音乐,最好的方式是将它们通过SFTP上传到/data/INTERNAL/目录下,并且最好按照自己的播放习惯分文件夹存储(当然不分文件夹存储也可以,但是如果把所有音乐文件直接塞到INTERNAL目录下,从"音乐库"中加载文件时可能会很费劲),如果不把音乐文件存放在/data/INTERNAL/下,Volumio很可能无法识别,即使能够识别,也有可能出现无法播放的情况。

在Volumio官方社区给出的一种方式是将音乐文件存放到/home/volumio/music/下,然后将/home/volumio/music链接到/var/lib/mpd/music/下,小苏试了一下,这种方法在Volumio2.0上似乎并不可取,使用这种方法会出现可以识别音乐文件但是无法播放的情况。也许这种方法在Volumio1.x下可行吧~

(这是小苏推荐的本地音乐文件存放方式:)

Screenshot_20170221-000814.png

到此为止,小苏关于Volumio的介绍就结束了~下面看看Volumio的WebUI截图吧~

Screenshot_20170219-204052.png

Screenshot_20170221-000346.png

Screenshot_20170221-000337.png

Screenshot_20170221-000459.png

Screenshot_20170221-000826.png

参考资料

Volumio2 Github项目:

https://github.com/volumio/Volumio2/

Volumio 官方帮助文档(docs):

https://volumio.github.io/docs/index.html

Linux命令行烧录树莓派镜像至SD卡 - 树莓派实验室:

http://shumeipai.nxez.com/2013/12/08/linux-command-line-burn-raspberry-pi-mirror-to-sd-card.html

文章更新

20161212 初次成文
20170601 更新多站点的部署方式并增加注意事项

问题提出

谈到树莓派能折腾些什么,不得不提的就是把树莓派部署所需环境在小派上跑网站了。在这篇文章中,小苏会向大家介绍如何在树莓派上部署LNMP环境并实现多站点访问。

由于树莓派在软件和硬件上的更新,互联网中大多数有关在树莓派上部署LNMP环境的教程大多基于"树莓派2代",经过小苏的测试,这些教程已经不再适用于小苏手中的"树莓派3代"了,经过一番搜索和折腾,小苏最终找到了使用于3代的部署教程,并且经过进一步折腾,终于在树莓派3代上成功实现了"多站点共存"。

解决方案

  1. 做一些准备工作:

sudo apt-get update #更新软件源索引
sudo apt-get upgrade #更新已安装的软件(可选)

  1. 安装Nginx,PHP,MySQL和它们的一些依赖组件:

sudo apt-get install nginx php5-fpm php5-cgi php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-memcache php5-gd php5-sqlite php5-cgi php5-xmlrpc mysql-server mysql-client

值得一提的是,这个过程是直接安装编译好的deb包,而不是下载源码另外编译,但即使如此,这个过程还是可能需要较长时间。

在安装过程中,需要用户输入MySQL的Root用户密码,按提示输入,输入完成按"回车键"即可提交。

  1. 安装phpmyadmin:

sudo apt-get install phpmyadmin

在安装过程中需要用户选择已安装的服务器类型,有apache和lighthttpd两个选择,但我们刚刚安装的nginx却不在选择列表内,选择apache即可,没有影响。

如果你在安装phpmyadmin的过程中遇到了类似以下内容的提示,可以按Tab键切换光标,选择"Yes"后按Enter键确认以进行接下来的操作(若未遇到此提示请忽略):


The phpmyadmin package must have a database installed and configured before it can be used. This
can be optionally handled with dbconfig-common.
If you are an advanced database administrator and know that you want to perform this configuration
manually, or if your database has already been installed and configured, you should refuse this
option. Details on what needs to be done should most likely be provided in
/usr/share/doc/phpmyadmin.

Otherwise, you should probably choose this option.
Configure database for phpmyadmin with dbconfig-common?

在安装过程中还需要MySQL的Root用户密码,输入刚刚设置好的即可,并且还需要输入phpmyadmin的管理密码,输入并按回车键提交即可。

安装phpmyadmin完成后,我们需要创建一个链接将phpmyadmin文件夹链接到Nginx的网页文件夹中:

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

  1. 配置Nginx网站文件夹属性:
    将Nginx默认的网页文件夹:/var/www/html/赋予可执行权限,并且将其用户组改为"www-data"。

sudo chmod 755 /var/www/html/ #将/var/www/html/文件夹赋予可执行权限
sudo chown -R www-data:www-data /var/www/html #将/var/www/html/文件夹的用户组改为"www-data"

  1. Nginx配置:
    在这一步中,我们通过修改Nginx站点属性文件来配置Nginx:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak #备份Nginx默认站点属性文件
sudo vim /etc/nginx/sites-available/default #使用vim编辑默认站点属性文件

在vim中,我们清空原文件的内容,粘贴以下内容:


server
{
    listen       80;
    server_name yourdomain.com; #server_name end
    index index.html index.htm index.php; #index end
    charset utf-8;

    root  /var/www/html;

    location ~ .*\.php(\/.*)*$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)$
    {
        expires      12h;
    }

    access_log off; #access_log end
    error_log /dev/null; #error_log end
}

其中,我们需要修改文件中的"yourdomain1.com"为你想要绑定的域名,其他保持默认,保存文件。

这个站点为默认站点,所谓的默认站点,为访问者访问树莓派的IP地址后显示在访问者屏幕上的站点。

保存文件后我们需要重启一下Nginx:

sudo service nginx restart #重启Nginx服务

  1. 做完这一步后,访问"http://你的树莓派IP地址/phpmyadmin"即可看到phpmyadmin的登陆页面,代表LNMP环境部署成功。

至此为止,LNMP环境部署成功,我自己折腾的时候卡在第5步好久,最后以AMH面板的配置文件为基础,结合教程中fastcgi部分重新做了一份配置文件,终于成功(捂脸哭)。

下面开始介绍LNMP的多站点配置过程:

LNMP环境搭建完成后,如果你想在树莓派上部署多个网站,可以通过下面的方式操作:

在Nginx中实现多站点共存的方式是在/etc/nginx/conf.d中新建多个后缀为conf的多站点配置文件。

  1. 配置第二个站点:
    接下来我们创建第二个站点:站点文件夹路径为/var/www/site1,第二个站点的配置文件为/etc/nginx/conf.d/site1.conf ,其中,站点文件夹可以在网站配置文件(/etc/nginx/conf.d/site1.conf)中更改。

首先我们建立并配置第二个站点文件夹:

cd /var/www #将工作目录定位到/var/www
sudo mkdir site1 #新建第二个站点的网站文件夹
sudo chmod 755 ./site1 #赋予site1文件夹可执行权限
sudo chown -R www-data:www-data ./site1 #将site1文件夹的用户组改为"www-data"

配置站点配置文件/etc/nginx/conf.d/site1.conf:

sudo vim /etc/nginx/conf.d/site1.conf #新建site1.conf文件

将下面的内容粘贴到site1.conf中,修改domain2.com为你绑定的域名,保存并退出vim:


server
{
    listen       81;
    server_name domain2.com; #server_name end
    index index.html index.htm index.php; #index end
    charset utf-8;

    root  /var/www/site1;

    location ~ .*\.php(\/.*)*$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)$
    {
        expires      12h;
    }

    access_log off; #access_log end
    error_log /dev/null; #error_log end
}

其中,81为此站点监听的端口,你也可以将此端口改成你想要的其他端口(只要不与其他服务的端口冲突就可以)。

接下来,我们重启Nginx服务:

sudo service nginx restart #重启Nginx服务

  1. 在局域网中访问部署在树莓派中的多个站点:
    在上面的步骤中,我们在Nginx中部署了多个站点,在局域网下的其他设备上,我们可以通过在树莓派的IP地址后加入各站点的监听端口来实现。

在上面的步骤中,默认站点的监听端口为80,所以我们可以直接访问树莓派的IP地址(IP地址后无需增加端口)即可访问到默认站点,比如树莓派在局域网中的IP地址为192.168.123.152,那么我们直接在同局域网下的其他设备的浏览器中输入:

http://192.168.123.152/

即可访问默认站点,如果你是按以上方法配置的,访问第二个站点只需要在树莓派的IP地址后加入:监听端口号,因为第二个站点的监听端口号为81,所以我们在同局域网下的其他设备的浏览器中输入:

http://192.168.123.152:81/

即可访问到第二个站点。

参考资料

在Raspberry Pi 3上搭建Typecho+LNMP:
http://www.51hei.com/bbs/dpj-55369-1.html

树莓派从系统安装到搭建nginx+php+mysql - hongfeizhou:
http://www.cnblogs.com/hongfeizhou/p/5307013.html

文章更新

20161210 初次成文

树莓派上电开机并且成功登陆之后,我们就可以愉快地折腾了,在这篇文章中,小苏会说一些"琐碎"的内容,虽然说起来"琐碎",但是这些内容可以帮助我们更方便地玩转树莓派。

  1. 解锁Root用户:

许多操作需要在Root用户下才可以进行,而默认情况下树莓派的Root用户为锁定状态,所以我们首先需要解锁树莓派的Root用户:

sudo passwd root #设置Root用户的密码,期间会让你输入两次密码(输入密码的过程中不会有任何内容提示,连*号都不会显示)
sudo passwd --unlock root #解锁Root用户

  1. 扩展SD卡上的可用空间:

在默认情况下,树莓派并不会将SD卡上的所有空间全部利用起来,不管你的SD卡有多大,在未扩展SD卡可用空间的情况下,树莓派只会将镜像写入SD卡时的镜像大小(4G多一点)当做其全部可用空间。为了充分利用SD卡空间,我们需要对树莓派进行扩展可用空间的操作:

sudo raspi-config #打开树莓派的基本配置面板

在树莓派的配置面板中,选择"Expand Filesystem",按下"Tab"键切换到"<Finish>",在"<Finish>"上按下"回车键"提交你的选项。提交并且重启后即可完成SD卡可用空间的扩展。

  1. 更换软件源为中科大源:

树莓派连接到网络之后,我们就可以为树莓派安装软件了。但由于树莓派默认软件源在英国的原因,在下载软件包时速度非常感人。为了不下载一天一夜,在安装软件之前我们需要修改树莓派的默认软件源为国内镜像源。

这里以中科大源为例(虽然在小苏这儿中科大源速度也不怎么样,不过速度肯定是比默认源好太多了,而且树莓派需要的两个源在中科大镜像源中都有):

sudo vi /etc/apt/sources.list #用vi编辑器打开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

# USTC source:

deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ jessie main contrib non-free rpi

同样我们修改树莓派的第二处源地址:

sudo vi /etc/apt/sources.list.d/raspi.list #用vi编辑器打开raspi.list


#deb http://archive.raspberrypi.org/debian/ jessie main ui

# Uncomment line below then 'apt-get update' to enable 'apt-get source'

#deb-src http://archive.raspberrypi.org/debian/ jessie main ui

# USTC source:

deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/ jessie main ui

修改完成后,执行以下命令更新源索引:

sudo apt-get update #更新软件源索引

  1. 允许Root用户登陆Openssh(SSH+SFTP)服务:

为了系统安全,在默认情况下,树莓派是不允许用户以Root身份直接登录Openssh服务的。这样在SSH中虽然没有什么问题(用户可以通过sudo命令临时取得Root权限),但是在SFTP中就有点儿麻烦了。因为在普通用户在SFTP中的控制权很小,操作系统文件(比如删除,重命名,移动等)不是特别方便,所以我们有必要允许Root用户登陆Openssh服务。

以下操作可以允许用户直接以Root身份登陆SSH和SFTP,但为了系统安全,小苏强烈推荐使用pi(也就是普通用户)身份登录SSH,而SFTP的话,可以使用Root身份登陆,但使用SFTP管理文件时,一定要注意安全。

修改完软件源之后就可以安装软件了,个人来说,小苏不是特别习惯用vi,那么第一步先安装vim吧:

sudo apt-get install vim #安装vim编辑器(可选)
sudo vim /etc/ssh/sshd_config #使用vim编辑器打开/etc/ssh/sshd_config文件

在文件内容中找到# Authentication部分,将其下的PermitRootLogin项的值改为"yes":

保存并退出vim编辑器后,重启系统:

sudo init 6 #安全重启系统

系统重启后即可通过Root身份登陆SSH和SFTP。