树莓派系列(二)- 实战应用案例
记录了自己使用树莓派期间的所有使用笔记记录-前人栽树后人乘凉也为了自己以后可以快速查找备忘。
Docker基本入门
docker基本安装
使用 APT 安装
由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
|
|
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
|
|
然后,我们需要向 source.list
中添加 Docker CE 软件源:
|
|
以上命令会添加稳定版本的 Docker CE APT 源,如果需要最新版本的 Docker CE 请将 stable 改为 edge 或者 test。从 Docker 17.06 开始,edge test 版本的 APT 源也会包含稳定版本的 Docker CE。
安装 Docker CE
更新 apt 软件包缓存,并安装 docker-ce
。
|
|
一键安装docker到树莓派
|
|
启动 Docker CE
|
|
安装docker compose (可选)
|
|
建立 docker 用户组
默认情况下,docker
命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root
用户和 docker
组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root
用户。因此,更好地做法是将需要使用 docker
的用户加入 docker
用户组。
建立 docker
组:
|
|
将当前用户加入 docker
组:
|
|
退出当前终端并重新登录,进行如下测试。
注意: ARM 平台不能使用 x86
镜像,查看 Raspbian 可使用镜像请访问 arm32v7。
从官方打包好的deb包安装docker
Go to https://download.docker.com/linux/debian/dists/, choose your Debian version, browse to
pool/stable/
, choose eitheramd64
orarmhf
, and download the.deb
file for the Docker CE version you want to install.sudo dpkg -i /path/to/package.deb
docker 卸载
|
|
docker基本命令
docker 加速
对于使用 systemd 的系统,用 systemctl enable docker
启用服务后,编辑 /etc/systemd/system/multi-user.target.wants/docker.service
文件,找到 ExecStart=
这一行,在这行最后添加加速器地址 --registry-mirror=<加速器地址>
,如:
|
|
|
|
Linux系统下配置完加速器需要检查是否生效,在命令行执行 ps -ef | grep dockerd
,如果从结果中看到了配置的 --registry-mirror
参数说明配置成功。
第二种方法
|
|
获取镜像
|
|
-it
:这是两个参数,一个是-i
:交互式操作,一个是-t
终端。我们这里打算进入bash
执行一些命令并查看返回结果,因此我们需要交互式终端。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间。armhf/ubuntu
:这是指用armhf/ubuntu
镜像为基础来启动容器。#!/bin/bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是#!/bin/bash
。
进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release
,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 16.04.1 LTS
系统。
最后我们通过 exit
退出了这个容器。
列出镜像
|
|
中间层镜像
|
|
列出部分镜像
根据仓库名列出镜像
|
|
列出特定的某个镜像,也就是说指定仓库名和标签
|
|
以特定格式显示
|
|
-f 过滤显示
|
|
以表格等距显示,并且有标题行,和默认一样
|
|
|
|
GVM-Golang管理器
GVM,类似于ruby 中的RVM,java 中的jenv(国产),可用于方便管理 Go 的版本,它有如下几个主要特性:
- 管理 Go 的多个版本,包括安装、卸载和指定使用 Go 的某个版本
- 查看官方所有可用的 Go 版本,同时可以查看本地已安装和默认使用的 Go 版本
- 管理多个 GOPATH,并可编辑 Go 的环境变量
- 可将当前目录关联到 GOPATH
- 可以查看 GOROOT 下的文件差异
Go 版本切换
二进制文件的管理比较简单,通过链接使用不同版本的程序即可,实际上主要是一些环境变量和标准库的设置问题,环境变量主要是 GOPATH 以及 GOROOT,标准库的话需要在切换 go 版本时也能跟着切换。gvm 实际上就是帮助完成这些配置工作。
安装
按照官方文档操作即可
|
|
使用
|
|
一般常规的操作是
|
|
几点注意
-
在 Linux 下安装 GVM,需要安装相关依赖,详情见官网说明,或者执行以下命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Debian/Ubuntu sudo apt-get install curl git mercurial make binutils bison gcc build-essential Redhat/Centos sudo yum install curl sudo yum install git sudo yum install make sudo yum install bison sudo yum install gcc sudo yum install glibc-devel FreeBSD Requirements sudo pkg_add -r bash sudo pkg_add -r git sudo pkg_add -r mercurial
-
GVM 官方显示没对 Windows 做支持,考虑到 Windows 不是程序员的标配吧(有同学回复用 git-windows客户端,自带bash功能,可以自行尝试安装下)。
-
GVM 安装新版本之后,Go 环境变量会重新设置,为了节约磁盘空间和时间,建议把之前版本的 GOPATH 内容移动到新版本对应的 GOPATH 目录下,相关路径可以通过 go env 获取
-
在同一版本下,用 gvm pkgset 创建多个 GOPATH,可能会占用你比较大的磁盘空间
-
使用 gvm implode 需谨慎
-
GVM 是用 shell 编写
NVM-NodeJS管理器
安装脚本
要安装或更新nvm,可以使用cURL 使用安装脚本:
|
|
或Wget:
|
|
再执行
|
|
验证安装
要验证是否已安装nvm,请执行以下操作:
|
|
如果安装成功,应输出’nvm’。请注意,这是which nvm
行不通的,因为nvm
是一个源代码的shell函数,而不是一个可执行的二进制文件。
使用 nvm 安装 Node.js
以下操作都是在“终端”窗口中完成。
安装指定版本的 Node.js
我们可以通过以下 nvm 命令在线安装指定版本的 Node.js。
|
|
例如,需要安装 v6.9.1 版本的 Node.js,那可以通过以下命令完成。
|
|
指定当前使用的 Node.js 版本
通过 nvm 可以同时安装多个版本的 Node.js,我们可以指定某个版本的使用。
|
|
例如,需要使用 v6.9.1 版本的 Node.js,那可以通过以下命令完成。
|
|
查看当前安装的 Node.js 版本列表
由于通过 nvm 可以安装多个 Node.js,版本多了不好管理。我们还可以随时查看当前安装了哪些 Node.js 的版本。
|
|
nvm 的其他命令
nvm 还提供一些命令,方便我们平时管理 Node.js 的版本。
- nvm uninstall [nodeversion]: 表示删除指定版本的 Node.js,用法类似于 install 命令。
- nvm current: 表示显示当前使用的 Node.js 版本。
- nvm reinstall-packages [npmversion]: 表示在当前的 Node.js 版本下,安装指定版本的 npm 包管理器。
安装多个版本 Node.js 的意义
自从 Node.js 基金会成立,Node.js 就有一个发布计划,就是同时存在两个发布版本:稳定版和试验版。
在 Node.js 中,带有长期支持(LTS)的稳定版是以偶数开始(4,6,8…),而试验版是从奇数开始(5, 7…)。我们推荐在生产环境中用 LTS 版本,而用试验版尝试新东西。
国内环境的问题
由于国内在一些情况下有些特殊。Node.js 官方镜像源又在国外,经常通过 nvm 安装 Node.js 时,速度比较慢,或者没有响应。
根据这种情况,nvm 允许更改安装的镜像源,我们可以将镜像源切换到国内的淘宝提供的镜像源。
nvm 软件切换镜像源
根据 nvm 官方提供的帮助文档,我们可以通过以下命令进行切换。
|
|
http://npm.taobao.org/mirrors/node 是 淘宝NPM镜像 提供的国内 Node.js 的安装镜像源。
**值得注意的是:**这种方式,在每次重启“终端”会失效。也就是说,每次打开“终端”都需要执行上述命令。
如果并不想每次打开“终端”,都需要重新设置
NVM_NODEJS_ORG_MIRROR
环境变量。
- 如果“终端”使用的是
bash Shell
的话向~/.bash_profile
文件(如果没有,会自动创建)增加以下内容:
1 2 3
# nvm export NVM_NODEJS_ORG_MIRROR="http://npm.taobao.org/mirrors/node" source ~/.nvm/nvm.sh
- 如果“终端”使用的是
zsh Shell
的话向~/.zshrc
文件(如果没有,会自动创建)增加以下内容:
1 2 3
# nvm export NVM_NODEJS_ORG_MIRROR="http://npm.taobao.org/mirrors/node" source ~/.nvm/nvm.sh
Windows 系统的 nvm-windows 软件切换镜像源
我们可以找到 nvm-windows 软件的安装目录中的 settings.txt
文件,增加以下内容:
|
|
添加成功之后,需要重新打开命令行窗口。
Pyenv-Python管理器
pyenv
是一个简单的python
版本管理工具,前身为pythonbrew
,pyenv
允许你改变全局的python
版本,安装多种不同的python
版本,设置应用指定的python
版本以及创建/管理虚拟的python
环境;
安装pyenv
:
|
|
配置环境变量,并添加 pyenv
初始化到你的shell
,
|
|
常用命令
-
查看当前设置默认的
python
版本1
pyenv version
-
查看当前已安装的所有
python
版本1
pyenv versions
-
查看当前可安装的
python
版本列表1
pyenv install -l | less
-
安装指定版本的
python
1
pyenv install 3.6.4
-
设置全局
python
版本1
pyenv global <python版本>
-
设置局部
Python
版本 设置之后可以在目录内外分别试下which python
或python --version
看看效果, 如果没变化的话可以pyenv rehash
之后再试试1
pyenv local <python版本>
- 制定版本创建virtualenv 用于单独为efb使用环境
|
|
- 列出现有virtualenvs
pyenv virtualenvs显示现有virtualenv和conda环境的列表。
|
|
- 激活virtualenv
|
|
- 删除现有virtualenv
|
|
Redis部署
|
|
解压
|
|
编译
|
|
安装
|
|
试启动看看
|
|
面是前端模式启动, 退出登录的话进程就没了, 只适合测试
正式使用要用后端模式, 按以下方法:
先复制配置文件
|
|
修改配置文件内容
|
|
找到daemonize, 把no修改成yes
保存退出
再次启动服务
|
|
检查是否有端口为6379的进程
|
|
用客户端连接测试一下
|
|
外部网络访问树莓派的Redis
Redis搭建好后一般都是使用编程语言进行连接调用,默认Redis的设置是不允许外界访问的
2、解决方案
进入Redis目录打开Redis.conf配置文件
|
|
启动Redis并指明配置文件
|
|
如果开启了iptables服务的,需要把redis的端口加入一下不然连不上!
OK,通过外网telnet一下Redis服务器看看是否通了,在可视化管理工具中连接Redis也就可以了
3、附录
可视化管理工具
下载地址:redisddesktop
SpiderFoot部署
结合本文章Pyenv-Python管理器来完成此次spiderfoot系统的部署。
|
|
启动SpiderFoot
LINUX / BSD / Solaris上
要运行SpiderFoot,只需sf.py
从您将SpiderFoot提取的目录执行即可:
|
|
一旦执行,网络服务器将启动,默认情况下将在127.0.0.1:5001上进行监听。然后,您可以通过浏览http://127.0.0.1:5001来使用您选择的网络浏览器。或者,从版本2.10开始,您可以使用CLI,默认情况下,该CLI将在本地连接到服务器127.0.0.1:5001:
|
|
如果您希望使SpiderFoot可以从另一个系统访问(例如在服务器上运行并远程控制它),则可以指定SpiderFoot要绑定到的外部IP,或使用0.0.0.0,以便绑定到所有地址,包括127.0.0.1:
|
|
然后在这种情况下使用CLI,从sfcli.py
文件被复制到的远程系统上运行:
|
|
运行python ./sfcli.py --help
以更好地了解如何使用CLI。
如果系统上的另一个应用程序使用端口5001,则可以更改端口:
|
|
windows
Windows的SpiderFoot作为预打包的可执行文件,无需安装任何依赖项。
目前,没有安装向导,因此只需将该包解压缩到一个目录(例如C:\ SpiderFoot)中并运行sf.exe
:
|
|
与Linux一样,您还可以指定要绑定的IP和端口:
|
|
进一步的配置看官方文档
golang部署(手动)
- 先下载go源码,go使用mercurial进行版本控制,需要用到工具
mercurial
,在终端下执行命令sudo apt-get install mercurial
进行安装,然后在终端下执行命令hg clone -u release https://code.google.com/p/go
- 切换到go的源码目录,在终端下执行
./all.bash
安装go,安装成功后会提示ALL TESTS PASSED
- 打开配置文件
vim ,~/.profile
,在文件中添加GOROOT、GOBIN
等环境变量,最后保存退出 - 在终端下执行命令
source .profile
使配置文件的修改生效 - 在终端下执行命令
go
,如果出现go命令的相关说明,那么恭喜你,go安装成功 - 源码安装go需要在终端下执行的命令依次为:
|
|
此方式为使用已编译二进制压缩包安装Go
下载go安装包
|
|
解压到/usr/local
|
|
修改PATH环境变量
|
|
(可选)设置GOPATH
go命令依赖一个重要的环境变量:$GOPATH,GOPATH不是go的安装目录,而是go程序开发的工作目录(我的工作目录是golang),打开配置文件vim ~/.profile,在文件中添加export GOPATH=/home/hahaya/golang,最后在终端下执行source .porfile使配置文件的修改生效 通常情况下,为了更好的管理go项目,$GOPATH目录约定有下面三个子目录 src:存放源代码(比如.go/.c/.h等) pkg:编译后生成的文件(比如.a) bin:编译后生成的可执行文件(为了方便,可以把此目录加入$PATH环境变量中)
|
|
然后进行检测,执行go
:
使用go编写hello world
- 前面已经配置好go语言开发的相关环境,那么接下来编写一个我们在学习新语言时同样会编写的hello world
- 建立目录和包,例如$GOPATH/src/hello/hello.go,在新建go应用或者代码包时都是在$GOPATH/src下新建一个目录,依次在终端下执行如下命令建立目录(hello)和包(hello.go):
|
|
- 在hello.go中输入如下内容
|
|
- 在终端下输入
go run hello.go
运行程序,当看到终端上输出hello world...
,在go语言开发环境搭建成功
更新go
在终端下依次执行如下命令更新go:
|
|
oneinstack部署出错的解决办法
部署typecho博客的时候出现的错误,打开任何链接都是No input file specified错误所以衍生出下方的解决方案。不折腾死星人!!!
原理:
任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。
PHP文件不存在,没办法返回普通的404错误,它返回 一个404,并带上一句”No input file specified”
另外,还可能跟 路径或者 权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因)。
解决办法:
1 打开文件: usr/local/php/etc/php.ini,修改以下配置
-
把cgi.fix_pathinfo=0 改为 cgi.fix_pathinfo=1
-
把 ;cgi.force_redirect=1 改为 cgi.force_redirect=0
第二种方法
1 2 3 4 5 6 7 8
OneinStack的php.ini在:/usr/local/php/etc/php.ini 添加 cgi.fix_pathinfo = 1 到/usr/local/php/etc/php.ini内 然后在/usr/local/nginx/conf/vhost/you-domain.conf内的 location ~ [^/]\.php(/|$) { 下添加一行 fastcgi_split_path_info ^(.+?.php)(/.*)$; 保存后,重启php和nginx即可解决。
2 修改文件权限
|
|
当执行的时候。如果个别项目里边有 .user.ini 文件。会提示
|
|
这时候需要 进入这个目录 执行
|
|
然后 进入到wwwroot目录 , 再执行权限命令,最后别忘了,进入www.test.com 目录,执行
|
|
最后重启
|
|
补充:Linux chattr 命令,用于改变文件属性。
这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:
- a:让文件或目录仅供附加用途。
- b:不更新文件或目录的最后存取时间。
- c:将文件或目录压缩后存放。
- d:将文件或目录排除在倾倒操作之外。
- i:不得任意更动文件或目录。
- s:保密性删除文件或目录。
- S:即时更新文件或目录。
- u:预防以外删除。
语法
|
|
参数
- -R 递归处理,将指定目录下的所有文件及子目录一并处理。
- -v<版本编号> 设置文件或目录版本。
- -V 显示指令执行过程。
- +<属性> 开启文件或目录的该项属性。
- -<属性> 关闭文件或目录的该项属性。
- =<属性> 指定文件或目录的该项属性。
实例
用chattr命令防止系统中某个关键文件被修改:
|
|
|
|
会显示如下属性
|
|
让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
|
|
使用FRP内网穿透
FRP是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https协议。在这篇文章中将为大家介绍FRP服务端和客户端的配置,通过FRP,让树莓派穿透内网,使大家在外网环境下也能轻松访问处于内网中的树莓派~
安装环境和需求
- 一台具有公网 ip 的服务器
- 一个域名
- 内网客户端使用 Raspbian Pi 3b,Raspbian Stretch;
- 公网服务端使用 Vultr 的 Debian 8
服务端配置
|
|
解压进去打开 frps.ini
|
|
服务端配置
|
|
保存退出后可以跑跑看
|
|
客户端配置
|
|
解压配置
|
|
配置示范:
|
|
值得说明的是,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中找到,未提到的内容大多为官方推荐配置,可直接应用。
装完就可以起飞了
|
|
使用 nohup 制作一键启动脚本
服务端
|
|
客户端
|
|
查看服务状态
|
|
开机启动
这里使用 Systemd 更简单的管理服务 比 init.d 和上面的破脚本不知道高到哪里去了,也可以使用supervisor
|
|
创建 frp.service,输入
|
|
重载并设置开机启动
|
|
// 启动命令 sudo systemctl start frp // 停止命令 sudo systemctl stop frp // 重启命令 sudo systemctl restart frp // 查看状态 sudo systemctl status frp
第二种方法
开机自启FRP服务:
接下来,我们将让frps/frpc服务开机启动:
编辑**客户端(树莓派)**的/etc/rc.local
文件,在exit 0
之前添加以下代码行:
|
|
编辑服务端的/etc/rc.local
,在文件末尾添加以下代码行(如果文件末行为exit 0
,则应该将以下内容添加到exit 0
之前):
|
|
这时,关机并重新启动客户端和服务端,待开机后,在客户端或者服务端中执行以下命令:
ps -A | grep frp
若返回类似结果则证明frps/frpc服务启动成功:
客户端:
|
|
服务端:
|
|
停止FRP服务:
我们可以使用相同的命令查看FRP服务的PID,比如在服务端中执行:
ps -A | grep frp
例如终端返回:
|
|
可以得到这两个进程的PID为1920和1925,我们可以使用kill
命令杀掉这两个进程来停止FRP服务:
(sudo) kill 1920 1925
客户端停止流程同理。
- 原文作者:码中春秋
- 原文链接:https://blog.taielab.com/2018-09-19/raspberrypi-application-use-cases.html
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。