【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章