压缩可以使压缩过的文件变小:
1、两种典型压缩技术:
2、Linux系统常见的压缩命令:gzip/bzip2/xz
2.1 gzip 命令
[root@localhost ~]# gzip [选项] 文件名
参数:
- -a或--ascii 使用ASCII文字模式。
- -c或--stdout或--to-stdout 把压缩后的文件输出到标准输出设备,不去更动原始文件。
- -d或--decompress或----uncompress 解开压缩文件。
- -f或--force 强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接。
- -h或--help 在线帮助。
- -l或--list 列出压缩文件的相关信息。
- -L或--license 显示版本与版权信息。
- -n或--no-name 压缩文件时,不保存原来的文件名称及时间戳记。
- -N或--name 压缩文件时,保存原来的文件名称及时间戳记。
- -q或--quiet 不显示警告信息。
- -r或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
- -S<压缩字尾字符串>或----suffix<压缩字尾字符串> 更改压缩字尾字符串。
- -t或--test 测试压缩文件是否正确无误。
- -v或--verbose 显示指令执行过程。
- -V或--version 显示版本信息。
- -#:#为数字的意思,代表压缩等级,-1最快,但是压缩比差;-9最慢,但是压缩比最好。默认为-6。
例一:将services文件用最佳的压缩比压缩,并保留原本的文件
mcb@mcb:-$ ls -ldSr /etc/*
mcb@mcb:-$ cd /tmp
mcb@mcb:/tmp$ gzip -9 -c services > services.gz
#">",通过该符号,将原本应该由屏幕输出的数据,转成输入到文件而不是屏幕,所以能够建立出压缩文件。只是文件名需要自己去写
2.2 bzip2 命令
bzip2为了替换gzip并提供更加的压缩比而来
[root@localhost ~]# bzip2 [选项] 文件名
参数:
- -c或--stdout或--to-stdout 把压缩后的文件输出到标准输出设备,不去更动原始文件。
- -d或--decompress或----uncompress 解开压缩文件。
- -k: 保留原始文件,而不会删除原始的文件
- -z: 压缩的参数(默认值,可不加)
- -v: 显示出压缩比信息
- -#: 与gzip相同
2.3 xz, xzcat/xzmore/xzless/xzgrep
优点:xz压缩比相比于gzip/bzip2而言更高,软件用法与二者几乎相同;
缺点:运算时间比gzip久的多;
[root@localhost ~]# xz [选项] 文件名
[root@localhost ~]# xcat 文件名.xz //查看被压缩后的文本文件
参数:其余参数与gzip相同,此处仅列出部分重要参数;
- -l : 列出压缩文件的相关信息
- -k:保留原本的文件不删除
- -c:将数据在屏幕上输出
3 打包命令:tar
tar 的选项与参数非常多,我们只讲几个常用的选项,更多选项可以自行 man tar 查询。
3.1 将数据解压至特定目录下
tar -jxv -f /root/etc.tar.bz2 -C /tmp
3.2 仅解开单一文件
之前的解压是将整个打包文件解压,而现在只需要解压打包文件中的某一个文件;
① 先找到我们需要的文件名,假设解开shadow文件
tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
其中: grep是【截取】关键词的功能;
② 将该文件解开,语法与实际做法如下:
语法:tar -jxv -f 打包文件.tar.bz2 待解开文件
tar -jxv -f /root/etc.tar.bz2 etc/shadow
3.3 打包某目录,但不不好该目录下的某文件之做法
tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root
4 XFS文件系统的备份与还原
- xfsdump:xfs文件系统的备份。
- xfsstore:xfs文件系统的还原。
4.1 XFS文件系统的备份 xfsdump
xfsdump除了可以进行文件系统的完整备份之外,还可以进行增量备份;
xfs文件系统的备份,第一次备份为level 0是完整备份,以后的备份是增量备份,增量备份是:例如备份第二次level 1会和level 0比较后,将与level 0不同的文件备份过来。(各个level记录在/var/lib/xfsdump/inventory中,并且只有备份过才能用ls查看inventory里面有文件)
用法:1、xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
2、xfsdump 【-I(大写的i)】
选项与参数:
-l(这里是小写L):指定等级0-9,0为完整备份。
-L:对文件系统进行简易的说明。
-M:对存储媒介进行简易的说明。
-I(大写的i):从/var/lib/xfsdump/inventory中列出目前备份的信息状态。
4.1.1 用xfsdump备份完整地文件系统
将/boot划分出自己的文件系统,要将整个文件系统备份可以这样做 (切换到root模式):
步骤1:先确定/boot是独立的文件系统 df -h /boot
步骤2:将完整备份的文件名记录成为/srv/boot.dump
4.1.2 用xfsdump进行增量备份
4.2 XFS文件系统还原 xfsrestore
语法:xfsrestore -I(大写的i) //用来查看备份文件
xfsrestore [-f 备份文件] [-L S_label] [-s] 待恢复目录 //单一文件全系统恢复
xfsrestore [-f 备份文件] -r 待恢复目录 //通过增量备份文件来恢复系统
xfsrestore [-f 备份文件] -i 待恢复目录 //进入交互模式
参数: -I:跟”xfsdump -I”输出相同,可查询备份数据,包括Label名称与备份时间等
-f:接备份文件
-L:Session label name
-s:接特定的文件或目录,只恢复特定的文件或目录。
-r:如果用文件来存储备份数据,则不需要使用,如果是一个磁带内有多个文件,需要此选 项来完成增量恢复。
-i:进入交互模式,高级管理员使用。
4.2.1 用xfsrestore观察xfsdump后的备份数据内容
[mcb@localhost ~]$ xfsrestore -I
file system 0:
fs id: 8338105f-f263-4e05-8317-df51473f7653
session 0:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sat May 27 07:28:32 2023
session label: "boot_all"
session id: e414c13e-9dcf-4f92-9b8f-43e4f89fedde
level: 0
resumed: NO
subtree: NO
streams: 1
stream 0:
.................
session 1:
mount point: localhost.localdomain:/boot
device: localhost.localdomain:/dev/sda1
time: Sat May 27 07:44:11 2023
session label: "boot_2"
session id: 7a77e2f8-cb9a-4eb1-9dd8-54e609fb0eb4
level: 1
resumed: NO
subtree: NO
streams: 1
stream 0:
.....................
xfsrestore: Restore Status: SUCCESS
4.2.2 将/boot整个恢复到最原本状态
//1、直接将数据给他覆盖回去
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (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: 11 directories and 337 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
//2、将备份数据在/tmp/boot下面解开
[root@localhost ~]# mkdir /tmp/root
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
[root@localhost ~]# du -sm /boot /tmp/boot
4.2.3 仅恢复grub2到/tmp/boot2中
mkdir /tmp/root2
xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/root2
4.2.4 增量备份还原
在进行增量还原之前应先将完全备份恢复,根据执行备份的步骤进行还原。
如,备份的步骤是Level 0 –> level 1 –> Level2 …,那么执行还原的步骤也应如此。
[root@localhost ~]# mkdir /tmp/boot
[root@localhost ~]# xfsrestore -f /srv/boot.dump1 /tmp/boot
4.2.5 仅还原部分文件的xfsrestore交互模式
[root@localhost ~]# mkdir /tmp/boot2
[root@localhost ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot2 //加入-i即进入了交互模式
========================== subtree selection dialog ==========================
the following commands are available:
pwd
ls [ <path> ]
cd [ <path> ]
add [ <path> ]
delete [ <path> ]
extract
quit
help
-> ls
75 initramfs-3.10.0-1160.el7.x86_64.img
77 vmlinuz-0-rescue-822587ff2c7b4e36801d672107e07136
76 initramfs-0-rescue-822587ff2c7b4e36801d672107e07136.img
74 vmlinuz-3.10.0-1160.el7.x86_64
73 symvers-3.10.0-1160.el7.x86_64.gz
72 config-3.10.0-1160.el7.x86_64
71 System.map-3.10.0-1160.el7.x86_64
70 .vmlinuz-3.10.0-1160.el7.x86_64.hmac
68 grub/
786496 grub2/
67 efi/
-> add grub
-> add grub2
-> extract
[root@localhost ~]# ls -l /tmp/boot2
总用量 0
drwxr-xr-x. 2 root root 27 4月 24 01:18 grub
drwx------. 5 root root 97 4月 24 01:28 grub2
#可以看到就只有2个文件被恢复,当然,如果文件是目录,那么下面的子文件也会被还原回来;
5 光盘写入工具 p277
步骤:
- 利用mkisofs命令,将所需备份数据创建成一个镜像文件
- 利用cdrecord命令将镜像文件可到CD/DVD中
5.1 mkiosfs:建立镜像文件
5.1.1 制作一般数据光盘镜像文件
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 为排除文件的意思,后面的文件不被分到镜像文件中;即指定的目录或者文 件不会放入镜像中
- -graft-point: graft有转嫁或移植的意思。
例1:将/root /etc /home等目录内的数据统统刻录到/tmp目录下面,然后将刻录好的镜像文件挂载到/mnt目录下进行测试,测试完毕后,从/mnt目录中卸载
[root@localhost ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.11 (Linux)
Scanning /root
Scanning /root/.cache
.....(中间省略).........
Scanning /etc/exports.d
Using SYSTE000.;1 for /system-release-cpe (system-release)
Using CENTO000.;1 for /centos-release-upstream (centos-release)
Using CRONT000.;1 for /crontab (crontab)
Using BASHR000.;1 for /bashrc (bashrc)
genisoimage: Error: '/etc/bashrc' and '/root/bashrc' have the same Rock Ridge name 'bashrc'.
genisoimage: Error: '/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'.
Unable to sort directory #文件名不可以一样
NOTE: multiple source directories have been specified and merged into the root
of the filesystem. Check your program arguments. genisoimage is not tar.
#因为文件名一摸一样,所以就不给建立ISO文件了
#此时,需要删除/root/bashrc和/root/crontab这两个文件,然后重新执行一次mkisofs
[root@localhost ~]# rm /root/bashrc
rm:是否删除普通空文件 "/root/bashrc"?y
[root@localhost ~]# rm /root/crontab
rm:是否删除普通文件 "/root/crontab"?y
[root@localhost ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
.....(中间省略).........
Writing: The File(s) Start Block 1038
20.99% done, estimate finish Sun May 28 00:34:08 2023
41.94% done, estimate finish Sun May 28 00:34:08 2023
62.86% done, estimate finish Sun May 28 00:34:08 2023
83.79% done, estimate finish Sun May 28 00:34:09 2023
Total translation table size: 0
Total rockridge attributes bytes: 449867
Total directory bytes: 1988608
Path table size(bytes): 13050
Done with: The File(s) Block(s) 22682
Writing: Ending Padblock Start Block 23720
Done with: Ending Padblock Block(s) 150
Max brk space used 420000
23870 extents written (46 MB)
[root@localhost ~]# ll -h /tmp/system.img
-rw-r--r--. 1 root root 47M 5月 28 00:34 /tmp/system.img
[root@localhost ~]# mount -o loop /tmp/system.img /mnt #将镜像文件挂载到/mnt目录下
mount: /dev/loop0 写保护,将以只读方式挂载
[root@localhost ~]# df -h /mnt
文件系统 容量 已用 可用 已用% 挂载点
/dev/loop0 47M 47M 0 100% /mnt
[root@localhost ~]# ls /mnt
[root@localhost ~]# umount /mnt #测试完进行卸载
[root@localhost ~]# df -h /mnt
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 5.4G 13G 31% /
上面建立镜像文件的方式会将三个目录(/root /etc /home) 的数据全部放置到镜像文件的最顶层目录。尤其由于/root/etc的存在,导致/etc的数据似乎没有被包含进来的样子,这样很不合理。此时可以使用-graft-point来处理;
[root@localhost ~]# mkisofs -r -V 'linux file' -o /tmp/system.img -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
[root@localhost ~]# ll -h /tmp/system.img
-rw-r--r--. 1 root root 47M 5月 28 00:58 /tmp/system.img
[root@localhost ~]# mount -o loop /tmp/system.img /mnt
mount: /dev/loop0 写保护,将以只读方式挂载
[root@localhost ~]# ll /mnt
总用量 46
dr-xr-xr-x. 147 root root 38912 5月 27 19:25 etc
dr-xr-xr-x. 3 root root 2048 4月 24 01:27 home
dr-xr-xr-x. 5 root root 4096 5月 28 00:33 root
dr-xr-xr-x. 8 root root 2048 5月 28 00:58 rr_moved
[root@localhost ~]# umount /mnt
#此时可以看到,数据是分门别类地存储在各个目录中
5.1.2 制作/修改可启动光盘镜像文件
rsync:可以完整复制所有的权限与属性,也能够进行镜像处理,相当好用的命令
例如:rsync -a /mnt/ /srv/newcd #将所有的数据复制到/srv/newcd中
5.2 wodim:光盘刻录工具
wodim --devices dev=/dev/sr0... #查询刻录机的bus位置
wodim -v dev=/dev/sr0 blank=[fast | all] #抹除重复读写盘
wodim -v dev=/dev/sr0 -format #格式化DVD+RW
wodim -v dev=/dev/sro [选项] file.iso
参数
- –devices:用在扫描磁盘总线并找出可用的刻录机,后续的设备为ATA接口;
- -v:在cdrecord运行的过程中显示过程;
- dev=/dev/sr0:可以找出此光驱的bus地址,重要;
- blank=[fast|all]:blank为抺除可重复写入的CD/DVD-RW,使用fask较快,all较完整;
[选项]
- -data:指定后面的文件以数据格式写入,不是以CD音轨(-audio)方式写入;
- speed=X:指定记录速度
- -eject:指定记录完毕后自动推出光盘
- fs=Ym:指定缓冲区大小
针对DVD的选项功能
- driveropts=burnfree:打开Buffer Underrun Free模式的写入功能;
- -sao:支持DVD-RW的格式
5.2.1 检测刻录机所在位置
[root@localhost ~]# ll /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 5月 27 06:55 /dev/sr0
[root@localhost ~]# wodim --devices dev=/dev/sr0
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/sr0' rwrw-- : 'NECVMWar' 'VMware IDE CDR10'
-------------------------------------------------------------------------
5.2.2 进行CD/DVD的刻录操作
#1. 首先抹除光盘的原始内容
wodim -v dev=/dev/sr0 blank=fast
#2. 开始刻录,将/tmp/system.img刻录到光盘/dev/sr0中
wodim -v dev=/dev/sr0 speed=4 -eject /tmp/system.img
#3. 测试完毕后,检验一下挂载,检验内容
mount /dev/sr0 /mnt
df -h /mnt
#4. 卸载
umount /mnt
6 dd命令和cpio命令:都用于备份
6.1 dd命令
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
用途一:创建指定大小的文件
[root@mcb ~]# dd if=/dev/zero of=/tmp/1G.txt bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 31.19 s, 34.4 MB/s
用途二:给磁盘的分区做备份
1. 磁盘分区的备份
dd if=/etc/passwd of=/tmp/passwd.back
2. 磁盘分区的还原
dd if=/root/sda1.bak of=/dev/sda1
3. 给磁盘备份
[root@localhost ~]# dd if=/dev/vda2 of=/dev/sda1 //此时会创建两个一摸一样的磁盘
6.2 cpio命令
cpio -oBvc > [文件或者装置名] 备份
cpio -ivcdu < [文件或者装置名] 恢复
cpio -ivct < [文件或者装置名] 查看
备份会使用到的选项与参数:
-o:
将文件拷贝打包成文件或者将文件输出到设备上。-B:
让默认的Blocks可以增大到5120 bytes
,默认Blocks为512 bytes
,这样做的好处是可以加快存取速度。
还原会使用到的选项与参数:
-i:
将打包文件解压或者将设备上的备份还原到系统。-t:
查看cpio
打包的文件内容或者输出到设备上的文件内容。-d:
在cpio
还原文件的过程中,自动的建立相应的目录。- -u:自动将较新的问价覆盖较旧的文件
一些可共用的选项与参数:
-c:
一种较新的存储方式。-v:
显示打包过程中的文件名称。
例1. 找出/boot下面的所有文件,并将其备份到/tmp/boot.cpio中
[root@localhost ~]# cd /
[root@localhost /]# find boot -print
boot
boot/efi
boot/efi/EFI
.......(以下省略).......
#通过find我们可以找到boot下面应该要存在的文件名,包括文件与目录,但是不要是绝对路径
[root@localhost /]# find boot | cpio -ocvB > /tmp/boot.cpio
#通过find boot找到文件名,然后将文件名给cpio来进行处理。最终得到/tmp/boot.cpio这个文件;
[root@localhost /]# ll -h /tmp/boot.cpio
-rw-r--r--. 1 root root 146M 5月 28 19:06 /tmp/boot.cpio
cpio可以将系统的数据完全备份到磁带中,若有磁带设备
备份:find / | cpio -ocvB > /dev/st0
还原:cpio -idvc < /dev/st0