zoukankan      html  css  js  c++  java
  • 【Linux命令】《鸟哥Linux基础》第八章 文件与文件系统的压缩

    第八章 文件与文件系统的压缩

    网站也可以利用文件压缩的技术来进行数据传送,好让网站带宽的可利用率上升。

    8.1 压缩文件的用途与技术

    1
    将没有使用到的空间丢出来【0000 0001---->1】

    2
    将重复的数据进行统计记录【100个1】

    8.2 Linux系统常见的压缩命令

    压缩文件扩展名 压缩技术
    .Z compress(少用)
    .zip zip(支持Windows常用的zip)
    .gz gzip(由GNU计划开发,应用最广)
    .bz2 bzip2(压缩比更好)
    .xz xz(压缩比更好)
    .tar tar程序打包的文件,并未压缩过
    .tar.gz tar打包,gzip压缩
    .tar.bz2 tar打包,bzip2压缩
    .tar.xz tar打包,xz压缩
    gzip [-cdtv#] 文件名
    		-c 将压缩的数据输出到屏幕上,可以通过数据流重定向来处理
    		-d 解压缩的参数
    		-t 可以用来检验一个压缩文件的一致性,看看文件有无出错
    		-v 可以显示出源文件/压缩文件的压缩比等信息
    		-# 
    			井号键代表数字,代表压缩等级,-1最快,但是压缩比最差;-9最慢但是压缩比最好,默认是-6
    
    gzip -v 文件名  压缩文件,同时失去源文件,只剩压缩文件
    zcat 文件名     查看压缩文本文件的信息 zmore  zless都可以
    
    gzip -d 文件名  解压缩,同时失去压缩文件,只剩源文件
    
    gzip -9 -c filename > filename.gz  用最佳压缩比压缩,并保留源文件
    
    zgrep -n 'keyword' filename.gz 找出压缩文件中关键字所在行
    

    gzip压缩的文件可以被Windows下的WinRAR和7zip软件解压缩。
    gzip被用来替代compress。

    bzip2 [-cdkzv#] 文件名
    		-c -d -v -# 和gzip的一样
    		-k 保留原始文件,不删原始文件
    		-z 压缩的参数(默认值,可以不加)
    
    bzip2 -v filename
    bzcat filename.bz2
    bzip2 -d filename.bz2   
    bzip2 -9 -c filename > filename.bz2
    

    bzip2是为了代替gzip。bzip2的压缩比优于gzip。
    对于大容量文件来说,bzip2压缩时间会比较久,比gzip久的多。

    xz [-dtlkc#] 文件名
    	-l  列出压缩文件的相关信息
    	其他同上
    xz -v filename
    xz -l filename.xz 查看详细信息
    xzcat filename.xz 读出压缩文件的内容
    xz -d filename.xz 解压缩
    xz -k filename    压缩时保留源文件
    

    xz在gzip和bzip2的基础上压缩比更优。但需要的时间也更长。

    压缩性能3者对比:
    -rw-rw-r--. 1 dj   dj      123932 5月  31 14:31 services.bz2
    -rw-rw-r--. 1 dj   dj      135489 5月  31 14:19 services.gz
    -rw-r--r--. 1 dj   dj       99608 5月  31 14:14 services.xz
    
    计算压缩时间:
    time gzip -c services > services.gz  	快
    time bzip2 -c services > services.bz2  	中
    time xz -c services > services.xz  		慢
    

    8.3 打包命令tar

    将多个文件或目录包成一个文件,就是打包。

    tar [-z|-j|-J][cv][-f 待建立的新文件名] filename...   打包与压缩
    tar [-z|-j|-J][tv][-f 既有的tar文件名]               查看文件名
    tar [-z|-j|-J][xv][-f 既有的tar文件名][-C 目录]       解压缩
    		
    tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称    压缩
    tar -jtv -f filename.tar.bz2;                         查询
    tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录          解压缩
    

    参数详解:

    tar [-z|-j|-J][cv][-f 待建立的新文件名] filename...   打包与压缩
    		-z 通过gzip的支持进行压缩或解压缩,此时文件名最好是.tar.gz
    		-j 通过bzip2的支持压缩或解压缩,此时文件名最好是.tar.bz2
    		-J 通过xz的支持压缩或解压缩,此时文件名最好是.tar.xz
    		以上,-z -j -J不能同时出现
    		cv 首先-c是建立打包文件,可搭配-v查看过程中被打包的文件名filename
    		
    tar [-z|-j|-J][tv][-f 既有的tar文件名]               查看文件名
    		tv 查看打包文件的内容含有哪些文件名,重点在查看【文件名】
    		
    tar [-z|-j|-J][xv][-f 既有的tar文件名][-C 目录]       解压缩
    		xv 解包或是解压缩的功能,可以搭配-C在特定目录解压
    		-c -t -x 不能同时出现
    
    
    -p 保留备份数据的原本权限与属性,常用语备份的重要配置文件
    -P 保留绝对路径,即允许备份数据中含有根目录存在之意
    --exclude=FILE 在压缩过程中,不要将FILE打包
    

    备份/etc文件夹:
    这里使用小写的-p,防止恢复时旧资料覆盖当前新资料,哭死也找不回了

    su -
    time tar -zpcv -f /root/etc.tar.gz /etc  使用gzip,快 
    time tar -jpcv -f /root/etc.tar.bz2 /etc  使用bzip2,中
    time tar -Jpcv -f /root/etc.tar.xz /etc  使用xz 慢
    
    ll /root/etc*
    出现:
    -rw-r--r--. 1 root root 12194747 5月  31 15:14 /root/etc.tar.gz
    -rw-r--r--. 1 root root 10492755 5月  31 15:15 /root/etc.tar.bz2
    -rw-r--r--. 1 root root  8572040 5月  31 15:15 /root/etc.tar.xz
    
    du -sm /etc  查看实际目录占多少M
    出现:
    42	/etc     说明该文件夹实际占42M
    

    备份时的危险动作:-P

    tar -jtv -f /root/etc.tar.bz2   查询tar文件内部的文件列表
    
    
    tar -jpPcv -f /root/etc.and.root.ar.bz2 /etc  将文件名中的(根)目录也备份下来,恢复时极为危险!!!!!慎用大P,防止旧资料覆盖新资料
    

    解压缩的目录选择:

    tar -jxv -f /root/etc.tar.bz2   		在本目录解压缩
    tar -jxv -f /root/etc.tar.bz2 -C /tmp  	在/tmp目录解压缩
    

    仅解压缩单一文件的方法:

    tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'  这个grep在截取关键词,找到你要解压缩的那个文件名
    
    tar -jxv -f 打包文件.tar.bz2 待解压缩文件名   	   这是解压缩单一文件的语法
    tar -jxv -f /root/etc.tar.bz2 etc/shadow  	   好了,开始解压缩了
    

    打包某个目录,除去其中的某些文件:
    备份/etc和/root两个文件夹(不含/root/etc*),备份后的文件放置在/root下,所以还要把自身排除在外

    tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root
    

    打包比某个文件要新的文件:

    find /etc -newer /etc/passwd  打包/etc中比/etc/passwd还要新的文件
    
    tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2020/04/29" /etc/*
    
    tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'  显示出文件,调用出结尾非/的文件名
    

    打包后,压不压缩,名称不同:

    tarfile (只是一个称呼)
    tar -cv -f file.tar
    
    tarball (只是一个称呼)
    tar -jcv -f file.tar.bz2
    

    将文件打包到某些特殊设备:

    tar -cv -f /dev/st0 /home /root /etc   把/home /root /etc共3个文件夹备份到/dev/st0磁带设备中
    

    利用管道命令与数据流:

    cd /tmp
    tar -cvf - /etc | tar -xvf -    将/etc整个目录一边打包,一边在/tmp打开
    

    系统备份范例:

    mkdir /backups        全都备份到backups文件夹
    chmod 700 /backups    只能root用户进入操作,其他人均不得见
    ll -d /backups
    出现:
    drwx------. 2 root root 6 5月  31 16:04 /backups
    
    开始备份,/home/loop*不需要备份,/root下的压缩文件不需备份
    tar -jcv -f /backups/backup-system-20200531.tar.bz2 --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root
    
    
    ll -h /backups/
    出现:
    总用量 20M
    -rw-r--r--. 1 root root 20M 5月  31 16:09 backup-system-20200531.tar.bz2
    

    常见问题:
    解压缩后的SELinux问题
    如果你的系统必须要以备份的数据来恢复到原本的系统中,恢复完成后,死活登录不上去,说明/etc/shadow这个密码文件的SELinux类型在还原时被更改了,导致系统的登录程序无法顺利读取它,才造成无法登录的窘境,解决方法共3种:
    (1)通过各种可行的恢复方式登录系统,修改/etc/selinux/config文件,将SELinux改成permissive模式,重新启动后系统就正常了。
    (2)第一次恢复系统后,不要立刻重新启动,先用restorecon -Rv /etc自动修复一下SELinux的类型即可(鸟哥他推荐的)
    (3)通过各种可行的方式登录系统,建立/.autorelabel文件,重新启动后系统会自动修复SELinux的类型,并且又会再次重新启动,之后就正常了

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

    xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
    			-l 指定备份等级,0-9,默认0,即完整备份
    			-f 类似tar,后面接产生的文件
    xfsdump -I    列出目前备份的信息状态
    
    首次备份:将完整备份的文件名记录成为/srv/boot.dump
    xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot
    
    
    增量备份:
    xfsdump -I
    dd if=/dev/zero of=/boot/testign.img bs=1M count=10  随便建立一个10M的文件
    xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot   增量备份
    ll /srv/boot.dump*
    xfsdump -I
    
    xfsrestore -I                                        可以用来查看备份文件
    xfsrestore [-f 备份文件] [-L S_label][-s] 待恢复目录   可以完成单一文件全系统恢复
    xfsrestore [-f 备份文件] -r 待恢复目录                 通过增量备份文件来恢复系统
    xfsrestore [-f 备份文件] -i 待恢复目录                 进入交互模式
    
    
    
    xfsrestore -f /srv/boot.dump -L boot_all /boot      直接将数据覆盖回去
    
    xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot  将备份数据在/tmp/boot下面解开
    
    du -sm /boot /tmp/boot
    出现:
    161	/boot
    151	/tmp/boot
    
    diff -r /boot /tmp/boot     进行差异性查找
    出现:
    只在 /boot 存在:testign.img
    
    
    只恢复grub2到/tmp/boot2中:
    xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2  
    
    
    恢复增量备份数据:
    xfsrestore -f /srv/boot.dump1 /tmp/boot
    
    
    仅还原部分文件,交互模式:
    xfsrestore -f /srv/boot.dump -i /tmp/boot3
    

    8.5 光盘写入工具

    1、制作一般数据光盘镜像文件
    mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件 -graft-point isodir=systemdir
    
    镜像备份3个文件夹到一个镜像文件中,等号左侧是镜像文件中的目录,右侧是实际目录
    mkisofs -r -V 'linux_file' -o /tmp/system.img -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
    
    ll -h /tmp/system.img 
    出现:
    -rw-r--r--. 1 root root 104M 5月  31 17:09 /tmp/system.img
    
    挂载一下,查看内容,然后再卸载:
    mount -o loop /tmp/system.img /mnt
    ll /mnt
    umount /mnt
    
    
    
    可以先把所有要刻录的文件,放在一个文件夹/srv/cdrom内,进入这个文件夹,执行:
    mkisofs r -v -o /tmp/system.img .    把当前目录刻录进去
    
    制作/修改可启动光盘镜像文件
    下载镜像文件
    把镜像文件放在/home目录
    
    为了修改里面的数据:
    isoinfo -d -i /home/CentOS-7-x86_64-Minimal-2003.iso  先看看里面是啥
    mount /home/CentOS-7-x86_64-Minimal-2003.iso /mnt     挂载到/mnt
    mkdir /srv/newcd
    rsync -a /mnt/ /srv/newcd           完整拷贝所有的权限属性等数据到/srv/newcd
    ll /srv/newcd 
    修改里面的数据
    
    为了建立iso文件:
    ll /srv/newcd/isolinux/
    cd /srv/newcd
    mkisofs -o /custom.iso -b isolinux/isoLinux/bin -c isolinux/boot.cat -no-emul-boot -V 'CentOS 7 x86_4' -boot-load-size 4 -boot-into-table -R -J -v -T .  这里最后有个点莫忘了
    此时就有个/custom.img文件存在,可以将该光盘刻录出来
    

    光盘刻录工具:(这里暂时不学)

    cdrecord 新的系统改成了 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/sr0 [可用选项功能] file.iso    
    

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

    dd if="input_file" of="output_file" bs="block_size" count="number"
    
    dd if=/etc/passwd of=/tmp/passwd.back   把/etc/passwd备份到/tmp/passwd.back
    
    dd if=/dev/sr0 of=/tmp/system.iso   将刚刚刻录的光盘的内容,再次备份下来成为镜像文件
    
    dd if=/tmp/system.iso of=/dev/sda   假设/dev/sda是你的U盘,将iso文件刻录到U盘,可以用U盘来安装Linux
    
    dd if=/dev/vda2 of=/tmp/vda2.img 将整个/boot文件系统备份下来
    

    使用dd来备份,是笨拙的,但是dd只管拷贝整个扇区,并不管里面是啥,有啥拷啥。

    cpio可以备份任何东西,但是它不会主动去找文件备份,需要配合find

    cpio -ovcB  > [file|device]   备份
    cpio -ivcdu > [file|device]   还原
    cpio -ivct  > [file|device]   查看
    
    
    找出/boot下面的所有文件,然后将它备份到/tmp/boot.cpio
    cd /
    find boot -print
    find boot | cpio -ocvB > /tmp/boot.cpio
    ll -h /tmp/boot.cpio
    file /tmp/boot.cpio
    
    将刚刚的文件在/root目录下解压缩:
    cd ~
    cpio -idvc < /tmp/boot.cpio
    ll /root/boot  /boot
    
  • 相关阅读:
    gradle平级项目引用
    java使用ssh访问Linux的项目jscraft
    debian更新源时找不到公钥的解决办法
    debian系在线安装软件apt-get命令族
    vim打造开发IDE
    Mysql主从同步配置
    byte[] 转Hex String
    记录一次条件比较多的SQL查询语句
    LruCache的缓存策略
    LinkedHashMap的实现原理
  • 原文地址:https://www.cnblogs.com/dindin1995/p/13059061.html
Copyright © 2011-2022 走看看