[Share Experiences] Matebook 16s 2022在Deepin v23/UOS v20 1070 下睡眠恢复掉盘的问题
Tofloor
poster avatar
MeGusta
deepin
2024-08-18 22:40
Author

说明:也许是个性化的硬件问题,不一定具有代表性。Matebook16s原装的硬盘也是同样的问题。

问题表现:在安装有致钛PC005-1TB硬盘的Matebook16s-2022(i5-12500H)中,UOS v20 1070/Deepin v23 RC2(Linux Kernel 6.6.25-amd64-desktop-hwe)在睡眠唤醒之后,硬盘掉盘。由于目前更换到UOS下工作,所以没有在Deepin v23 正式版中测试。
解决方法:在/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

脚本:

#!/bin/bash

# 问题:在安装有致钛PC005-1TB硬盘的Matebook16s-2022中,UOS v20 1070/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
Reply Favorite View the author
All Replies

No replies yet