- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对这个 shell 脚本和 bacula 很陌生。我想创建一个脚本来使用 bacula 安排备份?
怎么做?
任何潜在客户表示赞赏?
谢谢。
最佳答案
如果您要管理自己的 Linux 系统,请学习 bash
. man
页面真的非常详细和有用。做man bash
.
如果您真的是 Linux 和命令行的新手,管理 bacula
不适合新手。它是一个相当全面的备份系统,用于多个系统,有一个中央数据库,这意味着它也很复杂。
Linux 上有许多更简单的工具可用于执行简单的系统备份,这些工具同样可靠。如果你只想备份你的主目录,tar
或 zip
是优秀的工具。特别是,tar
可以进行完整 备份和增量 备份。
假设你真的想使用 bacula
并且有足够的信息来编写几个简单的脚本,那么即使如此,最初的请求也是模棱两可的。
你的意思是安排定期cron
完成无人值守备份的工作?或者,您的意思是安排一次调用 bacula
在确定的时间和日期?
无论哪种情况,创建两个简单的脚本都是一个好主意:一个执行完整 备份,一个执行增量 备份。完整备份应该运行,比如说,每周一次或每月一次,而增量备份应该每天或每周运行一次——这取决于您的系统数据更改的频率。
大多数日常使用的普通站点都会有每日增量备份,并在周末(比如周日)进行完整备份。这样,如果系统在周五崩溃,您将需要使用最近的完整备份(上周日)进行恢复,然后使用每天的增量备份(周一、周二、周三、周四)进行恢复。您可能会丢失崩溃当天发生的数据更改。
如果数据更改的频率是每小时一次,并且以每小时一次的频率进行恢复很重要,那么增量应该每小时安排一次,每晚进行完整备份。
一个重要的考虑因素是确切地知道要备份什么。大多数家庭用户希望他们的主目录是可恢复的。操作系统根目录和应用程序分区通常无需备份即可轻松恢复。或者,它们的备份频率非常低(比如大约一个月一次),因为它们的更改频率必须低于用户的主目录。
另一个重要的考虑因素是将备份放在哪里。 Bacula
支持非挂载文件系统的外部存储设备,例如磁带。 tar
还支持磁带存档。大多数家庭用户都有某种类型的 USB 或网络连接存储用于存储备份。
假设备份存储在 /mnt/backups/
上, 并假设用户的主目录(和子目录)都已备份并可恢复。
% cat <<EOF >/usr/local/bin/full-backup
#!/bin/bash
# full-backup SRCDIRS [--options]
# incr-backup SRCDIRS [--options]
#
# set destdir to the path at which the backups will be stored
# each backup will be stored in a directory of the date of the
# archive, grouped by month. The directories will be:
#
# /mnt/backups/2014/01
# /mnt/backups/2014/02
# ...
# the full and incremental files will be named this way:
#
# /mnt/backups/2014/01/DIR-full-2014-01-24.192832.tgz
# /mnt/backups/2014/01/DIR-incr-2014-01-25.192531.tgz
# ...
# where DIR is the name of the source directory.
#
# There is also a file named ``lastrun`` which is used for
# its last mod-time which is used to select files changed
# since the last backup.
$PROG=${0##*/} # prog name: full-backup or incr-backup
destdir=/mnt/backup
now=`date +"%F-%H%M%S"`
monthdir=`date +%Y-%m`
dest=$destdir/$monthdir/
set -- "$@"
while (( $# > 0 )) ; do
dir="$1" ; shift ;
options='' # collect options
while [[ $# -gt 0 && "x$1" =~ x--* ]]; do # any options?
options="$options $1"
shift
done
basedir=`basename $dir`
fullfile=$dest/$basedir-full-$now.tgz
incrfile=$dest/$basedir-incr-$now.tgz
lastrun=$destdir/lastrun
case "$PROG" in
full*) archive="$fullfile" newer= kind=Full ;;
incr*) archive="$incrfile" newer="--newer $lastrun" kind=Incremental ;;
esac
cmd="tar cfz $archive $newer $options $dir"
echo "$kind backup starting at `date`"
echo ">> $cmd"
eval "$cmd"
echo "$kind backup done at `date`"
touch $lastrun # mark the end of the backup date/time
exit
EOF
(cd /usr/local/bin ; ln -s full-backup incr-backup )
chmod +x /usr/local/bin/full-backup
一旦此脚本配置好并可用,就可以使用 cron
对其进行调度。 .参见 man cron
.使用 cron -e
创建和编辑 crontab 条目以调用 full-backup
每周一次(比如说),另一个 crontab 条目调用 incr-backup
一天一次。以下是三个示例 crontab 条目(有关语法的详细信息,请参阅 man 5 crontab
),用于执行增量备份和完整备份,以及删除旧存档。
# run incremental backups on all user home dirs at 3:15 every day
15 3 * * * /usr/local/bin/incr-backup /Users
# run full backups every sunday, at 3:15
15 3 * * 7 /usr/local/bin/full-backup /Users
# run full backups on the entire system (but not the home dirs) every month
30 4 * 1 7 /usr/local/bin/full-backup / --exclude=/Users --exclude=/tmp --exclude=/var
# delete old backup files (more than 60 days old) once a month
15 3 * 1 7 find /mnt/backups -type f -mtime +60 -delete
从这些备份中恢复是留待以后练习的。
祝你好运。
关于linux - 如何使用 bacula 编写备份脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21301721/
我只想从客户端向服务器发送数组 adc_array=[w, x, y, z]。下面是客户端代码,而我的服务器是在只接受 json 的 python 中。编译代码时我没有收到任何错误,但收到 2 条警告
我是 lua 和 Node js 的新手,我正在尝试将我正在开发的移动应用程序连接到服务器。问题是它连接到服务器,但我尝试传递的数据丢失或无法到达服务器。对我正在做的事情有什么问题有什么想法吗? th
我在这个页面上工作 http://www.haskell.org/haskellwiki/99_questions/Solutions/4 我理解每个函数的含义,看到一个函数可以像这样以多种方式定义,
我目前正在尝试将数据写入 excel 以生成报告。我可以将数据写入 csv 文件,但它不会按照我想要的顺序出现在 excel 中。我需要数据在每列的最佳和最差适应性下打印,而不是全部打印在平均值下。这
所以,我正在做一个项目,现在我有一个问题,所以我想得到你的帮助:) 首先,我已经知道如何编写和读取 .txt 文件,但我想要的不仅仅是 x.hasNext()。 我想知道如何像 .ini 那样编写、读
我正在尝试编写一个函数,该函数将返回作为输入给出的任何数字的阶乘。现在,我的代码绝对是一团糟。请帮忙。 function factorialize(num) { for (var i=num, i
这个问题已经有答案了: Check variable equality against a list of values (16 个回答) 已关闭 4 年前。 有没有一种简洁或更好的方法来编写这个条件
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在尝试创建一个 for 循环,它将重现以下功能代码块,但以一种更具吸引力的方式。这是与 Soundcould 小部件 API 实现一起使用的 here on stackoverflow $(doc
我有一个非常令人困惑的问题。我正在尝试更改属性文件中的属性,但它只是没有更改... 这是代码: package config; import java.io.FileNotFoundException
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在开发一个用户模式(Ring3)代码级调试器。它还应支持.NET可执行文件的本机(x86)调试。基本上,我需要执行以下操作: 1).NET在隐身模式下加载某些模块,而没有LOAD_DLL_DEBU
我有一个列表,我知道有些项目是不必要打印的,我正在尝试通过 if 语句来做到这一点...但是它变得非常复杂,所以有没有什么方法可以在 if 语句中包含多个索引而无需打印重写整个声明。 看起来像这样的东
我很好奇以不同方式编写 if 语句是否会影响程序的速度和效率。所以,例如写一个这样的: bool isActive = true; bool isResponding = false; if (isA
我在搜索网站的源代码时找到了一种以另一种方式(我认为)编写 if 语句的方法。 代替: if(a)b; 或: a?b:''; 我读了: !a||b; 第三种方式和前两种方式一样吗?如果是,为什么我们要
我的数据采用以下格式(HashMap的列表) {TeamName=India, Name=Sachin, Score=170} {TeamName=India, Name=Sehwag, Score=
我目前正在完成 More JOIN operations sqlzoo 的教程,遇到了下面的代码作为#12 的答案: SELECT yr,COUNT(title) FROM movie JOIN ca
我正试图找到一种更好的方法来编写这段代码: def down_up(array, player) 7.downto(3).each do |row| 8.times do |col
出于某种原因,我的缓冲区中充满了乱码,我不确定为什么。我什至用十六进制编辑器检查了我的文件,以验证我的字符是否以 2 字节的 unicode 格式保存。我不确定出了什么问题。 [打开文件] fseek
阅读编码恐怖片时,我刚刚又遇到了 FizzBuzz。 原帖在这里:Coding Horror: Why Can't Programmers.. Program? 对于那些不知道的人:FizzBu
我是一名优秀的程序员,十分优秀!