Merikanto

一簫一劍平生意,負盡狂名十五年

Linux System Backup & Restore, Software Management

今天来了解一下 Linux 系统备份与恢复,还有软件管理的一些基础知识。



System Backup & Restore

几乎所有的备份工具都支持两种不同的备份类型:完整备份增量备份

对于完整备份而言,包含的是一个文件系统的全部内容。而增量备份只包括相对于上一次备份之后,发生变化的文件。


Dump

dump 用于备份文件系统。对于 GNU 版本的 dump 来说,默认支持的是 ext2/3/4 文件系统的备份。如果需要备份其它文件系统,需要下载指定版本的 dump。

在使用 dump 命令的时候,需要指定一个备份级别。dump等级为0时,将会把整个文件系统进行备份,称为完整备份。而 1 则是相对与备份等级为 0 时所有修改的文件进行备份,这时备份方式被称为增量备份。下面介绍一些常用参数:

  • -level#: 指定备份等级, e.g. -0 备份整个文件系统
  • -f: 指定备份设备
  • -n: 当备份工作需要管理员介入时,向所有 “operator” 群组中的使用者发出通知
  • -T: 指定备份的时间

比如,将当前系统的整个文件系统(根目录),备份到 /home/test.dump 中:

1
dump -0 -f /home/test.dump 

注:如果是虚拟环境的 Docker 容器,缺乏必要的权限,dump 时会失败。


Restore

从备份的文件中提取文件,我们称为恢复,而对于恢复而言,也可以指定仅恢复一小部分文件和恢复整个文件系统。

dump 命令对应的命令为 restore。下面介绍一些常用参数:

  • -C: 比较备份的内容与当前实际的内容的区别
  • -i: 交互模式,可以仅还原部分内容
  • -r: 还原整个文件系统
  • -t: 查看备份的内容
  • -f: 指定备份文件
  • -D: 指定需要比较的文件系统
  • -T: 指定需要恢复的路径

举例。比较区别:

1
restore -C -f test.dump -D / 

恢复备份内容:

1
restore -r -f test.dump -T /home

我们还可以仅恢复部分文件。 在 /home 下创建文件:

1
touch hello.txt

进行增量备份:

1
dump -1 -f /test1.dump /

然后将其删除:

1
rm hello.txt

再通过备份文件将其恢复:

1
restore -i -f test1.dump

Backup Tools

只备份关键数据,不需要备份所有内容

tar

tar 也可以进行增量备份。 进行增量备份时,使用 -g--listed-incremental 指示 tar 进行增量归档操作,并且将额外的元数据存储在快照文件中 (此文件的作用是记录上次归档以来,哪些文件被更改,添加或者删除,以便下一次增量备份时将只包含已经修改的文件) 。

例如,将 /home/test 目录的内容进行增量备份:

1
tar -cvf hello.tar -g file1 /home/test

此处的 -g 指定快照文件为 file1。在快照文件创建时,为 0 级备份。对于一个完整的路径 /home/test 而言,保存时会删除开头的 / ,即为 home/test,为了在恢复文件时不会与根目录冲突。

还原文件即用:

1
tar -xvf hello.tar

dd

用于复制和转换文件(系统)。 dd 默认从 stdin
读取,输出到 stdout。但可以通过 ifof 重定向输入和输出。

比如,将 /etc/hosts 复制到当前目录下的 hosts 中,就可以使用:

1
dd if=/etc/hosts of=hosts

如果复制文件系统,只需要将 if= 的参数修改为 dev 下对应文件系统的设备即可。

还可以用于临时创建 swap 交换分区。下面的命令通过 ```/dev/zero``` ,复制创建一个文件大小为 1M * 1024
1
2
3
4
5
6
7

```yaml
dd if=/dev/zero of=swap1 bs=1M count=1024

mkswap swap1

swapon swap1
  • bs: 设置输入输出块的大小

  • count: 则是复制对应数目的块

  • /dev/zero: 特殊文件,会不断输出 of= 0,即为空。 上面的命令。

  • 对应的 /dev/null: 将所有重定向到 /dev/null 的输出全部抛弃。



Software Management

常用的管理工具有:apt,dpkg,rpm,yum


dpkg

最初软件的工具的安装只能依靠代码的下载,通过编译安装,随着 Debian 的诞生,出现了 dpkg (Debian Packager) 软件包管理工具。 Red Hat 系列受启发开发出了类似的管理工具 rpm

但是有一些软件的实现依赖于其他软件已有的功能,这样我们就需要首先安装其依赖的软件,不然直接安装会提示依赖错误,而安装的人并不知道有哪些依赖的关系,这样使得安装、升级一个软件变得非常的痛苦。此时 Debian 提出了解决方案,创造了 apt 工具来解决这样的困境。 Red Hat 借鉴 apt 的方式创造了 yum

在 Debian 系列的 Linux 操作系统(如 Debian、Ubuntu 等)中会使用 dpkg 与 apt 这样的包管理工具,在 Red Hat 系列的 Linux 操作系统(如 Red Hat、Centos、fe dora 等)会使用 rpm 与 yum 这样的包管理工具。apt 和 dpkg 的区别如下:

区别 dpkg apt
离线与在线 dpkg 就像 exe 安装包,属于离线方式,不需要依靠网络 apt 每次安装都需要从网络中获取相关资源,属于在线方式
依赖的处理 dpkg 没有处理依赖的能力,若是有依赖,必须了解依赖关系,按顺序手动安装相关软件包,否则安装失败 apt 能够获取安装软件的所有信息,并自动处理其依赖的关系,从而完成软件包的正确安装
工具的实现 dpkg 是用 C、perl 等开发语言实现的工具 apt 虽然也是使用 C++、shell 等开发语言实现的工具,但其底层会调用 dpkg 处理一些安装的工作

一些常用参数:

  • -i: 安装指定 deb 包
  • -R: 后面加上目录名,用于安装该目录下的所有 deb 安装包
  • -r: 移除已安装的软件包 (保留原有配置文件)
  • -P: 完全卸载
  • -I: 显示 deb 包文件的信息
  • -s: 显示已安装软件的信息
  • -S: 搜索已安装的软件包
  • -L: 显示已安装软件包的目录信息

例如统计软件包个数:

1
dpkg -l | wc -l

apt

apt 是 dpkg 的升级版本,主要解决软件包依赖关系


一些常用参数:

  • apt-get: 管理软件包,包括安装,卸载,升级等
  • apt-cache: 查询软件包信息
  • apt-proxy: 搭建APT代理服务器
  • apt-show-versions: 显示系统中软件包版本信息
  • apt-config: 读取APT配置文件
  • apt-cdrom: 将CD-ROM加入软件源配置文件

APT 是一个客户 / 服务器结构的工具,客户端就是我们本地使用 apt 工具,而服务端的 apt 中管理着各种各样的 deb 包,通常我们将其称为镜像站或者是源,我们的 apt 客户端工具会根据我们的命令,去服务端中获取相关的软件包并自动为我们安装。工作流程如下:

  • 查看配置文件中所给的镜像站(源)地址
  • 通过该地址下载一个资源列表,保存在 /var/lib/apt/lists 中(通常是一个类似于镜像站名-Packages.gz 的压缩包,该压缩包中就是一张资源列表,该列表包含着所有软件的信息,例如包名、优先级、版本号、依赖包、冲突信息、大小、服务器中的路径等等)
  • 安装软件时,便通过读取该文件中的信息,到镜像站中下载相关的软件包,临时存储在 /var/cache/apt/archives
  • 安装完毕之后会将安装的包信息写入 /var/lib/dpkg/available 文件中

镜像站地址的配置文件就是 /etc/apt/sources.list ,里面列出了软件包的镜像站点地址。每次修改后,一定要运行 apt-get update,这样 apt 才会再次读取配置文件,获取站点中的包信息,从而更新本地的列表信息。使用 apt-get install 安装软件包时的执行步骤:

  • 读取本地存放的软件列表(从镜像站中获取的列表),找到软件包相关信息。
  • 从信息中获取软件包依赖关系,获取其相关的软件包的信息。
  • 根据信息中的软件包地址,下载所有软件包。
  • 按照其依赖的顺序安装所有软件包。

接下来举几个应用的例子。只下载不安装软件包:

1
apt-get -d file1

统计所有可用的软件包数量:

1
apt-cache pkgnames | wc -l

获取统计信息:

1
apt-cache stats

搜索名字 = git 的软件包:

1
apt-cache search ^git$

查询安装状态:

1
apt-cache policy git

查询依赖:

1
apt-cache depends git

rpm

常用参数:

  • 安装: rpm -i <NAME>.rpm

  • 卸载: rpm -e <NAME>.rpm

  • 查看已安装的包: rpm -qa


yum

常用参数:

  • yum install:安装

  • yum groupinstall:批量安装常用组合

  • yum deplist:依赖关系

  • yum clean:清除缓存

  • yum erase:卸载

  • yum upgrade:升级