Linux 內核樹內驅動 (uvcvideo/gspca) 已覆蓋絕大多數 USB 攝像頭,但新款/冷門設備可能需手工編譯最新版 gspca (含 spca5xx、sn9c20x 等子驅動)。本文記錄官網下載、編譯安裝、模塊加載、Camorama 測試、DKMS 自動重建、udev 規則持久化的完整流程。
# 查看 USB 設備
lsusb
# 輸出示例:Bus 001 Device 004: ID 0ac8:3420 Z-Star Microelectronics Corp. Venus USB2.0 Camera
# 記錄 VID:PID (0ac8:3420)
# 內核版本
uname -r
# 例如 5.15.0-91-generic
# 官方倉庫 (已遷移至內核主線,歷史版本歸檔)
# https://github.com/torvalds/linux/tree/master/drivers/media/usb/gspca
# 或舊版獨立發布:https://mxhaard.free.fr/download.html
# 以內核源碼同步編譯為例 (推薦)
apt-get install linux-headers-$(uname -r) build-essential dkms
cd /usr/src/linux-headers-$(uname -r)
# 驅動源碼已在 drivers/media/usb/gspca/
# 下載獨立包 (歷史版本)
wget https://mxhaard.free.fr/spca5xx/gspcav1-20071224.tar.gz
tar xzf gspcav1-20071224.tar.gz
cd gspcav1-20071224
# 編譯
make
# 安裝模塊到內核模塊目錄
sudo make install
# 加載驅動 (自動選擇匹配子驅動)
sudo modprobe gspca_main
# 或具體子驅動
sudo modprobe spca5xx
sudo modprobe gspca_zc3xx
sudo modprobe gspca_sonixj
# ... 具體視 lsusb 輸出匹配
# 創建 dkms.conf
cat <<EOF | sudo tee /usr/src/gspca-1.0/dkms.conf
PACKAGE_NAME="gspca"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="gspca_main"
BUILT_MODULE_LOCATION[0]="."
DEST_MODULE_LOCATION[0]="/kernel/drivers/media/usb/gspca"
AUTOINSTALL="yes"
MAKE[0]="make -C \${kernel_source_dir} M=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build modules"
CLEAN="make -C \${kernel_source_dir} M=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build clean"
EOF
# 複製源碼到 DKMS 目錄
sudo cp -r . /usr/src/gspca-1.0/
# 添加、構建、安裝
sudo dkms add -m gspca -v 1.0
sudo dkms build -m gspca -v 1.0
sudo dkms install -m gspca -v 1.0
# 安裝
sudo apt install camorama # Debian/Ubuntu
sudo dnf install camorama # Fedora
# 啟動
camorama
# 界面顯示實時預覽即驅動正常
# 支援亮度/對比度/色調調節、拍照、定時拍攝
# 查看視頻設備節點
ls -l /dev/video*
# /dev/video0, /dev/video1...
# v4l2-ctl 詳細信息
sudo apt install v4l-utils
v4l2-ctl --list-devices
v4l2-ctl -d /dev/video0 --all
# ffmpeg 快速測試錄製 5 秒
ffmpeg -f v4l2 -i /dev/video0 -t 5 -c:v libx264 test.mp4
# 內核日誌排查
dmesg -T | grep -i -e gspca -e uvc -e video
# 關鍵詞:probe, registered, control, format
# /etc/udev/rules.d/99-webcam.rules
# 固定設備節點權限,允許 video 組訪問
KERNEL=="video[0-9]*", GROUP="video", MODE="0660"
# 固定符號鏈接 (可選)
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="0ac8", ATTRS{idProduct}=="3420", SYMLINK+="webcam_zstar"
# 重載規則
sudo udevadm control --reload-rules
sudo udevadm trigger
主線內核已整合 uvcvideo (UVC 標準設備) 和完整 gspca 子驅動家族。絕大多數攝像頭插入即用,無需手工編譯。
# 標準檢查流程
lsusb -t | grep -i video
lsmod | grep -E 'uvcvideo|gspca'
v4l2-ctl --list-devices
# 以上均正常即驅動已加載
# 無畫面時排查
dmesg -w | grep -i usb
# 觀察插拔日誌
v4l2-ctl -d /dev/video0 --list-formats-ext
# 確認支援格式 (MJPG/YUYV/H264)
# 選擇正確格式啟動應用
| 現象 | 可能原因 | 排查方向 |
|---|---|---|
| /dev/video0 不存在 | 驅動未加載、設備未識別、USB 供電不足 | dmesg、lsusb、換 USB 口/供電集線器 |
| 畫面綠/紫/花屏 | 格式協商失敗 (MJPG vs YUYV)、分辨率不支援 | v4l2-ctl --list-formats-ext、指定格式啟動 |
| 權限拒絕 | 用戶不在 video 組 | usermod -aG video $USER 重新登入 |
| 延遲極高 | USB 2.0 帶寬不足、編碼格式無硬解 | 降低分辨率/幀率、啟用 MJPG/H264 硬編 |
| 多攝像頭衝突 | 同一 USB 控制器帶寬耗盡 | 分散至不同控制器、降低帶寬佔用 |