Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagebash
apt update
reboot
apt install system-test-zfstest testrunner system-file-system-zfs-tests python3 screen

...

Code Block
languagebash
cat > z.sh <<EOT
#!/bin/bash

if [ -n "\$4" ]; then
  LOG="\$4"
else

 LOG="/var/tmp/zfstest.\$(date +%F-%T).txt"
fi
ipa=\$(sudo ifconfig | grep -A 1 vmxnet3s0 | sed '1d; s/^[ \\t]*inet[ \\t]*//; s/[ \\t]*netmask.*\$//')
sudo /sbin/zpool destroy testpool
sudo -E /usr/sbin/svcadm disable -s svc:/system/fmd:default
sudo -E find /var/fm/fmd -type f -exec rm {} \\;
sudo -E /usr/sbin/svcadm enable svc:/system/fmd:default

# we need 3 x 8G drives with 512b sector size
export DISKS="\$1 \$2 \$3"
export KEEP="rpool data"
export ZFS_USE_ONLY_DISKS=yes

#remove partition on disks
for D in \$DISKS
do
    sudo -E /usr/bin/dd if=/dev/null of=/dev/dsk/\${D}p0 bs=512 count=512K
done

# cleanup drives before tests:
sudo -E /sbin/zpool create -f test123321 \$DISKS
sudo -E /sbin/zpool destroy test123321
sudo -E rm -rf /tmp/mnt* /tmp/ufs.* /tmp/log.* /tmp/tmp.* /tmp/rst* /tmp/tmpfs*
test -d /var/tmp/test_results && sudo rm -rf /var/tmp/test_results
sudo -E /usr/sbin/devfsadm -C

uname -a > \${LOG}
echo "IP Address : \${ipa}" >> \${LOG}
echo "" >> \${LOG}
echo "Disk IDs : \$DISKS" 2>&1 | /usr/bin/tee -a \${LOG}

# run tests
/bin/ksh /opt/zfs-tests/bin/zfstest \$* 2>&1 | /usr/bin/tee -a /var/tmp/z.tmp
echo "Results Summary" >> \${LOG}
echo "" >> \${LOG}
skip=\$(sed -n '/^SKIP[ \\t]*/p' /var/tmp/z.tmp | sed 's/^SKIP[ \\t]*//; s/[ \\t]*\$//')
fail=\$(sed -n '/^FAIL[ \\t]*/p' /var/tmp/z.tmp | sed 's/^FAIL[ \\t]*//; s/[ \\t]*\$//')
pass=\$(sed -n '/^PASS[ \\t]*/p' /var/tmp/z.tmp | sed 's/^PASS[ \\t]*//; s/[ \\t]*\$//')

total=0
if [ "\${pass}" != "" ]; then
    total=\$((\${total} + \${pass}))
fi
if [ "\${fail}" != "" ]; then
    total=\$((\${total} + \${fail}))
fi
if [ "\${skip}" != "" ]; then
    total=\$((\${total} + \${skip}))
fi
echo "TOTAL TESTS:     \$total" >> \${LOG}
sed '1,/Results Summary/d' /var/tmp/z.tmp >> \${LOG}
sudo rm -f /var/tmp/z.tmp
EOT
chmod 777 z.sh

...

Далее Вы сможете так же отключиться в любой момент по нажатию Ctrl-A d и подключиться обратно в новой сессии SSH по:

ztest@zone:~# screen -r 

...

См.

...

Подготовленные, как описано в предыдущем пункте, тесты можно запустить в режиме stability. Для этого нужно скопировать этот скрипт в файл, к примеру, stab_zfs.h или выполнить команды:

Code Block
languagebash
cat > stab_zfs.sh <<EOT
#!/bin/bash

get_duration() {
  IFS=':' read -r -a tm <<< "\$1"
  num=\${#tm[@]}
  delta=\$((\${tm[0]} * 3600))
  if [[ \$num -gt 1 ]]; then
    delta1=\$((\${tm[1]} * 60))
    (( delta += \$delta1 ))
    if [[ \$num -gt 2 ]]; then
      (( delta += \${tm[2]} ))
    fi
  fi
  echo \$delta
}

get_time_diff() {
  local cur_time=\$(date +%s)
  echo \$((\$cur_time - \$1))
}

print_time_diff() {
  local delta=\$(get_time_diff \$1)
  local sec=\$((\$delta % 60))
  let "amin = \$delta / 60"
  let "hour = \$amin / 60"
  local min=\$((\$amin%60))
  if [ -n "\$2" ]; then
    printf " Running time: %02d:%02d:%02d\\n" \$hour \$min \$sec >> \$2
  else
    printf " Running time: %02d:%02d:%02d\\n" \$hour \$min \$sec
  fi
}

log_extra() {
  echo "---------------- ZPOOL LIST ------------------" >> \$1
  zpool list >> \$1
  echo "----------------  ZFS LIST  ------------------" >> \$1
  zfs list >> \$1
  echo "----------------    PS AX   ------------------" >> \$1
  ps ax >> \$1
  echo "---------------- TOP  -n 10 ------------------" >> \$1
  top -n 10 >> \$1
}

i=1
mode=0
TOTALLOG="/var/tmp/stabzfs.\$(date +%F-%T).txt"
dsk1=\$1
shift
dsk2=\$1
shift
dsk3=\$1
shift

echo "============ ZFS Stability test started at \$(date +%F-%T) ==============" > \${TOTALLOG}
if [[ \$# < 2 ]]; then
  echo "Missing parameters in the command" | /usr/bin/tee -a \${TOTALLOG}
  exit 1
fi

case "\$1" in
  -i) mode=1
      # number of iterations is provided
      maxiter=\$2
      echo "Stability Test : launched for \$maxiter iterations at \$(date)." | /usr/bin/tee -a \${TOTALLOG}
      ;;
  -d) mode=2
      # duration of tests is provided
      delta=\$(get_duration \$2)
      echo "Stability Test : launched for \$2 interval (\$delta seconds) at \$(date)." | /usr/bin/tee -a \${TOTALLOG}
      ;;
  -t) mode=3
      # stop date/time is provided
      stopdt=\$2
      ;;
  *)  echo "Stability Test : \$1 is a wrong option" | /usr/bin/tee -a \${TOTALLOG}
      echo "Usage : stab_zfs.sh <disk1> <disk2> <disk3> (-i <iterations> | -t <HH:MM[:SS]> | -d <HH:MM[:SS] [DAY-MONTH-YEAR]>]) [-s | <test name>]"
      exit 1
      ;;
esac
shift
shift

if [[ \$mode -eq 3 ]]; then
  # stop time/date mode
  if [[ \$# > 0 ]]; then
    date -d \$1 +%s
    stopat=\$?
    if [[ \$stopat -eq 0 ]]; then
      # stop date is entered after the time
      # if it is ommited then date is treated as current one
      stopdt="\$stopdt \$1"
      shift
    fi
  fi
  echo "Stability Test : launched until \$stopdt at \$(date)." | /usr/bin/tee -a \${TOTALLOG}
  stopat=\$(date -d "\$stopdt" "+%s")
fi

uname -a | /usr/bin/tee -a \${TOTALLOG}
diskinfo >>  null
diskinfo >> null
echo "---------------- DISKINFO -----------------------" >> \${TOTALLOG}
diskinfo | /usr/bin/tee -a \${TOTALLOG}

GLOB_START_TIME=\$(date +%s)

while [[ \$mode -gt 0 ]]
do
  case "\$mode" in
  1) # number of iterations is provided
     if [[ \$i -gt \$maxiter ]]; then
       break
     fi
     ;;
  2) # duration of tests is provided
     difftm=\$(get_time_diff \$GLOB_START_TIME)
     if [[ \$difftm -gt \$delta ]]; then
       break
     fi
     ;;
  3) # stop date/time is provided
     tmpat=\$(date +%s)
     if [[ \$stopat -le \$tmpat ]]; then
       break
     fi
     ;;
  *) break
     ;;
  esac
  LOG="/var/tmp/zfstest.\$(date +%F-%T).txt"
  echo "----------------------- Pass \${i} <\${LOG}>: started \$(date)" | /usr/bin/tee -a \${TOTALLOG}
  echo "---------------- BEADM LIST -----------------------" >> \${TOTALLOG}
  beadm list | /usr/bin/tee -a \${TOTALLOG}
  echo "---------------- ZPOOL LIST -----------------------" >> \${TOTALLOG}
  zpool list | /usr/bin/tee -a \${TOTALLOG}
  START_TIME=\$(date +%s)
  ./z.sh \$dsk1 \$dsk2 \$dsk3 \$LOG
  print_time_diff \${START_TIME} \${TOTALLOG}
  echo "----------------------- Pass \${i} : finished \$(date)" | /usr/bin/tee -a \${TOTALLOG}
  (( i++ ))
done
echo "Tests are finished successfully at \$(date) with \${i} passes." >> \${TOTALLOG}
print_time_diff \${GLOB_START_TIME} | /usr/bin/tee -a \${TOTALLOG}
EOT
sed -i '/./!d' stab_zfs.sh && chmod 777 stab_zfs.sh

Тестовый скрипт может быть запущен в трёх режимах:

  • для выполненния определённого количества проходов

В этом случае ему нужно указать ключ -i и задать количество проходов, например, для 10 проходов:

Code Block
screen ./stab_zfs.sh <disk1> <disk2> <disk3> -i 10
  • для работы в течение какого-то интервала времени

В этом случае ему нужно указать ключ -d и задать время работы в формате HH:MM[:SS], например, для работы в течение 10 часов 15 минут:

Code Block
screen ./stab_zfs.sh <disk1> <disk2> <disk3> -d 10:15

или, например, для работы в течение 20 секунд:

Code Block
screen ./stab_zfs.sh <disk1> <disk2> <disk3> -d 00:00:20
  • для остановки в конкретный момент времени

В этом случае ему нужно указать ключ -t и задать время, в которое тесты должны остановиться, в формате HH:MM[:SS] [DAY-MONTH_YEAR], например, для работы с момента запуска по 17:00 8 августа 2023 года нужно ввести:

Code Block
screen ./stab_zfs.sh <disk1> <disk2> <disk3> -t 17:00 8-AUG-2023

Если дата не указана, указано только время, то считается, что остановка должна произойти в текущую дату. Т.е. для остановки сегодня в 19:00 нужно ввести:

Code Block
screen ./stab_zfs.sh <disk1> <disk2> <disk3> -t 19:00

Теперь после запуска скрипта общий лог по всем проходам будут находиться в файле /var/tmp/stabzfs.<ISO TIME>.txt. Логи для каждого прохода будут создаваться в соответствии с описанной выше процедурой одиночного прохода.

См. beadmbeadm, Запуск в режиме стабильности