今天来了解一下 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。但可以通过 if
和 of
重定向输入和输出。
比如,将 /etc/hosts
复制到当前目录下的 hosts
中,就可以使用:
1 | dd if=/etc/hosts of=hosts |
如果复制文件系统,只需要将 if=
的参数修改为 dev
下对应文件系统的设备即可。
1 |
|
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/list
s 中(通常是一个类似于镜像站名-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
:升级