引言

树莓派入手很久了,一直搁置在那也没怎么用,最近突发奇想就拿来重新刷了系统,遇到了很多问题,故简单地记录一下。

安装系统

本次选择了官方系统的Lite版,基于Debian,我使用的版本是2018年4月18日更新的,其他版本其实应该都大同小异,但据了解Lite版和Desktop版差别挺大的。还是给个传送门吧。刷入系统我选择的是官方推荐的ETCher,界面十分简约,功能也十分简约,就是专门用来干这个的,当然其他的刷入工具也是可以的。

开启ssh

其实这个系统默认就是有安装好ssh,只是默认没有开启而已。
启动ssh

1
sudo /etc/init.d/ssh start

或者配置开机自启后再启动

1
2
sudo systemctl enable ssh
sudo systemctl start ssh

然后就可以用电脑通过ssh访问了
顺便记录一下,官方系统默认帐号是pi,默认密码是raspberry
ssh连接之前记得查看一下树莓派的ip地址

1
ifconfig

我用路由器给我的树莓派绑定了固定ip地址,或者可以在树莓派里配置静态ip,具体方法不再赘述。

禁止密码登陆ssh

首先修改默认用户密码,以免被别人趁虚而入。

1
passwd

然后建立.ssh目录上传公钥

1
2
3
4
cd ~
mkdir .ssh
cd .ssh
nano authorized_keys

然后粘贴公钥,Ctrl+O 保存,Ctrl+X 退出nano(使用其他编辑器比如vi也可以,我习惯用nano,后面的编辑都会用这个编辑器),然后退出shell尝试使用密钥登陆,如果能登陆成功,就可以禁止密码登陆了

1
sudo nano /etc/ssh/sshd_config

找到PasswordAuthentication这一项

1
#PasswordAuthentication yes

取消注释并改成no

1
PasswordAuthentication no

然后保存退出,重启ssh服务

1
sudo systemctl restart ssh

然后退出shell,再登陆时就只能用密钥登陆了

换源 or 代理?

树莓派的官方源在境外,国内访问会比较慢,网上的说法比较倾向于换源,这也确实是一个很不错的方法。但是在实际的使用中,一定要确认使用的源是否正确。我开始换了阿里的源,速度确实非常快,但是很多包安装不了,大部分报情况下显示,可能请求了一个不稳定版的软件并且缺少一些依赖,这种情况下无法自动安装依赖(正常情况下安装一个软件缺少依赖时会自动安装),网上可以通过列出所有的依赖然后依次安装的方法解决这个问题,但是我发现只要换回了官方源就不会有这个问题。同时国内的源跟官方源不匹配也是一个问题,有时候国内会更新的慢很多,所以在换源的时候一定要小心了。最后我还是决定使用代理的方式来解决速度慢的问题(理论上使用代理网络请求,请求同样是要出境,但经过实际测试使用代理就是会比正常访问快很多,我也没有具体研究原因)。

使用 shadowsocks-libev + privoxy 实现自由命令行代理

安装 shadowsocks-libev

1
sudo apt install shadowsocks-libev

配置文件在 /etc/shadowsocks-libev/config.json,填写好服务器的配置

配置登陆时自动启动

/etc/rc.local 后面 exit 0 前面添加一行:(会把日志文件输出到pi用户的用户根目录的ss.log)

1
su pi -c "nohup ss-local > /home/pi/ss.log 2>&1 &"

安装 privoxy

现在虽然shadowsocks已经能够自动启动了,但是ss-local使用的是socks5代理,http协议是不能用它来代理的,所以需要一个名为privoxy的软件:

1
sudo apt install privoxy

配置 privoxy 全局代理

1
sudo nano /etc/privoxy/whitelist.action

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
{{alias}}
# 代理(socks5)
socks5 = +forward-override{forward-socks5 127.0.0.1:1080 .}
# 直连
direct = +forward-override{forward .}

# 所有网站走代理
{socks5}
/
# 以下网站走直连
{direct}
.ip.cn
.chinaz.com

其中端口号要与ss-local一致,这里我使用了1080端口
然后把 actionsfile whitelist.action 添加到 /etc/privoxy/config 的末尾就完成了配置
最后重启privoxy并设置开机自启,看一下是否启动成功:

1
2
3
sudo systemctl enable privoxy
sudo systemctl start privoxy
sudo systemctl status privoxy

目前,只要配置了 http_proxyhttps_proxy 环境变量就能使用代理了,但是一旦配置了这个环境变量,所有的请求都会代理,如果希望选择性的代理,可以使用 gfwlist 实现 pac 模式,关于这点,我并没有过多的了解。

编写 proxy 脚本实现自由代理

所谓自由代理就是希望代理的时候通过在命令前加上 proxy 关键字进行代理访问,不需要代理的请求不加这个关键字就行了,无需其他配置。建议把脚本放在 /usr/local/bin/proxy

1
sudo nano /usr/local/bin/proxy

写入以下内容:

1
2
#!/bin/bash
http_proxy=http://127.0.0.1:8118 https_proxy=http://127.0.0.1:8118 $*

其中端口号要与 privoxy 的配置一致,默认是8118
然后赋予可执行权限:

1
sudo chmod +x /usr/local/bin/proxy

至此,所有配置完成,重启后,需要代理的命令使用proxy前缀,比如:

1
sudo proxy apt install git

修改默认交换文件的大小

1
sudo nano /etc/dphys-swapfile

修改其中的

1
CONF_SWAPSIZE=100


1
CONF_SWAPSIZE=2048

就有2G的虚拟内存,应该够用了,最后执行:

1
2
sudo dphys-swapfile setup
sudo dphys-swapfile swapon

重新加载一下配置文件,然后就可以用 free 命令查看到 2G 虚拟内存了

让 shell 界面有颜色

pi用户的shell界面默认是有颜色的,但是root用户默认没有,只要把pi用户的.bashrc文件中对应的部分复制到root用户的.bashrc中就可以达到目的

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
37
38
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac

force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
color_prompt=yes
else
color_prompt=
fi
fi

if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w \$\[\033[00m\] '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac

if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi

alias ll='ls -al'

最后一句 alias 是把 ll 变成 ls -al 的别名,方便查看文件

安装 apache2 + php7 + mysql + phpmyadmin

1
2
3
sudo apt install apache2
sudo apt install mysql-server mysql-client
sudo apt install php php-mysql

mysql创建最高权限用户

1
GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;

安装phpmyadmin

以phpMyAdmin-4.8.0.1为例(我修改了apache2的默认配置,网站根目录在 /var/www

1
2
3
4
5
6
7
8
9
sudo mkdir /opt/phpmyadmin
cd /opt/phpmyadmin
sudo curl -O https://files.phpmyadmin.net/phpMyAdmin/4.8.0.1/phpMyAdmin-4.8.0.1-all-languages.zip
sudo unzip phpMyAdmin-4.8.0.1-all-languages.zip
sudo ln -s /opt/phpmyadmin/phpMyAdmin-4.8.0.1-all-languages /var/www/phpmyadmin
sudo cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
sudo mkdir /var/www/phpmyadmin/tmp
sudo chown www-data -R /var/www/phpmyadmin/tmp
sudo chgrp www-data -R /var/www/phpmyadmin/tmp

安装tomcat

创建tomcat用户和组

1
2
sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat

以9.0.7版本为例下载源码并配置

1
2
3
4
5
6
7
8
9
10
sudo mkdir /opt/tomcat
cd /opt/tomcat
sudo curl -O http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.7/bin/apache-tomcat-9.0.7.zip
sudo unzip apache-tomcat-9.0.7.zip
sudo mv -R apache-tomcat-9.0.7 9.0.7
sudo ln -s /opt/tomcat/9.0.7 /opt/tomcat/latest
# 修改权限
sudo chown tomcat -R 9.0.7
sudo chgrp tomcat -R 9.0.7
sudo chmod 744 -R /opt/tomcat/latest/bin/*.sh

配置开机启动

1
sudo update-java-alternatives  -l

记下jdk路径(RASPBIAN系统+openjdk的sdk位置默认是 /usr/lib/jvm/java-1.8.0-openjdk-armhf

1
sudo nano /etc/systemd/system/tomcat.service

写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-armhf/jre
Environment=CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat/latest
Environment=CATALINA_BASE=/opt/tomcat/latest
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

注意替换jdk位置,以及其后的jre不能遗漏,内存配置按需修改
重新加载systemctl、配置开机启动、启动tomcat以及查看是否成功启动:

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable tomcat
sudo systemctl start tomcat
sudo systemctl status tomcat

配置tomcat web管理接口

修改:

1
sudo nano /opt/tomcat/latest/conf/tomcat-users.xml

在tomcat-users中添加一行

1
<user username="tomcat" password="password" roles="manager-gui,admin-gui"/>

修改META-INF权限配置,需要修改以下两个文件,允许局域网访问

1
2
sudo nano /opt/tomcat/latest/webapps/manager/META-INF/context.xml
sudo nano /opt/tomcat/latest/webapps/host-manager/META-INF/context.xml

两个文件中

1
2
3
4
5
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

都需要把

1
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"

修改为

1
allow="127\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"

即允许来自192.168.开头的IP的访问,这样就可以通过局域网管理web应用了
最终文件长这个样子:

1
2
3
4
5
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>