From a384cd976a8cedad5035e2636c7fd05f6c8c9834 Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sun, 27 Nov 2016 03:19:19 +0300 Subject: [PATCH 1/4] Add bash wrapper Signed-off-by: Timofey Titovets --- scripts/beesd | 93 +++++++++++++++++++++++++++++++++++++++ scripts/beesd.conf.sample | 28 ++++++++++++ 2 files changed, 121 insertions(+) create mode 100755 scripts/beesd create mode 100644 scripts/beesd.conf.sample diff --git a/scripts/beesd b/scripts/beesd new file mode 100755 index 0000000..704c178 --- /dev/null +++ b/scripts/beesd @@ -0,0 +1,93 @@ +#!/bin/bash +# /usr/bin/beesd + +## Helpful functions +INFO(){ echo "INFO:" "$@"; } +ERRO(){ echo "ERROR:" "$@"; exit 1; } + +## Global vars +export BEESHOME BEESSTATUS +export WORK_DIR CONFIG_DIR +export CONFIG_FILE +export UUID AL16M + +readonly AL16M="$((16*1024*1024))" +readonly CONFIG_DIR=/etc/bees/ + +## Pre checks +{ + [ ! -d "$CONFIG_DIR" ] && ERRO "Missing: $CONFIG_DIR" + [ "$UID" == "0" ] || ERRO "Must be runned as root" +} + +command -v bees &> /dev/null || ERRO "Missing 'bees' command" + +## Parse args +UUID="$1" +case "$UUID" in + *-*-*-*-*) + FILE_CONFIG="" + for file in "$CONFIG_DIR"/*.conf; do + [ ! -f "$file" ] && continue + if grep -q "$UUID" "$file"; then + INFO "Find $UUID in $file, use as conf" + FILE_CONFIG="$file" + fi + done + [ ! -f "$FILE_CONFIG" ] && ERRO "No config for $UUID" + source "$FILE_CONFIG" + ;; + *) + echo "beesd " + exit 1 + ;; +esac + +INFO "Check: BTRFS UUID exists" +if [ ! -d "/sys/fs/btrfs/$UUID" ]; then + ERRO "Can't find BTRFS UUID: $UUID" +fi + +INFO "Check: Disk exists" +if [ ! -b "/dev/disk/by-uuid/$UUID" ]; then + ERRO "Missing disk: /dev/disk/by-uuid/$UUID" +fi + +INFO "WORK DIR: $WORK_DIR" +mkdir -p "$WORK_DIR" || exit 1 + +INFO "MOUNT DIR: $MNT_DIR" +mkdir -p "$MNT_DIR" || exit 1 + +umount_w(){ mountpoint -q "$1" && umount -l "$1"; } +force_umount(){ umount_w "$MNT_DIR"; } +trap force_umount SIGINT SIGTERM EXIT + +mount -osubvolid=5 /dev/disk/by-uuid/$UUID "$MNT_DIR" || exit 1 + +if [ ! -d "$BEESHOME" ]; then + INFO "Create subvol $BEESHOME for store bees data" + btrfs sub cre "$BEESHOME" +else + btrfs sub show "$BEESHOME" &> /dev/null || ERRO "$BEESHOME MUST BE A SUBVOL!" +fi + +# Check DB size +{ + DB_PATH="$BEESHOME/beeshash.dat" + touch "$DB_PATH" + OLD_SIZE="$(du -b "$DB_PATH" | sed 's/\t/ /g' | cut -d' ' -f1)" + NEW_SIZE="$DB_SIZE" + if (( "$NEW_SIZE"%AL16M > 0 )); then + ERRO "DB_SIZE Must be multiple of 16M" + fi + if (( "$OLD_SIZE" != "$NEW_SIZE" )); then + INFO "Resize db: $OLD_SIZE -> $NEW_SIZE" + [ -f "$BEESHOME/beescrawl.$UUID.dat" ] && rm "$BEESHOME/beescrawl.$UUID.dat" + truncate -s $NEW_SIZE $DB_PATH + fi + chmod 700 "$DB_PATH" +} + +bees $MNT_DIR +exit 0 diff --git a/scripts/beesd.conf.sample b/scripts/beesd.conf.sample new file mode 100644 index 0000000..17d5e93 --- /dev/null +++ b/scripts/beesd.conf.sample @@ -0,0 +1,28 @@ +## Config for Bees: /etc/bees/beesd.conf.sample +## https://github.com/Zygo/bees +## It's a default values, change it, if needed + +# Which FS will be used +UUID=5d3c0ad5-bedf-463d-8235-b4d4f6f99476 + +## System Vars +# Change carefully +WORK_DIR=/run/bees/ +MNT_DIR="$WORK_DIR/mnt/$UUID" +BEESHOME="$MNT_DIR/.beeshome" +BEESSTATUS="$WORK_DIR/$UUID.status" + +## Bees DB size +# Hash Table Sizing +# sHash table entries are 16 bytes each +# (64-bit hash, 52-bit block number, and some metadata bits) +# Each entry represents a minimum of 4K on disk. +# unique data size hash table size average dedup block size +# 1TB 4GB 4K +# 1TB 1GB 16K +# 1TB 256MB 64K +# 1TB 16MB 1024K +# 64TB 1GB 1024K +# +# Size MUST be power of 16M +DB_SIZE=$((64*$AL16M)) # 1G in bytes From 03c116c3f14bf6b1e5d03d2f1369d3f7dc6f6844 Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sun, 27 Nov 2016 03:19:31 +0300 Subject: [PATCH 2/4] Add Systemd service for bash wrapper Signed-off-by: Timofey Titovets --- scripts/beesd@.service | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 scripts/beesd@.service diff --git a/scripts/beesd@.service b/scripts/beesd@.service new file mode 100644 index 0000000..da73864 --- /dev/null +++ b/scripts/beesd@.service @@ -0,0 +1,14 @@ +[Unit] +Description=Bees - Best-Effort Extent-Same, a btrfs deduplicator daemon: %i +After=local-fs.target + +[Service] +ExecStart=/usr/bin/beesd %i +Nice=19 +IOSchedulingClass=idle +CPUAccounting=true +MemoryAccounting=true +# CPUQuota=95% + +[Install] +WantedBy=local-fs.target From bf4e31ae71825f71267483b7b1e9eaa9886cedee Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sun, 27 Nov 2016 06:23:42 +0300 Subject: [PATCH 3/4] Add default values to vars Signed-off-by: Timofey Titovets --- scripts/beesd | 6 ++++++ scripts/beesd.conf.sample | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/beesd b/scripts/beesd index 704c178..05f5c2f 100755 --- a/scripts/beesd +++ b/scripts/beesd @@ -43,6 +43,12 @@ case "$UUID" in ;; esac +WORK_DIR="${WORK_DIR:-/run/bees/}" +MNT_DIR="${MNT_DIR:-$WORK_DIR/mnt/$UUID}" +BEESHOME="${BEESHOME:-$MNT_DIR/.beeshome}" +BEESSTATUS="${BEESSTATUS:-$WORK_DIR/$UUID.status}" +DB_SIZE="${DB_SIZE:-$((64*AL16M))}" + INFO "Check: BTRFS UUID exists" if [ ! -d "/sys/fs/btrfs/$UUID" ]; then ERRO "Can't find BTRFS UUID: $UUID" diff --git a/scripts/beesd.conf.sample b/scripts/beesd.conf.sample index 17d5e93..29bdda4 100644 --- a/scripts/beesd.conf.sample +++ b/scripts/beesd.conf.sample @@ -7,10 +7,10 @@ UUID=5d3c0ad5-bedf-463d-8235-b4d4f6f99476 ## System Vars # Change carefully -WORK_DIR=/run/bees/ -MNT_DIR="$WORK_DIR/mnt/$UUID" -BEESHOME="$MNT_DIR/.beeshome" -BEESSTATUS="$WORK_DIR/$UUID.status" +# WORK_DIR=/run/bees/ +# MNT_DIR="$WORK_DIR/mnt/$UUID" +# BEESHOME="$MNT_DIR/.beeshome" +# BEESSTATUS="$WORK_DIR/$UUID.status" ## Bees DB size # Hash Table Sizing @@ -25,4 +25,4 @@ BEESSTATUS="$WORK_DIR/$UUID.status" # 64TB 1GB 1024K # # Size MUST be power of 16M -DB_SIZE=$((64*$AL16M)) # 1G in bytes +# DB_SIZE=$((64*$AL16M)) # 1G in bytes From 606d48acc1576a7dedf79ad844a118e902e14a1f Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Mon, 28 Nov 2016 08:23:50 +0300 Subject: [PATCH 4/4] Add option to make mnt path shorter in logs Signed-off-by: Timofey Titovets --- scripts/beesd | 9 ++++++++- scripts/beesd.conf.sample | 3 +++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/beesd b/scripts/beesd index 05f5c2f..f2185b1 100755 --- a/scripts/beesd +++ b/scripts/beesd @@ -4,6 +4,7 @@ ## Helpful functions INFO(){ echo "INFO:" "$@"; } ERRO(){ echo "ERROR:" "$@"; exit 1; } +YN(){ [[ "$1" =~ (1|Y|y) ]]; } ## Global vars export BEESHOME BEESSTATUS @@ -48,6 +49,7 @@ MNT_DIR="${MNT_DIR:-$WORK_DIR/mnt/$UUID}" BEESHOME="${BEESHOME:-$MNT_DIR/.beeshome}" BEESSTATUS="${BEESSTATUS:-$WORK_DIR/$UUID.status}" DB_SIZE="${DB_SIZE:-$((64*AL16M))}" +LOG_SHORT_PATH="${LOG_SHORT_PATH:-N}" INFO "Check: BTRFS UUID exists" if [ ! -d "/sys/fs/btrfs/$UUID" ]; then @@ -95,5 +97,10 @@ fi chmod 700 "$DB_PATH" } -bees $MNT_DIR +if YN "$LOG_SHORT_PATH"; then + cd "$MNT_DIR" || exit 1 + bees . +else + bees "$MNT_DIR" +fi exit 0 diff --git a/scripts/beesd.conf.sample b/scripts/beesd.conf.sample index 29bdda4..c41e275 100644 --- a/scripts/beesd.conf.sample +++ b/scripts/beesd.conf.sample @@ -12,6 +12,9 @@ UUID=5d3c0ad5-bedf-463d-8235-b4d4f6f99476 # BEESHOME="$MNT_DIR/.beeshome" # BEESSTATUS="$WORK_DIR/$UUID.status" +## Make path shorter in logs +# LOG_SHORT_PATH=N + ## Bees DB size # Hash Table Sizing # sHash table entries are 16 bytes each