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