众所周知,在 NAND 单元死亡之前,SSD 的 PE(编程-擦除)周期次数是有限的。
因此,了解已写入 SSD 的数据量非常有帮助,这样可以确定在 NAND 损坏之前它还能使用多长时间。
我有一台三星 850 Pro 512GB SSD,正在运行 Ubuntu 14.04。
如何获取我的驱动器的 TBW (总写入字节数)?
答案1
完全披露:本答案中出现的脚本/命令不是我自己的,而是 JDG Leaver 的作品。它们来源于他网站上的博客文章。
重要的提示
- 这只会报告三星 SSD 的准确数字。
- 您需要
smartctl
从包中安装smartmontools
。
方法 1
这是一个方便的小脚本,可以让你监控 SSD 的 TBW 以及一些其他信息:
#!/bin/bash
#######################################
# Variables #
#######################################
SSD_DEVICE="/dev/sda"
ON_TIME_TAG="Power_On_Hours"
WEAR_COUNT_TAG="Wear_Leveling_Count"
LBAS_WRITTEN_TAG="Total_LBAs_Written"
LBA_SIZE=512 # Value in bytes
BYTES_PER_MB=1048576
BYTES_PER_GB=1073741824
BYTES_PER_TB=1099511627776
#######################################
# Get total data written... #
#######################################
# Get SMART attributes
SMART_INFO=$(sudo /usr/sbin/smartctl -A "$SSD_DEVICE")
# Extract required attributes
ON_TIME=$(echo "$SMART_INFO" | grep "$ON_TIME_TAG" | awk '{print $10}')
WEAR_COUNT=$(echo "$SMART_INFO" | grep "$WEAR_COUNT_TAG" | awk '{print $4}' | sed 's/^0*//')
LBAS_WRITTEN=$(echo "$SMART_INFO" | grep "$LBAS_WRITTEN_TAG" | awk '{print $10}')
# Convert LBAs -> bytes
BYTES_WRITTEN=$(echo "$LBAS_WRITTEN * $LBA_SIZE" | bc)
MB_WRITTEN=$(echo "scale=3; $BYTES_WRITTEN / $BYTES_PER_MB" | bc)
GB_WRITTEN=$(echo "scale=3; $BYTES_WRITTEN / $BYTES_PER_GB" | bc)
TB_WRITTEN=$(echo "scale=3; $BYTES_WRITTEN / $BYTES_PER_TB" | bc)
# Output results...
echo "------------------------------"
echo " SSD Status: $SSD_DEVICE"
echo "------------------------------"
echo " On time: $(echo $ON_TIME | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta') hr"
echo "------------------------------"
echo " Data written:"
echo " MB: $(echo $MB_WRITTEN | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo " GB: $(echo $GB_WRITTEN | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo " TB: $(echo $TB_WRITTEN | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo "------------------------------"
echo " Mean write rate:"
echo " MB/hr: $(echo "scale=3; $MB_WRITTEN / $ON_TIME" | bc | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo "------------------------------"
echo " Drive health: ${WEAR_COUNT} %"
echo "------------------------------"
以下是输出示例:
------------------------------
SSD Status: /dev/sda
------------------------------
On time: 2 hr
------------------------------
Data written:
MB: 25,098.917
GB: 24.510
TB: .023
------------------------------
Mean write rate:
MB/hr: 12,549.458
------------------------------
Drive health: 100 %
------------------------------
这个数据是准确的,因为我刚刚安装了新的 850 Pro。
方法 2
另外,这里有一行代码可以仅获取 TBW:
echo "GB Written: $(echo "scale=3; $(sudo /usr/sbin/smartctl -A /dev/sda | grep "Total_LBAs_Written" | awk '{print $10}') * 512 / 1073741824" | bc | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
答案2
如何查找信息
我们可以用它smartctl
来找到TBW的值。
安装
smartctl
$ sudo apt install smartmontools
得到扇区大小和左心室射血分数
$ sudo smartctl -Ai /dev/sda
在这种情况下,为设备写入/dev/sda
一些数学知识:
[sector size] * [LBA written] / 1024^3 = X GiB
到目前为止
设备 /dev/sda 的示例
$ sudo smartctl -Ai /dev/sda | grep -E 'Sector Size|Total_LBAs_Written'
Sector Size: 512 bytes logical/physical
241 Total_LBAs_Written 0x0032 099 099 000 Old_age Always - 1214641768
$ calc 1214641768*512/1024^3
579.186328887939453125
在这种情况下,扇区大小为 512 字节,这是很常见的,写入的总 LBA 为 1214641768。到目前为止,写入了 579 GiB。这是有道理的,因为这个驱动器相对较新。
命令calc
可以安装$ sudo apt install calc
或者使用其他东西。
更多信息
该命令$ sudo smartctl -A /dev/sda
提供有关“供应商特定的 SMART 属性”的信息,这意味着您的驱动器显示的内容可能与此不同。在示例中,我使用了具有所需信息的三星 SSD。
金士顿固态硬盘
按照@JuliSmz 在其评论中所说,此 PDF,我怀疑Total_LBAs_Written
(至少是一些)金士顿 SSD 返回的数据已经是 GB 了。
在 PDF 的最后一页查找 ID 241。它显示:
描述:表示在驱动器的使用寿命内主机系统写入驱动器的字节数(以 1 GB 分辨率计算)。
理由:此属性返回字节数,以 GB 为单位,更新分辨率为 1 GB。计数表示写入的字节数。此属性会一直读取,
0
直到写入的字节数达到 1 GB;当写入的字节数达到额外的 GB 时,此属性的值将递增为1
(十进制)。笔记:早于 520ABBF0 的客户端固件和早于 510ABBF0 的企业固件直到 64GB 的数据写入驱动器后才更新分辨率。
答案3
Crucial 固态硬盘
有关 Crucial SSD 剩余使用寿命百分比,请参阅这里。
本文档将 202 标识为剩余使用寿命百分比。例如,在 Ubuntu 16.04(sudo smartctl /dev/sda1 -a
smartmontools 的一部分)上,202 报告为未知,但值 90 表示剩余使用寿命为 90%。在 Ubuntu 20.04 上,剩余使用寿命被正确识别和列出。
答案4
感谢您的启发,稍微修改了脚本,适用于我的 SSD。我必须将扇区大小 512 乘以校正因子 65535,请检查,如果您需要它。如果不确定,请与 CrystalDiskInfo、SSD-Z 等 Windows 程序进行比较。
#!/bin/bash
# Usage e.g. : bash ssd-tbw.bash
# or: bash ssd-tbw.bash /dev/sdb
# or: for i in /dev/sd{a,b,c,d}; do bash ssd-tbw.bash $i;done
# Source : https://askubuntu.com/questions/865792/how-can-i-monitor-the-tbw-on-my-samsung-ssd
device=${1:-/dev/sda}
#device=${1:-/dev/sdb}
echo DEVICE : $device
#DEVICE
sudo /usr/sbin/smartctl -a $device | grep -i 'device'
# sector size 512, correction factor 64k = 65535, see line : bytes = ...
sudo smartctl -A $device |awk '
$0 ~ /Power_On_Hours/ { poh=$10; printf "%s / %d hours / %d days / %.2f years\n", $2, $10, $10 / 24, $10 / 24 / 365.25 }
$0 ~ /Total_LBAs_Written/ {
lbas=$10;
bytes=$10 * 512 * 65535;
mb= bytes / 1024^2;
gb= bytes / 1024^3;
tb= bytes / 1024^4;
printf "%s / %s / %d mb / %.1f gb / %.3f tb\n", $2, $10, mb, gb, tb
printf "mean writes per hour: / %.2f", mb/poh
}
$0 ~ /Airflow_Temperature_Cel/ { print $2 " / " $10}
$0 ~ /Wear/ { printf "%s / %d (%% health)\n", $2, int($4) }
' |
sed -e 's:/:@:' |
sed -e "s\$^\$$device @ \$" |
column -ts@
#Health only :
sudo /usr/sbin/smartctl -H $device
# wait for keyboard input, helpful if executed by launcher file
read -p "Press Enter to continue" </dev/tty
还有一个用于桌面“ssd-tbw.desktop”的小型启动文件,请根据您的需要编辑 USER 等:
[Desktop Entry]
Version=1.0
Exec=/home/USER/ssd-tbw.bash
Name=Smartctl Script
GenericName=Smartctl Script
Comment=Smartctl Script
Encoding=UTF-8
Terminal=true
Type=Application
Categories=Application;
Name[de_DE]=Smartctl Check