樹莓派4B折騰記錄

柳橋風起發表於2020-12-07

樹莓派4B折騰記錄


買了一塊樹莓派 4B 板子,2G 的記憶體,打算用來替換刷機和折騰都不是很方便的斐訊 N1 ,這裡記錄一下自己的折騰過程。

一、系統安裝

由於之前並沒有折騰過樹莓派,對於樹莓派能用的系統也沒有太多的瞭解,聽說 64 位的系統比 32 位效能要更強,百度了一番找到了一個叫做 Debian-Pi 的系統,看中了它整合的 Web 管理頁面和 Docker 以及 CeCOS-CaaS 的功能,這可以大幅降低部署系統的操作。

官方主頁:Github 地址 Gitee 地址

根據需求下載自己需要的映象版本,我使用的是 2020-06-22-U4-Release 的 plus++ 版本,即無桌面增強版。下載好映象之後使用 Win32DiskImager 寫入 SD 卡再通電啟動即可,首次啟動需要一定的時間初始化。我是直接網線連線的樹莓派,當路由器裡面能夠看到 raspbian 這個裝置 IP 的時候就可以嘗試通過 Web 管理頁面訪問了。

系統初始化說明

系統開機將自動擴充套件根分割槽,然後會自動進行相關配置,待完成後方可正常使用,此過程中系統將 自動重啟3次

賬戶及密碼

系統預設賬戶:pi ,預設密碼:raspberry

預設賬戶pi賬戶支援ssh登入,root賬戶密碼請登陸後使用命令 “sudo passwd root” 執行設定,

或使用命令 “sudo -i” 來切換到root使用者。

1.Web視覺化管理介面
登入地址 https://你樹莓派的IP地址:9090
說明:請使用系統預設賬戶pi登入

2.WEB SSH 客戶端 入口介面
登入地址 https://你樹莓派的IP地址:4200
說明:使用具有控制檯登入許可權的帳戶登入,例如:pi

3.CecOS CaaS 容器雲管理平臺 登入介面
登入地址 https://你樹莓派的IP地址:8443
說明:預設管理賬戶 admin , 預設密碼:password 。請登入後立即修改預設密碼!!

二、軟體安裝

1. Hassio

這是 HomeAssistant 的一個版本,自帶多個外掛,比原版 HomeAssistant 更方便。我用來控制宿舍裡的斐訊 TC1 插座。

wget https://code.aliyun.com/neroxps/hassio_install/raw/master/install.sh
chmod +x install.sh
sudo ./install.sh

安裝期間會提示以下型別資訊,全部 y 或者按照如下操作:

(1). 是否將系統源切換為中科大(USTC)源(目前支援 Debian Ubuntu Raspbian 三款系統)
請輸入 y or n(預設 yes):y

(2). 在你係統內找到 onehero 使用者,是否將其新增至 docker 使用者組。
請輸入 yes 或者 no (預設 yes):y
將onehero使用者新增至 docker 使用者組。

(3).是否需要替換 docker 預設源?
請輸入 yes 或者 no(預設:yes):y

(4).請選擇你裝置型別(預設:qemux86-64)
    [1]: intel-nuc: 英特爾的nuc小主機
    [2]: odroid-c2: 韓國odroid-c2
    [3]: odroid-xu: 韓國odroid-xu
    [4]: orangepi-prime: 香橙派
    [5]: qemuarm-64: 通用arm裝置(例如斐訊N1) 64位系統
    [6]: qemux86-64: 通用X86(普通的PC機電腦)64位系統
    [7]: raspberrypi3-64: 樹莓派三代64位系統
    [8]: raspberrypi4-64: 樹莓派四代64位系統
    [9]: tinker: 華碩tinker
輸入數字 (1-9):
你選擇了 8
 ################################################################################
 # 1. 是否將系統源切換為中科大(USTC)源: 是
 # 2. 是否將使用者新增至 Docker 使用者組:   是,新增使用者為 onehero 
 # 3. 是否將 Docker 源切換至國內源:     是
 # 4. 您的裝置型別為:                   raspberrypi4-64
 ################################################################################
請確認以上資訊,繼續請按任意鍵,如需修改請輸入 Ctrl+C 結束任務重新執行指令碼。

有關 Hassio 的內容還可以參考瀚思彼岸的這個帖子:https://bbs.hassbian.com/thread-4520-1-1.html

2. mqtt 伺服器

由於我的斐訊 TC1 刷了 Z大的韌體,所以需要用 mqtt 伺服器接入 HomeAssistant 來間接控制。

sudo apt install mosquitto
sudo mosquitto_passwd -c /etc/mosquitto/pwfile 你的使用者名稱

mosquitto 的ip地址就是樹莓派的 IP ,埠預設是 1883 ,使用者名稱和密碼就是上一步剛設定的。

如果無法設定使用者名稱和密碼,可以先把 mosquitto 程式關閉,設定好後再開啟。

ps -ef | grep mosquitto
kill 上一步找出來的 pid

3. SMB 與 行動硬碟掛載

3.1 安裝與配置
sudo apt install samba
sudo nano /etc/samba/smb.conf

# 新增以下內容
[storage]
   path = /home/storage # 你想要共享的目錄
   available = yes
   browseable = yes
   public = no
   writable = yes
  
# 在 [global] 節點下新增下面這行可提升傳輸速度
aio read size = 0

為 SMB 使用者新增密碼,該使用者必須是系統已有使用者,按照提示輸入密碼即可。

smbpasswd -a 你的使用者名稱

重啟 SMB 服務:

sudo service smbd restart

然後 Windows 系統在資源管理器的位址列輸入 \\你的樹莓派 IP 地址並回車輸入賬號密碼就能看到 SMB 共享目錄了,還可以右鍵點選共享目錄選擇對映為網路驅動器。

Android 端可以使用 Solid Explorer 、Mix Explorer 、X-plore 等軟體來連線 SMB 共享目錄,下文 FTP 與 Webdav 同樣也可以。

3.2 掛載硬碟

由於手上剛好有兩塊升級膝上型電腦淘汰下來的 2.5 寸機械硬碟,本著不浪費的原則就買了兩塊硬碟盒打算把它們一起連線到樹莓派當個 NAS 。

1. 供電

樹莓派 4B 帶不動兩塊 2.5 寸機械硬碟,我嘗試了綠聯的 USB Hub 同樣不行,必須用帶有額外供電的硬碟盒。如果你已經這樣試過,可能會出現樹莓派因為供電不足系統出錯無法啟動的情況,如果拔掉行動硬碟仍然無法正常啟動請重新燒錄系統映象到 SD 卡安裝系統。

2. 行動硬碟格式

強烈建議使用 ext4 格式,原來使用 ntfs 格式時發現讀寫速度跑不滿,而且很佔用系統資源。

# 僅下次重啟前有效
sudo fdisk -l # 檢視並記下要掛載的硬碟或分割槽資訊
sudo mount /dev/sdb /home/storage # /dev/sdb 是要掛載的硬碟或分割槽,/home/storage 是要掛載到的目錄

# 開機自動掛載
sudo blkid # 檢視並記下要掛載的硬碟或分割槽相應的 UUID
sudo nano /etc/fstab
# 新增以下內容,有幾個新增幾個
UUID=eb151714-de83-364d-9c07-04265bacd19d /home/storage/N1 ext4 defaults 0 0
UUID=88b15d68-acc0-cb4b-bc4f-f969a1f1f0d6 /home/storage/N2 ext4 defaults 0 0

sudo mount -a # 掛載 /etc/fstab 中記錄的所有硬碟或分割槽
chmod -R 777 /home/storage # 掛載完成後設定許可權,實現對行動硬碟檔案的可讀可寫。

4. FTP

因為安卓端幾乎找不到支援 SMB V3 協議的檔案管理器,所以區域網讀寫速度只有電腦的一半,用 FTP 可以跑滿。

4.1 安裝 vsftpd
sudo apt install vsftpd
4.2 備份 vsftpd.conf
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
4.3 修改 vsftpd.conf
# 1. 與匿名者相關的資訊,在這個案例中將匿名登入取消:
anonymous_enable=NO

# 2. 與實體使用者相關的資訊
local_enable=YES
write_enable=YES
local_umask=022
local_root=/home/storage

chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES

# 3. 與主機有關的設定
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
# pam_service_name=vsftpd
listen=YES
tcp_wrappers=YES
4.4 重啟 vsftpd
sudo service vsftpd restart

Windows 系統同樣可以在資源管理器的位址列輸入 ftp://你的樹莓派IP 來訪問共享目錄,瀏覽器也可以。

5. chfs

CuteHttpFileServer/chfs是一個免費的、HTTP協議的檔案共享伺服器,使用瀏覽器可以快速訪問。它具有以下特點:

  • 單個檔案,核心功能無需其他檔案
  • 跨平臺執行,支援主流平臺:Windows,Linux和Mac
  • 介面簡潔,簡單易用
  • 支援掃碼下載和手機端訪問,手機與電腦之間共享檔案非常方便
  • 支援賬戶許可權控制和地址過濾
  • 支援快速分享文字片段
  • 支援webdav協議

與其他常用檔案共享方式(如FTP,飛秋,網盤,自己建站)相比,具有使用簡單,適用場景更多的優點,在個人使用以及共享給他人的場景中非常方便快捷。

軟體官網:http://iscute.cn/chfs

5.1 下載與配置

下載解壓:

wget http://iscute.cn/tar/chfs/2.0/chfs-linux-arm64-2.0.zip
unzip -o -d /home/apps/chfs chfs-linux-arm64-2.0.zip # /home/apps/chfs 改成你想解壓到的路徑

修改配置:

我這裡設定成了匿名使用者只能

nano chfs.ini # 新增以下內容並儲存,注意修改相關項的值
#---------------------------------------
# 請注意:
#     1,如果不存在鍵或對應值為空,則不影響對應的配置
#     2,配置項的值,語法如同其對應的命令列引數
#---------------------------------------


# 監聽埠
port=5212


# 共享根目錄,通過字元'|'進行分割
# 注意:
#     1,帶空格的目錄須用引號包住,如 path="c:\a uply name\folder"
#     2,可配置多個path,分別對應不同的目錄
path=/home/storage


# IP地址過濾
allow=

#----------------- 賬戶控制規則 -------------------
# 訪問許可權分為四種:""(不可訪問),"R"(只讀),"W"(讀寫),"D"(寫+刪除)。
# 讀許可權指的是下載,寫許可權指上傳、新建等操作,
# 刪除許可權是在寫許可權的基礎上加上刪除許可權。
# 注意:該鍵值可以同時存在多個,你可以將每個使用者的訪問規則寫成一個rule,這樣比較清晰,如:
#     rule=::
#     rule=root:123456:RW
#     rule=readonlyuser:123456:R
# rule=:::Video:r
rule=::::r
rule=使用者名稱:密碼:rwd


# 使用者操作日誌存放目錄,預設為空
# 如果賦值為空,表示禁用日誌
log=


# 網頁標題
html.title=檔案共享


# 網頁頂部的公告板。可以是文字,也可以是HTML標籤,此時,需要適用一對``(反單引號,通過鍵盤左上角的ESC鍵下面的那個鍵輸出)來包住所有HTML標籤。幾個例子:
#     1,html.notice=內部資料,請勿傳播
#     2,html.notice=`<img src="https://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png" width="100%"/>`
#     3,html.notice=`<div style="background:black;color:white"><p>目錄說明:</p><ul>一期工程:一期工程資料目錄</ul><ul>二期工程:二期工程資料目錄</ul></div>`
html.notice=


# 是否啟用圖片預覽(網頁中顯示圖片檔案的縮圖),true表示開啟,false為關閉。預設開啟
image.preview=true


# 下載目錄策略。disable:禁用; leaf:僅限葉子目錄的下載; enable或其他值:不進行限制。
# 預設值為 enable
folder.download=


#-------------- 設定生效後啟用HTTPS,注意監聽埠設定為443-------------
# 指定certificate檔案
ssl.cert=
# 指定private key檔案
ssl.key=


# 設定會話的生命週期,單位:分鐘,預設為30分鐘
session.timeout=

啟動:

chfs --file="chfs.ini" # chfs.ini 注意修改你的 ini 檔案的路徑
5.2 啟動管理

使用 systemd 管理:

sudo nano /etc/systemd/system/chfs.service # 新增以下內容並儲存,注意修改相關項的值
[Unit]
Description=chfs
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=5s
# 程式啟動路徑和 ini 檔案路徑請修改成自己的
ExecStart=/home/onehero/apps/chfs/chfs --file="/home/onehero/apps/chfs/chfs.ini"

[Install]
WantedBy=multi-user.target

啟動 chfs 並設定為開機自啟:

sudo systemctl start chfs # 啟動
sudo systemctl enable chfs # 開機自啟
5.3 systemd 常用管理命令
systemctl daemon-reload  # 更新配置
systemctl start xxx      # 啟動
systemctl restart xxx    # 重啟
systemctl stop xxx       # 停止
systemctl enable xxx     # 開機自啟
systemctl disable xxx    # 取消開機啟動
systemctl is-enabled xxx # 判斷是否設定為開機啟動

6. FileBrowser

軟體介紹:官網

curl -fsSL https://filebrowser.xyz/get.sh | bash

安裝教程參考另一位作者的教程:教程地址

使用 systemd 管理,將以下內容儲存到 filebrowser.service,放到 /etc/systemd/sytem 目錄下即可

sudo nano /etc/systemd/system/filebrowser.service # 新增以下內容,注意修改相關項的值
[Unit]
Description=File Browser
After=network.target

[Service]
# 修改程式路徑和資料庫地址
ExecStart=/home/onehero/apps/filebrowser/filebrowser -d /home/onehero/apps/filebrowser/filebrowser.db

[Install]
WantedBy=multi-user.target

執行和開機自啟:

sudo systemctl start filebrowser
sudo systemctl enable filebrowser

7. 指示燈

關閉讀寫狀態指示燈和電源指示燈

7.1 臨時生效
# 狀態指示燈,0 為關,1 為開
echo 0 | sudo tee /sys/class/leds/led0/brightness
echo none | sudo tee /sys/class/leds/led0/trigger

# 電源指示燈,0 為關,1 為開
echo 0 | sudo tee /sys/class/leds/led1/brightness
echo none | sudo tee /sys/class/leds/led1/trigger
7.2 永久生效
sudo nano /etc/rc.local

將以下內容新增並儲存:

# 狀態指示燈,0 為關,1 為開 
echo 0 | tee  /sys/class/leds/led0/brightness
echo none | tee  /sys/class/leds/led0/trigger
# 電源指示燈,0 為關,1 為開
echo none | tee  /sys/class/leds/led1/trigger
echo 0 | tee /sys/class/leds/led1/brightness

8. 微力同步(VerySync)

軟體介紹:官網

# (如果需要指定索引存放位置請在最後面新增 -d 路徑 如 -d /data/verysync)
curl http://www.verysync.com/shell/verysync-linux-installer/go-installer.sh > go-installer.sh
chmod +x go-installer.sh
sudo ./go-installer.sh

瀏覽器開啟 http://樹莓派IP:8886

9. Aria2 Pro

這裡使用 Aria2 Pro 的 Docker 映象安裝

Github地址:地址

Docker Hub:地址

教程 Blog:地址

映象特點

  • 使用 Aria2 完美配置方案
    • BT 下載率高、速度快
    • 重啟後不丟失任務進度、不重複下載
    • 刪除正在下載的任務自動刪除未完成的檔案
    • 下載錯誤自動刪除未完成的檔案
    • 下載完成自動刪除控制檔案(.aria2字尾名檔案)
    • 下載完成自動刪除種子檔案(.torrent字尾名檔案)
    • 下載完成自動刪除空目錄
    • BT 下載完成自動清除垃圾檔案(檔案型別過濾功能)
    • BT 下載完成自動清除小檔案(檔案大小過濾功能)
    • 有一定的防版權投訴、防迅雷吸血效果
    • 更好的 PT 下載支援
  • 使用 aria2-builder 專案最新靜態編譯二進位制檔案
    • 多平臺:amd64, i386, arm64, armhf(VPS、群輝、樹莓派等常見平臺完美支援)
    • 全功能:Async DNS, BitTorrent, Firefox3 Cookie, GZip, HTTPS, Message Digest, Metalink, XML-RPC, SFTP
    • 單伺服器執行緒數最大值無上限(已破解執行緒數限制)
    • 防掉執行緒優化
    • 最新依賴庫,下載更安全、穩定、快速
    • 持續更新最新版本
  • 支援與 RCLONE 聯動
    • 自動上傳 OneDrive 、Google Drive 等網盤
    • 百度網盤轉存到其它網盤
    • 多網盤自由選擇
  • 支援新一代網際網路協議 IPv6
  • 下載完成自動移動檔案到指定目錄(檔案自動歸檔/分類)
  • 定時自動更新 BT tracker 列表(無感知、無重啟),保持 BT 下載高速率
  • 使用者檔案許可權自動配置功能
  • 配置檔案持久化,支援使用 watchtower 更新容器。
  • 極簡設計,專注下載,簡單易用,少即是多。

使用 Docker 安裝,注意修改下面的 RPC 金鑰和配置及資料路徑以及預設下載路徑

# RPC_SECRET  RPC金鑰
# /home/onehero/apps/aria2-config  配置及資料路徑
# /home/N1/download  下載路徑

docker run -d \
     --name aria2-pro \
     --restart unless-stopped \
     --log-opt max-size=1m \
     --network host \
     -e PUID=$UID \
     -e PGID=$GID \
     -e RPC_SECRET=RPC金鑰 \
     -e RPC_PORT=6800 \
     -e LISTEN_PORT=6888 \
     -v /home/onehero/apps/aria2-config:/config \
     -v /home/N1/download:/downloads \
     p3terx/aria2-pro

使用搭建好的 AriaNG 連線管理:地址

設定裡面修改連線地址為樹莓派 IP 再修改 RPC 金鑰即可連線。

10. 系統狀態獲取

有時候想看看系統的 CPU 溫度 、記憶體佔用等資訊,使用命令逐個獲取不太方便,用指令碼可以格式化輸出

以下程式碼來自:樹莓派實驗室

新建一個.py檔案儲存程式碼:

nano status.py

將以下程式碼新增並儲存,由於原帖部分 CPU 溫度無法正常獲取,這裡略作修改:

import os
 
# Return CPU temperature as a character string                                      
def getCPUtemperature():
    file = open("/sys/class/thermal/thermal_zone0/temp")
    temp = round(float(file.read()) / 1000, 1)
    file.close()
    return str(temp)
 
# Return RAM information (unit=kb) in a list                                       
# Index 0: total RAM                                                               
# Index 1: used RAM                                                                 
# Index 2: free RAM                                                                 
def getRAMinfo():
    p = os.popen('free')
    i = 0
    while 1:
        i = i + 1
        line = p.readline()
        if i==2:
            return(line.split()[1:4])
 
# Return % of CPU used by user as a character string                                
def getCPUuse():
    return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))
 
# Return information about disk space as a list (unit included)                     
# Index 0: total disk space                                                         
# Index 1: used disk space                                                         
# Index 2: remaining disk space                                                     
# Index 3: percentage of disk used                                                  
def getDiskSpace():
    p = os.popen("df -h /")
    i = 0
    while 1:
        i = i +1
        line = p.readline()
        if i==2:
            return(line.split()[1:5])
 
 
# CPU informatiom
CPU_temp = getCPUtemperature()
CPU_usage = getCPUuse()
 
# RAM information
# Output is in kb, here I convert it in Mb for readability
RAM_stats = getRAMinfo()
RAM_total = round(int(RAM_stats[0]) / 1000,1)
RAM_used = round(int(RAM_stats[1]) / 1000,1)
RAM_free = round(int(RAM_stats[2]) / 1000,1)
 
# Disk information
DISK_stats = getDiskSpace()
DISK_total = DISK_stats[0]
DISK_used = DISK_stats[1]
DISK_perc = DISK_stats[3]
 
if __name__ == '__main__':
    print('')
    print('CPU Temperature = '+CPU_temp)
    print('CPU Use = '+CPU_usage)
    print('')
    print('RAM Total = '+str(RAM_total)+' MB')
    print('RAM Used = '+str(RAM_used)+' MB')
    print('RAM Free = '+str(RAM_free)+' MB')
    print('')  
    print('DISK Total Space = '+str(DISK_total)+'B')
    print('DISK Used Space = '+str(DISK_used)+'B')
    print('DISK Used Percentage = '+str(DISK_perc))

授予許可權:chmod +x status.py

執行:python status.py

11. 備份/恢復系統

定時備份系統是個好習慣,當系統出現問題的時候只需要將備份的映象重新燒錄到 SD 卡即可。

參考教程:地址

11.1 備份時壓縮:
lsblk # 檢視 / 分割槽和 /boot 分割槽所在,在這裡是 mmcblk0
# status=progress 可以顯示備份過程中的檔案大小變化,如果系統提示不支援可以去掉
# 注意修改路徑
sudo dd if=/dev/mmcblk0 status=progress | gzip > /home/storage/N1/backup.gz

# 以當前時間生成特定的備份檔案
sudo dd if=/dev/mmcblk0 status=progress | gzip > /home/storage/N1/"debian-pi-aarch64_backup_"$(date "+%Y%m%d_%H-%M-%S")".gz"

# 系統不支援顯示 status 屬性的話,可以新開一個終端執行以下命令觀察檔案大小
# 每隔 1s 重新整理一次
watch -d -n 1 ls -lh /home/N1/backup.gz
11.2 備份時不壓縮:
sudo dd if=/dev/mmcblk0 status=progress of=/home/storage/N1/backup.img bs=1M
11.3 備份指令碼
nano backup.sh

# 新增以下內容並儲存
#!/bin/bash
path="/home/storage/N1/" # 備份路徑

prefix="debian-pi-aarch64_backup_" # 檔名
suffix=".gz"
curTime=$(date "+%Y%m%d_%H-%M-%S") # 日期格式
fullName="${path}${prefix}${curTime}${suffix}"
echo $fullName
sudo dd if=/dev/mmcblk0 status=progress | gzip > $fullName

# 賦予可執行許可權
chmod +x backup.sh

# 執行
sudo ./backup.sh

相關文章