Linux / Ubuntu 备份数据

Linux / Ubuntu 备份数据

同步发布在个人笔记Linux / Ubuntu 备份数据

需要备份的文件

对于我们的 linux 服务器(当然也适用于桌面端),时常进行一次系统备份是十分有益的,类似于快照功能,可以让我们的数据与系统免于意外的发生,出了问题进行恢复即可。那么我们应该用什么工具来备份呢?又要备份些什么呢?

  • 工具
    和 Windows 平台不同,linux 备份不需要进入引导系统,直接在本系统运行时就可以。工具就使用几乎每个 linux 系统都自带的 tar 工具。
  • 目录
    最好的目标当然是全盘备份,这种备份可以用 dd 命令,但是这需要另一块硬盘或分区,不符合我们今天的情况。使用 tar 工具时,推荐备份
    • 根目录 /
      这是系统所在,建议排除 /proc /lost+found /mnt /sys/media /dev可以根据情况选择是否要备份;
    • /home
      如果 /home 分区是单独一盘的话,建议单独备份。

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 排除文件或文件夹(文件夹后不可有"/")

备份/打包过程

我是在一个位置专门新建了一个路径用来保存备份文件,你也可以在任意位置,但是注意,如果备份文件在你要备份的文件路径中,要把备份文件排除在备份路径之外。

  • 举例:如果要备份 / ,备份的结果文件在 /backup.tgz,那么就要排除掉这个文件。

首先获得 root 权限

bash 复制代码
sudo su

然后分别备份根目录和用户目录

bash 复制代码
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

恢复/解包过程

当有数据丢失时,如果还能进系统,那就直接在系统里恢复,如果已经不能进系统了那就用 U 盘启动进系统修复就好。

bash 复制代码
sudo su

然后分别恢复两个分区

bash 复制代码
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

流程自动化

最终当然是想要实现自动化的备份呀,那我们就在用来保存备份文件的文件夹,新建两个 shell 脚本

  • start_backup.sh
    这是启动备份脚本的脚本,主要任务是处理 log 文件并启动 server_backup.sh。
  • server_backup.sh
    这是备份脚本,主要是保存上一次备份的文件,并进行新一次的备份。使用 nohup 命令,使得任务在后台运行,且把输入记录到 nohup.out。

start_backup.sh

shell 复制代码
#!/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

shell 复制代码
#!/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 ""

备份时,使用命令:

bash 复制代码
sudo bash start_backup.sh

也可以把这个命令设定为定时任务。

由于需要自主输入 sudo 密码,就需要使用管道以及 sudo -S

参数 全称 意义
-S stdin 从标准输入读取密码
自动运行的命令为:
bash 复制代码
cd your_path
echo "your_password" | sudo -S bash start_backup.sh
相关推荐
神秘人X70718 分钟前
Linux高效备份:rsync + inotify实时同步
linux·服务器·rsync
轻松Ai享生活24 分钟前
一步步学习Linux initrd/initramfs
linux
轻松Ai享生活28 分钟前
一步步深入学习Linux Process Scheduling
linux
绵绵细雨中的乡音2 小时前
网络基础知识
linux·网络
Peter·Pan爱编程2 小时前
Docker在Linux中安装与使用教程
linux·docker·eureka
kunge20133 小时前
Ubuntu22.04 安装virtualbox7.1
linux·virtualbox
清溪5493 小时前
DVWA中级
linux
Sadsvit4 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos
xiaok4 小时前
为什么 lsof 显示多个 nginx 都在 “使用 443”?
linux
苦学编程的谢5 小时前
Linux
linux·运维·服务器