mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Retire legacy test infrastructure
* Removed zpios kmod, utility, headers and man page. * Removed unused scripts zpios-profile/*, zpios-test/*, zpool-config/*, smb.sh, zpios-sanity.sh, zpios-survey.sh, zpios.sh, and zpool-create.sh. * Removed zfs-script-config.sh.in. When building 'make' generates a common.sh with in-tree path information from the common.sh.in template. This file and sourced by the test scripts and used for in-tree testing, it is not included in the packages. When building packages 'make install' uses the same template to create a new common.sh which is appropriate for the packaging. * Removed unused functions/variables from scripts/common.sh.in. Only minimal path information and configuration environment variables remain. * Removed unused scripts from scripts/ directory. * Remaining shell scripts in the scripts directory updated to cleanly pass shellcheck and added to checked scripts. * Renamed tests/test-runner/cmd/ to tests/test-runner/bin/ to match install location name. * Removed last traces of the --enable-debug-dmu-tx configure options which was retired some time ago. Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #6509
This commit is contained in:
+60
-10
@@ -1,17 +1,67 @@
|
||||
SUBDIRS = zpool-config zpios-test zpios-profile
|
||||
|
||||
EXTRA_DIST = dkms.mkconf dkms.postbuild kmodtool zfs2zol-patch.sed cstyle.pl
|
||||
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
|
||||
dist_pkgdata_SCRIPTS = \
|
||||
$(top_builddir)/scripts/common.sh \
|
||||
$(top_srcdir)/scripts/zimport.sh \
|
||||
$(top_srcdir)/scripts/zfs.sh \
|
||||
$(top_srcdir)/scripts/zfs-tests.sh \
|
||||
$(top_srcdir)/scripts/zloop.sh \
|
||||
$(top_srcdir)/scripts/zpool-create.sh \
|
||||
$(top_srcdir)/scripts/zpios.sh \
|
||||
$(top_srcdir)/scripts/zpios-sanity.sh \
|
||||
$(top_srcdir)/scripts/zpios-survey.sh \
|
||||
$(top_srcdir)/scripts/smb.sh \
|
||||
$(top_srcdir)/scripts/zfs-helpers.sh
|
||||
|
||||
EXTRA_DIST = \
|
||||
common.sh.in \
|
||||
commitcheck.sh \
|
||||
dkms.mkconf \
|
||||
dkms.postbuild \
|
||||
kmodtool \
|
||||
paxcheck.sh \
|
||||
zfs2zol-patch.sed \
|
||||
cstyle.pl
|
||||
|
||||
define EXTRA_ENVIRONMENT
|
||||
|
||||
# Only required for in-tree use
|
||||
export INTREE="yes"
|
||||
export GDB="/usr/bin/libtool --mode=execute gdb"
|
||||
export LDMOD=/sbin/insmod
|
||||
|
||||
export CMD_DIR=@abs_top_builddir@/cmd
|
||||
export UDEV_RULE_DIR=@abs_top_builddir@/udev/rules.d
|
||||
export ZEDLET_ETC_DIR=$$CMD_DIR/zed/zed.d
|
||||
export ZEDLET_LIBEXEC_DIR=$$CMD_DIR/zed/zed.d
|
||||
export ZPOOL_SCRIPT_DIR=$$CMD_DIR/zpool/zpool.d
|
||||
export ZPOOL_SCRIPTS_PATH=$$CMD_DIR/zpool/zpool.d
|
||||
|
||||
export INSTALL_UDEV_DIR=@udevdir@
|
||||
export INSTALL_UDEV_RULE_DIR=@udevruledir@
|
||||
export INSTALL_MOUNT_HELPER_DIR=@mounthelperdir@
|
||||
export INSTALL_SYSCONF_DIR=@sysconfdir@
|
||||
|
||||
export KMOD_SPL=@SPL_OBJ@/module/spl/spl.ko
|
||||
export KMOD_SPLAT=@SPL_OBJ@/module/splat/splat.ko
|
||||
export KMOD_ZAVL=@abs_top_builddir@/module/avl/zavl.ko
|
||||
export KMOD_ZNVPAIR=@abs_top_builddir@/module/nvpair/znvpair.ko
|
||||
export KMOD_ZUNICODE=@abs_top_builddir@/module/unicode/zunicode.ko
|
||||
export KMOD_ZCOMMON=@abs_top_builddir@/module/zcommon/zcommon.ko
|
||||
export KMOD_ICP=@abs_top_builddir@/module/icp/icp.ko
|
||||
export KMOD_ZFS=@abs_top_builddir@/module/zfs/zfs.ko
|
||||
endef
|
||||
|
||||
export EXTRA_ENVIRONMENT
|
||||
|
||||
all-local:
|
||||
-$(SED) -e '\|^export BIN_DIR=|s|$$|@abs_top_builddir@/bin|' \
|
||||
-e '\|^export SBIN_DIR=|s|$$|@abs_top_builddir@/bin|' \
|
||||
-e '\|^export ZTS_DIR=|s|$$|@abs_top_srcdir@/tests|' \
|
||||
-e '\|^export SCRIPT_DIR=|s|$$|@abs_top_srcdir@/scripts|' \
|
||||
common.sh.in >common.sh
|
||||
-echo "$$EXTRA_ENVIRONMENT" >>common.sh
|
||||
|
||||
clean-local:
|
||||
-$(RM) common.sh
|
||||
|
||||
install-data-hook:
|
||||
-$(SED) -e '\|^export BIN_DIR=|s|$$|@bindir@|' \
|
||||
-e '\|^export SBIN_DIR=|s|$$|@sbindir@|' \
|
||||
-e '\|^export ZTS_DIR=|s|$$|@datadir@/@PACKAGE@|' \
|
||||
-e '\|^export SCRIPT_DIR=|s|$$|@datadir@/@PACKAGE@|' \
|
||||
common.sh.in >$(DESTDIR)$(datadir)/@PACKAGE@/common.sh
|
||||
|
||||
+20
-768
@@ -1,768 +1,20 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Common support functions for testing scripts. If a script-config
|
||||
# files is available it will be sourced so in-tree kernel modules and
|
||||
# utilities will be used. If no script-config can be found then the
|
||||
# installed kernel modules and utilities will be used.
|
||||
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
SCRIPT_CONFIG=zfs-script-config.sh
|
||||
if [ -f "${basedir}/../${SCRIPT_CONFIG}" ]; then
|
||||
. "${basedir}/../${SCRIPT_CONFIG}"
|
||||
else
|
||||
KERNEL_MODULES=(zlib_deflate zlib_inflate)
|
||||
MODULES=(spl splat zavl znvpair zunicode zcommon icp zfs)
|
||||
fi
|
||||
|
||||
PROG="<define PROG>"
|
||||
CLEANUP=
|
||||
VERBOSE=
|
||||
VERBOSE_FLAG=
|
||||
FORCE=
|
||||
FORCE_FLAG=
|
||||
ERROR=
|
||||
RAID0S=()
|
||||
RAID10S=()
|
||||
RAIDZS=()
|
||||
RAIDZ2S=()
|
||||
TESTS_RUN=${TESTS_RUN:-'*'}
|
||||
TESTS_SKIP=${TESTS_SKIP:-}
|
||||
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
pkgdatadir=@datarootdir@/@PACKAGE@
|
||||
bindir=@bindir@
|
||||
sbindir=@sbindir@
|
||||
udevdir=@udevdir@
|
||||
udevruledir=@udevruledir@
|
||||
mounthelperdir=@mounthelperdir@
|
||||
sysconfdir=@sysconfdir@
|
||||
localstatedir=@localstatedir@
|
||||
|
||||
ETCDIR=${ETCDIR:-/etc}
|
||||
DEVDIR=${DEVDIR:-/dev/disk/by-vdev}
|
||||
ZPOOLDIR=${ZPOOLDIR:-${pkgdatadir}/zpool-config}
|
||||
ZPIOSDIR=${ZPIOSDIR:-${pkgdatadir}/zpios-test}
|
||||
ZPIOSPROFILEDIR=${ZPIOSPROFILEDIR:-${pkgdatadir}/zpios-profile}
|
||||
TESTSDIR=${TESTSDIR:-${pkgdatadir}/zfs-tests}
|
||||
RUNFILEDIR=${RUNFILEDIR:-${pkgdatadir}/runfiles}
|
||||
|
||||
ZDB=${ZDB:-${sbindir}/zdb}
|
||||
ZFS=${ZFS:-${sbindir}/zfs}
|
||||
ZINJECT=${ZINJECT:-${sbindir}/zinject}
|
||||
ZHACK=${ZHACK:-${sbindir}/zhack}
|
||||
ZPOOL=${ZPOOL:-${sbindir}/zpool}
|
||||
ZTEST=${ZTEST:-${sbindir}/ztest}
|
||||
ZPIOS=${ZPIOS:-${sbindir}/zpios}
|
||||
|
||||
COMMON_SH=${COMMON_SH:-${pkgdatadir}/common.sh}
|
||||
ZFS_SH=${ZFS_SH:-${pkgdatadir}/zfs.sh}
|
||||
ZPOOL_CREATE_SH=${ZPOOL_CREATE_SH:-${pkgdatadir}/zpool-create.sh}
|
||||
ZPIOS_SH=${ZPIOS_SH:-${pkgdatadir}/zpios.sh}
|
||||
ZPIOS_SURVEY_SH=${ZPIOS_SURVEY_SH:-${pkgdatadir}/zpios-survey.sh}
|
||||
TEST_RUNNER=${TEST_RUNNER:-${pkgdatadir}/test-runner/bin/test-runner.py}
|
||||
STF_TOOLS=${STF_TOOLS:-${pkgdatadir}/test-runner}
|
||||
STF_SUITE=${STF_SUITE:-${pkgdatadir}/zfs-tests}
|
||||
|
||||
LDMOD=${LDMOD:-/sbin/modprobe}
|
||||
LSMOD=${LSMOD:-/sbin/lsmod}
|
||||
RMMOD=${RMMOD:-/sbin/rmmod}
|
||||
INFOMOD=${INFOMOD:-/sbin/modinfo}
|
||||
LOSETUP=${LOSETUP:-/sbin/losetup}
|
||||
MDADM=${MDADM:-/sbin/mdadm}
|
||||
DMSETUP=${DMSETUP:-/sbin/dmsetup}
|
||||
PARTED=${PARTED:-/sbin/parted}
|
||||
BLOCKDEV=${BLOCKDEV:-/sbin/blockdev}
|
||||
LSSCSI=${LSSCSI:-/usr/bin/lsscsi}
|
||||
SCSIRESCAN=${SCSIRESCAN:-/usr/bin/scsi-rescan}
|
||||
SYSCTL=${SYSCTL:-/sbin/sysctl}
|
||||
UDEVADM=${UDEVADM:-/sbin/udevadm}
|
||||
AWK=${AWK:-/usr/bin/awk}
|
||||
GDB=${GDB:-/usr/bin/gdb}
|
||||
|
||||
ZED_PIDFILE=${ZED_PIDFILE:-${localstatedir}/run/zed.pid}
|
||||
|
||||
COLOR_BLACK="\033[0;30m"
|
||||
COLOR_DK_GRAY="\033[1;30m"
|
||||
COLOR_BLUE="\033[0;34m"
|
||||
COLOR_LT_BLUE="\033[1;34m"
|
||||
COLOR_GREEN="\033[0;32m"
|
||||
COLOR_LT_GREEN="\033[1;32m"
|
||||
COLOR_CYAN="\033[0;36m"
|
||||
COLOR_LT_CYAN="\033[1;36m"
|
||||
COLOR_RED="\033[0;31m"
|
||||
COLOR_LT_RED="\033[1;31m"
|
||||
COLOR_PURPLE="\033[0;35m"
|
||||
COLOR_LT_PURPLE="\033[1;35m"
|
||||
COLOR_BROWN="\033[0;33m"
|
||||
COLOR_YELLOW="\033[1;33m"
|
||||
COLOR_LT_GRAY="\033[0;37m"
|
||||
COLOR_WHITE="\033[1;37m"
|
||||
COLOR_RESET="\033[0m"
|
||||
|
||||
die() {
|
||||
echo -e "${PROG}: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
msg() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
pass() {
|
||||
echo -e "${COLOR_GREEN}Pass${COLOR_RESET}"
|
||||
}
|
||||
|
||||
fail() {
|
||||
echo -e "${COLOR_RED}Fail${COLOR_RESET} ($1)"
|
||||
exit $1
|
||||
}
|
||||
|
||||
skip() {
|
||||
echo -e "${COLOR_BROWN}Skip${COLOR_RESET}"
|
||||
}
|
||||
|
||||
populate() {
|
||||
local ROOT=$1
|
||||
local MAX_DIR_SIZE=$2
|
||||
local MAX_FILE_SIZE=$3
|
||||
|
||||
mkdir -p $ROOT/{a,b,c,d,e,f,g}/{h,i}
|
||||
DIRS=`find $ROOT`
|
||||
|
||||
for DIR in $DIRS; do
|
||||
COUNT=$(($RANDOM % $MAX_DIR_SIZE))
|
||||
|
||||
for i in `seq $COUNT`; do
|
||||
FILE=`mktemp -p ${DIR}`
|
||||
SIZE=$(($RANDOM % $MAX_FILE_SIZE))
|
||||
dd if=/dev/urandom of=$FILE bs=1k count=$SIZE &>/dev/null
|
||||
done
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
init() {
|
||||
# Create a random directory tree of files and sub-directories to
|
||||
# to act as a copy source for the various regression tests.
|
||||
SRC_DIR=`mktemp -d -p /var/tmp/ zfs.src.XXXXXXXX`
|
||||
trap "rm -Rf $SRC_DIR" INT TERM EXIT
|
||||
populate $SRC_DIR 10 100
|
||||
}
|
||||
|
||||
check_modules() {
|
||||
local LOADED_MODULES=()
|
||||
local MISSING_MODULES=()
|
||||
|
||||
for MOD in ${MODULES[*]}; do
|
||||
local NAME=`basename $MOD .ko`
|
||||
|
||||
if ${LSMOD} | egrep -q "^${NAME}"; then
|
||||
LOADED_MODULES=(${NAME} ${LOADED_MODULES[*]})
|
||||
fi
|
||||
|
||||
if [ ${INFOMOD} ${MOD} 2>/dev/null ]; then
|
||||
MISSING_MODULES=("\t${MOD}\n" ${MISSING_MODULES[*]})
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#LOADED_MODULES[*]} -gt 0 ]; then
|
||||
ERROR="Unload these modules with '${PROG} -u':\n"
|
||||
ERROR="${ERROR}${LOADED_MODULES[*]}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ ${#MISSING_MODULES[*]} -gt 0 ]; then
|
||||
ERROR="The following modules can not be found,"
|
||||
ERROR="${ERROR} ensure your source trees are built:\n"
|
||||
ERROR="${ERROR}${MISSING_MODULES[*]}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
load_module() {
|
||||
local NAME=`basename $1 .ko`
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "Loading ${NAME} ($@)"
|
||||
fi
|
||||
|
||||
${LDMOD} $* &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to load ${NAME} ($@)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
load_modules() {
|
||||
mkdir -p /etc/zfs
|
||||
|
||||
for MOD in ${KERNEL_MODULES[*]}; do
|
||||
load_module ${MOD} >/dev/null
|
||||
done
|
||||
|
||||
for MOD in ${MODULES[*]}; do
|
||||
local NAME=`basename ${MOD} .ko`
|
||||
local VALUE=
|
||||
|
||||
for OPT in "$@"; do
|
||||
OPT_NAME=`echo ${OPT} | cut -f1 -d'='`
|
||||
|
||||
if [ ${NAME} = "${OPT_NAME}" ]; then
|
||||
VALUE=`echo ${OPT} | cut -f2- -d'='`
|
||||
fi
|
||||
done
|
||||
|
||||
load_module ${MOD} ${VALUE} || return 1
|
||||
done
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "Successfully loaded ZFS module stack"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
unload_module() {
|
||||
local NAME=`basename $1 .ko`
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "Unloading ${NAME} ($@)"
|
||||
fi
|
||||
|
||||
${RMMOD} ${NAME} || ERROR="Failed to unload ${NAME}" return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
unload_modules() {
|
||||
local MODULES_REVERSE=( $(echo ${MODULES[@]} |
|
||||
${AWK} '{for (i=NF;i>=1;i--) printf $i" "} END{print ""}') )
|
||||
|
||||
for MOD in ${MODULES_REVERSE[*]}; do
|
||||
local NAME=`basename ${MOD} .ko`
|
||||
local USE_COUNT=`${LSMOD} |
|
||||
egrep "^${NAME} "| ${AWK} '{print $3}'`
|
||||
|
||||
if [ "${USE_COUNT}" = 0 ] ; then
|
||||
unload_module ${MOD} || return 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "Successfully unloaded ZFS module stack"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Check that the mdadm utilities are installed.
|
||||
#
|
||||
check_loop_utils() {
|
||||
test -f ${LOSETUP} || die "${LOSETUP} utility must be installed"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Find and return an unused loop device. A new /dev/loopN node will be
|
||||
# created if required. The kernel loop driver will automatically register
|
||||
# the minor as long as it's less than /sys/module/loop/parameters/max_loop.
|
||||
#
|
||||
unused_loop_device() {
|
||||
local DEVICE=$(${LOSETUP} -f)
|
||||
local MAX_LOOP_PATH="/sys/module/loop/parameters/max_loop"
|
||||
local MAX_LOOP;
|
||||
|
||||
# An existing /dev/loopN device was available.
|
||||
if [ -n "${DEVICE}" ]; then
|
||||
echo "${DEVICE}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Create a new /dev/loopN provided we are not at MAX_LOOP.
|
||||
if [ -f "${MAX_LOOP_PATH}" ]; then
|
||||
MAX_LOOP=`cat /sys/module/loop/parameters/max_loop`
|
||||
if [ ${MAX_LOOP} -eq 0 ]; then
|
||||
MAX_LOOP=255
|
||||
fi
|
||||
|
||||
for (( i=0; i<=${MAX_LOOP}; i++ )); do
|
||||
DEVICE="/dev/loop$i"
|
||||
|
||||
if [ -b "${DEVICE}" ]; then
|
||||
continue
|
||||
else
|
||||
mknod -m660 "${DEVICE}" b 7 $i
|
||||
chown root.disk "${DEVICE}"
|
||||
chmod 666 "${DEVICE}"
|
||||
|
||||
echo "${DEVICE}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
die "Error: Unable to create new loopback device"
|
||||
}
|
||||
|
||||
#
|
||||
# This can be slightly dangerous because the loop devices we are
|
||||
# cleaning up may not be ours. However, if the devices are currently
|
||||
# in use we will not be able to remove them, and we only remove
|
||||
# devices which include 'zpool' or 'deleted' in the name. So any
|
||||
# damage we might do should be limited to other zfs related testing.
|
||||
#
|
||||
cleanup_loop_devices() {
|
||||
local TMP_FILE=`mktemp`
|
||||
|
||||
${LOSETUP} -a | tr -d '()' >${TMP_FILE}
|
||||
${AWK} -F":" -v losetup="$LOSETUP" \
|
||||
'/zpool/ || /deleted/ { system("losetup -d "$1) }' ${TMP_FILE}
|
||||
${AWK} -F" " '/zpool/ || /deleted/ { system("rm -f "$3) }' ${TMP_FILE}
|
||||
|
||||
rm -f ${TMP_FILE}
|
||||
}
|
||||
|
||||
#
|
||||
# Destroy the passed loopback devices, this is used when you know
|
||||
# the names of the loopback devices.
|
||||
#
|
||||
destroy_loop_devices() {
|
||||
local LODEVICES="$1"
|
||||
|
||||
msg "Destroying ${LODEVICES}"
|
||||
${LOSETUP} -d ${LODEVICES} || \
|
||||
die "Error $? destroying ${FILE} -> ${DEVICE} loopback"
|
||||
|
||||
rm -f ${FILES}
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Create a device label taking care to briefly wait if udev needs to settle.
|
||||
#
|
||||
label() {
|
||||
local DEVICE=$1
|
||||
local LABEL=$2
|
||||
|
||||
wait_udev ${DEVICE} 30 || return 1
|
||||
${PARTED} ${DEVICE} --script -- mklabel ${LABEL} || return 2
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Create a primary partition on a block device.
|
||||
#
|
||||
partition() {
|
||||
local DEVICE=$1
|
||||
local TYPE=$2
|
||||
local START=$3
|
||||
local END=$4
|
||||
|
||||
${PARTED} --align optimal ${DEVICE} --script -- \
|
||||
mkpart ${TYPE} ${START} ${END} || return 1
|
||||
udev_trigger
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Create a filesystem on the block device
|
||||
#
|
||||
format() {
|
||||
local DEVICE=$1
|
||||
local FSTYPE=$2
|
||||
|
||||
# Force 4K blocksize, else mkfs.ext2 tries to use 8K, which
|
||||
# won't mount
|
||||
/sbin/mkfs.${FSTYPE} -b 4096 -F -q ${DEVICE} >/dev/null || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Check that the mdadm utilities are installed.
|
||||
#
|
||||
check_md_utils() {
|
||||
test -f ${MDADM} || die "${MDADM} utility must be installed"
|
||||
test -f ${PARTED} || die "${PARTED} utility must be installed"
|
||||
}
|
||||
|
||||
check_md_partitionable() {
|
||||
local LOFILE=`mktemp -p /tmp zpool-lo.XXXXXXXX`
|
||||
local LODEVICE=`unused_loop_device`
|
||||
local MDDEVICE=`unused_md_device`
|
||||
local RESULT=1
|
||||
|
||||
check_md_utils
|
||||
|
||||
rm -f ${LOFILE}
|
||||
dd if=/dev/zero of=${LOFILE} bs=1M count=0 seek=16 \
|
||||
&>/dev/null || return ${RESULT}
|
||||
|
||||
msg "Creating ${LODEVICE} using ${LOFILE}"
|
||||
${LOSETUP} ${LODEVICE} ${LOFILE}
|
||||
if [ $? -ne 0 ]; then
|
||||
rm -f ${LOFILE}
|
||||
return ${RESULT}
|
||||
fi
|
||||
|
||||
msg "Creating ${MDDEVICE} using ${LODEVICE}"
|
||||
${MDADM} --build ${MDDEVICE} --level=faulty \
|
||||
--raid-devices=1 ${LODEVICE} &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
destroy_loop_devices ${LODEVICE}
|
||||
rm -f ${LOFILE}
|
||||
return ${RESULT}
|
||||
fi
|
||||
wait_udev ${MDDEVICE} 30
|
||||
|
||||
${BLOCKDEV} --rereadpt ${MDDEVICE} 2>/dev/null
|
||||
RESULT=$?
|
||||
|
||||
destroy_md_devices ${MDDEVICE}
|
||||
destroy_loop_devices ${LODEVICE}
|
||||
rm -f ${LOFILE}
|
||||
|
||||
return ${RESULT}
|
||||
}
|
||||
|
||||
#
|
||||
# Find and return an unused md device.
|
||||
#
|
||||
unused_md_device() {
|
||||
for (( i=0; i<32; i++ )); do
|
||||
MDDEVICE=md${i}
|
||||
|
||||
# Skip active devicesudo in /proc/mdstat.
|
||||
grep -q "${MDDEVICE} " /proc/mdstat && continue
|
||||
|
||||
# Device doesn't exist, use it.
|
||||
if [ ! -e $/dev/{MDDEVICE} ]; then
|
||||
echo /dev/${MDDEVICE}
|
||||
return
|
||||
fi
|
||||
|
||||
# Device exists but may not be in use.
|
||||
if [ -b /dev/${MDDEVICE} ]; then
|
||||
${MDADM} --detail /dev/${MDDEVICE} &>/dev/null
|
||||
if [ $? -eq 1 ]; then
|
||||
echo /dev/${MDDEVICE}
|
||||
return
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
die "Error: Unable to find unused md device"
|
||||
}
|
||||
|
||||
#
|
||||
# This can be slightly dangerous because it is possible the md devices
|
||||
# we are cleaning up may not be ours. However, if the devices are
|
||||
# currently in use we will not be able to remove them, and even if
|
||||
# we remove devices which were not out we do not zero the super block
|
||||
# so you should be able to reconstruct them.
|
||||
#
|
||||
cleanup_md_devices() {
|
||||
destroy_md_devices "`ls /dev/md* 2>/dev/null | grep -v p`"
|
||||
udev_trigger
|
||||
}
|
||||
|
||||
#
|
||||
# Destroy the passed md devices, this is used when you know
|
||||
# the names of the md devices.
|
||||
#
|
||||
destroy_md_devices() {
|
||||
local MDDEVICES="$1"
|
||||
|
||||
msg "Destroying ${MDDEVICES}"
|
||||
for MDDEVICE in ${MDDEVICES}; do
|
||||
${MDADM} --stop ${MDDEVICE} &>/dev/null
|
||||
${MDADM} --remove ${MDDEVICE} &>/dev/null
|
||||
${MDADM} --detail ${MDDEVICE} &>/dev/null
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Check that the scsi utilities are installed.
|
||||
#
|
||||
check_sd_utils() {
|
||||
${INFOMOD} scsi_debug &>/dev/null || die "scsi_debug module required"
|
||||
test -f ${LSSCSI} || die "${LSSCSI} utility must be installed"
|
||||
}
|
||||
|
||||
#
|
||||
# Rescan the scsi bus for scsi_debug devices. It is preferable to use the
|
||||
# scsi-rescan tool if it is installed, but if it's not we can fall back to
|
||||
# removing and readding the device manually. This rescan will only effect
|
||||
# the first scsi_debug device if scsi-rescan is missing.
|
||||
#
|
||||
scsi_rescan() {
|
||||
local AWK_SCRIPT="/scsi_debug/ { print \$1; exit }"
|
||||
|
||||
if [ -f ${SCSIRESCAN} ]; then
|
||||
${SCSIRESCAN} --forcerescan --remove &>/dev/null
|
||||
else
|
||||
local SCSIID=`${LSSCSI} | ${AWK} "${AWK_SCRIPT}" | tr -d '[]'`
|
||||
local SCSIHOST=`echo ${SCSIID} | cut -f1 -d':'`
|
||||
echo 1 >"/sys/class/scsi_device/${SCSIID}/device/delete"
|
||||
udev_trigger
|
||||
echo "- - -" >/sys/class/scsi_host/host${SCSIHOST}/scan
|
||||
udev_trigger
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Trigger udev and wait for it to settle.
|
||||
#
|
||||
udev_trigger() {
|
||||
if [ -f ${UDEVADM} ]; then
|
||||
${UDEVADM} trigger --action=change --subsystem-match=block
|
||||
${UDEVADM} settle
|
||||
else
|
||||
/sbin/udevtrigger
|
||||
/sbin/udevsettle
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# The following udev helper functions assume that the provided
|
||||
# udev rules file will create a /dev/disk/by-vdev/<CHANNEL><RANK>
|
||||
# disk mapping. In this mapping each CHANNEL is represented by
|
||||
# the letters a-z, and the RANK is represented by the numbers
|
||||
# 1-n. A CHANNEL should identify a group of RANKS which are all
|
||||
# attached to a single controller, each RANK represents a disk.
|
||||
# This provides a simply mechanism to locate a specific drive
|
||||
# given a known hardware configuration.
|
||||
#
|
||||
udev_setup() {
|
||||
local SRC_PATH=$1
|
||||
|
||||
# When running in tree manually construct symlinks in tree to
|
||||
# the proper devices. Symlinks are installed for all entries
|
||||
# in the config file regardless of if that device actually
|
||||
# exists. When installed as a package udev can be relied on for
|
||||
# this and it will only create links for devices which exist.
|
||||
if [ ${INTREE} ]; then
|
||||
PWD=`pwd`
|
||||
mkdir -p ${DEVDIR}/
|
||||
cd ${DEVDIR}/
|
||||
${AWK} '!/^#/ && /./ { system( \
|
||||
"ln -f -s /dev/disk/by-path/"$2" "$1";" \
|
||||
"ln -f -s /dev/disk/by-path/"$2"-part1 "$1"p1;" \
|
||||
"ln -f -s /dev/disk/by-path/"$2"-part9 "$1"p9;" \
|
||||
) }' $SRC_PATH
|
||||
cd ${PWD}
|
||||
else
|
||||
DST_FILE=`basename ${SRC_PATH} | cut -f1-2 -d'.'`
|
||||
DST_PATH=/etc/zfs/${DST_FILE}
|
||||
|
||||
if [ -e ${DST_PATH} ]; then
|
||||
die "Error: Config ${DST_PATH} already exists"
|
||||
fi
|
||||
|
||||
cp ${SRC_PATH} ${DST_PATH}
|
||||
udev_trigger
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
udev_cleanup() {
|
||||
local SRC_PATH=$1
|
||||
|
||||
if [ ${INTREE} ]; then
|
||||
PWD=`pwd`
|
||||
cd ${DEVDIR}/
|
||||
${AWK} '!/^#/ && /./ { system( \
|
||||
"rm -f "$1" "$1"p1 "$1"p9") }' $SRC_PATH
|
||||
cd ${PWD}
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
udev_cr2d() {
|
||||
local CHANNEL=`echo "obase=16; $1+96" | bc`
|
||||
local RANK=$2
|
||||
|
||||
printf "\x${CHANNEL}${RANK}"
|
||||
}
|
||||
|
||||
udev_raid0_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
local IDX=0
|
||||
|
||||
RAID0S=()
|
||||
for RANK in `seq 1 ${RANKS}`; do
|
||||
for CHANNEL in `seq 1 ${CHANNELS}`; do
|
||||
DISK=`udev_cr2d ${CHANNEL} ${RANK}`
|
||||
RAID0S[${IDX}]="${DEVDIR}/${DISK}"
|
||||
let IDX=IDX+1
|
||||
done
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
udev_raid10_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
local IDX=0
|
||||
|
||||
RAID10S=()
|
||||
for RANK in `seq 1 ${RANKS}`; do
|
||||
for CHANNEL1 in `seq 1 2 ${CHANNELS}`; do
|
||||
let CHANNEL2=CHANNEL1+1
|
||||
DISK1=`udev_cr2d ${CHANNEL1} ${RANK}`
|
||||
DISK2=`udev_cr2d ${CHANNEL2} ${RANK}`
|
||||
GROUP="${DEVDIR}/${DISK1} ${DEVDIR}/${DISK2}"
|
||||
RAID10S[${IDX}]="mirror ${GROUP}"
|
||||
let IDX=IDX+1
|
||||
done
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
udev_raidz_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
|
||||
RAIDZS=()
|
||||
for RANK in `seq 1 ${RANKS}`; do
|
||||
RAIDZ=("raidz")
|
||||
|
||||
for CHANNEL in `seq 1 ${CHANNELS}`; do
|
||||
DISK=`udev_cr2d ${CHANNEL} ${RANK}`
|
||||
RAIDZ[${CHANNEL}]="${DEVDIR}/${DISK}"
|
||||
done
|
||||
|
||||
RAIDZS[${RANK}]="${RAIDZ[*]}"
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
udev_raidz2_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
|
||||
RAIDZ2S=()
|
||||
for RANK in `seq 1 ${RANKS}`; do
|
||||
RAIDZ2=("raidz2")
|
||||
|
||||
for CHANNEL in `seq 1 ${CHANNELS}`; do
|
||||
DISK=`udev_cr2d ${CHANNEL} ${RANK}`
|
||||
RAIDZ2[${CHANNEL}]="${DEVDIR}/${DISK}"
|
||||
done
|
||||
|
||||
RAIDZ2S[${RANK}]="${RAIDZ2[*]}"
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
run_one_test() {
|
||||
local TEST_NUM=$1
|
||||
local TEST_NAME=$2
|
||||
|
||||
printf "%-4d %-34s " ${TEST_NUM} "${TEST_NAME}"
|
||||
test_${TEST_NUM}
|
||||
}
|
||||
|
||||
skip_one_test() {
|
||||
local TEST_NUM=$1
|
||||
local TEST_NAME=$2
|
||||
|
||||
printf "%-4d %-34s " ${TEST_NUM} "${TEST_NAME}"
|
||||
skip
|
||||
}
|
||||
|
||||
run_test() {
|
||||
local TEST_NUM=$1
|
||||
local TEST_NAME=$2
|
||||
|
||||
for i in ${TESTS_SKIP[@]}; do
|
||||
if [[ $i == ${TEST_NUM} ]] ; then
|
||||
skip_one_test ${TEST_NUM} "${TEST_NAME}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "${TESTS_RUN[0]}" = "*" ]; then
|
||||
run_one_test ${TEST_NUM} "${TEST_NAME}"
|
||||
else
|
||||
for i in ${TESTS_RUN[@]}; do
|
||||
if [[ $i == ${TEST_NUM} ]] ; then
|
||||
run_one_test ${TEST_NUM} "${TEST_NAME}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
skip_one_test ${TEST_NUM} "${TEST_NAME}"
|
||||
fi
|
||||
}
|
||||
|
||||
wait_udev() {
|
||||
local DEVICE=$1
|
||||
local DELAY=$2
|
||||
local COUNT=0
|
||||
|
||||
udev_trigger
|
||||
while [ ! -e ${DEVICE} ]; do
|
||||
if [ ${COUNT} -gt ${DELAY} ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
let COUNT=${COUNT}+1
|
||||
sleep 1
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
stack_clear() {
|
||||
local STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size
|
||||
local STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled
|
||||
|
||||
if [ -e $STACK_MAX_SIZE ]; then
|
||||
echo 1 >$STACK_TRACER_ENABLED
|
||||
echo 0 >$STACK_MAX_SIZE
|
||||
fi
|
||||
}
|
||||
|
||||
stack_check() {
|
||||
local STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size
|
||||
local STACK_TRACE=/sys/kernel/debug/tracing/stack_trace
|
||||
local STACK_LIMIT=7000
|
||||
|
||||
if [ -e $STACK_MAX_SIZE ]; then
|
||||
STACK_SIZE=`cat $STACK_MAX_SIZE`
|
||||
|
||||
if [ $STACK_SIZE -ge $STACK_LIMIT ]; then
|
||||
echo
|
||||
echo "Warning: max stack size $STACK_SIZE bytes"
|
||||
cat $STACK_TRACE
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
kill_zed() {
|
||||
if [ -f $ZED_PIDFILE ]; then
|
||||
kill $(cat $ZED_PIDFILE)
|
||||
fi
|
||||
}
|
||||
#!/bin/sh
|
||||
|
||||
# Directories
|
||||
export BIN_DIR=
|
||||
export SBIN_DIR=
|
||||
export ZTS_DIR=
|
||||
export SCRIPT_DIR=
|
||||
|
||||
# General commands
|
||||
export ZDB=${ZDB:-$SBIN_DIR/zdb}
|
||||
export ZFS=${ZFS:-$SBIN_DIR/zfs}
|
||||
export ZPOOL=${ZPOOL:-$SBIN_DIR/zpool}
|
||||
export ZTEST=${ZTEST:-$SBIN_DIR/ztest}
|
||||
export ZFS_SH=${ZFS_SH:-$SCRIPT_DIR/zfs.sh}
|
||||
|
||||
# Test Suite
|
||||
export RUNFILE_DIR=${RUNFILE_DIR:-$ZTS_DIR/runfiles}
|
||||
export TEST_RUNNER=${TEST_RUNNER:-$ZTS_DIR/test-runner/bin/test-runner.py}
|
||||
export STF_TOOLS=${STF_TOOLS:-$ZTS_DIR/test-runner}
|
||||
export STF_SUITE=${STF_SUITE:-$ZTS_DIR/zfs-tests}
|
||||
|
||||
+3
-10
@@ -40,10 +40,6 @@ PRE_BUILD="configure
|
||||
then
|
||||
echo --enable-debug
|
||||
fi
|
||||
if [[ \${ZFS_DKMS_ENABLE_DMU_TX,,} == @(y|yes) ]]
|
||||
then
|
||||
echo --enable-debug-dmu-tx
|
||||
fi
|
||||
}
|
||||
)
|
||||
"
|
||||
@@ -86,10 +82,7 @@ DEST_MODULE_LOCATION[3]="/extra/zcommon/zcommon"
|
||||
BUILT_MODULE_NAME[4]="zfs"
|
||||
BUILT_MODULE_LOCATION[4]="module/zfs/"
|
||||
DEST_MODULE_LOCATION[4]="/extra/zfs/zfs"
|
||||
BUILT_MODULE_NAME[5]="zpios"
|
||||
BUILT_MODULE_LOCATION[5]="module/zpios/"
|
||||
DEST_MODULE_LOCATION[5]="/extra/zpios/zpios"
|
||||
BUILT_MODULE_NAME[6]="icp"
|
||||
BUILT_MODULE_LOCATION[6]="module/icp/"
|
||||
DEST_MODULE_LOCATION[6]="/extra/icp/icp"
|
||||
BUILT_MODULE_NAME[5]="icp"
|
||||
BUILT_MODULE_LOCATION[5]="module/icp/"
|
||||
DEST_MODULE_LOCATION[5]="/extra/icp/icp"
|
||||
EOF
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
|
||||
PROG=$0
|
||||
|
||||
@@ -19,6 +19,6 @@ if [ -z "${arch}" -o -z "${kver}" -o -z "${pkgname}" -o \
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cp ${tree}/${pkgname}/${pkgver}/build/zfs_config.h \
|
||||
${tree}/${pkgname}/${pkgver}/build/module/Module.symvers \
|
||||
${tree}/${pkgname}/${pkgver}/${kver}/${arch}/
|
||||
cp "${tree}/${pkgname}/${pkgver}/build/zfs_config.h" \
|
||||
"${tree}/${pkgname}/${pkgver}/build/module/Module.symvers" \
|
||||
"${tree}/${pkgname}/${pkgver}/${kver}/${arch}/"
|
||||
|
||||
-214
@@ -1,214 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
BASETANK="share"
|
||||
DATE=`date "+%Y%m%d"`
|
||||
|
||||
TEST_SMBFS=0
|
||||
TEST_DESTROY=0
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: `basename $0` [unpack]<[smbfs][snapshot][all]>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set_onoff() {
|
||||
type="$1"
|
||||
dataset="$2"
|
||||
toggle="$3"
|
||||
|
||||
current=`zfs get -H $type -o value $dataset`
|
||||
if [ "$current" != "$toggle" ]; then
|
||||
run "zfs set $type=$toggle $dataset"
|
||||
fi
|
||||
}
|
||||
|
||||
check_exists() {
|
||||
dataset="$1"
|
||||
|
||||
extra=""
|
||||
[ -n "$2" ] && extra="$2"
|
||||
|
||||
zfs get all "$dataset" > /dev/null 2>&1
|
||||
if [ $? != 0 ]; then
|
||||
run "zfs create $extra $dataset"
|
||||
fi
|
||||
}
|
||||
|
||||
check_shares() {
|
||||
if [ "$TEST_SMBFS" == "1" ]; then
|
||||
echo "Shares:"
|
||||
echo "=> usershare list:"
|
||||
net usershare list
|
||||
echo
|
||||
echo "=> /etc/dfs/sharetab:"
|
||||
cat /etc/dfs/sharetab
|
||||
echo
|
||||
fi
|
||||
|
||||
sleep 2
|
||||
}
|
||||
|
||||
test_header() {
|
||||
echo "TEST: $*"
|
||||
echo "======================================"
|
||||
}
|
||||
|
||||
run() {
|
||||
cmd="$*"
|
||||
|
||||
echo "CMD: $cmd"
|
||||
$cmd
|
||||
}
|
||||
|
||||
# ---------
|
||||
# Needs more work...
|
||||
if echo "$*" | grep -qi "unpack"; then
|
||||
zfs unmount -a
|
||||
zfs unshare -a
|
||||
run "zfs destroy -r $BASETANK/tests"
|
||||
|
||||
sh /etc/init.d/zfs stop
|
||||
|
||||
# for tid in `grep ^tid /proc/net/iet/volume | sed "s@.*:\([0-9].*\) name.*@\1@"`
|
||||
# do
|
||||
# ietadm --op delete --tid $tid
|
||||
# done
|
||||
|
||||
set -e
|
||||
rmmod `lsmod | grep ^z | grep -v zlib_deflate | sed 's@ .*@@'` spl zlib_deflate
|
||||
|
||||
pushd / > /dev/null
|
||||
[ -f "tmp/zfs.tgz" ] && tar xzf tmp/zfs.tgz && rm tmp/zfs.tgz
|
||||
[ -f "tmp/spl.tgz" ] && tar xzf tmp/spl.tgz && rm tmp/spl.tgz
|
||||
popd > /dev/null
|
||||
|
||||
depmod -a
|
||||
|
||||
sh /etc/init.d/zfs start
|
||||
set +e
|
||||
fi
|
||||
|
||||
# ---------
|
||||
if echo "$*" | egrep -qi "smbfs|all"; then
|
||||
check_exists $BASETANK/tests
|
||||
|
||||
TEST_SMBFS=1
|
||||
|
||||
test_header "Exists || Create"
|
||||
str=
|
||||
for volnr in 1 2 3; do
|
||||
check_exists $BASETANK/tests/smbfs$volnr
|
||||
|
||||
str="$str $BASETANK/tests/smbfs$volnr"
|
||||
done
|
||||
run "zfs get sharesmb $str"
|
||||
|
||||
# Set sharesmb=on
|
||||
test_header "Enable SMB share"
|
||||
for volnr in 1 2 3; do
|
||||
set_onoff sharesmb "$BASETANK/tests/smbfs$volnr" on
|
||||
check_shares
|
||||
done
|
||||
|
||||
# Share all
|
||||
test_header "Share all (individually)"
|
||||
for volnr in 1 2 3; do
|
||||
run "zfs share $BASETANK/tests/smbfs$volnr"
|
||||
check_shares
|
||||
done
|
||||
|
||||
# Unshare all
|
||||
test_header "Unshare all (individually)"
|
||||
for volnr in 1 2 3; do
|
||||
run "zfs unshare $BASETANK/tests/smbfs$volnr"
|
||||
check_shares
|
||||
done
|
||||
|
||||
# Change mountpoint - first unshare and then share individual
|
||||
test_header "Change mount point (unshare ; share)"
|
||||
mkdir -p /tests
|
||||
set_onoff sharesmb "$str" off
|
||||
for volnr in 3 1 2; do
|
||||
run "zfs set mountpoint=/tests/smbfs$volnr $BASETANK/tests/smbfs$volnr"
|
||||
echo "CMD: mount | grep ^$BASETANK/tests/smbfs$volnr"
|
||||
mount | grep ^$BASETANK/tests/smbfs$volnr
|
||||
echo
|
||||
|
||||
run "zfs mount $BASETANK/tests/smbfs$volnr"
|
||||
echo "CMD: mount | grep ^$BASETANK/tests/smbfs$volnr"
|
||||
mount | grep ^$BASETANK/tests/smbfs$volnr
|
||||
echo
|
||||
|
||||
set_onoff sharesmb "$BASETANK/tests/smbfs$volnr" on
|
||||
check_shares
|
||||
|
||||
run "zfs share $BASETANK/tests/smbfs$volnr"
|
||||
check_shares
|
||||
|
||||
echo "-------------------"
|
||||
done
|
||||
|
||||
# Change mountpoint - remounting
|
||||
test_header "Change mount point (remounting)"
|
||||
for volnr in 3 1 2; do
|
||||
run "zfs set mountpoint=/$BASETANK/tests/smbfs$volnr $BASETANK/tests/smbfs$volnr"
|
||||
echo "CMD: mount | grep ^$BASETANK/tests/smbfs$volnr"
|
||||
mount | grep ^$BASETANK/tests/smbfs$volnr
|
||||
echo
|
||||
# => Doesn't seem to remount (!?)
|
||||
|
||||
run "zfs mount $BASETANK/tests/smbfs$volnr"
|
||||
echo "CMD: mount | grep ^$BASETANK/tests/smbfs$volnr"
|
||||
mount | grep ^$BASETANK/tests/smbfs$volnr
|
||||
echo
|
||||
# => Doesn't seem to reshare (!?)
|
||||
|
||||
check_shares
|
||||
|
||||
run "zfs share $BASETANK/tests/smbfs$volnr"
|
||||
check_shares
|
||||
|
||||
echo "-------------------"
|
||||
done
|
||||
fi
|
||||
|
||||
# ---------
|
||||
if echo "$*" | egrep -qi "smbfs|all"; then
|
||||
test_header "Unshare + Share all"
|
||||
|
||||
run "zfs share -a" ; check_shares
|
||||
run "zfs unshare -a" ; check_shares
|
||||
fi
|
||||
|
||||
# ---------
|
||||
if echo "$*" | grep -qi "snapshot|all"; then
|
||||
test_header "Snapshots"
|
||||
|
||||
echo ; echo "-------------------"
|
||||
check_exists $BASETANK/tests/destroy
|
||||
check_exists $BASETANK/tests/destroy/destroy1
|
||||
run "zfs destroy -r $BASETANK/tests/destroy"
|
||||
|
||||
echo ; echo "-------------------"
|
||||
check_exists $BASETANK/tests/destroy
|
||||
run "zfs snapshot $BASETANK/tests/destroy@$DATE"
|
||||
run "zfs destroy -r $BASETANK/tests/destroy"
|
||||
|
||||
echo ; echo "-------------------"
|
||||
check_exists $BASETANK/tests/destroy
|
||||
run "zfs snapshot $BASETANK/tests/destroy@$DATE"
|
||||
run "zfs destroy -r $BASETANK/tests/destroy@$DATE"
|
||||
run "zfs destroy -r $BASETANK/tests/destroy"
|
||||
fi
|
||||
|
||||
if echo "$*" | egrep -qi "smbfs|snapshot|all"; then
|
||||
test_header "Cleanup (Share all + Destroy all)"
|
||||
|
||||
run "zfs share -a"
|
||||
check_shares
|
||||
|
||||
run "zfs destroy -r $BASETANK/tests"
|
||||
check_shares
|
||||
|
||||
run "zfs list"
|
||||
fi
|
||||
+78
-54
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
#
|
||||
# This script is designed to facilitate in-tree development and testing
|
||||
# by installing symlinks on your system which refer to in-tree helper
|
||||
@@ -17,20 +17,30 @@
|
||||
# --sysconfdir=DIR install zfs configuration files [PREFIX/etc]
|
||||
#
|
||||
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
BASE_DIR=$(dirname "$0")
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then
|
||||
. "${BASE_DIR}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zfs-helpers.sh
|
||||
DRYRUN=
|
||||
INSTALL=
|
||||
REMOVE=
|
||||
VERBOSE=
|
||||
DRYRUN="no"
|
||||
INSTALL="no"
|
||||
REMOVE="no"
|
||||
VERBOSE="no"
|
||||
|
||||
fail() {
|
||||
echo "${PROG}: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
msg() {
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
@@ -60,16 +70,16 @@ while getopts 'hdirv' OPTION; do
|
||||
exit 1
|
||||
;;
|
||||
d)
|
||||
DRYRUN=1
|
||||
DRYRUN="yes"
|
||||
;;
|
||||
i)
|
||||
INSTALL=1
|
||||
INSTALL="yes"
|
||||
;;
|
||||
r)
|
||||
REMOVE=1
|
||||
REMOVE="yes"
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
VERBOSE="yes"
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
@@ -78,27 +88,29 @@ while getopts 'hdirv' OPTION; do
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "${INSTALL}" -a "${REMOVE}" ]; then
|
||||
usage
|
||||
die "Specify -i or -r but not both"
|
||||
if [ "$INSTALL" = "yes" -a "$REMOVE" = "yes" ]; then
|
||||
fail "Specify -i or -r but not both"
|
||||
fi
|
||||
|
||||
if [ ! "${INSTALL}" -a ! "${REMOVE}" ]; then
|
||||
usage
|
||||
die "Either -i or -r must be specified"
|
||||
if [ "$INSTALL" = "no" -a "$REMOVE" = "no" ]; then
|
||||
fail "Either -i or -r must be specified"
|
||||
fi
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
fail "Must run as root"
|
||||
fi
|
||||
|
||||
if [ "$VERBOSE" ]; then
|
||||
if [ "$INTREE" != "yes" ]; then
|
||||
fail "Must be run in-tree"
|
||||
fi
|
||||
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "--- Configuration ---"
|
||||
echo "udevdir: $udevdir"
|
||||
echo "udevruledir: $udevruledir"
|
||||
echo "mounthelperdir: $mounthelperdir"
|
||||
echo "sysconfdir: $sysconfdir"
|
||||
echo "DRYRUN: $DRYRUN"
|
||||
echo "udevdir: $INSTALL_UDEV_DIR"
|
||||
echo "udevruledir: $INSTALL_UDEV_RULE_DIR"
|
||||
echo "mounthelperdir: $INSTALL_MOUNT_HELPER_DIR"
|
||||
echo "sysconfdir: $INSTALL_SYSCONF_DIR"
|
||||
echo "dryrun: $DRYRUN"
|
||||
echo
|
||||
fi
|
||||
|
||||
@@ -106,18 +118,19 @@ install() {
|
||||
local src=$1
|
||||
local dst=$2
|
||||
|
||||
if [ -h $dst ]; then
|
||||
if [ -h "$dst" ]; then
|
||||
echo "Symlink exists: $dst"
|
||||
elif [ -e $dst ]; then
|
||||
elif [ -e "$dst" ]; then
|
||||
echo "File exists: $dst"
|
||||
elif [ ! -e $src ]; then
|
||||
elif [ ! -e "$src" ]; then
|
||||
echo "Source missing: $src"
|
||||
else
|
||||
msg "ln -s $src $dst"
|
||||
|
||||
if [ ! "$DRYRUN" ]; then
|
||||
mkdir -p $(dirname $dst) &>/dev/null
|
||||
ln -s $src $dst
|
||||
if [ "$DRYRUN" = "no" ]; then
|
||||
DIR=$(dirname "$dst")
|
||||
mkdir -p "$DIR" >/dev/null 2>&1
|
||||
ln -s "$src" "$dst"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -125,31 +138,42 @@ install() {
|
||||
remove() {
|
||||
local dst=$1
|
||||
|
||||
if [ -h $dst ]; then
|
||||
if [ -h "$dst" ]; then
|
||||
msg "rm $dst"
|
||||
rm $dst
|
||||
rmdir $(dirname $dst) &>/dev/null
|
||||
rm "$dst"
|
||||
DIR=$(dirname "$dst")
|
||||
rmdir "$DIR" >/dev/null 2>&1
|
||||
elif [ -e "$dst" ]; then
|
||||
echo "Expected symlink: $dst"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ ${INSTALL} ]; then
|
||||
install $CMDDIR/mount_zfs/mount.zfs $mounthelperdir/mount.zfs
|
||||
install $CMDDIR/fsck_zfs/fsck.zfs $mounthelperdir/fsck.zfs
|
||||
install $CMDDIR/zvol_id/zvol_id $udevdir/zvol_id
|
||||
install $CMDDIR/vdev_id/vdev_id $udevdir/vdev_id
|
||||
install $UDEVRULEDIR/60-zvol.rules $udevruledir/60-zvol.rules
|
||||
install $UDEVRULEDIR/69-vdev.rules $udevruledir/69-vdev.rules
|
||||
install $UDEVRULEDIR/90-zfs.rules $udevruledir/90-zfs.rules
|
||||
install $CMDDIR/zpool/zpool.d $sysconfdir/zfs/zpool.d
|
||||
if [ "${INSTALL}" = "yes" ]; then
|
||||
install "$CMD_DIR/mount_zfs/mount.zfs" \
|
||||
"$INSTALL_MOUNT_HELPER_DIR/mount.zfs"
|
||||
install "$CMD_DIR/fsck_zfs/fsck.zfs" \
|
||||
"$INSTALL_MOUNT_HELPER_DIR/fsck.zfs"
|
||||
install "$CMD_DIR/zvol_id/zvol_id" \
|
||||
"$INSTALL_UDEV_DIR/zvol_id"
|
||||
install "$CMD_DIR/vdev_id/vdev_id" \
|
||||
"$INSTALL_UDEV_DIR/vdev_id"
|
||||
install "$UDEV_RULE_DIR/60-zvol.rules" \
|
||||
"$INSTALL_UDEV_RULE_DIR/60-zvol.rules"
|
||||
install "$UDEV_RULE_DIR/69-vdev.rules" \
|
||||
"$INSTALL_UDEV_RULE_DIR/69-vdev.rules"
|
||||
install "$UDEV_RULE_DIR/90-zfs.rules" \
|
||||
"$INSTALL_UDEV_RULE_DIR/90-zfs.rules"
|
||||
install "$CMD_DIR/zpool/zpool.d" \
|
||||
"$INSTALL_SYSCONF_DIR/zfs/zpool.d"
|
||||
else
|
||||
remove $mounthelperdir/mount.zfs
|
||||
remove $mounthelperdir/fsck.zfs
|
||||
remove $udevdir/zvol_id
|
||||
remove $udevdir/vdev_id
|
||||
remove $udevruledir/60-zvol.rules
|
||||
remove $udevruledir/69-vdev.rules
|
||||
remove $udevruledir/90-zfs.rules
|
||||
remove $sysconfdir/zfs/zpool.d
|
||||
remove "$INSTALL_MOUNT_HELPER_DIR/mount.zfs"
|
||||
remove "$INSTALL_MOUNT_HELPER_DIR/fsck.zfs"
|
||||
remove "$INSTALL_UDEV_DIR/zvol_id"
|
||||
remove "$INSTALL_UDEV_DIR/vdev_id"
|
||||
remove "$INSTALL_UDEV_RULE_DIR/60-zvol.rules"
|
||||
remove "$INSTALL_UDEV_RULE_DIR/69-vdev.rules"
|
||||
remove "$INSTALL_UDEV_RULE_DIR/90-zfs.rules"
|
||||
remove "$INSTALL_SYSCONF_DIR/zfs/zpool.d"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
+82
-62
@@ -20,21 +20,21 @@
|
||||
#
|
||||
# CDDL HEADER END
|
||||
#
|
||||
basedir=$(dirname "$0")
|
||||
|
||||
BASE_DIR=$(dirname "$0")
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then
|
||||
. "${BASE_DIR}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zfs-tests.sh
|
||||
VERBOSE=
|
||||
VERBOSE="no"
|
||||
QUIET=
|
||||
CLEANUP=1
|
||||
CLEANUPALL=0
|
||||
LOOPBACK=1
|
||||
CLEANUP="yes"
|
||||
CLEANUPALL="no"
|
||||
LOOPBACK="yes"
|
||||
FILESIZE="4G"
|
||||
RUNFILE=${RUNFILE:-"linux.run"}
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
@@ -45,6 +45,26 @@ ZFS_DBGMSG="$STF_SUITE/callbacks/zfs_dbgmsg.ksh"
|
||||
ZFS_DMESG="$STF_SUITE/callbacks/zfs_dmesg.ksh"
|
||||
ZFS_MMP="$STF_SUITE/callbacks/zfs_mmp.ksh"
|
||||
TESTFAIL_CALLBACKS=${TESTFAIL_CALLBACKS:-"$ZFS_DBGMSG:$ZFS_DMESG:$ZFS_MMP"}
|
||||
LOSETUP=${LOSETUP:-/sbin/losetup}
|
||||
DMSETUP=${DMSETUP:-/sbin/dmsetup}
|
||||
|
||||
#
|
||||
# Log an informational message when additional verbosity is enabled.
|
||||
#
|
||||
msg() {
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Log a failure message, cleanup, and return an error.
|
||||
#
|
||||
fail() {
|
||||
echo -e "$PROG: $1" >&2
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
#
|
||||
# Attempt to remove loopback devices and files which where created earlier
|
||||
@@ -52,11 +72,11 @@ TESTFAIL_CALLBACKS=${TESTFAIL_CALLBACKS:-"$ZFS_DBGMSG:$ZFS_DMESG:$ZFS_MMP"}
|
||||
# to the script to suppress cleanup for debugging purposes.
|
||||
#
|
||||
cleanup() {
|
||||
if [ $CLEANUP -eq 0 ]; then
|
||||
if [ "$CLEANUP" = "no" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ $LOOPBACK -eq 1 ]; then
|
||||
if [ "$LOOPBACK" = "yes" ]; then
|
||||
for TEST_LOOPBACK in ${LOOPBACKS}; do
|
||||
LOOP_DEV=$(basename "$TEST_LOOPBACK")
|
||||
DM_DEV=$(sudo "${DMSETUP}" ls 2>/dev/null | \
|
||||
@@ -78,8 +98,7 @@ cleanup() {
|
||||
rm -f "${TEST_FILE}" &>/dev/null
|
||||
done
|
||||
|
||||
# Preserve in-tree symlinks to aid debugging.
|
||||
if [ -z "${INTREE}" ] && [ -d "$STF_PATH" ]; then
|
||||
if [ "$STF_PATH_REMOVE" = "yes" ] && [ -d "$STF_PATH" ]; then
|
||||
rm -Rf "$STF_PATH"
|
||||
fi
|
||||
}
|
||||
@@ -121,21 +140,12 @@ cleanup_all() {
|
||||
done
|
||||
}
|
||||
|
||||
#
|
||||
# Log a failure message, cleanup, and return an error.
|
||||
#
|
||||
fail() {
|
||||
echo -e "${PROG}: $1" >&2
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
#
|
||||
# Takes a name as the only arguments and looks for the following variations
|
||||
# on that name. If one is found it is returned.
|
||||
#
|
||||
# $RUNFILEDIR/<name>
|
||||
# $RUNFILEDIR/<name>.run
|
||||
# $RUNFILE_DIR/<name>
|
||||
# $RUNFILE_DIR/<name>.run
|
||||
# <name>
|
||||
# <name>.run
|
||||
#
|
||||
@@ -143,10 +153,10 @@ find_runfile() {
|
||||
local NAME=$1
|
||||
local RESULT=""
|
||||
|
||||
if [ -f "$RUNFILEDIR/$NAME" ]; then
|
||||
RESULT="$RUNFILEDIR/$NAME"
|
||||
elif [ -f "$RUNFILEDIR/$NAME.run" ]; then
|
||||
RESULT="$RUNFILEDIR/$NAME.run"
|
||||
if [ -f "$RUNFILE_DIR/$NAME" ]; then
|
||||
RESULT="$RUNFILE_DIR/$NAME"
|
||||
elif [ -f "$RUNFILE_DIR/$NAME.run" ]; then
|
||||
RESULT="$RUNFILE_DIR/$NAME.run"
|
||||
elif [ -f "$NAME" ]; then
|
||||
RESULT="$NAME"
|
||||
elif [ -f "$NAME.run" ]; then
|
||||
@@ -188,40 +198,44 @@ create_links() {
|
||||
constrain_path() {
|
||||
. "$STF_SUITE/include/commands.cfg"
|
||||
|
||||
if [ -n "${INTREE}" ]; then
|
||||
STF_PATH="$BUILDDIR/bin"
|
||||
if [ "$INTREE" = "yes" ]; then
|
||||
# Constrained path set to ./zfs/bin/
|
||||
STF_PATH="$BIN_DIR"
|
||||
STF_PATH_REMOVE="no"
|
||||
STF_MISSING_BIN=""
|
||||
if [ ! -d "$STF_PATH" ]; then
|
||||
mkdir "$STF_PATH"
|
||||
chmod 755 "$STF_PATH" || fail "Couldn't chmod $STF_PATH"
|
||||
fi
|
||||
else
|
||||
SYSTEMDIR=${SYSTEMDIR:-/var/tmp/constrained_path.XXXX}
|
||||
STF_PATH=$(/bin/mktemp -d "$SYSTEMDIR")
|
||||
fi
|
||||
|
||||
STF_MISSING_BIN=""
|
||||
chmod 755 "$STF_PATH" || fail "Couldn't chmod $STF_PATH"
|
||||
|
||||
# Standard system utilities
|
||||
create_links "/bin /usr/bin /sbin /usr/sbin" "$SYSTEM_FILES"
|
||||
|
||||
if [ -z "${INTREE}" ]; then
|
||||
# Special case links for standard zfs utilities
|
||||
create_links "/bin /usr/bin /sbin /usr/sbin" "$ZFS_FILES"
|
||||
|
||||
# Special case links for zfs test suite utilties
|
||||
create_links "$TESTSDIR/bin" "$ZFSTEST_FILES"
|
||||
else
|
||||
# Special case links for standard zfs utilities
|
||||
DIRS="$(find "$CMDDIR" -type d \( ! -name .deps -a \
|
||||
DIRS="$(find "$CMD_DIR" -type d \( ! -name .deps -a \
|
||||
! -name .libs \) -print | tr '\n' ' ')"
|
||||
create_links "$DIRS" "$ZFS_FILES"
|
||||
|
||||
# Special case links for zfs test suite utilties
|
||||
DIRS="$(find "$TESTSDIR" -type d \( ! -name .deps -a \
|
||||
# Special case links for zfs test suite utilities
|
||||
DIRS="$(find "$STF_SUITE" -type d \( ! -name .deps -a \
|
||||
! -name .libs \) -print | tr '\n' ' ')"
|
||||
create_links "$DIRS" "$ZFSTEST_FILES"
|
||||
else
|
||||
# Constrained path set to /var/tmp/constrained_path.*
|
||||
SYSTEMDIR=${SYSTEMDIR:-/var/tmp/constrained_path.XXXX}
|
||||
STF_PATH=$(/bin/mktemp -d "$SYSTEMDIR")
|
||||
STF_PATH_REMOVE="yes"
|
||||
STF_MISSING_BIN=""
|
||||
|
||||
chmod 755 "$STF_PATH" || fail "Couldn't chmod $STF_PATH"
|
||||
|
||||
# Special case links for standard zfs utilities
|
||||
create_links "/bin /usr/bin /sbin /usr/sbin" "$ZFS_FILES"
|
||||
|
||||
# Special case links for zfs test suite utilities
|
||||
create_links "$STF_SUITE/bin" "$ZFSTEST_FILES"
|
||||
fi
|
||||
|
||||
# Standard system utilities
|
||||
create_links "/bin /usr/bin /sbin /usr/sbin" "$SYSTEM_FILES"
|
||||
|
||||
# Exceptions
|
||||
ln -fs "$STF_PATH/awk" "$STF_PATH/nawk"
|
||||
ln -fs /sbin/fsck.ext2 "$STF_PATH/fsck"
|
||||
@@ -250,6 +264,7 @@ OPTIONS:
|
||||
-x Remove all testpools, dm, lo, and files (unsafe)
|
||||
-k Disable cleanup after test failure
|
||||
-f Use files only, disables block device tests
|
||||
-c Only create and populate constrained path
|
||||
-d DIR Use DIR for files and loopback devices
|
||||
-s SIZE Use vdevs of SIZE (default: 4G)
|
||||
-r RUNFILE Run tests in RUNFILE (default: linux.run)
|
||||
@@ -270,7 +285,7 @@ $0 -x
|
||||
EOF
|
||||
}
|
||||
|
||||
while getopts 'hvqxkfd:s:r:?t:u:' OPTION; do
|
||||
while getopts 'hvqxkfcd:s:r:?t:u:' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
@@ -278,19 +293,23 @@ while getopts 'hvqxkfd:s:r:?t:u:' OPTION; do
|
||||
;;
|
||||
v)
|
||||
# shellcheck disable=SC2034
|
||||
VERBOSE=1
|
||||
VERBOSE="yes"
|
||||
;;
|
||||
q)
|
||||
QUIET="-q"
|
||||
;;
|
||||
x)
|
||||
CLEANUPALL=1
|
||||
CLEANUPALL="yes"
|
||||
;;
|
||||
k)
|
||||
CLEANUP=0
|
||||
CLEANUP="no"
|
||||
;;
|
||||
f)
|
||||
LOOPBACK=0
|
||||
LOOPBACK="no"
|
||||
;;
|
||||
c)
|
||||
constrain_path
|
||||
exit
|
||||
;;
|
||||
d)
|
||||
FILEDIR="$OPTARG"
|
||||
@@ -323,7 +342,7 @@ FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 $FILEDIR/file-vdev2"}
|
||||
LOOPBACKS=${LOOPBACKS:-""}
|
||||
|
||||
if [ ${#SINGLETEST[@]} -ne 0 ]; then
|
||||
RUNFILEDIR="/var/tmp"
|
||||
RUNFILE_DIR="/var/tmp"
|
||||
RUNFILE="zfs-tests.$$.run"
|
||||
SINGLEQUIET="False"
|
||||
|
||||
@@ -331,7 +350,7 @@ if [ ${#SINGLETEST[@]} -ne 0 ]; then
|
||||
SINGLEQUIET="True"
|
||||
fi
|
||||
|
||||
cat >$RUNFILEDIR/$RUNFILE << EOF
|
||||
cat >$RUNFILE_DIR/$RUNFILE << EOF
|
||||
[DEFAULT]
|
||||
pre =
|
||||
quiet = $SINGLEQUIET
|
||||
@@ -357,7 +376,7 @@ EOF
|
||||
CLEANUPSCRIPT="cleanup"
|
||||
fi
|
||||
|
||||
cat >>$RUNFILEDIR/$RUNFILE << EOF
|
||||
cat >>$RUNFILE_DIR/$RUNFILE << EOF
|
||||
|
||||
[$SINGLETESTDIR]
|
||||
tests = ['$SINGLETESTFILE']
|
||||
@@ -394,7 +413,7 @@ if [ "$(sudo whoami)" != "root" ]; then
|
||||
fi
|
||||
|
||||
#
|
||||
# Constain the available binaries to a known set.
|
||||
# Constrain the available binaries to a known set.
|
||||
#
|
||||
constrain_path
|
||||
|
||||
@@ -406,14 +425,14 @@ constrain_path
|
||||
"Missing $STF_SUITE/include/default.cfg file."
|
||||
|
||||
#
|
||||
# Verify the ZFS module stack if loaded.
|
||||
# Verify the ZFS module stack is loaded.
|
||||
#
|
||||
sudo "${ZFS_SH}" &>/dev/null
|
||||
|
||||
#
|
||||
# Attempt to cleanup all previous state for a new test run.
|
||||
#
|
||||
if [ $CLEANUPALL -ne 0 ]; then
|
||||
if [ "$CLEANUPALL" = "yes" ]; then
|
||||
cleanup_all
|
||||
fi
|
||||
|
||||
@@ -457,9 +476,10 @@ if [ -z "${DISKS}" ]; then
|
||||
#
|
||||
# If requested setup loopback devices backed by the sparse files.
|
||||
#
|
||||
if [ $LOOPBACK -eq 1 ]; then
|
||||
if [ "$LOOPBACK" = "yes" ]; then
|
||||
DISKS=""
|
||||
check_loop_utils
|
||||
|
||||
test -x "$LOSETUP" || fail "$LOSETUP utility must be installed"
|
||||
|
||||
for TEST_FILE in ${FILES}; do
|
||||
TEST_LOOPBACK=$(sudo "${LOSETUP}" -f)
|
||||
@@ -472,7 +492,7 @@ if [ -z "${DISKS}" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
NUM_DISKS=$(echo "${DISKS}" | $AWK '{print NF}')
|
||||
NUM_DISKS=$(echo "${DISKS}" | awk '{print NF}')
|
||||
[ "$NUM_DISKS" -lt 3 ] && fail "Not enough disks ($NUM_DISKS/3 minimum)"
|
||||
|
||||
#
|
||||
|
||||
+169
-24
@@ -1,19 +1,34 @@
|
||||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
#
|
||||
# A simple script to load/unload the ZFS module stack.
|
||||
#
|
||||
# A simple script to simply the loading/unloading the ZFS module stack.
|
||||
|
||||
basedir=$(dirname "$0")
|
||||
|
||||
BASE_DIR=$(dirname "$0")
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then
|
||||
. "${BASE_DIR}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2034
|
||||
PROG=zfs.sh
|
||||
UNLOAD=
|
||||
VERBOSE="no"
|
||||
UNLOAD="no"
|
||||
|
||||
ZED_PIDFILE=${ZED_PIDFILE:-/var/run/zed.pid}
|
||||
LDMOD=${LDMOD:-/sbin/modprobe}
|
||||
|
||||
KMOD_ZLIB_DEFLATE=${KMOD_ZLIB_DEFLATE:-zlib_deflate}
|
||||
KMOD_ZLIB_INFLATE=${KMOD_ZLIB_INFLATE:-zlib_inflate}
|
||||
KMOD_SPL=${KMOD_SPL:-spl}
|
||||
KMOD_SPLAT=${KMOD_SPLAT:-splat}
|
||||
KMOD_ZAVL=${KMOD_ZAVL:-zavl}
|
||||
KMOD_ZNVPAIR=${KMOD_ZNVPAIR:-znvpair}
|
||||
KMOD_ZUNICODE=${KMOD_ZUNICODE:-zunicode}
|
||||
KMOD_ZCOMMON=${KMOD_ZCOMMON:-zcommon}
|
||||
KMOD_ICP=${KMOD_ICP:-icp}
|
||||
KMOD_ZFS=${KMOD_ZFS:-zfs}
|
||||
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
@@ -27,13 +42,6 @@ OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-u Unload modules
|
||||
|
||||
MODULE-OPTIONS:
|
||||
Must be of the from module="options", for example:
|
||||
|
||||
$0 zfs="zfs_prefetch_disable=1"
|
||||
$0 zfs="zfs_prefetch_disable=1 zfs_mdcomp_disable=1"
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
@@ -44,11 +52,10 @@ while getopts 'hvu' OPTION; do
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
# shellcheck disable=SC2034
|
||||
VERBOSE=1
|
||||
VERBOSE="yes"
|
||||
;;
|
||||
u)
|
||||
UNLOAD=1
|
||||
UNLOAD="yes"
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
@@ -57,20 +64,158 @@ while getopts 'hvu' OPTION; do
|
||||
esac
|
||||
done
|
||||
|
||||
kill_zed() {
|
||||
if [ -f "$ZED_PIDFILE" ]; then
|
||||
PID=$(cat "$ZED_PIDFILE")
|
||||
kill "$PID"
|
||||
fi
|
||||
}
|
||||
|
||||
check_modules() {
|
||||
local LOADED_MODULES=""
|
||||
local MISSING_MODULES=""
|
||||
|
||||
for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
|
||||
$KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
|
||||
NAME=$(basename "$KMOD" .ko)
|
||||
|
||||
if lsmod | egrep -q "^${NAME}"; then
|
||||
LOADED_MODULES="$LOADED_MODULES\t$NAME\n"
|
||||
fi
|
||||
|
||||
if ! modinfo "$KMOD" >/dev/null 2>&1; then
|
||||
MISSING_MODULES="$MISSING_MODULES\t${KMOD}\n"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$LOADED_MODULES" ]; then
|
||||
printf "Unload the kernel modules by running '%s -u':\n" "$PROG"
|
||||
printf "%b" "$LOADED_MODULES"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -n "$MISSING_MODULES" ]; then
|
||||
printf "The following kernel modules can not be found:\n"
|
||||
printf "%b" "$MISSING_MODULES"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
load_module() {
|
||||
local KMOD=$1
|
||||
|
||||
FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}')
|
||||
VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}')
|
||||
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "Loading: $FILE ($VERSION)"
|
||||
fi
|
||||
|
||||
$LDMOD "$KMOD" >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to load $KMOD"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
load_modules() {
|
||||
mkdir -p /etc/zfs
|
||||
|
||||
modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null
|
||||
modprobe "$KMOD_ZLIB_INFLATE" >/dev/null
|
||||
|
||||
for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
|
||||
$KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
|
||||
load_module "$KMOD" || return 1
|
||||
done
|
||||
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "Successfully loaded ZFS module stack"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
unload_module() {
|
||||
local KMOD=$1
|
||||
|
||||
NAME=$(basename "$KMOD" .ko)
|
||||
FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}')
|
||||
VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}')
|
||||
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "Unloading: $KMOD ($VERSION)"
|
||||
fi
|
||||
|
||||
rmmod "$NAME" || echo "Failed to unload $NAME"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
unload_modules() {
|
||||
for KMOD in $KMOD_ZFS $KMOD_ICP $KMOD_ZCOMMON $KMOD_ZUNICODE \
|
||||
$KMOD_ZNVPAIR $KMOD_ZAVL $KMOD_SPLAT $KMOD_SPL; do
|
||||
NAME=$(basename "$KMOD" .ko)
|
||||
USE_COUNT=$(lsmod | egrep "^${NAME} " | awk '{print $3}')
|
||||
|
||||
if [ "$USE_COUNT" = "0" ] ; then
|
||||
unload_module "$KMOD" || return 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "Successfully unloaded ZFS module stack"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
stack_clear() {
|
||||
local STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size
|
||||
local STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled
|
||||
|
||||
if [ -e "$STACK_MAX_SIZE" ]; then
|
||||
echo 1 >"$STACK_TRACER_ENABLED"
|
||||
echo 0 >"$STACK_MAX_SIZE"
|
||||
fi
|
||||
}
|
||||
|
||||
stack_check() {
|
||||
local STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size
|
||||
local STACK_TRACE=/sys/kernel/debug/tracing/stack_trace
|
||||
local STACK_LIMIT=7600
|
||||
|
||||
if [ -e "$STACK_MAX_SIZE" ]; then
|
||||
STACK_SIZE=$(cat "$STACK_MAX_SIZE")
|
||||
|
||||
if [ "$STACK_SIZE" -ge "$STACK_LIMIT" ]; then
|
||||
echo
|
||||
echo "Warning: max stack size $STACK_SIZE bytes"
|
||||
cat "$STACK_TRACE"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$(id -u)" != 0 ]; then
|
||||
die "Must run as root"
|
||||
echo "Must run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ${UNLOAD} ]; then
|
||||
if [ "$UNLOAD" = "yes" ]; then
|
||||
kill_zed
|
||||
umount -t zfs -a
|
||||
stack_check
|
||||
unload_modules
|
||||
else
|
||||
stack_clear
|
||||
check_modules || die "${ERROR}"
|
||||
load_modules "$@" || die "Failed to load modules"
|
||||
wait_udev /dev/zfs 30 || die "'/dev/zfs' was not created"
|
||||
check_modules
|
||||
load_modules "$@"
|
||||
udevadm trigger
|
||||
udevadm settle
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
+171
-119
@@ -53,23 +53,21 @@
|
||||
# master Pass Pass Pass
|
||||
# installed Pass Pass Pass
|
||||
#
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
BASE_DIR=$(dirname "$0")
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then
|
||||
. "${BASE_DIR}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zimport.sh
|
||||
|
||||
SRC_TAGS="zfs-0.6.1 zfs-0.6.2 master"
|
||||
SRC_TAGS="zfs-0.6.5.11 master"
|
||||
POOL_TAGS="all master"
|
||||
TEST_DIR=`mktemp -u -d -p /var/tmp zimport.XXXXXXXX`
|
||||
KEEP=0
|
||||
VERBOSE=0
|
||||
COLOR=1
|
||||
TEST_DIR=$(mktemp -u -d -p /var/tmp zimport.XXXXXXXX)
|
||||
KEEP="no"
|
||||
VERBOSE="no"
|
||||
COLOR="yes"
|
||||
REPO="https://github.com/zfsonlinux"
|
||||
IMAGES_DIR="$SCRIPTDIR/zfs-images/"
|
||||
IMAGES_TAR="https://github.com/zfsonlinux/zfs-images/tarball/master"
|
||||
@@ -80,6 +78,11 @@ CONFIG_OPTIONS=${CONFIG_OPTIONS:-""}
|
||||
MAKE_LOG="make.log"
|
||||
MAKE_OPTIONS=${MAKE_OPTIONS:-"-s -j$(nproc)"}
|
||||
|
||||
COLOR_GREEN="\033[0;32m"
|
||||
COLOR_RED="\033[0;31m"
|
||||
COLOR_BROWN="\033[0;33m"
|
||||
COLOR_RESET="\033[0m"
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
@@ -109,13 +112,13 @@ while getopts 'hvckr:s:i:p:f:?' OPTION; do
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
VERBOSE="yes"
|
||||
;;
|
||||
c)
|
||||
COLOR=0
|
||||
COLOR="no"
|
||||
;;
|
||||
k)
|
||||
KEEP=1
|
||||
KEEP="yes"
|
||||
;;
|
||||
r)
|
||||
REPO="$OPTARG"
|
||||
@@ -139,15 +142,51 @@ while getopts 'hvckr:s:i:p:f:?' OPTION; do
|
||||
esac
|
||||
done
|
||||
|
||||
# Initialize the test suite
|
||||
init
|
||||
check_modules || die "ZFS modules must be unloaded"
|
||||
#
|
||||
# Verify the module start is not loaded
|
||||
#
|
||||
if lsmod | grep zfs >/dev/null; then
|
||||
echo "ZFS modules must be unloaded"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#
|
||||
# Create a random directory tree of files and sub-directories to
|
||||
# to act as a copy source for the various regression tests.
|
||||
#
|
||||
populate() {
|
||||
local ROOT=$1
|
||||
local MAX_DIR_SIZE=$2
|
||||
local MAX_FILE_SIZE=$3
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
mkdir -p $ROOT/{a,b,c,d,e,f,g}/{h,i}
|
||||
DIRS=$(find "$ROOT")
|
||||
|
||||
for DIR in $DIRS; do
|
||||
COUNT=$((RANDOM % MAX_DIR_SIZE))
|
||||
|
||||
# shellcheck disable=SC2034
|
||||
for i in $(seq $COUNT); do
|
||||
FILE=$(mktemp -p "$DIR")
|
||||
SIZE=$((RANDOM % MAX_FILE_SIZE))
|
||||
dd if=/dev/urandom of="$FILE" bs=1k \
|
||||
count="$SIZE" &>/dev/null
|
||||
done
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
SRC_DIR=$(mktemp -d -p /var/tmp/ zfs.src.XXXXXXXX)
|
||||
trap 'rm -Rf "$SRC_DIR"' INT TERM EXIT
|
||||
populate "$SRC_DIR" 10 100
|
||||
|
||||
SRC_DIR="$TEST_DIR/src"
|
||||
SRC_DIR_SPL="$SRC_DIR/spl"
|
||||
SRC_DIR_ZFS="$SRC_DIR/zfs"
|
||||
|
||||
if [ $COLOR -eq 0 ]; then
|
||||
if [ "$COLOR" = "no" ]; then
|
||||
COLOR_GREEN=""
|
||||
COLOR_BROWN=""
|
||||
COLOR_RED=""
|
||||
@@ -166,6 +205,11 @@ fail_nonewline() {
|
||||
echo -n -e "${COLOR_RED}Fail${COLOR_RESET}\t\t"
|
||||
}
|
||||
|
||||
fail() {
|
||||
echo -e "${COLOR_RED}Fail${COLOR_RESET} ($1)"
|
||||
exit "$1"
|
||||
}
|
||||
|
||||
#
|
||||
# Set several helper variables which are derived from a source tag.
|
||||
#
|
||||
@@ -179,24 +223,22 @@ fail_nonewline() {
|
||||
src_set_vars() {
|
||||
local TAG=$1
|
||||
|
||||
SPL_TAG=`echo $TAG | sed -e 's/zfs/spl/'`
|
||||
SPL_DIR=$SRC_DIR_SPL/$SPL_TAG
|
||||
SPL_URL=$REPO/spl/tarball/$SPL_TAG
|
||||
SPL_TAG="${TAG//zfs/spl}"
|
||||
SPL_DIR="$SRC_DIR_SPL/$SPL_TAG"
|
||||
SPL_URL="$REPO/spl/tarball/$SPL_TAG"
|
||||
|
||||
ZFS_TAG=$TAG
|
||||
ZFS_DIR=$SRC_DIR_ZFS/$ZFS_TAG
|
||||
ZFS_URL=$REPO/zfs/tarball/$ZFS_TAG
|
||||
ZFS_TAG="$TAG"
|
||||
ZFS_DIR="$SRC_DIR_ZFS/$ZFS_TAG"
|
||||
ZFS_URL="$REPO/zfs/tarball/$ZFS_TAG"
|
||||
|
||||
if [ "$TAG" = "installed" ]; then
|
||||
ZPOOL_CMD=`which zpool`
|
||||
ZFS_CMD=`which zfs`
|
||||
ZPOOL_CMD=$(which zpool)
|
||||
ZFS_CMD=$(which zfs)
|
||||
ZFS_SH="/usr/share/zfs/zfs.sh"
|
||||
ZPOOL_CREATE="/usr/share/zfs/zpool-create.sh"
|
||||
else
|
||||
ZPOOL_CMD="./cmd/zpool/zpool"
|
||||
ZFS_CMD="./cmd/zfs/zfs"
|
||||
ZFS_SH="./scripts/zfs.sh"
|
||||
ZPOOL_CREATE="./scripts/zpool-create.sh"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -220,8 +262,7 @@ pool_set_vars() {
|
||||
POOL_DIR=$TEST_DIR/pools/$POOL_TAG
|
||||
POOL_DIR_PRISTINE=$POOL_DIR/pristine
|
||||
POOL_DIR_COPY=$POOL_DIR/copy
|
||||
POOL_DIR_SRC=`echo -n "$SRC_DIR_ZFS/"; \
|
||||
echo "$POOL_TAG" | sed -e 's/zol/zfs/'`
|
||||
POOL_DIR_SRC="$SRC_DIR_ZFS/${POOL_TAG//zol/zfs}"
|
||||
}
|
||||
|
||||
#
|
||||
@@ -230,46 +271,51 @@ pool_set_vars() {
|
||||
# extended as needed to create more realistic pools.
|
||||
#
|
||||
pool_create() {
|
||||
pool_set_vars $1
|
||||
src_set_vars $1
|
||||
pool_set_vars "$1"
|
||||
src_set_vars "$1"
|
||||
|
||||
if [ "$POOL_TAG" != "installed" ]; then
|
||||
cd $POOL_DIR_SRC
|
||||
cd "$POOL_DIR_SRC"
|
||||
fi
|
||||
|
||||
$ZFS_SH zfs="spa_config_path=$POOL_DIR_PRISTINE" || fail 1
|
||||
|
||||
# Create a file vdev RAIDZ pool.
|
||||
FILEDIR="$POOL_DIR_PRISTINE" $ZPOOL_CREATE \
|
||||
-c file-raidz -p $POOL_TAG -v -x >/dev/null || fail 2
|
||||
truncate -s 1G \
|
||||
"$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
|
||||
"$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4"
|
||||
$ZPOOL_CMD create "$POOL_TAG" raidz \
|
||||
"$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
|
||||
"$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4"
|
||||
|
||||
# Create a pool/fs filesystem with some random contents.
|
||||
$ZFS_CMD create $POOL_TAG/fs || fail 3
|
||||
populate /$POOL_TAG/fs/ 10 100
|
||||
$ZFS_CMD create "$POOL_TAG/fs" || fail 3
|
||||
populate "/$POOL_TAG/fs/" 10 100
|
||||
|
||||
# Snapshot that filesystem, clone it, remove the files/dirs,
|
||||
# replace them with new files/dirs.
|
||||
$ZFS_CMD snap $POOL_TAG/fs@snap || fail 4
|
||||
$ZFS_CMD clone $POOL_TAG/fs@snap $POOL_TAG/clone || fail 5
|
||||
$ZFS_CMD snap "$POOL_TAG/fs@snap" || fail 4
|
||||
$ZFS_CMD clone "$POOL_TAG/fs@snap" "$POOL_TAG/clone" || fail 5
|
||||
# shellcheck disable=SC2086
|
||||
rm -Rf /$POOL_TAG/clone/* || fail 6
|
||||
populate /$POOL_TAG/clone/ 10 100
|
||||
populate "/$POOL_TAG/clone/" 10 100
|
||||
|
||||
# Scrub the pool, delay slightly, then export it. It is now
|
||||
# somewhat interesting for testing purposes.
|
||||
$ZPOOL_CMD scrub $POOL_TAG || fail 7
|
||||
$ZPOOL_CMD scrub "$POOL_TAG" || fail 7
|
||||
sleep 10
|
||||
$ZPOOL_CMD export $POOL_TAG || fail 8
|
||||
$ZPOOL_CMD export "$POOL_TAG" || fail 8
|
||||
|
||||
$ZFS_SH -u || fail 9
|
||||
}
|
||||
|
||||
# If the zfs-images directory doesn't exist fetch a copy from Github then
|
||||
# cache it in the $TEST_DIR and update $IMAGES_DIR.
|
||||
if [ ! -d $IMAGES_DIR ]; then
|
||||
if [ ! -d "$IMAGES_DIR" ]; then
|
||||
IMAGES_DIR="$TEST_DIR/zfs-images"
|
||||
mkdir -p $IMAGES_DIR
|
||||
curl -sL $IMAGES_TAR | \
|
||||
tar -xz -C $IMAGES_DIR --strip-components=1 || fail 10
|
||||
mkdir -p "$IMAGES_DIR"
|
||||
curl -sL "$IMAGES_TAR" | \
|
||||
tar -xz -C "$IMAGES_DIR" --strip-components=1 || fail 10
|
||||
fi
|
||||
|
||||
# Given the available images in the zfs-images directory substitute the
|
||||
@@ -277,8 +323,9 @@ fi
|
||||
for TAG in $POOL_TAGS; do
|
||||
|
||||
if [ "$TAG" = "all" ]; then
|
||||
ALL_TAGS=`ls $IMAGES_DIR | grep "tar.bz2" | \
|
||||
sed 's/.tar.bz2//' | tr '\n' ' '`
|
||||
# shellcheck disable=SC2010
|
||||
ALL_TAGS=$(ls "$IMAGES_DIR" | grep "tar.bz2" | \
|
||||
sed 's/.tar.bz2//' | tr '\n' ' ')
|
||||
NEW_TAGS="$NEW_TAGS $ALL_TAGS"
|
||||
else
|
||||
NEW_TAGS="$NEW_TAGS $TAG"
|
||||
@@ -286,41 +333,41 @@ for TAG in $POOL_TAGS; do
|
||||
done
|
||||
POOL_TAGS="$NEW_TAGS"
|
||||
|
||||
if [ $VERBOSE -ne 0 ]; then
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo "---------------------------- Options ----------------------------"
|
||||
echo "VERBOSE=$VERBOSE"
|
||||
echo "KEEP=$KEEP"
|
||||
echo "REPO=$REPO"
|
||||
echo "SRC_TAGS="$SRC_TAGS""
|
||||
echo "POOL_TAGS="$POOL_TAGS""
|
||||
echo "SRC_TAGS=$SRC_TAGS"
|
||||
echo "POOL_TAGS=$POOL_TAGS"
|
||||
echo "PATH=$TEST_DIR"
|
||||
echo
|
||||
fi
|
||||
|
||||
if [ ! -d $TEST_DIR ]; then
|
||||
mkdir -p $TEST_DIR
|
||||
if [ ! -d "$TEST_DIR" ]; then
|
||||
mkdir -p "$TEST_DIR"
|
||||
fi
|
||||
|
||||
if [ ! -d $SRC_DIR ]; then
|
||||
mkdir -p $SRC_DIR
|
||||
if [ ! -d "$SRC_DIR" ]; then
|
||||
mkdir -p "$SRC_DIR"
|
||||
fi
|
||||
|
||||
# Print a header for all tags which are being tested.
|
||||
echo "--------------------- ZFS on Linux Source Versions --------------"
|
||||
printf "%-16s" " "
|
||||
for TAG in $SRC_TAGS; do
|
||||
src_set_vars $TAG
|
||||
src_set_vars "$TAG"
|
||||
|
||||
if [ "$TAG" = "installed" ]; then
|
||||
ZFS_VERSION=`modinfo zfs | awk '/version:/ { print $2; exit }'`
|
||||
ZFS_VERSION=$(modinfo zfs | awk '/version:/ { print $2; exit }')
|
||||
if [ -n "$ZFS_VERSION" ]; then
|
||||
printf "%-16s" $ZFS_VERSION
|
||||
printf "%-16s" "$ZFS_VERSION"
|
||||
else
|
||||
echo "ZFS is not installed\n"
|
||||
echo -e "ZFS is not installed\n"
|
||||
fail
|
||||
fi
|
||||
else
|
||||
printf "%-16s" $TAG
|
||||
printf "%-16s" "$TAG"
|
||||
fi
|
||||
done
|
||||
echo -e "\n-----------------------------------------------------------------"
|
||||
@@ -331,29 +378,29 @@ echo -e "\n-----------------------------------------------------------------"
|
||||
#
|
||||
printf "%-16s" "Clone SPL"
|
||||
for TAG in $SRC_TAGS; do
|
||||
src_set_vars $TAG
|
||||
src_set_vars "$TAG"
|
||||
|
||||
if [ -d $SPL_DIR ]; then
|
||||
if [ -d "$SPL_DIR" ]; then
|
||||
skip_nonewline
|
||||
elif [ "$SPL_TAG" = "installed" ]; then
|
||||
skip_nonewline
|
||||
else
|
||||
cd $SRC_DIR
|
||||
cd "$SRC_DIR"
|
||||
|
||||
if [ ! -d $SRC_DIR_SPL ]; then
|
||||
mkdir -p $SRC_DIR_SPL
|
||||
if [ ! -d "$SRC_DIR_SPL" ]; then
|
||||
mkdir -p "$SRC_DIR_SPL"
|
||||
fi
|
||||
|
||||
git archive --format=tar --prefix=$SPL_TAG/ $SPL_TAG \
|
||||
-o $SRC_DIR_SPL/$SPL_TAG.tar &>/dev/nul || \
|
||||
rm $SRC_DIR_SPL/$SPL_TAG.tar
|
||||
if [ -s $SRC_DIR_SPL/$SPL_TAG.tar ]; then
|
||||
tar -xf $SRC_DIR_SPL/$SPL_TAG.tar -C $SRC_DIR_SPL
|
||||
rm $SRC_DIR_SPL/$SPL_TAG.tar
|
||||
git archive --format=tar --prefix="$SPL_TAG/ $SPL_TAG" \
|
||||
-o "$SRC_DIR_SPL/$SPL_TAG.tar" &>/dev/nul || \
|
||||
rm "$SRC_DIR_SPL/$SPL_TAG.tar"
|
||||
if [ -s "$SRC_DIR_SPL/$SPL_TAG.tar" ]; then
|
||||
tar -xf "$SRC_DIR_SPL/$SPL_TAG.tar" -C "$SRC_DIR_SPL"
|
||||
rm "$SRC_DIR_SPL/$SPL_TAG.tar"
|
||||
echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
|
||||
else
|
||||
mkdir -p $SPL_DIR || fail 1
|
||||
curl -sL $SPL_URL | tar -xz -C $SPL_DIR \
|
||||
mkdir -p "$SPL_DIR" || fail 1
|
||||
curl -sL "$SPL_URL" | tar -xz -C "$SPL_DIR" \
|
||||
--strip-components=1 || fail 2
|
||||
echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
|
||||
fi
|
||||
@@ -367,29 +414,29 @@ printf "\n"
|
||||
#
|
||||
printf "%-16s" "Clone ZFS"
|
||||
for TAG in $SRC_TAGS; do
|
||||
src_set_vars $TAG
|
||||
src_set_vars "$TAG"
|
||||
|
||||
if [ -d $ZFS_DIR ]; then
|
||||
if [ -d "$ZFS_DIR" ]; then
|
||||
skip_nonewline
|
||||
elif [ "$ZFS_TAG" = "installed" ]; then
|
||||
skip_nonewline
|
||||
else
|
||||
cd $SRC_DIR
|
||||
cd "$SRC_DIR"
|
||||
|
||||
if [ ! -d $SRC_DIR_ZFS ]; then
|
||||
mkdir -p $SRC_DIR_ZFS
|
||||
if [ ! -d "$SRC_DIR_ZFS" ]; then
|
||||
mkdir -p "$SRC_DIR_ZFS"
|
||||
fi
|
||||
|
||||
git archive --format=tar --prefix=$ZFS_TAG/ $ZFS_TAG \
|
||||
-o $SRC_DIR_ZFS/$ZFS_TAG.tar &>/dev/nul || \
|
||||
rm $SRC_DIR_ZFS/$ZFS_TAG.tar
|
||||
if [ -s $SRC_DIR_ZFS/$ZFS_TAG.tar ]; then
|
||||
tar -xf $SRC_DIR_ZFS/$ZFS_TAG.tar -C $SRC_DIR_ZFS
|
||||
rm $SRC_DIR_ZFS/$ZFS_TAG.tar
|
||||
git archive --format=tar --prefix="$ZFS_TAG/ $ZFS_TAG" \
|
||||
-o "$SRC_DIR_ZFS/$ZFS_TAG.tar" &>/dev/nul || \
|
||||
rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
|
||||
if [ -s "$SRC_DIR_ZFS/$ZFS_TAG.tar" ]; then
|
||||
tar -xf "$SRC_DIR_ZFS/$ZFS_TAG.tar" -C "$SRC_DIR_ZFS"
|
||||
rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
|
||||
echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
|
||||
else
|
||||
mkdir -p $ZFS_DIR || fail 1
|
||||
curl -sL $ZFS_URL | tar -xz -C $ZFS_DIR \
|
||||
mkdir -p "$ZFS_DIR" || fail 1
|
||||
curl -sL "$ZFS_URL" | tar -xz -C "$ZFS_DIR" \
|
||||
--strip-components=1 || fail 2
|
||||
echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
|
||||
fi
|
||||
@@ -400,18 +447,20 @@ printf "\n"
|
||||
# Build the listed tags
|
||||
printf "%-16s" "Build SPL"
|
||||
for TAG in $SRC_TAGS; do
|
||||
src_set_vars $TAG
|
||||
src_set_vars "$TAG"
|
||||
|
||||
if [ -f $SPL_DIR/module/spl/spl.ko ]; then
|
||||
if [ -f "$SPL_DIR/module/spl/spl.ko" ]; then
|
||||
skip_nonewline
|
||||
elif [ "$SPL_TAG" = "installed" ]; then
|
||||
skip_nonewline
|
||||
else
|
||||
cd $SPL_DIR
|
||||
cd "$SPL_DIR"
|
||||
make distclean &>/dev/null
|
||||
./autogen.sh >>$CONFIG_LOG 2>&1 || fail 1
|
||||
./configure $CONFIG_OPTIONS >>$CONFIG_LOG 2>&1 || fail 2
|
||||
make ${MAKE_OPTIONS} >>$MAKE_LOG 2>&1 || fail 3
|
||||
./autogen.sh >>"$CONFIG_LOG" 2>&1 || fail 1
|
||||
# shellcheck disable=SC2086
|
||||
./configure $CONFIG_OPTIONS >>"$CONFIG_LOG" 2>&1 || fail 2
|
||||
# shellcheck disable=SC2086
|
||||
make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || fail 3
|
||||
pass_nonewline
|
||||
fi
|
||||
done
|
||||
@@ -420,19 +469,21 @@ printf "\n"
|
||||
# Build the listed tags
|
||||
printf "%-16s" "Build ZFS"
|
||||
for TAG in $SRC_TAGS; do
|
||||
src_set_vars $TAG
|
||||
src_set_vars "$TAG"
|
||||
|
||||
if [ -f $ZFS_DIR/module/zfs/zfs.ko ]; then
|
||||
if [ -f "$ZFS_DIR/module/zfs/zfs.ko" ]; then
|
||||
skip_nonewline
|
||||
elif [ "$ZFS_TAG" = "installed" ]; then
|
||||
skip_nonewline
|
||||
else
|
||||
cd $ZFS_DIR
|
||||
cd "$ZFS_DIR"
|
||||
make distclean &>/dev/null
|
||||
./autogen.sh >>$CONFIG_LOG 2>&1 || fail 1
|
||||
./configure --with-spl=$SPL_DIR $CONFIG_OPTIONS \
|
||||
>>$CONFIG_LOG 2>&1 || fail 2
|
||||
make ${MAKE_OPTIONS} >>$MAKE_LOG 2>&1 || fail 3
|
||||
./autogen.sh >>"$CONFIG_LOG" 2>&1 || fail 1
|
||||
# shellcheck disable=SC2086
|
||||
./configure --with-spl="$SPL_DIR" $CONFIG_OPTIONS \
|
||||
>>"$CONFIG_LOG" 2>&1 || fail 2
|
||||
# shellcheck disable=SC2086
|
||||
make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || fail 3
|
||||
pass_nonewline
|
||||
fi
|
||||
done
|
||||
@@ -442,23 +493,23 @@ echo "-----------------------------------------------------------------"
|
||||
# Either create a new pool using 'zpool create', or alternately restore an
|
||||
# existing pool from another ZFS implementation for compatibility testing.
|
||||
for TAG in $POOL_TAGS; do
|
||||
pool_set_vars $TAG
|
||||
pool_set_vars "$TAG"
|
||||
SKIP=0
|
||||
|
||||
printf "%-16s" $POOL_TAG
|
||||
rm -Rf $POOL_DIR
|
||||
mkdir -p $POOL_DIR_PRISTINE
|
||||
printf "%-16s" "$POOL_TAG"
|
||||
rm -Rf "$POOL_DIR"
|
||||
mkdir -p "$POOL_DIR_PRISTINE"
|
||||
|
||||
# Use the existing compressed image if available.
|
||||
if [ -f $POOL_BZIP ]; then
|
||||
tar -xjf $POOL_BZIP -C $POOL_DIR_PRISTINE \
|
||||
if [ -f "$POOL_BZIP" ]; then
|
||||
tar -xjf "$POOL_BZIP" -C "$POOL_DIR_PRISTINE" \
|
||||
--strip-components=1 || fail 1
|
||||
# Use the installed version to create the pool.
|
||||
elif [ "$TAG" = "installed" ]; then
|
||||
pool_create $TAG
|
||||
pool_create "$TAG"
|
||||
# A source build is available to create the pool.
|
||||
elif [ -d $POOL_DIR_SRC ]; then
|
||||
pool_create $TAG
|
||||
elif [ -d "$POOL_DIR_SRC" ]; then
|
||||
pool_create "$TAG"
|
||||
else
|
||||
SKIP=1
|
||||
fi
|
||||
@@ -471,35 +522,36 @@ for TAG in $POOL_TAGS; do
|
||||
continue
|
||||
fi
|
||||
|
||||
src_set_vars $TAG
|
||||
src_set_vars "$TAG"
|
||||
if [ "$TAG" != "installed" ]; then
|
||||
cd $ZFS_DIR
|
||||
cd "$ZFS_DIR"
|
||||
fi
|
||||
$ZFS_SH zfs="spa_config_path=$POOL_DIR_COPY"
|
||||
|
||||
cp -a --sparse=always $POOL_DIR_PRISTINE \
|
||||
$POOL_DIR_COPY || fail 2
|
||||
POOL_NAME=`$ZPOOL_CMD import -d $POOL_DIR_COPY | \
|
||||
awk '/pool:/ { print $2; exit 0 }'`
|
||||
cp -a --sparse=always "$POOL_DIR_PRISTINE" \
|
||||
"$POOL_DIR_COPY" || fail 2
|
||||
POOL_NAME=$($ZPOOL_CMD import -d "$POOL_DIR_COPY" | \
|
||||
awk '/pool:/ { print $2; exit 0 }')
|
||||
|
||||
$ZPOOL_CMD import -N -d $POOL_DIR_COPY $POOL_NAME &>/dev/null
|
||||
$ZPOOL_CMD import -N -d "$POOL_DIR_COPY" \
|
||||
"$POOL_NAME" &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
fail_nonewline
|
||||
ERROR=1
|
||||
else
|
||||
$ZPOOL_CMD export $POOL_NAME || fail 3
|
||||
$ZPOOL_CMD export "$POOL_NAME" || fail 3
|
||||
pass_nonewline
|
||||
fi
|
||||
|
||||
rm -Rf $POOL_DIR_COPY
|
||||
rm -Rf "$POOL_DIR_COPY"
|
||||
|
||||
$ZFS_SH -u || fail 4
|
||||
done
|
||||
printf "\n"
|
||||
done
|
||||
|
||||
if [ ! $KEEP ]; then
|
||||
rm -Rf $TEST_DIR
|
||||
if [ "$KEEP" = "no" ]; then
|
||||
rm -Rf "$TEST_DIR"
|
||||
fi
|
||||
|
||||
exit $ERROR
|
||||
|
||||
+3
-4
@@ -20,11 +20,10 @@
|
||||
# Copyright (C) 2016 Lawrence Livermore National Security, LLC.
|
||||
#
|
||||
|
||||
basedir=$(dirname "$0")
|
||||
|
||||
BASE_DIR=$(dirname "$0")
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then
|
||||
. "${BASE_DIR}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
pkgdataprofiledir = $(pkgdatadir)/zpios-profile
|
||||
dist_pkgdataprofile_SCRIPTS = \
|
||||
$(top_srcdir)/scripts/zpios-profile/zpios-profile-disk.sh \
|
||||
$(top_srcdir)/scripts/zpios-profile/zpios-profile-pids.sh \
|
||||
$(top_srcdir)/scripts/zpios-profile/zpios-profile-post.sh \
|
||||
$(top_srcdir)/scripts/zpios-profile/zpios-profile-pre.sh \
|
||||
$(top_srcdir)/scripts/zpios-profile/zpios-profile.sh
|
||||
@@ -1,129 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# /proc/diskinfo <after skipping major/minor>
|
||||
# Field 1 -- device name
|
||||
# Field 2 -- # of reads issued
|
||||
# Field 3 -- # of reads merged
|
||||
# Field 4 -- # of sectors read
|
||||
# Field 5 -- # of milliseconds spent reading
|
||||
# Field 6 -- # of writes completed
|
||||
# Field 7 -- # of writes merged
|
||||
# Field 8 -- # of sectors written
|
||||
# Field 9 -- # of milliseconds spent writing
|
||||
# Field 10 -- # of I/Os currently in progress
|
||||
# Field 11 -- # of milliseconds spent doing I/Os
|
||||
# Field 12 -- weighted # of milliseconds spent doing I/Os
|
||||
|
||||
PROG=zpios-profile-disk.sh
|
||||
|
||||
RUN_PIDS=${0}
|
||||
RUN_LOG_DIR=${1}
|
||||
RUN_ID=${2}
|
||||
|
||||
create_table() {
|
||||
local FIELD=$1
|
||||
local ROW_M=()
|
||||
local ROW_N=()
|
||||
local HEADER=1
|
||||
local STEP=1
|
||||
|
||||
for DISK_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/disk-[0-9]*`; do
|
||||
ROW_M=( ${ROW_N[@]} )
|
||||
ROW_N=( `cat ${DISK_FILE} | grep sd | cut -c11- | cut -f${FIELD} -d' ' | tr "\n" "\t"` )
|
||||
|
||||
if [ $HEADER -eq 1 ]; then
|
||||
echo -n "step, "
|
||||
cat ${DISK_FILE} | grep sd | cut -c11- | cut -f1 -d' ' | tr "\n" ", "
|
||||
echo "total"
|
||||
HEADER=0
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -eq 0 ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
|
||||
echo "Badly formatted profile data in ${DISK_FILE}"
|
||||
break
|
||||
fi
|
||||
|
||||
TOTAL=0
|
||||
echo -n "${STEP}, "
|
||||
for (( i=0; i<${#ROW_N[@]}; i++ )); do
|
||||
DELTA=`echo "${ROW_N[${i}]}-${ROW_M[${i}]}" | bc`
|
||||
let TOTAL=${TOTAL}+${DELTA}
|
||||
echo -n "${DELTA}, "
|
||||
done
|
||||
echo "${TOTAL}, "
|
||||
|
||||
let STEP=${STEP}+1
|
||||
done
|
||||
}
|
||||
|
||||
create_table_mbs() {
|
||||
local FIELD=$1
|
||||
local TIME=$2
|
||||
local ROW_M=()
|
||||
local ROW_N=()
|
||||
local HEADER=1
|
||||
local STEP=1
|
||||
|
||||
for DISK_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/disk-[0-9]*`; do
|
||||
ROW_M=( ${ROW_N[@]} )
|
||||
ROW_N=( `cat ${DISK_FILE} | grep sd | cut -c11- | cut -f${FIELD} -d' ' | tr "\n" "\t"` )
|
||||
|
||||
if [ $HEADER -eq 1 ]; then
|
||||
echo -n "step, "
|
||||
cat ${DISK_FILE} | grep sd | cut -c11- | cut -f1 -d' ' | tr "\n" ", "
|
||||
echo "total"
|
||||
HEADER=0
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -eq 0 ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
|
||||
echo "Badly formatted profile data in ${DISK_FILE}"
|
||||
break
|
||||
fi
|
||||
|
||||
TOTAL=0
|
||||
echo -n "${STEP}, "
|
||||
for (( i=0; i<${#ROW_N[@]}; i++ )); do
|
||||
DELTA=`echo "${ROW_N[${i}]}-${ROW_M[${i}]}" | bc`
|
||||
MBS=`echo "scale=2; ((${DELTA}*512)/${TIME})/(1024*1024)" | bc`
|
||||
TOTAL=`echo "scale=2; ${TOTAL}+${MBS}" | bc`
|
||||
echo -n "${MBS}, "
|
||||
done
|
||||
echo "${TOTAL}, "
|
||||
|
||||
let STEP=${STEP}+1
|
||||
done
|
||||
}
|
||||
|
||||
echo
|
||||
echo "Reads issued per device"
|
||||
create_table 2
|
||||
echo
|
||||
echo "Reads merged per device"
|
||||
create_table 3
|
||||
echo
|
||||
echo "Sectors read per device"
|
||||
create_table 4
|
||||
echo "MB/s per device"
|
||||
create_table_mbs 4 3
|
||||
|
||||
echo
|
||||
echo "Writes issued per device"
|
||||
create_table 6
|
||||
echo
|
||||
echo "Writes merged per device"
|
||||
create_table 7
|
||||
echo
|
||||
echo "Sectors written per device"
|
||||
create_table 8
|
||||
echo "MB/s per device"
|
||||
create_table_mbs 8 3
|
||||
|
||||
exit 0
|
||||
@@ -1,131 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROG=zpios-profile-pids.sh
|
||||
|
||||
RUN_PIDS=${0}
|
||||
RUN_LOG_DIR=${1}
|
||||
RUN_ID=${2}
|
||||
|
||||
ROW_M=()
|
||||
ROW_N=()
|
||||
ROW_N_SCHED=()
|
||||
ROW_N_WAIT=()
|
||||
|
||||
HEADER=1
|
||||
STEP=1
|
||||
|
||||
for PID_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/pids-[0-9]*`; do
|
||||
ROW_M=( ${ROW_N[@]} )
|
||||
ROW_N=( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
|
||||
ROW_N_SCHED=( `cat ${PID_FILE} | cut -f15 -d' ' | tr "\n" "\t"` )
|
||||
ROW_N_WAIT=( `cat ${PID_FILE} | cut -f17 -d' ' | tr "\n" "\t"` )
|
||||
ROW_N_NAMES=( `cat ${PID_FILE} | cut -f2 -d' ' | cut -f2 -d'(' |
|
||||
cut -f1 -d')' | cut -f1 -d'/' | tr "\n" "\t"` )
|
||||
|
||||
for (( i=0; i<${#ROW_N_SCHED[@]}; i++ )); do
|
||||
SUM=`echo "${ROW_N_WAIT[${i}]}+${ROW_N_SCHED[${i}]}" | bc`
|
||||
|
||||
case ${ROW_N_NAMES[${i}]} in
|
||||
zio_taskq) IDX=0;;
|
||||
zio_req_nul) IDX=1;;
|
||||
zio_irq_nul) IDX=2;;
|
||||
zio_req_rd) IDX=3;;
|
||||
zio_irq_rd) IDX=4;;
|
||||
zio_req_wr) IDX=5;;
|
||||
zio_irq_wr) IDX=6;;
|
||||
zio_req_fr) IDX=7;;
|
||||
zio_irq_fr) IDX=8;;
|
||||
zio_req_cm) IDX=9;;
|
||||
zio_irq_cm) IDX=10;;
|
||||
zio_req_ctl) IDX=11;;
|
||||
zio_irq_ctl) IDX=12;;
|
||||
txg_quiesce) IDX=13;;
|
||||
txg_sync) IDX=14;;
|
||||
txg_timelimit) IDX=15;;
|
||||
arc_reclaim) IDX=16;;
|
||||
l2arc_feed) IDX=17;;
|
||||
zpios_io) IDX=18;;
|
||||
*) continue;;
|
||||
esac
|
||||
|
||||
let ROW_N[${IDX}]=${ROW_N[${IDX}]}+${SUM}
|
||||
done
|
||||
|
||||
if [ $HEADER -eq 1 ]; then
|
||||
echo "step, zio_taskq, zio_req_nul, zio_irq_nul, " \
|
||||
"zio_req_rd, zio_irq_rd, zio_req_wr, zio_irq_wr, " \
|
||||
"zio_req_fr, zio_irq_fr, zio_req_cm, zio_irq_cm, " \
|
||||
"zio_req_ctl, zio_irq_ctl, txg_quiesce, txg_sync, " \
|
||||
"txg_timelimit, arc_reclaim, l2arc_feed, zpios_io, " \
|
||||
"idle"
|
||||
HEADER=0
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -eq 0 ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
|
||||
echo "Badly formatted profile data in ${PID_FILE}"
|
||||
break
|
||||
fi
|
||||
|
||||
# Original values are in jiffies and we expect HZ to be 1000
|
||||
# on most 2.6 systems thus we divide by 10 to get a percentage.
|
||||
IDLE=1000
|
||||
echo -n "${STEP}, "
|
||||
for (( i=0; i<${#ROW_N[@]}; i++ )); do
|
||||
DELTA=`echo "${ROW_N[${i}]}-${ROW_M[${i}]}" | bc`
|
||||
DELTA_PERCENT=`echo "scale=1; ${DELTA}/10" | bc`
|
||||
let IDLE=${IDLE}-${DELTA}
|
||||
echo -n "${DELTA_PERCENT}, "
|
||||
done
|
||||
ILDE_PERCENT=`echo "scale=1; ${IDLE}/10" | bc`
|
||||
echo "${ILDE_PERCENT}"
|
||||
|
||||
let STEP=${STEP}+1
|
||||
done
|
||||
|
||||
exit
|
||||
|
||||
echo
|
||||
echo "Percent of total system time per pid"
|
||||
for PID_FILE in `ls -r --sort=time --time=ctime ${RUN_LOG_DIR}/${RUN_ID}/pids-[0-9]*`; do
|
||||
ROW_M=( ${ROW_N[@]} )
|
||||
ROW_N_SCHED=( `cat ${PID_FILE} | cut -f15 -d' ' | tr "\n" "\t"` )
|
||||
ROW_N_WAIT=( `cat ${PID_FILE} | cut -f17 -d' ' | tr "\n" "\t"` )
|
||||
|
||||
for (( i=0; i<${#ROW_N_SCHED[@]}; i++ )); do
|
||||
ROW_N[${i}]=`echo "${ROW_N_WAIT[${i}]}+${ROW_N_SCHED[${i}]}" | bc`
|
||||
done
|
||||
|
||||
if [ $HEADER -eq 1 ]; then
|
||||
echo -n "step, "
|
||||
cat ${PID_FILE} | cut -f2 -d' ' | tr "\n" ", "
|
||||
echo
|
||||
HEADER=0
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -eq 0 ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ ${#ROW_M[@]} -ne ${#ROW_N[@]} ]; then
|
||||
echo "Badly formatted profile data in ${PID_FILE}"
|
||||
break
|
||||
fi
|
||||
|
||||
# Original values are in jiffies and we expect HZ to be 1000
|
||||
# on most 2.6 systems thus we divide by 10 to get a percentage.
|
||||
echo -n "${STEP}, "
|
||||
for (( i=0; i<${#ROW_N[@]}; i++ )); do
|
||||
DELTA=`echo "scale=1; (${ROW_N[${i}]}-${ROW_M[${i}]})/10" | bc`
|
||||
echo -n "${DELTA}, "
|
||||
done
|
||||
|
||||
echo
|
||||
let STEP=${STEP}+1
|
||||
done
|
||||
|
||||
|
||||
exit 0
|
||||
@@ -1,129 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROG=zpios-profile-post.sh
|
||||
|
||||
RUN_POST=${0}
|
||||
RUN_PHASE=${1}
|
||||
RUN_DIR=${2}
|
||||
RUN_ID=${3}
|
||||
RUN_POOL=${4}
|
||||
RUN_CHUNK_SIZE=${5}
|
||||
RUN_REGION_SIZE=${6}
|
||||
RUN_THRD_COUNT=${7}
|
||||
RUN_REGION_COUNT=${8}
|
||||
RUN_OFFSET=${9}
|
||||
RUN_REGION_NOISE=${10}
|
||||
RUN_CHUNK_NOISE=${11}
|
||||
RUN_THRD_DELAY=${12}
|
||||
RUN_FLAGS=${13}
|
||||
RUN_RESULT=${14}
|
||||
|
||||
# Summarize system time per process
|
||||
zpios_profile_post_pids() {
|
||||
${PROFILE_PIDS} ${PROFILE_RUN_CR_PIDS_LOG} >${PROFILE_RUN_CR_PIDS_CSV}
|
||||
${PROFILE_PIDS} ${PROFILE_RUN_WR_PIDS_LOG} >${PROFILE_RUN_WR_PIDS_CSV}
|
||||
${PROFILE_PIDS} ${PROFILE_RUN_RD_PIDS_LOG} >${PROFILE_RUN_RD_PIDS_CSV}
|
||||
${PROFILE_PIDS} ${PROFILE_RUN_RM_PIDS_LOG} >${PROFILE_RUN_RM_PIDS_CSV}
|
||||
}
|
||||
|
||||
zpios_profile_post_disk() {
|
||||
${PROFILE_DISK} ${PROFILE_RUN_CR_DISK_LOG} >${PROFILE_RUN_CR_DISK_CSV}
|
||||
${PROFILE_DISK} ${PROFILE_RUN_WR_DISK_LOG} >${PROFILE_RUN_WR_DISK_CSV}
|
||||
${PROFILE_DISK} ${PROFILE_RUN_RD_DISK_LOG} >${PROFILE_RUN_RD_DISK_CSV}
|
||||
${PROFILE_DISK} ${PROFILE_RUN_RM_DISK_LOG} >${PROFILE_RUN_RM_DISK_CSV}
|
||||
}
|
||||
|
||||
# Summarize per device performance
|
||||
|
||||
# Stop a user defined profiling script which is gathering additional data
|
||||
zpios_profile_post_stop() {
|
||||
local PROFILE_PID=$1
|
||||
|
||||
kill -s SIGHUP `cat ${PROFILE_PID}`
|
||||
|
||||
|
||||
# Sleep waiting for profile script to exit
|
||||
while [ -f ${PROFILE_PID} ]; do
|
||||
sleep 0.01
|
||||
done
|
||||
}
|
||||
|
||||
zpios_profile_post_proc_stop() {
|
||||
local PROC_DIR=$1
|
||||
|
||||
if [ -f ${PROFILE_ARC_PROC} ]; then
|
||||
cat ${PROFILE_ARC_PROC} >${PROC_DIR}/arcstats.txt
|
||||
fi
|
||||
|
||||
if [ -f ${PROFILE_VDEV_CACHE_PROC} ]; then
|
||||
cat ${PROFILE_VDEV_CACHE_PROC} >${PROC_DIR}/vdev_cache_stats.txt
|
||||
fi
|
||||
}
|
||||
|
||||
zpios_profile_post_oprofile_stop() {
|
||||
local OPROFILE_LOG=$1
|
||||
local OPROFILE_ARGS="-a -g -l -p ${OPROFILE_KERNEL_DIR},${OPROFILE_SPL_DIR},${OPROFILE_ZFS_DIR}"
|
||||
|
||||
/usr/bin/opcontrol --stop >>${OPROFILE_LOG} 2>&1
|
||||
/usr/bin/opcontrol --dump >>${OPROFILE_LOG} 2>&1
|
||||
/usr/bin/opreport ${OPROFILE_ARGS} >${OPROFILE_LOG} 2>&1
|
||||
/usr/bin/oparchive
|
||||
}
|
||||
|
||||
zpios_profile_post_create() {
|
||||
zpios_profile_post_oprofile_stop ${PROFILE_RUN_CR_OPROFILE_LOG}
|
||||
zpios_profile_post_proc_stop ${PROFILE_RUN_CR_DIR}
|
||||
zpios_profile_post_stop ${PROFILE_RUN_CR_PID}
|
||||
}
|
||||
|
||||
zpios_profile_post_write() {
|
||||
zpios_profile_post_oprofile_stop ${PROFILE_RUN_WR_OPROFILE_LOG}
|
||||
zpios_profile_post_proc_stop ${PROFILE_RUN_WR_DIR}
|
||||
zpios_profile_post_stop ${PROFILE_RUN_WR_PID}
|
||||
}
|
||||
|
||||
zpios_profile_post_read() {
|
||||
zpios_profile_post_oprofile_stop ${PROFILE_RUN_CR_RD_LOG}
|
||||
zpios_profile_post_proc_stop ${PROFILE_RUN_RD_DIR}
|
||||
zpios_profile_post_stop ${PROFILE_RUN_RD_PID}
|
||||
}
|
||||
|
||||
zpios_profile_post_remove() {
|
||||
zpios_profile_post_oprofile_stop ${PROFILE_RUN_RM_OPROFILE_LOG}
|
||||
zpios_profile_post_proc_stop ${PROFILE_RUN_RM_DIR}
|
||||
zpios_profile_post_stop ${PROFILE_RUN_RM_PID}
|
||||
}
|
||||
|
||||
# Source global zpios test configuration
|
||||
if [ -f ${RUN_DIR}/zpios-config.sh ]; then
|
||||
. ${RUN_DIR}/zpios-config.sh
|
||||
fi
|
||||
|
||||
# Source global per-run test configuration
|
||||
if [ -f ${RUN_DIR}/${RUN_ID}/zpios-config-run.sh ]; then
|
||||
. ${RUN_DIR}/${RUN_ID}/zpios-config-run.sh
|
||||
fi
|
||||
|
||||
case "${RUN_PHASE}" in
|
||||
post-run)
|
||||
zpios_profile_post_pids
|
||||
zpios_profile_post_disk
|
||||
;;
|
||||
post-create)
|
||||
zpios_profile_post_create
|
||||
;;
|
||||
post-write)
|
||||
zpios_profile_post_write
|
||||
;;
|
||||
post-read)
|
||||
zpios_profile_post_read
|
||||
;;
|
||||
post-remove)
|
||||
zpios_profile_post_remove
|
||||
;;
|
||||
*)
|
||||
echo "Usage: ${PROG} {post-run|post-create|post-write|post-read|post-remove}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
exit 0
|
||||
@@ -1,184 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROG=zpios-profile-pre.sh
|
||||
|
||||
PROFILE_RDY=0
|
||||
trap "PROFILE_RDY=1" SIGHUP
|
||||
|
||||
RUN_PRE=${0}
|
||||
RUN_PHASE=${1}
|
||||
RUN_DIR=${2}
|
||||
RUN_ID=${3}
|
||||
RUN_POOL=${4}
|
||||
RUN_CHUNK_SIZE=${5}
|
||||
RUN_REGION_SIZE=${6}
|
||||
RUN_THRD_COUNT=${7}
|
||||
RUN_REGION_COUNT=${8}
|
||||
RUN_OFFSET=${9}
|
||||
RUN_REGION_NOISE=${10}
|
||||
RUN_CHUNK_NOISE=${11}
|
||||
RUN_THRD_DELAY=${12}
|
||||
RUN_FLAGS=${13}
|
||||
RUN_RESULT=${14}
|
||||
|
||||
zpios_profile_pre_run_cfg() {
|
||||
cat > ${RUN_DIR}/${RUN_ID}/zpios-config-run.sh << EOF
|
||||
#
|
||||
# Zpios Profiling Configuration for Run ${RUN_ID}
|
||||
#
|
||||
|
||||
PROFILE_RUN_DIR=${RUN_DIR}/${RUN_ID}
|
||||
|
||||
PROFILE_RUN_CR_DIR=${RUN_DIR}/${RUN_ID}/create
|
||||
PROFILE_RUN_CR_PID=${RUN_DIR}/${RUN_ID}/create/profile.pid
|
||||
PROFILE_RUN_CR_OPROFILE_LOG=${RUN_DIR}/${RUN_ID}/create/oprofile.txt
|
||||
PROFILE_RUN_CR_PIDS_LOG=${RUN_DIR}/${RUN_ID}/create/pids.txt
|
||||
PROFILE_RUN_CR_PIDS_CSV=${RUN_DIR}/${RUN_ID}/create/pids.csv
|
||||
PROFILE_RUN_CR_DISK_LOG=${RUN_DIR}/${RUN_ID}/create/disk.txt
|
||||
PROFILE_RUN_CR_DISK_CSV=${RUN_DIR}/${RUN_ID}/create/disk.csv
|
||||
|
||||
PROFILE_RUN_WR_DIR=${RUN_DIR}/${RUN_ID}/write
|
||||
PROFILE_RUN_WR_PID=${RUN_DIR}/${RUN_ID}/write/profile.pid
|
||||
PROFILE_RUN_WR_OPROFILE_LOG=${RUN_DIR}/${RUN_ID}/write/oprofile.txt
|
||||
PROFILE_RUN_WR_PIDS_LOG=${RUN_DIR}/${RUN_ID}/write/pids.txt
|
||||
PROFILE_RUN_WR_PIDS_CSV=${RUN_DIR}/${RUN_ID}/write/pids.csv
|
||||
PROFILE_RUN_WR_DISK_LOG=${RUN_DIR}/${RUN_ID}/write/disk.txt
|
||||
PROFILE_RUN_WR_DISK_CSV=${RUN_DIR}/${RUN_ID}/write/disk.csv
|
||||
|
||||
PROFILE_RUN_RD_DIR=${RUN_DIR}/${RUN_ID}/read
|
||||
PROFILE_RUN_RD_PID=${RUN_DIR}/${RUN_ID}/read/profile.pid
|
||||
PROFILE_RUN_RD_OPROFILE_LOG=${RUN_DIR}/${RUN_ID}/read/oprofile.txt
|
||||
PROFILE_RUN_RD_PIDS_LOG=${RUN_DIR}/${RUN_ID}/read/pids.txt
|
||||
PROFILE_RUN_RD_PIDS_CSV=${RUN_DIR}/${RUN_ID}/read/pids.csv
|
||||
PROFILE_RUN_RD_DISK_LOG=${RUN_DIR}/${RUN_ID}/read/disk.txt
|
||||
PROFILE_RUN_RD_DISK_CSV=${RUN_DIR}/${RUN_ID}/read/disk.csv
|
||||
|
||||
PROFILE_RUN_RM_DIR=${RUN_DIR}/${RUN_ID}/remove
|
||||
PROFILE_RUN_RM_PID=${RUN_DIR}/${RUN_ID}/remove/profile.pid
|
||||
PROFILE_RUN_RM_OPROFILE_LOG=${RUN_DIR}/${RUN_ID}/remove/oprofile.txt
|
||||
PROFILE_RUN_RM_PIDS_LOG=${RUN_DIR}/${RUN_ID}/remove/pids.txt
|
||||
PROFILE_RUN_RM_PIDS_CSV=${RUN_DIR}/${RUN_ID}/remove/pids.csv
|
||||
PROFILE_RUN_RM_DISK_LOG=${RUN_DIR}/${RUN_ID}/remove/disk.txt
|
||||
PROFILE_RUN_RM_DISK_CSV=${RUN_DIR}/${RUN_ID}/remove/disk.csv
|
||||
|
||||
# PROFILE_PIDS_LOG=${RUN_DIR}/${RUN_ID}/pids-summary.csv
|
||||
# PROFILE_DISK_LOG=${RUN_DIR}/${RUN_ID}/disk-summary.csv
|
||||
EOF
|
||||
}
|
||||
|
||||
zpios_profile_pre_run_args() {
|
||||
cat > ${RUN_DIR}/${RUN_ID}/zpios-args.txt << EOF
|
||||
#
|
||||
# Zpios Arguments for Run ${RUN_ID}
|
||||
#
|
||||
|
||||
DIR=${RUN_DIR}
|
||||
ID=${RUN_ID}
|
||||
POOL=${RUN_POOL}
|
||||
CHUNK_SIZE=${RUN_CHUNK_SIZE}
|
||||
REGION_SIZE=${RUN_REGION_SIZE}
|
||||
THRD_COUNT=${RUN_THRD_COUNT}
|
||||
REGION_COUNT=${RUN_REGION_COUNT}
|
||||
OFFSET=${RUN_OFFSET}
|
||||
REGION_NOISE=${RUN_REGION_NOISE}
|
||||
CHUNK_NOISE=${RUN_CHUNK_NOISE}
|
||||
THRD_DELAY=${RUN_THRD_DELAY}
|
||||
FLAGS=${RUN_FLAGS}
|
||||
RESULT=${RUN_RESULT}
|
||||
EOF
|
||||
}
|
||||
|
||||
# Spawn a user defined profiling script to gather additional data
|
||||
zpios_profile_pre_start() {
|
||||
local PROFILE_PID=$1
|
||||
|
||||
${PROFILE_USER} ${RUN_PHASE} ${RUN_DIR} ${RUN_ID} &
|
||||
echo "$!" >${PROFILE_PID}
|
||||
|
||||
# Sleep waiting for profile script to be ready, it will
|
||||
# signal us via SIGHUP when it is ready to start profiling.
|
||||
while [ ${PROFILE_RDY} -eq 0 ]; do
|
||||
sleep 0.01
|
||||
done
|
||||
}
|
||||
|
||||
zpios_profile_post_proc_start() {
|
||||
|
||||
if [ -f ${PROFILE_ARC_PROC} ]; then
|
||||
echo 0 >${PROFILE_ARC_PROC}
|
||||
fi
|
||||
|
||||
if [ -f ${PROFILE_VDEV_CACHE_PROC} ]; then
|
||||
echo 0 >${PROFILE_VDEV_CACHE_PROC}
|
||||
fi
|
||||
}
|
||||
|
||||
zpios_profile_pre_oprofile_start() {
|
||||
local OPROFILE_LOG=$1
|
||||
|
||||
/usr/bin/opcontrol --reset >>${OPROFILE_LOG} 2>&1
|
||||
/usr/bin/opcontrol --start >>${OPROFILE_LOG} 2>&1
|
||||
}
|
||||
|
||||
zpios_profile_pre_create() {
|
||||
mkdir ${PROFILE_RUN_CR_DIR}
|
||||
zpios_profile_pre_start ${PROFILE_RUN_CR_PID}
|
||||
zpios_profile_post_proc_start
|
||||
zpios_profile_pre_oprofile_start ${PROFILE_RUN_CR_OPROFILE_LOG}
|
||||
}
|
||||
|
||||
zpios_profile_pre_write() {
|
||||
mkdir ${PROFILE_RUN_WR_DIR}
|
||||
zpios_profile_pre_start ${PROFILE_RUN_WR_PID}
|
||||
zpios_profile_post_proc_start
|
||||
zpios_profile_pre_oprofile_start ${PROFILE_RUN_WR_OPROFILE_LOG}
|
||||
}
|
||||
|
||||
zpios_profile_pre_read() {
|
||||
mkdir ${PROFILE_RUN_RD_DIR}
|
||||
zpios_profile_pre_start ${PROFILE_RUN_RD_PID}
|
||||
zpios_profile_post_proc_start
|
||||
zpios_profile_pre_oprofile_start ${PROFILE_RUN_CR_RD_LOG}
|
||||
}
|
||||
|
||||
zpios_profile_pre_remove() {
|
||||
mkdir ${PROFILE_RUN_RM_DIR}
|
||||
zpios_profile_pre_start ${PROFILE_RUN_RM_PID}
|
||||
zpios_profile_post_proc_start
|
||||
zpios_profile_pre_oprofile_start ${PROFILE_RUN_RM_OPROFILE_LOG}
|
||||
}
|
||||
|
||||
# Source global zpios test configuration
|
||||
if [ -f ${RUN_DIR}/zpios-config.sh ]; then
|
||||
. ${RUN_DIR}/zpios-config.sh
|
||||
fi
|
||||
|
||||
# Source global per-run test configuration
|
||||
if [ -f ${RUN_DIR}/${RUN_ID}/zpios-config-run.sh ]; then
|
||||
. ${RUN_DIR}/${RUN_ID}/zpios-config-run.sh
|
||||
fi
|
||||
|
||||
case "${RUN_PHASE}" in
|
||||
pre-run)
|
||||
mkdir -p ${RUN_DIR}/${RUN_ID}/
|
||||
zpios_profile_pre_run_cfg
|
||||
zpios_profile_pre_run_args
|
||||
;;
|
||||
pre-create)
|
||||
zpios_profile_pre_create
|
||||
;;
|
||||
pre-write)
|
||||
zpios_profile_pre_write
|
||||
;;
|
||||
pre-read)
|
||||
zpios_profile_pre_read
|
||||
;;
|
||||
pre-remove)
|
||||
zpios_profile_pre_remove
|
||||
;;
|
||||
*)
|
||||
echo "Usage: ${PROG} {pre-run|pre-create|pre-write|pre-read|pre-remove}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
exit 0
|
||||
@@ -1,226 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
PROG=zpios-profile.sh
|
||||
|
||||
trap "RUN_DONE=1" SIGHUP
|
||||
|
||||
RUN_PHASE=${1}
|
||||
RUN_LOG_DIR=${2}
|
||||
RUN_ID=${3}
|
||||
RUN_DONE=0
|
||||
|
||||
POLL_INTERVAL=2.99
|
||||
|
||||
# Log these pids, the exact pid numbers will vary from system to system
|
||||
# so I harvest pid for all the following type of processes from /proc/<pid>/
|
||||
#
|
||||
# zio_taskq/#
|
||||
# spa_zio_issue/#
|
||||
# spa_zio_intr/#
|
||||
# txg_quiesce_thr
|
||||
# txg_sync_thread
|
||||
# txg_timelimit_t
|
||||
# arc_reclaim_thr
|
||||
# l2arc_feed_thre
|
||||
# zpios_io/#
|
||||
|
||||
ZIO_TASKQ_PIDS=()
|
||||
ZIO_REQ_NUL_PIDS=()
|
||||
ZIO_IRQ_NUL_PIDS=()
|
||||
ZIO_REQ_RD_PIDS=()
|
||||
ZIO_IRQ_RD_PIDS=()
|
||||
ZIO_REQ_WR_PIDS=()
|
||||
ZIO_IRQ_WR_PIDS=()
|
||||
ZIO_REQ_FR_PIDS=()
|
||||
ZIO_IRQ_FR_PIDS=()
|
||||
ZIO_REQ_CM_PIDS=()
|
||||
ZIO_IRQ_CM_PIDS=()
|
||||
ZIO_REQ_CTL_PIDS=()
|
||||
ZIO_IRQ_CTL_PIDS=()
|
||||
|
||||
TXG_QUIESCE_PIDS=()
|
||||
TXG_SYNC_PIDS=()
|
||||
TXG_TIMELIMIT_PIDS=()
|
||||
|
||||
ARC_RECLAIM_PIDS=()
|
||||
L2ARC_FEED_PIDS=()
|
||||
|
||||
ZPIOS_IO_PIDS=()
|
||||
|
||||
show_pids() {
|
||||
echo "* zio_taskq: { ${ZIO_TASKQ_PIDS[@]} } = ${#ZIO_TASKQ_PIDS[@]}"
|
||||
echo "* zio_req_nul: { ${ZIO_REQ_NUL_PIDS[@]} } = ${#ZIO_REQ_NUL_PIDS[@]}"
|
||||
echo "* zio_irq_nul: { ${ZIO_IRQ_NUL_PIDS[@]} } = ${#ZIO_IRQ_NUL_PIDS[@]}"
|
||||
echo "* zio_req_rd: { ${ZIO_REQ_RD_PIDS[@]} } = ${#ZIO_REQ_RD_PIDS[@]}"
|
||||
echo "* zio_irq_rd: { ${ZIO_IRQ_RD_PIDS[@]} } = ${#ZIO_IRQ_RD_PIDS[@]}"
|
||||
echo "* zio_req_wr: { ${ZIO_REQ_WR_PIDS[@]} } = ${#ZIO_REQ_WR_PIDS[@]}"
|
||||
echo "* zio_irq_wr: { ${ZIO_IRQ_WR_PIDS[@]} } = ${#ZIO_IRQ_WR_PIDS[@]}"
|
||||
echo "* zio_req_fr: { ${ZIO_REQ_FR_PIDS[@]} } = ${#ZIO_REQ_FR_PIDS[@]}"
|
||||
echo "* zio_irq_fr: { ${ZIO_IRQ_FR_PIDS[@]} } = ${#ZIO_IRQ_FR_PIDS[@]}"
|
||||
echo "* zio_req_cm: { ${ZIO_REQ_CM_PIDS[@]} } = ${#ZIO_REQ_CM_PIDS[@]}"
|
||||
echo "* zio_irq_cm: { ${ZIO_IRQ_CM_PIDS[@]} } = ${#ZIO_IRQ_CM_PIDS[@]}"
|
||||
echo "* zio_req_ctl: { ${ZIO_REQ_CTL_PIDS[@]} } = ${#ZIO_REQ_CTL_PIDS[@]}"
|
||||
echo "* zio_irq_ctl: { ${ZIO_IRQ_CTL_PIDS[@]} } = ${#ZIO_IRQ_CTL_PIDS[@]}"
|
||||
echo "* txg_quiesce: { ${TXG_QUIESCE_PIDS[@]} } = ${#TXG_QUIESCE_PIDS[@]}"
|
||||
echo "* txg_sync: { ${TXG_SYNC_PIDS[@]} } = ${#TXG_SYNC_PIDS[@]}"
|
||||
echo "* txg_timelimit: { ${TXG_TIMELIMIT_PIDS[@]} } = ${#TXG_TIMELIMIT_PIDS[@]}"
|
||||
echo "* arc_reclaim: { ${ARC_RECLAIM_PIDS[@]} } = ${#ARC_RECLAIM_PIDS[@]}"
|
||||
echo "* l2arc_feed: { ${L2ARC_FEED_PIDS[@]} } = ${#L2ARC_FEED_PIDS[@]}"
|
||||
echo "* zpios_io: { ${ZPIOS_IO_PIDS[@]} } = ${#ZPIOS_IO_PIDS[@]}"
|
||||
}
|
||||
|
||||
check_pid() {
|
||||
local PID=$1
|
||||
local NAME=$2
|
||||
local TYPE=$3
|
||||
local PIDS=( "$4" )
|
||||
local NAME_STRING=`echo ${NAME} | cut -f1 -d'/'`
|
||||
local NAME_NUMBER=`echo ${NAME} | cut -f2 -d'/'`
|
||||
|
||||
if [ "${NAME_STRING}" == "${TYPE}" ]; then
|
||||
if [ -n "${NAME_NUMBER}" ]; then
|
||||
PIDS[${NAME_NUMBER}]=${PID}
|
||||
else
|
||||
PIDS[${#PIDS[@]}]=${PID}
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "${PIDS[@]}"
|
||||
}
|
||||
|
||||
# NOTE: This whole process is crazy slow but it will do for now
|
||||
acquire_pids() {
|
||||
echo "--- Aquiring ZFS pids ---"
|
||||
|
||||
for PID in `ls /proc/ | grep [0-9] | sort -n -u`; do
|
||||
if [ ! -e /proc/${PID}/status ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
NAME=`cat /proc/${PID}/status | head -n1 | cut -f2`
|
||||
|
||||
ZIO_TASKQ_PIDS=( `check_pid ${PID} ${NAME} "zio_taskq" \
|
||||
"$(echo "${ZIO_TASKQ_PIDS[@]}")"` )
|
||||
|
||||
ZIO_REQ_NUL_PIDS=( `check_pid ${PID} ${NAME} "zio_req_nul" \
|
||||
"$(echo "${ZIO_REQ_NUL_PIDS[@]}")"` )
|
||||
|
||||
ZIO_IRQ_NUL_PIDS=( `check_pid ${PID} ${NAME} "zio_irq_nul" \
|
||||
"$(echo "${ZIO_IRQ_NUL_PIDS[@]}")"` )
|
||||
|
||||
ZIO_REQ_RD_PIDS=( `check_pid ${PID} ${NAME} "zio_req_rd" \
|
||||
"$(echo "${ZIO_REQ_RD_PIDS[@]}")"` )
|
||||
|
||||
ZIO_IRQ_RD_PIDS=( `check_pid ${PID} ${NAME} "zio_irq_rd" \
|
||||
"$(echo "${ZIO_IRQ_RD_PIDS[@]}")"` )
|
||||
|
||||
ZIO_REQ_WR_PIDS=( `check_pid ${PID} ${NAME} "zio_req_wr" \
|
||||
"$(echo "${ZIO_REQ_WR_PIDS[@]}")"` )
|
||||
|
||||
ZIO_IRQ_WR_PIDS=( `check_pid ${PID} ${NAME} "zio_irq_wr" \
|
||||
"$(echo "${ZIO_IRQ_WR_PIDS[@]}")"` )
|
||||
|
||||
ZIO_REQ_FR_PIDS=( `check_pid ${PID} ${NAME} "zio_req_fr" \
|
||||
"$(echo "${ZIO_REQ_FR_PIDS[@]}")"` )
|
||||
|
||||
ZIO_IRQ_FR_PIDS=( `check_pid ${PID} ${NAME} "zio_irq_fr" \
|
||||
"$(echo "${ZIO_IRQ_FR_PIDS[@]}")"` )
|
||||
|
||||
ZIO_REQ_CM_PIDS=( `check_pid ${PID} ${NAME} "zio_req_cm" \
|
||||
"$(echo "${ZIO_REQ_CM_PIDS[@]}")"` )
|
||||
|
||||
ZIO_IRQ_CM_PIDS=( `check_pid ${PID} ${NAME} "zio_irq_cm" \
|
||||
"$(echo "${ZIO_IRQ_CM_PIDS[@]}")"` )
|
||||
|
||||
ZIO_REQ_CTL_PIDS=( `check_pid ${PID} ${NAME} "zio_req_ctl" \
|
||||
"$(echo "${ZIO_REQ_CTL_PIDS[@]}")"` )
|
||||
|
||||
ZIO_IRQ_CTL_PIDS=( `check_pid ${PID} ${NAME} "zio_irq_ctl" \
|
||||
"$(echo "${ZIO_IRQ_CTL_PIDS[@]}")"` )
|
||||
|
||||
TXG_QUIESCE_PIDS=( `check_pid ${PID} ${NAME} "txg_quiesce" \
|
||||
"$(echo "${TXG_QUIESCE_PIDS[@]}")"` )
|
||||
|
||||
TXG_SYNC_PIDS=( `check_pid ${PID} ${NAME} "txg_sync" \
|
||||
"$(echo "${TXG_SYNC_PIDS[@]}")"` )
|
||||
|
||||
TXG_TIMELIMIT_PIDS=( `check_pid ${PID} ${NAME} "txg_timelimit" \
|
||||
"$(echo "${TXG_TIMELIMIT_PIDS[@]}")"` )
|
||||
|
||||
ARC_RECLAIM_PIDS=( `check_pid ${PID} ${NAME} "arc_reclaim" \
|
||||
"$(echo "${ARC_RECLAIM_PIDS[@]}")"` )
|
||||
|
||||
L2ARC_FEED_PIDS=( `check_pid ${PID} ${NAME} "l2arc_feed" \
|
||||
"$(echo "${L2ARC_FEED_PIDS[@]}")"` )
|
||||
done
|
||||
|
||||
# Wait for zpios_io threads to start
|
||||
kill -s SIGHUP ${PPID}
|
||||
echo "* Waiting for zpios_io threads to start"
|
||||
while [ ${RUN_DONE} -eq 0 ]; do
|
||||
ZPIOS_IO_PIDS=( `ps ax | grep zpios_io | grep -v grep | \
|
||||
sed 's/^ *//g' | cut -f1 -d' '` )
|
||||
if [ ${#ZPIOS_IO_PIDS[@]} -gt 0 ]; then
|
||||
break;
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
echo "`show_pids`" >${RUN_LOG_DIR}/${RUN_ID}/pids.txt
|
||||
}
|
||||
|
||||
log_pids() {
|
||||
echo "--- Logging ZFS profile to ${RUN_LOG_DIR}/${RUN_ID}/ ---"
|
||||
ALL_PIDS=( ${ZIO_TASKQ_PIDS[@]} \
|
||||
${ZIO_REQ_NUL_PIDS[@]} \
|
||||
${ZIO_IRQ_NUL_PIDS[@]} \
|
||||
${ZIO_REQ_RD_PID[@]} \
|
||||
${ZIO_IRQ_RD_PIDS[@]} \
|
||||
${ZIO_REQ_WR_PIDS[@]} \
|
||||
${ZIO_IRQ_WR_PIDS[@]} \
|
||||
${ZIO_REQ_FR_PIDS[@]} \
|
||||
${ZIO_IRQ_FR_PIDS[@]} \
|
||||
${ZIO_REQ_CM_PIDS[@]} \
|
||||
${ZIO_IRQ_CM_PIDS[@]} \
|
||||
${ZIO_REQ_CTL_PIDS[@]} \
|
||||
${ZIO_IRQ_CTL_PIDS[@]} \
|
||||
${TXG_QUIESCE_PIDS[@]} \
|
||||
${TXG_SYNC_PIDS[@]} \
|
||||
${TXG_TIMELIMIT_PIDS[@]} \
|
||||
${ARC_RECLAIM_PIDS[@]} \
|
||||
${L2ARC_FEED_PIDS[@]} \
|
||||
${ZPIOS_IO_PIDS[@]} )
|
||||
|
||||
while [ ${RUN_DONE} -eq 0 ]; do
|
||||
NOW=`date +%s.%N`
|
||||
LOG_PIDS="${RUN_LOG_DIR}/${RUN_ID}/pids-${NOW}"
|
||||
LOG_DISK="${RUN_LOG_DIR}/${RUN_ID}/disk-${NOW}"
|
||||
|
||||
for PID in "${ALL_PIDS[@]}"; do
|
||||
if [ -z ${PID} ]; then
|
||||
continue;
|
||||
fi
|
||||
|
||||
if [ -e /proc/${PID}/stat ]; then
|
||||
cat /proc/${PID}/stat | head -n1 >>${LOG_PIDS}
|
||||
else
|
||||
echo "<${PID} exited>" >>${LOG_PIDS}
|
||||
fi
|
||||
done
|
||||
|
||||
cat /proc/diskstats >${LOG_DISK}
|
||||
|
||||
NOW2=`date +%s.%N`
|
||||
DELTA=`echo "${POLL_INTERVAL}-(${NOW2}-${NOW})" | bc`
|
||||
sleep ${DELTA}
|
||||
done
|
||||
}
|
||||
|
||||
acquire_pids
|
||||
log_pids
|
||||
|
||||
# rm ${PROFILE_PID}
|
||||
|
||||
exit 0
|
||||
@@ -1,171 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ZFS/ZPOOL configuration test script.
|
||||
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zpios-sanity.sh
|
||||
HEADER=
|
||||
FAILS=0
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
$0 [hvxfc]
|
||||
|
||||
DESCRIPTION:
|
||||
ZPIOS sanity tests
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-x Destructive hd/sd/md/dm/ram tests
|
||||
-f Don't prompt due to -x
|
||||
-c Cleanup lo+file devices at start
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
while getopts 'hvxfc?' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
;;
|
||||
x)
|
||||
DANGEROUS=1
|
||||
;;
|
||||
f)
|
||||
FORCE=1
|
||||
;;
|
||||
c)
|
||||
CLEANUP=1
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
fi
|
||||
|
||||
# Initialize the test suite
|
||||
init
|
||||
|
||||
# Perform pre-cleanup is requested
|
||||
if [ ${CLEANUP} ]; then
|
||||
${ZFS_SH} -u
|
||||
cleanup_md_devices
|
||||
cleanup_loop_devices
|
||||
rm -f /tmp/zpool.cache.*
|
||||
fi
|
||||
|
||||
zpios_test() {
|
||||
CONFIG=$1
|
||||
TEST=$2
|
||||
LOG=`mktemp`
|
||||
|
||||
${ZPIOS_SH} -f -c ${CONFIG} -t ${TEST} &>${LOG}
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILS=1
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
printf "FAIL: %-13s\n" ${CONFIG}
|
||||
cat ${LOG}
|
||||
else
|
||||
if [ ! ${HEADER} ]; then
|
||||
head -2 ${LOG}
|
||||
HEADER=1
|
||||
fi
|
||||
|
||||
printf "FAIL: %-13s" ${CONFIG}
|
||||
tail -1 ${LOG}
|
||||
fi
|
||||
else
|
||||
if [ ${VERBOSE} ]; then
|
||||
cat ${LOG}
|
||||
else
|
||||
if [ ! ${HEADER} ]; then
|
||||
head -2 ${LOG}
|
||||
HEADER=1
|
||||
fi
|
||||
|
||||
tail -1 ${LOG}
|
||||
fi
|
||||
fi
|
||||
|
||||
rm -f ${LOG}
|
||||
}
|
||||
|
||||
if [ ${DANGEROUS} ] && [ ! ${FORCE} ]; then
|
||||
cat << EOF
|
||||
The -x option was passed which will result in UNRECOVERABLE DATA LOSS
|
||||
on on the following block devices:
|
||||
|
||||
/dev/sd[abcd]
|
||||
/dev/hda
|
||||
/dev/ram0
|
||||
/dev/md0
|
||||
/dev/dm-0
|
||||
|
||||
To continue please confirm by entering YES:
|
||||
EOF
|
||||
read CONFIRM
|
||||
if [ ${CONFIRM} != "YES" ] && [ ${CONFIRM} != "yes" ]; then
|
||||
exit 0;
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# These configurations are all safe and pose no risk to any data on
|
||||
# the system which runs them. They will confine all their IO to a
|
||||
# file in /tmp or a loopback device configured to use a file in /tmp.
|
||||
#
|
||||
SAFE_CONFIGS=( \
|
||||
file-raid0 file-raid10 file-raidz file-raidz2 \
|
||||
lo-raid0 lo-raid10 lo-raidz lo-raidz2 \
|
||||
)
|
||||
|
||||
#
|
||||
# These configurations are down right dangerous. They will attempt
|
||||
# to use various real block devices on your system which may contain
|
||||
# data you car about. You are STRONGLY advised not to run this unless
|
||||
# you are certain there is no data on the system you care about.
|
||||
#
|
||||
DANGEROUS_CONFIGS=( \
|
||||
hda-raid0 \
|
||||
sda-raid0 \
|
||||
ram0-raid0 \
|
||||
md0-raid10 md0-raid5 \
|
||||
dm0-raid0 \
|
||||
)
|
||||
|
||||
TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || die "Unable to load modules"
|
||||
|
||||
for CONFIG in ${SAFE_CONFIGS[*]}; do
|
||||
zpios_test $CONFIG tiny
|
||||
done
|
||||
|
||||
if [ ${DANGEROUS} ]; then
|
||||
for CONFIG in ${DANGEROUS_CONFIGS[*]}; do
|
||||
zpios_test $CONFIG tiny
|
||||
done
|
||||
fi
|
||||
|
||||
${ZFS_SH} -u
|
||||
|
||||
exit $FAILS
|
||||
@@ -1,187 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Wrapper script for easily running a survey of zpios based tests
|
||||
#
|
||||
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zpios-survey.sh
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
$0 [hvp] <-c config> <-t test>
|
||||
|
||||
DESCRIPTION:
|
||||
Helper script for easy zpios survey benchmarking.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-p Enable profiling
|
||||
-c Zpool configuration
|
||||
-t Zpios test
|
||||
-l Zpios survey log
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
print_header() {
|
||||
tee -a ${ZPIOS_SURVEY_LOG} << EOF
|
||||
|
||||
================================================================
|
||||
Test: $1
|
||||
EOF
|
||||
}
|
||||
|
||||
# Baseline performance for an out of the box config with no manual tuning.
|
||||
# Ideally, we want everything to be automatically tuned for your system and
|
||||
# for this to perform reasonably well.
|
||||
zpios_survey_base() {
|
||||
TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+baseline"
|
||||
print_header ${TEST_NAME}
|
||||
|
||||
${ZFS_SH} ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZFS_SH} -u ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
}
|
||||
|
||||
# Disable ZFS's prefetching. For some reason still not clear to me
|
||||
# current prefetching policy is quite bad for a random workload.
|
||||
# Allowing the algorithm to detect a random workload and not do
|
||||
# anything may be the way to address this issue.
|
||||
zpios_survey_prefetch() {
|
||||
TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+prefetch"
|
||||
print_header ${TEST_NAME}
|
||||
|
||||
${ZFS_SH} ${VERBOSE_FLAG} \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \
|
||||
-o "--noprefetch" | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZFS_SH} -u ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
}
|
||||
|
||||
# Simulating a zerocopy IO path should improve performance by freeing up
|
||||
# lots of CPU which is wasted move data between buffers.
|
||||
zpios_survey_zerocopy() {
|
||||
TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+zerocopy"
|
||||
print_header ${TEST_NAME}
|
||||
|
||||
${ZFS_SH} ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \
|
||||
-o "--zerocopy" | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZFS_SH} -u ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
}
|
||||
|
||||
# Disabling checksumming should show some (if small) improvement
|
||||
# simply due to freeing up a modest amount of CPU.
|
||||
zpios_survey_checksum() {
|
||||
TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+checksum"
|
||||
print_header ${TEST_NAME}
|
||||
|
||||
${ZFS_SH} ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \
|
||||
-s "set checksum=off" | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZFS_SH} -u ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
}
|
||||
|
||||
# Increasing the pending IO depth also seems to improve things likely
|
||||
# at the expense of latency. This should be explored more because I'm
|
||||
# seeing a much bigger impact there that I would have expected. There
|
||||
# may be some low hanging fruit to be found here.
|
||||
zpios_survey_pending() {
|
||||
TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+pending"
|
||||
print_header ${TEST_NAME}
|
||||
|
||||
${ZFS_SH} ${VERBOSE_FLAG} \
|
||||
zfs="zfs_vdev_max_pending=1024" | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZFS_SH} -u ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
}
|
||||
|
||||
# Apply all possible turning concurrently to get a best case number
|
||||
zpios_survey_all() {
|
||||
TEST_NAME="${ZPOOL_CONFIG}+${ZPIOS_TEST}+all"
|
||||
print_header ${TEST_NAME}
|
||||
|
||||
${ZFS_SH} ${VERBOSE_FLAG} \
|
||||
zfs="zfs_vdev_max_pending=1024" | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZPIOS_SH} ${VERBOSE_FLAG} -c ${ZPOOL_CONFIG} -t ${ZPIOS_TEST} \
|
||||
-o "--noprefetch --zerocopy" \
|
||||
-s "set checksum=off" | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
${ZFS_SH} -u ${VERBOSE_FLAG} | \
|
||||
tee -a ${ZPIOS_SURVEY_LOG}
|
||||
}
|
||||
|
||||
|
||||
PROFILE=
|
||||
ZPOOL_NAME=zpios-survey
|
||||
ZPOOL_CONFIG=zpool-config.sh
|
||||
ZPIOS_TEST=zpios-test.sh
|
||||
ZPIOS_SURVEY_LOG=/dev/null
|
||||
|
||||
while getopts 'hvpc:t:l:' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
VERBOSE_FLAG="-v"
|
||||
;;
|
||||
p)
|
||||
PROFILE=1
|
||||
PROFILE_FLAG="-p"
|
||||
;;
|
||||
c)
|
||||
ZPOOL_CONFIG=${OPTARG}
|
||||
;;
|
||||
t)
|
||||
ZPIOS_TEST=${OPTARG}
|
||||
;;
|
||||
l)
|
||||
ZPIOS_SURVEY_LOG=${OPTARG}
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
fi
|
||||
|
||||
zpios_survey_base
|
||||
zpios_survey_prefetch
|
||||
zpios_survey_zerocopy
|
||||
zpios_survey_checksum
|
||||
zpios_survey_pending
|
||||
zpios_survey_all
|
||||
|
||||
exit 0
|
||||
@@ -1,65 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: zpios
|
||||
# --threadcount -t =values
|
||||
# --threadcount_low -l =value
|
||||
# --threadcount_high -h =value
|
||||
# --threadcount_incr -e =value
|
||||
# --regioncount -n =values
|
||||
# --regioncount_low -i =value
|
||||
# --regioncount_high -j =value
|
||||
# --regioncount_incr -k =value
|
||||
# --offset -o =values
|
||||
# --offset_low -m =value
|
||||
# --offset_high -q =value
|
||||
# --offset_incr -r =value
|
||||
# --chunksize -c =values
|
||||
# --chunksize_low -a =value
|
||||
# --chunksize_high -b =value
|
||||
# --chunksize_incr -g =value
|
||||
# --regionsize -s =values
|
||||
# --regionsize_low -A =value
|
||||
# --regionsize_high -B =value
|
||||
# --regionsize_incr -C =value
|
||||
# --load -L =dmuio|ssf|fpp
|
||||
# --pool -p =pool name
|
||||
# --name -M =test name
|
||||
# --cleanup -x
|
||||
# --prerun -P =pre-command
|
||||
# --postrun -R =post-command
|
||||
# --log -G =log directory
|
||||
# --regionnoise -I =shift
|
||||
# --chunknoise -N =bytes
|
||||
# --threaddelay -T =jiffies
|
||||
# --verify -V
|
||||
# --zerocopy -z
|
||||
# --nowait -O
|
||||
# --human-readable -H
|
||||
# --verbose -v =increase verbosity
|
||||
# --help -? =this help
|
||||
|
||||
ZPIOS_CMD="${ZPIOS} \
|
||||
--load=dmuio \
|
||||
--pool=${ZPOOL_NAME} \
|
||||
--name=${ZPOOL_CONFIG} \
|
||||
--threadcount=16 \
|
||||
--regioncount=8192 \
|
||||
--regionsize=4M \
|
||||
--chunksize=1M \
|
||||
--offset=4M \
|
||||
--cleanup \
|
||||
--human-readable \
|
||||
${ZPIOS_OPTIONS}"
|
||||
|
||||
zpios_start() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
ZPIOS_CMD="${ZPIOS_CMD} --verbose"
|
||||
echo ${ZPIOS_CMD}
|
||||
fi
|
||||
|
||||
${ZPIOS_CMD} || exit 1
|
||||
}
|
||||
|
||||
zpios_stop() {
|
||||
[ ${VERBOSE} ] && echo
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: zpios
|
||||
# --threadcount -t =values
|
||||
# --threadcount_low -l =value
|
||||
# --threadcount_high -h =value
|
||||
# --threadcount_incr -e =value
|
||||
# --regioncount -n =values
|
||||
# --regioncount_low -i =value
|
||||
# --regioncount_high -j =value
|
||||
# --regioncount_incr -k =value
|
||||
# --offset -o =values
|
||||
# --offset_low -m =value
|
||||
# --offset_high -q =value
|
||||
# --offset_incr -r =value
|
||||
# --chunksize -c =values
|
||||
# --chunksize_low -a =value
|
||||
# --chunksize_high -b =value
|
||||
# --chunksize_incr -g =value
|
||||
# --regionsize -s =values
|
||||
# --regionsize_low -A =value
|
||||
# --regionsize_high -B =value
|
||||
# --regionsize_incr -C =value
|
||||
# --load -L =dmuio|ssf|fpp
|
||||
# --pool -p =pool name
|
||||
# --name -M =test name
|
||||
# --cleanup -x
|
||||
# --prerun -P =pre-command
|
||||
# --postrun -R =post-command
|
||||
# --log -G =log directory
|
||||
# --regionnoise -I =shift
|
||||
# --chunknoise -N =bytes
|
||||
# --threaddelay -T =jiffies
|
||||
# --verify -V
|
||||
# --zerocopy -z
|
||||
# --nowait -O
|
||||
# --human-readable -H
|
||||
# --verbose -v =increase verbosity
|
||||
# --help -? =this help
|
||||
|
||||
|
||||
ZPIOS_CMD="${ZPIOS} \
|
||||
--load=dmuio \
|
||||
--pool=${ZPOOL_NAME} \
|
||||
--name=${ZPOOL_CONFIG} \
|
||||
--threadcount=1 \
|
||||
--regioncount=16 \
|
||||
--regionsize=4M \
|
||||
--chunksize=1M \
|
||||
--offset=4M \
|
||||
--cleanup \
|
||||
--human-readable \
|
||||
${ZPIOS_OPTIONS}"
|
||||
|
||||
zpios_start() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
ZPIOS_CMD="${ZPIOS_CMD} --verbose"
|
||||
echo ${ZPIOS_CMD}
|
||||
fi
|
||||
|
||||
${ZPIOS_CMD} || exit 1
|
||||
}
|
||||
|
||||
zpios_stop() {
|
||||
[ ${VERBOSE} ] && echo
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: zpios
|
||||
# --threadcount -t =values
|
||||
# --threadcount_low -l =value
|
||||
# --threadcount_high -h =value
|
||||
# --threadcount_incr -e =value
|
||||
# --regioncount -n =values
|
||||
# --regioncount_low -i =value
|
||||
# --regioncount_high -j =value
|
||||
# --regioncount_incr -k =value
|
||||
# --offset -o =values
|
||||
# --offset_low -m =value
|
||||
# --offset_high -q =value
|
||||
# --offset_incr -r =value
|
||||
# --chunksize -c =values
|
||||
# --chunksize_low -a =value
|
||||
# --chunksize_high -b =value
|
||||
# --chunksize_incr -g =value
|
||||
# --regionsize -s =values
|
||||
# --regionsize_low -A =value
|
||||
# --regionsize_high -B =value
|
||||
# --regionsize_incr -C =value
|
||||
# --load -L =dmuio|ssf|fpp
|
||||
# --pool -p =pool name
|
||||
# --name -M =test name
|
||||
# --cleanup -x
|
||||
# --prerun -P =pre-command
|
||||
# --postrun -R =post-command
|
||||
# --log -G =log directory
|
||||
# --regionnoise -I =shift
|
||||
# --chunknoise -N =bytes
|
||||
# --threaddelay -T =jiffies
|
||||
# --verify -V
|
||||
# --zerocopy -z
|
||||
# --nowait -O
|
||||
# --human-readable -H
|
||||
# --verbose -v =increase verbosity
|
||||
# --help -? =this help
|
||||
|
||||
ZPIOS_CMD="${ZPIOS} \
|
||||
--load=dmuio \
|
||||
--pool=${ZPOOL_NAME} \
|
||||
--name=${ZPOOL_CONFIG} \
|
||||
--threadcount=1,2,4,8,16,32,64,128,256 \
|
||||
--regioncount=65536 \
|
||||
--regionsize=4M \
|
||||
--chunksize=1M \
|
||||
--offset=4M \
|
||||
--cleanup \
|
||||
--human-readable \
|
||||
${ZPIOS_OPTIONS}"
|
||||
|
||||
zpios_start() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
ZPIOS_CMD="${ZPIOS_CMD} --verbose"
|
||||
echo ${ZPIOS_CMD}
|
||||
fi
|
||||
|
||||
${ZPIOS_CMD} || exit 1
|
||||
}
|
||||
|
||||
zpios_stop() {
|
||||
[ ${VERBOSE} ] && echo
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: zpios
|
||||
# --threadcount -t =values
|
||||
# --threadcount_low -l =value
|
||||
# --threadcount_high -h =value
|
||||
# --threadcount_incr -e =value
|
||||
# --regioncount -n =values
|
||||
# --regioncount_low -i =value
|
||||
# --regioncount_high -j =value
|
||||
# --regioncount_incr -k =value
|
||||
# --offset -o =values
|
||||
# --offset_low -m =value
|
||||
# --offset_high -q =value
|
||||
# --offset_incr -r =value
|
||||
# --chunksize -c =values
|
||||
# --chunksize_low -a =value
|
||||
# --chunksize_high -b =value
|
||||
# --chunksize_incr -g =value
|
||||
# --regionsize -s =values
|
||||
# --regionsize_low -A =value
|
||||
# --regionsize_high -B =value
|
||||
# --regionsize_incr -C =value
|
||||
# --load -L =dmuio|ssf|fpp
|
||||
# --pool -p =pool name
|
||||
# --name -M =test name
|
||||
# --cleanup -x
|
||||
# --prerun -P =pre-command
|
||||
# --postrun -R =post-command
|
||||
# --log -G =log directory
|
||||
# --regionnoise -I =shift
|
||||
# --chunknoise -N =bytes
|
||||
# --threaddelay -T =jiffies
|
||||
# --verify -V
|
||||
# --zerocopy -z
|
||||
# --nowait -O
|
||||
# --human-readable -H
|
||||
# --verbose -v =increase verbosity
|
||||
# --help -? =this help
|
||||
|
||||
ZPIOS_CMD="${ZPIOS} \
|
||||
--load=dmuio \
|
||||
--pool=${ZPOOL_NAME} \
|
||||
--name=${ZPOOL_CONFIG} \
|
||||
--threadcount=256 \
|
||||
--regioncount=65536 \
|
||||
--regionsize=4M \
|
||||
--chunksize=1M \
|
||||
--offset=4M \
|
||||
--cleanup \
|
||||
--human-readable \
|
||||
${ZPIOS_OPTIONS}"
|
||||
|
||||
zpios_start() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
ZPIOS_CMD="${ZPIOS_CMD} --verbose"
|
||||
echo ${ZPIOS_CMD}
|
||||
fi
|
||||
|
||||
${ZPIOS_CMD} || exit 1
|
||||
}
|
||||
|
||||
zpios_stop() {
|
||||
[ ${VERBOSE} ] && echo
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: zpios
|
||||
# --threadcount -t =values
|
||||
# --threadcount_low -l =value
|
||||
# --threadcount_high -h =value
|
||||
# --threadcount_incr -e =value
|
||||
# --regioncount -n =values
|
||||
# --regioncount_low -i =value
|
||||
# --regioncount_high -j =value
|
||||
# --regioncount_incr -k =value
|
||||
# --offset -o =values
|
||||
# --offset_low -m =value
|
||||
# --offset_high -q =value
|
||||
# --offset_incr -r =value
|
||||
# --chunksize -c =values
|
||||
# --chunksize_low -a =value
|
||||
# --chunksize_high -b =value
|
||||
# --chunksize_incr -g =value
|
||||
# --regionsize -s =values
|
||||
# --regionsize_low -A =value
|
||||
# --regionsize_high -B =value
|
||||
# --regionsize_incr -C =value
|
||||
# --load -L =dmuio|ssf|fpp
|
||||
# --pool -p =pool name
|
||||
# --name -M =test name
|
||||
# --cleanup -x
|
||||
# --prerun -P =pre-command
|
||||
# --postrun -R =post-command
|
||||
# --log -G =log directory
|
||||
# --regionnoise -I =shift
|
||||
# --chunknoise -N =bytes
|
||||
# --threaddelay -T =jiffies
|
||||
# --verify -V
|
||||
# --zerocopy -z
|
||||
# --nowait -O
|
||||
# --human-readable -H
|
||||
# --verbose -v =increase verbosity
|
||||
# --help -? =this help
|
||||
|
||||
ZPIOS_CMD="${ZPIOS} \
|
||||
--load=dmuio \
|
||||
--pool=${ZPOOL_NAME} \
|
||||
--name=${ZPOOL_CONFIG} \
|
||||
--threadcount=4 \
|
||||
--regioncount=1024 \
|
||||
--regionsize=4M \
|
||||
--chunksize=1M \
|
||||
--offset=4M \
|
||||
--cleanup \
|
||||
--human-readable \
|
||||
${ZPIOS_OPTIONS}"
|
||||
|
||||
zpios_start() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
ZPIOS_CMD="${ZPIOS_CMD} --verbose"
|
||||
echo ${ZPIOS_CMD}
|
||||
fi
|
||||
|
||||
${ZPIOS_CMD} || exit 1
|
||||
}
|
||||
|
||||
zpios_stop() {
|
||||
[ ${VERBOSE} ] && echo
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
pkgdatatestdir = $(pkgdatadir)/zpios-test
|
||||
dist_pkgdatatest_SCRIPTS = \
|
||||
$(top_srcdir)/scripts/zpios-test/16th-8192rc-4rs-1cs-4off.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/1th-16rc-4rs-1cs-4off.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/1x256th-65536rc-4rs-1cs-4off.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/256th-65536rc-4rs-1cs-4off.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/4th-1024rc-4rs-1cs-4off.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/large.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/large-thread-survey.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/medium.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/small.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/tiny.sh \
|
||||
$(top_srcdir)/scripts/zpios-test/lustre.sh
|
||||
@@ -1 +0,0 @@
|
||||
1x256th-65536rc-4rs-1cs-4off.sh
|
||||
@@ -1 +0,0 @@
|
||||
256th-65536rc-4rs-1cs-4off.sh
|
||||
@@ -1,66 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: zpios
|
||||
# --threadcount -t =values
|
||||
# --threadcount_low -l =value
|
||||
# --threadcount_high -h =value
|
||||
# --threadcount_incr -e =value
|
||||
# --regioncount -n =values
|
||||
# --regioncount_low -i =value
|
||||
# --regioncount_high -j =value
|
||||
# --regioncount_incr -k =value
|
||||
# --offset -o =values
|
||||
# --offset_low -m =value
|
||||
# --offset_high -q =value
|
||||
# --offset_incr -r =value
|
||||
# --chunksize -c =values
|
||||
# --chunksize_low -a =value
|
||||
# --chunksize_high -b =value
|
||||
# --chunksize_incr -g =value
|
||||
# --regionsize -s =values
|
||||
# --regionsize_low -A =value
|
||||
# --regionsize_high -B =value
|
||||
# --regionsize_incr -C =value
|
||||
# --load -L =dmuio|ssf|fpp
|
||||
# --pool -p =pool name
|
||||
# --name -M =test name
|
||||
# --cleanup -x
|
||||
# --prerun -P =pre-command
|
||||
# --postrun -R =post-command
|
||||
# --log -G =log directory
|
||||
# --regionnoise -I =shift
|
||||
# --chunknoise -N =bytes
|
||||
# --threaddelay -T =jiffies
|
||||
# --verify -V
|
||||
# --zerocopy -z
|
||||
# --nowait -O
|
||||
# --human-readable -H
|
||||
# --verbose -v =increase verbosity
|
||||
# --help -? =this help
|
||||
|
||||
ZPIOS_CMD="${ZPIOS} \
|
||||
--load=dmuio,fpp \
|
||||
--pool=${ZPOOL_NAME} \
|
||||
--name=${ZPOOL_DESC} \
|
||||
--threadcount=128 \
|
||||
--regioncount=4096 \
|
||||
--regionsize=16M \
|
||||
--chunksize=1M \
|
||||
--offset=0M \
|
||||
--threaddelay=0 \
|
||||
--cleanup \
|
||||
--human-readable \
|
||||
${ZPIOS_OPTIONS}"
|
||||
|
||||
zpios_start() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
ZPIOS_CMD="${ZPIOS_CMD} --verbose"
|
||||
echo ${ZPIOS_CMD}
|
||||
fi
|
||||
|
||||
${ZPIOS_CMD} || exit 1
|
||||
}
|
||||
|
||||
zpios_stop() {
|
||||
[ ${VERBOSE} ] && echo
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
16th-8192rc-4rs-1cs-4off.sh
|
||||
@@ -1 +0,0 @@
|
||||
4th-1024rc-4rs-1cs-4off.sh
|
||||
@@ -1 +0,0 @@
|
||||
1th-16rc-4rs-1cs-4off.sh
|
||||
@@ -1,281 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Wrapper script for easily running zpios based tests
|
||||
#
|
||||
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zpios.sh
|
||||
DATE=`date +%Y%m%d-%H%M%S`
|
||||
if [ "${ZPIOS_MODULES}" ]; then
|
||||
MODULES=(${ZPIOS_MODULES[*]})
|
||||
else
|
||||
MODULES=(zpios)
|
||||
fi
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
$0 [hvp] <-c config> <-t test>
|
||||
|
||||
DESCRIPTION:
|
||||
Helper script for easy zpios benchmarking.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-f Force everything
|
||||
-p Enable profiling
|
||||
-c Zpool configuration
|
||||
-t Zpios test
|
||||
-o Additional zpios options
|
||||
-l Additional zpool options
|
||||
-s Additional zfs options
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
unload_die() {
|
||||
unload_modules
|
||||
while [ -c /dev/zpios ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
exit 1
|
||||
}
|
||||
|
||||
print_header() {
|
||||
echo --------------------- ZPIOS RESULTS ----------------------------
|
||||
echo -n "Date: "; date
|
||||
echo -n "Kernel: "; uname -r
|
||||
dmesg | grep "Loaded Solaris Porting Layer" | tail -n1
|
||||
dmesg | grep "Loaded ZFS Filesystem" | tail -n1
|
||||
echo
|
||||
}
|
||||
|
||||
print_spl_info() {
|
||||
echo --------------------- SPL Tunings ------------------------------
|
||||
${SYSCTL} -A | grep spl
|
||||
|
||||
if [ -d /sys/module/spl/parameters ]; then
|
||||
grep [0-9] /sys/module/spl/parameters/*
|
||||
else
|
||||
grep [0-9] /sys/module/spl/*
|
||||
fi
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
print_zfs_info() {
|
||||
echo --------------------- ZFS Tunings ------------------------------
|
||||
${SYSCTL} -A | grep zfs
|
||||
|
||||
if [ -d /sys/module/zfs/parameters ]; then
|
||||
grep [0-9] /sys/module/zfs/parameters/*
|
||||
else
|
||||
grep [0-9] /sys/module/zfs/*
|
||||
fi
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
print_stats() {
|
||||
echo ---------------------- Statistics -------------------------------
|
||||
${SYSCTL} -A | grep spl | grep stack_max
|
||||
|
||||
if [ -d /proc/spl/kstat/ ]; then
|
||||
if [ -f /proc/spl/kstat/zfs/arcstats ]; then
|
||||
echo "* ARC"
|
||||
cat /proc/spl/kstat/zfs/arcstats
|
||||
echo
|
||||
fi
|
||||
|
||||
if [ -f /proc/spl/kstat/zfs/vdev_cache_stats ]; then
|
||||
echo "* VDEV Cache"
|
||||
cat /proc/spl/kstat/zfs/vdev_cache_stats
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -f /proc/spl/kmem/slab ]; then
|
||||
echo "* SPL SLAB"
|
||||
cat /proc/spl/kmem/slab
|
||||
echo
|
||||
fi
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
check_test() {
|
||||
|
||||
if [ ! -f ${ZPIOS_TEST} ]; then
|
||||
local NAME=`basename ${ZPIOS_TEST} .sh`
|
||||
ERROR="Unknown test '${NAME}', available tests are:\n"
|
||||
|
||||
for TST in `ls ${ZPIOSDIR}/ | grep ".sh"`; do
|
||||
local NAME=`basename ${TST} .sh`
|
||||
ERROR="${ERROR}${NAME}\n"
|
||||
done
|
||||
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
zpios_profile_config() {
|
||||
cat > ${PROFILE_DIR}/zpios-config.sh << EOF
|
||||
#
|
||||
# Zpios Profiling Configuration
|
||||
#
|
||||
|
||||
PROFILE_DIR=/tmp/zpios/${ZPOOL_CONFIG}+${ZPIOS_TEST_ARG}+${DATE}
|
||||
PROFILE_PRE=${ZPIOSPROFILEDIR}/zpios-profile-pre.sh
|
||||
PROFILE_POST=${ZPIOSPROFILEDIR}/zpios-profile-post.sh
|
||||
PROFILE_USER=${ZPIOSPROFILEDIR}/zpios-profile.sh
|
||||
PROFILE_PIDS=${ZPIOSPROFILEDIR}/zpios-profile-pids.sh
|
||||
PROFILE_DISK=${ZPIOSPROFILEDIR}/zpios-profile-disk.sh
|
||||
PROFILE_ARC_PROC=/proc/spl/kstat/zfs/arcstats
|
||||
PROFILE_VDEV_CACHE_PROC=/proc/spl/kstat/zfs/vdev_cache_stats
|
||||
|
||||
OPROFILE_KERNEL="/boot/vmlinux-`uname -r`"
|
||||
OPROFILE_KERNEL_DIR="/lib/modules/`uname -r`/kernel/"
|
||||
OPROFILE_SPL_DIR=${SPLBUILD}/module/
|
||||
OPROFILE_ZFS_DIR=${MODDIR}
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
zpios_profile_start() {
|
||||
PROFILE_DIR=/tmp/zpios/${ZPOOL_CONFIG}+${ZPIOS_TEST_ARG}+${DATE}
|
||||
|
||||
mkdir -p ${PROFILE_DIR}
|
||||
zpios_profile_config
|
||||
. ${PROFILE_DIR}/zpios-config.sh
|
||||
|
||||
ZPIOS_OPTIONS="${ZPIOS_OPTIONS} --log=${PROFILE_DIR}"
|
||||
ZPIOS_OPTIONS="${ZPIOS_OPTIONS} --prerun=${PROFILE_PRE}"
|
||||
ZPIOS_OPTIONS="${ZPIOS_OPTIONS} --postrun=${PROFILE_POST}"
|
||||
|
||||
/usr/bin/opcontrol --init
|
||||
/usr/bin/opcontrol --setup --vmlinux=${OPROFILE_KERNEL}
|
||||
}
|
||||
|
||||
zpios_profile_stop() {
|
||||
/usr/bin/opcontrol --shutdown
|
||||
/usr/bin/opcontrol --deinit
|
||||
}
|
||||
|
||||
PROFILE=
|
||||
ZPOOL_CONFIG=zpool-config.sh
|
||||
ZPIOS_TEST=zpios-test.sh
|
||||
ZPOOL_NAME=zpios
|
||||
ZPIOS_OPTIONS=
|
||||
ZPOOL_OPTIONS=""
|
||||
ZFS_OPTIONS=""
|
||||
|
||||
while getopts 'hvfpc:t:o:l:s:' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
VERBOSE_FLAG="-v"
|
||||
;;
|
||||
f)
|
||||
FORCE=1
|
||||
FORCE_FLAG="-f"
|
||||
;;
|
||||
p)
|
||||
PROFILE=1
|
||||
;;
|
||||
c)
|
||||
ZPOOL_CONFIG=${OPTARG}
|
||||
;;
|
||||
t)
|
||||
ZPIOS_TEST_ARG=${OPTARG}
|
||||
ZPIOS_TEST=${ZPIOSDIR}/${OPTARG}.sh
|
||||
;;
|
||||
o)
|
||||
ZPIOS_OPTIONS=${OPTARG}
|
||||
;;
|
||||
l) # Passed through to zpool-create.sh
|
||||
ZPOOL_OPTIONS=${OPTARG}
|
||||
;;
|
||||
s) # Passed through to zpool-create.sh
|
||||
ZFS_OPTIONS=${OPTARG}
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
fi
|
||||
|
||||
# Validate and source your test config
|
||||
check_test || die "${ERROR}"
|
||||
. ${ZPIOS_TEST}
|
||||
|
||||
# Pull in the zpios test module if not loaded. If this fails, it is
|
||||
# likely because the full module stack was not yet loaded with zfs.sh
|
||||
if check_modules; then
|
||||
if ! load_modules; then
|
||||
die "Run 'zfs.sh' to ensure the full module stack is loaded"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Wait for device creation
|
||||
while [ ! -c /dev/zpios ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
print_header
|
||||
print_spl_info
|
||||
print_zfs_info
|
||||
fi
|
||||
|
||||
# Create the zpool configuration
|
||||
${ZPOOL_CREATE_SH} ${VERBOSE_FLAG} ${FORCE_FLAG} \
|
||||
-p ${ZPOOL_NAME} -c ${ZPOOL_CONFIG} \
|
||||
-l "${ZPOOL_OPTIONS}" -s "${ZFS_OPTIONS}" || unload_die
|
||||
|
||||
if [ ${PROFILE} ]; then
|
||||
zpios_profile_start
|
||||
fi
|
||||
|
||||
zpios_start
|
||||
zpios_stop
|
||||
|
||||
if [ ${PROFILE} ]; then
|
||||
zpios_profile_stop
|
||||
fi
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
print_stats
|
||||
fi
|
||||
|
||||
# Destroy the zpool configuration
|
||||
${ZPOOL_CREATE_SH} ${VERBOSE_FLAG} ${FORCE_FLAG} \
|
||||
-p ${ZPOOL_NAME} -c ${ZPOOL_CONFIG} -d || unload_die
|
||||
|
||||
# Unload the test module stack and wait for device removal
|
||||
unload_modules
|
||||
while [ -c /dev/zpios ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -1,30 +0,0 @@
|
||||
pkgdataconfigdir = $(pkgdatadir)/zpool-config
|
||||
dist_pkgdataconfig_SCRIPTS = \
|
||||
$(top_srcdir)/scripts/zpool-config/dm0-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/file-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/file-raid10.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/file-raidz2.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/file-raidz.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/hda-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-raid10.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-raidz2.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-raidz.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-faulty-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-faulty-raid10.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-faulty-raidz.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-faulty-raidz2.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/lo-faulty-raidz3.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/md0-raid10.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/md0-raid5.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/ram0-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/scsi_debug-noraid.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/scsi_debug-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/scsi_debug-raid10.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/scsi_debug-raidz.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/scsi_debug-raidz2.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/scsi_debug-raidz3.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/sda-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/zpool-raid0.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/zpool-raid10.sh \
|
||||
$(top_srcdir)/scripts/zpool-config/zpool-raidz.sh
|
||||
@@ -1,60 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Four disk Raid-0 DM in a single Raid-0 Configuration
|
||||
#
|
||||
|
||||
PVCREATE=${PVCREATE:-/sbin/pvcreate}
|
||||
PVREMOVE=${PVREMOVE:-/sbin/pvremove}
|
||||
PVDEVICES=${PVDEVICES:-"/dev/sd[abcd]"}
|
||||
|
||||
VGCREATE=${VGCREATE:-/sbin/vgcreate}
|
||||
VGREMOVE=${VGREMOVE:-/sbin/vgremove}
|
||||
VGNAME=${VGNAME:-"vg_tank"}
|
||||
|
||||
LVCREATE=${LVCREATE:-/sbin/lvcreate}
|
||||
LVREMOVE=${LVREMOVE:-/sbin/lvremove}
|
||||
LVNAME=${LVNAME:-"lv_tank"}
|
||||
LVSTRIPES=${LVSTRIPES:-4}
|
||||
LVSIZE=${LVSIZE:-32G}
|
||||
|
||||
DEVICES="/dev/${VGNAME}/${LVNAME}"
|
||||
|
||||
zpool_dm_destroy() {
|
||||
msg ${LVREMOVE} -f ${VGNAME}/${LVNAME}
|
||||
${LVREMOVE} -f ${VGNAME}/${LVNAME} >/dev/null
|
||||
|
||||
msg ${VGREMOVE} -f ${VGNAME}
|
||||
${VGREMOVE} -f ${VGNAME} >/dev/null
|
||||
|
||||
msg ${PVREMOVE} ${PVDEVICES}
|
||||
${PVREMOVE} ${PVDEVICES} >/dev/null
|
||||
}
|
||||
|
||||
zpool_create() {
|
||||
# Remove EFI labels which cause pvcreate failure
|
||||
for DEVICE in ${PVDEVICES}; do
|
||||
dd if=/dev/urandom of=${DEVICE} bs=1k count=32 &>/dev/null
|
||||
done
|
||||
|
||||
msg ${PVCREATE} -f ${PVDEVICES}
|
||||
${PVCREATE} -f ${PVDEVICES} >/dev/null || exit 1
|
||||
|
||||
msg ${VGCREATE} ${VGNAME} ${PVDEVICES}
|
||||
${VGCREATE} ${VGNAME} ${PVDEVICES} >/dev/null || exit 2
|
||||
|
||||
msg ${LVCREATE} --size=${LVSIZE} --stripes=${LVSTRIPES} \
|
||||
--name=${LVNAME} ${VGNAME}
|
||||
${LVCREATE} --size=${LVSIZE} --stripes=${LVSTRIPES} \
|
||||
--name=${LVNAME} ${VGNAME} >/dev/null || exit 3
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
${DEVICES} || (zpool_dm_destroy && exit 4)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
zpool_dm_destroy
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
|
||||
zpool_create() {
|
||||
for FILE in ${FILES}; do
|
||||
msg "Creating ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${FILES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${FILES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
msg "Removing ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-10 Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES_M1=${FILES_M1:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1"}
|
||||
FILES_M2=${FILES_M2:-"$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
FILES="${FILES_M1} ${FILES_M2}"
|
||||
|
||||
zpool_create() {
|
||||
for FILE in ${FILES}; do
|
||||
msg "Creating ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${FILES_M1} mirror ${FILES_M2}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${FILES_M1} mirror ${FILES_M2} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
msg "Removing ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-Z Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
|
||||
zpool_create() {
|
||||
for FILE in ${FILES}; do
|
||||
msg "Creating ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${FILES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${FILES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
msg "Removing ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-Z2 Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
|
||||
zpool_create() {
|
||||
for FILE in ${FILES}; do
|
||||
msg "Creating ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${FILES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${FILES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
msg "Removing ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Single disk /dev/hda Raid-0 Configuration
|
||||
#
|
||||
|
||||
DEVICES="/dev/hda"
|
||||
|
||||
zpool_create() {
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME} || exit 1
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 loopback devices using the md faulty level for easy
|
||||
# fault injection on top of which is layered raid0 (striped).
|
||||
#
|
||||
# zpool-vdev0 zpool-vdev1 zpool-vdev2 zpool-vdev3
|
||||
# loop0 loop1 loop2 loop3
|
||||
# md0 (faulty) md1 (faulty) md2 (faulty) md3 (faulty)
|
||||
# <--------------------- raid0 zpool --------------------->
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
LODEVICES=""
|
||||
MDDEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_md_utils
|
||||
check_md_partitionable || die "Error non-partitionable md devices"
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
MDDEVICE=`unused_md_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}"
|
||||
|
||||
LODEVICES="${LODEVICES} ${LODEVICE}"
|
||||
|
||||
# Setup the md device on the loopback device.
|
||||
msg "Creating ${MDDEVICE} using ${LODEVICE}"
|
||||
${MDADM} --build ${MDDEVICE} --level=faulty \
|
||||
--raid-devices=1 ${LODEVICE} &>/dev/null || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
|
||||
wait_udev ${MDDEVICE} 30 || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error udev never created ${MDDEVICE}")
|
||||
|
||||
# Check if the md device support partitions
|
||||
${BLOCKDEV} --rereadpt ${MDDEVICE} 2>/dev/null || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error ${MDDEVICE} does not support partitions")
|
||||
|
||||
# Create a GPT/EFI partition table for ZFS to use.
|
||||
${PARTED} --script ${MDDEVICE} mklabel gpt
|
||||
MDDEVICES="${MDDEVICES} ${MDDEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${MDDEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${MDDEVICES} || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && exit 1)
|
||||
|
||||
echo "$LODEVICES" >/tmp/zpool-lo.txt
|
||||
echo "$MDDEVICES" >/tmp/zpool-md.txt
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
destroy_md_devices "`cat /tmp/zpool-md.txt`"
|
||||
destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
|
||||
|
||||
rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 loopback devices using the md faulty level for easy
|
||||
# fault injection on top of which is layered raid10 (mirrored).
|
||||
#
|
||||
# zpool-vdev0 zpool-vdev1 zpool-vdev2 zpool-vdev3
|
||||
# loop0 loop1 loop2 loop3
|
||||
# md0 (faulty) md1 (faulty) md2 (faulty) md3 (faulty)
|
||||
# <--------------------- raid10 zpool --------------------->
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES_M1=${FILES_M1:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1"}
|
||||
FILES_M2=${FILES_M2:-"$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
FILES="${FILES_M1} ${FILES_M2}"
|
||||
LODEVICES=""
|
||||
MDDEVICES=""
|
||||
MDDEVICES_M1=""
|
||||
MDDEVICES_M2=""
|
||||
|
||||
zpool_create() {
|
||||
local COUNT=0
|
||||
|
||||
check_loop_utils
|
||||
check_md_utils
|
||||
check_md_partitionable || die "Error non-partitionable md devices"
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
MDDEVICE=`unused_md_device`
|
||||
let COUNT=${COUNT}+1
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}"
|
||||
|
||||
LODEVICES="${LODEVICES} ${LODEVICE}"
|
||||
|
||||
# Setup the md device on the loopback device.
|
||||
msg "Creating ${MDDEVICE} using ${LODEVICE}"
|
||||
${MDADM} --build ${MDDEVICE} --level=faulty \
|
||||
--raid-devices=1 ${LODEVICE} &>/dev/null || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
|
||||
wait_udev ${MDDEVICE} 30 || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error udev never created ${MDDEVICE}")
|
||||
|
||||
# Create empty GPT/EFI partition table.
|
||||
${PARTED} --script ${MDDEVICE} mklabel gpt
|
||||
MDDEVICES="${MDDEVICES} ${MDDEVICE}"
|
||||
if [ $((COUNT % 2)) -eq 0 ]; then
|
||||
MDDEVICES_M2="${MDDEVICES_M2} ${MDDEVICE}"
|
||||
else
|
||||
MDDEVICES_M1="${MDDEVICES_M1} ${MDDEVICE}"
|
||||
fi
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${MDDEVICES_M1} mirror ${MDDEVICES_M2}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${MDDEVICES_M1} mirror ${MDDEVICES_M2} || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && exit 1)
|
||||
|
||||
echo "$LODEVICES" >/tmp/zpool-lo.txt
|
||||
echo "$MDDEVICES" >/tmp/zpool-md.txt
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
destroy_md_devices "`cat /tmp/zpool-md.txt`"
|
||||
destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
|
||||
|
||||
rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 loopback devices using the md faulty level for easy
|
||||
# fault injection on top of which is layered raidz.
|
||||
#
|
||||
# zpool-vdev0 zpool-vdev1 zpool-vdev2 zpool-vdev3
|
||||
# loop0 loop1 loop2 loop3
|
||||
# md0 (faulty) md1 (faulty) md2 (faulty) md3 (faulty)
|
||||
# <--------------------- raidz zpool --------------------->
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
LODEVICES=""
|
||||
MDDEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_md_utils
|
||||
check_md_partitionable || die "Error non-partitionable md devices"
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
MDDEVICE=`unused_md_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}"
|
||||
|
||||
LODEVICES="${LODEVICES} ${LODEVICE}"
|
||||
|
||||
# Setup the md device on the loopback device.
|
||||
msg "Creating ${MDDEVICE} using ${LODEVICE}"
|
||||
${MDADM} --build ${MDDEVICE} --level=faulty \
|
||||
--raid-devices=1 ${LODEVICE} &>/dev/null || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
|
||||
wait_udev ${MDDEVICE} 30 || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error udev never created ${MDDEVICE}")
|
||||
|
||||
# Create empty GPT/EFI partition table.
|
||||
${PARTED} --script ${MDDEVICE} mklabel gpt
|
||||
MDDEVICES="${MDDEVICES} ${MDDEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${MDDEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${MDDEVICES} || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && exit 1)
|
||||
|
||||
echo "$LODEVICES" >/tmp/zpool-lo.txt
|
||||
echo "$MDDEVICES" >/tmp/zpool-md.txt
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
destroy_md_devices "`cat /tmp/zpool-md.txt`"
|
||||
destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
|
||||
|
||||
rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 loopback devices using the md faulty level for easy
|
||||
# fault injection on top of which is layered raidz2.
|
||||
#
|
||||
# zpool-vdev0 zpool-vdev1 zpool-vdev2 zpool-vdev3
|
||||
# loop0 loop1 loop2 loop3
|
||||
# md0 (faulty) md1 (faulty) md2 (faulty) md3 (faulty)
|
||||
# <--------------------- raidz2 zpool -------------------->
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
LODEVICES=""
|
||||
MDDEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_md_utils
|
||||
check_md_partitionable || die "Error non-partitionable md devices"
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
MDDEVICE=`unused_md_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}"
|
||||
|
||||
LODEVICES="${LODEVICES} ${LODEVICE}"
|
||||
|
||||
# Setup the md device on the loopback device.
|
||||
msg "Creating ${MDDEVICE} using ${LODEVICE}"
|
||||
${MDADM} --build ${MDDEVICE} --level=faulty \
|
||||
--raid-devices=1 ${LODEVICE} &>/dev/null || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
|
||||
wait_udev ${MDDEVICE} 30 || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error udev never created ${MDDEVICE}")
|
||||
|
||||
# Create empty GPT/EFI partition table.
|
||||
${PARTED} --script ${MDDEVICE} mklabel gpt
|
||||
MDDEVICES="${MDDEVICES} ${MDDEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${MDDEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${MDDEVICES} || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && exit 1)
|
||||
|
||||
echo "$LODEVICES" >/tmp/zpool-lo.txt
|
||||
echo "$MDDEVICES" >/tmp/zpool-md.txt
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
destroy_md_devices "`cat /tmp/zpool-md.txt`"
|
||||
destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
|
||||
|
||||
rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 loopback devices using the md faulty level for easy
|
||||
# fault injection on top of which is layered raidz3.
|
||||
#
|
||||
# zpool-vdev0 zpool-vdev1 zpool-vdev2 zpool-vdev3
|
||||
# loop0 loop1 loop2 loop3
|
||||
# md0 (faulty) md1 (faulty) md2 (faulty) md3 (faulty)
|
||||
# <--------------------- raidz3 zpool -------------------->
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-vdev3"
|
||||
LODEVICES=""
|
||||
MDDEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_md_utils
|
||||
check_md_partitionable || die "Error non-partitionable md devices"
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
MDDEVICE=`unused_md_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}"
|
||||
|
||||
LODEVICES="${LODEVICES} ${LODEVICE}"
|
||||
|
||||
# Setup the md device on the loopback device.
|
||||
msg "Creating ${MDDEVICE} using ${LODEVICE}"
|
||||
${MDADM} --build ${MDDEVICE} --level=faulty \
|
||||
--raid-devices=1 ${LODEVICE} &>/dev/null || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
|
||||
wait_udev ${MDDEVICE} 30 || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && \
|
||||
die "Error udev never created ${MDDEVICE}")
|
||||
|
||||
# Create empty GPT/EFI partition table.
|
||||
${PARTED} --script ${MDDEVICE} mklabel gpt
|
||||
MDDEVICES="${MDDEVICES} ${MDDEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz3 ${MDDEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz3 ${MDDEVICES} || \
|
||||
(destroy_md_devices "${MDDEVICES}" && \
|
||||
destroy_loop_devices "${LODEVICES}" && exit 1)
|
||||
|
||||
echo "$LODEVICES" >/tmp/zpool-lo.txt
|
||||
echo "$MDDEVICES" >/tmp/zpool-md.txt
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
destroy_md_devices "`cat /tmp/zpool-md.txt`"
|
||||
destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
|
||||
|
||||
rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`unused_loop_device`
|
||||
msg "Creating ${FILE} using loopback device ${DEVICE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
${LOSETUP} ${DEVICE} ${FILE} ||
|
||||
die "Error $? creating ${FILE} -> ${DEVICE} loopback"
|
||||
DEVICES="${DEVICES} ${DEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
# Delay to ensure device is closed before removing loop device
|
||||
sleep 1
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${FILE} using loopback device ${DEVICE}"
|
||||
${LOSETUP} -d ${DEVICE} ||
|
||||
die "Error $? destroying ${FILE} -> ${DEVICE} loopback"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES_M1=${FILES_M1:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1"}
|
||||
FILES_M2=${FILES_M2:-"$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
FILES="${FILES_M1} ${FILES_M2}"
|
||||
DEVICES_M1=""
|
||||
DEVICES_M2=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
|
||||
for FILE in ${FILES_M1}; do
|
||||
DEVICE=`unused_loop_device`
|
||||
msg "Creating ${FILE} using loopback device ${DEVICE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
${LOSETUP} ${DEVICE} ${FILE} ||
|
||||
die "Error $? creating ${FILE} -> ${DEVICE} loopback"
|
||||
DEVICES_M1="${DEVICES_M1} ${DEVICE}"
|
||||
done
|
||||
|
||||
for FILE in ${FILES_M2}; do
|
||||
DEVICE=`unused_loop_device`
|
||||
msg "Creating ${FILE} using loopback device ${DEVICE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
${LOSETUP} ${DEVICE} ${FILE} ||
|
||||
die "Error $? creating ${FILE} -> ${DEVICE} loopback"
|
||||
DEVICES_M2="${DEVICES_M2} ${DEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${DEVICES_M1} mirror ${DEVICES_M2}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${DEVICES_M1} mirror ${DEVICES_M2}
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
# Delay to ensure device is closed before removing loop device
|
||||
sleep 1
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${FILE} using loopback device ${DEVICE}"
|
||||
${LOSETUP} -d ${DEVICE} ||
|
||||
die "Error $? destroying ${FILE} -> ${DEVICE} loopback"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`unused_loop_device`
|
||||
msg "Creating ${FILE} using loopback device ${DEVICE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
${LOSETUP} ${DEVICE} ${FILE} ||
|
||||
die "Error $? creating ${FILE} -> ${DEVICE} loopback"
|
||||
DEVICES="${DEVICES} ${DEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
# Delay to ensure device is closed before removing loop device
|
||||
sleep 1
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${FILE} using loopback device ${DEVICE}"
|
||||
${LOSETUP} -d ${DEVICE} ||
|
||||
die "Error $? destroying ${FILE} -> ${DEVICE} loopback"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 \
|
||||
$FILEDIR/file-vdev2 $FILEDIR/file-vdev3"}
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`unused_loop_device`
|
||||
msg "Creating ${FILE} using loopback device ${DEVICE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || die "Error $? creating ${FILE}"
|
||||
${LOSETUP} ${DEVICE} ${FILE} ||
|
||||
die "Error $? creating ${FILE} -> ${DEVICE} loopback"
|
||||
DEVICES="${DEVICES} ${DEVICE}"
|
||||
done
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
# Delay to ensure device is closed before removing loop device
|
||||
sleep 1
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
DEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${FILE} using loopback device ${DEVICE}"
|
||||
${LOSETUP} -d ${DEVICE} ||
|
||||
die "Error $? destroying ${FILE} -> ${DEVICE} loopback"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Four disk Raid-10 in a single Raid-0 Configuration
|
||||
#
|
||||
|
||||
MDADM=${MDADM:-/sbin/mdadm}
|
||||
MDDEVICES=${MDDEVICES:-"/dev/sd[abcd]"}
|
||||
MDCOUNT=${MDCOUNT:-4}
|
||||
MDRAID=${MDRAID:-10}
|
||||
|
||||
DEVICES="/dev/md0"
|
||||
|
||||
zpool_md_destroy() {
|
||||
msg ${MDADM} --manage --stop ${DEVICES}
|
||||
${MDADM} --manage --stop ${DEVICES} &>/dev/null
|
||||
|
||||
msg ${MDADM} --zero-superblock ${MDDEVICES}
|
||||
${MDADM} --zero-superblock ${MDDEVICES} >/dev/null
|
||||
}
|
||||
|
||||
zpool_create() {
|
||||
msg ${MDADM} --create ${DEVICES} --level=${MDRAID} \
|
||||
--raid-devices=${MDCOUNT} ${MDDEVICES}
|
||||
${MDADM} --create ${DEVICES} --level=${MDRAID} \
|
||||
--raid-devices=${MDCOUNT} ${MDDEVICES} \
|
||||
&>/dev/null || (zpool_md_destroy && exit 1)
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
${DEVICES} || (zpool_md_destroy && exit 2)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
zpool_md_destroy
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Four disk Raid-5 in a single Raid-0 Configuration
|
||||
#
|
||||
|
||||
MDADM=${MDADM:-/sbin/mdadm}
|
||||
MDDEVICES=${MDDEVICES:-"/dev/sd[abcd]"}
|
||||
MDCOUNT=${MDCOUNT:-4}
|
||||
MDRAID=${MDRAID:-5}
|
||||
|
||||
DEVICES="/dev/md0"
|
||||
|
||||
zpool_md_destroy() {
|
||||
msg ${MDADM} --manage --stop ${DEVICES}
|
||||
${MDADM} --manage --stop ${DEVICES} &>/dev/null
|
||||
|
||||
msg ${MDADM} --zero-superblock ${MDDEVICES}
|
||||
${MDADM} --zero-superblock ${MDDEVICES} >/dev/null
|
||||
}
|
||||
|
||||
zpool_create() {
|
||||
msg ${MDADM} --create ${DEVICES} --level=${MDRAID} \
|
||||
--raid-devices=${MDCOUNT} ${MDDEVICES}
|
||||
${MDADM} --create ${DEVICES} --level=${MDRAID} \
|
||||
--raid-devices=${MDCOUNT} ${MDDEVICES} \
|
||||
&>/dev/null || (zpool_md_destroy && exit 1)
|
||||
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
${DEVICES} || (zpool_md_destroy && exit 2)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
zpool_md_destroy
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Single ram disk /dev/ram0 Raid-0 Configuration
|
||||
#
|
||||
|
||||
DEVICES="/dev/ram0"
|
||||
|
||||
zpool_create() {
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME} || exit 1
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 1 scsi_debug devices on top of which is layered no raid.
|
||||
#
|
||||
|
||||
SDSIZE=${SDSIZE:-128}
|
||||
SDHOSTS=${SDHOSTS:-1}
|
||||
SDTGTS=${SDTGTS:-1}
|
||||
SDLUNS=${SDLUNS:-1}
|
||||
LDMOD=/sbin/modprobe
|
||||
|
||||
zpool_create() {
|
||||
check_sd_utils
|
||||
|
||||
test `${LSMOD} | grep -c scsi_debug` -gt 0 && \
|
||||
(echo 0 >/sys/module/scsi_debug/parameters/every_nth && \
|
||||
${RMMOD} scsi_debug || exit 1)
|
||||
udev_trigger
|
||||
|
||||
msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} " \
|
||||
"add_host=${SDHOSTS} num_tgts=${SDTGTS} " \
|
||||
"max_luns=${SDLUNS}"
|
||||
${LDMOD} scsi_debug \
|
||||
dev_size_mb=${SDSIZE} \
|
||||
add_host=${SDHOSTS} \
|
||||
num_tgts=${SDTGTS} \
|
||||
max_luns=${SDLUNS} || \
|
||||
die "Error $? creating scsi_debug devices"
|
||||
udev_trigger
|
||||
SDDEVICE=`${LSSCSI}|${AWK} '/scsi_debug/ { print $6; exit }'`
|
||||
|
||||
msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
|
||||
${PARTED} -s ${SDDEVICE} mklabel gpt || \
|
||||
(${RMMOD} scsi_debug && die "Error $? creating gpt label")
|
||||
|
||||
msg "${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${SDDEVICE}"
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${SDDEVICE} || \
|
||||
(${RMMOD} scsi_debug && exit 1)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
msg "${RMMOD} scsi_debug"
|
||||
${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 1 scsi_debug device for fault injection and 3 loopback devices
|
||||
# on top of which is layered raid0 (striped).
|
||||
#
|
||||
|
||||
SDSIZE=${SDSIZE:-256}
|
||||
SDHOSTS=${SDHOSTS:-1}
|
||||
SDTGTS=${SDTGTS:-1}
|
||||
SDLUNS=${SDLUNS:-1}
|
||||
LDMOD=/sbin/modprobe
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 $FILEDIR/file-vdev2"}
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_sd_utils
|
||||
|
||||
test `${LSMOD} | grep -c scsi_debug` -gt 0 && \
|
||||
(echo 0 >/sys/module/scsi_debug/parameters/every_nth && \
|
||||
${RMMOD} scsi_debug || exit 1)
|
||||
udev_trigger
|
||||
|
||||
msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} " \
|
||||
"add_host=${SDHOSTS} num_tgts=${SDTGTS} " \
|
||||
"max_luns=${SDLUNS}"
|
||||
${LDMOD} scsi_debug \
|
||||
dev_size_mb=${SDSIZE} \
|
||||
add_host=${SDHOSTS} \
|
||||
num_tgts=${SDTGTS} \
|
||||
max_luns=${SDLUNS} || \
|
||||
die "Error $? creating scsi_debug devices"
|
||||
udev_trigger
|
||||
|
||||
SDDEVICE=`${LSSCSI} | ${AWK} '/scsi_debug/ { print $6; exit }'`
|
||||
msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
|
||||
${PARTED} -s ${SDDEVICE} mklabel gpt || \
|
||||
(${RMMOD} scsi_debug && die "Error $? creating gpt label")
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || (${RMMOD} scsi_debug && \
|
||||
die "Error $? creating ${FILE}")
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || (${RMMOD} scsi_debug \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}")
|
||||
|
||||
DEVICES="${DEVICES} ${LODEVICE}"
|
||||
done
|
||||
|
||||
DEVICES="${DEVICES} ${SDDEVICE}"
|
||||
|
||||
msg "${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}"
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES} || \
|
||||
(${RMMOD} scsi_debug && exit 1)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} -d ${LODEVICE} ||
|
||||
die "Error $? destroying ${LODEVICE} using ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
|
||||
msg "${RMMOD} scsi_debug"
|
||||
${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 1 scsi_debug device for fault injection and 3 loopback devices
|
||||
# on top of which is layered raid10 (mirrored).
|
||||
#
|
||||
|
||||
SDSIZE=${SDSIZE:-256}
|
||||
SDHOSTS=${SDHOSTS:-1}
|
||||
SDTGTS=${SDTGTS:-1}
|
||||
SDLUNS=${SDLUNS:-1}
|
||||
LDMOD=/sbin/modprobe
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 $FILEDIR/file-vdev2"}
|
||||
DEVICES_M1=""
|
||||
DEVICES_M2=""
|
||||
|
||||
zpool_create() {
|
||||
local COUNT=0
|
||||
|
||||
check_loop_utils
|
||||
check_sd_utils
|
||||
|
||||
test `${LSMOD} | grep -c scsi_debug` -gt 0 && \
|
||||
(echo 0 >/sys/module/scsi_debug/parameters/every_nth && \
|
||||
${RMMOD} scsi_debug || exit 1)
|
||||
udev_trigger
|
||||
|
||||
msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} " \
|
||||
"add_host=${SDHOSTS} num_tgts=${SDTGTS} " \
|
||||
"max_luns=${SDLUNS}"
|
||||
${LDMOD} scsi_debug \
|
||||
dev_size_mb=${SDSIZE} \
|
||||
add_host=${SDHOSTS} \
|
||||
num_tgts=${SDTGTS} \
|
||||
max_luns=${SDLUNS} || \
|
||||
die "Error $? creating scsi_debug devices"
|
||||
udev_trigger
|
||||
SDDEVICE=`${LSSCSI}|${AWK} '/scsi_debug/ { print $6; exit }'`
|
||||
msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
|
||||
${PARTED} -s ${SDDEVICE} mklabel gpt || \
|
||||
(${RMMOD} scsi_debug && die "Error $? creating gpt label")
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || (${RMMOD} scsi_debug && \
|
||||
die "Error $? creating ${FILE}")
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || (${RMMOD} scsi_debug \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}")
|
||||
|
||||
DEVICES="${DEVICES} ${LODEVICE}"
|
||||
done
|
||||
|
||||
DEVICES="${DEVICES} ${SDDEVICE}"
|
||||
|
||||
for DEVICE in ${DEVICES}; do
|
||||
let COUNT=${COUNT}+1
|
||||
|
||||
if [ $((COUNT % 2)) -eq 0 ]; then
|
||||
DEVICES_M2="${DEVICES_M2} ${DEVICE}"
|
||||
else
|
||||
DEVICES_M1="${DEVICES_M1} ${DEVICE}"
|
||||
fi
|
||||
done
|
||||
|
||||
msg "${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} " \
|
||||
"mirror ${DEVICES_M1} mirror ${DEVICES_M2}"
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} \
|
||||
mirror ${DEVICES_M1} mirror ${DEVICES_M2} || \
|
||||
(${RMMOD} scsi_debug && exit 1)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} -d ${LODEVICE} ||
|
||||
die "Error $? destroying ${LODEVICE} using ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
|
||||
msg "${RMMOD} scsi_debug"
|
||||
${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 1 scsi_debug device for fault injection and 3 loopback devices
|
||||
# on top of which is layered raidz.
|
||||
#
|
||||
|
||||
SDSIZE=${SDSIZE:-256}
|
||||
SDHOSTS=${SDHOSTS:-1}
|
||||
SDTGTS=${SDTGTS:-1}
|
||||
SDLUNS=${SDLUNS:-1}
|
||||
LDMOD=/sbin/modprobe
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 $FILEDIR/file-vdev2"}
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_sd_utils
|
||||
|
||||
test `${LSMOD} | grep -c scsi_debug` -gt 0 && \
|
||||
(echo 0 >/sys/module/scsi_debug/parameters/every_nth && \
|
||||
${RMMOD} scsi_debug || exit 1)
|
||||
udev_trigger
|
||||
|
||||
msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} " \
|
||||
"add_host=${SDHOSTS} num_tgts=${SDTGTS} " \
|
||||
"max_luns=${SDLUNS}"
|
||||
${LDMOD} scsi_debug \
|
||||
dev_size_mb=${SDSIZE} \
|
||||
add_host=${SDHOSTS} \
|
||||
num_tgts=${SDTGTS} \
|
||||
max_luns=${SDLUNS} || \
|
||||
die "Error $? creating scsi_debug devices"
|
||||
udev_trigger
|
||||
|
||||
SDDEVICE=`${LSSCSI} | ${AWK} '/scsi_debug/ { print $6; exit }'`
|
||||
msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
|
||||
${PARTED} -s ${SDDEVICE} mklabel gpt || \
|
||||
(${RMMOD} scsi_debug && die "Error $? creating gpt label")
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || (${RMMOD} scsi_debug && \
|
||||
die "Error $? creating ${FILE}")
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || (${RMMOD} scsi_debug \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}")
|
||||
|
||||
DEVICES="${DEVICES} ${LODEVICE}"
|
||||
done
|
||||
|
||||
DEVICES="${DEVICES} ${SDDEVICE}"
|
||||
|
||||
msg "${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${DEVICES}"
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz ${DEVICES} || \
|
||||
(${RMMOD} scsi_debug && exit 1)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} -d ${LODEVICE} ||
|
||||
die "Error $? destroying ${LODEVICE} using ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
|
||||
msg "${RMMOD} scsi_debug"
|
||||
${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 1 scsi_debug device for fault injection and 3 loopback devices
|
||||
# on top of which is layered raidz2.
|
||||
#
|
||||
|
||||
SDSIZE=${SDSIZE:-256}
|
||||
SDHOSTS=${SDHOSTS:-1}
|
||||
SDTGTS=${SDTGTS:-1}
|
||||
SDLUNS=${SDLUNS:-1}
|
||||
LDMOD=/sbin/modprobe
|
||||
FILEDIR=${FILEDIR:-/var/tmp}
|
||||
FILES=${FILES:-"$FILEDIR/file-vdev0 $FILEDIR/file-vdev1 $FILEDIR/file-vdev2"}
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_sd_utils
|
||||
|
||||
test `${LSMOD} | grep -c scsi_debug` -gt 0 && \
|
||||
(echo 0 >/sys/module/scsi_debug/parameters/every_nth && \
|
||||
${RMMOD} scsi_debug || exit 1)
|
||||
udev_trigger
|
||||
|
||||
msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} " \
|
||||
"add_host=${SDHOSTS} num_tgts=${SDTGTS} " \
|
||||
"max_luns=${SDLUNS}"
|
||||
${LDMOD} scsi_debug \
|
||||
dev_size_mb=${SDSIZE} \
|
||||
add_host=${SDHOSTS} \
|
||||
num_tgts=${SDTGTS} \
|
||||
max_luns=${SDLUNS} || \
|
||||
die "Error $? creating scsi_debug devices"
|
||||
udev_trigger
|
||||
|
||||
SDDEVICE=`${LSSCSI} | ${AWK} '/scsi_debug/ { print $6; exit }'`
|
||||
msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
|
||||
${PARTED} -s ${SDDEVICE} mklabel gpt || \
|
||||
(${RMMOD} scsi_debug && die "Error $? creating gpt label")
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || (${RMMOD} scsi_debug && \
|
||||
die "Error $? creating ${FILE}")
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || (${RMMOD} scsi_debug \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}")
|
||||
|
||||
DEVICES="${DEVICES} ${LODEVICE}"
|
||||
done
|
||||
|
||||
DEVICES="${DEVICES} ${SDDEVICE}"
|
||||
|
||||
msg "${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${DEVICES}"
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz2 ${DEVICES} || \
|
||||
(${RMMOD} scsi_debug && exit 1)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} -d ${LODEVICE} ||
|
||||
die "Error $? destroying ${LODEVICE} using ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
|
||||
msg "${RMMOD} scsi_debug"
|
||||
${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 1 scsi_debug device for fault injection and 3 loopback devices
|
||||
# on top of which is layered raidz3.
|
||||
#
|
||||
|
||||
SDSIZE=${SDSIZE:-256}
|
||||
SDHOSTS=${SDHOSTS:-1}
|
||||
SDTGTS=${SDTGTS:-1}
|
||||
SDLUNS=${SDLUNS:-1}
|
||||
LDMOD=/sbin/modprobe
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2"
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
check_loop_utils
|
||||
check_sd_utils
|
||||
|
||||
test `${LSMOD} | grep -c scsi_debug` -gt 0 && \
|
||||
(echo 0 >/sys/module/scsi_debug/parameters/every_nth && \
|
||||
${RMMOD} scsi_debug || exit 1)
|
||||
udev_trigger
|
||||
|
||||
msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} " \
|
||||
"add_host=${SDHOSTS} num_tgts=${SDTGTS} " \
|
||||
"max_luns=${SDLUNS}"
|
||||
${LDMOD} scsi_debug \
|
||||
dev_size_mb=${SDSIZE} \
|
||||
add_host=${SDHOSTS} \
|
||||
num_tgts=${SDTGTS} \
|
||||
max_luns=${SDLUNS} || \
|
||||
die "Error $? creating scsi_debug devices"
|
||||
udev_trigger
|
||||
|
||||
SDDEVICE=`${LSSCSI} | ${AWK} '/scsi_debug/ { print $6; exit }'`
|
||||
msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
|
||||
${PARTED} -s ${SDDEVICE} mklabel gpt || \
|
||||
(${RMMOD} scsi_debug && die "Error $? creating gpt label")
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`unused_loop_device`
|
||||
|
||||
rm -f ${FILE} || exit 1
|
||||
dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256 \
|
||||
&>/dev/null || (${RMMOD} scsi_debug && \
|
||||
die "Error $? creating ${FILE}")
|
||||
|
||||
# Setup the loopback device on the file.
|
||||
msg "Creating ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} ${LODEVICE} ${FILE} || (${RMMOD} scsi_debug \
|
||||
die "Error $? creating ${LODEVICE} using ${FILE}")
|
||||
|
||||
DEVICES="${DEVICES} ${LODEVICE}"
|
||||
done
|
||||
|
||||
DEVICES="${DEVICES} ${SDDEVICE}"
|
||||
|
||||
msg "${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz3 ${DEVICES}"
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} raidz3 ${DEVICES} || \
|
||||
(${RMMOD} scsi_debug && exit 1)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
for FILE in ${FILES}; do
|
||||
LODEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
|
||||
msg "Removing ${LODEVICE} using ${FILE}"
|
||||
${LOSETUP} -d ${LODEVICE} ||
|
||||
die "Error $? destroying ${LODEVICE} using ${FILE}"
|
||||
rm -f ${FILE} || exit 1
|
||||
done
|
||||
|
||||
msg "${RMMOD} scsi_debug"
|
||||
${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Single disk /dev/sda Raid-0 Configuration
|
||||
#
|
||||
|
||||
DEVICES="/dev/sda"
|
||||
|
||||
zpool_create() {
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME} || exit 1
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Zpool Raid-0 Configuration
|
||||
#
|
||||
# This script is used to test with the /dev/disk/by-vdev/[A-Z][1-n] devices.
|
||||
# It assumes that you have already populated /dev/disk/by-vdev/ by creating
|
||||
# an /etc/zfs/vdev_id.conf file based on your system design.
|
||||
#
|
||||
# You can then use either the zpool-create.sh or the zpios.sh test script to
|
||||
# test various Raid-0 configurations by adjusting the following tunables.
|
||||
# For example if you wanted to create and test a single 4-disk Raid-0
|
||||
# configuration using disks [A-D]1 with dedicated ZIL and L2ARC devices
|
||||
# you could run the following.
|
||||
#
|
||||
# ZIL="log A2" L2ARC="cache B2" RANKS=1 CHANNELS=4 \
|
||||
# zpool-create.sh -c zpool-raid0
|
||||
#
|
||||
# zpool status tank
|
||||
# pool: tank
|
||||
# state: ONLINE
|
||||
# scan: none requested
|
||||
# config:
|
||||
#
|
||||
# NAME STATE READ WRITE CKSUM
|
||||
# tank ONLINE 0 0 0
|
||||
# A1 ONLINE 0 0 0
|
||||
# B1 ONLINE 0 0 0
|
||||
# C1 ONLINE 0 0 0
|
||||
# D1 ONLINE 0 0 0
|
||||
# logs
|
||||
# A2 ONLINE 0 0 0
|
||||
# cache
|
||||
# B2 ONLINE 0 0 0
|
||||
#
|
||||
# errors: No known data errors
|
||||
#
|
||||
|
||||
# Number of interior vdevs to create using the following rank ids.
|
||||
RANKS=${RANKS:-1}
|
||||
RANK_LIST=( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 )
|
||||
|
||||
# Number of devices per vdev using the following channel ids.
|
||||
CHANNELS=${CHANNELS:-8}
|
||||
CHANNEL_LIST=( A B C D E F G H I J K L M N O P Q R S T U V W X Y Z )
|
||||
|
||||
# Create a ZIL vdev as follows.
|
||||
ZIL=${ZIL:-}
|
||||
|
||||
# Create an L2ARC vdev as follows.
|
||||
L2ARC=${L2ARC:-}
|
||||
|
||||
|
||||
raid0_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
|
||||
RAID0S=()
|
||||
for (( i=0, k=0; i<${RANKS}; i++ )); do
|
||||
RANK=${RANK_LIST[$i]}
|
||||
|
||||
for (( j=0; j<${CHANNELS}; j++, k++ )); do
|
||||
RAID0S[${k}]="${CHANNEL_LIST[$j]}${RANK}"
|
||||
done
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
zpool_create() {
|
||||
raid0_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
ZPOOL_DEVICES="${RAID0S[*]} ${ZIL} ${L2ARC}"
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${ZPOOL_DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${ZPOOL_DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Zpool Raid-10 Configuration
|
||||
#
|
||||
# This script is used to test with the /dev/disk/by-vdev/[A-Z][1-n] devices.
|
||||
# It assumes that you have already populated /dev/disk/by-vdev/ by creating
|
||||
# an /etc/zfs/vdev_id.conf file based on your system design.
|
||||
#
|
||||
# You can then use either the zpool-create.sh or the zpios.sh test script to
|
||||
# test various Raid-10 configurations by adjusting the following tunables.
|
||||
# For example if you wanted to create and test a single 4-disk Raid-10
|
||||
# configuration using disks [A-D]1 with dedicated ZIL and L2ARC devices
|
||||
# you could run the following.
|
||||
#
|
||||
# ZIL="log A2" L2ARC="cache B2" RANKS=1 CHANNELS=4 \
|
||||
# zpool-create.sh -c zpool-raid10
|
||||
#
|
||||
# zpool status tank
|
||||
# pool: tank
|
||||
# state: ONLINE
|
||||
# scan: none requested
|
||||
# config:
|
||||
#
|
||||
# NAME STATE READ WRITE CKSUM
|
||||
# tank ONLINE 0 0 0
|
||||
# mirror-0 ONLINE 0 0 0
|
||||
# A1 ONLINE 0 0 0
|
||||
# B1 ONLINE 0 0 0
|
||||
# mirror-1 ONLINE 0 0 0
|
||||
# C1 ONLINE 0 0 0
|
||||
# D1 ONLINE 0 0 0
|
||||
# logs
|
||||
# A2 ONLINE 0 0 0
|
||||
# cache
|
||||
# B2 ONLINE 0 0 0
|
||||
#
|
||||
# errors: No known data errors
|
||||
#
|
||||
|
||||
# Number of interior vdevs to create using the following rank ids.
|
||||
RANKS=${RANKS:-1}
|
||||
RANK_LIST=( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 )
|
||||
|
||||
# Number of devices per vdev using the following channel ids.
|
||||
CHANNELS=${CHANNELS:-8}
|
||||
CHANNEL_LIST=( A B C D E F G H I J K L M N O P Q R S T U V W X Y Z )
|
||||
|
||||
# Create a ZIL vdev as follows.
|
||||
ZIL=${ZIL:-}
|
||||
|
||||
# Create an L2ARC vdev as follows.
|
||||
L2ARC=${L2ARC:-}
|
||||
|
||||
|
||||
raid10_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
local IDX=0
|
||||
|
||||
RAID10S=()
|
||||
for (( i=0, l=0 ; i<${RANKS}; i++ )); do
|
||||
RANK=${RANK_LIST[$i]}
|
||||
|
||||
for (( j=0, k=1; j<${CHANNELS}; j+=2,k+=2,l++ )); do
|
||||
DISK1="${CHANNEL_LIST[$j]}${RANK}"
|
||||
DISK2="${CHANNEL_LIST[$k]}${RANK}"
|
||||
RAID10S[$l]="mirror ${DISK1} ${DISK2}"
|
||||
done
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
zpool_create() {
|
||||
raid10_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
ZPOOL_DEVICES="${RAID10S[*]} ${ZIL} ${L2ARC}"
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${ZPOOL_DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${ZPOOL_DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Zpool Raid-Z Configuration
|
||||
#
|
||||
# This script is used to test with the /dev/disk/by-vdev/[A-Z][1-n] devices.
|
||||
# It assumes that you have already populated /dev/disk/by-vdev/ by creating
|
||||
# an /etc/zfs/vdev_id.conf file based on your system design.
|
||||
#
|
||||
# You can then use either the zpool-create.sh or the zpios.sh test script to
|
||||
# test various Raid-Z configurations by adjusting the following tunables.
|
||||
# For example if you wanted to create and test a single 4-disk Raid-Z2
|
||||
# configuration using disks [A-D]1 with dedicated ZIL and L2ARC devices
|
||||
# you could run the following.
|
||||
#
|
||||
# ZIL="log A2" L2ARC="cache B2" RANKS=1 CHANNELS=4 LEVEL=2 \
|
||||
# zpool-create.sh -c zpool-raidz
|
||||
#
|
||||
# zpool status tank
|
||||
# pool: tank
|
||||
# state: ONLINE
|
||||
# scan: none requested
|
||||
# config:
|
||||
#
|
||||
# NAME STATE READ WRITE CKSUM
|
||||
# tank ONLINE 0 0 0
|
||||
# raidz2-0 ONLINE 0 0 0
|
||||
# A1 ONLINE 0 0 0
|
||||
# B1 ONLINE 0 0 0
|
||||
# C1 ONLINE 0 0 0
|
||||
# D1 ONLINE 0 0 0
|
||||
# logs
|
||||
# A2 ONLINE 0 0 0
|
||||
# cache
|
||||
# B2 ONLINE 0 0 0
|
||||
#
|
||||
# errors: No known data errors
|
||||
#
|
||||
|
||||
# Number of interior vdevs to create using the following rank ids.
|
||||
RANKS=${RANKS:-1}
|
||||
RANK_LIST=( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 )
|
||||
|
||||
# Number of devices per vdev using the following channel ids.
|
||||
CHANNELS=${CHANNELS:-8}
|
||||
CHANNEL_LIST=( A B C D E F G H I J K L M N O P Q R S T U V W X Y Z )
|
||||
|
||||
# Raid-Z Level: 1, 2, or 3.
|
||||
LEVEL=${LEVEL:-2}
|
||||
|
||||
# Create a ZIL vdev as follows.
|
||||
ZIL=${ZIL:-}
|
||||
|
||||
# Create an L2ARC vdev as follows.
|
||||
L2ARC=${L2ARC:-}
|
||||
|
||||
|
||||
raidz_setup() {
|
||||
local RANKS=$1
|
||||
local CHANNELS=$2
|
||||
|
||||
RAIDZS=()
|
||||
for (( i=0; i<${RANKS}; i++ )); do
|
||||
RANK=${RANK_LIST[$i]}
|
||||
RAIDZ=("raidz${LEVEL}")
|
||||
|
||||
for (( j=0, k=1; j<${CHANNELS}; j++, k++ )); do
|
||||
RAIDZ[$k]="${CHANNEL_LIST[$j]}${RANK}"
|
||||
done
|
||||
|
||||
RAIDZS[$i]="${RAIDZ[*]}"
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
zpool_create() {
|
||||
raidz_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
ZPOOL_DEVICES="${RAIDZS[*]} ${ZIL} ${L2ARC}"
|
||||
msg ${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${ZPOOL_DEVICES}
|
||||
${ZPOOL} create ${ZPOOL_FLAGS} ${ZPOOL_NAME} ${ZPOOL_DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
basedir="$(dirname $0)"
|
||||
|
||||
SCRIPT_COMMON=common.sh
|
||||
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
|
||||
. "${basedir}/${SCRIPT_COMMON}"
|
||||
else
|
||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||
fi
|
||||
|
||||
PROG=zpool-create.sh
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
$0 [hvfxcp]
|
||||
|
||||
DESCRIPTION:
|
||||
Create one of several predefined zpool configurations.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-f Force everything
|
||||
-x Disable all zpool features
|
||||
-c Configuration for zpool
|
||||
-p Name for zpool
|
||||
-d Destroy zpool (default create)
|
||||
-l Additional zpool options
|
||||
-s Additional zfs options
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
check_config() {
|
||||
|
||||
if [ ! -f ${ZPOOL_CONFIG} ]; then
|
||||
local NAME=`basename ${ZPOOL_CONFIG} .sh`
|
||||
ERROR="Unknown config '${NAME}', available configs are:\n"
|
||||
|
||||
for CFG in `ls ${ZPOOLDIR}/ | grep ".sh"`; do
|
||||
local NAME=`basename ${CFG} .sh`
|
||||
ERROR="${ERROR}${NAME}\n"
|
||||
done
|
||||
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
ZPOOL_CONFIG=unknown
|
||||
ZPOOL_NAME=tank
|
||||
ZPOOL_DESTROY=
|
||||
ZPOOL_FLAGS=${ZPOOL_FLAGS:-""}
|
||||
ZPOOL_OPTIONS=""
|
||||
ZFS_OPTIONS=""
|
||||
|
||||
while getopts 'hvfxc:p:dl:s:' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
VERBOSE_FLAG="-v"
|
||||
;;
|
||||
f)
|
||||
FORCE=1
|
||||
ZPOOL_FLAGS="$ZPOOL_FLAGS -f"
|
||||
;;
|
||||
x)
|
||||
NO_FEATURES=1
|
||||
ZPOOL_FLAGS="$ZPOOL_FLAGS -d"
|
||||
;;
|
||||
c)
|
||||
ZPOOL_CONFIG=${ZPOOLDIR}/${OPTARG}.sh
|
||||
;;
|
||||
p)
|
||||
ZPOOL_NAME=${OPTARG}
|
||||
;;
|
||||
d)
|
||||
ZPOOL_DESTROY=1
|
||||
;;
|
||||
l)
|
||||
ZPOOL_OPTIONS=${OPTARG}
|
||||
;;
|
||||
s)
|
||||
ZFS_OPTIONS=${OPTARG}
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
fi
|
||||
|
||||
check_config || die "${ERROR}"
|
||||
. ${ZPOOL_CONFIG}
|
||||
|
||||
if [ ${ZPOOL_DESTROY} ]; then
|
||||
zpool_destroy
|
||||
else
|
||||
zpool_create
|
||||
|
||||
if [ "${ZPOOL_OPTIONS}" ]; then
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo
|
||||
echo "${ZPOOL} ${ZPOOL_OPTIONS} ${ZPOOL_NAME}"
|
||||
fi
|
||||
${ZPOOL} ${ZPOOL_OPTIONS} ${ZPOOL_NAME} || exit 1
|
||||
fi
|
||||
|
||||
if [ "${ZFS_OPTIONS}" ]; then
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo
|
||||
echo "${ZFS} ${ZFS_OPTIONS} ${ZPOOL_NAME}"
|
||||
fi
|
||||
${ZFS} ${ZFS_OPTIONS} ${ZPOOL_NAME} || exit 1
|
||||
fi
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo
|
||||
echo "zpool list"
|
||||
${ZPOOL} list || exit 1
|
||||
|
||||
echo
|
||||
echo "zpool status ${ZPOOL_NAME}"
|
||||
${ZPOOL} status ${ZPOOL_NAME} || exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user