Disk Test Betiği

Başlatan mhmtkrktr, 04 Aralık 2017 - 13:44:03

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mhmtkrktr




Not 1: Kullanıcı dizini altında 300MB ile 2.5GB arasında boyutu olan bir dizin varsa uygun dizini kendisi bulacaktır. Eğer bu boyutta bir dizin yoksa betiğe ilave dosya girilebilir.
Not 2: Çalışması için hdparm paketinin kurulu olması gerekir. (Arch tabanlılar için kendisi denetler, diğer dağıtımların kurulum durumu hakkında bilgim yok)

#!/bin/bash
#
#
CNF="$(tput sgr0)"
CLB="$(tput bold)"
CDO="${CLB}$(tput setaf 202)"
CDB="${CLB}$(tput setaf 4)"
CLB="${CLB}$(tput setaf 33)"
CDP="${CLB}$(tput setaf 5)"
CLR="${CLB}$(tput setaf 124)"
CDY="${CLB}$(tput setaf 3)"

MSG1="\n ${CDO}SAĞLIK TARAMASI YAPILIYOR ...\n${CNF}"
MSG2="${CDB}Disk Sağlıklı${CNF}"
MSG3="${CLR}Bozuk Alan Bulundu${CNF}"
MSG4="\r ${CDO}OKUMA HIZI ÖLÇÜLÜYOR ...  ${CDP}KALAN TEST :${CNF}"
MSG5="${CDO}DİZİNİ SEÇİLDİ\n\n\t\tDİZİN ARŞİVLENİYOR...\n${CNF}"
MSG6="\r ${CDO}YAZMA HIZI ÖLÇÜLÜYOR ...  ${CDP}KALAN TEST :${CNF}"
MSG7="${CDB}dakika${CNF}"
MSG8="${CDB}saniye${CNF}"
MSG9="${CLR}\n UYGUN BOYUTTA BİR DİZİN BULUNAMADI !\n -+ 1GB BOYUTUNDA BİR DİZİNİ ./script /dosya/yolu ŞEKLİNDE GİREBİLİRSİNİZ...\n ${CNF}"
MSG10="\n\n    ${CDO}[ A ]  ${CDY}Temel\t${CDO}[ s ]  ${CDY}Okuma/Yazma\t${CDO}[ d ]  ${CDY}Sağlık\t${CDO}[ f ]  ${CDY}Tümü\n"
MSG11="${CDB}İÇİN SEÇİMİNİZİ GİRİNİZ"
MSG12="${CLB}..................................................................................${CNF}"
MSG13="${CLB}........................"

  if ! type hdparm &>/dev/null; then
    if type pacman &>/dev/null; then
      sudo pacman -S hdparm
    else exit
    fi
  fi

  cd ~
test_dir_selection() {
  FILE=$(du -h $(ls) | sort -h)
  if grep -q '[5-9][0-9][0-9]M' <<<"$FILE"; then
    FILE=$(grep '[5-9][0-9][0-9]M' <<<"$FILE"|tail -1)
  elif grep -q '^1,[0-9]G' <<<"$FILE"; then
    FILE=$(grep '^1,[0-9]G' <<<"$DU"|head -1)
  elif grep -q '[3-4][0-9][0-9]M' <<<"$FILE"; then
    FILE=$(grep '[3-4][0-9][0-9]M' <<<"$FILE"|tail -1)
  elif grep -q '^2,[0-5]G' <<<"$FILE"; then
    FILE=$(grep '^2,[0-5]G' <<<"$DU"|head -1)
  elif [[ -n "$1" ]]; then
    FILE="$1"
  else
    echo -e "${MSG9}"; exit
  fi

  FILE1=$(awk '{print $1}' <<<"$FILE")
  FILEX=$(awk '{ $1=""; print}' <<<"$FILE"|sed "s|^|$HOME/|;s| ||")
  FILE2=$(sed "s| |_|g" <<<"$FILEX")
  mv "$FILEX" "$FILE2"
}

cache_discharge() {
  sudo sync
  echo 3 |sudo tee /proc/sys/vm/drop_caches &>/dev/null
  [[ $(which blockdev 2>/dev/null) ]] && \
  sudo blockdev --flushbufs "$DEV"
  sudo hdparm -F "$DEV"
}

test_write_speed() { echo
SUM=0
CNT=5
for i in {1..5}; do
    echo -ne "${MSG6} $CNT"
    [[ -d TESTDIR$i ]] || mkdir TESTDIR$i
    REC=$(dd if=test.tar.gz of=TESTDIR$i/test.tar 2>randomfile;
    cat randomfile|rev|cut -d' ' -f2|rev|cut -d, -f1|tail -1)
    SUM=$(($SUM + $REC))
    CNT=$(("$CNT" - 1))
done
  WRITE=$(($SUM / 5))
  rm -r "$HDVC"
  clear; sleep 1
}

test_read_speed() { cache_discharge &>/dev/null
clear; sleep 1; echo
SUM=0
CNT=5
for i in {1..5}; do
  echo -ne "${MSG4} $CNT"
    REC=$(sudo hdparm -t $DEV)
    REC=$(echo $REC|cut -d= -f2|cut -d. -f1|tr -cd [0-9])
    SUM=$(("$SUM" + "$REC"))
    CNT=$(("$CNT" - 1))
done
  READ=$(($SUM / 5))
  clear; sleep 1
}

press_selection_file() {
echo -e "${CDP}\n  $(tr [a-z] [A-Z] <<<$FILE2) ${MSG5}"; sleep 3
  DK=''
  STR=$(date +%s)
    tar -zcvf test.tar.gz "$FILE2" 2>/dev/null
    [[ -f test.tar.gz ]] || exit
  END=$(date +%s)
  DIFF=$(("$END"-"$STR"))
    if [[ "$DIFF" -ge 60 ]]; then
        DK=$(("$DIFF"/60))
        SN=$(("$DIFF"%60))
    else
        SN="$DIFF"
    fi
    if [[ -n "$DK" ]]; then
        TIME="${CDB}$DK ${MSG7} ${CDB}$SN ${MSG8}"
    else
        TIME="${CDB}$SN ${MSG8}"
    fi
  clear; sleep 1
}
bad_sector_scaning() { clear; sleep 1
  echo -e "${MSG1}"
  sudo badblocks -sv "$DEV" 2>&1 |tee badblock
  if [[ $(grep 'Pass' badblock|awk '{print $3}') -eq 0 ]]; then
    DSD="${MSG2}"
  else
    DSD="${MSG3}"
  fi
  clear; sleep 1
}

move_to_work_area() {
  test_dir_selection
  [[ -d "$FILE2" ]] || exit
  [[ -d "$HOME/HDVC" ]] || mkdir "$HOME/HDVC"
  HDVC="$HOME/HDVC"; cd "$HDVC"
}

check_dev_disk_uid() {
  for i in $(echo "$UID_DIR"); do
    if grep -q "$i" <<<"$LSB_UI"; then
      CON_T=$(awk '/'"$i"'/{print $1}' <<<$LSB_UI)
      CON_F=$(grep "$CON_T" <<<"$FORM"| awk '{print $2}')
      CON_C=$(grep "$CON_T" <<<"$FORM"| awk '{print $4}')
        [[ $(grep -i 'swap' <<<"$CON_F") ]] && CON_F=none
        [[ $(grep -i 'swap' <<<"$CON_C") ]] && CON_C=swap
      P="${CON_T: -1}"
      CONN=$(grep "$CON_F" <<<"$FSI"|grep "$CON_C"| \
      grep -oP "(?<=$UI_VAR=)[^ ]+"|awk '{print $1}')
      SIZE=$(lsblk -o SIZE /dev/${CON_T}|grep -v 'SIZE'| \
      xargs|sed 's/G/_Gb/;s/M/_Mb/')
        if [[ "$i" == "$CONN" ]]; then
          PT="(+++) ${CON_T} ${CON_F} ${CON_C} ${CONN} ${SIZE}"
          export PART${CON_T: -1}="$PT"
        else
          PT="(---) ${CON_T} ${CON_F} ${CON_C} ${CONN} ${SIZE}"
          export PART${CON_T: -1}="$PT"
        fi
    fi
  done
}
   
check_dev_disk_lid() {
  while read line; do
    unset CON_A CON_B CON_AB
    CON_A=$(awk '{print $1}' <<<"$line")
    CON_B=$(awk '{print $2}' <<<"$line")
    CON_U=$(awk '{print $3}' <<<"$line")
    CON_AB=$(grep "$CON_A" <<<"$FSI"|grep "$CON_B")
if [[ -n "$CON_AB" ]]; then
  FSC=$(grep "/dev/$CON_A"  <<<"$FSI")
  CON_T=$(awk '{print $1}' <<<"$FSC")
  CON_F=$(awk '{print $2}' <<<"$FSC")
  CON_C=$(awk '{print $3}' <<<"$FSC")
  SIZE=$(lsblk -o SIZE ${CON_T}|grep -v 'SIZE'| \
  xargs|sed 's/G/_Gb/')
  export PART${CON_T: -1}="${CON_T} ${CON_F} ${CON_C} ${CON_U} ${SIZE}"
fi
  done <<<$(echo "$FORM")
}

final_say() {
if [[ -n $PART1 ]]; then
echo -e "\n  ${CDY}FSTAB BÖLÜMLERİ ( ${UI_VAR} )\n${MSG12}\n"
  [[ -n $PART1 ]] && echo "$(sed 's/ /\t/g' <<<$PART1)"
  [[ -n $PART2 ]] && echo "$(sed 's/ /\t/g' <<<$PART2)"
  [[ -n $PART3 ]] && echo "$(sed 's/ /\t/g' <<<$PART3)"
  [[ -n $PART4 ]] && echo "$(sed 's/ /\t/g' <<<$PART4)"
  [[ -n $PART5 ]] && echo "$(sed 's/ /\t/g' <<<$PART5)"
  [[ -n $PART6 ]] && echo "$(sed 's/ /\t/g' <<<$PART6)"
  [[ -n $PART7 ]] && echo "$(sed 's/ /\t/g' <<<$PART7)"
  [[ -n $PART8 ]] && echo "$(sed 's/ /\t/g' <<<$PART8)"
  [[ -n $PART9 ]] && echo "$(sed 's/ /\t/g' <<<$PART9)"
  [[ -n $PART10 ]] && echo "$(sed 's/ /\t/g' <<<$PART10)"
  [[ -n $PART11 ]] && echo "$(sed 's/ /\t/g' <<<$PART11)"
fi
echo -e "\n${MSG12}"
echo -e "
  ${CDY}AYGIT \t\t\t:\t${CDB}$MODEL
  ${CDY}KAPASİTE\t\t\t:\t${CDB}$CAPACITY
  ${CDY}DÖNÜŞ HIZI\t\t\t:\t${CDB}$ROTATION
  ${CDY}VERİ AKTARIMI \t\t:\t${CDB}$SPEED
  ${CDY}BAĞLANTI TİPİ \t\t:\t${CDB}$SATA_V
  ${CDY}DİSK FORMATI \t\t\t:\t${CDB}$TYPE_D
  ${CDY}TRIM DESTEĞİ \t\t\t:\t${CDB}$TRM"

  if [[ -n $DSD ]]; then echo -e "\n
  ${CDY}SAĞLIK DURUMU \t\t:\t${CDB}$DSD"
  fi
  if [[ -n $TIME ]]; then echo -e "\n
  ${CDY}SEÇİLEN DİZİN \t\t:\t${CDB}$FILE2
  ${CDY}DİZİN BOYUTU\t\t\t:\t${CDB}${FILE1}B
  ${CDY}ARŞİV İŞLENME SÜRESİ\t\t:\t${CDB}$TIME
  ${CDY}YAZMA HIZI\t\t\t:\t${CDB}$WRITE MB/s
  ${CDY}OKUMA HIZI\t\t\t:\t${CDB}$READ MB/s"
  fi
  if [[ -n $TIME && -n $TTIME ]]; then
  echo -e "\n  ${CDY}TOPLAM TEST SÜRESİ\t\t:\t${CDB}$TTIME${CNF}"
  elif [[ -n $TTIME ]]; then
  echo -e "  ${CDY}TOPLAM TEST SÜRESİ\t\t:\t${CDB}$TTIME${CNF}"
  fi
echo -e "\n${MSG12}"
}
  TRIM=''
  TSTR=$(date +%s)
  TAG=$(lsblk -lo NAME |grep -v NAME| head -1)
  DEV=$(sed 's/^/\/dev\//' <<<$TAG)
      [[ -z "$DEV" ]] && exit
  INFO=$(sudo hdparm -I $DEV)
      [[ -z $INFO ]] && exit
  ROTATION=$(grep 'Rotation Rate' <<<"$INFO"|cut -d: -f2|xargs)
  MODEL=$(grep 'Model Number' <<<"$INFO"|cut -d: -f2|xargs)
  CAPACITY=$(grep '[0-9] GB)' <<<"$INFO"|cut -d'(' -f2|sed 's/)//')
  SATA_V=$(grep 'Transport:' <<<"$INFO"|rev| \
  cut -d' ' -f1-3|rev| xargs|sed 's/Rev //')
  TYPE_D=$(udevadm info -q property -n $TAG| \
  grep 'TABLE_TYPE'|cut -d= -f2)
  SPEED=$(grep 'signaling speed' <<<"$INFO"|grep '*'|tail -1| \
  cut -d'(' -f2|sed 's/)//;s/G/_G/')
  TRIM=$(grep -i 'TRIM supported' <<<"$INFO"|grep '*')
    [[ -n $TRIM ]] && TRM=Var || TRM=Yok

  FSI=$(grep -v '^#' /etc/fstab|grep -v '/dev/disk')
  PUID=$(grep -w 'PARTUUID' <<<"$FSI")
  UUID=$(grep -w 'UUID' <<<"$FSI")
  LABID=$(grep '/dev/sd' <<<"$FSI")
  FORM=$(lsblk -lf|grep "$TAG[0-9]")

  if [[ -n $PUID ]]; then
    UID_DIR=$(ls /dev/disk/by-partuuid|tr ' ' '\n')
    UI_VAR=PARTUUID
    LSB_UI=$(lsblk -lo NAME,PARTUUID|grep "$TAG[0-9]")
    check_dev_disk_uid
  elif [[ -n $UUID ]]; then
    UID_DIR=$(ls /dev/disk/by-uuid|tr ' ' '\n')
    UI_VAR=UUID
    LSB_UI=$(lsblk -lo NAME,UUID|grep "$TAG[0-9]")
    check_dev_disk_uid
  elif [[ -n $LABID ]]; then
    UI_VAR=LABEL
    check_dev_disk_lid
  fi


total_wokring_time() {
if [[ -n $WRITE || -n $DSD ]]; then
    TEND=$(date +%s)
    TDIFF=$(("$TEND"-"$TSTR"))
    TDK=$(("$TDIFF"/60))
    TSN=$(("$TDIFF"%60))
    TTIME="${CDB}$TDK ${MSG7} ${CDB}$TSN ${MSG8}"
    final_say
else exit; fi
}

select_key_info() {
unset answer ans
    while IFS= read -p "$ans" -r -n 1 ans; do
    ans=$(echo $ans|tr A-Z a-z)
if [[ $ans == s ]]; then
    answer=s; break
elif [[ $ans == d ]]; then
    answer=d; break
elif [[ $ans == f ]]; then
    answer=f; break
elif [[ $ans == $'\0' || $ans == a ]]; then
    answer=a; break
else echo; exit; fi
    done
}
clear
echo  "${MSG12}"
echo -e "${MSG10}"
echo -ne "\n${MSG13} ${CDP}$(tr a-z A-Z <<<$DEV) ${MSG11} ${MSG13}\n---\n--: "
select_key_info
case $answer in
a) clear
final_say
;;
s) clear
test_read_speed && move_to_work_area
press_selection_file && test_write_speed
total_wokring_time
;;
d) clear
bad_sector_scaning && total_wokring_time
;;
f) clear
move_to_work_area && test_read_speed
bad_sector_scaning && press_selection_file
test_write_speed && total_wokring_time
;;
esac

.py

okuma ve yazma hızınımı test etmiş oluyoruz ndir bu?

lnxdev

[mention=634072]@mhmtkrktr[/mention], eline sağlık. Bir sürü paket kullanarak bakmaktansa tek bir betik yapmışsın ben beğendim.

mhmtkrktr

Alıntı Yapokuma ve yazma hızınımı test etmiş oluyoruz ndir bu?
Evet. Okuma\yazma, bozuk alan taraması gibi, disk bilgilerini görüntülemek amacıyla hazırlandı.

Alıntı Yap@mhmtkrktr, eline sağlık. Bir sürü paket kullanarak bakmaktansa tek bir betik yapmışsın ben beğendim.
@lnxdev; teşekkür ederim.

Fstab bölümlerinin UUID doğrulaması gibi eklemeleri de olacaktı ama işim çıktı bırakmak zorunda kaldım. Kendimde sadece bir kez deneyebildim. Hatalı ürettiği bir çıktı varsa da bakmadım. İlk fırsatta aklımda ki diğer eklemeleri de yapıp bağlantıyı güncellerim.     

mhmtkrktr

İlk mesajın içeriği değiştirildi.

Partuuid veya uuid ile düzenlenmiş fstab içeriğinin doğruluğu kontrol ediliyor. Satır başında ki;
(+++)  ID bilgisinin doğru olduğu,
(---)  ise hatalı olduğu anlamına geliyor.
Partlabel ile bağlanmış bölümlerde sadece bölüm bilgileri bulunuyor. (ekrana basılan uuid bilgi amaçlıdır)

Not 1: Partuuid ve partlabel ile test ettim fakat elimde olmadığı için uuid ile test etmedim.
Not 2: Aynı disk üzerine birden çok Linux dağıtımı kurulmuşsa, vereceği sonucu bilmiyorum.