最近购买了一个树莓派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

参考:

用树莓派搭建一个能在外网访问的NAS

树莓派4B部署NextCloud