回顧:
RAID:
不同的服務器配置起來他的藉口可能配置起來有所不同,但是官方一般都提供響應的說明書,按照說明書進行配置就行。關鍵是理解RAID級別的機制的意義是什麼
LVM:
其實是一個邏輯設備他存在的主要作用是提供卷管理操作,我們稱之爲“volume”,
卷管理操作的目的主要是實現把一個或多個底層的物理設備給組織成一個邏輯設備,我們可以將底層的任何類型的塊設備,包括我們常見的基本磁盤分區,或者甚至是RAID都OK,只要他們提供塊級別的存儲空間,但是考慮到任何單個硬件設備他們的邊界都是固定的,這是是指基本磁盤分區,就算是RAID能夠擴展,但是擴展起來也極爲不便,如果說我們現在有一個10G的磁盤分區,隨着我們數據的增長,而導致磁盤分區滿掉的話,這個時候我們要想讓業務繼續進行,服務器繼續運行,只有一個辦法就是找一個更大的分區,比如說找一個30G的或者是50G的,把數據導上去,把服務程序那個對應讀取數據的目錄指向新的磁盤,這中間勢必會導致業務終止,因爲不終止,數據就沒法複製,也沒辦法去修改服務自身讀取數據的目錄,這就是爲什麼出現了邏輯文件系統,這個邏輯文件系統他的大小可以跨越底層多個設備,但是要藉助中間層VG來實現。在一個VG中可以有多個LV,LV存在的作用就是當一個獨立的文件系統來使用。有了LV以後我們就不在使用任何的底層設備,而LV的大小是由其內部的PE的大小和PE的數量來決定的。因此LV就是一個邏輯設備。
我們知道LV是在物理設備上又附加的一個邏輯層,所以一旦底層硬件設備發生損壞,那麼他上傳的數據勢必就被損壞了,至少是放在硬件上的設備是損壞的,如果一塊硬盤出故障的機率是百分之一的話,那麼兩塊硬盤出的故障率就是百分之二,所以隨着底層硬件設備的數量的增加,就會帶來了整個設備故障風險的增加,我們一定要記得我們底層設備增加了,那麼整機出故障的機率是增加了而不是減小了。在企業中真正的邏輯卷不是直接建立在底層設備上的,而是放在那些有容錯能力的RAID上,這就是避免不是因爲底層某個磁盤設備的損壞,而導致邏輯卷中的某個分區損壞。
以後LVM與RAID要結合使用。
RAID僅能保證硬件損壞時,業務不會終止,但是不能進行數據備份。我們建議將邏輯卷建立在硬件RAID上。
邏輯卷雖然是邏輯設備但是他也是設備,所以需要內核中的驅動模塊開驅動他,
快照卷只是讓我們的備份工作更加流暢,更加容易實現而設定的。它本身並不是備份,他只是給備份提供了一個輔助手段,如說直接對線上的體系進行復制的話,將會有一個問題,我們的數據會不一致,一個大文件有20G,我們複製的時候只能將這個數據抽成絲,成爲流式數據,一個數據流一個數據流的方式往外複製,而我們的在複製前面數據流時,我們的後面的數據流發行=生變化了,那麼我們的數據就不一致了,就會導致系統中有些時間戳不一致,或者說我們在複製開始到複製結束的這之間是不允許系統中的文件的時間戳發生改變的,爲了保證這種情況,就出現了快照。
我們知道快照卷剛創建時是空的,但是等打開快照文件是發現我們的文件都在,這是因爲我們通過快照卷提供了一個指向原卷的數據的通路。這就表示我們在複製的時候如果我們的文件發生變化,那麼我們的快照卷就會將這個文件在發生前那一刻會複製一個副本到快照卷中。
壓縮和解壓縮工具和bash腳本編程:
我們壓縮文件也一般只是壓縮文本格式的文件,並且如果文件是壓縮文件,那麼我們就不能再繼續進行壓縮操作,除了浪費CPU時鐘之外,幾乎沒什麼作用。
壓縮比:壓縮之前文件的大小與壓縮後文件大小的比率
爲什麼能發生壓縮呢?
其實就是分析文件內部數據存儲結構的模式實現的。我們只需知道不同的壓縮算法,他們對於文本的替換的方式不同所以帶來的結果就是他們的壓縮比就很可能不一樣,有些進行設計的算法,算法很厲害所以壓縮比很大,有些算法可能差一點所以壓縮比就很小。
壓縮的目的:
壓縮其實就是拿時間換空間,拿CPU的時間,換的是磁盤的空間
壓縮工具:
較早的有:compress/uncompress,壓縮後文件的後綴是:.Z
現在最流行的:gzip/gunzip,壓縮後文件的後綴是:.gz
新近又出現了bzip2/bunzip2,壓縮後文件的後綴是:.bz2
之後又出現了:
xz/unxz壓縮後文件的後綴是:.xz
(xz是最近剛出現的,也是越來越受歡迎的,動搖了gzip的壓縮統治地位)
lzma/unlzma壓縮後文件的後綴是:.lzma
歸檔的工具:
zip/unzip這是既能歸檔也能壓縮的。
tar,cpio這是純粹的歸檔
1.gzip/gunzip/zcat
功能: gzip,gunzip, zcat - compress or expand files 壓縮或還原文件
說明:使用gzip壓縮文件時,會將原文件刪除,解壓壓縮文件後,壓縮的文件也會被刪除。雖然說在linux上是不區分文件後綴名的,但是在gzip上是區分後綴名的。
演示:
[root@centos6 tmp]# ll -lh messages
-rw-------. 1 root root 473K Nov 15 12:51 messages
[root@centos6 tmp]# gzip messages
[root@centos6 tmp]# ll -lh messages.gz
-rw-------. 1 root root 61K Nov 15 12:51 messages.gz
[root@centos6 tmp]#
使用gzip壓縮後的文件我們可以使用命令“zcat”來查看壓縮文件中的內容。如果用cat查看壓縮文件的話就會顯示亂碼。
注意:當一個壓縮問價非常大的話,建議不要使用zcat來查看,比方說一個幾個G的文件,我們使用zcat來展開文件,那麼就可能幾分鐘就過去了。所以zcat只適用於查看小文件。
gzip的使用格式:
gzip [OPTION]... FILE....
選項:
-d:解壓縮,相當於gunzip;
-#:指定壓縮比,默認是6,數字越大壓縮比越大;#範圍是1-9
-c:將壓縮結果輸出至標準輸出;
一般是這樣使用: gzip -c FILE > /PATH/TO/SOMEFILE.gz
(當使用選項“-c”不將結果保存至指定文件時,屏幕會輸出壓縮後的亂碼,那麼我們需要執行命令“reset”來重置終端。)
在說第二個工具之前,打開一個網站叫“www.kernel.org”這就是linux內核站點我們可以看一下網站上很多文件都是壓縮文件,我們可以對那些“.gz”和“.xz”還有“.bz2”格式的壓縮文件的同樣壓縮比。這裏還提到了登錄FTP服務器,我們在命令行中輸入:
(1)首先yum安裝lftp命令
(2)想將文件下載至哪個目錄,就先切換到哪個目錄然後再訪問FTP
(3)在命令行上輸入:lftp 10.1.0.1
(4)使用mget命令下載。
(5)退出FTP服務器,使用bye命令或者exit
將來我們從網站下載源碼包時,一般都是提供給我們壓縮包,這是因爲第一是節約空間。第二是下載時節約帶寬。
2. bzip2/bunzip2/bzcat
bzip2 [OPTION].... FILE.....
舉例:
[root@centos6 tmp]# ll -lh messages
-rw-------. 1 root root 473K Nov 15 12:51 messages
[root@centos6 tmp]# bzip2 messages
[root@centos6 tmp]# ll -lh messages.bz2
-rw-------. 1 root root 32K Nov 15 12:51messages.bz2
[root@centos6 tmp]# bunzip2 messages.bz2
[root@centos6 tmp]# ll -lh messages
-rw-------. 1 root root 473K Nov 15 12:51 messages
[root@centos6 tmp]#
選項:
-d:解壓縮,相當於bunzip2;
-#:指定壓縮比;默認是6.;數字越大壓縮比越大(1-9);
-k:keep,保留原文件;(對於他的使用無需使用輸出重定向,直接使用“bzip2 -k messages”他會在壓縮時自動保留源文件而不再刪除。)
bzcat:不用解壓縮文件,也能查看壓縮文件的內容。
3. xz/unxz/xzcat
lzma/unlzma/lzmacat
格式:
xz [OPTION].... FILE....
選項:
-d:解壓縮;
-#:指定壓縮比;默認是6,數字越大壓縮比就越大(1-9);
-k:保留源文件;
xzcat:不用解壓縮文件就能查看壓縮文件內容
注意:上面的三款工具只支持壓縮文件不支持壓縮目錄
演示:
[root@centos6 testdir]# cp /var/log/*.log /testdir/test/
[root@centos6 testdir]# ll -lh test/
total 964K
-rw-------. 1 root root 2.4K Nov 15 13:53anaconda.ifcfg.log
-rw-------. 1 root root 23K Nov 15 13:53 anaconda.log
-rw-------. 1 root root 41K Nov 15 13:53 anaconda.program.log
-rw-------. 1 root root 171K Nov 15 13:53anaconda.storage.log
-rw-------. 1 root root 141K Nov 15 13:53anaconda.yum.log
-rw-r--r--. 1 root root 3.3K Nov 15 13:53boot.log
-rw-r--r--. 1 root root 412K Nov 15 13:53dracut.log
-rw-r-----. 1 root root 0 Nov 15 13:53 mysqld.log
-rw-r--r--. 1 root root 89 Nov 15 13:53 pm-powersave.log
-rw-------. 1 root root 0 Nov 15 13:53 spice-vdagent.log
-rw-r--r--. 1 root root 5.4K Nov 15 13:53vmware-install.log
-rw-r--r--. 1 root root 30K Nov 15 13:53 vmware-vmsvc.log
-rw-r--r--. 1 root root 34K Nov 15 13:53 vmware-vmusr.log
-rw-r--r--. 1 root root 0 Nov 15 13:53 wpa_supplicant.log
-rw-r--r--. 1 root root 49K Nov 15 13:53 Xorg.0.log
-rw-r--r--. 1 root root 22K Nov 15 13:53 Xorg.9.log
-rw-------. 1 root root 51 Nov 15 13:53 yum.log
[root@centos6 testdir]# ll -ldh test/
drwxr-xr-x. 2 root root 4.0K Nov 15 13:53test/
[root@centos6 testdir]# gzip test/
gzip: test/ is a directory -- ignored
[root@centos6 testdir]#
所以說明這些工具不支持對目錄進行壓縮,但是我們在windows中我們使用的壓縮工具好像也支持對目錄的壓縮,那爲什麼二者會不同呢?
解:
上面的幾款工具的確不支持壓縮目錄的功能,如果我們想要對目錄進行壓縮,而不是僅壓縮目錄中的一個文件,那麼我們需要對目錄中的這些文件進行歸檔操作。
歸檔操作:
相當於把多個文件打包成一個文件,這種操作就叫歸檔操作。歸檔完成後我們看到的是一個文件,而不是單個文件,但是打包的一個缺點就是,打包之後這個歸檔文件反而會更大,這是因爲這個打包工具本身也有大小,所以一般而言用打包工具進行歸檔後,我們都用壓縮工具對其進行壓縮。所以一般歸檔和壓縮是結合起來使用。
歸檔:
工具:tar,cpio
tar命令:
格式: tar [OPTION].... FILE.....
說明:tar的選項可以不加減號“-”,並且tar歸檔文件時不像上面的壓縮工具我們不用指明壓縮後的文件名,這裏歸檔需要自己手動指定歸檔的文件名,所以需要使用-f選項,所以下面的三種操作一般是結合選項“-f”使用的,並且選項“-f”需要參數,也就是文件名,打包後的文件名後綴一定是“.tar”結尾。
(1)創建歸檔:
-c -f /PATH/TO/SOMEFILE.tar FILE.......
-cf /PATH/TO/SOMEFILE.tar FILE.......
(2)展開歸檔:
-x -f /PATH/TO/SOMEFILE.tar
-x -f /PATH/TO/SOMEFILE.tar -C(大寫)目標目錄
(3)查看歸檔文件中文件列表:
-t -f /PATH/TO/SOMEFILE.tar
注意:歸檔的時候,選項-c與-f可以合併寫“-cf”但是不能寫反了寫成“-fc”,以爲寫反了,後面的文件,系統就以爲是選項“-c”的參數了。並且注意歸檔是不刪除原文件愛你的,將歸檔文件解歸檔到指定的目錄下,需要使用大寫的選項“-C”後面跟上執行的目標目錄路徑。
演示:
[root@centos6 testdir]# ll test/
total 1928
-rw-------. 1 root root 962560 Nov 15 14:22anaconda.ifcfg.log
-rw-------. 1 root root 22956 Nov 15 13:53 anaconda.log
-rw-------. 1 root root 41980 Nov 15 13:53 anaconda.program.log
-rw-------. 1 root root 174135 Nov 15 13:53anaconda.storage.log
-rw-------. 1 root root 144227 Nov 15 13:53anaconda.yum.log
-rw-r--r--. 1 root root 3345 Nov 15 13:53 boot.log
-rw-r--r--. 1 root root 421683 Nov 15 13:53dracut.log
-rw-r--r--. 1 root root 25419 Nov 15 13:53 functions
-rw-r-----. 1 root root 0 Nov 15 13:53 mysqld.log
-rw-r--r--. 1 root root 89 Nov 15 13:53 pm-powersave.log
-rw-------. 1 root root 0 Nov 15 13:53 spice-vdagent.log
-rw-r--r--. 1 root root 5448 Nov 15 13:53 vmware-install.log
-rw-r--r--. 1 root root 30494 Nov 15 13:53 vmware-vmsvc.log
-rw-r--r--. 1 root root 34261 Nov 15 13:53 vmware-vmusr.log
-rw-r--r--. 1 root root 0 Nov 15 13:53 wpa_supplicant.log
-rw-r--r--. 1 root root 49420 Nov 15 13:53 Xorg.0.log
-rw-r--r--. 1 root root 22217 Nov 15 13:53 Xorg.9.log
-rw-------. 1 root root 51 Nov 15 13:53 yum.log
[root@centos6 testdir]# tar -cf mylog.tar test/*.log //這是歸檔文件
[root@centos6 testdir]# ls
backup lost+found mylog.tar scripts test
[root@centos6 testdir]#
[root@centos6 testdir]# mkdir -p /testdir/tar
[root@centos6 testdir]# tar -xf mylog.tar -C tar/ //解歸檔至指定的目錄下
[root@centos6 testdir]# ll tar/
total 4
drwxr-xr-x. 2 root root 4096 Nov 15 14:32 test
[root@centos6 testdir]# tar -tf mylog.tar //查看歸檔文件的列表。
test/anaconda.ifcfg.log
test/anaconda.log
test/anaconda.program.log
test/anaconda.storage.log
test/anaconda.yum.log
test/boot.log
test/dracut.log
test/mysqld.log
test/pm-powersave.log
test/spice-vdagent.log
test/vmware-install.log
test/vmware-vmsvc.log
test/vmware-vmusr.log
test/wpa_supplicant.log
test/Xorg.0.log
test/Xorg.9.log
test/yum.log
[root@centos6 testdir]#
總結:tar命令中任何選項都帶“-f”選項。
歸檔完成後通常需要壓縮,結合此前的壓縮工具,就能實現壓縮多個文件了;
(4)歸檔並壓縮
-z:直接調用gzip2
歸檔並壓縮文件: -zcf /PATH/TO/SOMEFILE.tar.gz FILE.....
解壓縮並展開歸檔: -zxf /PATH/TO/SOMEFILE.tar.gz
-j:直接調用bzip2
歸檔並壓縮文件: -jcf
解壓縮並展開歸檔: -jxf /PATH/TO/SOMEFILE.tar.gz
-J(大寫):直接調用xz
歸檔並壓縮文件: -Jcf
解壓縮並展開歸檔: -Jxf /PATH/TO/SOMEFILE.tar.gz
zip工具:
既能歸檔又能壓縮。
後綴名:.zip
在使用是,壓縮後的文件名需要手動指定,並且文件後綴是“.zip”展開文件使用
unzip命令。
練習:
下載redis-3.0.2.tar.gz
網站下載:www.redis.io或教室FTP服務器
要求:展開至/tmp目錄;而後再創建壓縮爲xz格式。
解:
[root@centos6 testdir]# lftp 10.1.0.1
lftp 10.1.0.1:~> cd /pub/Sources/sources/redis
cd ok, cwd=/pub/Sources/sources/redis
lftp 10.1.0.1:/pub/Sources/sources> cd redis/
lftp10.1.0.1:/pub/Sources/sources/redis> ls
-rwxr--r-- 1 500 500 1064262 Apr 30 2014 redis-2.8.7.tar.gz
-rwxr--r-- 1 500 500 1097369 May 13 2014 redis-2.8.9.tar.gz
-rwxr--r-- 1 500 500 1360182 Jun 26 2015 redis-3.0.2.tar.gz
lftp10.1.0.1:/pub/Sources/sources/redis> mget redis-3.0.2.tar.gz
1360182 bytes transferred
lftp10.1.0.1:/pub/Sources/sources/redis> bye
[root@centos6 testdir]# ls
backup lost+found mylog.tar redis-3.0.2.tar.gz scripts tar test
[root@centos6 testdir]# tar -zxf redis-3.0.2.tar.gz
[root@centos6 testdir]# ls
backup lost+found mylog.tar redis-3.0.2 redis-3.0.2.tar.gz scripts tar test
[root@centos6 testdir]# cd redis-3.0.2
[root@centos6 redis-3.0.2]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README runtest-cluster src
[root@centos6 redis-3.0.2]# cd ..
[root@centos6 testdir]# ls
backup lost+found mylog.tar redis-3.0.2 redis-3.0.2.tar.gz scripts tar test
[root@centos6 testdir]# tar -Jcf redis-3.0.2.tar.xzredis-3.0.2
[root@centos6 testdir]# ls
backup mylog.tar redis-3.0.2.tar.gz scripts test
lost+found redis-3.0.2 redis-3.0.2.tar.xz tar
[root@centos6 testdir]#
注意:tar打包壓縮的時候我們一定要進行指明壓縮包的名稱和要打包壓縮的文件。
bash腳本編程之用戶交互:
(此前我們講的腳本參數,我們通過向腳本中傳遞參數,使得腳本能夠靈活的變換的處理不同的內容,這是一種能夠讓我們的腳本擁有更好的適應性,這就叫腳本參數其實我們也可以直接讓腳本跟用戶進行交互,用戶通過鍵盤輸入數據,從而實現靈活的處理機制linux中的一個重要的哲學思想就是儘量避免與用戶交互,避免交互的目的就是爲了腳本從頭啓動以後從頭運行至尾部完成所有操作的。所以將來我們在真正做的時候,儘量避免交互式操作,除非我們每次打算交互式操作。但是我們需要了解交互這個方式是怎樣實現的。)
實現交互的命令是:read
[root@centos6 ~]# type read
read is a shell builtin //read是一個內建命令
[root@centos6 ~]#
腳本參數
read其實也可以賦值給數組的。
用戶交互:通過鍵盤輸入數據,從而完成變量賦值操作;
格式:
read [option]... [name....] //這個name是變量名,這個表達式是變量賦值不是引用
功能:read的作用其實就是將輸入的內容分別賦值給不同的變量
選項:
-p 'PROMPT' //給定一個提示符
-t TIMEOUT //超時
演示:
[root@centos6 ~]# read name //其實這就是read賦值,將用戶輸入的值複製給read 後面的變量中
dong
[root@centos6 ~]# echo $name
dong
[root@centos6 ~]#
[root@centos6 ~]# read a b //read後面跟兩個變量
hua xiang //輸入兩個變量值
[root@centos6 ~]# echo $a //這說明read能夠將用戶數據的數據自動分隔,並賦值給變量
hua
[root@centos6 ~]# echo $b
xiang
[root@centos6 ~]#
如果輸入的數據不對等,那麼結果就有點麻煩
第一種情況:
[root@centos6 ~]# read a b c
zhong guo
[root@centos6 ~]# echo $a
zhong
[root@centos6 ~]# echo $b
guo
[root@centos6 ~]# echo $c
第二種情況:
[root@centos6 ~]# read a b c
ni hao ma xiang
[root@centos6 ~]# echo $a
ni
[root@centos6 ~]# echo $b
hao
[root@centos6 ~]# echo $c //顯示將用戶後面的兩個數據全部賦值給了最後一個變量
ma xiang
[root@centos6 ~]#
另外我們如果希望用戶按照我們的意思去輸入數據,那麼我應該給用戶一個提示信息。
就像:下面這個命令,我們僅是輸入“read name”然後回車就出現這種情況,那麼用戶也不知道也下來要做什麼,所以我們要是在前面加上一些提示符那麼用戶就知道了
給用戶一段提示信息:
方法一:
可以使用echo命令與read的結合:
[root@centos6 ~]# echo "please enter a name: ";read name //兩個命令中間要加分號連接
please enter a name:
tian
[root@centos6 ~]# echo $name
tian
[root@centos6 ~]# echo -n "please enter a name: ";read name //在一行顯示
please enter a name: xiang
[root@centos6 ~]# echo $name
xiang
[root@centos6 ~]#
方法二:
可以單獨使用read命令,加上其“-p”選項即可
[root@centos6 ~]# read -p "please enter a name:" name
please enter a name:nie
[root@centos6 ~]# echo $name
nie
[root@centos6 ~]#
注意read選項“-t”表示設置時間,表示用戶多長時間內不輸入內容這個命令就失效了
[root@centos6 ~]# read -t 5 -p "please enter a name:" name
please enter a name:[root@centos6 ~]#
please enter a name:[root@centos6 ~]# echo $name
[root@centos6 ~]#
[root@centos6 ~]# [ -z "$name"]&&name="obama" //這個命令可以解決當變量爲空時, 我們自動給變量賦值一個默認值
[root@centos6 ~]# echo $name
obama
[root@centos6 ~]#
注意:
[-z "$name" ]&&name="obama"其實這個命令以後我們在寫腳本的時候,我們可以使用這個命令給腳本中的變量再沒有值的情況下賦值一個默認的值,以避免因爲腳本中變量沒有值而導致的腳本執行錯誤。
利用上面的命令寫一個腳本,這個腳本能夠執行的功能是,能夠添加一個用戶,但是需要提示用戶需要用戶通過鍵盤數據用戶的名是什麼,並且能夠在用戶添加成功後。將用戶的密碼設置對應項,
#!/bin/bash
#
read-p "please enter a name:" name
[-z "$name" ] && echo "a username is needed."&& exit 2
read-p "please enter password for $name, [password]:" password
[-z "$password" ] && password="password"
ifid $name &> /dev/null; then
echo "$name exists."
else
useradd $name
echo "password" | passwd--stdin $name &> /dev/null
echo "Add user $namefinished."
fi
bash -n /path/to/some_script
檢測腳本中的語法錯誤
當我們寫的腳本價差語法錯誤時,沒有檢查出來,但是運行腳本就是運行不成功,那麼我們就可以使用調試運行這個命令,一步步的執行腳本中的命令。
bash -x /path/to/some_script
調試運行
演示:
[root@centos6 scripts]# bash -x adduser.sh
+ read -p 'please enter a name:' name
please enter a name:wang
+ '[' -z wang ']'
+ read -p 'please enter password for wang,[password]:' password
please enter password for wang, [password]:123456
+ '[' -z 123456 ']'
+ id wang
+ useradd wang
+ echo password
+ passwd --stdin wang
+ echo 'Add user wang finished.'
Add user wang finished.
[root@centos6 scripts]#
寫一個腳本:
列出所有的已知磁盤設備文件,然後查看磁盤設備上有多少個分區信息
示例:
#!/bin/bash
#Version:0.0.1
#Author:MageEdu
#Description:read testing
read -p "Enter a disk special file:" diskfile
[ -z "$diskfile" ] && echo "Fool" && exit 1
if disk -l | grep "^Disk $diskfile" &> /dev/null;then
fdisk -l $diskfile
else
echo "Wrong disk special file."
exit 2
fi