mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-21 18:26:47 +03:00
Add build system
Add autoconf style build infrastructure to the ZFS tree. This includes autogen.sh, configure.ac, m4 macros, some scripts/*, and makefiles for all the core ZFS components.
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
nobase_pkglibexec_SCRIPTS = common.sh
|
||||
nobase_pkglibexec_SCRIPTS += zconfig.sh
|
||||
nobase_pkglibexec_SCRIPTS += zfs.sh
|
||||
nobase_pkglibexec_SCRIPTS += zpool-create.sh
|
||||
nobase_pkglibexec_SCRIPTS += zpool-config/*
|
||||
EXTRA_DIST = zfs-update.sh $(nobase_pkglibexec_SCRIPTS)
|
||||
|
||||
ZFS=${top_srcdir}/scripts/zfs.sh
|
||||
ZCONFIG=${top_srcdir}/scripts/zconfig.sh
|
||||
ZTEST=${top_builddir}/cmd/ztest/ztest
|
||||
|
||||
check:
|
||||
@echo
|
||||
@echo -n "===================================="
|
||||
@echo -n " ZTEST "
|
||||
@echo "===================================="
|
||||
@echo
|
||||
@$(ZFS)
|
||||
@$(ZTEST) -V
|
||||
@$(ZFS) -u
|
||||
@echo
|
||||
@echo
|
||||
@echo -n "==================================="
|
||||
@echo -n " ZCONFIG "
|
||||
@echo "==================================="
|
||||
@echo
|
||||
@$(ZCONFIG)
|
||||
@echo
|
||||
@@ -0,0 +1,373 @@
|
||||
#!/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=.script-config
|
||||
if [ -f "${basedir}/../${SCRIPT_CONFIG}" ]; then
|
||||
. "${basedir}/../${SCRIPT_CONFIG}"
|
||||
else
|
||||
MODULES=(zlib_deflate spl splat zavl znvpair zunicode zcommon zfs)
|
||||
fi
|
||||
|
||||
PROG="<define PROG>"
|
||||
CLEANUP=
|
||||
VERBOSE=
|
||||
VERBOSE_FLAG=
|
||||
FORCE=
|
||||
FORCE_FLAG=
|
||||
DUMP_LOG=
|
||||
ERROR=
|
||||
RAID0S=()
|
||||
RAID10S=()
|
||||
RAIDZS=()
|
||||
RAIDZ2S=()
|
||||
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libexecdir=@libexecdir@
|
||||
pkglibexecdir=${libexecdir}/@PACKAGE@
|
||||
bindir=@bindir@
|
||||
sbindir=@sbindir@
|
||||
|
||||
ETCDIR=${ETCDIR:-/etc}
|
||||
DEVDIR=${DEVDIR:-/dev/disk/zpool}
|
||||
ZPOOLDIR=${ZPOOLDIR:-${pkglibexecdir}/zpool-config}
|
||||
|
||||
ZDB=${ZDB:-${sbindir}/zdb}
|
||||
ZFS=${ZFS:-${sbindir}/zfs}
|
||||
ZINJECT=${ZINJECT:-${sbindir}/zinject}
|
||||
ZPOOL=${ZPOOL:-${sbindir}/zpool}
|
||||
ZPOOL_ID=${ZPOOL_ID:-${bindir}/zpool_id}
|
||||
ZTEST=${ZTEST:-${sbindir}/ztest}
|
||||
|
||||
COMMON_SH=${COMMON_SH:-${pkglibexecdir}/common.sh}
|
||||
ZFS_SH=${ZFS_SH:-${pkglibexecdir}/zfs.sh}
|
||||
ZPOOL_CREATE_SH=${ZPOOL_CREATE_SH:-${pkglibexecdir}/zpool-create.sh}
|
||||
|
||||
LDMOD=${LDMOD:-/sbin/modprobe}
|
||||
LSMOD=${LSMOD:-/sbin/lsmod}
|
||||
RMMOD=${RMMOD:-/sbin/rmmod}
|
||||
INFOMOD=${INFOMOD:-/sbin/modinfo}
|
||||
LOSETUP=${LOSETUP:-/sbin/losetup}
|
||||
SYSCTL=${SYSCTL:-/sbin/sysctl}
|
||||
UDEVADM=${UDEVADM:-/sbin/udevadm}
|
||||
AWK=${AWK:-/usr/bin/awk}
|
||||
|
||||
die() {
|
||||
echo -e "${PROG}: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
msg() {
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
pass() {
|
||||
echo "PASS"
|
||||
}
|
||||
|
||||
fail() {
|
||||
echo "FAIL ($1)"
|
||||
exit $1
|
||||
}
|
||||
|
||||
spl_dump_log() {
|
||||
${SYSCTL} -w kernel.spl.debug.dump=1 &>/dev/null
|
||||
local NAME=`dmesg | tail -n 1 | cut -f5 -d' '`
|
||||
${SPLBUILD}/cmd/spl ${NAME} >${NAME}.log
|
||||
echo
|
||||
echo "Dumped debug log: ${NAME}.log"
|
||||
tail -n1 ${NAME}.log
|
||||
echo
|
||||
return 0
|
||||
}
|
||||
|
||||
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} $* || ERROR="Failed to load $1" return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
load_modules() {
|
||||
mkdir -p /etc/zfs
|
||||
|
||||
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
|
||||
|
||||
if [ "${DUMP_LOG}" -a ${NAME} = "spl" ]; then
|
||||
spl_dump_log
|
||||
fi
|
||||
|
||||
unload_module ${MOD} || return 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${VERBOSE} ]; then
|
||||
echo "Successfully unloaded ZFS module stack"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
unused_loop_device() {
|
||||
for DEVICE in `ls -1 /dev/loop*`; do
|
||||
${LOSETUP} ${DEVICE} &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo ${DEVICE}
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
die "Error: Unable to find unused loopback device"
|
||||
}
|
||||
|
||||
#
|
||||
# This can be slightly dangerous because the loop devices we are
|
||||
# cleanup 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' 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/ { system("losetup -d "$1) }' ${TMP_FILE}
|
||||
${AWK} -F" " '/zpool/ { system("rm -f "$3) }' ${TMP_FILE}
|
||||
|
||||
rm -f ${TMP_FILE}
|
||||
}
|
||||
|
||||
#
|
||||
# The following udev helper functions assume that the provided
|
||||
# udev rules file will create a /dev/disk/zpool/<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 contruct symlinks in tree to
|
||||
# the proper devices. Symlinks are installed for all entires
|
||||
# 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}
|
||||
|
||||
if [ -f ${UDEVADM} ]; then
|
||||
${UDEVADM} trigger
|
||||
${UDEVADM} settle
|
||||
else
|
||||
/sbin/udevtrigger
|
||||
/sbin/udevsettle
|
||||
fi
|
||||
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
|
||||
}
|
||||
Executable
+572
@@ -0,0 +1,572 @@
|
||||
#!/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=zconfig.sh
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
$0 [hvc]
|
||||
|
||||
DESCRIPTION:
|
||||
ZFS/ZPOOL configuration tests
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-c Cleanup lo+file devices at start
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
while getopts 'hvc?' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
;;
|
||||
c)
|
||||
CLEANUP=1
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
fi
|
||||
|
||||
# Perform pre-cleanup is requested
|
||||
if [ ${CLEANUP} ]; then
|
||||
cleanup_loop_devices
|
||||
rm -f /tmp/zpool.cache.*
|
||||
fi
|
||||
|
||||
zconfig_partition() {
|
||||
local DEVICE=$1
|
||||
local START=$2
|
||||
local END=$3
|
||||
local TMP_FILE=`mktemp`
|
||||
|
||||
/sbin/sfdisk -q ${DEVICE} << EOF &>${TMP_FILE} || fail 4
|
||||
${START},${END}
|
||||
;
|
||||
;
|
||||
;
|
||||
EOF
|
||||
|
||||
rm ${TMP_FILE}
|
||||
}
|
||||
|
||||
# Validate persistent zpool.cache configuration.
|
||||
zconfig_test1() {
|
||||
local POOL_NAME=test1
|
||||
local TMP_FILE1=`mktemp`
|
||||
local TMP_FILE2=`mktemp`
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 1 - persistent zpool.cache: "
|
||||
|
||||
# Create a pool save its status for comparison.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZPOOL} status ${POOL_NAME} >${TMP_FILE1} || fail 3
|
||||
|
||||
# Unload/load the module stack and verify the pool persists.
|
||||
${ZFS_SH} -u || fail 4
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 5
|
||||
${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 6
|
||||
cmp ${TMP_FILE1} ${TMP_FILE2} || fail 7
|
||||
|
||||
# Cleanup the test pool and temporary files
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 8
|
||||
rm -f ${TMP_FILE1} ${TMP_FILE2} ${TMP_CACHE} || fail 9
|
||||
${ZFS_SH} -u || fail 10
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test1
|
||||
|
||||
# Validate ZFS disk scanning and import w/out zpool.cache configuration.
|
||||
zconfig_test2() {
|
||||
local POOL_NAME=test2
|
||||
local TMP_FILE1=`mktemp`
|
||||
local TMP_FILE2=`mktemp`
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 2 - scan disks for pools to import: "
|
||||
|
||||
# Create a pool save its status for comparison.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZPOOL} status ${POOL_NAME} >${TMP_FILE1} || fail 3
|
||||
|
||||
# Unload the module stack, remove the cache file, load the module
|
||||
# stack and attempt to probe the disks to import the pool. As
|
||||
# a cross check verify the old pool state against the imported.
|
||||
${ZFS_SH} -u || fail 4
|
||||
rm -f ${TMP_CACHE} || fail 5
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 6
|
||||
${ZPOOL} import | grep ${POOL_NAME} >/dev/null || fail 7
|
||||
${ZPOOL} import ${POOL_NAME} || fail 8
|
||||
${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 9
|
||||
cmp ${TMP_FILE1} ${TMP_FILE2} || fail 10
|
||||
|
||||
# Cleanup the test pool and temporary files
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 11
|
||||
rm -f ${TMP_FILE1} ${TMP_FILE2} || fail 12
|
||||
${ZFS_SH} -u || fail 13
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test2
|
||||
|
||||
zconfig_zvol_device_stat() {
|
||||
local EXPECT=$1
|
||||
local POOL_NAME=/dev/$2
|
||||
local ZVOL_NAME=/dev/$3
|
||||
local SNAP_NAME=/dev/$4
|
||||
local CLONE_NAME=/dev/$5
|
||||
local COUNT=0
|
||||
|
||||
# Briefly delay for udev
|
||||
sleep 1
|
||||
|
||||
# Pool exists
|
||||
stat ${POOL_NAME} &>/dev/null && let COUNT=$COUNT+1
|
||||
|
||||
# Volume and partitions
|
||||
stat ${ZVOL_NAME} &>/dev/null && let COUNT=$COUNT+1
|
||||
stat ${ZVOL_NAME}1 &>/dev/null && let COUNT=$COUNT+1
|
||||
stat ${ZVOL_NAME}2 &>/dev/null && let COUNT=$COUNT+1
|
||||
|
||||
# Snapshot with partitions
|
||||
stat ${SNAP_NAME} &>/dev/null && let COUNT=$COUNT+1
|
||||
stat ${SNAP_NAME}1 &>/dev/null && let COUNT=$COUNT+1
|
||||
stat ${SNAP_NAME}2 &>/dev/null && let COUNT=$COUNT+1
|
||||
|
||||
# Clone with partitions
|
||||
stat ${CLONE_NAME} &>/dev/null && let COUNT=$COUNT+1
|
||||
stat ${CLONE_NAME}1 &>/dev/null && let COUNT=$COUNT+1
|
||||
stat ${CLONE_NAME}2 &>/dev/null && let COUNT=$COUNT+1
|
||||
|
||||
if [ $EXPECT -ne $COUNT ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# zpool import/export device check
|
||||
# (1 volume, 2 partitions, 1 snapshot, 1 clone)
|
||||
zconfig_test3() {
|
||||
local POOL_NAME=tank
|
||||
local ZVOL_NAME=volume
|
||||
local SNAP_NAME=snap
|
||||
local CLONE_NAME=clone
|
||||
local FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME}
|
||||
local FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME}
|
||||
local FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME}
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 3 - zpool import/export device: "
|
||||
|
||||
# Create a pool, volume, partition, snapshot, and clone.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZFS} create -V 100M ${FULL_ZVOL_NAME} || fail 3
|
||||
zconfig_partition /dev/${FULL_ZVOL_NAME} 0 64 || fail 4
|
||||
${ZFS} snapshot ${FULL_SNAP_NAME} || fail 5
|
||||
${ZFS} clone ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 6
|
||||
|
||||
# Verify the devices were created
|
||||
zconfig_zvol_device_stat 10 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 7
|
||||
|
||||
# Export the pool
|
||||
${ZPOOL} export ${POOL_NAME} || fail 8
|
||||
|
||||
# verify the devices were removed
|
||||
zconfig_zvol_device_stat 0 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 9
|
||||
|
||||
# Import the pool, wait 1 second for udev
|
||||
${ZPOOL} import ${POOL_NAME} || fail 10
|
||||
|
||||
# Verify the devices were created
|
||||
zconfig_zvol_device_stat 10 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 11
|
||||
|
||||
# Destroy the pool and consequently the devices
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 12
|
||||
|
||||
# verify the devices were removed
|
||||
zconfig_zvol_device_stat 0 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 13
|
||||
|
||||
${ZFS_SH} -u || fail 14
|
||||
rm -f ${TMP_CACHE} || fail 15
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test3
|
||||
|
||||
# zpool insmod/rmmod device check (1 volume, 1 snapshot, 1 clone)
|
||||
zconfig_test4() {
|
||||
POOL_NAME=tank
|
||||
ZVOL_NAME=volume
|
||||
SNAP_NAME=snap
|
||||
CLONE_NAME=clone
|
||||
FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME}
|
||||
FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME}
|
||||
FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME}
|
||||
TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 4 - zpool insmod/rmmod device: "
|
||||
|
||||
# Create a pool, volume, snapshot, and clone
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZFS} create -V 100M ${FULL_ZVOL_NAME} || fail 3
|
||||
zconfig_partition /dev/${FULL_ZVOL_NAME} 0 64 || fail 4
|
||||
${ZFS} snapshot ${FULL_SNAP_NAME} || fail 5
|
||||
${ZFS} clone ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 6
|
||||
|
||||
# Verify the devices were created
|
||||
zconfig_zvol_device_stat 10 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 7
|
||||
|
||||
# Unload the modules
|
||||
${ZFS_SH} -u || fail 8
|
||||
|
||||
# Verify the devices were removed
|
||||
zconfig_zvol_device_stat 0 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 9
|
||||
|
||||
# Load the modules, wait 1 second for udev
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 10
|
||||
|
||||
# Verify the devices were created
|
||||
zconfig_zvol_device_stat 10 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 11
|
||||
|
||||
# Destroy the pool and consequently the devices
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 12
|
||||
|
||||
# Verify the devices were removed
|
||||
zconfig_zvol_device_stat 0 ${POOL_NAME} ${FULL_ZVOL_NAME} \
|
||||
${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 13
|
||||
|
||||
${ZFS_SH} -u || fail 14
|
||||
rm -f ${TMP_CACHE} || fail 15
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test4
|
||||
|
||||
# ZVOL volume sanity check
|
||||
zconfig_test5() {
|
||||
local POOL_NAME=tank
|
||||
local ZVOL_NAME=fish
|
||||
local FULL_NAME=${POOL_NAME}/${ZVOL_NAME}
|
||||
local SRC_DIR=/bin/
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 5 - zvol+ext3 volume: "
|
||||
|
||||
# Create a pool and volume.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZFS} create -V 400M ${FULL_NAME} || fail 3
|
||||
|
||||
# Partition the volume, for a 400M volume there will be
|
||||
# 812 cylinders, 16 heads, and 63 sectors per track.
|
||||
zconfig_partition /dev/${FULL_NAME} 0 812
|
||||
|
||||
# Format the partition with ext3.
|
||||
/sbin/mkfs.ext3 -q /dev/${FULL_NAME}1 || fail 5
|
||||
|
||||
# Mount the ext3 filesystem and copy some data to it.
|
||||
mkdir -p /tmp/${ZVOL_NAME}1 || fail 6
|
||||
mount /dev/${FULL_NAME}1 /tmp/${ZVOL_NAME}1 || fail 7
|
||||
cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME}1 || fail 8
|
||||
sync
|
||||
|
||||
# Verify the copied files match the original files.
|
||||
diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}1${SRC_DIR} &>/dev/null || fail 9
|
||||
|
||||
# Remove the files, umount, destroy the volume and pool.
|
||||
rm -Rf /tmp/${ZVOL_NAME}1${SRC_DIR}* || fail 10
|
||||
umount /tmp/${ZVOL_NAME}1 || fail 11
|
||||
rmdir /tmp/${ZVOL_NAME}1 || fail 12
|
||||
|
||||
${ZFS} destroy ${FULL_NAME} || fail 13
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 14
|
||||
${ZFS_SH} -u || fail 15
|
||||
rm -f ${TMP_CACHE} || fail 16
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test5
|
||||
|
||||
# ZVOL snapshot sanity check
|
||||
zconfig_test6() {
|
||||
local POOL_NAME=tank
|
||||
local ZVOL_NAME=fish
|
||||
local SNAP_NAME=pristine
|
||||
local FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME}
|
||||
local FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME}
|
||||
local SRC_DIR=/bin/
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 6 - zvol+ext2 snapshot: "
|
||||
|
||||
# Create a pool and volume.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZFS} create -V 400M ${FULL_ZVOL_NAME} || fail 3
|
||||
|
||||
# Partition the volume, for a 400M volume there will be
|
||||
# 812 cylinders, 16 heads, and 63 sectors per track.
|
||||
zconfig_partition /dev/${FULL_ZVOL_NAME} 0 812
|
||||
|
||||
# Format the partition with ext2 (no journal).
|
||||
/sbin/mkfs.ext2 -q /dev/${FULL_ZVOL_NAME}1 || fail 5
|
||||
|
||||
# Mount the ext3 filesystem and copy some data to it.
|
||||
mkdir -p /tmp/${ZVOL_NAME}1 || fail 6
|
||||
mount /dev/${FULL_ZVOL_NAME}1 /tmp/${ZVOL_NAME}1 || fail 7
|
||||
|
||||
# Snapshot the pristine ext2 filesystem and mount it read-only.
|
||||
${ZFS} snapshot ${FULL_SNAP_NAME} && sleep 1 || fail 8
|
||||
mkdir -p /tmp/${SNAP_NAME}1 || fail 9
|
||||
mount /dev/${FULL_SNAP_NAME}1 /tmp/${SNAP_NAME}1 &>/dev/null || fail 10
|
||||
|
||||
# Copy to original volume
|
||||
cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME}1 || fail 11
|
||||
sync
|
||||
|
||||
# Verify the copied files match the original files,
|
||||
# and the copied files do NOT appear in the snapshot.
|
||||
diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}1${SRC_DIR} &>/dev/null || fail 12
|
||||
diff -ur ${SRC_DIR} /tmp/${SNAP_NAME}1${SRC_DIR} &>/dev/null && fail 13
|
||||
|
||||
# umount, destroy the snapshot, volume, and pool.
|
||||
umount /tmp/${SNAP_NAME}1 || fail 14
|
||||
rmdir /tmp/${SNAP_NAME}1 || fail 15
|
||||
${ZFS} destroy ${FULL_SNAP_NAME} || fail 16
|
||||
|
||||
umount /tmp/${ZVOL_NAME}1 || fail 17
|
||||
rmdir /tmp/${ZVOL_NAME}1 || fail 18
|
||||
${ZFS} destroy ${FULL_ZVOL_NAME} || fail 19
|
||||
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 20
|
||||
${ZFS_SH} -u || fail 21
|
||||
rm -f ${TMP_CACHE} || fail 22
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test6
|
||||
|
||||
# ZVOL clone sanity check
|
||||
zconfig_test7() {
|
||||
local POOL_NAME=tank
|
||||
local ZVOL_NAME=fish
|
||||
local SNAP_NAME=pristine
|
||||
local CLONE_NAME=clone
|
||||
local FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME}
|
||||
local FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME}
|
||||
local FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME}
|
||||
local SRC_DIR=/bin/
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
echo -n "test 7 - zvol+ext2 clone: "
|
||||
|
||||
# Create a pool and volume.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZFS} create -V 400M ${FULL_ZVOL_NAME} || fail 3
|
||||
|
||||
# Partition the volume, for a 400M volume there will be
|
||||
# 812 cylinders, 16 heads, and 63 sectors per track.
|
||||
zconfig_partition /dev/${FULL_ZVOL_NAME} 0 812
|
||||
|
||||
# Format the partition with ext2 (no journal).
|
||||
/sbin/mkfs.ext2 -q /dev/${FULL_ZVOL_NAME}1 || fail 5
|
||||
|
||||
# Mount the ext3 filesystem and copy some data to it.
|
||||
mkdir -p /tmp/${ZVOL_NAME}1 || fail 6
|
||||
mount /dev/${FULL_ZVOL_NAME}1 /tmp/${ZVOL_NAME}1 || fail 7
|
||||
|
||||
# Snapshot the pristine ext2 filesystem and mount it read-only.
|
||||
${ZFS} snapshot ${FULL_SNAP_NAME} && sleep 1 || fail 8
|
||||
mkdir -p /tmp/${SNAP_NAME}1 || fail 9
|
||||
mount /dev/${FULL_SNAP_NAME}1 /tmp/${SNAP_NAME}1 &>/dev/null || fail 10
|
||||
|
||||
# Copy to original volume.
|
||||
cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME}1 || fail 11
|
||||
sync
|
||||
|
||||
# Verify the copied files match the original files,
|
||||
# and the copied files do NOT appear in the snapshot.
|
||||
diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}1${SRC_DIR} &>/dev/null || fail 12
|
||||
diff -ur ${SRC_DIR} /tmp/${SNAP_NAME}1${SRC_DIR} &>/dev/null && fail 13
|
||||
|
||||
# Clone from the original pristine snapshot
|
||||
${ZFS} clone ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} && sleep 1 || fail 14
|
||||
mkdir -p /tmp/${CLONE_NAME}1 || fail 15
|
||||
mount /dev/${FULL_CLONE_NAME}1 /tmp/${CLONE_NAME}1 || fail 16
|
||||
|
||||
# Verify the clone matches the pristine snapshot,
|
||||
# and the files copied to the original volume are NOT there.
|
||||
diff -ur /tmp/${SNAP_NAME}1 /tmp/${CLONE_NAME}1 &>/dev/null || fail 17
|
||||
diff -ur /tmp/${ZVOL_NAME}1 /tmp/${CLONE_NAME}1 &>/dev/null && fail 18
|
||||
|
||||
# Copy to cloned volume.
|
||||
cp -RL ${SRC_DIR} /tmp/${CLONE_NAME}1 || fail 19
|
||||
sync
|
||||
|
||||
# Verify the clone matches the modified original volume.
|
||||
diff -ur /tmp/${ZVOL_NAME}1 /tmp/${CLONE_NAME}1 &>/dev/null || fail 20
|
||||
|
||||
# umount, destroy the snapshot, volume, and pool.
|
||||
umount /tmp/${CLONE_NAME}1 || fail 21
|
||||
rmdir /tmp/${CLONE_NAME}1 || fail 22
|
||||
${ZFS} destroy ${FULL_CLONE_NAME} || fail 23
|
||||
|
||||
umount /tmp/${SNAP_NAME}1 || fail 24
|
||||
rmdir /tmp/${SNAP_NAME}1 || fail 25
|
||||
${ZFS} destroy ${FULL_SNAP_NAME} || fail 26
|
||||
|
||||
umount /tmp/${ZVOL_NAME}1 || fail 27
|
||||
rmdir /tmp/${ZVOL_NAME}1 || fail 28
|
||||
${ZFS} destroy ${FULL_ZVOL_NAME} || fail 29
|
||||
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 30
|
||||
${ZFS_SH} -u || fail 31
|
||||
rm -f ${TMP_CACHE} || fail 32
|
||||
|
||||
pass
|
||||
}
|
||||
zconfig_test7
|
||||
|
||||
# Send/Receive sanity check
|
||||
test_8() {
|
||||
local POOL_NAME1=tank1
|
||||
local POOL_NAME2=tank2
|
||||
local ZVOL_NAME=fish
|
||||
local SNAP_NAME=snap
|
||||
local FULL_ZVOL_NAME1=${POOL_NAME1}/${ZVOL_NAME}
|
||||
local FULL_ZVOL_NAME2=${POOL_NAME2}/${ZVOL_NAME}
|
||||
local FULL_SNAP_NAME1=${POOL_NAME1}/${ZVOL_NAME}@${SNAP_NAME}
|
||||
local FULL_SNAP_NAME2=${POOL_NAME2}/${ZVOL_NAME}@${SNAP_NAME}
|
||||
local SRC_DIR=/bin/
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
|
||||
# Create two pools and a volume
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME1} -c lo-raidz2 || fail 2
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME2} -c lo-raidz2 || fail 3
|
||||
${ZFS} create -V 400M ${FULL_ZVOL_NAME1} || fail 4
|
||||
|
||||
# Partition the volume, for a 400M volume there will be
|
||||
# 812 cylinders, 16 heads, and 63 sectors per track.
|
||||
zconfig_partition /dev/${FULL_ZVOL_NAME1} 0 812
|
||||
|
||||
# Format the partition with ext2.
|
||||
/sbin/mkfs.ext2 -q /dev/${FULL_ZVOL_NAME1}1 || fail 5
|
||||
|
||||
# Mount the ext3 filesystem and copy some data to it.
|
||||
mkdir -p /tmp/${FULL_ZVOL_NAME1}1 || fail 6
|
||||
mount /dev/${FULL_ZVOL_NAME1}1 /tmp/${FULL_ZVOL_NAME1}1 || fail 7
|
||||
cp -RL ${SRC_DIR} /tmp/${FULL_ZVOL_NAME1}1 || fail 8
|
||||
sync || fail 9
|
||||
|
||||
# Snapshot the ext3 filesystem so it may be sent.
|
||||
${ZFS} snapshot ${FULL_SNAP_NAME1} && sleep 1 || fail 11
|
||||
|
||||
# Send/receive the snapshot from POOL_NAME1 to POOL_NAME2
|
||||
(${ZFS} send ${FULL_SNAP_NAME1} | \
|
||||
${ZFS} receive ${FULL_ZVOL_NAME2}) && sleep 1 || fail 12
|
||||
|
||||
# Mount the sent ext3 filesystem.
|
||||
mkdir -p /tmp/${FULL_ZVOL_NAME2}1 || fail 13
|
||||
mount /dev/${FULL_ZVOL_NAME2}1 /tmp/${FULL_ZVOL_NAME2}1 || fail 14
|
||||
|
||||
# Verify the contents of the volumes match
|
||||
diff -ur /tmp/${FULL_ZVOL_NAME1}1 /tmp/${FULL_ZVOL_NAME2}1 \
|
||||
&>/dev/null || fail 15
|
||||
|
||||
# Umount, destroy the volume and pool.
|
||||
umount /tmp/${FULL_ZVOL_NAME1}1 || fail 16
|
||||
umount /tmp/${FULL_ZVOL_NAME2}1 || fail 17
|
||||
rmdir /tmp/${FULL_ZVOL_NAME1}1 || fail 18
|
||||
rmdir /tmp/${FULL_ZVOL_NAME2}1 || fail 19
|
||||
rmdir /tmp/${POOL_NAME1} || fail 20
|
||||
rmdir /tmp/${POOL_NAME2} || fail 21
|
||||
|
||||
${ZFS} destroy ${FULL_SNAP_NAME1} || fail 22
|
||||
${ZFS} destroy ${FULL_SNAP_NAME2} || fail 23
|
||||
${ZFS} destroy ${FULL_ZVOL_NAME1} || fail 24
|
||||
${ZFS} destroy ${FULL_ZVOL_NAME2} || fail 25
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME1} -c lo-raidz2 -d || fail 26
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME2} -c lo-raidz2 -d || fail 27
|
||||
${ZFS_SH} -u || fail 28
|
||||
rm -f ${TMP_CACHE} || fail 29
|
||||
|
||||
pass
|
||||
}
|
||||
run_test 8 "zfs send/receive"
|
||||
|
||||
# zpool event sanity check
|
||||
test_9() {
|
||||
local POOL_NAME=tank
|
||||
local ZVOL_NAME=fish
|
||||
local FULL_NAME=${POOL_NAME}/${ZVOL_NAME}
|
||||
local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
|
||||
local TMP_EVENTS=`mktemp -p /tmp zpool.events.XXXXXXXX`
|
||||
|
||||
# Create a pool and volume.
|
||||
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2
|
||||
${ZFS} create -V 400M ${FULL_NAME} || fail 3
|
||||
|
||||
# Dump the events, there should be at least 5 lines.
|
||||
${ZPOOL} events >${TMP_EVENTS} || fail 4
|
||||
EVENTS=`wc -l ${TMP_EVENTS} | cut -f1 -d' '`
|
||||
[ $EVENTS -lt 5 ] && fail 5
|
||||
|
||||
# Clear the events and ensure there are none.
|
||||
${ZPOOL} events -c >/dev/null || fail 6
|
||||
${ZPOOL} events >${TMP_EVENTS} || fail 7
|
||||
EVENTS=`wc -l ${TMP_EVENTS} | cut -f1 -d' '`
|
||||
[ $EVENTS -gt 1 ] && fail 8
|
||||
|
||||
${ZFS} destroy ${FULL_NAME} || fail 9
|
||||
${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 10
|
||||
${ZFS_SH} -u || fail 11
|
||||
rm -f ${TMP_CACHE} || fail 12
|
||||
rm -f ${TMP_EVENTS} || fail 13
|
||||
|
||||
pass
|
||||
}
|
||||
run_test 9 "zpool events"
|
||||
|
||||
exit 0
|
||||
|
||||
Executable
+74
@@ -0,0 +1,74 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# A simple script to simply the loading/unloading the ZFS module stack.
|
||||
|
||||
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=zfs.sh
|
||||
UNLOAD=
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
USAGE:
|
||||
$0 [hvud] [module-options]
|
||||
|
||||
DESCRIPTION:
|
||||
Load/unload the ZFS module stack.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-u Unload modules
|
||||
-d Save debug log on unload
|
||||
|
||||
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"
|
||||
$0 spl="spl_debug_mask=0"
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
while getopts 'hvud' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
;;
|
||||
u)
|
||||
UNLOAD=1
|
||||
;;
|
||||
d)
|
||||
DUMP_LOG=1
|
||||
;;
|
||||
?)
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $(id -u) != 0 ]; then
|
||||
die "Must run as root"
|
||||
fi
|
||||
|
||||
if [ ${UNLOAD} ]; then
|
||||
unload_modules
|
||||
else
|
||||
check_modules || die "${ERROR}"
|
||||
load_modules "$@"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,60 @@
|
||||
#!/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 ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} \
|
||||
${DEVICES} || (zpool_dm_destroy && exit 4)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
zpool_dm_destroy
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Dragon (White Box) Raid-0 Configuration (1x70)
|
||||
#
|
||||
|
||||
RANKS=7
|
||||
CHANNELS=10
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
udev_raid0_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Dragon (White Box) Raid-10 Configuration (35x2(1+1))
|
||||
#
|
||||
|
||||
RANKS=7
|
||||
CHANNELS=10
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
udev_raid10_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Dragon (White Box) Raid-Z Configuration (7x10(9+1))
|
||||
#
|
||||
|
||||
RANKS=7
|
||||
CHANNELS=10
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
udev_raidz_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Dragon (White Box) Raid-Z2 Configuration (7x10(8+2))
|
||||
#
|
||||
|
||||
RANKS=7
|
||||
CHANNELS=10
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
udev_raidz2_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.dragon.example
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-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 ${FORCE_FLAG} ${ZPOOL_NAME} ${FILES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${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
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-10 Configuration
|
||||
#
|
||||
|
||||
FILES_M1="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1"
|
||||
FILES_M2="/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-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 ${FORCE_FLAG} ${ZPOOL_NAME} \
|
||||
mirror ${FILES_M1} mirror ${FILES_M2}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${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
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-Z Configuration
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-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 ${FORCE_FLAG} ${ZPOOL_NAME} raidz ${FILES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${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
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 File Raid-Z2 Configuration
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-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 ${FORCE_FLAG} ${ZPOOL_NAME} raidz2 ${FILES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${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
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Single disk /dev/hda Raid-0 Configuration
|
||||
#
|
||||
|
||||
DEVICES="/dev/hda"
|
||||
|
||||
zpool_create() {
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME} || exit 1
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-vdev3"
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
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 ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILES_M1="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1"
|
||||
FILES_M2="/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-vdev3"
|
||||
FILES="${FILES_M1} ${FILES_M2}"
|
||||
DEVICES_M1=""
|
||||
DEVICES_M2=""
|
||||
|
||||
zpool_create() {
|
||||
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 ${FORCE_FLAG} ${ZPOOL_NAME} \
|
||||
mirror ${DEVICES_M1} mirror ${DEVICES_M2}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} \
|
||||
mirror ${DEVICES_M1} mirror ${DEVICES_M2}
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-vdev3"
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
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 ${FORCE_FLAG} ${ZPOOL_NAME} raidz ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} raidz ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 4 Device Loopback Raid-0 Configuration
|
||||
#
|
||||
|
||||
FILES="/tmp/zpool-vdev0 \
|
||||
/tmp/zpool-vdev1 \
|
||||
/tmp/zpool-vdev2 \
|
||||
/tmp/zpool-vdev3"
|
||||
DEVICES=""
|
||||
|
||||
zpool_create() {
|
||||
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 ${FORCE_FLAG} ${ZPOOL_NAME} raidz2 ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} raidz2 ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#!/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 ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} \
|
||||
${DEVICES} || (zpool_md_destroy && exit 2)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
zpool_md_destroy
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#!/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 ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} \
|
||||
${DEVICES} || (zpool_md_destroy && exit 2)
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
|
||||
zpool_md_destroy
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Single ram disk /dev/ram0 Raid-0 Configuration
|
||||
#
|
||||
|
||||
DEVICES="/dev/ram0"
|
||||
|
||||
zpool_create() {
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME} || exit 1
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Single disk /dev/sda Raid-0 Configuration
|
||||
#
|
||||
|
||||
DEVICES="/dev/sda"
|
||||
|
||||
zpool_create() {
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${DEVICES} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME} || exit 1
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Supermicro (White Box) Raid-0 Configuration (1x16)
|
||||
#
|
||||
|
||||
RANKS=4
|
||||
CHANNELS=4
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
udev_raid0_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Supermicro (White Box) Raid-10 Configuration (8x2(1+1))
|
||||
#
|
||||
|
||||
RANKS=4
|
||||
CHANNELS=4
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
udev_raid10_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Supermicro (White Box) Raid-Z Configuration (4x4(3+1))
|
||||
#
|
||||
|
||||
RANKS=4
|
||||
CHANNELS=4
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
udev_raidz_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Supermicro (White Box) Raid-Z2 Configuration (4x4(2+2))
|
||||
#
|
||||
|
||||
RANKS=4
|
||||
CHANNELS=4
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
udev_raidz2_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.supermicro.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Sun Fire x4550 (Thumper/Thor) Raid-0 Configuration (1x48)
|
||||
#
|
||||
|
||||
RANKS=8
|
||||
CHANNELS=6
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
udev_raid0_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID0S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Sun Fire x4550 (Thumper/Thor) Raid-10 Configuration (24x2(1+1))
|
||||
#
|
||||
|
||||
RANKS=8
|
||||
CHANNELS=6
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
udev_raid10_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAID10S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Sun Fire x4550 (Thumper/Thor) Raid-Z Configuration (8x6(5+1))
|
||||
#
|
||||
|
||||
RANKS=8
|
||||
CHANNELS=6
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
udev_raidz_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZS[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Sun Fire x4550 (Thumper/Thor) Raid-Z Configuration (8x6(4+2))
|
||||
#
|
||||
|
||||
RANKS=8
|
||||
CHANNELS=6
|
||||
|
||||
zpool_create() {
|
||||
udev_setup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
udev_raidz2_setup ${RANKS} ${CHANNELS}
|
||||
|
||||
msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]}
|
||||
${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} ${RAIDZ2S[*]} || exit 1
|
||||
}
|
||||
|
||||
zpool_destroy() {
|
||||
msg ${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
${ZPOOL} destroy ${ZPOOL_NAME}
|
||||
udev_cleanup ${ETCDIR}/zfs/zdev.conf.x4550.example
|
||||
}
|
||||
Executable
+133
@@ -0,0 +1,133 @@
|
||||
#!/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 [hvcp]
|
||||
|
||||
DESCRIPTION:
|
||||
Create one of several predefined zpool configurations.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-v Verbose
|
||||
-f Force everything
|
||||
-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_OPTIONS=""
|
||||
ZFS_OPTIONS=""
|
||||
|
||||
while getopts 'hvfc:p:dl:s:' OPTION; do
|
||||
case $OPTION in
|
||||
h)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
v)
|
||||
VERBOSE=1
|
||||
VERBOSE_FLAG="-v"
|
||||
;;
|
||||
f)
|
||||
FORCE=1
|
||||
FORCE_FLAG="-f"
|
||||
;;
|
||||
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