FreeBSD8系统下对UFS filesystem做snapshot

1. 在 crontab 定期做 snapshot

### UFS snapshot

0    1      *       *       *       root    /usr/local/sbin/snapshot make -g7 /SRCPATH:Daily

0      2      *       *       1       root    /usr/local/sbin/snapshot make -g4 /SRCPATH:Weekly

2. 挂载 UFS snapshot 的 shell script

#!/usr/local/bin/bash

PATH=$PATH

CHKPARA=0

if [ -n “$1” ]; then

        SSSRCPATH=”$1″

        shift

else

        CHKPARA=1

fi

if [ -n “$1” ]; then

        SnapshotName=”$1″

        shift

else

        CHKPARA=1

fi

if [ -n “$1” ]; then

        MountPath=”$1″

        shift

else

        CHKPARA=1

fi

if [ $CHKPARA -eq 1 ]; then

        echo “Usage: $0 Snapshot_Src_Path SnapshotName MountPath”

        echo “Example: $0 /:Weekly.0 /mnt”

        exit 1

else

        echo “Try to mount $SSSRCPATH:$SnapshotName to $MountPath now.”

fi

MC=`df -h |grep $MountPath |wc -l`

if [ -d $SSSRCPATH ]; then

        if [ -f $SSSRCPATH/.snap/$SnapshotName ]; then

                if [ -d $MountPath ]; then

                        if [ $MC -gt 0 ]; then

                                echo “MountPath $MountPath had been mounted!”

                        else

                                snapshot mount $SSSRCPATH:$SnapshotName $MountPath

                                df -h |grep $MountPath

                                echo “MountPath $MountPath was mounted.”

                        fi

                else

                        echo “MountPath $MountPath does not existed!”

                fi

        else

                echo “Snapshot $SSSRCPATH/.snap/$SnapshotName does not existed!”

        fi

else

        echo “Snapshot source path $SSSRCPATH does not existed!”

fi

3. 挂载范例

# mkdir -p /SNAPSHOT/Mount/Path/Weekly0

/PATH/TO/mount_UFS_snapshot.sh /SRCPATH Weekly.0 /SNAPSHOT/Mount/Path/Weekly0

4. 卸除 UFS snapshot 的 shell script

#!/usr/local/bin/bash

PATH=$PATH

CHKPARA=0

if [ -n “$1” ]; then

        MountPath=”$1″

        shift

else

        CHKPARA=1

fi

if [ $CHKPARA -eq 1 ]; then

        echo “Usage: $0 MountPath”

        echo “Example: $0 /mnt”

        exit 1

else

        echo “Try to umount $MountPath now.”

fi

MC=`df -h |grep $MountPath |wc -l`

if [ -d $MountPath ]; then

        if [ $MC -gt 0 ]; then

                snapshot umount $MountPath

                df -h |grep $MountPath

                echo “MountPath $MountPath had been umounted!”

        else

                echo “MountPath $MountPath had not been mounted!”

        fi

else

        echo “MountPath $MountPath does not existed!”

fi

5. 卸除范例

/PATH/TO/umount_UFS_snapshot.sh /SNAPSHOT/Mount/Path/Weekly0

6. UFS 做 snapshot 速度还蛮慢的. (相较于 ZFS 的快速完成 snapshot)