закинуть в файл
Total_LBAs_Written и сделать его исполняемым:
chmod +x Total_LBAs_Written
сам скрипт
#!/usr/bin/env bash
##############################################################################################################
# Описание
#
# Определение количества записанных данных на диск за всё время его работы исходя из RAW показателей smartctl
# Грубо говоря, это перевод значения показателя Total_LBAs_Written в человеко понятный вид за счет сравнения его
# показателей до и после записи тестового файла на выбранный диск.
#
#
# Условие работы
#
# Для работы программы в системе должны присутствовать следующие утилиты:
# smartctl
# fzf
#
#
# Использование
#
# Примеры запуска программы:
# $ sudo Total_LBAs_Written
# $ sudo Total_LBAs_Written 2G
# $ sudo Total_LBAs_Written 100М
#
# далее в меню выберите нужный диск и нажмите Enter
# по умолчанию тестовый файл берётся в 1 гиг, но можно указать и своё значения передав его программе первым параметром.
# В меню будут отображаться тока те диски которые соответствуют критериям:
# - несъёмный
# - примонтирован в системе
# - не быть в режиме только для чтения (для возможности записи на него временных тестовых данных)
# - иметь достаточно места для записи тестового файла
#
#
# Пример вывода программы
#
# $ sudo Total_LBAs_Written 100M
# Total_LBAs_Written (1) = 5860217375
# Total_LBAs_Written (2) = 5860422239 ~ 2999598811739 bytes = 2,8T
# (2) - (1) = 204864 ~ 104857600 bytes = 100M (test file size)
# ==============================================================================
# Итого на диск /dev/sda было всего записанно порядка 2,8T
#
##############################################################################################################
# set -o xtrace
set -o nounset
set -o errexit
set -o pipefail
TESTFILE_SIZE=${1:-1G}
TESTFILE_SIZE_BYTES=$(numfmt --from=iec $TESTFILE_SIZE)
disk_partitions(){
lsblk -plo PKNAME,NAME,MOUNTPOINT $(lsblk -rbpo "PATH,RM,RO,FSAVAIL" |awk -v size=$TESTFILE_SIZE_BYTES '$2==0&&$3==0&&$4>size{print $1}')
}
export TESTFILE_SIZE_BYTES
export -f disk_partitions
SELECTED_PARTITION=$(disk_partitions \
|fzf --bind 'ctrl-r:reload(bash -c 'disk_partitions')' \
--header $'Ctrl+c\t- выйти\nCtrl+r\t- обновить\nEnter\t- выбрать\n\n' \
--header-lines=1 \
--layout=reverse \
|awk '{print $2}' )
DISK=$(lsblk -npo PKNAME $SELECTED_PARTITION)
TLW1=$(smartctl -a $DISK | awk '/Total_LBAs_Written/{print $NF}')
[[ -z $TLW1 ]] && echo "Параметр Total_LBAs_Written на текущем диске $DISK не найден !!!" && exit 1
TESTFILE_PATH=$(lsblk -no MOUNTPOINTS $SELECTED_PARTITION)/testfile
sync -f $SELECTED_PARTITION
dd if=/dev/zero of=$TESTFILE_PATH bs=$TESTFILE_SIZE_BYTES count=1 status=none
sync -d $TESTFILE_PATH
rm $TESTFILE_PATH
TLW2=$(smartctl -a $DISK | awk '/Total_LBAs_Written/{print $NF}')
echo "Total_LBAs_Written (1) = "$TLW1
TLW2_SIZE=$(echo "$TLW2*$TESTFILE_SIZE_BYTES/($TLW2-$TLW1)"|bc)
echo "Total_LBAs_Written (2) = $TLW2 ~ $TLW2_SIZE bytes = "$(numfmt --to=iec $TLW2_SIZE)
echo " (2) - (1) = $[TLW2-TLW1] ~ $TESTFILE_SIZE_BYTES bytes = "$(numfmt --to=iec $TESTFILE_SIZE_BYTES)" (test file size)"
echo ==============================================================================
echo "Итого на диск $DISK за всё время его работы было записанно порядка $(numfmt --to=iec $TLW2_SIZE)"
exit