mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-04-06 17:49:11 +03:00
zimport.sh: Allow custom pool create options
Allow custom options to be passed to 'zpool create` when creating a new pool. Normally zimport.sh is intented to prevent accidentally introduced incompatibilities so we want the default behavior. However, when introducing a known incompatibility with a feature flag we need a way to disable the feature. By adding a line like the following to the commit message the feature can be disabled allowing the pool to be compatibile with older versions. TEST_ZIMPORT_CREATE_OPTIONS="-o feature@encryption=disabled" * Additionally fix /dev/nul -> /dev/null typo and minor white space formating issues. * Updated fail function to print a message and exit with 1 for use by the buildbot. * Silence warnings when zlib_inflate / zlib_default modules don't exist. This can happen when they're build in to the kernel. Reviewed-by: George Melikov <mail@gmelikov.ru> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #6520
This commit is contained in:
parent
9000a9fac9
commit
133a5c6598
@ -125,8 +125,13 @@ load_module() {
|
|||||||
load_modules() {
|
load_modules() {
|
||||||
mkdir -p /etc/zfs
|
mkdir -p /etc/zfs
|
||||||
|
|
||||||
modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null
|
if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then
|
||||||
modprobe "$KMOD_ZLIB_INFLATE" >/dev/null
|
modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if modinfo "$KMOD_ZLIB_INFLATE">/dev/null 2>&1; then
|
||||||
|
modprobe "$KMOD_ZLIB_INFLATE" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
|
for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
|
||||||
$KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
|
$KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
|
||||||
@ -167,6 +172,14 @@ unload_modules() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then
|
||||||
|
modprobe -r "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if modinfo "$KMOD_ZLIB_INFLATE">/dev/null 2>&1; then
|
||||||
|
modprobe -r "$KMOD_ZLIB_INFLATE" >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$VERBOSE" = "yes" ]; then
|
if [ "$VERBOSE" = "yes" ]; then
|
||||||
echo "Successfully unloaded ZFS module stack"
|
echo "Successfully unloaded ZFS module stack"
|
||||||
fi
|
fi
|
||||||
|
@ -62,8 +62,10 @@ else
|
|||||||
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
PROG=zimport.sh
|
||||||
SRC_TAGS="zfs-0.6.5.11 master"
|
SRC_TAGS="zfs-0.6.5.11 master"
|
||||||
POOL_TAGS="all master"
|
POOL_TAGS="all master"
|
||||||
|
POOL_CREATE_OPTIONS=
|
||||||
TEST_DIR=$(mktemp -u -d -p /var/tmp zimport.XXXXXXXX)
|
TEST_DIR=$(mktemp -u -d -p /var/tmp zimport.XXXXXXXX)
|
||||||
KEEP="no"
|
KEEP="no"
|
||||||
VERBOSE="no"
|
VERBOSE="no"
|
||||||
@ -86,7 +88,8 @@ COLOR_RESET="\033[0m"
|
|||||||
usage() {
|
usage() {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
USAGE:
|
USAGE:
|
||||||
zimport.sh [hvl] [-r repo] [-s src-tag] [-i pool-dir] [-p pool-tag] [-f path]
|
zimport.sh [hvl] [-r repo] [-s src-tag] [-i pool-dir] [-p pool-tag]
|
||||||
|
[-f path] [-o options]
|
||||||
|
|
||||||
DESCRIPTION:
|
DESCRIPTION:
|
||||||
ZPOOL import verification tests
|
ZPOOL import verification tests
|
||||||
@ -101,11 +104,12 @@ OPTIONS:
|
|||||||
-i <pool-dir> Pool image directory
|
-i <pool-dir> Pool image directory
|
||||||
-p <pool-tag>... Verify pools created with the listed tags
|
-p <pool-tag>... Verify pools created with the listed tags
|
||||||
-f <path> Temporary directory to use
|
-f <path> Temporary directory to use
|
||||||
|
-o <options> Additional options to pass to 'zpool create'
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
while getopts 'hvckr:s:i:p:f:?' OPTION; do
|
while getopts 'hvckr:s:i:p:f:o:?' OPTION; do
|
||||||
case $OPTION in
|
case $OPTION in
|
||||||
h)
|
h)
|
||||||
usage
|
usage
|
||||||
@ -135,9 +139,12 @@ while getopts 'hvckr:s:i:p:f:?' OPTION; do
|
|||||||
f)
|
f)
|
||||||
TEST_DIR="$OPTARG"
|
TEST_DIR="$OPTARG"
|
||||||
;;
|
;;
|
||||||
|
o)
|
||||||
|
POOL_CREATE_OPTIONS="$OPTARG"
|
||||||
|
;;
|
||||||
?)
|
?)
|
||||||
usage
|
usage
|
||||||
exit
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@ -205,9 +212,13 @@ fail_nonewline() {
|
|||||||
echo -n -e "${COLOR_RED}Fail${COLOR_RESET}\t\t"
|
echo -n -e "${COLOR_RED}Fail${COLOR_RESET}\t\t"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Log a failure message, cleanup, and return an error.
|
||||||
|
#
|
||||||
fail() {
|
fail() {
|
||||||
echo -e "${COLOR_RED}Fail${COLOR_RESET} ($1)"
|
echo -e "$PROG: $1" >&2
|
||||||
exit "$1"
|
$ZFS_SH -u >/dev/null 2>&1
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -278,35 +289,44 @@ pool_create() {
|
|||||||
cd "$POOL_DIR_SRC"
|
cd "$POOL_DIR_SRC"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$ZFS_SH zfs="spa_config_path=$POOL_DIR_PRISTINE" || fail 1
|
$ZFS_SH zfs="spa_config_path=$POOL_DIR_PRISTINE" || \
|
||||||
|
fail "Failed to load kmods"
|
||||||
|
|
||||||
# Create a file vdev RAIDZ pool.
|
# Create a file vdev RAIDZ pool.
|
||||||
truncate -s 1G \
|
truncate -s 1G \
|
||||||
"$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
|
"$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
|
||||||
"$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4"
|
"$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4" || \
|
||||||
$ZPOOL_CMD create "$POOL_TAG" raidz \
|
fail "Failed 'truncate -s 1G ...'"
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
$ZPOOL_CMD create $POOL_CREATE_OPTIONS "$POOL_TAG" raidz \
|
||||||
"$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
|
"$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
|
||||||
"$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4"
|
"$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4" || \
|
||||||
|
fail "Failed '$ZPOOL_CMD create $POOL_CREATE_OPTIONS $POOL_TAG ...'"
|
||||||
|
|
||||||
# Create a pool/fs filesystem with some random contents.
|
# Create a pool/fs filesystem with some random contents.
|
||||||
$ZFS_CMD create "$POOL_TAG/fs" || fail 3
|
$ZFS_CMD create "$POOL_TAG/fs" || \
|
||||||
|
fail "Failed '$ZFS_CMD create $POOL_TAG/fs'"
|
||||||
populate "/$POOL_TAG/fs/" 10 100
|
populate "/$POOL_TAG/fs/" 10 100
|
||||||
|
|
||||||
# Snapshot that filesystem, clone it, remove the files/dirs,
|
# Snapshot that filesystem, clone it, remove the files/dirs,
|
||||||
# replace them with new files/dirs.
|
# replace them with new files/dirs.
|
||||||
$ZFS_CMD snap "$POOL_TAG/fs@snap" || fail 4
|
$ZFS_CMD snap "$POOL_TAG/fs@snap" || \
|
||||||
$ZFS_CMD clone "$POOL_TAG/fs@snap" "$POOL_TAG/clone" || fail 5
|
fail "Failed '$ZFS_CMD snap $POOL_TAG/fs@snap'"
|
||||||
|
$ZFS_CMD clone "$POOL_TAG/fs@snap" "$POOL_TAG/clone" || \
|
||||||
|
fail "Failed '$ZFS_CMD clone $POOL_TAG/fs@snap $POOL_TAG/clone'"
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
rm -Rf /$POOL_TAG/clone/* || fail 6
|
rm -Rf /$POOL_TAG/clone/*
|
||||||
populate "/$POOL_TAG/clone/" 10 100
|
populate "/$POOL_TAG/clone/" 10 100
|
||||||
|
|
||||||
# Scrub the pool, delay slightly, then export it. It is now
|
# Scrub the pool, delay slightly, then export it. It is now
|
||||||
# somewhat interesting for testing purposes.
|
# somewhat interesting for testing purposes.
|
||||||
$ZPOOL_CMD scrub "$POOL_TAG" || fail 7
|
$ZPOOL_CMD scrub "$POOL_TAG" || \
|
||||||
|
fail "Failed '$ZPOOL_CMD scrub $POOL_TAG'"
|
||||||
sleep 10
|
sleep 10
|
||||||
$ZPOOL_CMD export "$POOL_TAG" || fail 8
|
$ZPOOL_CMD export "$POOL_TAG" || \
|
||||||
|
fail "Failed '$ZPOOL_CMD export $POOL_TAG'"
|
||||||
|
|
||||||
$ZFS_SH -u || fail 9
|
$ZFS_SH -u || fail "Failed to unload kmods"
|
||||||
}
|
}
|
||||||
|
|
||||||
# If the zfs-images directory doesn't exist fetch a copy from Github then
|
# If the zfs-images directory doesn't exist fetch a copy from Github then
|
||||||
@ -315,7 +335,8 @@ if [ ! -d "$IMAGES_DIR" ]; then
|
|||||||
IMAGES_DIR="$TEST_DIR/zfs-images"
|
IMAGES_DIR="$TEST_DIR/zfs-images"
|
||||||
mkdir -p "$IMAGES_DIR"
|
mkdir -p "$IMAGES_DIR"
|
||||||
curl -sL "$IMAGES_TAR" | \
|
curl -sL "$IMAGES_TAR" | \
|
||||||
tar -xz -C "$IMAGES_DIR" --strip-components=1 || fail 10
|
tar -xz -C "$IMAGES_DIR" --strip-components=1 || \
|
||||||
|
fail "Failed to download pool images"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Given the available images in the zfs-images directory substitute the
|
# Given the available images in the zfs-images directory substitute the
|
||||||
@ -341,6 +362,7 @@ if [ "$VERBOSE" = "yes" ]; then
|
|||||||
echo "SRC_TAGS=$SRC_TAGS"
|
echo "SRC_TAGS=$SRC_TAGS"
|
||||||
echo "POOL_TAGS=$POOL_TAGS"
|
echo "POOL_TAGS=$POOL_TAGS"
|
||||||
echo "PATH=$TEST_DIR"
|
echo "PATH=$TEST_DIR"
|
||||||
|
echo "POOL_CREATE_OPTIONS=$POOL_CREATE_OPTIONS"
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -363,8 +385,7 @@ for TAG in $SRC_TAGS; do
|
|||||||
if [ -n "$ZFS_VERSION" ]; then
|
if [ -n "$ZFS_VERSION" ]; then
|
||||||
printf "%-16s" "$ZFS_VERSION"
|
printf "%-16s" "$ZFS_VERSION"
|
||||||
else
|
else
|
||||||
echo -e "ZFS is not installed\n"
|
fail "ZFS is not installed"
|
||||||
fail
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printf "%-16s" "$TAG"
|
printf "%-16s" "$TAG"
|
||||||
@ -392,16 +413,17 @@ for TAG in $SRC_TAGS; do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
git archive --format=tar --prefix="$SPL_TAG/ $SPL_TAG" \
|
git archive --format=tar --prefix="$SPL_TAG/ $SPL_TAG" \
|
||||||
-o "$SRC_DIR_SPL/$SPL_TAG.tar" &>/dev/nul || \
|
-o "$SRC_DIR_SPL/$SPL_TAG.tar" &>/dev/null || \
|
||||||
rm "$SRC_DIR_SPL/$SPL_TAG.tar"
|
rm "$SRC_DIR_SPL/$SPL_TAG.tar"
|
||||||
if [ -s "$SRC_DIR_SPL/$SPL_TAG.tar" ]; then
|
if [ -s "$SRC_DIR_SPL/$SPL_TAG.tar" ]; then
|
||||||
tar -xf "$SRC_DIR_SPL/$SPL_TAG.tar" -C "$SRC_DIR_SPL"
|
tar -xf "$SRC_DIR_SPL/$SPL_TAG.tar" -C "$SRC_DIR_SPL"
|
||||||
rm "$SRC_DIR_SPL/$SPL_TAG.tar"
|
rm "$SRC_DIR_SPL/$SPL_TAG.tar"
|
||||||
echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
|
echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
|
||||||
else
|
else
|
||||||
mkdir -p "$SPL_DIR" || fail 1
|
mkdir -p "$SPL_DIR" || fail "Failed to create $SPL_DIR"
|
||||||
curl -sL "$SPL_URL" | tar -xz -C "$SPL_DIR" \
|
curl -sL "$SPL_URL" | tar -xz -C "$SPL_DIR" \
|
||||||
--strip-components=1 || fail 2
|
--strip-components=1 || \
|
||||||
|
fail "Failed to download $SPL_URL"
|
||||||
echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
|
echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -428,16 +450,17 @@ for TAG in $SRC_TAGS; do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
git archive --format=tar --prefix="$ZFS_TAG/ $ZFS_TAG" \
|
git archive --format=tar --prefix="$ZFS_TAG/ $ZFS_TAG" \
|
||||||
-o "$SRC_DIR_ZFS/$ZFS_TAG.tar" &>/dev/nul || \
|
-o "$SRC_DIR_ZFS/$ZFS_TAG.tar" &>/dev/null || \
|
||||||
rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
|
rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
|
||||||
if [ -s "$SRC_DIR_ZFS/$ZFS_TAG.tar" ]; then
|
if [ -s "$SRC_DIR_ZFS/$ZFS_TAG.tar" ]; then
|
||||||
tar -xf "$SRC_DIR_ZFS/$ZFS_TAG.tar" -C "$SRC_DIR_ZFS"
|
tar -xf "$SRC_DIR_ZFS/$ZFS_TAG.tar" -C "$SRC_DIR_ZFS"
|
||||||
rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
|
rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
|
||||||
echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
|
echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
|
||||||
else
|
else
|
||||||
mkdir -p "$ZFS_DIR" || fail 1
|
mkdir -p "$ZFS_DIR" || fail "Failed to create $ZFS_DIR"
|
||||||
curl -sL "$ZFS_URL" | tar -xz -C "$ZFS_DIR" \
|
curl -sL "$ZFS_URL" | tar -xz -C "$ZFS_DIR" \
|
||||||
--strip-components=1 || fail 2
|
--strip-components=1 || \
|
||||||
|
fail "Failed to download $ZFS_URL"
|
||||||
echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
|
echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -456,11 +479,14 @@ for TAG in $SRC_TAGS; do
|
|||||||
else
|
else
|
||||||
cd "$SPL_DIR"
|
cd "$SPL_DIR"
|
||||||
make distclean &>/dev/null
|
make distclean &>/dev/null
|
||||||
./autogen.sh >>"$CONFIG_LOG" 2>&1 || fail 1
|
./autogen.sh >>"$CONFIG_LOG" 2>&1 || \
|
||||||
|
fail "Failed SPL 'autogen.sh'"
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
./configure $CONFIG_OPTIONS >>"$CONFIG_LOG" 2>&1 || fail 2
|
./configure $CONFIG_OPTIONS >>"$CONFIG_LOG" 2>&1 || \
|
||||||
|
fail "Failed SPL 'configure $CONFIG_OPTIONS'"
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || fail 3
|
make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || \
|
||||||
|
fail "Failed SPL 'make $MAKE_OPTIONS'"
|
||||||
pass_nonewline
|
pass_nonewline
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -478,12 +504,15 @@ for TAG in $SRC_TAGS; do
|
|||||||
else
|
else
|
||||||
cd "$ZFS_DIR"
|
cd "$ZFS_DIR"
|
||||||
make distclean &>/dev/null
|
make distclean &>/dev/null
|
||||||
./autogen.sh >>"$CONFIG_LOG" 2>&1 || fail 1
|
./autogen.sh >>"$CONFIG_LOG" 2>&1 || \
|
||||||
|
fail "Failed ZFS 'autogen.sh'"
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
./configure --with-spl="$SPL_DIR" $CONFIG_OPTIONS \
|
./configure --with-spl="$SPL_DIR" $CONFIG_OPTIONS \
|
||||||
>>"$CONFIG_LOG" 2>&1 || fail 2
|
>>"$CONFIG_LOG" 2>&1 || \
|
||||||
|
fail "Failed ZFS 'configure $CONFIG_OPTIONS'"
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || fail 3
|
make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || \
|
||||||
|
fail "Failed ZFS 'make $MAKE_OPTIONS'"
|
||||||
pass_nonewline
|
pass_nonewline
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -503,7 +532,8 @@ for TAG in $POOL_TAGS; do
|
|||||||
# Use the existing compressed image if available.
|
# Use the existing compressed image if available.
|
||||||
if [ -f "$POOL_BZIP" ]; then
|
if [ -f "$POOL_BZIP" ]; then
|
||||||
tar -xjf "$POOL_BZIP" -C "$POOL_DIR_PRISTINE" \
|
tar -xjf "$POOL_BZIP" -C "$POOL_DIR_PRISTINE" \
|
||||||
--strip-components=1 || fail 1
|
--strip-components=1 || \
|
||||||
|
fail "Failed 'tar -xjf $POOL_BZIP"
|
||||||
# Use the installed version to create the pool.
|
# Use the installed version to create the pool.
|
||||||
elif [ "$TAG" = "installed" ]; then
|
elif [ "$TAG" = "installed" ]; then
|
||||||
pool_create "$TAG"
|
pool_create "$TAG"
|
||||||
@ -529,7 +559,8 @@ for TAG in $POOL_TAGS; do
|
|||||||
$ZFS_SH zfs="spa_config_path=$POOL_DIR_COPY"
|
$ZFS_SH zfs="spa_config_path=$POOL_DIR_COPY"
|
||||||
|
|
||||||
cp -a --sparse=always "$POOL_DIR_PRISTINE" \
|
cp -a --sparse=always "$POOL_DIR_PRISTINE" \
|
||||||
"$POOL_DIR_COPY" || fail 2
|
"$POOL_DIR_COPY" || \
|
||||||
|
fail "Failed to copy $POOL_DIR_PRISTINE to $POOL_DIR_COPY"
|
||||||
POOL_NAME=$($ZPOOL_CMD import -d "$POOL_DIR_COPY" | \
|
POOL_NAME=$($ZPOOL_CMD import -d "$POOL_DIR_COPY" | \
|
||||||
awk '/pool:/ { print $2; exit 0 }')
|
awk '/pool:/ { print $2; exit 0 }')
|
||||||
|
|
||||||
@ -539,13 +570,14 @@ for TAG in $POOL_TAGS; do
|
|||||||
fail_nonewline
|
fail_nonewline
|
||||||
ERROR=1
|
ERROR=1
|
||||||
else
|
else
|
||||||
$ZPOOL_CMD export "$POOL_NAME" || fail 3
|
$ZPOOL_CMD export "$POOL_NAME" || \
|
||||||
|
fail "Failed to export pool"
|
||||||
pass_nonewline
|
pass_nonewline
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -Rf "$POOL_DIR_COPY"
|
rm -Rf "$POOL_DIR_COPY"
|
||||||
|
|
||||||
$ZFS_SH -u || fail 4
|
$ZFS_SH -u || fail "Failed to unload kmods"
|
||||||
done
|
done
|
||||||
printf "\n"
|
printf "\n"
|
||||||
done
|
done
|
||||||
|
Loading…
Reference in New Issue
Block a user