2025年12月22日 星期一

樹莓派 Pi 3 燒錄 Bulleye OS (Debian 11)

月初高雄家裝了光世代後, 高雄這台 Pi 3 主機就連不上新網路, 原因是我之前設定了固定 IP 192.168.2.193, 想改卻因為 X11 視窗異常無法進入終端機, 兩周前乾脆找了一張 TF 卡燒錄 32 位元的新版 Trixie OS, 測試發現Trixie OS 較吃記憶體, 跑 Selenium 爬蟲程式跑了超長的 20 幾分鐘才跑完 (Pi 400 大約 3 分鐘). 我想還是燒錄較舊的 OS 為宜, 就問 AI 在 Bookworm 以前的 Legacy Raspberry Pi OS 是 Buster 嗎? 它回覆是 Bulleye, 於是我去官網下載映像檔來燒錄 :




Bulleye 最後一版是 2025-05-07 發布的, 下載 .xz 檔解壓縮為 .img 檔 :





然後用 Raspberry Pi Imager 軟體選擇自定義映像檔來燒錄 :





注意要選對 drive 為 TF 卡驅動 :







燒錄完畢放入 Pi 3 開機, 依導引做完國家, 語系, 鍵盤, 與 WiFi 設定後重開機, 再用 sudo raspi-config 指令設定 :
  • 開啟 SSH
  • 開啟 VNC Viewer/Server
  • 設定 hostname
完成後重開機, 用 sudo vnclicensewiz 指令或直接按右上角 VNC 圖示登入 VNC Cloud 帳戶以便進行遠端桌面存取. 

先檢查系統與 OS :

pi@kaopi3:~ $ uname -a  
Linux kaopi3 6.1.21-v7+ #1642 SMP Mon Apr  3 17:20:52 BST 2023 armv7l GNU/Linux 
pi@kaopi3:~ $ lsb_release -a  
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
pi@kaopi3:~ $ cat /etc/issue  
Raspbian GNU/Linux 11 \n \l
pi@kaopi3:~ $ cat /etc/debian_version   
11.11
pi@kaopi3:~ $ cat /etc/os-release   
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

可見 CPU 為 ARMv71 架構, OS 為代號 Bulleye 的 Raspberry Pi OS (Debian 11.11), 檢查內建 Python 為 3.9.2 版, 應該還不算太舊 : 

pi@kaopi3:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()   

檢查內建 Python 套件 : 

pi@kaopi3:~ $ pip list  
Package           Version
----------------- ---------
arandr            0.1.10
astroid           2.5.1
asttokens         2.0.4
automationhat     0.2.0
beautifulsoup4    4.9.3
blinker           1.4
blinkt            0.1.2
buttonshim        0.0.2
Cap1xxx           0.1.3
certifi           2020.6.20
chardet           4.0.0
click             7.1.2
colorama          0.4.4
colorzero         1.1
cryptography      3.3.2
cupshelpers       1.0
dbus-python       1.2.16
distro            1.5.0
docutils          0.16
drumhat           0.1.0
envirophat        1.0.0
ExplorerHAT       0.4.2
Flask             1.1.2
fourletterphat    0.1.0
gpiozero          1.6.2
html5lib          1.1
idna              2.10
isort             5.6.4
itsdangerous      1.1.0
jedi              0.18.0
Jinja2            2.11.3
lazy-object-proxy 0.0.0
logilab-common    1.8.1
lxml              4.6.3
MarkupSafe        1.1.1
mccabe            0.6.1
microdotphat      0.2.1
mote              0.0.4
motephat          0.0.3
mypy              0.812
mypy-extensions   0.4.3
numpy             1.19.5
oauthlib          3.1.0
pantilthat        0.0.7
parso             0.8.1
pexpect           4.8.0
pgzero            1.2
phatbeat          0.1.1
pianohat          0.1.0
picamera          1.13
picamera2         0.3.12
pidng             4.0.9
piexif            1.1.3
piglow            1.2.5
pigpio            1.78
Pillow            8.1.2
pip               20.3.4
psutil            5.8.0
pycairo           1.16.2
pycups            2.0.1
pygame            1.9.6
Pygments          2.7.1
PyGObject         3.38.0
pyinotify         0.9.6
PyJWT             1.7.1
pylint            2.7.2
PyOpenGL          3.1.5
pyOpenSSL         20.0.1
PyQt5             5.15.2
PyQt5-sip         12.8.1
pyserial          3.5b0
pysmbc            1.0.23
python-apt        2.2.1
python-prctl      1.7
rainbowhat        0.1.0
reportlab         3.5.59
requests          2.25.1
requests-oauthlib 1.0.0
responses         0.12.1
roman             2.0.0
RPi.GPIO          0.7.0
RTIMULib          7.2.1
scrollphat        0.0.7
scrollphathd      1.2.1
Send2Trash        1.6.0b1
sense-hat         2.6.0
setuptools        52.0.0
simplejpeg        1.6.4
simplejson        3.17.2
six               1.16.0
skywriter         0.0.7
sn3218            1.2.7
soupsieve         2.2.1
spidev            3.5
ssh-import-id     5.10
thonny            4.0.1
toml              0.10.1
touchphat         0.0.1
twython           3.8.2
typed-ast         1.4.2
typing-extensions 3.7.4.3
unicornhathd      0.0.4
urllib3           1.26.5
v4l2-python3      0.3.2
webencodings      0.5.1
Werkzeug          1.0.1
wheel             0.34.2
wrapt             1.12.1

樹莓派 OS 是自下一版 Bookworm 才開始遵循 PEP 668 規範, 因此可以直接用 pip 安裝套件. 由於 Pi 3 主機我主要是拿來當爬蟲用, 爬靜態網頁用的 requests 與 beautifulsoup 都已內建, 但爬動態網頁用的 selenium 卻沒有, 所以先安裝此套件 : 

pi@kaopi3:~ $ pip install selenium   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting selenium
  Downloading https://www.piwheels.org/simple/selenium/selenium-4.36.0-cp39-cp39-linux_armv7l.whl (3.0 MB)
... (略) ...
Successfully installed attrs-25.4.0 certifi-2025.11.12 exceptiongroup-1.3.1 h11-0.16.0 outcome-1.3.0.post0 pysocks-1.7.1 selenium-4.36.0 sniffio-1.3.1 sortedcontainers-2.4.0 trio-0.31.0 trio-websocket-0.12.2 typing-extensions-4.15.0 urllib3-2.6.2 websocket-client-1.9.0 wsproto-1.2.0

跑 selenium 爬蟲還需安裝 chromium 與其 web driver : 

pi@kaopi3:~ $ sudo apt install -y chromium chromium-driver   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
The following packages were automatically installed and are no longer required:
  chromium-codecs-ffmpeg-extra libfuse2
Use 'sudo apt autoremove' to remove them.
... (略) ...
設定 chromium-driver (106.0.5249.119-1~deb11u1) ...
執行 man-db (2.9.4-2) 的觸發程式……
執行 mailcap (3.69) 的觸發程式……
執行 fontconfig (2.13.1-4.2) 的觸發程式……
執行 desktop-file-utils (0.26-1) 的觸發程式……
執行 hicolor-icon-theme (0.17-2) 的觸發程式……
執行 gnome-menus (3.36.0-1) 的觸發程式……
執行 libc-bin (2.31-13+rpt2+rpi1+deb11u11) 的觸發程式……

此外爬蟲結果會利用 Telegram 與 LINE 傳送訊息, 所以要安裝 SDK 套件 :

pi@kaopi3:~ $ pip install python-telegram-bot   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting python-telegram-bot
... (略)...
Requirement already satisfied: typing_extensions>=4.5 in ./.local/lib/python3.9/site-packages (from anyio->httpx<0.29,>=0.27->python-telegram-bot) (4.15.0)
Installing collected packages: httpcore, anyio, httpx, python-telegram-bot
  WARNING: The script httpx is installed in '/home/pi/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed anyio-4.12.0 httpcore-1.0.9 httpx-0.28.1 python-telegram-bot-22.5

pi@kaopi3:~ $ pip install line-bot-sdk   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: line-bot-sdk in ./.local/lib/python3.9/site-packages (3.21.0)
... (略)...

然後將最新版市圖爬蟲程式 ksml_lib_12.py 上傳到 Pi 3, 參考 :


執行結果如下 :

pi@kaopi3:~ $ python ksml_lib_12.py faxxxxxx 5xxxxx  
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': 'faxxxxxx 的資料已更新', 'status': 'success'}
執行時間:688.519543170929
pi@kaopi3:~ $ python ksml_lib_12.py 0xxxxx8 9xxxx7   
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': '0xxxxx8 的資料已更新', 'status': 'success'}
執行時間:117.28702139854431
pi@kaopi3:~ $ python ksml_lib_12.py 0xxxxx9 8xxxx6  
擷取借閱紀錄 ... OK
擷取預約紀錄 ... OK
產生借書到期摘要 ... OK
產生預約書摘要 ... OK
{'message': '0xxxxx9 的資料已更新', 'status': 'success'}
執行時間:90.50973629951477

借的書越多耗費時間越長 (第一個帳號約 10 分鐘), 但比 Trixie 下要快些了. 

最後上傳母校圖書館爬蟲 :


pi@kaopi3:~ $ python nkust_lib_10.py   
按其他讀者 ... OK
登入系統 ... OK
按名字顯現選單 ... OK
按我的借閱 ... OK
按全部續借 ... OK
搜尋被預約書籍 ... OK
訊息傳送成功!

2025-12-20 21:02:03
被預約的書:
 1. 持續買進 : 資料科學家的投資終極解答, 存錢及致富的實證方法 / 尼克.馬朱利(Nick Maggiulli)著 ; 李芳齡譯 (c.3) 到期日: 12/31/2025
執行時間:401.9524688720703

這樣算是把這片 Pi 3 主機拉回運行軌道了. 


2025-12-22 補充 :

在用 pip 安裝套件時出現如下 warning :

  WARNING: The script wsdump is installed in '/home/pi/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

消除此警告的方法是執行下列兩個指令 : 

pi@kaopi3:~ $ export PATH=$PATH:/home/pi/.local/bin    
pi@kaopi3:~ $ source ~/.bashrc

其次是內建套件無 pandas, 但有 numpy 1.19.5, 與此 numpy 搭配的是 pandas 1.3.5 :

pi@kaopi3:~ $ pip install pandas==1.3.5  
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pandas==1.3.5
... (略) ...
Installing collected packages: pytz, python-dateutil, pandas
Successfully installed pandas-1.3.5 python-dateutil-2.9.0.post0 pytz-2025.2

但安裝完匯入 pandas 卻出現錯誤 :

pi@kaopi3:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/__init__.py", line 22, in <module>
    from pandas.compat import (
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/compat/__init__.py", line 15, in <module>
    from pandas.compat.numpy import (
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/compat/numpy/__init__.py", line 7, in <module>
    from pandas.util.version import Version
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/util/__init__.py", line 1, in <module>
    from pandas.util._decorators import (  # noqa
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/util/_decorators.py", line 14, in <module>
    from pandas._libs.properties import cache_readonly  # noqa
  File "/home/pi/.local/lib/python3.9/site-packages/pandas/_libs/__init__.py", line 13, in <module>
    from pandas._libs.interval import Interval
  File "pandas/_libs/interval.pyx", line 1, in init pandas._libs.interval
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 48 from C header, got 40 from PyObject

解決之道是須先安裝 libatlas-base-dev 套件 :

pi@kaopi3:~ $ sudo apt-get install libatlas-base-dev   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
The following packages were automatically installed and are no longer required:
  chromium-codecs-ffmpeg-extra libfuse2
Use 'sudo apt autoremove' to remove them.
下列的額外套件將被安裝:
  libatlas3-base
建議套件:
  libatlas-doc liblapack-doc
下列【新】套件將會被安裝:
  libatlas-base-dev libatlas3-base
升級 0 個,新安裝 2 個,移除 0 個,有 0 個未被升級。
需要下載 5,055 kB 的套件檔。
此操作完成之後,會多佔用 26.5 MB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] y
下載:1 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf libatlas3-base armhf 3.10.3-10+rpi1 [2,454 kB]
下載:2 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf libatlas-base-dev armhf 3.10.3-10+rpi1 [2,601 kB]
取得 5,055 kB 用了 8s (664 kB/s)                                                            
選取了原先未選的套件 libatlas3-base:armhf。
(讀取資料庫 ... 目前共安裝了 107532 個檔案和目錄。)
正在準備解包 .../libatlas3-base_3.10.3-10+rpi1_armhf.deb……
Unpacking libatlas3-base:armhf (3.10.3-10+rpi1) ...
選取了原先未選的套件 libatlas-base-dev:armhf。
正在準備解包 .../libatlas-base-dev_3.10.3-10+rpi1_armhf.deb……
Unpacking libatlas-base-dev:armhf (3.10.3-10+rpi1) ...
設定 libatlas3-base:armhf (3.10.3-10+rpi1) ...
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/libblas.so.3 來提供 /usr/lib/arm-linux-gnueabihf/libblas.so.3 (libblas.so.3-arm-linux-gnueabihf)
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so.3 來提供 /usr/lib/arm-linux-gnueabihf/liblapack.so.3 (liblapack.so.3-arm-linux-gnueabihf)
設定 libatlas-base-dev:armhf (3.10.3-10+rpi1) ...
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/libblas.so 來提供 /usr/lib/arm-linux-gnueabihf/libblas.so (libblas.so-arm-linux-gnueabihf)
update-alternatives: 在自動模式下以 /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so 來提供 /usr/lib/arm-linux-gnueabihf/liblapack.so (liblapack.so-arm-linux-gnueabihf)
執行 libc-bin (2.31-13+rpt2+rpi1+deb11u13) 的觸發程式……

然後移除內建的 numpy, 重新安裝 numpy 1.19.5 :

pi@kaopi3:~ $ pip3 uninstall -y pandas numpy  
pip3 uninstall -y pandas numpy --user  
sudo apt remove -y python3-numpy python3-pandas   
Found existing installation: pandas 1.3.5 
Uninstalling pandas-1.3.5:
  Successfully uninstalled pandas-1.3.5
Found existing installation: numpy 1.19.5
Uninstalling numpy-1.19.5:
  Successfully uninstalled numpy-1.19.5

Usage:   
  pip3 uninstall [options] <package> ...
  pip3 uninstall [options] -r <requirements file> ...

no such option: --user
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
Package 'python3-numpy' is not installed, so not removed
Package 'python3-pandas' is not installed, so not removed
The following packages were automatically installed and are no longer required:
  chromium-codecs-ffmpeg-extra freeglut3 libfuse2 libglu1-mesa libmikmod3 libportmidi0
  libqt5designer5 libqt5help5 libqt5test5 librtimulib-dev librtimulib-utils librtimulib7
  libsdl-mixer1.2 libsdl-ttf2.0-0 libturbojpeg0 python3-kms++ python3-libcamera
  python3-opengl python3-piexif python3-prctl python3-pyqt5 python3-pyqt5.sip
  python3-rtimulib python3-v4l2
Use 'sudo apt autoremove' to remove them.
升級 0 個,新安裝 0 個,移除 0 個,有 0 個未被升級。

檢查有無殘餘垃圾 & 清理 cache : 

pi@kaopi3:~ $ find ~/.local/lib/python3.9/site-packages/ -name "numpy*" -o -name "pandas*"
pi@kaopi3:~ $ pip cache purge  
Files removed: 6

重新安裝 numpy 與 pandas :

pi@kaopi3:~ $ pip3 install --no-cache-dir "numpy<2.0" "pandas<2.1"  
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting numpy<2.0
  Downloading https://www.piwheels.org/simple/numpy/numpy-1.26.4-cp39-cp39-linux_armv7l.whl (5.6 MB)
Collecting pandas<2.1
  Downloading https://archive1.piwheels.org/simple/pandas/pandas-2.0.3-cp39-cp39-linux_armv7l.whl (38.7 MB)
  Downloading https://www.piwheels.org/simple/tzdata/tzdata-2025.3-py2.py3-none-any.whl (348 kB)
Requirement already satisfied: python-dateutil>=2.8.2 in ./.local/lib/python3.9/site-packages (from pandas<2.1) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in ./.local/lib/python3.9/site-packages (from pandas<2.1) (2025.2)
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.8.2->pandas<2.1) (1.16.0)
Installing collected packages: tzdata, numpy, pandas
Successfully installed numpy-1.26.4 pandas-2.0.3 tzdata-2025.3

此處指定 numpy 低於 2.0; pandas 低於 2.1 是因為 numpy 2.x 目前在 ARM 舊系統很容易出現衝突錯誤, 而 pandas 2.1+ 則會拉高 numpy 需求, 安裝版本為 numpy-1.26.4 pandas-2.0.3.

測試已可正常匯入 :

pi@kaopi3:~ $ python  
Python 3.9.2 (default, Mar 20 2025, 22:21:41) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd  
>>> import numpy as np    
>>> pd.__version__  
'2.0.3'
>>> np.__version__  
'1.26.4'

以下整理在 Bulleye OS 下安裝的套件模組, 先更新 pip : 

python -m pip install --upgrade pip  


1. 爬蟲相關 :  

Bulleye 內建的 requests 與 urllib3 太舊, 執行 selenium 會報錯, 需更新 :

pip install --upgrade requests urllib3 
pip install selenium

另外需安裝 chromium 與其 web driver :

sudo apt install -y chromium chromium-driver 

安裝 scrapy 之前須先安裝 libffi-dev 套件, 否則會因缺失 cffi 而失敗 :

sudo apt-get update
sudo apt-get install libffi-dev
pip install scrapy


2. 資料科學 & 機器學習 :  

Bulleye 內建 numpy (無 pandas), 但版本太舊安裝 pandas 會失敗, 先移除 : 

pip uninstall -y numpy
pip uninstall -y numpy --user 
sudo apt remove -y python3-numpy

檢查有無殘餘垃圾 & 清理 cache : 

find ~/.local/lib/python3.9/site-packages/ -name "numpy*" -o -name "pandas*"
pip cache purge

安裝 pandas 要用到的 C 擴充套件 :

sudo apt-get install libatlas-base-dev 

安裝指定版本的 numpy 與 pandas :

pip install --no-cache-dir "numpy<2.0" "pandas<2.1" 

其他套件 : 

pip install seaborn
pip install bokeh
pip install plotly
pip install scikit-learn

註 : scipy 是 scikit-learn 依賴套件, matplotlib 是 gradio 依賴套件


3. 架站套件 :  

Bulleye 已內建 Flask, 但無 Django 與 gradio :

pip install django

在 Bulleye 的 Python 3.9 安裝 gradio 只能到 4.44.1, 無法到最新版, 安裝完須將依賴的 markupsafe 版本降至 2.0.1 與把 huggingface_hub 降至舊版 0.36, 否則匯入 gradio 時會報錯 :  

pip install gradio
pip install markupsafe==2.0.1
python -m pip install "huggingface_hub<1.0" --upgrade --no-cache-dir 

這會安裝 huggingface_hub-1.2.3, 完成後用下列指令檢查是否可正常匯入 :

pi@kaopi3:~ $ python -c "import gradio; print('成功!版本:', gradio.__version__)"   
成功!版本: 4.44.1


4. 量化投資 :

yfinance 雖然可安裝, 但在 Bulleye 上無法搭配 curl_cffi 抓到股票資料, 故放棄安裝. 

pip install yfinance
pip install twstock
pip install mplfinance
pip install ta
pip install kbar
pip install backtrader
pip install pyfolio-reloaded


5. Bot 套件 : 

pip install line-bot-sdk
pip install python-telegram-bot


6. LLM 套件 : 

pip install openai
pip install google-generativeai

除了爬蟲套件以外, 其他都只是測試看看 Bulleye 多舊而已, 備而不用. 

沒有留言 :