Linux压缩打包备份

计算机最小单位是bits,1byte=8bits这就是所谓的二进制,如数字1用二进制表示为00000001,其实数字1只占用了1个bit,而其他的7个bits是自动被填充为0的,只是为了满足目前操作系统数据存储;可以利用一些复杂的计算方式,将这些没有使用的空间压缩出来,然文件占用空间变小,这就是压缩技术另一种压缩技术将重复的数据进行统计记录,如数据为111……共100个1,压缩技术会记录100个1而不是真正100个1的位存在;

虽然Linux扩展名没有什么作用,但由于Linux支持的压缩指令非常多,为了简单明了的指导文件压缩方式,所以通过扩展名来作为区分,gzip是有GNU计划所开发出来的压缩指令,已取代compress指令,后来GNU又开发了bzip2xz这几个压缩比更好的压缩指令,为了支持windows常见的zip压缩格式文件Linux也有zip命令,但这些压缩指令通常仅能针对一个文件来压缩与解压缩,所以打包软件tar应运而生,tar可将多文件甚至目录打包成一个文件,单纯的tar功能仅是打包并没有提供压缩功能,后来GNU计划中将整个tar与压缩功能结合到一起:

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

gzip应用最广的压缩指令,可解开compresszipgzip等软件所压缩的文件,所创建的压缩文件后缀名为*.gz,当使用gzip进行压缩时,预设状态下原本的文件会被压缩成.gz源文件将不在存在,且gzip -d也会将原本的.gz删除恢复到原本的文件,可通过-c选项配合>将原本要转换成压缩文件的内容变成字符类型从屏幕输出,再通过>符号转成输出到文件,这样操作文件名需要自己写:

1
2
3
4
5
6
7
8
9
10
11
12
13
gzip [-cdtv#] 文件名
zcat 文件名.gz
选项与参数:
-c:将压缩的数据输出到屏幕上,可通过数据流重导向来处理
-d:解压缩的参数
-t:可用来检验一个压缩文件的一致性,看看文件有无错误
-v:可显示出原文件/压缩文件案的压缩比等信息
-#:#为数字代表压缩等级,-1最快,但是压缩比最差-9最慢,但是压缩比最好预设是-6

# 压缩services文件为services.gz
gzip -v services
# 最佳的压缩比压缩,并保留原文件
gzip -9 -c services > services.gz

可使用catmoreless来读取纯文本文件zcatzmorezless则可用来读取纯文本文件被压缩后的压缩文件,由于gzip压缩指令主要想要用来取代compress,故不但compress的压缩文件可使用gzip来解开,同时zcat指令可同时读取compressgzip的压缩文件,若想从被压缩的纯文本文件中查找数据,可通过egrep命令来搜索不需要将文件解压再通过grep命令来查询;

gzip是为了取代compress并提供更好的压缩比而产生,bzip2则是为了取代gzip并提供更佳的压缩比而产生的,且bzip2的用法与gzip几乎相同;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bzip2 [-cdkzv#] 文件名
bzcat 文件.bz2
选项与参数:
-c:将压缩的过程产生的数据输出到屏幕上
-d:解压缩的参数
-k:保留源文件,而不会删除原始的文件
-z:压缩的参数,默认值,可不加
-v:可显示出原文件/压缩文件案的压缩比等信息
-#:#为数字代表压缩等级,-1最快,但是压缩比最差-9最慢,但是压缩比最好预设是-6

# 压缩services文件
bzip2 -v services
# 文件内容读取
bzcat services.bz2
# 解压缩
bzip2 -d services.bz2
# 最佳的压缩比压缩,并保留原本的文件
bzip2 -9 -c services > services.bz2

xz的用法也与bzip2gzip几乎相同,虽然xz压缩比非常好,但xz压缩非常费时间,可通过time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz]命令统计各个压缩指令压缩时间;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xz [-dtlkc#] 文件
xcat 文件名.xz

选项与参数:
-d:解压缩参数
-t:测试压缩文件的完整性,看有没有错误
-l:列出压缩文件的相关信息
-k:保留源文件,而不会删除原始的文件
-c:将压缩的过程产生的数据输出到屏幕上
-#:#为数字代表压缩等级,-1最快,但是压缩比最差-9最慢,但是压缩比最好预设是-6

# 压缩
xz -v services
# 列出这个文件的压缩前后的容量
xz -l services.xz
# 读取压缩文件内容
xzcat services.xz
# 解压缩
xz -d services.xz
# 压缩且保留原文件
xz -k services

虽然gzip、bzip2、xz能针对目录进行压缩,但对目录的压缩时将目录内的所有文件分别压缩,而不像Windows中使用WinRAR这类软件将多数据包成一个文件;tar可将多个文件目录打包成一个大文件,同时也能通过gzip、bzip2、xz的支持将该文件同时进行压缩,且Windows中的WinRAR也支持.tar.gz文件的解压,-f参数一定要紧挨着文件名,错误示例tar -zpcfv etc.tar.gz /etc/该命令将会导致产生的文件名为v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 打包与压缩
tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename...
# 查看压缩文件列表
tar [-z|-j|-J] [tv] [-f 既有的tar文件]
# 解压缩
tar [-z|-j|-J] [xv] [-f 既有的tar文件] [-C 目录]

# 注意:-z, -j, -J不可同时出现在一串指令列中
# 注意:-c, -t, -x不可同时出现在同一指令列中
选项与参数:
-c:建立打包文件,可搭配-v来察看过程中被打包的文件(filename)
-t:察看打包文件的内容含有哪些文件,重点在察看被压缩的文件列表
-x:解压缩,可以搭配-C(大写)在特定目录解开
-z:通过gzip的支持进行压缩/解压缩,此时档名最好为*.tar.gz
-j:通过bzip2的支持进行压缩/解压缩,此时档名最好为*.tar.bz2
-J:通过xz的支持进行压缩/解压缩,此时档名最好为*.tar.xz
-v:在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f后面要立刻接要被处理的文件名,建议-f单独写一个选项
-C 目录:该选项用在解压缩,若要在特定目录解压缩,可使用该选项
-p(小写):保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写):保留绝对路径,亦即允许备份数据中含有根目录
--exclude=FILE:在压缩的过程中,不要将FILE打包

# 使用gzip打包压缩etc目录,并保留原本文件的权限与属性
tar -zpcvf etc.tar.gz /etc/
tar -zpcv -f etc.tar.gz /etc/
# 使用bzip2打包压缩etc目录,并保留原本文件的权限与属性
tar -jpcvf etc.tar.bz2 /etc/
# 使用xz打包压缩etc目录,并保留原本文件的权限与属性
tar -Jpcvf etc.tar.xz /etc/
# 查看打包文件内部的文件列表,加上-v参数详细的文件权限和属性也会被列出来
tar -jtvf /root/etc.tar.bz2

# 将文件根目录也备份下来
tar -zpPcvf testP.tar.gz /root/anaconda-ks.cfg /root/initial-setup-ks.cfg
# 需要备份根目录需要写绝对路径,相对路径即使加上-P参数也不会备份根目录
tar -zpPcvf testP2.tar.gz anaconda-ks.cfg initial-setup-ks.cfg

# 通过-C参数将压缩文件解压到指定目录
tar -zxvf testP2.tar.gz -C /tmp/

# 解压压缩文件中的指定文件,可先通过-jtv找到目标文件
tar -jtvf etc.tar.bz2 | grep shadow
---------- root/root 857 2022-07-31 21:43 etc/gshadow
---------- root/root 1451 2022-07-31 21:45 etc/shadow
---------- root/root 869 2022-07-31 21:43 etc/gshadow-
---------- root/root 1385 2022-07-31 21:43 etc/shadow-

# 仅仅解压etc.tar.bz2中的etc/shadow文件
tar -jxvf /root/etc.tar.bz2 etc/shadow

# 打包目录时不包含某些文件:不包含以.gz结尾的文,也不包含隐藏文件
tar -jcvf root.tar.bz2 --exclude=*.gz --exclude=\.* /root/

# 查找比/etc/passwd文件还要新的文件
find /etc -newer /etc/passwd
# 查看/etc/passwd文件的mtime
ll /etc/passwd
# 由于某系版本的centos查询mtime是通过ll --time=use,所以会不支持
tar -jcvf newer.then.passwd.tar.bz2 --newer-mtime="2022/07/31" /etc
# 查看压缩文件中结尾为非/的文件列表
tar -jtvf newer.then.passwd.tar.bz2 | grep -v '/$'

如果不加-P参数对文件或目录进行打包,打包后的文件名将不会保留根目录主要是为了安全,因为如果保留根目录解压后数据将覆盖原来根目录下得对应数据

使用tar打包出来的文件是否对文件进行压缩得到的文件称呼不一样,若仅打包不压缩得到的文件称为tarfile,若进行压缩称为tarball;tar除了将文件或目录打包以外,还能将文件打包到特别的设备中,如磁带;由于磁带是一次性读写设备,不能使用类似cp等指令来复制,若想备份/home、/root到磁带中,可使用tar -cvf指令;tar还支持通过标准输入输出的数据流重导向,以及管道命令的方式,将待处理的文件一边打包一边压缩到目标目录中

1
2
3
4
5
6
7
# 将/etc整个目录一边打包一边在/tmp解开,有点类似于cp -r /etc /tmp
# 输入-f后的输出文件名和输入文件变成了-
cd /tmp
tar -cvf - /etc | tar -xvf -

# 将/etc /home /var/spool/mail /var/spool/cron /root这五个目录打包且排除root目录中的压缩文件以及home目录中的loop开头的文件或文件夹
tar -jcv -f /backups/backup-system-20150701.tar.bz2 --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root

XFS文件系统备份与还原

由于CentOS 7已默认使用XFS文件系统,故好用使用xfsdumpxfsrestore来对文件系统进行备份与还原;xfsdump除了可以进行文件系统的完整备份外,还可以进行增量备份;第一次备份一定是完整备份,完整备份在xfsdump中被定义为level 0;各个level的纪录文件则放置于/var/lib/xfsdump/inventory中;xfsdump预设仅支持文件系统的备份,并不支持特定目录的备份,故不能用xfsdump去备份/etc,其不是一个独立的文件系统;

  • xfsdump不支持未挂载的文件系统备份
  • xfsdump必须使用root权限才能操作
  • xfsdump只能备份XFS文件系统
  • xfsdump备份的数据只能xfsrestore解析
  • xfsdump是通过文件系统的UUID来分辨各个备份的,因此备份的UUID不能相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份档] 待备份资料
选项与参数:
-L :xfsdump会纪录每次备份的session标头,这里可填写针对此文件系统的简易说明
-M :xfsdump可纪录储存媒体的标头,这里可填写此媒体的简易说明
-l :是L的小写,指定等级有0~9共10个等级 (预设为0,即完整备份)
-f :有点类似tar后面接产生的文件,可接例如/dev/st0设备文件名或其他一般文件名等
-I :从/var/lib/xfsdump/inventory列出目前备份的信息状态

df -h /boot
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 950M 218M 733M 23% /boot

# 将完整备份的文件名记录成为 /srv/boot.dump
xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot

xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of eleven:/boot
xfsdump: dump date: Mon Mar 4 22:43:09 2024
xfsdump: session id: 22886474-04ae-4136-a4f0-3b0d48d72f86
xfsdump: session label: "boot_all"
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: 193739648 bytes
xfsdump: /var/lib/xfsdump/inventory created
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 193761840 bytes
xfsdump: dump size (non-dir files) : 193725016 bytes
xfsdump: dump complete: 0 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /srv/boot.dump OK (success)
xfsdump: Dump Status: SUCCESS

ll -ah /srv/boot.dump
-rw-r--r-- 1 root root 185M 3月 4 22:43 /srv/boot.dump

ll /var/lib/xfsdump/inventory
-rw-r--r-- 1 root root 5080 3月 4 22:43 3fe44238-ca6a-4d2b-8e38-86a6ada24006.StObj
-rw-r--r-- 1 root root 312 3月 4 22:43 f0dda9b9-4595-4c0a-b084-b7c87808f83c.InvIndex
-rw-r--r-- 1 root root 576 3月 4 22:43 fstab

# 查看备份信息
xfsdump -I

file system 0:
fs id: f0dda9b9-4595-4c0a-b084-b7c87808f83c
session 0:
mount point: eleven:/boot
device: eleven:/dev/sda2
time: Mon Mar 4 22:43:09 2024
session label: "boot_all"
session id: 22886474-04ae-4136-a4f0-3b0d48d72f86
level: 0
resumed: NO
subtree: NO
streams: 1
stream 0:
pathname: /srv/boot.dump
start: ino 68 offset 0
end: ino 1055490 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 193761840
mfile start: ino 68 offset 0
mfile end: ino 1055490 offset 0
media label: "boot_all"
media id: 22675a7b-a249-4263-b0b5-7b4aa97c5f86
xfsdump: Dump Status: SUCCESS

# 建立一个大约10MB的文件在/boot内
dd if=/dev/zero of=/boot/testing.img bs=1M count=10
# 建立差异备份档,此时使用level 1
xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot

ll /srv/boot*
xfsdump -I

使用xfsrestore来复原xfsdump指令生成的备份,xfsdumpxfsrestore都会到/var/lib/xfsdump/inventory/里面去查询数据来显示,因此两者输出是相同的;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 察看备份文件信息
xfsrestore -I

# 单一文件全系统复原
xfsrestore [-f 备份档] [-L S_label] [-s] 待复原目录
# 通过累积备份文件来复原系统
xfsrestore [-f 备份文件] -r 待复原目录
# 进入互动模式
xfsrestore [-f 备份文件] -i 待复原目录

选项与参数:
-I:跟xfsdump相同的输出!可查询备份数据,包括Label名称与备份时间等
-f:后面接的就是备份档!企业界很有可能会接/dev/st0等磁带机!我们这里接档名!
-L:就是Session的Label name喔!可用-I查询到的数据,在这个选项后输入!
-s:需要接某特定目录,亦即仅复原某一个文件或目录之意!
-r:若用文件来储存备份数据就不需要使用。若一个磁带内有多个文件,需要该参数来达成累积复原
-i:进入互动模式,进阶管理员使用的!一般我们不太需要操作它!

xfsrestore -f /srv/boot.dump -L boot_all /boot

# 将备份资料在 /tmp/boot 底下解开
mkdir /tmp/boot
xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot

du -sm /boot /tmp/boot
207 /boot
185 /tmp/boot
# diff -r 可以比较两个目录内的文件差异
diff -r /boot /tmp/boot
只在 /boot 存在:testing.img

# 通过-s参数,仅复原备份档内的grub2到/tmp/boot2/里头去
mkdir /tmp/boot2
xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2

# 继续复原 level 1 到 /tmp/boot当中
xfsrestore -f /srv/boot.dump1 /tmp/boot

若根本不知道备份档里面有啥文件,或要复原的文件数量太多时,比较好的方式是使用-i互动界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
mkdir /tmp/boot3
xfsrestore -f /srv/boot.dump -i /tmp/boot3

xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (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: eleven
xfsrestore: mount point: /boot
xfsrestore: volume: /dev/sda2
xfsrestore: session time: Mon Mar 4 22:43:09 2024
xfsrestore: level: 0
xfsrestore: session label: "boot_all"
xfsrestore: media label: "boot_all"
xfsrestore: file system id: f0dda9b9-4595-4c0a-b084-b7c87808f83c
xfsrestore: session id: 22886474-04ae-4136-a4f0-3b0d48d72f86
xfsrestore: media id: 22675a7b-a249-4263-b0b5-7b4aa97c5f86
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 4 directories and 21 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
83 initramfs-3.10.0-1160.53.1.el7.x86_64kdump.img
73 initramfs-3.10.0-1160.el7.x86_64.img
82 initramfs-3.10.0-1160.53.1.el7.x86_64.img
76 initramfs-3.10.0-1160.el7.x86_64kdump.img
81 vmlinuz-3.10.0-1160.53.1.el7.x86_64
80 symvers-3.10.0-1160.53.1.el7.x86_64.gz
79 config-3.10.0-1160.53.1.el7.x86_64
78 System.map-3.10.0-1160.53.1.el7.x86_64
77 .vmlinuz-3.10.0-1160.53.1.el7.x86_64.hmac
75 vmlinuz-0-rescue-3eba91ec1d4f446282dd9fa9353f0f79
74 initramfs-0-rescue-3eba91ec1d4f446282dd9fa9353f0f79.img
72 vmlinuz-3.10.0-1160.el7.x86_64
71 symvers-3.10.0-1160.el7.x86_64.gz
70 config-3.10.0-1160.el7.x86_64
69 System.map-3.10.0-1160.el7.x86_64
68 .vmlinuz-3.10.0-1160.el7.x86_64.hmac
1055488 grub/
524352 grub2/
67 efi/
-> add grub
-> add grub2
-> extract
--------------------------------- end dialog ---------------------------------
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 74 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore: stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS

ls -l /tmp/boot3
总用量 0
drwxr-xr-x. 2 root root 27 1月 24 2022 grub
drwx------. 2 root root 21 2月 10 2022 grub2

mkisofs创建镜像文件

一般预设的情况下,所有要被加到镜像文档中的文件都会被放置到镜像文件中的根目录,可能会造成刻录后的文件分类不易的情况,可使用-graft-point选项来定义位于映像文件中的目录;即映像文件中的目录所在=实际Linux文件系统的目录所在;例:-graft-point /movies/=/srv/movies/表示在Linux的/srv/movies内的文件,加至映像文件中的/movies/目录;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 title的东西
-m file:-m为排除文件 (exclude) 的意思,后面的文件不备份到映像档中,也能使用*通配符
-graft-point:graft有转嫁或移植的意思,定义位于映像文件中的目录

# 将/root, /home, /etc等目录内的数据通通刻录起来
mkisofs -r -v -o /tmp/system.img /root /home/ /etc/

ll -h /tmp/system.img
-rw-r--r-- 1 root root 235M 3月 5 20:34 /tmp/system.img

# 将镜像文件挂载到/mnt目录
mount -o loop /tmp/system.img /mnt
df -h /mnt
文件系统 容量 已用 可用 已用% 挂载点
/dev/loop1 235M 235M 0 100% /mnt

# 查看镜像文件内容,可以看到并没有将文件归类到目录中,或保持原始目录
ls /mnt

# 卸载挂载
umount /mnt

# 刻录镜像文件,且设置打包目录映射,再通过上面的挂载命令查询内容
mkisofs -r -V 'linux_file' -o /tmp/system.img -m /root/etc -graft-point /root=/root /home=/home /etc=/etc

# 查看镜像文件信息
isoinfo -d -i /home/CentOS-7-x86_64-Minimal-1503-01.iso
mount /home/CentOS-7-x86_64-Minimal-1503-01.iso /mnt
mkdir /srv/newcd
# 完整的复制所有的权限属性等数据,也能够进行镜像处理
rsync -a /mnt/ /srv/newcd

# 制作可开机一键安装的镜像文件custom.iso
mkisofs -o /custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -V 'CentOS 7 x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .

新版的CentOS 7使用的是wodim文字界面指令来进行刻录的行为,为了兼容于旧版的cdrecord指令,wodim也有连结到cdrecord指令,因此还是可以使用cdrecord指令;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查询刻录机的 BUS 位置
wodim --devices dev=/dev/sr0...
# 抹除重复读写片
wodim -v dev=/dev/sr0 blank=[fast|all]
# 格式化 DVD+RW
wodim -v dev=/dev/sr0 -format
wodim -v dev=/dev/sr0 [可用选项功能] file.iso
选项与参数:
--devices:用在扫瞄磁盘总线并找出可用的刻录机,后续的装置为ATA接口
-v:在cdrecord运作的过程中显示过程
dev=/dev/sr0:可找出此光驱的bus地址,非常重要
blank=[fast|all]:blank为抹除可重复写入的CD/DVD-RW,使用fast较快all较完整
-format:对光盘片进行格式化,但仅针对DVD+RW这种格式的DVD,
可用选项功能主要是写入CD/DVD时可使用的选项,常见的选项包括有:
-data:指定后面的文件以数据格式写入,不是以CD音轨(-audio)方式写入
speed=X:指定刻录速度,例如CD可用speed=40为40倍数,DVD则可用speed=4之类
-eject:指定刻录完毕后自动退出光盘
fs=Ym:指定多少缓冲存储器,可用在将映像档先暂存至缓冲存储器。预设为4m,一般建议8m,视刻录机而定
针对DVD的选项功能:
driveropts=burnfree:打开Buffer Underrun Free模式的写入功能
-sao:支持DVD-RW的格式

# 查找光驱,光驱的文件名为/dev/sr0之类
wodim --devices dev=/dev/sr0
# 抹除光盘的原始内容
wodim -v dev=/dev/sr0 blank=fast
# 将/tmp/system.img刻录到CD/DVD
wodim -v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img

# 刻录完毕后,测试挂载一下,检验内容
mount /dev/sr0/mnt

常见压缩备份工具

dd

dd指令不仅可以制作一个文件dd指令最大的作用是备份,dd指令可以读取磁盘装置的内容几乎是直接读取扇区,然后将整个装置备份成一个文件;默认dd是一个一个扇区去读/写的,且即使没有用到的扇区也会被写入备份中,因此该文件会跟原本的磁盘一样大,不像使用xfsdump只备份文件系统中有使用到的部份;dd不区分文件系统,不论该磁盘内的文件系统是否认识都可以备份还原

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
dd if="input_file" of="output_file" bs="block_size" count="number
选项与参数:
if:就是input file也可以是装置
of:就是output file也可以是装置
bs:规划的一个block的大小,若未指定则预设是512 bytes(一个sector的大小)
count:多少个bs,通过bs*count算出文件大小

# 将/etc/passwd备份到/tmp/passwd.back当中
# 没有设定bs默认是512 bytes为一个单位,4+1表示有4个完整的512 bytes
# 以及未满512 bytes的另一个block
dd if=/etc/passwd of=/tmp/passwd.back
记录了4+1 的读入
记录了4+1 的写出
2449字节(2.4 kB)已复制,0.000588542 秒,4.2 MB/秒

#
ll /etc/passwd /tmp/passwd.back
-rw-r--r-- 1 root root 2449 7月 31 2022 /etc/passwd
-rw-r--r-- 1 root root 2449 3月 5 21:44 /tmp/passwd.back

# 将刻录的光驱的内容,再次的备份下来成为镜像文件,要将数据抓下来可以用这个方法
dd if=/dev/sr0 of=/tmp/system.iso

# 将映像文件写入USB磁盘,若USB是/dev/sda
lsblk /dev/sda
dd if=/tmp/system.iso of=/dev/sda

mount /dev/sda /mnt

# 将/boot整个文件系统透过dd备份下来
df -h /boot
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 950M 228M 723M 24% /boot

dd if=/dev/sda2 of=/tmp/sda2.img
ll -h /tmp/vda2.img

cpio

cpio指令可备份任何东西,包括设备文件,但cpio指令不会主动的去找文件来备份,cpio指令需要类似find等可以找到文件名的指令来告知cpio需要被备份的数据的文件路径cpio可备份任何的文件,包括/dev底下的任何设备文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 备份
cpio -ovcB > [file|device]
# 还原
cpio -ivcdu < [file|device]
# 查看
cpio -ivct < [file|device]
备份会使用到的选项与参数:
-o:将数据copy输出到文件或装置上
-B:让预设的Blocks可以增加至5120 bytes,预设是512 bytes,好处是可让大文件的储存速度加快
还原会使用到的选项与参数:
-i:将数据自文件或装置copy出来系统当中
-d:自动建立目录!使用cpio所备份的数据内容不见得会在同一层目录中,必须要让cpio在还原时可建立新目录
-u:自动的将较新的文件覆盖较旧的文件
-t:需配合-i选项,可用在查看以cpio建立的文件或装置的内容
可共享的选项与参数:
-v:让储存的过程中文件名可以在屏幕上显示
-c:一种较新的portable format方式储存

# 找出/boot底下的所有文件,然后将他备份到/tmp/boot.cpio
cd /
find boot | cpio -ocvB > /tmp/boot.cpio
ll -h /tmp/boot.cpio
-rw-r--r-- 1 root root 207M 3月 5 22:07 boot.cpio

file /tmp/boot.cpio
/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)

# 将的文件解开
cpio -idvc < /tmp/boot.cpio

# cpio可以将系统的数据完整的备份到磁带机
find / | cpio -ocvB > /dev/st0 # 备份
cpio -idvc < /dev/st0 #还原

# 系统里面已经含有一个使用cpio建立的文件,即/boot/initramfs-xxx这个文件
# 查看文件格式
file /boot/initramfs-3.10.0-1160.el7.x86_64.img
/boot/initramfs-3.10.0-1160.el7.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

mkdir /tmp/initramfs
cd /tmp/initramfs

cpio -idvc < /boot/initramfs-3.10.0-1160.el7.x86_64.img
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
early_cpio
48 块

注意上面的的命令中,先转换目录到/再去找boot,cpio很笨它不会理会给的是绝对路径还是相对路径的文件名,若加上绝对路径/开头,未来解开时会覆盖掉原本的/boot;类似tar-P选项;