1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#!/bin/sh
# Requires: dm-writeboost-dkms stress-ng
# If not started as root, should allow sudo without password
# Size of test volumes in GB
B_SIZE=10
C_SIZE=4
# Names for loop files and mount point
B_NAME="backing-$$.img"
C_NAME="cache-$$.img"
M_NAME="wbmnt-$$"
DoCleanup() {
if [ "$(mount|grep $M_NAME)" != "" ]; then
echo "II: Unmounting $M_NAME..."
sudo umount $M_NAME
fi
if [ -d $M_NAME ]; then
echo "II: Removing mount directory..."
rmdir $M_NAME
fi
if [ "$(sudo dmsetup ls|grep ^wbtgt)" != "" ]; then
echo "II: Deleting dm-writeboost target..."
sudo dmsetup remove wbtgt
fi
DEVNAME=$(losetup -j $C_NAME | cut -d: -f1)
if [ "$DEVNAME" != "" ]; then
echo "II: Detaching $DEVNAME..."
sudo losetup -d $DEVNAME
fi
DEVNAME=$(losetup -j $B_NAME | cut -d: -f1)
if [ "$DEVNAME" != "" ]; then
echo "II: Detaching $DEVNAME..."
sudo losetup -d $DEVNAME
fi
echo "II: Deleting file images..."
rm -f $B_NAME $C_NAME
}
FailAbort() {
echo "FAILED!"
DoCleanup
echo "EE: FAIL"
exit 1
}
# Want to fit both image files (+1G safety margin) into current path
AVAIL=$(df -BG --output=avail .|tail -1|tr -d ' G')
echo -n "II: Checking for $(($B_SIZE + $C_SIZE + 1))G available disk space...$AVAIL..."
if [ $AVAIL -lt $(($B_SIZE + $C_SIZE + 1)) ]; then
echo "SKIP"
exit 77
fi
echo "OK"
CPU_NUM=$(getconf _NPROCESSORS_ONLN)
echo -n "II: Checking for 8 available CPUs...$CPU_NUM..."
if [ $CPU_NUM -lt 8 ]; then
echo "SKIP"
exit 77
fi
echo "OK"
echo "II: Creating loop files:"
echo -n "II: - $B_NAME..."
fallocate -l ${B_SIZE}G ${B_NAME} || FailAbort
echo "OK"
echo -n "II: - $C_NAME..."
fallocate -l ${C_SIZE}G ${C_NAME} || FailAbort
echo "OK"
echo "II: Connecting to loop devices:"
B_DEV=$(losetup -f)
echo -n "II: - $B_NAME -> $B_DEV..."
sudo losetup $B_DEV $B_NAME || FailAbort
echo "OK"
C_DEV=$(losetup -f)
echo -n "II: - $C_NAME -> $C_DEV..."
sudo losetup $C_DEV $C_NAME || FailAbort
echo "OK"
echo -n "II: Initialize cache..."
sudo dd if=/dev/zero of=$C_DEV oflag=direct bs=1M count=1 status=none || \
FailAbort
echo "OK"
if ! lsmod | grep -q dm.writeboost; then
echo -n "II: Loading dm-writeboost module..."
sudo modprobe dm-writeboost || FailAbort
echo "OK"
fi
SIZE=$(sudo blockdev --getsize $B_DEV)
echo -n "II: Creating dm-writeboost logical device..."
sudo dmsetup create wbtgt \
--table "0 $SIZE writeboost $B_DEV $C_DEV" || FailAbort
echo "OK"
echo -n "II: Creating mount-point..."
mkdir $M_NAME || FailAbort
echo "OK"
echo -n "II: Create filesystem on dm-writeboost target..."
sudo mkfs.ext4 /dev/mapper/wbtgt >/dev/null 2>&1 || FailAbort
echo "OK"
echo -n "II: Mounting dm-writeboost target to $M_NAME..."
sudo mount /dev/mapper/wbtgt $M_NAME || FailAbort
echo "OK"
echo "II: Testing..."
if [ $CPU_NUM -gt 8 ]; then
CPU_NUM=8
fi
HDD_SIZE=$((8 / $CPU_NUM))
(
cd $M_NAME
sudo stress-ng --timeout=5m --hdd=$CPU_NUM --verify --hdd-opts=wr-rnd \
--hdd-bytes=${HDD_SIZE}g
) 2>&1 || FailAbort
DoCleanup
echo "PASS"
exit 0
|