Linux / Ubuntu 备份数据
1.0 需要备份的文件
对于我们的 linux 服务器(当然也适用于桌面端),时常进行一次系统备份是十分有益的,类似于快照功能,可以让我们的数据与系统免于意外的发生,出了问题进行恢复即可。那么我们应该用什么工具来备份呢?又要备份些什么呢?
- 工具
和 Windows 平台不同,linux 备份不需要进入引导系统,直接在本系统运行时就可以。工具就使用几乎每个 linux 系统都自带的 tar 工具。 - 目录
最好的目标当然是全盘备份,这种备份可以用 dd 命令,但是这需要另一块硬盘或分区,不符合我们今天的情况。使用 tar 工具时,推荐备份- 根目录 /
这是系统所在,建议排除 /proc /lost+found /mnt /sys,/media /dev可以根据情况选择是否要备份; - /home
如果 /home 分区是单独一盘的话,建议单独备份。
- 根目录 /
2.0 tar 工具
Linux tar(英文全拼:tape archive )命令用于备份文件。
tar 用于创建和解压归档文件的命令行工具,可以用来将多个文件和目录组合成一个单一的归档文件,也可以用来解压已经存在的归档文件。
今天会用到的相关参数是:
参数 | 全称 | 意义 |
---|---|---|
-c | creat | 创建打包文件 |
-C | dictionary | 在指定路径解包 |
-x | extract / get | 提取打包文件 |
-v | verbose | 输出详细的文件列表,使用-vv指令,可以输出更加详细的文件属性,包括时间、大小、所有者、权限等。 |
-P | absolute-paths | 使用绝对路径(tar 默认使用相对路径) |
-p | preserve-permissions / same-permissions | 保留文件的权限 |
-z | gzip / ungzip | 使用gzip工具进行压缩或者解压缩 |
-f | file | 指定打包文件的文件名 |
–exclude | exclude | 排除文件或文件夹(文件夹后不可有“/”) |
2.1 备份/打包过程
我是在一个位置专门新建了一个路径用来保存备份文件,你也可以在任意位置,但是注意,如果备份文件在你要备份的文件路径中,要把备份文件排除在备份路径之外。
- 举例:如果要备份 / ,备份的结果文件在 /backup.tgz,那么就要排除掉这个文件。
首先获得 root 权限
sudo su
然后分别备份根目录和用户目录
sudo tar cvPpzf sys_backup.tgz --exclude=/home --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /
sudo tar cvPpzf home_backup.tgz /home/user_name
这样就在当前文件夹收获两个备份文件:sys_backup.tgz、home_backup.tgz
2.2 恢复/解包过程
当有数据丢失时,如果还能进系统,那就直接在系统里恢复,如果已经不能进系统了那就用 U 盘启动进系统修复就好。
sudo su
然后分别恢复两个分区
sudo tar xvPpzf sys_backup.tgz -C /
# 创建那些没备份的文件夹
mkdir proc
mkdir lost+found
mkdir mnt
mkdir sys
mkdir /home
sudo tar xvPpzf home_backup.tgz -C /home/user_name
3.0 流程自动化
最终当然是想要实现自动化的备份呀,那我们就在用来保存备份文件的文件夹,新建两个 shell 脚本
- start_backup.sh
这是启动备份脚本的脚本,主要任务是处理 log 文件并启动 server_backup.sh。 - server_backup.sh
这是备份脚本,主要是保存上一次备份的文件,并进行新一次的备份。使用 nohup 命令,使得任务在后台运行,且把输入记录到 nohup.out。
start_backup.sh
#!/bin/bash
date
if [ -f "nohup.out" ];then
mv nohup.out nohup.pre
echo "找到上次记录 nohup.out ,并保留为 nohup.pre。"
else
echo "未找到上次记录!"
fi
nohup bash server_backup.sh &
server_backup.sh
#!/bin/bash
echo "####################################"
date
echo "####################################"
echo ""
echo ""
if [ -f "home_backup.tgz" ];then
rm home_backup.tgz.bak
mv home_backup.tgz home_backup.tgz.bak
echo "**********************************************"
echo "保留上次 /home 备份文件为 home_backup.tgz.bak。"
else
echo "**********************************************"
echo "未找到上次 /home 分区备份文件!"
fi
echo "Starting Backup /home ......"
echo ""
tar cvPpzf home_backup.tgz /home/user_name
echo "成功备份 /home 分区!"
echo ""
echo ""
echo ""
if [ -f "sys_backup.tgz" ];then
rm sys_backup.tgz.bak
mv sys_backup.tgz sys_backup.tgz.bak
echo "**********************************************"
echo "保留上次 / 备份文件为 sys_backup.tgz.bak。"
else
echo "**********************************************"
echo "未找到上次 / 分区备份文件!"
fi
echo "Starting Backup / ......"
echo ""
tar cvPpzf sys_backup.tgz --exclude=/home --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys /
echo "成功备份 / 分区!"
echo ""
备份时,使用命令:
sudo bash start_backup.sh
也可以把这个命令设定为定时任务。
由于需要自主输入 sudo
密码,就需要使用管道以及 sudo -S
参数 | 全称 | 意义 |
---|---|---|
-S | stdin | 从标准输入读取密码 |
自动运行的命令为:
cd your_path
echo “your_password” | sudo -S bash start_backup.sh