电视盒子做小型服务器(华为海思Hi3798Mv100)

前言

翻找东西时发现了闲置的一个电信电视盒子,在网上查找了下相关资料挺多的,而且其SDK已经公开,盒子主控是华为海思Hi3798Mv100,四核ARM Cortex A7,主频高达1.5GHz,我这个是1G内存8G的存储的版本,有SD卡槽和两个USB接口,可以外接存储设备扩展,还有蓝牙WIFI功能,功耗仅有3w左右,刷上Ubuntu系统后可玩性非常高,下面就改造下使其变成一个小型的服务器。

拆机硬件

拧下前面脚垫下方的两个螺丝后就可以用撬板撬下外壳,上下外壳有卡扣连接,没有撬板的话用螺丝刀慢慢撬也可以,只不过会留下些痕迹。

拆机网图

之前拆开忘记拍了这里补一个拆机网图,可以清楚的看到板子上的外设,两片南亚的512MB的闪存,背面一片8GB的闪迪eMMC芯片,瑞昱的RTL8188FTV低功耗无线芯片 ,双USB2.0接口。

在这个SD卡槽边上有一个预留的调试串口,我们可以自己焊上个座子然后用杜邦线连接好USB转串口的模块来烧录固件。

调试串口

可以看到cpu是通过散热片被动散热的,后面用起来时温度总是太高,所以这里又拆开加了一个5V的小风扇辅助散热。

散热风扇

烧录固件

这里直接使用神雕(Teasiu)大佬编译好的固件,是一个可以直接使用的支持docker的内核,运行Ubuntu 20.04.4 LTS 服务器系统。

HiTool海思烧录工具:https://oss.histb.com/HiTool-windows.7z
固件下载:https://dl.ecoo.top:2096/

下载烧录工具和固件后,通过USB转串口模块连接好板子和计算机,接好12V电源和网线,打开烧录工具,记住要选择好对应的芯片型号,然后选择USB转串口模块对应的串口,选择好烧写的xml文件,选择烧写eMMC后就可以点击烧录了。

固件烧录

板子重新上电后会自动开始烧录,烧写完成后从路由器中查到板子获取到的IP后就可以通过SSH工具登录。

系统配置

使用SSH默认账号root密码1234登录。

初次登陆

1.更新软件

在做操作之前首先要更新下我们的索引和更新下软件。

1
apt update && apt upgrade 

更新软件

2.修改默认账号密码

对于初始的默认账户root和ubuntu我们需要更改下它们的密码。

修改密码

3.配置SSH服务

a.更改SSH端口

首先更改掉SSH服务的默认22端口,一般建议把它改成一个大于1024小于65535的整数。

1
vim /etc/ssh/sshd_config

更改SSH端口

b.禁止root登录

同样是修改sshd_config文件,在下方把PermitRootLogin一项参数改为no

禁止root登录

退出并保存后重启ssh服务让变更生效。

1
sudo service sshd restart

这时不要关闭当前ssh串口,开启另一窗口测试。修改ssh登录的端口这时再用root登录就会提示ssh服务拒绝了密码,我们可以用ubuntu用户登录或者自己使用adduser xxx新建普通用户登录,记得要使用visudo命令赋予新建的用户sudo权限。

c.启用密钥验证登录并禁止密码登录

所谓的密钥验证,就是生成一对相关联的密钥文件(公钥和私钥),然后把公钥上传到服务器。每次登录时,SSH 会将公钥私钥进行匹配,若验证是正确的密钥对,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好私钥这个文件不外泄即可)。

如果你本地使用的是Linux或者是macOS系统可以在本机通过命令生成密钥对。

1
ssh-keygen -t rsa -b 4096 -C "<CLIENT-NAME>"

或者直接通过软件生成再上传到服务器上,这里通过本地ssh工具生成密钥对,然后在服务器创建.ssh文件夹,将公钥保存成名为authorized_keys的文件。

保存公钥

然后修改.ssh目录权限为700,修改authorized_keys文件权限为 600 (仅所有者可读可写)。

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

修改权限

然后配置ssh文件,搜索PasswordAuthentication(设置是否使用口令验证)选项把参数yes改成no,并将PubkeyAuthentication(用来设置是否开启公钥验证)选项的参数改为yes。

1
vim /etc/ssh/sshd_config

修改完成后退出并保存,依然需要重启ssh服务让变更生效。

1
sudo service sshd restart

现在只能通过密钥对来连接上这台服务器了。

4.设置静态IP地址

通过修改配置文件设置静态IP地址。

1
vim /etc/network/interfaces.d/eth0

address处填入要更改的IP地址,netmask 处填掩码一般不变,broadcast广播地址后面的255表示向在本地网络当中所有主机广播,gateway处填入网关路由器的地址,dns-nameservers处可以填些dns地址也可以同样填网关路由器地址使用网关的dns,最后一行处可以修改网口的MAC地址。

1
2
3
4
5
6
7
8
auto eth0
iface eth0 inet static
address 192.168.1.x
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
pre-up ifconfig eth0 hw ether 00:11:22:44:55:66

修改完成后保存退出,重启让配置立即生效并使用新IP地址连接。

1
systemctl reboot 

5.卸载不需要的预装软件(自选)

在用户目录新建一个uninstall.sh脚本文件并输入以下内容,具体需要卸载的工具可以通过注释自行选择。

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
39
40
41
42
43
44
45
46
47
48
echo 正在卸载预装软件
#PHP
systemctl stop php*
sudo apt-get autoremove php* -y
sudo find / -name "*php*" |xargs rm -rf

#Nginx
systemctl stop nginx*
sudo apt-get autoremove nginx* -y
sudo find / -name "*nginx*" |xargs rm -rf

rm -rf /var/www

#Aria2
systemctl stop aria*
sudo apt-get autoremove aria2 -y
sudo find / -name "*aria2*" |xargs rm -rf

#Transmission
systemctl stop transmission*
apt-get autoremove transmission* -y
sudo find / -name "*transmission*" |xargs rm -rf

#页面终端
systemctl stop ttyd.service
sudo find / -name "*ttyd*" |xargs rm -rf

#KMS
sudo find / -name "*vlmcsd*" |xargs rm -rf

#FRP
systemctl stop frpc.service
sudo find / -name "*frp*" |xargs rm -rf

#NFS
apt-get autoremove nfs* -y

#FTP
systemctl stop vsftpd
apt-get autoremove vsftpd -y
sudo find / -name "*vsftpd*" |xargs rm -rf

echo 预装软件卸载完毕

echo 手动关闭6010端口:
echo 编辑:vim /etc/ssh/sshd_config

netstat -at

保存退出后sh uninstall.sh运行脚本卸载。

6.DDNS 解析自动更新(可选)

默认的ubuntu用户目录下自带阿里域名DDNS解析更新脚本,但首先需要安装nodejs。

1
sudo apt install nodejs

安装完成后修改配置文件vim /home/ubuntu/client-mode/config.json填写你的阿里提供的 keyid 和 keysecret, 并填写你需要解析的域名。

保存并退出, 然后添加计划任务(每 15 分钟检查一次, 外网 IP 变化才自动更新)
输入crontab -e,然后输入*/15 * * * * /home/ubuntu/client-mode/client.sh创建计划任务。

7.安装WIFI驱动

驱动包下载链接:https://bbs.histb.com/d/18-wifi

先将下载好的驱动包上传到服务器上,这里上传到推荐目录/tmp下.

上传驱动包

然后需要安装必须软件Linux内核模块工具kmod。

1
sudo apt install -y kmod

使用安装脚本自动安装

和驱动包一起的还有一个安装脚本,可以使用脚本进行安装,首先给脚本可执行权限。

1
chmod a+x wifi_install.sh

然后在命令行直接输入sh wifi_install.sh -f 驱动包 [参数1] [参数1] ...就可以安装,具体可用参数如下:

-f, –file
驱动文件包名称 例如 rtl8188ftv.tar.gz
-s, –ssid
可选,wifi名称
-p, –password
可选,wifi密码
-d, –address
可选,固定ip地址 如 192.168.1.100
-g, –gateway
可选,网关 一般为 网段的第一个IP 如 192.168.1.1,
-m, –netmask
可选,掩码 一般为 255.255.255.0
例如:
sh wifi_install.sh -f rtl8188ftv-0403.tar.gz -s ChineaNet-X231 -p 123456

备注:

  • 运行命令后会提示“安装成功”,此时驱动安装完成。
  • 如果使用了 -s 参数,脚本会尝试连接wifi,成功后提示“连接成功”,
  • 如果填入了 -d 参数,脚本会尝试修改wifi配置,成功后提示“修改地址成功”,
  • 想修改WIFI配置的话可以使用命令 nmcli connection delete “wifi名字”之后再使用本脚本重新配置,此时可无需使用 -f 参数。

手动安装WiFi驱动

一些问题

1.重新插拔网线后wifi不能使用

这是因为重新插网线后系统就增加一条优先级更高的默认路由,所有数据都从eth0接口出,导致通过wlan0的地址不能正常访问盒子了,只能手动删除默认的两个路由地址。
这里可以写个每次开机自动运行的脚本在每次开机删除默认路由地址。
首先创建rc-local.service文件

1
sudo cp /lib/systemd/system/rc-local.service /etc/systemd/system

然后修改/etc/systemd/system/rc-local.service,在文件最下方添加:

1
2
3
[Install]   
WantedBy=multi-user.target
Alias=rc-local.service

再创建/etc/rc.local里面添加:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

echo `date +"%Y-%m-%d %H:%M:%S"` begin >> /tmp/ip_route_del.log

ip route delete 192.168.31.0/24 dev eth0
ip route delete default

echo `date +"%Y-%m-%d %H:%M:%S"` end >> /tmp/ip_route_del.log
ip route delete successfully" >> /tmp/ip_route_del.log

exit 0

给/etc/rc.local加上可执行权限

1
sudo chmod +x /etc/rc.local

最后启动服务让脚本每次开机自动运行,可以使用sudo systemctl status rc-local.service查看当前服务状态。

1
sudo systemctl start rc-local.service
2.拔掉网线重新启动后获取不到IP地址

拔掉网线,重新启动盒子时,盒子的启动速度很慢,通过调试串口查看启动信息后发现,系统启动时卡在如下位置:

1
...a start job is running for raise network interfaces...

查网上相关问题后发现,启动这么慢是因为eth0接口的配置参数默认设置成了auto模式,且是DHCP地址获取方式。导致系统长时间尝试为eth0申请获取IP地址,直到超时。

解决办法就是为eth0配置静态地址,不从DHCP方式获取地址。

8.自定义美化

修改.bashrc

在家目录.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
#md folder_name  ==> mkdit folder_name and cd folder_name
md () {
mkdir -p $1
cd $1
}

# bash颜色配置
# 颜色代码(字体加背景):\[\e[F;Bm\]
# \a ASCII 响铃字符(也可以键入 \007)
# \e ASCII 转义字符(也可以键入 \033)
# \d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
# \u :#当前用户的账号名称
# \H :#完整的主机名称
# \h :#仅取主机的第一个名字
# \t :#显示时间为24小时格式,如:HH:MM:SS
# \T :#显示时间为12小时格式
# \A :#显示时间为24小时格式:HH:MM
# \n 换行符
# \r 回车符
# \v :#BASH的版本信息
# \w :#完整的工作目录名称
# \W :#利用basename取得工作目录名称,所以只会列出最后一个目录
# \# :#下达的第几个命令
# \$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$
# \[\e[m\]:将前景、背景和加粗设置重置为它们的默认值,在在提示行结束时使用这个代码,以使您键入的文字成为非彩色的。
export PS1='\[\e[36m\][\[\e[91m\]\u\[\e[m\]@\[\e[95m\]\h \[\e[34m\]\W\[\e[36m\]]\[\e[32m\]\$\[\e[m\]'

保存退出后使用sourve .bashrc命令使改动马上生效。

修改登录信息

修改或新增/etc/profile.d/下的文件自定义登录信息。

登录信息

安装外壳

系统软件配置完成后面还可以安装docker在上面跑一些有意思的东西,这里就可以安装外壳了,由于加装了个散热风扇导致整体高度超出外壳了3、4毫米,这里直接把底壳风扇下方开一个合适大小的洞正好可以增强散热效果,然后脚贴也需要加高一部分适配这个开洞的风扇。

底壳

到这里一个巴掌大小的功耗仅有3W左右的小服务器就配置好了,平时可以放在桌上或者机箱上也不会有噪音,而且性能还很不错,美观又实用。