Linux文件与文件系统的压缩

Linux文件与文件系统的压缩

压缩文件是一种将文件或目录通过减少其占用的存储空间来减小文件大小的过程。压缩文件的主要目的之一是节省存储空间。通过压缩文件,可以将文件占用的磁盘空间减少到较小的大小,从而在存储设备上容纳更多的文件

Linux系统常见的压缩命令

在Linux的环境中,压缩文件的扩展名大多是: tar、tar.gz、*tgz、*gz、 *.Z 、 *.bz2、 *.xz。

这是因为Linux支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,彼此之间可能就无法互通压缩/解压缩文件。所以,当你要下载某个压缩文件时,自然就需要知道该文件是由哪中压缩命令所制作出来的,好用来对照着解压缩,下面我们就列出了几个常见的压缩文件扩展名

*.Z         compress程序压缩的文件
*.zip       zip程序压缩的文件
*.gz        gzip程序压缩的文件
*.bz2       bzip2程序压缩的文件
*xz         xz程序压缩的文件
*.tar       tar程序打包的文件,并没有压缩过
*.tar.gz    tar程序打包的文件,并且经过gzip的压缩
*.tar.bz2   tar程序打包的文件,并且经过bzip2的压缩
*.tar.xz    tar程序打包的文件,并且经过xz的压缩

gzip,zcat/zmore/zless/zgrep

gzip可以说是应用最广泛的压缩命令了,gzip所建立的压缩文件为*.gz,命令语法如下

[root@chenshiren ~]# gzip [选项] 文件名
[root@chenshiren ~]# zcat 文件名.gz
选项作用
-c把压缩文件的数据输入到屏幕上
-d解压缩文件
-t可以校验压缩文件的一致性,看看文件是否有误
-v可以显示源文件/压缩文件的等比信息
-## 为数字,代表压缩等级,-1最快,但是压缩比最差
-9最慢,但是压缩比最好
默认是-6
# 示例1 找出/etc/下面(不含子目录)容量最大的文件,并把它复制到/tmp,然后以gzip压缩
[root@chenshiren ~]# ls -ldSrh /etc/*
...
...
-rw-r--r--.  1 root root     29K  810  2021 /etc/brltty.conf
-rw-r--r--.  1 root root     39K  34 22:41 /etc/ld.so.cache
-rw-r--r--.  1 root root     66K  422  2020 /etc/mime.types
-rw-r--r--.  1 root root    677K  623  2020 /etc/services
[root@chenshiren ~]# cd /tmp/
[root@chenshiren tmp]# cp  /etc/services .
[root@chenshiren tmp]# gzip -v services 
services:        79.4% -- replaced with services.gz
[root@chenshiren tmp]# ll -h /etc/services  /tmp/services.gz 
-rw-r--r--. 1 root root 677K  623  2020 /etc/services
-rw-r--r--. 1 root root 140K  36 21:13 /tmp/services.gz
# 当使用gzip压缩时,默认的状态下原本的文件会被压缩成为.gz后缀的文件,源文件就不再存在了

# 示例2 由于services是文本文件,将示例1的压缩文件的内容读出来
[root@chenshiren tmp]# zcat services.gz 
# 由于services.gz原本是文本文件,因此可以尝试使用zcat/zmore/zless去读取
# 此时屏幕会显示services.gz解压缩之后的原始文件内容

# 示例3 将示例1的文件解压缩
[root@chenshiren tmp]# gzip -d services.gz 
# 与gzip相反,gzip -d会将原本的.gz删除,恢复原本的services文件

# 示例4 将示例3解开的services用最佳的压缩比压缩,并保留原本的文件
[root@chenshiren tmp]# gzip -9 -c services > services.gz
[root@chenshiren tmp]# ll services services.gz 
-rw-r--r--. 1 root root 692252  36 21:13 services
-rw-r--r--. 1 root root 141945  36 21:28 services.gz

# 示例5 由示例4建立的services.gz 中,找出http这个关键字在哪几行
[root@chenshiren tmp]# zgrep -n 'http' services.gz 
....
87:http            80/tcp          www www-http    # WorldWideWeb HTTP
88:http            80/udp          www www-http    # HyperText Transfer Protocol
....

gzip这个压缩命令主要想要用来替换compress,所以不但compress的压缩文件可以使用gzip来解开,同时zcat这个命令可以读取compress与gzip的压缩文件

bzip2,bzcat/bzmore/bzless/bzgrepp

bzip2则是为了替换gzip并提供更佳的压缩比而来,bzip2甚至要比gzip还要好,bzip2的用法和gzip几乎相同

[root@chenshiren ~]# bzip2 [选项] 文件名
[root@chenshiren ~]# bzcat 文件名.bz2
选项作用
-c把压缩文件的数据输入到屏幕上
-d解压缩文件
-k保留原始文件,而不会删除原始的文件
-z压缩的参数(默认值,可以不加)
-v可以显示源文件/压缩文件的等比信息
-#与gzip同样,都是计算压缩比的参数,-9最佳,-1最快
# 示例1 将刚刚gzip示例留下来的/tmp/services以bzip2压缩
[root@chenshiren tmp]# bzip2 -v services
  services:  5.353:1,  1.495 bits/byte, 81.32% saved, 692252 in, 129328 out.
[root@chenshiren tmp]# ll -h services.gz  services.bz2 
-rw-r--r--. 1 root root 127K  36 21:13 services.bz2
-rw-r--r--. 1 root root 139K  36 21:29 services.gz
# 可以发现bzip的压缩比 要比gzip好
# 压缩率从之前的79%提升到了81%

# 示例2 将示例1的文件内容读出来
[root@chenshiren tmp]# bzcat services.bz2 

# 示例3 将示例1的文件解压缩
[root@chenshiren tmp]# bzip2 -d services.bz2 

# 将示例3解开的services用最佳的压缩比压缩,并保留原本的文件
[root@chenshiren tmp]# bzip2 -9 -c services > services.bz2

对于大容量文件来说,bzip2压缩时间会更久一点,至少比gzip要久的多

xz,xzcat/xzmore/xzless/xzgrep

虽然说bzip2已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了xz这个压缩比更高的软件,这个软件的用法也跟gzip/bzip2几乎一模一样

[root@chenshiren ~]# xz [选项] 文件名
选项作用
-d解压缩文件
-t测试文件的完整性
-l列出压缩文件的相关信息
-k保留原本的文件不删除
-v显示压缩或解压缩的信息
-c和之前两个解压缩命令一样,就是将数据在屏幕上输出
-#指定压缩级别,-1 到 -9 指定压缩级别,数字越大,压缩比越高
# 示例1 将刚刚bzip所留下来的/tmp/services 通过xz来压缩
[root@chenshiren tmp]# xz -v services
services (1/1)
  100 %       103.4 KiB / 676.0 KiB = 0.153 
[root@chenshiren tmp]# ll -h services.gz services.bz2 services.xz 
-rw-r--r--. 1 root root 127K  36 22:35 services.bz2
-rw-r--r--. 1 root root 139K  36 21:29 services.gz
-rw-r--r--. 1 root root 104K  36 21:13 services.xz
# 可以看到容量进一步的下降,压缩比很高

# 示例2 列出这个压缩文件的信息,然后读出这个压缩文件的内容
[root@chenshiren tmp]# xz -l services.xz 
   流      块     压缩大小     解压大小   比例  校验    文件名
    1       1    103.4 KiB    676.0 KiB  0.153  CRC64   services.xz 
    # 可以看到压缩前后的容量
[root@chenshiren tmp]# xzcat services.xz 

# 示例3 解压缩
[root@chenshiren tmp]# xz -d services.xz 

# 示例4 保留原文件的文件名,并建立压缩文件
[root@chenshiren tmp]# xz -k services
[root@chenshiren tmp]# ll -hS services services.gz services.bz2 services.xz  
-rw-r--r--. 1 root root 677K  36 21:13 services
-rw-r--r--. 1 root root 139K  36 21:29 services.gz
-rw-r--r--. 1 root root 127K  36 22:35 services.bz2
-rw-r--r--. 1 root root 104K  36 21:13 services.xz

xz虽然压缩比优化了很多,但是运算时间比gzip,bzip2久

gzip,bzip2,xz压缩时间对比

[root@chenshiren tmp]# time gzip -c services > services.gz
real    0m0.014s
user    0m0.005s
sys     0m0.008s

[root@chenshiren tmp]# time bzip2 -c services > services.bz
real    0m0.023s
user    0m0.019s
sys     0m0.004s

[root@chenshiren tmp]# time xz -c services > services.xz
real    0m0.133s
user    0m0.117s
sys     0m0.015s

# real:表示从命令开始执行到执行结束的实际时间,单位是分钟(m)和秒(s)
# user:命令的用户运行时间(user)
# sys:系统运行时间(sys)

可以看到gzip压缩时间 要比 xz快10倍

在选择上如果你并不觉得时间是你的成本考虑,那么使用xz会比较好

如果时间是你的重要成本,那么gzip比较适合

打包命令:tar

tar是一个常用的Linux打包命令,可以将多个文件或目录打包成一个文件。tar本身不进行压缩,但可以配合gzip、bzip2等工具进行压缩,接下来我们来看看他的语法

[root@chenshiren ~]# tar  [选项] 文件名
选项作用
-c新建打包文件
-t查看打包文件的内容含有哪些文件名
-x解包或解压缩的功能,可以搭配-C(大写)在特定目录解压
-z使用gzip进行压缩/解压缩,时文件名最好为:*.tar.gz
-j使用bzip2进行压缩/解压缩,此时文件名最好为:*.tar.bz2
-J使用xz进行压缩/解压缩,此时文件名最好为:*.tar.xz
-v显示打包过程
-C这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项
-f指定打包后的文件名
-p(小写)保留备份数据的原本权限与属性,常用于备份重要的配置文件
-p(大写)保留绝对路径,就是允许备份数据中含有根目录存在的意思
–exclude=File要排除打包的文件名或目录名

其实最简单的使用tar就只用记住下面的命令即可:

压缩:  tar -jcv  file.tar.bz2  [要被压缩的文件名字或者目录名称]
查询:  tar -jtv  file.tar.bz2
解压缩:tar -jxv  file.tar.bz2 -C [指定解压到的哪个目录]

file.tar.bz2 是自己取的文件名,tar并不会主动创建文件名,需要我们自定义,
所以扩展名就显得很重要了,如果不加[-z][-j][-J]的话,文件名最好取为 *.tar即可。
如果是 -j选项,代表bzip2的支持,因此文件名最好取为*.tar.bz2,
因为bzip2会产生.bz2的扩展名,至于如果是加上了-z的gzip的支持,那文件名最好为*.tar.gz

然后使用time查看-z ,-j,-J,哪个打包时间最长,哪个时间最短

[root@chenshiren ~]# time tar -jpcv -f etc.tar.bz2 /etc
tar: 从成员名中删除开头的“/”
...
...
real    0m1.325s
user    0m1.081s
sys     0m0.283s

[root@chenshiren ~]# time tar -zpcv -f etc1.tar.gz /etc
tar: 从成员名中删除开头的“/”
...
...
real    0m0.602s
user    0m0.112s
sys     0m0.557s

[root@chenshiren ~]#  time tar -Jpcv -f etc2.tar.xz /etc
tar: 从成员名中删除开头的“/”
...
...
real    0m6.819s
user    0m2.719s
sys     0m4.179s

我们使用du -h 目录来查看他们创建的压缩文件所占用大小
[root@chenshiren ~]# du -h etc*
9.2M    etc1.tar.gz
7.4M    etc2.tar.xz
8.4M    etc.tar.bz2

# 可以看出压缩比越好当然花费的时间越长,虽然gzip速度块,总时间不到1秒,但是压缩率糟糕
# 使用xz的话,虽然压缩比最佳,不过要花6秒,还是仅仅备份7MB的文件
# 如果要备份很大的话要考虑一下时间成本
# tar: 从成员名中删除开头的“/” 
# 如果没有去掉根目录,解压缩后的文件名就会是绝对路径
# 即解压缩后的数据一定会被放置到/etc/xxx去,你原本的/etc/下面的数据就会被覆盖

查看tar文件的数据内容(可查看文件名)

[root@localhost ~]# tar -jvt -f etc.tar.bz2 
....
....
drwxr-xr-x root/root         0 2023-04-06 15:25 etc/libreport/
drwxr-xr-x root/root         0 2020-04-02 21:38 etc/libreport/events/
drwxr-xr-x root/root         0 2023-04-06 15:25 etc/libreport/events.d/
-rw-r--r-- root/root       157 2022-02-24 01:09 etc/libreport/events.d/mdadm_
# 加上-v的选项,详细的文件权限/属性都会被列出来。如果只想知道文件名可以把-v去掉

如果需要备份根目录到tar的文件中,可以使用-P(大写)这个选项

[root@chenshiren ~]# tar -jcvpP -f etc.and.root.tar.bz2 /etc
[root@chenshiren ~]# tar -jtf /root/etc.and.root.tar.bz2 
# 加上-P参数文件名内的根目录就会存在

将备份数据解压缩,并考虑特定目录的解压缩操作(-C选项的应用)

[root@chenshiren ~]# tar -jxv -f etc.tar.bz2 
[root@chenshiren ~]# ll -d /etc/
drwxr-xr-x. 133 root root 8192  36 18:04 /etc/
# 如果不加-C 会在当前目录解压缩
[root@chenshiren ~]# tar -jxv -f etc.tar.bz2 -C /tmp/
[root@chenshiren ~]# ll -d  etc /tmp/etc/
drwxr-xr-x. 133 root root 8192  36 18:04 etc
drwxr-xr-x. 133 root root 8192  36 18:04 /tmp/etc/
# 加上-C会在你指定的目录解压缩

仅解开单一文件的方法

如果只想要解开文件内其中一个文件,只要使用【-jtv】找到你要的文件名,然后将该文件名解开即可

[root@chenshiren ~]# tar -jtv -f etc.tar.bz2 |grep 'passwd'
-rw-r--r-- root/root      2187 2024-02-27 23:28 etc/passwd  # 这个就是我要找的文件
-rw-r--r-- root/root       168 2021-08-10 23:53 etc/pam.d/passwd
-rw-r--r-- root/root      2150 2024-02-26 00:07 etc/passwd-
-rw------- root/root         0 2022-11-29 20:35 etc/security/opasswd
[root@chenshiren ~]# tar -jxv -f etc.tar.bz2  etc/passwd
etc/passwd
[root@chenshiren ~]# ll etc
-rw-r--r--. 1 root root 2187  227 23:28 passwd
# 此时只会解开一个文件

打包某目录,但不含该目录下的某些文件

假设我们要打包 /etc/yum 这几个目录,但却不想要打包 /etc/yum/vars 和 /etc/yum/version-groups.conf文件,而且假设这个新的打包文件为 yum.tar.bz2 ,此时我们可以通过 --exclude的帮忙。这个exclude就是不包含的意思

[root@localhost ~]# tar -jcv  -f yum.tar.bz2 --exclude=/etc/yum/vars  --exclude=/etc/yum/version-groups.conf   /etc/yum/
tar: 从成员名中删除开头的“/”
/etc/yum/
/etc/yum/protected.d/
/etc/yum/protected.d/systemd.conf
/etc/yum/pluginconf.d/
/etc/yum/pluginconf.d/fastestmirror.conf
/etc/yum/pluginconf.d/langpacks.conf
/etc/yum/fssnap.d/

仅备份比某个时刻还要新的内容

可以使用【–newer】【–never-mtime】

【–newer】表示后续的日期包含mtime与ctime

【–newer-mtime】表示仅有mtime

# 1.先用find找到比/etc/passwd还要新的文件
[root@chenshiren ~]# find /etc  -newer /etc/passwd  
....
...
[root@chenshiren ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2187  227 23:28 /etc/passwd
# 2.使用tar打包
[root@chenshiren ~]# tar -jcvp -f etc.newer.passwd.tar.bz2 --newer-mtime="2024/02/27" /etc/*
# 3.显示文件
[root@chenshiren ~]# tar -jt -f etc.newer.passwd.tar.bz2 |grep -v '/$'

特殊应用:利用管道命令与数据流

通过标准输入输出的数据流重定向,以及管道命令的方式,将待处理的文件一边打包一边解压缩到目标目录

# 将 /etc 整个目录一边打包一边在/tmp 解开
[root@chenshiren tmp]# cd /tmp/
[root@chenshiren tmp]# tar -cvf - /etc | tar xvf -
# - 表示被打包的文件

打包命令:zip、unzip

zip可以将多个文件或目录打包成一个zip文件

zip [选项] [压缩文件名] [文件或目录名]

选项:
-r:递归压缩子目录中的文件。
-q:安静模式,不输出任何消息。
-m:压缩后删除原文件。
-j:仅压缩文件,不包括目录。
-u:更新压缩文件,仅添加新文件和已修改的

zip命令的使用实例

将文件或目录压缩成zip文件:

zip -r compressed.zip directory/  csq/

# 这个命令将目录"directory/" 和 “csq”及其所有子目录和文件压缩成一个名为"compressed.zip"的zip文件。

添加文件到已有的zip文件:

zip -u compressed.zip file.txt

# 这个命令将文件"file.txt"添加到名为"compressed.zip"的zip文件中。

unzip

unzip命令可以将zip格式的文件解压缩到指定的目录中,或者将其解压缩到当前目录下。下面详细介绍一下unzip命令的使用方法。

unzip命令的基本语法如下:

unzip [选项] 文件名.zip [-d 目标目录]

选项:

-q:安静模式,不输出任何信息。
-o:覆盖已有的文件。
-j:只解压缩文件,不创建目录。
-d 目标目录:指定解压缩后的文件存放的目录,默认为当前目录。

unzip命令的使用示例

  1. 将文件file.zip解压缩到当前目录:
unzip file.zip
  1. 将文件file.zip解压缩到目录/home/user/下:
unzip file.zip -d /home/user/
  1. 只解压缩文件file.zip中的所有txt文件,并将其解压缩到当前目录:
unzip file.zip '*.txt'
  1. 将文件file.zip解压缩到目录/home/user/下,并覆盖已有的文件:
unzip -o file.zip -d /home/user/

Linux XFS文件系统的备份与还原

tar通常用于针对目录树系统来进行备份工作,如果要针对整个文件系统来进行备份,可以使用xfsdump和xfsrestore

XFS文件系统备份xfsdump

其实xfsdump的功能强大,他除了可以进行文件系统完整备份之外,还可以进行增量备份。增量备份可以这样理解:假设你的/home是独立的一个文件系统,那你在第一次使用xfsdump进行完整备份后,等过一段时间的文件系统自然运行后,你再进行第二次xfsdump时,就可以选择增量备份了。此时新备份的数据只会记录与第一次完整备份所有差异的文件而已,如下图

image-20240308134809632

上方的文件系统是一直随着时间变化的数据,例如在/home里面的文件数据会一直变化一样。而下面的方块则是xfsdump备份起来的数据,

第一次备份一定是完整备份,完整备份在xfsdump当中帝国以为level 0

第二次备份时,/home文件系统内的数据已经与level 0 不一样了,而level 1 仅只是比较目前的文件系统与level 0之间的差异后,备份有变化的文件。至于各个level的记录文件则放置于/var/lib/xfsdump/inventory中

使用xfsdump,注意以下的限制:

  • xfsdump 不支持没有挂载的文件系统备份,所以只能备份已挂载的文件系统
  • xfsdump 必须使用root的权限才能操作(涉及文件系统的关系)
  • xfsdump 只能备份xfs文件系统
  • xfsdump 备份下来的数据(文件或储存媒介)只能让xfsrestore解析
  • xfsdump 是通过文件系统的UUID来辨别各备份文件,因此不能备份两个具有相同UUID的文件系统
[root@chenshiren ~]# xfsdump [-L label] [-M M_label] [-l #] [-E 备份文件] 待备份数据
[root@chenshiren ~]# xfsdump -I

选项:
-L :xfsdump会记录每次备份的session标头,这里可以填写针对此文件系统的简易说明
-M :xfsdump可以记录存储媒介的标头,这里可以填写此媒介的简易说明
-l :是L的小写,是指定等级,总共有0~9共10个等级(默认为0,即完整备份)
-f :指定备份输出文件的名称
-I 从/var/lib/xfsdump/inventory列出目前备份的信息状态

# xfsdump默认仅支持文件系统的备份,并不支持特定目录的备份
# 所以你不能用xfsdump去备份/etc/,因此/etc从来就不是一个独立的文件系统

xfsdump备份完整的文件系统

假设你在/boot划分出自己的文件系统,要整个文件系统备份可以这样:

  1. 先确定/boot是独立的文件系统
[root@chenshiren ~]#  df -h /boot/
文件系统        容量  已用  可用 已用% 挂载点
/dev/nvme0n1p3 1014M  257M  758M   26% /boot
#独立的文件系统,/boot是挂载点
  1. 将完整备份的文件名记录成为/srv/boot.dump
[root@chenshiren ~]# xfsdump -l 0 -L boot_level_0 -M boot_level_0 -f /srv/boot.dump /boot                  
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of chenshiren:/boot       # 开始备份/boot
xfsdump: dump date: Fri Mar  8 14:05:24 2024    # 备份时间
xfsdump: session id: 1dcbb5da-16b7-46cd-9382-f091319e39b7  # dump ID
xfsdump: session label: "boot_level_0"        # 这是我们指定的备份名称
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: 227974080 bytes   # 估计的备份大小
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 227666808 bytes
xfsdump: dump size (non-dir files) : 227412568 bytes
xfsdump: dump complete: 1 seconds elapsed
xfsdump: Dump Summary:    # 备份概况
xfsdump:   stream 0 /srv/boot.dump OK (success) # 完整备份到/srv/boot.dump文件
xfsdump: Dump Status: SUCCESS  # 备份成功
# 在命令的执行方面,你也可以不加-L和-M,只是那就会进入交互模式,要求你回车

[root@chenshiren ~]# du -hs /boot /srv/boot.dump   # 完整备份
218M    /boot
218M    /srv/boot.dump

[root@chenshiren ~]# ll /var/lib/xfsdump/inventory/
总用量 16
-rw-r--r--. 1 root root 5080  38 14:05 53a83d30-6422-4f3e-ada8-af21893df883.StObj
-rw-r--r--. 1 root root  312  38 14:05 a0af4b7c-a869-4878-af70-40226ede5b91.InvIndex
-rw-r--r--. 1 root root  576  38 14:05 fstab
# 使用了xfsdump之后才会有上述/var/lib/xfsdump/inventory内的文件产生

[root@chenshiren ~]# xfsdump -I  # 列出目前备份的信息
file system 0:
        fs id:          a0af4b7c-a869-4878-af70-40226ede5b91 # 文件系统ID
        session 0:
                mount point:    chenshiren:/boot    # 文件系统挂载点
                device:         chenshiren:/dev/nvme0n1p3 # 文件系统所在设备
                time:           Fri Mar  8 14:05:24 2024 # 备份操作时间
                session label:  "boot_level_0"  # 使用-L指定的标签 用于辨别等级
                session id:     1dcbb5da-16b7-46cd-9382-f091319e39b7 # dump ID
                level:          0  # 备份级别0:完整备份
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump # 备份文件的路径
                        start:          ino 133 offset 0
                        end:            ino 1573039 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     227666808
                                mfile start:    ino 133 offset 0
                                mfile end:      ino 1573039 offset 0
                                media label:    "boot_level_0"
                                media id:       2ac93526-f9d7-4a93-9325-ef1bb5d94f36
xfsdump: Dump Status: SUCCESS  # 备份状态成功

xfsdump进行增量备份

一定要记住进行过完整备份后【-l 0】才能够继续由其他增量备份【-l 1~9】的能力,所以得确定上面的实践已经完成才行,接下里进行增量备份功能

  1. 我们可以先建立一个大小约为10M的文件在/boot内
[root@chenshiren ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB,10 MiB)已复制,0.00204876 s,5.1 GB/s
[root@chenshiren ~]# ll /boot/testing.img 
-rw-r--r--. 1 root root 10485760  38 14:24 /boot/testing.img
  1. 开始建立差异备份文件,此时我们使用level 1
[root@chenshiren ~]# xfsdump -l 1 -L boot_level_1 -M boot_level_1 -f /srv/boot_level_1.dump /boot
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsdump: level 1 incremental dump of chenshiren:/boot based on level 0 dump begun Fri Mar  8 14:05:24 2024
xfsdump: dump date: Fri Mar  8 14:27:01 2024
xfsdump: session id: e257e756-0414-4cc7-a7ff-026476f08a50
xfsdump: session label: "boot_level_1"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: pruning unneeded subtrees
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 10506880 bytes
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 10510952 bytes
xfsdump: dump size (non-dir files) : 10488360 bytes
xfsdump: dump complete: 1 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /srv/boot_level_1.dump OK (success)
xfsdump: Dump Status: SUCCESS
[root@chenshiren ~]# ll /boot/testing.img  /srv/boot_level_1.dump 
-rw-r--r--. 1 root root 10485760  38 14:24 /boot/testing.img
-rw-r--r--. 1 root root 10510952  38 14:27 /srv/boot_level_1.dump
# 看文件大小就是备份的刚刚创建的文件
  1. 最后再看看是否记录了 level 1备份的时间点
[root@chenshiren ~]# xfsdump -I
file system 0:
        fs id:          a0af4b7c-a869-4878-af70-40226ede5b91
        session 0:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:05:24 2024
                session label:  "boot_level_0"
                session id:     1dcbb5da-16b7-46cd-9382-f091319e39b7
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump
                        start:          ino 133 offset 0
                        end:            ino 1573039 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     227666808
                                mfile start:    ino 133 offset 0
                                mfile end:      ino 1573039 offset 0
                                media label:    "boot_level_0"
                                media id:       2ac93526-f9d7-4a93-9325-ef1bb5d94f36
        session 1:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:27:01 2024
                session label:  "boot_level_1"
                session id:     e257e756-0414-4cc7-a7ff-026476f08a50
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot_level_1.dump
                        start:          ino 143 offset 0
                        end:            ino 144 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     10510952
                                mfile start:    ino 143 offset 0
                                mfile end:      ino 144 offset 0
                                media label:    "boot_level_1"
                                media id:       3ae514c9-395a-46ae-ab11-94cd0460e0ca
xfsdump: Dump Status: SUCCESS

XFS文件系统还原xfsrestore

xfsdump的恢复使用的是xfsrestore这个命令,这个命令的选项也非常多,可以自行查看,在这里简单的介绍一下

[root@localhost ~]# xfsrestore -I        # 查看备份文件
xfsrestore [ -f 备份文件]  [ -L label ] [ -s ] 待恢复目录    <==单一文件全系统恢复
xfsrestore [ -f 备份文件]  -r 待恢复目录      # 通过增量备份文件来恢复系统
xfsrestore [ -f 备份文件]  -i 待恢复目录      # 进入交互模式

选项:
-I  :跟xfsdump相同的输出,可查询备份数据,包括Label名称与备份时间等
-f  :指定备份数据的存储位置
-L  :就是session的Label name,可以用 -I查询到
-s  :需要接某特定目录,就是仅恢复某一个文件或目录的意思
-r  :如果用文件来存储备份数据,则不需要使用,如果是一个磁带内有多个文件,
      需要此选项来完成累计恢复
-i  :进入交互模式,高级管理员使用的,一般不需要操作他

用xfsrestore观察和xfsdump后的备份数据内容

要找出xfsdump内容就使用xfsrestore -I 来查看即可,不需要加任何参数,因为xfsdump与xfsrestore 都会到 /var/lib/xfsdumop/inventory/ 里面去取数据来显示,因此两者输出是相同的

[root@chenshiren ~]# xfsrestore -I
file system 0:
        fs id:          a0af4b7c-a869-4878-af70-40226ede5b91
        session 0:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:05:24 2024
                session label:  "boot_level_0"
                session id:     1dcbb5da-16b7-46cd-9382-f091319e39b7
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot.dump
                        start:          ino 133 offset 0
                        end:            ino 1573039 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     227666808
                                mfile start:    ino 133 offset 0
                                mfile end:      ino 1573039 offset 0
                                media label:    "boot_level_0"
                                media id:       2ac93526-f9d7-4a93-9325-ef1bb5d94f36
        session 1:
                mount point:    chenshiren:/boot
                device:         chenshiren:/dev/nvme0n1p3
                time:           Fri Mar  8 14:27:01 2024
                session label:  "boot_level_1"
                session id:     e257e756-0414-4cc7-a7ff-026476f08a50
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        pathname:       /srv/boot_level_1.dump
                        start:          ino 143 offset 0
                        end:            ino 144 offset 0
                        interrupted:    NO
                        media files:    1
                        media file 0:
                                mfile index:    0
                                mfile type:     data
                                mfile size:     10510952
                                mfile start:    ino 143 offset 0
                                mfile end:      ino 144 offset 0
                                media label:    "boot_level_1"
                                media id:       3ae514c9-395a-46ae-ab11-94cd0460e0ca
xfsrestore: Restore Status: SUCCESS
# 重要的就是那个session label

恢复level 0 的文件系统

先来处理一个简单的任务,就是让/boot整个恢复到最原本的状态,你该如何处理呢?其实很简单,我们只要知道想要被恢复的那个文件,以及该文件的session label name 就可以恢复,我们从上面观察已经知道了 level 0 的 session label 是【boot_level_0】 那整个流程是这样的

  1. 将完整备份覆盖回去
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump -L boot_level_0  /boot   
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 10 directories and 354 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
  1. 将备份数据在/tmp/boot 下面解开
[root@chenshiren ~]# mkdir /tmp/boot
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump -L boot_level_0  /tmp/boot
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 10 directories and 354 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 1 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@chenshiren ~]# du -sh /boot /tmp/boot/
228M    /boot
218M    /tmp/boot/
# 可以看到两个文件大小不一致
[root@chenshiren ~]# diff -r /boot/ /tmp/boot/
只在 /boot/ 存在:testing.img
# 是因为我们在 /boot/下面新增的文件testing.img

因为原本/boot 里面的东西我们没有删除,直接恢复的结果就是:同名的文件会被覆盖,其他系统内新的文件会被保留。所以,那个/boot/testing.img 就会一直在里面,如果备份的目的就是新的位置,当然就只有原本备份的数据而已,而diff -r 可以比较两个目录内的文件差异,通过该命令我们可以找到两个目录之间的差异

  1. 仅恢复备份文件/boot内的grub2恢复到/tmp/boot2里面去

如果只想恢复某个目录或文件的话,直接加上-s 后面加上恢复的目录或文件

[root@chenshiren ~]# mkdir /tmp/boot2
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump  -L boot_level_0   -s grub2  /tmp/boot2
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 10 directories and 354 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@chenshiren ~]# ll /tmp/boot2/
drwx------. 5 root root       97  34 16:27 grub2

# 如果要备份文件/boot/grub2/locale/zh_CN.mo文件呢?-s应该怎么填写
[root@chenshiren ~]# mkdir /tmp/boot3/
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump  -L boot_level_0  -s grub2/locale/zh_CN.mo  /tmp/boot3/       
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 10 directories and 354 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@chenshiren ~]# tree /tmp/boot3/
/tmp/boot3/
└── grub2
    └── locale
        └── zh_CN.mo
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump  -L boot_level_0  -s zh_CN.mo  /tmp/boot3/    # 这样写就会报错      

恢复增量备份数据

其实恢复增量备份与恢复单一文件系统相似。如果备份数据是有level 0 ==> level 1 ==> level 2 去进行的,当然恢复就得要相同的流程来恢复了。因此当我们恢复了level 0 之后,接下来当然就要恢复 level 1 到系统内,我们可以从前一个案例恢复 /tmp/boot 的情况来继续往下处理

继续恢复level 1到 /tmp/boot当中

[root@chenshiren ~]# xfsrestore -f /srv/boot_level_1.dump   /tmp/boot/   
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: chenshiren
xfsrestore: mount point: /boot
xfsrestore: volume: /dev/nvme0n1p3
xfsrestore: session time: Fri Mar  8 14:27:01 2024
xfsrestore: level: 1
xfsrestore: session label: "boot_level_1"
xfsrestore: media label: "boot_level_1"
xfsrestore: file system id: a0af4b7c-a869-4878-af70-40226ede5b91
xfsrestore: session id: e257e756-0414-4cc7-a7ff-026476f08a50
xfsrestore: media id: 3ae514c9-395a-46ae-ab11-94cd0460e0ca
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 1 directories and 12 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot_level_1.dump OK (success)
xfsrestore: Restore Status: SUCCES
[root@chenshiren ~]# du -sh /boot/ /tmp/boot/
228M    /boot/
228M    /tmp/boot/
# 一模一样了

仅还原部分文件

刚刚的 -s可以接部分数据来还原,但是,如果我就根本不知道备份文件里面有啥文件,可以用-i这个交互式界面。举例来说,我们想要知道 level 0的备份数据里面有哪些东西,如何再少了的还原回来的话

  1. 先进入备份文件内,准备找出需要备份的文件,同时预计还原到/tmp/boot3中
[root@chenshiren ~]# mkdir /tmp/boot4/
[root@chenshiren ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot4/
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: chenshiren
xfsrestore: mount point: /boot
xfsrestore: volume: /dev/nvme0n1p3
xfsrestore: session time: Fri Mar  8 14:05:24 2024
xfsrestore: level: 0
xfsrestore: session label: "boot_level_0"
xfsrestore: media label: "boot_level_0"
xfsrestore: file system id: a0af4b7c-a869-4878-af70-40226ede5b91
xfsrestore: session id: 1dcbb5da-16b7-46cd-9382-f091319e39b7
xfsrestore: media id: 2ac93526-f9d7-4a93-9325-ef1bb5d94f36
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 10 directories and 354 entries processed
xfsrestore: directory post-processing

 ========================== subtree selection dialog ==========================

the following commands are available:
        pwd 
        ls [ <path> ]
        cd [ <path> ]
        add [ <path> ]
        delete [ <path> ]
        extract 
        quit 
        help 

 -> ls
             140 initramfs-0-rescue-889198c3191e4649bfe58b756b608346.img 
             139 vmlinuz-0-rescue-889198c3191e4649bfe58b756b608346 
             138 initramfs-5.14.0-284.11.1.el9_2.x86_64.img 
             137 symvers-5.14.0-284.11.1.el9_2.x86_64.gz 
             136 .vmlinuz-5.14.0-284.11.1.el9_2.x86_64.hmac 
             135 config-5.14.0-284.11.1.el9_2.x86_64 
             134 System.map-5.14.0-284.11.1.el9_2.x86_64 
             133 vmlinuz-5.14.0-284.11.1.el9_2.x86_64 
             132 loader/
         1572992 grub2/
             131 efi/

 -> ls grub2/
         1573038 grub.cfg 
         1573036 grubenv 
             141 fonts/
         1572994 locale/
         1069185 i386-pc/
         1572993 device.map 

 -> add grub2

 -> add config-5.14.0-284.11.1.el9_2.x86_64

 -> extract

 --------------------------------- end dialog ---------------------------------

xfsrestore: restoring non-directory files
xfsrestore: restore complete: 41 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
[root@chenshiren ~]# ll -h /tmp/boot4/
总用量 212K
-rw-r--r--. 1 root root 211K  412  2023 config-5.14.0-284.11.1.el9_2.x86_64
drwx------. 5 root root   97  34 16:27 grub2

光盘写入工具

命令行模式下刻录操作,做法:

  • 先将所需要备份的数据创建成为一个镜像文件(iso),利用mkisofs命令来处理
  • 将该镜像文件刻录至CD或DVD当中,利用cdrecord命令来处理

mkisofs:建立镜像文件

刻录可启动与不可启动的光盘,使用的方法不一样

制作一般数据光盘镜像文件

在网上下载的Linux镜像文件(不管是CD还是DVD)都要继续刻录成为物理的CD/DVD后,才能够进一步使用,包括安装或更新你的Linux。

同样道理,你想要利用刻录机将你的数据刻录到DVD时,也得要将数据制作成镜像文件,这样才能够写入DVD中,而将你的数据制作成镜像文件的方式就通过【mkisofs】这个命令实现

# 如果没有命令需要配置yum仓库进行安装
[root@chenshiren ~]# yum install -y mkisofs
[root@chenshiren ~]# mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份的文件 ..\
> -graft-point isodir=systemdir ..
选项:
-o :后面接你想要产生的那个镜像文件
-J :产生较兼容Windows的文件名结构,可增加文件名长度到64个unicode字符
-r :通过Rock Ridge产生支持UNIX/Linux的文件数据,可记录较多的信息(如UID/GID等)
-v(小写) :显示创建ISO文件的过程
-V(大写) vol :建立Volume,有点像Windows在文件资源管理内看到的CD卷标
-m file:-m为排除文件(exclude)的意思,后面的文件不备份到镜像文件中,也能使用*通配符
-graft-points :graft有转嫁或移植的意思

默认情况下,所有被加到镜像文件中的文件都会被放置到镜像文件的根目录。

可以使用【-graft-points】,当你使用了这个选项后,可以利用如下方法来定义镜像文件中的目录

  • 镜像文件中的目录所在等于实际Linux文件系统的目录所在
  • /movies/=/srv/movies/ (在Linux的/srv/movies内的文件,加至镜像文件中的/movies/ 目录)
  • /linux/etc=/etc(在Linux中的/etc内的所有数据备份到镜像文件中的/linux/etc/ 目录)
# 示例1 先不用-graft-points选项,如果想要将/root、/home、/etc等目录内的数据刻录的话
[root@chenshiren ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.

Drive current: -outdev 'stdio:/tmp/system.img' # ISO镜像文件的路径
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 10.9g free
Added to ISO image: directory '/'='/root'  # 显示了被添加到镜像中的目录以及文件数目
xorriso : UPDATE :     314 files added in 1 seconds
Added to ISO image: directory '/'='/home'
Added to ISO image: directory '/'='/etc'
xorriso : UPDATE :    2155 files added in 1 seconds
xorriso : UPDATE :  19.59% done # 更新ISO镜像的进度,包括添加文件的数量和进度
ISO image produced: 18640 sectors
Written to medium : 18640 sectors at LBA 0
Writing to 'stdio:/tmp/system.img' completed successfully. # 写入完成
[root@chenshiren ~]# ll -h /tmp/system.img                                            
-rw-r--r--. 1 root root 37M  38 16:03 /tmp/system.img
[root@chenshiren ~]# mount -o loop /tmp/system.img /mnt/ 
[root@chenshiren ~]# ls /mnt/
accountsservice         cron.d                   environment   gshadow-         libreport                 networks           protocols       skel                udev
adjtime                 cron.daily               ethertypes    gss              libssh                    nftables           pulse           smartmontools       udisks2
....
....
# 可以看到三个目录【/root、/home、/etc】的数据通通放置到了镜像文件的顶层目录中
[root@chenshiren ~]# umount /mnt 
# 卸载

# 示例2 使用-graft-points选项
[root@chenshiren ~]# mkisofs -r -V 'linux_file' -o /tmp/system.img -graft-points /root=/root /home=/home /etc=/etc   
xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.

Drive current: -outdev 'stdio:/tmp/system.img'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data, 10.9g free
xorriso : WARNING : -volid text does not comply to ISO 9660 / ECMA 119 rules
Added to ISO image: directory '/root'='/root'
xorriso : UPDATE :     314 files added in 1 seconds
Added to ISO image: directory '/home'='/home'
Added to ISO image: directory '/etc'='/etc'
xorriso : UPDATE :    2155 files added in 1 seconds
ISO image produced: 18643 sectors
Written to medium : 18643 sectors at LBA 0
Writing to 'stdio:/tmp/system.img' completed successfully.
[root@chenshiren ~]# ll -h /tmp/system.img 
-rw-r--r--. 1 root root 37M  38 16:14 /tmp/system.img
[root@chenshiren ~]# mount -o loop /tmp/system.img  /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@chenshiren ~]# ll /mnt/
dr-xr-xr-x. 1 root root 30720  38 15:36 etc
dr-xr-xr-x. 1 root root  2048  227 23:28 home
dr-xr-xr-x. 1 root root  4096  37 12:05 root
# 数据是在各个目录中的
[root@chenshiren ~]# umount /mnt 

还有一种简单的方法,就是将所有的数据预先处理到某一个目录中,再刻录该目录即可

例如上述的/etc、/root、/home】先全部复制到【/srv/cdrom】 当中,然后跑到【/srv/cdrom 】当中,再使用类似[mkisofs -r -v -o /tmp/system.img .】的方式来处理即可

制作/修改可启动光盘镜像文件

  1. 先找个镜像文件放在/home目录下
[root@chenshiren home]# ls
csq  Rocky-9-latest-x86_64-dvd.iso
  1. 挂载光盘到/mnt,并且将所有数据完整复制到/srv/newcd目录中
[root@chenshiren home]# mount -o loop Rocky-9-latest-x86_64-dvd.iso /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@chenshiren home]# mkdir /srv/newcd
[root@chenshiren home]# rsync -a /mnt/ /srv/newcd/
[root@chenshiren ~]# ll /srv/newcd/
drwxr-xr-x. 4 root root   38 1112 16:03 AppStream
drwxrwxr-x. 4 root root   38 1113 06:40 BaseOS
drwxrwxr-x. 3 root root   18 1113 05:32 EFI
drwxrwxr-x. 3 root root   59 1113 05:32 images
drwxrwxr-x. 2 root root 4096 1113 05:32 isolinux
-rw-r--r--. 1 root root 2204 1021 04:24 LICENSE
-rw-r--r--. 1 root root  101 1113 06:33 media.repo
# rsync 可以完整的复制所有的权限属性等数据
  1. 假设已经处理完毕你在/srv/newcd里面所要进行的各项修改操作,准备建立iso文件
[root@chenshiren ~]# ll /srv/newcd/isolinux/
-r--r--r--. 1 root root      2048 1113 05:32 boot.cat  # 启动的安全编录文件
-rw-r--r--. 1 root root        84 1113 05:32 boot.msg
-rw-r--r--. 1 root root       295 1113 05:32 grub.conf
-rw-r--r--. 1 root root 103333400 1113 05:32 initrd.img
-rw-r--r--. 1 root root     38912 111  2022 isolinux.bin  # 相当于启动引导程序
-rw-r--r--. 1 root root      3053 1113 05:32 isolinux.cfg
-rw-r--r--. 1 root root    115844 111  2022 ldlinux.c32
-rw-r--r--. 1 root root    179456 111  2022 libcom32.c32
-rw-r--r--. 1 root root     23508 111  2022 libutil.c32
-rw-r--r--. 1 root root    153868  516  2022 memtest
-rw-r--r--. 1 root root       186  27  2023 splash.png
-rw-r--r--. 1 root root     26696 111  2022 vesamenu.c32
-rwxr-xr-x. 1 root root  13364712 119 01:47 vmlinuz       # Linux内核文件
[root@chenshiren newcd]# mkisofs -o /srv/newcd/custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot  -V 'Rocky-9-latest-x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .  
xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.

Drive current: -outdev 'stdio:/srv/newcd/custom.iso'
Media current: stdio file, overwriteable
Media status : is blank
Media summary: 0 sessions, 0 data blocks, 0 data,  9.9g free
xorriso : WARNING : -volid text does not comply to ISO 9660 / ECMA 119 rules
xorriso : NOTE : -as genisofs: Ignored option '-T'
Added to ISO image: directory '/'='/srv/newcd'
xorriso : UPDATE :    6929 files added in 1 seconds
xorriso : UPDATE :    6929 files added in 1 seconds
xorriso : UPDATE :  0.77% done
xorriso : UPDATE :  5.25% done
xorriso : UPDATE :  7.73% done
...
...
xorriso : UPDATE :  99.90% done
ISO image produced: 5190806 sectors
Written to medium : 5190806 sectors at LBA 0
Writing to 'stdio:/srv/newcd/custom.iso' completed successfully.
# -o 参数指定了输出文件的名称
# -b 参数指定了引导映像文件的位置为 isolinux/isolinux.bin
# -c 参数指定了引导文件的位置为 isolinux/boot.cat
# no-emul-boot: 这个参数告诉系统,光盘的引导文件是一个 "no emulation" 引导
# -V 'Rocky-9-latest-x86_64': -V 参数指定了卷标为 'Rocky-9-latest-x86_64',即ISO映像文件的卷标名称
# -boot-load-size 4: 指定了用于引导装载的扇区数为 4
# -boot-info-table: 这个参数指示 genisoimage 在所创建的ISO映像中插入一个特定的启动信息表
# -R: 在ISO9660文件系统中加入Rock Ridge扩展(用于提供类UNIX文件属性的扩充)
# -J: 在ISO9660文件系统中加入Joliet扩展(用于支持长文件名)
# -v: 显示详细的输出信息
# -T: 在输出信息中包含文件的时间戳

其他常见的压缩与备份工具

dd

dd 是一个用于复制文件和转换数据的命令行工具

[root@chenshiren ~]# dd if="input_file" of="output_file" bs="block_size" count="number"
选项:
if :就是input file,也可以是设备
of :就是output file,也可以是设备
bs :设置一个block大小,若未指定则默认是 512 Bytes(一个扇区大小)
count:多少个bs

# 示例1 将/etc/passwd备份到/tmp/passwd.back当中
[root@chenshiren ~]# dd if=/etc/passwd of=/tmp/passwd.back
记录了4+1 的读入  # 4+1表示4个完整的512Bytes,以及未满的512Bytes,没有使用bs默认为512Bytes
记录了4+1 的写出
2187字节(2.2 kB,2.1 KiB)已复制,0.000119129 s,18.4 MB/s
[root@chenshiren ~]# ll /etc/passwd /tmp/passwd.back -h
-rw-r--r--. 1 root root 2.2K  227 23:28 /etc/passwd
-rw-r--r--. 1 root root 2.2K  38 23:19 /tmp/passwd.back

# 示例2 将本地光盘刻录为镜像
[root@chenshiren ~]# dd if=/dev/cdrom  of=/srv/newcd/redhat9.2.iso
记录了18742144+0 的读入
记录了18742144+0 的写出
9595977728字节(9.6 GB,8.9 GiB)已复制,22.3718 s,429 MB/s
[root@chenshiren ~]# ls /srv/newcd/redhat9.2.iso -lh
-rw-r--r--. 1 root root 9.0G  38 23:24 /srv/newcd/redhat9.2.iso

# 示例3 假设你的USB是/dev/nvme0n3p1 ,将/tmp/system.img 刻录到U盘里
[root@chenshiren ~]# dd if=/tmp/system.img of=/dev/nvme0n3p1 
记录了74572+0 的读入
记录了74572+0 的写出
38180864字节(38 MB,36 MiB)已复制,0.116975 s,326 MB/s
[root@chenshiren ~]# mount /dev/nvme0n3p1 /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@chenshiren ~]# ls /mnt/
etc  home  root

# 示例4 将/boot 整个文件系统通过dd备份下来
[root@chenshiren ~]# df -h /boot/
文件系统        容量  已用  可用 已用% 挂载点
/dev/nvme0n1p3 1014M  267M  748M   27% /boot
[root@chenshiren ~]# dd if=/dev/nvme0n1p3 of=/tmp/bootbackups.img
记录了2097152+0 的读入
记录了2097152+0 的写出
1073741824字节(1.1 GB,1.0 GiB)已复制,1.62602 s,660 MB/s
[root@chenshiren ~]# ll -h /tmp/bootbackups.img 
-rw-r--r--. 1 root root 1.0G  38 23:27 /tmp/bootbackups.img
# 整个/dev/nvme0n1p3都保存下来的意思,所以文件会根整块磁盘的最大量一样大

cpio

cpio是用于备份和恢复文件的命令,cpio可以备份任何大小,包括设备文件,不过cpio有个大问题,那就是cpio不会主动地去找文件来备份,cpio要配合类似find等可以查找文件的命令来告知cpio该备份的数据在哪里

[root@chenshiren ~]# cpio -oBcv > [file|device] # 备份
[root@chenshiren ~]# cpio -iducv < [file|device] # 还原
[root@chenshiren ~]# cpio -itcv < [file|device] # 查看
选项:
-o:将数据复制输出到文件或设备上
-v:让存储过程中文件名称可以在屏幕上显示
-c:一种较新的portable format 方式存储
-B:让默认的blocks可以增加至5120字节,默认是512字节
    这样做的好处是可以让大文件存储速度更快
-i:将数据自文件或设备复制出来到系统当中
-d:自动创建目录,使用cpio所备份的内容不见得会在同一层目录,因此
    必须要让cpio在还原时可以建立新目录
-u:自动的将较新的文件覆盖较旧的文件
-t:需配合-i选项,可用在"查看"以cpio建立的文件或设备的内容
# 示例1 找出/boot 下面的所有文件,然后将它备份到/tmp/boot.cpio中
[root@chenshiren /]# cd /
[root@chenshiren /]# find boot -print 
boot
boot/efi
boot/efi/EFI
boot/efi/EFI/redhat
boot/grub2
...
# 通过find 可以找到boot下面存在的文件名,包括文件与目录,不要使用绝对路径
# 因为给绝对路径文件是以/开头,解开会覆盖掉本来的/boot文件
[root@chenshiren /]# ll -h /tmp/boot.cpio 
-rw-r--r--. 1 root root 227M  39 00:04 /tmp/boot.cpio
[root@chenshiren /]# file /tmp/boot.cpio      
/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)
# find boot可以找出文件名,然后通过那条管道(|,键盘上的shift+\的组合)
# 就能将文件名传给cpio来进行处理,最终得到/tmp/boot.cpio这个文件

# 示例2 将刚刚的文件给他在/root目录下解开
[root@chenshiren ~]# cpio -idcv < /tmp/boot.cpio 
[root@chenshiren ~]# diff -r boot/ /boot/
# 没有什么不同,一毛一样

# 示例3 其实系统已经含有一个使用cpio建立的文件,那就是/boot/initramfs-xxx这个文件,将他解压缩看看里面文件内容
[root@chenshiren ~]# file /boot/initramfs-0-rescue-889198c3191e4649bfe58b756b608346.img 
/boot/initramfs-0-rescue-889198c3191e4649bfe58b756b608346.img: ASCII cpio archive (SVR4 with no CRC)
[root@chenshiren ~]# mkdir /tmp/initramfs
[root@chenshiren ~]# cd /tmp/initramfs/
[root@chenshiren initramfs]# cpio -idvc < /boot/initramfs-0-rescue-889198c3191e4649bfe58b756b608346.img   
.
early_cpio
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
kernel/x86/microcode/GenuineIntel.bin
25750# 文件已解开
  • 32
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值