華為Matebook 16s 2022在Deepin v23下的聲音、硬碟、電池等系統問題的解決

MeGusta發表於2024-06-30

手頭上的Matebook 16s 2022款筆記本配備的是Intel i5-12500H,手動替換了原裝的512固態硬碟為致鈦的PC005 1TB,系統環境是Deepin V23 RC2。

安裝系統之後,主要有3個問題需要解決:

1.筆記本沒有聲音,透過安裝github上的專案huawei-linux-sound-fix解決,需要注意的是,Deepin V23的軟體倉庫裡面缺少依賴項alsa-tools,必須先從Debian12的倉庫安裝alsa-tools再執行聲音修復補丁。

如果github無法訪問,可以從藍奏雲下載:https://thesats.lanzout.com/iUrwJ232p6gf

# 從Debian12倉庫下載並安裝alsa-tools包
wget http://ftp.cn.debian.org/debian/pool/main/a/alsa-tools/alsa-tools_1.2.5-3_amd64.deb -O  /tmp/alsa-tools_1.2.5-3_amd64.deb &&  sudo apt install /tmp/alsa-tools_1.2.5-3_amd64.deb

2.筆記本在睡眠喚醒之後,直接掉盤,系統只能強制斷電。這貌似是由於APST機制,睡眠的時候硬碟進入了P4深度省電狀態,導致系統喚醒的時候,無法喚醒硬碟,結果掉盤,這可以透過在grub配置檔案中新增引數解決,修改之後的引數為:

GRUB_CMDLINE_LINUX_DEFAULT="nvme_core.default_ps_max_latency_us=2000 splash quiet "

bash指令碼如下:

#!/bin/bash

# 問題:在安裝有致鈦PC005-1TB硬碟的Matebook16s-2022中,Deepin v23 RC2(Linux Kernel 6.6.25-amd64-desktop-hwe)在睡眠喚醒之後,硬碟掉盤。
# 該指令碼在/etc/default/grub的GRUB_CMDLINE_LINUX_DEFAULT引數中,新增nvme_core.default_ps_max_latency_us=2000,讓硬碟不處於P4狀態(深度省電狀態)。
# 參考連結:
# https://wiki.archlinux.org/title/Solid_state_drive/NVMe
# https://www.tekbyte.net/fixing-nvme-ssd-problems-on-linux

# 以下是致鈦PC005硬碟支援的電源狀態
# sudo smartctl -c /dev/nvme0n1 | grep -A7 "Supported Power States"
#
# Supported Power States
# St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
#  0 +     9.00W       -        -    0  0  0  0        0       0
#  1 +     4.60W       -        -    1  1  1  1        0       0
#  2 +     3.80W       -        -    2  2  2  2        0       0
#  3 -   0.0450W       -        -    3  3  3  3     2000    2000
#  4 -   0.0040W       -        -    4  4  4  4    15000   15000

echo "matebook16s解決NVME硬碟睡眠喚醒掉盤的問題-root.sh"

# 檢查指令碼是否以sudo許可權執行
if [ "$EUID" -ne 0 ]; then
    echo "請以sudo許可權執行此指令碼"
    exit 1
fi

# 檢查系統中是否存在NVMe硬碟
NVME_DISKS=$(ls /dev/nvme*n1 2> /dev/null)

if [ -z "$NVME_DISKS" ]; then
    echo "系統中不存在NVMe硬碟,退出"
    exit 1
fi

# 顯示每個NVMe硬碟的資訊
for DISK in $NVME_DISKS; do
    echo -e "\033[35m硬碟資訊:$DISK\033[0m"
    sudo smartctl -c $DISK | grep -A7 "Supported Power States"
done

# 讀取GRUB_CMDLINE_LINUX_DEFAULT的值
GRUB_CMDLINE=$(grep -oP '^GRUB_CMDLINE_LINUX_DEFAULT="\K[^"]+' /etc/default/grub)

# 檢查nvme_core.default_ps_max_latency_us引數是否存在
if [[ $GRUB_CMDLINE =~ nvme_core.default_ps_max_latency_us=([0-9]+) ]]; then
    # 如果存在,檢查其值是否為2000
    if [ ${BASH_REMATCH[1]} == 2000 ]; then
        echo "nvme_core.default_ps_max_latency_us=2000"
        echo "grub引數已正確設定,無需調整..."
        exit 0
    else
        echo "當前引數nvme_core.default_ps_max_latency_us=${BASH_REMATCH[1]},將其改為2000"
        # 替換引數值
        GRUB_CMDLINE=${GRUB_CMDLINE//nvme_core.default_ps_max_latency_us=${BASH_REMATCH[1]}/nvme_core.default_ps_max_latency_us=2000}
        # 更新/etc/default/grub檔案
        sudo sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"$GRUB_CMDLINE\"/" /etc/default/grub
        # 更新grub配置
        sudo grub-mkconfig -o /boot/grub/grub.cfg
        echo "請重啟系統,來讓引數生效..."
    fi
else
    echo "引數nvme_core.default_ps_max_latency_us=2000不存在,新增該引數"
    # 備份grub檔案
    sudo cp /etc/default/grub /etc/default/grub.bak
    echo "已備份原始grub檔案為grub.bak"
    # 新增引數
    GRUB_CMDLINE="$GRUB_CMDLINE nvme_core.default_ps_max_latency_us=2000"
    # 更新/etc/default/grub檔案
    sudo sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"$GRUB_CMDLINE\"/" /etc/default/grub
    # 更新grub配置
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    echo "請重啟系統,來讓引數生效...."
fi

 3.筆記本充電沒有開啟電池保養功能,需要安裝tlp來設定,電量高於81%時停止充電,低於75%時充電。設定上限是81%而不是80%,是因為設定到80%停止充電時,系統會一直顯示“電量79%”,對強迫症不友好。

bash指令碼如下:

#!/bin/bash

echo "matebook16s設定電池保養功能-root.sh"

# 檢查使用者是否具有root/sudo許可權
if [ "$(id -u)" != "0" ]; then
   echo -e "\033[31m請以root/sudo使用者身份執行此指令碼。\033[0m" 1>&2
   # 按任意鍵退出
   echo "按任意鍵退出..."
   read -n 1
   exit 1
fi

sudo apt install tlp -y

# 定義檔案路徑
FILE="/etc/tlp.conf"

# 顯示電池資訊
clear
echo -e "\033[31m電池詳情如下:\033[0m"
tlp-stat -b
echo "-------------------------------------------------"

# 複製檔案
cp /etc/tlp.conf /etc/tlp.conf.bak

# 檢查是否已經存在修改後的這兩行
if grep -Fxq "START_CHARGE_THRESH_BAT0=75" /etc/tlp.conf && grep -Fxq "STOP_CHARGE_THRESH_BAT0=81" /etc/tlp.conf
then
    echo -e "\033[31m電池保養功能已開啟,電池將在低於75%時充電,高於80%時停止充電\033[0m"
else
    # 修改檔案
    sed -i 's/#START_CHARGE_THRESH_BAT0=75/START_CHARGE_THRESH_BAT0=75/g' /etc/tlp.conf
    sed -i 's/#STOP_CHARGE_THRESH_BAT0=80/STOP_CHARGE_THRESH_BAT0=81/g' /etc/tlp.conf

    # 檢查是否修改成功
    if grep -Fxq "START_CHARGE_THRESH_BAT0=75" /etc/tlp.conf && grep -Fxq "STOP_CHARGE_THRESH_BAT0=81" /etc/tlp.conf
    then
        # 執行tlp start
        tlp start > /dev/null
        echo -e "\033[31m電池保養功能已開啟,電池將在低於75%時充電,高於80%時停止充電\033[0m"
    else
        echo -e "\033[31m/etc/tlp.conf修改失敗,請檢查該檔案...\033[0m"
    fi
fi

echo "想要臨時完全充滿電池,請執行sudo tlp fullcharge BAT0"
# 按任意鍵退出
echo "按任意鍵退出..."
read -n 1
exit 0

相關文章