針對特定晶片 (如 Intel ICH 系列) 在特定內核版本下無聲音問題,手工編譯安裝 ALSA (alsa-driver、alsa-lib、alsa-utils) 往往是最後手段。本文記錄完整編譯參數、常見報錯修復、模塊加載驗證、mpg123 測試播放、開機自動恢復音量的全流程。
snd-intel8x0/usr/src/linux-2.4 (舊版本示例,現代內核 5.x/6.x 已內建 ALSA,通常無需手工編譯)# 1. 解壓並進入
tar zxvf alsa-driver-1.0.9b_26_evoc.tar.gz
cd alsa-driver-1.0.9b_26
# 2. 清理舊構建
make clean
# 3. 配置:指定內核源碼路徑、目標聲卡驅動
./configure --with-kernel=/usr/src/linux-2.4 --with-cards=intel8x0
# 4. 編譯安裝
make
make install
# 5. 創建設備節點 (傳統內核需手動)
./snddevices
# 現象:modprobe snd-intel8x0 提示 "unresolved symbol schedule_work"
# 原因:內核 API 變更,需觸發 workqueue.h 重新生成
touch include/linux/workqueue.h
make clean
make
make install
tar jxvf alsa-lib-1.0.9.tar.bz2
cd alsa-lib-1.0.9
./configure
make
make install
tar jxvf alsa-utils-1.0.9a.tar.bz2
cd alsa-utils-1.0.9a
./configure
make
make install
# 方法一:直接加載模塊
modprobe snd-intel8x0
# 方法二:alsaconf 互動式配置 (已棄用,新版無)
# alsaconf
# 關鍵:OSS 兼容層 (舊程序需 /dev/dsp)
modprobe snd-pcm-oss
modprobe snd-mixer-oss
modprobe snd-seq-oss
tar zxvf mpg123-0.59r.tar.gz
cd mpg123-0.59r
make linux
make install
# 測試播放
mpg123 /root/test.mp3
# 無聲音時:啟動 alsamixer 取消靜音 (MM -> 00),調整音量
alsamixer
# 保存音量狀態
alsactl store
# 編輯啟動腳本
vi /etc/rc.local
# 在 exit 0 前添加
alsactl restore
現代 systemd 系統建議建立服務單元:
# /etc/systemd/system/alsactl-restore.service
[Unit]
Description=Restore ALSA Volume State
After=sound.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/alsactl restore
[Install]
WantedBy=multi-user.target
# 啟用
systemctl enable --now alsactl-restore
主線內核已整合 ALSA,絕大多數聲卡開箱即用。無聲音時排查順序:
lspci -v | grep -A7 -i audio 確認硬體被識別dmesg | grep -i snd 查看驅動加載日誌lsmod | grep snd 確認模塊已載入speaker-test -c2 -twav 系統自帶測試alsamixer / pavucontrol (PulseAudio/PipeWire) 檢查靜音/音量/輸出設備journalctl -u pipewire -u wireplumber 檢查音頻服務日誌避坑指南:手工編譯 ALSA 僅適用於內核樹內驅動確實有 Bug 且上游未修復的極端情況。常規情況請升級內核、安裝 alsa-firmware、檢查 alsa-ucm-conf 設備配置檔。切勿在生產環境混用手工編譯模塊與發行版內核模塊,極易導致符號版本衝突。