最近购买了一个树莓派4B来玩耍,以下是一些记录。
树莓派系统安装
在 https://ownyourbits.com/downloads 下载最新的版本并刻录到SD卡。
然后进入到SD卡根目录,创建一个空的ssh文件以及wpa_supplicant.conf。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="WiFi账号(中文没测试过)"
psk="WiFi密码"
}
使用「Raspberry pi Imager」工具刻录进去,初次开机需要外接显示器和键盘,进行一些基础的设置(修改密码、更换APT源)。
搭建自用网盘(Nextcloud)
外接硬盘
家里有闲置的硬盘,那么用来做一个私人网盘非常合适。由于树莓派接入了一个风扇(不可控制,插5V和grd的引脚),再外接硬盘的时候,发现树莓派的网络功能受到极大的影响,经常出现SSH掉线或者ping不通,即使用上了USB HUB单独供电也是这样,所以最后把风扇给去掉了。
将硬盘挂载加入到开机执行,编辑 /etc/fstab 文件,加入
UUID=硬盘UUID 挂载地址 btrfs(硬盘挂载格式) defaults 0 0
UUID以及格式通过 sudo blkid 查看。运行一段时间后发现硬盘出现挂载失败的情况,尚未解决,后面会尝试更换硬盘、自动休眠等方式。
还有可能出现 Your data directory is not writable这样的错误,登录到机器上后执行
ls /media/myCloudDrive
ls: reading directory '.': Input/output error
暂时不知道原因,重启后解决,猜测是电压、温度等的影响了硬盘的挂载。
Nextcloud设置
由于镜像是装好NextCloud的,所以几乎不需要进行设置,直接打开 http://ip 进行设置,控制面板是 http://ip:4443 。 注意点:
- Apache运行的用户为www-data,所以需要将存储目录的owner改为www-data,否则会提示权限有关的错误
- php.ini 中修改xxx_max_size等选项,控制用户最大上传量
- Apache设置中关闭HTTPS
内网穿透
在自己家里,连接上Wifi当然可以直接通过IP来访问,如果我人在外面,并且也想在手机上访问我的文件,那么就需要内网穿透,让外网可以访问内网设备。目前主流的方案有:
- frp(需要拥有一台有公网IP的服务器)
- 花生壳、Ngrok(缺点是花生壳要钱而且受到监管,Ngrok绑定自定义域名也需要钱)
- Cloudflare Tunnel
最终我选择使用Cloudflare tunnel。
1.首先下载Cloudflare tunnel客户端,然后创建一个隧道并启动。
2.DNS管理,添加一条CNAME记录,记录值为tunnel_id.cfargotunnel.com。
3.Apache中默认是443端口,在 /etc/apache2/sites-available/nextcloud.conf 中,将443改为80,并将SSL相关配置都注释掉。然后到CF后台管理中的SSL一项,选择「灵活」。如果不这么做,会造成无限302重定向。
监控
# 查看CPU温度
cat /sys/class/thermal/thermal_zone0/temp
# 查看硬盘挂载以及使用情况
df -h
# 内存使用情况
cat /proc/meminfo
然后可以根据自己的系统写一个脚本,配置定时任务,配置消息推送APP(例如Bark)使得管理员可以随时了解系统运行状况。
参考代码(Python3):
# coding:utf8
import subprocess
# Base info
mount_path = "/media/myCloudDrive"
drive_capacity = 900
# thresholds
temperature_threshold = 55
mem_threshold = 0.8
# Bark API url
bark_api_url = "https://api.day.app/这里换成自己的/"
def send_alarm():
pass
def check():
send_alarm = False
# temperature
ret = subprocess.getoutput("cat /sys/class/thermal/thermal_zone0/temp")
t = int(ret.strip()) / 1000
print(t)
if t >= temperature_threshold:
send_alarm = True
# drive
ret = subprocess.getoutput("df -h | awk '{print $6}'")
drives = str(ret).split("\n")
print(drives)
drive_status = "正常"
if mount_path not in drives:
send_alarm = True
drive_status = "异常"
# memory
ret = subprocess.getoutput("cat /proc/meminfo | head -n 2 | awk '{print $2}'")
ret = str(ret).split("\n")
total = int(ret[0])
free = int(ret[1])
print("Memory Total: %d, Free: %d" % (total, free,))
if 1 - free / total > mem_threshold:
send_alarm = True
if send_alarm:
print("Send an alarm!")
info = "温度「%.1f」内存使用率「%.2f」磁盘挂载「%s」" % (t, 1 - free / total, drive_status)
print(info)
subprocess.getoutput("curl %s%s" % (bark_api_url, info))
else:
print("The status is ok.")
if __name__ == "__main__":
check()
然后添加到crontab,每隔2小时执行一下。
0 */2 * * * python /home/pi/monitor.py
参考: