【Linux使用】之–文件打包备份及还原工具tar
#Linux #工具 #教程 #系统 #安全防护 #Ubuntu #tar #备份还原
Linux系统以根目录 / 开始的倒置的树状结构。Linux中的目录,和Windows 系统中的文件夹类似,不同之处在于,Linux系统中的目录也被当做文件看待。对于Linux系统来说,一切皆文件。Windows系统下可以使用Ghost等软件对系统镜像备份还原,那么Linux该如何备份呢?既然说到Linux系统一切皆文件,我们就可以通过打包备份所有文件的形式,备份整个系统。
如果文件被占用如何备份还原系统,这里就不得不提一下,Linux不像windows,它不限制root用户存取任何东西,因此,你完全可以把一个分区上每一个的文件放入一个tar文件中。
tar命令本地备份
Linux tar(英文全拼:tape archive )命令用于备份文件。
tar 可以创建,还原备份文件的工具,可以理解为Windows系统下的压缩工具,但要比压缩工具更为强大。用tar备份的特点:
- 保留权限
- 适合备份整个目录
- 可以选择不同的压缩方式
- 如果选择不压缩还能实现增量备份,部份还原。
下面介绍几个tar工具的使用场景。
备份还原整个系统
- 备份
# 切换为root用户,进入根目录,然后执行备份
cd /
tar cvpzf Linuxbackup.tgz --exclude=/proc --exclude=/mnt --exclude=/lost+found --exclude=/sys --exclude=/media --exclude=/run --exclude=/Linuxbackup.tgz /
参数:
c – 创建一个新的备份文件
v – 详细模式,将执行过程全部输出到屏幕
p – 保留文件的权限信息以便恢复
z – 使用gzip压缩文件,以便减小体积
f - 使用指定文件名,在f之后加文件名,不能再接其他参数。
P - 可以使用绝对路径来压缩或解压
N - 比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中
exclude=/ 后面填写的是备份时想要排除的文件或文件夹。
- 还原
相同文件名的文件(文件夹)都会被覆盖
tar xvpfz Linuxbackup.tgz -C /
x - --extract或--get 从备份文件中还原文件。
C - <目的目录>或--directory=<目的目录> 切换到指定的目录。
创建排除文件夹
mkdir proc
mkdir mnt
mkdir lost+found
mkdir sys
mkdir media
mkdir run
重启系统,恢复完成
备份还原当前目录
- 备份当前目录
tar -cvpzf backup.tgz --exclude=/backup.tgz ./
- 恢复当前目录
tar -xvpfz backup.tgz -C ./
备份还原绝对路径
注意:在压缩文件时,当后面的备份目录使用绝对路径时,会有一下情况。
tar -czvf /home/ubuntu/back.tgz /data/www_data
tar: 从成员名中删除开头的“/”
此时,对tar增加参数P,即可消除该提示。需要注意的是:
解压时,若没有P参数
tar -xzvf /home/ubuntu/back.tgz
# 则解压缩到当前目录下
/home/ubuntu/www_data
# 若有P参数,则解压到原始目录下
/data/www_data
增量备份
许多系统(应用或网站)每天都有静态文件产生,对于一些比较重要的静态文件如果有进行定期备份的需求,就可以通过tar打包压缩备份到指定的地方,特别是对一些总文件比较大比较多的情况,还可以利用-g选项来做增量备份。
备份的目录最好使用相对路径,也就是进入到需要备份的根目录下
具体示例方法如下。
备份当前目录下的所有文件
tar -g /tmp/snapshot\_data.snap -zcpf /tmp/data01.tar.gz .
在需要恢复的目录下解压恢复
tar -zxpf /tmp/data01.tar.gz -C .
-g选项可以理解备份时给目录文件做一个快照,记录权限和属性等信息,第一次备份时"/tmp/snapshot_data.snap"不存在,会新建一个并做完全备份。当目录下的文件有修改后,再次执行第一条备份命令(记得修改后面的档案文件名),会自动根据-g指定的快照文件,增量备份修改过的文件,包括权限和属性,没有动过的文件不会重复备份。
另外需要注意上面的恢复,是“保留恢复”,即存在相同文件名的文件会被覆盖,而原目录下已存在(但备份档案里没有)的,会依然保留。所以如果你想完全恢复到与备份文件一模一样,需要清空原目录。如果有增量备份档案,则还需要使用同样的方式分别解压这些档案,而且要注意顺序。
结合脚本自动定时备份
这里以备份/data
下的www_data
文件夹为例。
编写脚本
cd /data
vim backup.sh
脚本如下
#!/bin/bash
# 备份文件路径
LocalBackDir=/data/www_data
# 备份文件存放路径
RemoteBackDir=/home/onedrive
#当前系统日期
DATE=`date +"%Y-%m-%d-%H%M%S"`
#Log存放路径
LogFile=/data/backup.logs
#新建日志文件
touch $LogFile
# 文件名称
BackupFile="www-$DATE"
# 输出日志。
echo "----------------------Start-----------------------------" >> $LogFile
tar -cpzPf $BackupFile.tgz --exclude=./$BackupFile.tgz $LocalBackDir
echo "备份文件已创建。" >> $LogFile
# 查找本地备份目录下,时间为60分钟之内,并且后缀为.tgz的备份文件
BACKUPFILE_SEND_TO_REMOTE=$(find ./ -maxdepth 1 -type f -mmin -60 -name '*.tgz')
#追加日志。
echo "文件名称: $BACKUPFILE_SEND_TO_REMOTE At $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
#备份到远程服务器
cp $BACKUPFILE_SEND_TO_REMOTE $RemoteBackDir
# 输出日志:备份的文件名
echo "文件已拷贝完成: $BACKUPFILE_SEND_TO_REMOTE。" >> $LogFile
rm -rf $BACKUPFILE_SEND_TO_REMOTE
#追加日志。
echo "清理本机备份文件。" >> $LogFile
echo "----------------------End-------------------------------" >> $LogFile
测试一下
bash backup.sh
# 查看一下日志
cat backup.logs
# 输出内容如下,表示成功
------------------------Start-------------------------------
备份文件已创建。
文件名称: ./www-2022-06-11-040001.tgz At 2022-06-11 04:02:23
文件已拷贝完成: ./www-2022-06-11-040001.tgz。
清理本机备份文件。
------------------------End---------------------------------
通过crontab定时执行
给予脚本执行权限
chmod +x backup.sh
编辑/etc/crontab
vim /etc/crontab
增加一条,4:00使用root用户,执行/data/backup.sh脚本
0 4 * * * root /data/backup.sh
具体含义如下:
# Example of job definition:
# .---------------- 分 (0 - 59)
# | .------------- 时 (0 - 23)
# | | .---------- 日 (1 - 31)
# | | | .------- 月 (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- 星期 (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
编写完 /etc/crontab 文件之后,需要重新启动cron服务
重新加载cron配置文件
sudo /usr/sbin/service cron reload
重启cron服务
sudo /usr/sbin/service cron restart
以上是一个简单的本地备份方案。
这里备份文件存放路RemoteBackDir=/home/onedrive
,其实是利用rclone挂载的OneDrive网盘,有兴趣的小伙伴可以看一下(Linux使用之–rclone挂载OneDrive配合aria2打造一台大空间网盘下载服务器)。
评论区