...
Code Block | ||
---|---|---|
| ||
apt update
reboot
apt install system-test-zfstest testrunner system-file-system-zfs-tests python3 screen |
...
Далее Вы сможете так же отключиться в любой момент по нажатию Ctrl-A d и подключиться обратно в новой сессии SSH по:
ztest@zone:~# screen -r
...
См.
...
Подготовленные, как описано в предыдущем пункте, тесты можно запустить в режиме stability. Для этого нужно скопировать этот скрипт в файл, к примеру, stab_zfs.h или выполнить команды:
Code Block | ||
---|---|---|
| ||
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
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
echo "----------------------- Pass \${i} : started \$(date)" | /usr/bin/tee -a \${TOTALLOG}
START_TIME=\$(date +%s)
./z.sh \$dsk1 \$dsk2 \$dsk3
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. Логи для каждого прохода будут создаваться в соответствии с описанной выше процедурой одиночного прохода.
Если тест повис или обрушился на каком-то проходе, дополнительную информацию можно получить, выполнив следующие команды:
Code Block | ||
---|---|---|
| ||
cat > getinfo.sh <<EOT
#!/bin/bash
uname -a
diskinfo > /dev/null
diskinfo > /dev/null
echo "-------------------------- DISKINFO ---------------------"
diskinfo
echo "------------------------- BEADM LIST --------------------"
beadm list
echo "------------------------- ZPOOL LIST --------------------"
zpool list
echo "-------------------- LAST SUCCESSFULL TEST --------------"
tail -1 /var/tmp/z.tmp
echo "------------------- LAST SUCCESSFULL COMMAND -------------"
tail -1 /var/tmp/test_results/current/log
EOT
chmod 777 ./getinfo.sh
./getinfo.sh
|
См. beadmbeadm, Запуск в режиме стабильности