[Frissítve] btrfs automatikus snapshot cronból

Igen tudom hogy ilyen már létezik. A snapper benne van alaptelepítésnél is az Ubuntuban

De mindig van egy de, mégpedig az, ahogy a snapper elhelyezi/elnevezi a snapshotokat, az nem kompatibilis a samba-val. nekem pedig most erre van szükségem.

....

[megosztott_dokumentumok]
	comment = dokumentumok megosztása
	path = /srv/samba/g-drive
#	username = balazs,istvan,rozsi,tercsi,fercsi,kata,klára
#	valid users = és valahány név van a naptárban
#	read list = nobody
#	write list = balazs, istvan, rozsi
	vfs objects = shadow_copy2
	shadow: snapdir = /srv/samba/g-drive/.snapstots
        shadow: basedir = /srv/samba/g-drive
	shadow: format = "@%Y.%m.%d-%H.%M.%S"
	shadow: sort = desc
	shadow: localtime = yes
	read only = No
	create mask = 0777
	guest ok = Yes
....

no persze nincs meg még teljesen, elsősorban a formátum nem stimmel még, mert egy régebbi fájlt szedtem elő, ahol az olvashatóság iránt nagyobb volt az igény.
most az a kérdés egyáltalán működni fog-e az átalakítások után :)


/$ mount | grep btrfs
/dev/sda5 on / type btrfs (rw,noatime,compress=lzo,ssd,discard,space_cache,subvolid=257,subvol=/@ROOT)
/dev/sda5 on /.snapshots type btrfs (rw,noatime,compress=lzo,ssd,discard,space_cache,subvolid=337,subvol=/@ROOT.snapshots)

/dev/sda5 on /usr type btrfs (rw,noatime,compress=lzo,ssd,discard,space_cache,subvolid=262,subvol=/@USR)
/dev/sda5 on /usr/.snapshots type btrfs (rw,noatime,compress=lzo,ssd,discard,space_cache,subvolid=338,subvol=/@USR.snapshots)
....

A snapshotok könyvtára nem egy a forrás könyvtár alatt létrehozott subvol, mint az látható.

:/$ ls -l .snapshots/
összesen 0
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_14
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_15
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_16
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_17
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_18
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_19
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_20
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-25_21
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_07
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_08
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_09
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_10
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_11
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_12
drwxr-xr-x 1 root root 298 aug   25 08:45 @2017-08-26_13

Egyenlőre ez az eredmény, de még csak 2 napja fut. több módosításon is átesett már tesztüzem közben.

no és ami az egészet létrehozta:
- mármint ez:) azaz egy új verzió -


#!/bin/sh
# filename /etc/cron.hourly/snapmaker[.sh]
# apostrophe - 2017. 08. 25. - 2017. 08. 27.

set -x

ENABLE=1

# snapshotok forrásai
SOURCES="/ /var /usr /mnt/EncryptedDRV"

SOURCE=""
DEST=""
SNAP=""

# honapok napok órák száma - érvényességi ideje
MAXMONTHS=3
MAXDAYS=7
MAXHOURS=10

# mindenképpen - 1 - csak változás esetén - 0 -
ALWAYS=0

# jenlen dátum másodperben
CDATE=$(date +%s)

CONFDIR="/etc/snapmaker"

#####################
#
# FUNKCIÓK
#
#####################

# snapsotok listája egy adott - $1 - könyvtárból
# -o           print only subvolumes below specified path
# -s           list snapshots only in the filesystem
sublist() { btrfs sub list -os "$1" 2>/dev/null | sed 's/^.*\(@[0-9]*.*\)$/\1/'; }

changes() {
    local sourcedir=$1
    local dest=$2
    local lastsnap
    local genid
    local ret=0    

    lastsnap="$(echo $(sublist ${dest} | sort -r) | cut -d " " -f 1 )"

    if [ "${lastsnap}" ]; then
        genid="$(btrfs sub find-new "${dest}/${lastsnap}" 9999999|cut -d " " -f 4)"
        echo "$(btrfs subvolume find-new "${sourcedir}" ${genid} | cut -d " " -f 17-1000 | sed '/^$/d'| wc -l)"
    else
        echo 1
        ret=1
    fi
    return ${ret}
}

# a snapshot létrehozása
mksnap() {
    local sourcedir=$1
    local destdir=$2
    local datep
    local snapname
    local filterdays
    local filtermonths
    
    # a létrehozandó snapsot neve
    datep="$(date '+%Y-%m-%d %H')"
    snapname="${destdir}/@$(echo ${datep} | tr " " "_")"
    
    filterdays=$(date +%Y-%m-%d -d "${datep}")
    filtermonths=$(date +%Y-%m -d "${datep}")

    if [ -e "${snapname}" ]; then
        return 0
    elif [ ${MAXHOURS} -gt 0 ]; then
        btrfs subvolume snapshot -r "${sourcedir}" "${snapname}"
    elif [ ${MAXDAYS} -gt 0 -a $(sublist ${destdir} | grep -c "^@${filterdays}") -eq 0 ]; then
        btrfs subvolume snapshot -r "${sourcedir}" "${snapname}"
    elif [ ${MAXMONTHS} -gt 0 -a $(sublist ${destdir} | grep -c "^@${filtermonths}") -eq 0 ]; then
        btrfs subvolume snapshot -r "${sourcedir}" "${snapname}"
    else
        return 1
    fi
}


snapmkr() {
    local i
    local y
    local sourcedir
    local destdir
    local maxmonths
    local maxdays

    [ -r "$1" ] && . "$1"
    
    # megörzendő snapshotok minimuma
    minsnapshots=$((${MAXHOURS}+(${MAXHOURS}/2)))

    maxmonths=$(($MAXMONTHS+1))
    maxdays=$(($MAXDAYS+1))

    for i in ${SOURCES}; do
    # a snapshot forrása
        sourcedir="${i}"
    # a snapshot célkönyvtára
        destdir="${sourcedir}/.snapshots"

#    # a létrehozandó snapsot neve
#    SNAP="@$(date +%Y-%m-%d_%H)"

    # ha nem létezik a forrás, v. a cél, új leosztás
        if ! (mountpoint -q "${sourcedir}" && (mountpoint -q "${destdir}" || btrfs subvolume show "${destdir}" > /dev/null 2>&1)); then
            continue
        fi

    # változás esetén
        if [ ${ALWAYS} -ge 1 ] || [ $(changes "${sourcedir}" "${destdir}") -ge 1 ]; then
    # az aktuális snapshot létrehozása
            mksnap "${sourcedir}" "${destdir}"
        fi
 
# ------------- snapsotok vizsgálata snapshotok listája alapján 

        for y in $(sublist ${destdir} | sort); do  

    # időközben 15-nél kevesebb lett nem törlünk
    # csak hogy ne törölje az összes snapshotot
    # hosszab kikapcsolt állapot után sem
            [ $(sublist ${destdir} | wc -l) -le "${minsnapshots}" ] && continue

    # snapshot névből - @2017-12-12_12 - détum - 2017-12-12 12[:00:00] -
            sdatep=$(echo "$y" | tr -d "@" | tr "_" " ")

#
#echo -------------- MONTHS ------
#

    # snapshot dátuma + maximálisan engedélyezett hónaponkénti snapshotok élettartama mésodpercekben
            sdate=$(date +%s -d "${sdatep} + ${maxmonths} months")
    # a jelenlegi dárum kissebb mit a maximális életteram akkor,
            if [ ${CDATE} -lt ${sdate} ]; then
    # a vizsgált snapshot dátuma napok nélkül            
                DDATE=$(date +%Y-%m- -d "${sdatep}")
    # hány darab van a vizsgát snapshotal egy hónapban? egy? -> ugrás az elejére
                [ $(sublist ${destdir} | grep -c "^@${DDATE}") -le 1 ] && continue
            fi

#
#echo -------------- DAYS ------
#

    # snapshot dátuma + maximálisan engedélyezett naponkénti snapshotok élettartama mésodpercekben
            sdate=$(date +%s -d "${sdatep} + ${maxdays} days")
    # a jelenlegi dárum kissebb mit a maximális életteram akkor,
            if [ ${CDATE} -lt ${sdate} ]; then
    # a vizsgált snapshot dátuma orák nélkül            
                DDATE=$(date +%Y-%m-%d -d "${sdatep}")
    # hány darab van a vizsgát snapshotal egy napon? egy? -> ugrás az elejére
                [ $(sublist ${destdir} | grep -c "^@${DDATE}") -le 1 ] && continue
            fi

#
#echo -------------- HOURS ------
#

    # snapshot dátuma + maximálisan engedélyezett óránkáni snapshotok élettartama mésodpercekben
            sdate=$(date +%s -d "${sdatep} + ${MAXHOURS} hours")
    # a jelenlegi dárum kissebb mit a maximális életteram -> ugrás az elejére
            [ ${CDATE} -lt ${sdate} ] && continue

#
#echo -------------- DELETE ------
#

    # a vizsgált snapshot törlése
            btrfs subvolume delete "${destdir}/$y"

        done

    done

}


#####################
#
# FŐPROGRAM
#
#####################

if [ -r "/etc/default/snapmaker" ]; then
    . "/etc/default/snapmaker"
else
    printf "# filename /etc/cron.hourly/snapmaker[.sh]\n" > "/etc/default/snapmaker"
    printf "# apostrophe - 2017. 08. 25. - 2017. 08. 27.\n" >> "/etc/default/snapmaker"
    printf "#\n\n" >> "/etc/default/snapmaker"
    printf "# set this to 0 to disable snapmaker, or to 1 to enable it\n" >> "/etc/default/snapmaker"
    printf "ENABLE=%s\n\n" ${ENABLE} >> "/etc/default/snapmaker"
    printf "# default paramerers for tests\n" >> "/etc/default/snapmaker"
    printf "SOURCES=\"/ /var /usr /mnt/EncryptedDRV\"\n" >> "/etc/default/snapmaker"
    printf "MAXMONTHS=3\n" >> "/etc/default/snapmaker"
    printf "MAXDAYS=7\n" >> "/etc/default/snapmaker"
    printf "MAXHOURS=10\n" >> "/etc/default/snapmaker"
    printf "ALWAYS=0\n" >> "/etc/default/snapmaker"
fi

[ ${ENABLE} -eq 0 ] && exit 0

mkdir -p ${CONFDIR}

#cat <<EOF > ${CONFDIR}/system.conf
#SOURCES="/ /var /usr /mnt/EncryptedDRV"
#MAXMONTHS=3
#MAXDAYS=7
#MAXHOURS=10
#ALWAYS=0
#EOF

for i in ${CONFDIR}/*.conf; do

    . "/etc/default/snapmaker"
    . "${CONFDIR}/*.conf"

    snapmkr $i        
done

#gedit

sz'al, most

  • kikapcsolható az /etc/default könyvtárból
  • több beállítófájl alkalmazható subvolumek csoportjaira
  • hosszabb üzemszünet után sem törli az összes snapshotot
  • csak akkor készül snapshot, ha az utolsó snapshot óta változás volt. állítható
    itt azért figyelni kell gyakori, de nem lényeges változásokra.
    pl a /tmp /var/tmp és egyéb könyvtárakra, és fájlokra

tippeket a szerkesztőségbe, sem kérek,
viszont ötleteket funkciókra igen :)

Hozzászólások