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