侧边栏壁纸
博主头像
v林羽博主等级

行动起来,活在当下

  • 累计撰写 172 篇文章
  • 累计创建 34 个标签
  • 累计收到 21 条评论

目 录CONTENT

文章目录

【Linux使用】之--文件打包备份及还原工具tar

v林羽
2022-06-13 / 0 评论 / 0 点赞 / 392 阅读 / 6622 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-11-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

【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工具的使用场景。

备份还原整个系统

  1. 备份
# 切换为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=/ 后面填写的是备份时想要排除的文件或文件夹。
  1. 还原

相同文件名的文件(文件夹)都会被覆盖

tar xvpfz Linuxbackup.tgz -C /
x - --extract或--get 从备份文件中还原文件。
C - <目的目录>或--directory=<目的目录> 切换到指定的目录。

创建排除文件夹

mkdir proc
mkdir mnt
mkdir lost+found
mkdir sys
mkdir media
mkdir run

重启系统,恢复完成

备份还原当前目录

  1. 备份当前目录
tar -cvpzf backup.tgz --exclude=/backup.tgz ./
  1. 恢复当前目录
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打造一台大空间网盘下载服务器)

0

评论区