Linux 云计算集群架构师课程->第三章 文件的基本管理和 XFS 文件系统备份恢复
# 第三章 文件的基本管理和 XFS 文件系统备份恢复
(上课时间:2021-06-15,笔记整理时间:2021-06-20)
**本节所讲内容:**
**3.1 Linux 系统目录结构和相对路径与绝对路径**
**3.2 文件的管理**
**3.3 查看文件**
**3.4 实战:xfs 文件系统的备份和恢复**
**3.1 Linux 系统目录结构和相对路径与绝对路径**
## 3.1.1 系统目录结构
在 WIN 系统中,查看文件先进入相应的盘符,然后进入文件目录
![image-20210619180746613](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210619180746613.png)
在 Windows 中,它是多根 C:\ D:\ D:\
Linux 只有一个/根目录
使用 tree 命令查看 linux 目录结构,如果没有这个命令,需要手工安装一下
```sh
[root@Centos83 ~]# yum install tree #安装 tree 命令
```
查看/tmp 目录结构
```sh
[root@Centos83 ~]# ls /tmp
[root@Centos83 ~]# tree /tmp
/tmp
0 directories, 0 files
```
查看根下有哪些文件:
```sh
[root@Centos83 ~]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
```
根下的目录作用说明:
| 目 录 | 说 明 |
| ----------------------------------------- | :----------------------------------------------------------- |
| / | 处于 linux 系统树形结构的最顶端,它是 linux 文件系统的入口,所有的目录、文件、设备都在 / 之下 |
| /bin | bin 是 Binary 的缩写。常用的二进制命令目录。比如 ls、cp、mkdir、cut等;和/usr/bin 类似,一些用户级工具 |
| /boot | 存放的系统启动相关的文件,例如:kernel.grub(引导装载程序) |
| /dev | dev 是 Device 的缩写。设备文件目录,比如声卡、磁盘……在 Linux 中一切都被看做文件。终端设备、磁盘等等都被看做文件设备文件: /dev/sda,/dev/sda1,/dev/tty1,/dev/tty2,/dev/pts/1, /dev/zero, /dev/null, /dev/cdrom |
| /etc | 常用系统及二进制安装包配置文件默认路径和服务器启动命令目录,如:/etc/passwd 用户信息文件/etc/shadow 用户密码文件/etc/group 存储用户组信息/etc/fstab 系统开机启动自动挂载分区列表/etc/hosts 设定用户自己的 IP 与主机名对应的信息 |
| /home | 普通用户的家目录默认存放目录 |
| /lib | 库文件存放目录,函数库目录 |
| /mnt/media | /mnt 和/media 一般用来临时挂载存储设备的挂载目录,比如有 cdrom、U 盘等目录/mnt/hgfs: 安装 vmware-tools 后,使用共享文件夹功能,可以共享虚拟机和真机的目录,实现文件相互复制,一般这个功能没有用。我们直接使用xshell 来上传文件 |
| /opt | 表示的是可选择的意思,有些软件包也会被安装在这里。如:gitlab |
| /proc | 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如 cpu、硬盘分区、内存信息等)存放在这里。/proc 目录是伪装的文件系统 proc 的挂载目录,proc 并不是真正的文件系统。因此,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里查看咱们的 CPU 信息cat /proc/cpuinfo |
| /sys | 系统目录,存放硬件信息的相关文件 |
| /run | 运行目录,存放的是系统运行时的数据,比如进程的 PID 文件 |
| /srv | 服务目录,存放的是我们本地服务的相关文件 |
| /sbin | 大多数涉及系统管理的命令都存放在该目录中,它是超级权限用户 root 的可执行命令存放地,普通用户无权限执行这个目录下的命令,凡是目录 sbin 中包含的命令都是 root 权限才能执行的 |
| /tmp | 该目录用于存放临时文件,有时用户运行程序的时候,会产生一些临时文件。/tmp 就是用来存放临时文件的。/var/tmp 目录和该目录的作用是相似的,不能存放重要数据,系统会定期删除这个目录下的没有被使用的文件。它的权限比较特殊[root@Centos83 ~]# ls -ld /tmpdrwxrwxrwt. 11 root root 170 6月 19 18:16 /tmp →粘滞位(stickybit)目录的 sticky 位表示这个目录里的文件只能被文件的 owner(所有者)和root 删除 |
| /var | 系统运行和软件运行时产生的日志信息,该目录的内容是经常变动的,存放的是一些变化的文件。比如/var 下有/var/log 目录用来存放系统日志的目录,还有mail、/var/spool/cron |
| /usr | 存放应用程序和文件,/usr/bin 普通用户使用的应用程序/usr/sbin 管理员使用的应用程序/usr/lib 库文件 Glibc(32 位)/usr/lib64 库文件 Glibc |
| /lib/lib64是/usr/lib 和/usr/lib64的软链接 | 这个目录里存放着系统最基本的动态链接共享库,包含许多被/bin/和/sbin/中的程序使用的库文件,目录/usr/lib/中含有更多用于用户程序的库文件。作用类似于 windows 里的 DLL 文件,几乎所有的应用程序都需要用到这些共享库注:lib***.a 是静态库 , lib***.so 是动态库静态库在编译时被加载到二进制文件中动态库在运行时加载到进程的内存空间中简单的说:这些库是为了让你的程序能够正常编译运行的其实类似于 WIN 中.dll 文件,几乎所有的应用程序都需要用到这些共享库 |
### 3.1.2 绝对路径和相对路径
路径:在我们平时使用计算机时要找到需要的文件就必须知道文件的位置,而表示文件的位置的方式
就是路径
绝对路径:在 Linux 中,绝对路径是从"/"开始的,比如/usr、/etc/passwd。如果一个路径是从根
(/)开始的,它一定是绝对路径.
相对路径:相对路径是以 . 或 .. 开始的,
```sh
[root@Centos83 ~]# pwd #判断用户当前所处的位置
/root
```
**绝对路径**: 从**/**开始的路径 /home/user1
**相对路径**: 相对于当前目录开始,**a.txt ./a.txt ../root/b.txt** 当前目录在/etc
```sh
[root@Centos83 ~]# cd /etc
[root@Centos83 etc]# ll passwd #相对路径
-rw-r--r--. 1 root root 2735 6月 13 10:01 passwd
[root@Centos83 etc]# ll /etc/passwd
-rw-r--r--. 1 root root 2735 6月 13 10:01 /etc/passwd #绝对路径
```
## 3.2 文件的管理
**文件管理方式有多种:**
**改变目录: cd**
**创建/修改/移动/删除: touch mkdir mv vi rm cp**
### 3.2.1 创建文件和文件夹
**命令之:touch ; touch [tʌtʃ] 触摸;接触;**
**作用:常用来创建空文件,如果文件存在,则修改这个文件的时间**
**语法:touch 文件名**
```sh
[root@Centos83 etc]# cd /opt/
[root@Centos83 opt]# ls
[root@Centos83 opt]# touch a.txt #创建a.txt
[root@Centos83 opt]# touch file1 file2 file3 #创建file1 file2 file3
[root@Centos83 opt]# touch file{5..30} #创建 file5 到 file30 的文件
[root@Centos83 opt]# ls
a.txt file12 file16 file2 file23 file27 file30 file8
file1 file13 file17 file20 file24 file28 file5 file9
file10 file14 file18 file21 file25 file29 file6
file11 file15 file19 file22 file26 file3 file7
[root@Centos83 opt]# touch a.txt
[root@Centos83 opt]# ll a.txt
-rw-r--r--. 1 root root 0 6月 19 18:36 a.txt #第一次创建的a.txt时间已经修改为刚才时间。
```
```sh
[root@Centos83 opt]# stat a.txt #查看文件属性(其中包括文件时间属性)
文件:a.txt
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:203863487 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2021-06-19 18:36:46.324932333 +0800
最近更改:2021-06-19 18:36:46.324932333 +0800
最近改动:2021-06-19 18:36:46.324932333 +0800
创建时间:-
注:
访问时间:atime 查看内容 cat a.txt
修改时间:mtime 修改内容 vim a.txt
改变时间:ctime 文件属性,比如权限 change time。 chmod +w a.txt
[root@Centos83 opt]# echo $LANG #查看当前语言设置
zh_CN.UTF-8
[root@Centos83 opt]# LANG=EN_US.UTF-8 #切换为英文
[root@Centos83 opt]# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 203863487 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:usr_t:s0
Access: 2021-06-19 18:36:46.324932333 +0800
Modify: 2021-06-19 18:36:46.324932333 +0800
Change: 2021-06-19 18:36:46.324932333 +0800
Birth: -
[root@Centos83 opt]# LANG=zh_CN.UTF-8 #切换为中文
```
### 3.2.2 使用 vim 和重定向创建一个新文件
用 vim 命令创建一个新文件
```sh
[root@Centos83 opt]# vim centos.txt #在当前目录下创建一个centos.txt文件
```
用重定向创建一新文件
```sh
[root@Centos83 opt]#echo abcd > centos.txt #追加 abcd 内容到 centos.txt 文件里面
[root@Centos83 opt]# ll *.txt
-rw-r--r--. 1 root root 0 Jun 19 18:36 a.txt
-rw-r--r--. 1 root root 5 Jun 19 18:48 centos.txt
[root@Centos83 opt]# cat centos.txt #查看 centos.txt 文件
abcd #abcd 内容已经添加进来了
```
### 3.2.3 命令之:mkdir
**作用:创建目录**
**语法:mkdir (选项) 文件夹名子**
例:
```sh
[root@Centos83 ~]#cd /opt/ #进入/opt/目录
[root@Centos83 opt]# mkdir dx #在当前目录下创建daxiong目录
[root@Centos83 opt]# mkdir dx1 dx2 /home/dx3 #在当前目录下创建dx1 dx2 在/home/目录下创建dx3目录
[root@Centos83 opt]# ls && ls /home/ #查看opt目录下dx1 dx2 再查看/home/目录下dx3也成功被创建
[root@Centos83 opt]# ls && ls /home
a.txt centos.txt dx dx1 dx2
dx3 yh
[root@Centos83 opt]# mkdir /tmp/a/b/c
mkdir: 无法创建目录 “/tmp/a/b/c”: 没有那个文件或目录
[root@Centos83 opt]# mkdir -p /tmp/a/b/c #创建一个目录时如果这上目录的上一级不存在要加参数-p
[root@Centos83 opt]# tree /tmp/a/b/c #成功创建/tmp/a/b/c 目录
/tmp/a/b/c
0 directories, 0 files
```
**互动**:在当前目录下,已经存在一个文件后,可以创建同名的目录文件吗?
```sh
[root@Centos83 opt]# touch aaa #创建 aaa 文件
[root@Centos83 opt]# mkdir aaa #新建 aaa 目录时无法创建,提示文件已存在,不可以创建成功,因为目录下不能存在两个同名的文件。
mkdir: 无法创建目录 “aaa”: 文件已存在
```
![image-20210620080821607](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620080821607.png)
#Windows系统下同样无法创建
### 3.2.4 删除文件和目录
**用到的命令:rm**
**作用:可以删除一个目录中的一个或多个文件或目录,对于链接文件,只是删除整个链接文件,而原**
**文件保持不变的**
**语法:rm (选项) 处理对象**
**选项:**
**-f 强制删除,没有提示**
**-r 删除目录,递归删除,把目录下的文件和文件夹也删除**
例子:
```sh
[root@Centos83 opt]# rm -rf a.txt
[root@Centos83 opt]# rm -rf centos.txt dx1
[root@Centos83 opt]# rm -rf file*
```
**rm -rf (慎用,一定要在删除以前确定一下所在目录,防止误删除重要数据)**
### 3.2.5 复制文件
**命令:cp 源文件/目录 目标文件/目录**
**选项:-R/r:递归处理,将指定目录下的所有文件与子目录一并处理。复制目录时会使用 r 参数**
**选项:\ :覆盖文件,不提示**
例子:
```sh
[root@Centos83 opt]# cp /etc/passwd /opt/ #复制文件
[root@Centos83 opt]# cp -r /boot/grub2 /opt/ #复制目录
[root@Centos83 opt]# cp -r /boot/grub2/ /etc/passwd /opt/ #复制多个文件到目录
cp:是否覆盖'/opt/grub2/i386-pc/gcry_md5.mod'? y
cp:是否覆盖'/opt/grub2/i386-pc/acpi.mod'? y
cp:是否覆盖'/opt/grub2/i386-pc/gcry_rfc2268.mod'? y
```
[root@xuegod63 ~]# cp -r /boot/grub2 /opt/ #复制目录
[root@xuegod64 ~]# cp -r /boot/grub2 /etc/passwd /opt #复制多个文件到目录
**选项:\ :覆盖文件,不提示**
例子:
```sh
[root@Centos83 opt]# \cp -r /boot/grub2/ /etc/passwd /opt/ #\反斜杠,覆盖文件,不提示
```
**选项:-p:复制文件会保留文件属性**
例子:
```sh
[root@Centos83 ~]# touch abc.txt #创建abc.txt文件
[root@Centos83 ~]# ll abc.txt #查看文件没有写权限
-rw-r--r--. 1 root root 0 6月 20 08:24 abc.txt
[root@Centos83 ~]# chmod a+w abc.txt #添加写权限
[root@Centos83 ~]# ll abc.txt #查看文件已经有写权限
-rw-rw-rw-. 1 root root 0 6月 20 08:24 abc.txt
[root@Centos83 ~]# cp abc.txt /opt/ #拷贝abc.txt文件到/opt/下
```
**互动**:复制到目录后,这个文件会带上 w 写权限吗?
```sh
[root@Centos83 ~]# ll /opt/abc.txt #检查,没有写权限
-rw-r--r--. 1 root root 0 6月 20 08:25 /opt/abc.txt
[root@Centos83 ~]# \cp -P abc.txt /opt/ #-p 选项会保留文件属性
[root@Centos83 ~]# ll abc.txt
-rw-rw-rw-. 1 root root 0 6月 20 08:24 abc.txt
[root@Centos83 ~]# mkdir shell1 shell2 shell3
[root@Centos83 ~]# \cp -rp /opt/!(shell1 | shell2) /tmp/ #除了 dir1 或 dir2 以外其他文件
都复制到 root 目录下
```
### **3.2.6 移动文件**
```sh
[root@Centos83 ~]# cd /opt #进入/opt/
[root@Centos83 opt]# ll #查看目录下所有文件
-rw-r--r--. 1 root root 2735 6月 20 08:20 passwd
[root@Centos83 opt]# mv passwd passwd1 ##在移动文件的时候支持改名操作
[root@Centos83 opt]# ll #查看已经成功重命名passwd文件为passwd1
-rw-r--r--. 1 root root 2735 6月 20 08:20 passwd1
[root@Centos83 opt]# touch file1 file2 file3 file4
[root@Centos83 opt]# ll
总用量 4
-rw-r--r--. 1 root root 0 6月 20 08:03 aaa
-rw-r--r--. 1 root root 0 6月 20 08:30 abc.txt
drwxr-xr-x. 2 root root 6 6月 20 07:56 dx
drwxr-xr-x. 2 root root 6 6月 19 19:01 dx2
-rw-r--r--. 1 root root 0 6月 20 08:40 file1
-rw-r--r--. 1 root root 0 6月 20 08:40 file2
-rw-r--r--. 1 root root 0 6月 20 08:40 file3
-rw-r--r--. 1 root root 0 6月 20 08:40 file4
drwx------. 4 root root 83 6月 20 08:16 grub2
-rw-r--r--. 1 root root 2735 6月 20 08:20 passwd1
[root@Centos83 opt]# mv /opt/!(file1 |file2) /tmp/ #除了 file1 或 file2 以外其他文件都移动到 /tmp 目录下
```
## 3.3 查看文件
### 3.3.1 命令之:cat
**语法:cat 文件名**
**作用:查看文件内容,一次显示整个文件的内容**
例子:
```sh
[root@Centos83 opt]# cat /etc/passwd #查看文件/etc/passwd内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
……………………
```
### 3.3.2 命令之:more
**作用:以分页形式显示文件内容**
**语法:more + 文件名**
**说明: 按下回车刷新一行,按下空格刷新一屏,输入 q 键退出**
**例:**
```sh
[root@Centos83 opt]# cat /proc/cpuinfo | more
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
…………………………
[root@Centos83 opt]# ifconfig | more
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.170.80.180 netmask 255.255.255.0 broadcast 10.170.80.2
55
inet6 fe80::1e5f:e70a:62c3:dab7 prefixlen 64 scopeid 0x20
ether 00:0c:29:44:0b:71 txqueuelen 1000 (Ethernet)
RX packets 31691 bytes 13176084 (12.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5791 bytes 518786 (506.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@Centos83 opt]# more /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz
stepping : 4
microcode : 0x2a
cpu MHz : 2294.688
cache size : 3072 KB
physical id : 0
siblings : 2
```
### 3.3.3 命令之:less
**作用:和 more 功能一样**
**语法:less +文件名**
**说明:linux 中 more 与 less 的区别**
more:不支持后退,但几乎不需要加参数,空格键是向下翻页,Enter 键是向下翻一行,在不需要后
退的情况下比较方便
less:支持前后翻滚,既可以向上翻页(pageup 按键),也可以向下翻页(pagedown 按键)。,空
格键是向下翻页,Enter 键是向下翻一行
### 3.3.4 命令之:head
**作用: 用于显示文件的开头的内容。在默认情况下,head 命令显示文件的头 10 行内容**
**语法:head(选项)文件名**
**参数: -n 显示从文件头开始的行数**
```sh
[root@Centos83 opt]# head /etc/passwd #显示/etc/passwd 文件前10行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@Centos83 opt]# head -n 3 /etc/passwd #显示/etc/passwd 文件前3行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
```
### 3.3.5 命令之:tail
**作用: 用于显示文件中的尾部内容。默认在屏幕上显示指定文件的末尾 10 行**
**语法:tail (选项)文件名**
**参数:**
**-n 显示文件尾部多少行的内容(n 为数字)**
**-f 动态显示数据(不关闭),常用来查看日志**
```sh
[root@Centos83 opt]# tail -n 3 /var/log/secure #查看最后 3 行记录
Jun 20 07:46:09 Centos83 sshd[2355]: pam_unix(sshd:session): session opened for user root by (uid=0)
Jun 20 08:11:31 Centos83 sshd[2701]: Accepted password for root from 10.170.80.200 port 57438 ssh2
Jun 20 08:11:31 Centos83 sshd[2701]: pam_unix(sshd:session): session opened for user root by (uid=0)
[root@Centos83 opt]# tail -3 /var/log/secure #查看最后 3 行记录
Jun 20 07:46:09 Centos83 sshd[2355]: pam_unix(sshd:session): session opened for user root by (uid=0)
Jun 20 08:11:31 Centos83 sshd[2701]: Accepted password for root from 10.170.80.200 port 57438 ssh2
Jun 20 08:11:31 Centos83 sshd[2701]: pam_unix(sshd:session): session opened for user root by (uid=0)
[root@Centos83 opt]# tail -f /var/log/secure #在一个终端执行此命令动态查看文件内容
[root@Centos83 opt]# tailf /var/log/secure #在一个终端执行此命令动态查看文件内容
[root@Centos83]#ssh root@10.170.80.180 #在另一个终端远程登录 Linux,登录成功后
[root@Centos83 opt]# tail -f /var/log/secure #可以动态查看到登录成功的日志
Jun 20 09:44:38 Centos83 sshd[3605]: Accepted password for root from 10.170.80.200 port 57536 ssh2
Jun 20 09:44:38 Centos83 sshd[3605]: pam_unix(sshd:session): session opened for user root by (uid=0)
```
## 3.4 实战:xfs 文件系统的备份和恢复
XFS 提供了 xfsdump 和 xfsrestore 工具协助备份 XFS 文件系统中的数据。xfsdump 按 inode顺序备份一个 XFS 文件系统。
centos7 开始选择 xfs 格式作为默认文件系统,而且不再使用以前的 ext,仍然支持 ext4,xfs 专为大数据产生,每个单个文件系统最大可以支持 8EB(1EB=1024PB,1PB=1024TB,1TB=1024GB),单个文件可以支持 16TB,不仅数据量大,而且扩展性高。还可以通过 xfsdump,xfsrestore 来备份和恢复。
与传统的 UNIX 文件系统不同,XFS 不需要在备份前被卸载;对使用中的 XFS 文件系统做备份就可以保证镜像的一致性。XFS 的备份和恢复的过程是可以被中断然后继续的,无须冻结文件系统。
xfsdump 甚至提供了高性能的多线程备份操作——它把一次 dump 拆分成多个数据流,每个数据流可以被发往不同的目的地首先了解一下 xfsdump 的备份级别有以下两种,默认为 0(即完全备份)
**0 级别代表: 完全备份**
**1 到 9 级别代表: 增量备份**
**xfsdump level 级别**
对完整的文件系统进行备份,用 xfsdump。
他除了可以进行完整备份,还可以进行累积性备份。第一次使用 xfsdump,是完整备份,定义为level 0,而第二次备份,则不会完整备份,而是和第一次的备份(level 0)进行比较,仅备份有差异的文件(level 1)。
**xfsdump 常用参数**
**-L:xfsdump 会记录每次备份的 session Label,这里可以填写针对此文件系统的简易说明;**
**-M:xfsdump 可以记录存储 Media Label,这里可以填写此媒体的简易说明。**
**-l:是 L 的小写,就是指定 level,有 0~9 共 10 个等级,默认为 0,即完整备份。**
**-f:后面接产生的文件和 destination file 。例如/dev/st0 设备文件名或其他一般文件文件名**
**-I:大写的“i”,从/var/lib/xfsdump/inventory 列出目前备份的信息状态。**
**扩展:**
完全备份:每次都把指定的备份目录完整的复制一遍,不管目录下的文件有没有变化; 如:cp
增量备份:每次将之前(第一次、第二次、直到前一次)做过备份之后有变化的文件进行备份;
差异备份:每次都将第一次完整备份以来有变化的文件进行备份。如: rsync 备份
### 3.4.1 环境准备
实验环境:
添加磁盘大小:20G →分区→格式化→挂载
![image-20210620095606017](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620095332350.png)
![image-20210620095736421](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620095736421.png)
选择硬盘,下一步。
![image-20210620095855874](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620095855874.png)
![image-20210620095950066](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620095950066.png)
![image-20210620100122366](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620100122366.png)
我这里选择将虚拟磁盘存储为单个文件。
![image-20210620100316456](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620100316456.png)
![image-20210620100441774](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620100441774.png)
![image-20210620100543396](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620100543396.png)
完成添加第二块硬盘后效果
开机后对新添加的硬盘进行分区格式化:
```sh
[root@Centos83 ~]# ls /dev/sdb* #查看/dev/sd* 以sd开头的磁盘
/dev/sdb /dev/sdb1 #/dev/sdb/已经多了一个sdb1分区
[root@Centos83 ~]# ls /dev/sdb* #查看/dev/sd* 以sd开头的磁盘
/dev/sdb
[root@Centos83 ~]# fdisk /dev/sdb #指定分区的设备,centos8 第二块硬盘的第一分区名为/dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n #新建分区
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p #主分区 p 为主分区 e 为扩展分区 (逻辑分区容器)
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +1G #大小+1G
Created a new partition 1 of type 'Linux' and of size 1 GiB.
Command (m for help): p #打印分区表
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xee16ad72
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G 83 Linux
Command (m for help): w #保存分区表
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```
使用新的分区,格式化分区,并进行挂载
```sh
[root@Centos83 ~]# mkfs.xfs /dev/sdb1 #使用 xfs 格式对分区进行格式化
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@Centos83 ~]# blkid /dev/sdb1 #查看分区信息
/dev/sdb1: UUID="6b0eda6c-8199-4269-83ac-c925b326d981" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="ee16ad72-01"
[root@Centos83 ~]# mkdir /test #创建分区挂载点
[root@Centos83 ~]# mount /dev/sdb1 /test #把/dev/sdb1 挂载到 /test/上
[root@Centos83 ~]# df -Th #查看磁盘挂载情况
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 441M 0 441M 0% /dev
tmpfs tmpfs 471M 0 471M 0% /dev/shm
tmpfs tmpfs 471M 7.0M 464M 2% /run
tmpfs tmpfs 471M 0 471M 0% /sys/fs/cgroup
/dev/mapper/cl-root xfs 95G 5.5G 90G 6% /
/dev/sda1 xfs 1014M 221M 794M 22% /boot
tmpfs tmpfs 95M 0 95M 0% /run/user/0
/dev/sdb1 xfs 1014M 40M 975M 4% /test
[root@Centos83 ~]# cd /test/ #进入 test 目录
[root@Centos83 test]# cp /etc/passwd ./ #拷贝 passwd 文件到当前目录
[root@Centos83 test]# ll
total 4
-rw-r--r--. 1 root root 2735 Jun 20 10:31 passwd
[root@Centos83 test]# mkdir ./mygod #在当前目录内创建 mygod 目录
[root@Centos83 test]# touch ./mygod/abc #在当前目录的 mygod 目录内创建 abc 文件
[root@Centos83 test]# tree /test/ #查看 /test/ 目录结构
/test/
|-- mygod
| `-- abc
`-- passwd
1 directory, 2 files
```
### 3.4.2 备份
#### 1、备份整个分区。
(这个功能就像是虚拟机的快照,服务器被黑后,进行快速恢复)
语法格式:xfsdump -f 这里写备份后存放的位置 这里写要备份的文件路径或设备
**注意:备份的路径这里不能写成/test/。 可以是/dev/sdb1 或/test 即目录后不能有/**
```sh
[root@Centos83 test]# xfsdump -f /opt/dump_sdb1 /dev/sdb1 #备份的文件放在/opt 下, 要备份的设备是/dev/sdb1
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.8 (dump format 3.0) - type ^C for status and control
============================= dump label dialog ==============================
please enter label for this dump session (timeout in 300 sec)
-> dump_sdb1
session label entered: "dump_sdb1" #这里写对此次备份的说明。如:dump_sdb1;
--------------------------------- end dialog ---------------------------------
xfsdump: level 0 dump of Centos83:/test
xfsdump: dump date: Sun Jun 20 10:40:43 2021
xfsdump: session id: 675363ab-6708-47f6-8e58-d81e4c3224d3
xfsdump: session label: "dump_sdb1"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 25856 bytes
============================= media label dialog =============================
please enter label for media in drive 0 (timeout in 300 sec)
-> sdb1bak
media label entered: "sdb1bak" #这里写对要备份的设备做一个说明。如:sdb1bak
--------------------------------- end dialog ---------------------------------
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 26064 bytes
xfsdump: dump size (non-dir files) : 3104 bytes
xfsdump: dump complete: 42 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /opt/dump_sdb1 OK (success)
xfsdump: Dump Status: SUCCESS
```
扩展: 备份前先查看分区的文件系统类型。
```sh
[root@Centos83 test]# df -T # 当前系统里无ext4格式的分区
Filesystem Type 1K-blocks Used Available Use% Mounted on
devtmpfs devtmpfs 451532 0 451532 0% /dev
tmpfs tmpfs 482024 0 482024 0% /dev/shm
tmpfs tmpfs 482024 7072 474952 2% /run
tmpfs tmpfs 482024 0 482024 0% /sys/fs/cgroup
/dev/mapper/cl-root xfs 99561988 5705468 93856520 6% /
/dev/sda1 xfs 1038336 226256 812080 22% /boot
tmpfs tmpfs 96404 0 96404 0% /run/user/0
/dev/sdb1 xfs 1038336 40296 998040 4% /test
注:##如果分区默认是 ext4 文件系统类型的分区是不能执行 xfs 备份##
```
#### 2、 指定备份时免交互操作,方便后期做定时备份
```sh
[root@Centos83 test]#xfsdump -f /opt/dump_sdb1_v2 /dev/sdb1 -L dump_sdb1_v2 -M sdb1_v2
#-L : 备份的会话标签,这里写对此次备份的说明。如:dump_sdb1_v2 ,可以随意写。
#-M : 储存设备的标签,这里写对备份设备的简易描述。如: sdb1bak_v2 ,可以随意写。
```
#### 3、指定只备份分区中某个目录
**参数:-s 文件路径 只对指定的文件进行备份,-s 指定时,路径写的是相对路径(-s 可以是文件或目录)**
```sh
[root@Centos83 test]# xfsdump -f /opt/mygod_dump1 -s mygod /dev/sdb1 -L dump_mygod -M mygod
```
#### 4、查看备份信息与内容
备份成功后,我们就可以在/var/lib/xfsdump/inventory 目录下看到生成的档案信息
```sh
[root@Centos83 test]# xfsdump -I #(字母大写 I)不是 L
```
可以看到 session 信息
![image-20210620105646435](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620105646435.png)
测试恢复:先删除之前创建的内容
```sh
[root@Centos83 test]# ls #查看/test/目录下内容
mygod passwd
[root@Centos83 test]# pwd #显示当前路径
/test
[root@Centos83 test]# rm -rf ./* #删除/test/下所有文件和目录
```
### 3.4.3 文件系统恢复
**语法:xfsrestore -f 指定恢复文件的位置 指定存放恢复后的文件的路径**
```sh
[root@Centos83 test]# xfsrestore -f /opt/dump_sdb1 /test/ #用/opt/dump_sdb1备份来恢复/test/
[root@Centos83 test]# ls /test/ #查看恢复情况
```
恢复单个文件:
```sh
[root@Centos83 test]# xfsrestore -f /opt/mygod_dump1 -s mygod /var/test #用/opt/mygod_dump1这个备份文件来恢复 mygod 目录 到 /var/test
[root@Centos83 test]# xfsrestore -f /opt/dump_sdb1 -t #查看备份文件的内容
[root@Centos83 test]# ls /var/test/ #mygod目录已经成功恢复
mygod
```
**注:**
**使用 xfsdump 时,请注意下面下面的几个限制:**
**1、xfsdump 不支持没有挂载的文件系统备份!所以只能备份已挂载的!**
**2、xfsdump 必须使用 root 的权限才能操作 (涉及文件系统的关系)**
**3、xfsdump 只能备份 XFS 文件系统**
**4、xfsdump 备份下来的数据 (档案或储存媒体) 只能让 xfsrestore 解析**
**5、xfsdump 是透过文件系统的 UUID 来分辨各个备份档的,因此不能备份两个具有相同 UUID 的文件系统**
### 3.4.4 增量备份
**概念**
增量备份是指在**一次全备份**或上一次增量备份后,**以后每次的备份只需备份与前一次相比增加或者被修改的文件**。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,以此类推。
**优缺点**
优点:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。
缺点:增量备份的数据恢复比较麻烦,您必须具有上一次全量备份和所有增量备份数据(一旦丢失或损坏,就会导致恢复失败)并且恢复过程中,**必须遵循从最近一次全量备份开始,并以最近一次全量备份为起点,按备份等级依次进行数据恢复**。如图:
![image-20210620111710738](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210620111710738.png)
**实战: 增量备份文件系统**
**准备一个备份目录进行备份**
```sh
[root@Centos83 test]# tree /test/
/test/
|-- mygod
| `-- abc
`-- passwd
1 directory, 2 files
[root@Centos83 test]# xfsdump -f /opt/test-full /test -L test-full -M sdb1 #对上面的内容进行第一次全备
[root@Centos83 test]# touch /test/test1.txt /test/test2.txt #创建两个测试文件
[root@Centos83 test]# echo 'i love you' > /test/test1.txt #向test1中追加内容
[root@Centos83 test]# tree
.
|-- mygod
| `-- abc
|-- passwd
|-- test1.txt
`-- test2.txt
1 directory, 4 files
[root@Centos83 test]# xfsdump -l 1 -f /opt/test-bak1 /test -L test-bak2 -M sdb1 #对/test/目录做level 1 级别的增量备份 (-l小写的 L,不是大写的 i 做一个等级为 1 的备份)
#再次增加内容
[root@Centos83 test]# touch /test/mygod/a.txt /test/mygod/b.txt
[root@Centos83 test]# echo 'i hate you' > /test/test1.txt
[root@Centos83 test]# tree /test/
/test/
|-- mygod
| |-- a.txt
| |-- abc
| `-- b.txt
|-- passwd
|-- test1.txt
`-- test2.txt
1 directory, 6 files
[root@Centos83 test]# xfsdump -l 2 -f /opt/test-bak2 /test -L test-bak2 -M sdb1 #然后进行 level 2 级别的增量备
[root@Centos83 test]# xfsrestore -f /opt/test-bak1 -t #先恢复L2级别备份
[root@Centos83 test]# xfsrestore -f /opt/test-bak2 -t #再恢复L1级别备份
[root@Centos83 test]# rm -rf /test/* #删除所有数据
```
现在进行恢复,要想恢复全部全部数据,包括新添加的文件,如何恢复?
步骤:
1、先恢复完全备份
2、情况 1: 恢复最后一次增量备份(如果两次增量备份都是 1 级的,只需要恢复最后一个增量就可以了。)
3、情况 2:如果你做的是第一次是 1 级备,第二次是 2 级备,那么你在恢复的时候就需要先恢复完
全备份,然后是 1 级备,最后是 2 级备)
注:xfs 增量备份恢复时。要想把数据完全恢复,必须按顺序恢复。
不按顺序恢复是可以恢复一部分数据,但是不完整,比如例子中,1.txt 的值最后是 I hate you,如果先恢复 bak2,然后恢复 bak1,那么 1.txt 中的值将是 I love you
```sh
[root@Centos83 test]# xfsrestore -f /opt/test-full /test/ #全部恢复
[root@Centos83 test]# tree /test/ #查看完全恢复后的文件
/test/
|-- mygod
| `-- abc
`-- passwd
1 directory, 2 files
[root@Centos83 test]# xfsrestore -f /opt/test-bak1 /test/ #先恢复 back1,查看
[root@Centos83 test]# tree /test/
/test/
|-- mygod
| `-- abc
|-- passwd
|-- test1.txt
`-- test2.txt
1 directory, 4 files
[root@Centos83 test]# xfsrestore -f /opt/test-bak2 /test/ #再恢复 back2,查看
[root@Centos83 test]# tree /test/
/test/
|-- a.txt
|-- b.txt
|-- mygod
| `-- abc
|-- passwd
|-- test1.txt
`-- test2.txt
1 directory, 6 files #文件已经全部恢复回来
```
到此,数据恢复成功了。
**总结:**
**3.1 Linux 系统目录结构和相对路径与绝对路径**
**3.2 文件的管理**
**3.3 查看文件**
**3.4 实战:xfs 文件系统的备份和恢复**