www.kernel.org常常關注linux內核最新版本和特性php
linux:GNU:GNU/Linux,源代碼
發行版:Fedora,RedHat(CentOS),SUSE(OPEN SUSE),Debain(Ubuntu,Mint),Gentoo(可自行編譯),LFS(Linux From Scratch)html
編譯:把源代碼轉換成能夠被CPU識別的二進制代碼。做用是把源程序轉換成你對應平臺能夠執行的二進制格式的,與硬件密切相關。前端
RedHat:通用格式的平臺編譯好的。java
這次課程傳授:
RHCE+RHCA+shell編程+MySQL+Web集羣+NoSQL+Hadoop+Hbase+Openstacknode
OS:
WINDOWS
LINUX
UNIX
HP-UNIX
SOLARIS
AIX
SCO UNIX
UNIXWARE
OS/2python
操做系統的組成:
底層硬件--Kernel內核--library:API(庫)--shell--應用mysql
內核功能:
進程管理
內存管理
文件系統
網絡功能
硬件驅動
安全機制
。。。linux
GNU:GNU is Not UNIX
GPL:General Public License,通用公共許可證,版權
Copyright,Copyleft
開源協定
LGPL:lesser
GPLv2
GPLv3
linux基礎原則:
一、由目的單一的小程序組成,組合小程序完成複雜任務;
二、一切皆文件;
三、儘可能避免捕獲用戶接口(減小用戶交互);
四、配置文件保存爲純文本格式;ios
GUI接口:
CLI接口:
命令提示符,prompt,bash(shell)
#:root
$:普通用戶
命令:
命令格式:
命令 選項
選項:
短選項:-character(單字母)
多個選項能夠組合:-a -b = -ab
長選項:--word (一串字符)
參數:命令的做用對象
使用憑證:
root,redhatnginx
虛擬終端(terminal):Ctrl+Alt+F1 ~ F6 能夠任意切換終端入口
GUI(圖形接口):Graphic User Interface
Gnome:c開發
KDE:C++開發
XFace:簡潔的適用於嵌入式平臺的簡易界面
CLI(命令行接口):Command Line Interface
sh
bash
csh
zsh
ksh
tcsh
默認用戶:
root,student,vistor
su:switch user (切換用戶)
#su 用戶名 半切換
#su -l 用戶名 徹底切換 選項若是是[-l]的說明可省略的
#passwd 用戶名 設置(更改)密碼
密碼複雜性規則:
10的6次方 (只有數字)
36的6次方 (數字+小寫字母)
62的6次方 (數字+小寫字母+大寫字母)
能夠再增長標點符號和特殊字符,複雜性會更高,破解概率變低
一、使用4種類別字符中至少3種;
二、足夠長,大於7位;
三、使用隨機字符串;
四、按期更換;
五、循環週期足夠大;
login:
用戶名:用戶ID
認證機制:Authentication
受權:Authorization
審計:Audition (日誌)
prompt,命令提示符:
命令:
magic number:魔數
shebang
#!/bin/bash
命令使用格式:
#command options... arguments...
選項:修改命令的執行特性
短選項
長選項
參數:指定命令的做用對象
list:ls
列出,列表
目錄,文件:路徑映射而已,並非真正文件夾的概念。
路徑:從指定起始點到目的地所通過的位置
文件系統:file system
列出指定路徑下的全部目錄及文件
目錄:working directory,current directory
pwd:printing working directory
ls
-l;長格式
文件類型:
-:普通文件(f)
d:目錄文件
b:塊設備文件(block)
c:字符設備文件(character)
l:符號連接文件(symbolic link file)
p:命令管道文件(pipe)
s:套接字文件(socket)
文件權限:9位,每3位一組,每一組:rwx(讀,寫,執行),rw-可讀寫不能執行
文件硬連接的次數
文件的屬主(owner)
文件的屬組(group)
文件大小(size),默認單位是字節
時間戳(timestamp)這裏顯示被修改的時間。最近一次被訪問的時間,最近一次被修改的時間,最近一次被改變的時間(修改是數據更改,改變是屬性更改)
訪問:access(文件被訪問時間)
修改:modify(文件數據被修改)
改變:change,metadata,(改變文件元數據)
-h:作單位轉換(將文件大小顯示爲更易讀的數值)
-a:顯示以.開頭的隱藏文件
.表示當前目錄
..表示父目錄
-A:顯示隱藏文件但不現實.和..
-d:顯示目錄自身屬性
-i:index node,inode 顯示文件的索引節點號
-r:逆序顯示文件,默認是順序顯示文件
-R:遞歸(recursive)顯示,子目錄下的內容一併顯示
cd:change directory
家目錄,主目錄,home directory
cd ~username:進入指定用戶的家目錄
cd -:在當前目錄和前一次所在的目錄之間來回切換
命令類型:
內置命令(shell內置):內部,內建
外部命令:在文件系統的某個路徑下有一個與命令名稱相應的可執行文件
type:顯示指定屬於那種類型
環境變量:命名的內存空間(將一塊內存空間起個名)
變量賦值:起名以後往這個名稱的內存空間裏放數據
NAME(空間的命名)=Jerry(放入的數據)
printenv:顯示系統中全部環境變量的賦值
若是path路徑中同一個命令存在於多個目錄,那排在前面的目錄中的命令最早執行
hash:鍵值庫。o(1)不管緩存內容多長,同讀取1個文件的時間是同樣的。
緩存命中了多少次,全部使用過的命令路徑。
緩存爲王,若是發現系統慢了就加緩存來解決。
date:時間管理
linux:每次重啓時從硬件時鐘讀取時間。叫rtc實時時鐘
硬件時鐘:主板上的晶體振盪器來計時,很是精確。靠主板鈕釦電池來支撐。clock或hwclock查看硬件時間
系統時鐘:由操做系統來記錄的時間。date看到的是系統時間。
得到命令的使用幫助:
內部命令:
help command
外部命令:
COMMAND --help
命令手冊:manual
man COMMAND 好比:man ls
whatis COMMAND
顯示命令手冊共幾個章節,帶p的能夠忽略,只看純數字章節數
分章節:常見章節有8個 使用方式:man 1 COMMAND
一、用戶命令(/bin,/usr/bin,/usr/loacl/bin)
二、系統調用
三、庫調用
四、特殊文件(設備文件)
五、文件格式(配置文件的語法)
六、遊戲
七、雜項(miacellaneous)
八、管理命令(/sbin,/usr/sbin/,/usr/loacl/sbin)
man命令中
[]可選
<>必選
...能夠使用屢次
|:多選一
{}:分組
MAN:
NAME:命令名稱及功能簡要說明
SYNOPSIS:用法說明,包括可用的選項
DESCRIPRION:命令功能的詳盡說明,可能包括每個選項的意義
OPTIONS:說明每個選項的意義
FILES:此命令相關的配置文件
BUGS:關於此命令的bug反饋
EXAMPLES:使用示例
SEE ALSO:另外參照
翻屏:
向後翻一屏:SPACE
向前翻一屏:b
向後翻一行:ENTER
先前翻一行:k
查找:
/KEYWORD(查找鍵值):向後
n:下一個
N:前一個
?KEYWORD(查找鍵值):向前
n:下一個
N:前一個
q:退出
hwclock
-w:將系統時間同步至硬件時間
-s:將硬件時間同步至系統時間
在線文檔:
info COMMAND:命令的歷史詳情,man的補充
全部幫助文檔所在目錄:/usr/share/doc
進入查看某個命令的解釋
apache,hadoop
cal:calendar日曆簡寫
如何認識echo命令
type echo 提示內部命令
man echo 命令文檔
help echo 使用幫助
換行:
echo -e 「The year is 2013。\nToday is 26.」
退一格顯示:
echo -e 「The year is 2013。\bToday is 26.」
退兩格
echo -e 「The year is 2013。\b \bToday is 26.」
橫向製表符,兩行之間會空白一段顯示
echo -e 「The year is 2013。\tToday is 26.」
縱向製表符,上下錯開顯示
echo -e 「The year is 2013。\vToday is 26.」
不換行顯示,在命令提示符前顯示輸出
echo -n 「The year is 2013。\nToday is 26.」
printf命令:
不換行顯示,在命令提示符前顯示輸出
printf 「The year is 2013」
在命令提示符前顯示換行:
printf 「The year is 2013。\nToday is 26。」
正常顯示
printf 「The year is 2013。\nToday is 26。\n」
file命令及其用法:
file /bin/ls
WINDOWS:pe
LINUX:ELF是可執行二進制文件的格式。
查看ls命令相關內容
文件系統
linux目錄結構呈樹狀結構
rootfs:根文件系統 /表示根
FHS:文件系統層級標準,linux發行版必須遵照
/boot:系統啓動相關文件。內核、initrd和vmlinuz等關鍵文件,以及grub(bootloader)。操做系統啓動時須要用到的內核和磁盤映像文件initrd
/dev:設備文件。查找設備相關內容。
設備文件:linux中必須有設備文件才能夠被訪問
塊設備:隨機訪問的設備,數據塊
字符設備:線性訪問的設備(有次序的),顯示器和鼠標等均爲字符設備
特殊設備是沒有大小的
設備號:主設備號(major)和次設備號(minor)
/etc:配置文件
/home:用戶的家目錄,每一個用戶的目錄一般默認爲/home/USERNAME
/root:root管理員的家目錄。
/lib:庫文件
靜態庫:.a
動態庫:動態連接文件。.dll,.so(shared object)
/lib/modules:內核模塊文件
庫:被調用的封裝好的功能。執行時直接調用便可。
共享庫:內存里加載共享庫後,可供多個程序使用。
lost+found:任何一個分區上都會有的目錄,跟文件系統相關,是用於存儲那些文件系統在機器斷電時文件沒有輸入屬租還沒有來得及保存的文件,實現丟失找回的。
/media:掛載點目錄。設備文件不能直接打開,須要映射給某個目錄才能訪問。一般用於掛在移動設備。
/mnt:掛在點目錄,額外的臨時文件系統。
/misc:雜項
/opt:可選目錄,早期用於第三方應用軟件的。Nessus、oracle等。如今已變動爲/usr/local目錄下。
/proc:此目錄啓動前爲空,啓動後存放內核的映射文件。
/sys:僞文件系統,也是映射文件,跟硬件設備相關的屬性映射文件。實現硬盤設備管理。磁盤調度隊列再此修改。
/tmp:臨時文件。1月內未作文件修改會清空。/var/tmp
/var:可變化的文件存放目錄。緩存、鎖文件、日誌文件等。
/bin:系統自身使用的可執行文件,用戶命令
/sbin:系統自身使用的管理命令
/usr:shared,read-only,全局的共享的只讀文件。第三方應用程序使用目錄
/usr/bin
/usr/sbin
/usr/lib
/usr/loacl:
/usr/loacl/bin
/usr/loacl/sbin
/usr/loacl/lib
命名規則:
一、文件名長度不能超過255個字符;
二、不能使用/當文件名;
三、嚴格區分大小寫
相對路徑:相對於當前位置所開始的路徑
絕對路徑:由根開始的路徑
文件管理:建立文件,編輯文件
目錄管理:建立目錄,切換目錄
ls cd pwd
#mkdir:建立空目錄
-p:遞歸式建立目錄
-v:verbose詳細信息
mkdir -pv /mnt/test/x/m /mnt/test/y
mkdir -pv /mnt/test/{x/m,y}
命令行展開:
/mnt/test2/目錄下建立一下目錄
a_b,a_c,d_b,d_c
(a+b)(b+c)=ab+ac+db+dc
{a,d}_{b,c}
#tree:查看目錄樹
刪除目錄:rmdir(remove directory)
刪除空目錄
-p
文件建立和刪除
touch:用於修改文件的時間戳的。可用於建立文件。
-a:修改訪問時間
-m:更改修改時間
-t:自定義更改時間
-c:不改變
stat:顯示文件或文件系統的狀態信息
[root@localhost ~]# stat install.log
File: `install.log'
Size: 41179 Blocks: 96 IO Block: 4096 regular file
Device: 803h/2051d Inode: 522243 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-04-23 11:38:02.352442511 -0700 訪問時間
Modify: 2018-04-23 12:00:44.749316659 -0700 修改時間
Change: 2018-04-23 12:01:23.679827233 -0700 改變時間
建立文件,能夠使用文件編輯機
ASCII:asck碼,美國國家標準信息交換代碼
128個不一樣的字符:
二進制:
2的6次方=0-63
2的7次方=0,127
2的16次方:65536
標準:GB18030,GBK,GB2312,Unicode
linux下的文本編輯器:
nano:簡單的編輯器
刪除文件:rm 有別名實際上是rm -i;\rm去除別名,使用rm自己執行
-i:交互式,刪除時會提示用戶。
-f:強制刪除。
-r:刪除目錄,遞歸刪除目錄下的全部文件
複製和移動文件
cp:copy
cp SRC DEST
cp file1 file2 file3
一個文件到一個文件
多個文件到一個目錄
-R -r:遞歸複製目錄及目錄下全部文件到目標位置
-i:交互式
-f:強行復制
-p:複製時保留文件原有的屬組和屬主
-a:歸檔複製,保留原有全部屬性。經常使用於備份。
-L:不保持連接屬性
-P:保持文件原有的連接屬性
-d:保持連接屬性
mv:move
移動文件
mv SRC DEST
mv -t DEST SRC
在相對路徑下直接執行mv一個文件或目錄也能夠作更名使用
-f:強制覆蓋
-i:交互式
-t:現指定目標位置再指定需移動的文件
install:複製文件和設置屬性。install的源必須是文件,沒法複製目錄
-d DIRECOTRY:建立目錄
SRC DEST:複製文件,並給予執行權限
-m:能夠指定權限
-t:install -t DEST SRC
運行程序
設備管理
軟件管理
進程管理
網絡管理
目錄管理:
ls、cd、pwd、mkdir、rmdir、tree
文件管理:
touch、stat、file、rm、cp、mv、nano
日期時間:
date、clock、hwclock、cal(日曆)
文本文件管理:
cat、more、less、head、tail、cut、sort、uniq、grep
查看文本:
cat、more、less、head、tail
cat:連接並顯示
-n:顯示行號
-E:顯示每行的行結束符(對於linux的文本文件行結束符是$符,而windows下文本文件行結束符是$+回車。)
-T:製表符,顯示控制符號
-v:託字符,行首控制符等特殊符號
-A:顯示全部
cat命令反過來tac是文件尾部至首部倒序進行顯示。
Ctrl+c終止命令
cat顯示內容較多,在終端沒法全屏展現,須要Shift+pgup或pgdn來翻頁顯示,可是因爲cat命令是放在緩存當中的,若是文件顯示內容過多,也是不能所有顯示出來的。
分屏顯示:
more、less
more:向後翻。
翻屏:
向後翻一屏:SPACE
向前翻一屏:b
向後翻一行:ENTER
less:與man命令使用相似
翻屏:
向後翻一屏:SPACE
向前翻一屏:b
向後翻一行:ENTER
先前翻一行:k
查找:
/KEYWORD(查找鍵值):向後
n:下一個
N:前一個
?KEYWORD(查找鍵值):向前
n:下一個
N:前一個
q:退出
head:查看文件前n行 例:head -n 5 filename
tail:查看文件後n行 例:tail -5 filename
n:默認是10行
-n:可指定顯示的行數
tail -f :查看文件尾部,不退出,等待顯示後續追加至此文件的新內容。持續顯示最新的結尾內容
文本處理:
cut、join、sed、awk
database:數據庫
關係型數據庫:
表:表中能夠沒有行但不能沒有列。二維表:行和列。列和列之間的分割
文本文件:
Tom:23:male:2013/05/06 (冒號就是分隔符)
cut -d : -f1 /etc/passwd
-d:指定字段分隔符,默認是空格
-f:指定要顯示的字段, 顯示第幾列
-f 1 顯示第一列
-f 1,3 顯示第一列和第三列
-f 1-3 顯示第一列到第三列
文本排序:
sort(默認以升序進行排序)
示例:
[root@localhost ~]# sort /etc/fstab
#
#
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# Created by anaconda on Mon Apr 23 11:38:02 2018
devpts /dev/pts devpts gid=5,mode=620 0 0
# /etc/fstab
proc /proc proc defaults 0 0
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
sysfs /sys sysfs defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
UUID=018f5971-2eec-4c36-9d1a-1ffa87300f9b /boot ext4 defaults 1 2
UUID=a6a649bb-bdde-4e9e-9548-c1e9c5e591e8 / ext4 defaults 1 1
UUID=b3767047-e088-430b-b049-077f90080dd3 swap swap defaults 0 0
使用sort直接排序爲asck碼排序,會按照字符由左到右依次排序。
-n:數值排序
-r:降序排序(與sort直接使用相反)
-t:字段分隔符
-k:第幾個字段排序
-u:去重,相同的行只顯示一次
-f:排序時忽略字符大小寫
示例:以:爲分隔符以第三個字段爲準按數字大小進行排序
[root@localhost ~]# sort -t: -k3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
uniq:相鄰的重複行只顯示一次
-d:只顯示重複的行
-D:顯示全部重複的行
-c:把重複行顯示出來並顯示重複的次數
文本統計:
wc(word count) 統計一個文本文件中全部的行數
-l:只顯示行
-w:只顯示字符數
-c:只顯示字節數
-L:表示最長的那行所包含的字符
示例:
[root@localhost ~]# wc /etc/fstab
15 78 805 /etc/fstab
行數 字符數 字節數
字符處理命令
tr:轉換或刪除字符
tr [OPTION]... SET1 [SET2]
-d:刪除字符
示例1:只要有ab小寫的都更換爲大寫的AB了
[root@localhost ~]# tr 'ab' 'AB'
abc
ABc
Able
ABle
示例2:把某個文件的a-z的小寫所有更換爲大寫
[root@localhost ~]# tr 'a-z' 'A-Z' < /etc/passwd
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
示例3:只要含a和b的字樣所有被刪除,輸入字符回車後顯示刪除後的字符串
[root@localhost ~]# tr -d 'ab'
hellodba
hellod
are
re
bash及其特性:
shell特性:外殼
GUI:Gnome,kde,xfce
CLI:sh,csh,ksh,bash(遵循開源特性,涵蓋sh,ksh等多種特性),tcsh,zsh(後期出現,功能更增強大)
root,student:兩個用戶用的是一套shell程序,但打開了兩個進程。
程序只有一個
進程能夠多個(程序的副本),進程是程序執行的實例。
容許一個用戶帳號能夠打開屢次,只是打開了多個進程。
進程:在每一個進程看來,當前主機上只存在內核和當前進程,他意識不到其餘進程的存在。
shell自己是一個內部命令
[root@localhost ~]# type bash
bash is /bin/bash
用戶工做環境:
bash:
# 超級用戶
$ 普通用戶
shell,子shell
pstree命令能夠看到命令shell環境調用關係(進程樹)
bash特性:
一、命令歷史
二、管道、重定向
三、命令別名
四、命令行編輯
五、命令行展開
六、文件名通配
七、變量
八、編程
命令行編輯:
命令光標跳轉:
Ctrl+a:跳到命令行首
Ctrl+e:跳到命令行尾
Ctrl+u:刪除光標前至命令行首的內容
Ctrl+k:刪除光標前至命令行尾的內容
Ctrl+d:逐字刪除光標後的字符
Ctrl+左右箭頭:跳到左右一個單詞
Ctrl+l:清屏
命令歷史:bash會自動記錄過去執行過的命令,並且會將其保存在內存的一段緩存區內,使用上下箭頭便可找出過去命令
history:查看歷史命令
-c:清空整個命令歷史
-d OFFSET [n]:刪除指定位置的命令歷史 例:history -d 500 10 刪除從第500條命令以後的10個命令
當用戶退出時,系統會將內存內的歷史命令保存至用戶的家目錄下,文件名爲.bash_history
-w:將緩衝區命令寫入文件中,保存命令歷史至歷史文件。
環境變量:
PATH:命令搜索路徑
HISTSIZE:命令歷史緩衝區大小
命令歷史的適用技巧:
!n:執行命令歷史中的第n條記錄。
!-n:執行命令歷史中倒數第n條記錄
!!:執行上一條命令
!man:執行最近一次執行過的man命令
!string(任意字符串):執行命令歷史中最近一個以指定字符串開頭的命令
!$:引用前一個命令的最後一個參數。nano !$ 顯示nano所建立的文件。
摁一下Esc鬆開摁.(點)便可
Alt+.也能夠
命令補全:
PATH:命令搜索路徑
敲命令開頭使用Tab鍵可進行補全,若是有重複會展現出以此開頭爲首的全部命令
路徑補全:
路徑補全依舊使用Tabl鍵補全,而與命令補全機制不一樣,命令補全在搜索路徑下查找,而路徑補全是以打頭路徑下查找。
命令別名:
alias CMDLIAS='COMMAND [options] [arguments]'
在shell中定義的別名僅在當前shell生命週期中有效,別名的做用範圍爲當前shell進程
例:alias cls=clear
若是但願永久有效,能夠將命令寫入到bash配置文件中便可
使用alias命令能夠看到全部定義別名
alias是shell的內建命令,help alis便可獲取使用幫助
ualias cls 撤銷別名
\CMD 不使用別名直接執行命令
命令替換:$(COMMAND),反引號:`CONMAND`
把命令中某個子命令替換爲其執行結果的過程
例:[root@localhost ~]# echo " The current directory is $(pwd)."
The current directory is /root.
例:[root@localhost ~]# echo "Dir is `pwd`"
Dir is /root
例:[root@localhost ~]# touch ./file-$(date +%F-%H-%M-%S).txt
[root@localhost ~]# ls
anaconda-ks.cfg Documents file file-2018-05-04-07-17-02.txt install.log.syslog Pictures Templates
Desktop Downloads file- install.log Music Public Videos
bash支持的引號:
· ·:命令替換
「 」:弱引用,能夠實現變量替換
' ':強引用,不完成變量替換
文件名通配:globbing
*:匹配任意長度的任意字符
?:匹配任意單個字符
[]:匹配指定範圍內的任意單個字符
[abc],[a-m],[a-z],[A-Z],[0-9],[a-zA-Z],[0-9a-zA-Z]
特殊字符匹配:使用時要在外部再加一層[]中括號使用
例:[[:alpha:]]*[[:space:]]*[[:alpha:]] 匹配字母開頭字母結尾並中間含空白字符的文件
例:[[:alpha:]]*[[:space:]]*[^[:alpha:]] 匹配字母開頭中間空白字符非字母結尾的文件
[:space:]:空白字符
[:punct:]:標點符號
[:lower:]:小寫字母
[:upper:]:大寫字母
[:alpha:]:大小寫字母
[:digit:]:數字
[:alnum:]:數字和大小寫字母
man 7 glob 能夠查看到特殊字符匹配代碼
[^]:託字符,匹配指定範圍以外的任意單個字符。例:ls [^0-9]* 匹配非數字開頭的文件
用戶、組、權限
用戶:標識符
用戶組:標識符
安全上下文(secure context)
任什麼時候候用戶操做計算機無非就是發起進程,所以進程是用戶操做計算機的代理,因此進程在運行的時候必定是以發起進程的用戶身份來運行的,因此這個進程可以訪問那些文件,取決於進程本身的權限以及他訪問的資源或文件的權限。
權限:每一類用戶都有三種權限
r(讀),w(寫),x(執行)
文件:
r:可讀,能夠使用相似cat等命令查看文件內容;
w:可寫,能夠編輯或刪除此文件;
x:可執行,exacutable,能夠命令提示符下看成命令提交給內核運行;
目錄:
r:能夠對此目錄執行ls以列出內容的全部文件;
w:能夠再次目錄中建立文件;
x:能夠使用cd切換進此目錄,也能夠使用ls -l查看內部文件的詳細信息;
rwx:
r--:只讀
r-x:讀和執行
---:無權限
8進制 2進制 權限表示
0 000 ---:無權限
1 001 --x:執行權限
2 010 -w-:寫權限
3 011 -wx:寫和執行
4 100 r--:只讀
5 101 r-x:讀和執行
6 110 rw-:讀寫
7 111 rwx:讀寫執行
r=4,w=2,x=1
755:rwxr-xr-x
640:rw-r-----
660:rw-rw----
775:rwxrwxr-x
用戶:UID,/etc/passwd
組:GID,/etc/group
影子口令:
用戶:/etc/shadow
組:/etc/gshadow
用戶類別:
管理員:永遠爲0,內置
普通用戶:1-65535
系統用戶:1-499
通常用戶:500-60000
用戶組類別:
管理員組:
普通組:
系統組:
通常組:
用戶組類別:
私有組:建立用戶時,若是沒有爲其制定所屬的組,系統會自動爲其建立一個與用戶名同名的組
基本組:用戶的默認組
附加組,額外組:默認組意外的其餘組
進程:tom tom
對象:rwxrw-r-- jerry tom a.txt
訪問請求進入,系統會先覈對對象文件的屬主權限,若是不是則查看屬組權限,還不是覈對其餘權限
tom:ls
rwxr-xr-x root root /bin/ls
whatis passwd:查看passwd介紹的章節,
[root@localhost ~]# whatis passwd
passwd (1) - update user's authentication tokens 關於passwd命令的使用
passwd (5) - password file 關於passwd文件內容的解釋
passwd [sslpasswd] (1ssl) - compute password hashes 關於計算機密碼的哈希算法
man 5 passwd:查看第5章節,關於passwd文件內容的解釋
passwd文件中顯示的內容:
account:登錄用戶名
password:密碼(暗碼x表示)
UID:用戶ID
GID:基本組ID
GECOS (comment):通常爲空,顯示用戶註釋信息,如:全面、辦公地址、辦公電話等等。
HOME DIR:家目錄
SHELL:用戶的默認shell
shadow文件中顯示內容:
account:登陸名
encrypted password:加密的密碼
密碼按期更換時長:從1970年1月1日到上一次更換密碼的時間的總天數
密碼最短使用期限,0表示不限定
密碼最長使用期限,0表示無限期
密碼還有多久過時向客戶發起提醒
在密碼不作更改後,還有多少天必須修改密碼才能登錄
用戶有效期限
保留字段,無含義
加密方法:
對稱加密:加密和解密使用同一個密碼
公鑰加密(非對稱加密):每一個密碼都成對兒出現,一個爲私鑰(secret key),一個爲公鑰(public key),而且一個鑰匙一把鎖
單向加密,散列加密:提取數據特徵碼,也稱指紋加密。經常使用於數據完整性校驗。
一、不可逆,能加密不能解密
二、雪崩效應或蝴蝶效應,初始狀況下的微小改變致使後期的巨大改變
例:
[root@localhost ~]# md5sum file-2018-05-04-07-17-02.txt 查看某文件的特徵碼
d41d8cd98f00b204e9800998ecf8427e(特徵碼) file-2018-05-04-07-17-02.txt
[root@localhost ~]# vi file-2018-05-04-07-17-02.txt 將文件編輯添加111字段
[root@localhost ~]# md5sum file-2018-05-04-07-17-02.txt 再次查看文件的特徵碼有了巨大的改變
1181c1834012245d785120e3505ed169(徹底不一致的特徵碼) file-2018-05-04-07-17-02.txt
三、定長輸出
MD5:Message Digest 信息摘要,128位定長輸出
SHA1:Secure Hash Algorithm,安全哈希加密,160位定長輸出。安全級別高,但較慢。
SHA256\SHA512:定長256位和512位的定長輸出
useradd:添加用戶
which useradd:/usr/sbin/useradd
useradd USERNAME 添加用戶
passwd USERNAME 用戶設置密碼,或更改密碼
group文件內容:
組名:
組密碼:
組ID:
以此組爲附加組的用戶列表,額外組,多個組用逗號隔開
groupadd GRPNAME:添加新組
用戶管理:
useradd,userdel,usermod,passwd,chsh,chfn,finger,id,chage
組管理:
groupadd,groupdel,groupmod,gpasswd
權限管理:
chown,chgrp,chmod,umask
系統中自帶的shell類型
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
useradd [options] USERNAME
-u UID 指定UID號,首先普通用戶ID號要大於500,而且不能與其餘用戶ID衝突
-g GID 指定基本組ID號,
-G GID,...(附加組,能夠多個組使用逗號隔開)
-c "COMMENT" 指定註釋信息
-d /path/to/directory 指定家目錄 例:useradd -c 「Tony Blare」 -d /home/blare user4
-s 指定shell路徑,須要指定在/etc/shells:指定了當前系統可用的安全shell 例:useradd -s /sbin/nologin user5
-m -k搭配使用 強行爲用戶建立家目錄
-M 不給用戶建立家目錄
-r:添加一個系統用戶。系統用戶沒法登錄系統,也沒有家目錄。
/etc/login.defs 指定用戶相關的默認配置
環境變量:
PATH
HISTSIZE
SHELL:用於顯示當前用戶shell類型
/etc/shells:指定了當前系統可用的安全shell
userdel:
userdel [option] USERNAME
id:默認顯示當前用戶的ID號信息,後面指定用戶就顯示指定用戶的ID號信息
-u:顯示用戶ID信息
-g:顯示用戶所屬組ID
-G:顯示用戶所在組以及附屬組ID
-n:顯示組或用戶名,與-g、-G、-u聯合使用
-r:連帶用戶家目錄一塊兒刪除
finger:檢索用戶帳號信息的命令
finger USERNAME
修改用戶帳號屬性:
usermod
-u UID:修改帳戶UID
-g GID:修改帳戶GID
-G GID:修改附加組GID,慎用。會將原有附加組信息覆蓋。搭配-a選項則是添加新的附加組信息。
-c:註釋信息,加雙引號
-d:指定新的家目錄,配合-m使用,將原有家目錄下的文件所有移動至新的家目錄中
-s:更改用戶的shell
-l:爲用戶更名
-e:定義用戶的過時時間,格式YYYY-MM-DD
-f:指定用戶的非活動時間,密碼過時了但還未禁用的時間段
-L:鎖定用戶帳號,至關於禁用
-U:用於解鎖用戶帳號
chsh:改變用戶shell
chfn:修改用戶註釋信息
密碼管理:
passwd USERNAME
--stdin:從標準輸入讀取密碼。例:echo 「redhat」|passwd --stdin user3 直接將user3用戶密碼修改成redhat
-l:鎖定用戶帳號
-u:解鎖用戶
-n:密碼最短使用期限
-x:密碼最長使用期限
-w:警告時間
-i:非活動時間(密碼過時至用戶禁用之間的時間段)
-d:刪除用戶密碼
PAM:與密碼屬性相關
pwck:檢查用戶帳號完整性
組管理:
建立組:groupadd
-g:指定GID
-r:添加一個系統組
groupmod:修改組的相關屬性
-g GID
-n 修改組名
groupdel GRPNAME:刪除組
gpasswd GRPNAME:爲組加密碼
newgrp:登錄到一個新組,臨時切換一個新租,這時須要填入組密碼。若是從基本組切換到附加組是無需密碼的。使用exit退出切換組
chage:改變用戶密碼過時信息
-d:指定最近一次的修改時間
-E:用戶帳號的禁用時間
-I:非活動時間
-m:密碼最短使用期限
-M:密碼最長使用期限
-W:警告時長
權限管理:
r:
w:
x:
三類用戶:
u:屬主
g:屬組
o:其餘用戶
chown:改變文件屬主(只有管理員才能夠使用此命令)
# chown USERNAME file,...
-R:修改目錄及其內部文件的屬主
--reference=/path/to/somefile file,...:引用,參考,跟某個文件的屬主和屬組改成同樣
# chown USERNAME:GRPNAME file,... 改變某個文件的屬主和屬組
# chown USERNAME.GRPNAME file,... 改變某個文件的屬主和屬組
# chown :GRPNAME file,... 只改變屬組
chgrp:改變文件屬組(只有管理員才能夠使用此命令)
# chgrp GRPNAME file,...
-R:修改目錄及其內部文件的屬組
--reference=/path/to/somefile file,...:引用,參考,跟某個文件的屬組同樣
chmod:改變文件權限(只有管理員才能夠使用此命令)
修改三類用戶的權限:
chmod MODE(777) file,...
-R:遞歸修改成此權限
--reference=/path/to/somefile file,...
修改某類用戶或某些類用戶權限
u,g,o,a
chmod 用戶類別=MODE file,...
chmod u=rwx filename
chmod g=r,o=r filename
chmod go=r filename
修改某類的用戶某位或某些位權限
u,g,o,a
chmod 用戶類別+|-MODE file,...
chmod u-x filename
chmod u+x,g-x filename
chmod a+x filename 所有加執行權限
umask:遮罩碼,反向掩碼。
建立文件默認權限:666-umask
建立目錄默認權限:777-umask
文件默認不能具備執行權限,若是算得的結果中有執行權限,則將其權限加1
管理員umask=022,普通用戶umask=002
設置umask碼,就用umask 對應數字便可
站在用戶角度來說SHELL的類型:
登錄式shell:
正常經過某終端登錄的shell
su - USERNAME 徹底切換
su -l USERNAME
非登錄式shell:
su USERNAME 半切換
圖形終端下打開命令窗口
自動執行的shell腳本
bash的配置文件:
全局配置:編輯全局配置文件的任意一個對全部用戶都生效
/etc/profile, /etc/profile.d/*sh, /etc/bashrc
我的配置:編輯我的配置,只對我的用戶生效
~/.bash_profile, ~/.bashrc
做用範圍越小,越是最終生效的,所以我的配置設定優於全局配置。不少配置均遵循此法則
profile類的文件:
設定環境變量
運行命令或腳本:用戶登陸就執行的命令或腳本
bashrc類的文件:
設定本地變量
定義命令別名
登錄式shell如何讀取配置文件?
讀取過程:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登錄式shell如何讀取配置文件?
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
普通用戶設定的umask登出以後再登陸就恢復默認的,是由於須要在~/.bashrc中加載別名設置,設置好以後在下次登錄時生效。
bash:腳本解釋器
運算器+控制器=cpu
存儲器:RAM
輸入設備/輸出設備
程序:指令和數據
控制器:讀取指令
運算器:
存儲器:
地址總線:內存尋址
數據總線:傳輸數據
控制總線:控制指令
寄存器:CPU內部的暫時存儲器
I/O:硬盤,
程序
INPUT設備:
OUTPUT設備:
系統設定
默認輸出設備:標準輸出,STDOUT,1
默認輸入設備:標準輸入,STDIN,0
標準錯誤輸出:STDERR,2
標準輸入:鍵盤
標準輸出和錯誤輸出:顯示器
I/O重定向:
Linux:
輸出重定向:
>:覆蓋輸出
>>:追加輸出
set:設定某些功能開或關,set -C開啓此功能,set +C關閉此功能
-C:禁止對已存在文件使用覆蓋重定向
在>後面加|能夠在開啓-C功能時強制覆蓋輸出
+C:關閉上述功能
2>:重定向錯誤輸出
2>>:追加方式
例:ls /varr > /tmp/var3.out 2> /tmp/err.out 若是命令執行正確輸入至/tmp/var3.out若是錯誤輸出至/tmp/err.out
&>:重定向標準輸出或錯誤輸出至同一個文件
&>>:追加方式
<:輸入重定向
tr字符大小寫轉換命令舉例:
[root@localhost ~]# tr 'a-z' 'A-Z' 把輸入的字母都換成大寫,此命令會一直等待輸入,使用Ctrl+c終止
abc
ABC
sdf
SDF
klj
KLJ
[root@localhost ~]# tr 'a-z' 'A-Z' < /etc/fstab
而使用輸入重定向就會將後面的文件直接輸出到屏幕並進行字母轉換
#
# /ETC/FSTAB
# CREATED BY ANACONDA ON MON APR 23 11:38:02 2018
#
# ACCESSIBLE FILESYSTEMS, BY REFERENCE, ARE MAINTAINED UNDER '/DEV/DISK'
# SEE MAN PAGES FSTAB(5), FINDFS(8), MOUNT(8) AND/OR BLKID(8) FOR MORE INFO
#
UUID=A6A649BB-BDDE-4E9E-9548-C1E9C5E591E8 / EXT4 DEFAULTS 1 1
UUID=018F5971-2EEC-4C36-9D1A-1FFA87300F9B /BOOT EXT4 DEFAULTS 1 2
UUID=B3767047-E088-430B-B049-077F90080DD3 SWAP SWAP DEFAULTS 0 0
TMPFS /DEV/SHM TMPFS DEFAULTS 0 0
DEVPTS /DEV/PTS DEVPTS GID=5,MODE=620 0 0
SYSFS /SYS SYSFS DEFAULTS 0 0
PROC /PROC PROC DEFAULTS 0 0
<<:Here Document,在此處生成文檔
例:使用命令追加結束字符串,在輸入完畢後寫入此字符自動終止並輸出以前輸入的全部字符串。終止字符通常爲:EOF或END
[root@localhost ~]# cat << END
> The first line.
> The second line.
> END
The first line.
The second line.
例:建立了一個myfile.txt文件,並追加輸入了一些自定義內容再EOF結束。
[root@localhost ~]# cat >> /tmp/myfile.txt << EOF
> This is myfiles.
> This is my son.
> EOF
[root@localhost ~]# cat /tmp/myfile.txt 查看此文件是追加輸入的內容。
This is myfiles.
This is my son.
管道:前一個命令的輸出,看成後一個命令的輸入
命令1 | 命令2 | 命令3 | ...
例:
[root@localhost ~]# echo "hello world." | tr 'a-z' 'A-Z' 將標準的hello world換位大寫輸出
HELLO WORLD.
[root@localhost ~]# echo "redhat" | passwd --stdin hive 將echo輸出的字符做爲hive用戶的密碼設定
Changing password for user hive.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# cut -d: -f1 /etc/passwd | sort 將passwd文件的內容第一行進行字母排序
abrt
adm
apache
avahi-autoipd
bin
daemon
dbus
[root@localhost ~]# cut -d: -f3 /etc/passwd | sort -n 對passwd文件的第三列進行數字排序,sort -n爲數字排序
0
1
2
3
4
5
6
7
tee:從標準輸入讀取數據,而且發送至標準輸出和文件。一個輸入兩個輸出。
[root@localhost ~]# echo "hello world." | tee /tmp/hello.out
hello world.
[root@localhost ~]# cat /tmp/hello.out
hello world.
顯示文件行數:
[root@localhost ~]# wc -l /etc/passwd
33 /etc/passwd
只保留行數:
[root@localhost ~]# wc -l /etc/passwd | cut -d' ' -f1
33
查看文件的前面第一行
ls -l /usr/bin | head -1
total 108020
顯示文件的前兩行
[root@localhost ~]# ls -l /usr/bin | head -2
total 108020
-rwxr-xr-x. 1 root root 37000 Apr 17 2012 [
顯示總行數
[root@localhost ~]# ls -l /usr/bin | wc -l
1274
查出passwd文件中shell登錄信息,並sort -n去掉重複內容
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown
顯示出/var/log下的全部文件類型
[root@localhost ~]# file /var/log/*
/var/log/anaconda.ifcfg.log: ASCII text
/var/log/anaconda.log: ASCII C program text
/var/log/anaconda.program.log: ASCII English text, with very long lines, with overstriking
/var/log/anaconda.storage.log: ASCII C++ program text, with very long lines
/var/log/anaconda.syslog: ASCII English text, with very long lines
/var/log/anaconda.xlog: ASCII English text
/var/log/anaconda.yum.log: ASCII text
/var/log/audit: directory
/var/log/boot.log: ASCII English text, with CRLF, CR line terminators, with escape sequences
/var/log/btmp: empty
/var/log/btmp-20180503: data
取出inittab第6行並顯示出最後一行
[root@localhost ~]# head -6 /etc/inittab | tail -1
#
取出passwd文件的倒數第九行,先取出倒數的最後9行在head第一行就是倒數第九行
[root@localhost ~]# tail -9 /etc/passwd | head -1
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
從上面命令的基礎上再取出第1列和第7列並顯示屏幕和保存到/tmp/users文件中
[root@localhost ~]# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users
postfix:/sbin/nologin
[root@localhost ~]# cat /tmp/users
postfix:/sbin/nologin
統計/etc目錄下全部pa開頭的文件,此時必定要加-d,若是不加會將目錄下全部文件均統計進來,並非etc下的pa開頭文件
[root@localhost ~]# ls -d /etc/pa*|wc -l
5
文本查找的須要
grep,egrep,fgrep
grep:根據一個模式,搜索文本,並將符合模式的文本行顯示出來。
Pattern:文本字符和正則表達式的元字符組合而成匹配條件。
grep [options] PATTERN [FILE...]
-i:忽略字符大小寫
--color:匹配字符用顏色標記
-v:顯示沒有被模式匹配到的行
-o:只顯示被模式匹配到的字符串
例:[root@localhost ~]# grep 'root' /etc/passwd 查找出passwd文件中含有root字符的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
文件名通配:globbing
*:任意長度的任意字符
?:任意單個字符
[]:指定範圍內
[^]:指定範圍外,託字符
正則表達式:Regular EXPression,REGEXP
元字符:
.:匹配任意單個字符
[]:匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
如下內容並非匹配指定範圍內任意單個字符,所以使用如下匹配需在外面再加一層[]來使用
字符集合:
[:digit:] 數字
[:lower:] 小寫字母
[:upper:] 大寫字母
[:punct:] 標點符號
[:space:] 空白字符
[:alpha:] 全部字母
[:alnum:] 全部數字和字母
例:
[root@localhost ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
匹配次數(貪婪模式:儘量長的匹配):
*:匹配其前面的字符任意次
a,b,ab,aab,acb,adb,amnb
a*b:可匹配 b,ab,aab 任意次包括0次
a.*b:可匹配ab,aab,acb,adb,amnb a開頭b結尾
.*:任意長度的任意字符
\:轉意字符
\?:匹配其前面的字符1次或0次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{1,\}:至少1次
\{0,3\}:最多3次
位置錨定:
^:錨定行首,此字符後面的任意內容必須出如今行首
$:錨定行尾,此字符前面的任意內容必須出如今行尾
^$:空白行
\<或\b:錨定詞首,其後面的任意字符必須做爲單詞首部出現 例:grep 「\<root」 test2.txt 在test2文件中root詞首的字符
\>或\b:錨定詞尾,其前面的任意字符必須做爲單詞尾部出現 例:grep 「root\>」 test2.txt 在test2文件中root結尾的字符
分組:
\(\)
\(ab\)*:ab能夠出現0次1次或任意次
後向引用,後面能夠引用前面出現過的字符
\1:引用第1個左括號以及與之對應的右括號所包括的全部內容
\2:引用第2個左括號以及與之對應的右括號所包括的全部內容
\3:引用第3個左括號以及與之對應的右括號所包括的全部內容
例:grep '\(l..e\).*\1' test3.txt 前面匹配的是什麼後面就必須引用什麼,必須一致
[root@localhost etc]# grep '\([0-9]\).*\1$' /etc/fstab 前面出現過的數字結尾有引用1次的顯示出來
# Created by anaconda on Mon Apr 23 11:38:02 2018
UUID=a6a649bb-bdde-4e9e-9548-c1e9c5e591e8 / ext4 defaults 1 1
UUID=018f5971-2eec-4c36-9d1a-1ffa87300f9b /boot ext4 defaults 1 2
UUID=b3767047-e088-430b-b049-077f90080dd3 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
REGEXP:REGular EXPression
Pattern:
正則表達式:
Basic REGEXP:基本正則表達式
Extended REGEXP:擴展正則表達式
基本正則表達式:
.:任意單個字符
[]:指定範圍內的任意單個字符
[^]:指定範圍外的任意單個字符
次數匹配:
*:任意次
\?:匹配其前面的字符0或1次
\{m,n\}:匹配其前面的字符至少M次之多N次
.*:任意長度的任意字符
錨定:
^:錨定行首
$:錨定行尾
\<,\b:錨定詞首
\>,\b:錨定詞尾
\(\):分組
\1,\2,\3,...
grep:使用基本正則表達式定義的模式來過濾文本的命令
-i:忽略大小寫
-v:反向匹配
-o:只顯示匹配到的字符串
--color:匹配字符用顏色標記
-E:使用擴展的正則表達式
-A N:顯示匹配行以及其後面的N行
-B N:顯示匹配行以及其前面的N行
-C N:顯示匹配行以及其先後面各N行
擴展的正則表達式:
字符匹配:
.:任意單個字符
[]:指定範圍內的任意單個字符
[^]:指定範圍外的任意單個字符
次數匹配:
*:任意次
?:匹配其前面的字符0或1次
+:匹配其前面的字符至少1次
{m,n}:匹配其前面的字符至少M次之多N次
錨定字符:
^:錨定行首
$:錨定行尾
\<,\b:錨定詞首
\>,\b:錨定詞尾
分組:擴展正則表達式真正實現了分組
():分組
\1,\2,\3,...
或者:
|:或者 or的意思。例:a|b 表示a或者b
C|cat:表示C或cat,匹配的是首字母
(C|c)at:表示Cat或cat,分組使用
grep -E = egrep 使用egrep直接支持擴展正則表達式
匹配IP地址:ifconfig | egrep -o '\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
或者改成簡寫的:ifconfig | egrep --color -o '(\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
IPv4:
分5類:A B C D E
A:1-127
B:128-191
C:192-223
準確找出IP地址:
ifconfig | egrep --color -o '(\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3]\>)(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'
grep,egrep,fgrep :grep在搜索過程當中會大量的消耗CPU使用週期,至關消耗時間。
fgrep:fast grep 快速grep,不支持正則表達式,任何結果都被匹配爲原生字符。
shell 編程:
bash:進程變量,進程結束變量就結束
編譯器:解釋器
編程語言:機器語言、彙編語言、高級語言
編程能力:
腳本編程
靜態語言:編譯型語言
強類型(變量)
事先轉換成可執行格式
C、C++、JAVA、C#
解釋器通常均爲靜態語言開發
動態語言:解釋型語言,on the fly,須要腳本解釋器,例如:bash
弱類型:
邊解釋邊執行
ASP、ASP.NET、PHP、SHELL、python、perl
面向過程:Shell,C
面向對象:JAVA,python,perl,C++
變量:內存空間,命令內存空間
內存:編址的存儲單元
進程:指令和數據都在內存中,存取過程就須要變量
變量名稱:
一、只能包含字母、數字、下劃線,而且不能數字開頭;
二、不該該跟系統中已有的環境變量重名;
三、最好作到見名知義;
變量類型:事先肯定數據的存儲格式和長度
字符型
數值型
整型:整數
浮點型:帶小數點的
真、假型:
邏輯:
邏輯運算:與、或、非、異或
1:真
0:假
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1
與:
只有二者爲真才得真,只要有一者爲假均爲假
或:
只要有一個爲真就爲真,結果必定爲真
非:
!真 = 假
!假 = 真
異或:
操做數相同則爲0,不然爲1
1和1異或得0
0和0異或得0
整型,8bit:256
0-255,溢出 超出預先設定好的變量閾值,避免溢出與變量閾值進行對比,超出拒絕
shell:弱類型編程語言
強:變量在使用前,必須事先聲明,甚至還須要初始化;
NULL:空
弱:變量用時聲明,甚至不區分類型;
隱式轉換:換算爲ASCII碼進行運算
顯式轉換:指定爲轉換爲某種格式
11+c=
變量賦值:VAR_NAME=VALUE
bash變量類型:
環境變量
本地變量(局部變量)
位置變量
特殊變量
引用變量:${VARNAME},括號能夠省略;變量名稱後加內容的狀況下產生混淆的變量須要將變量名稱用花括號括起來使用
本地變量:
本地:VARNAME=VALUE:做用域:整個bash進程
局部:local VARNAME=VALUE 做用域爲當前代碼段
環境變量:做用域爲當前shell進程及其子進程;
export VARNAME=VALUE
先VARNAME=VALUE再export VARNAME也能夠
「導出」
腳本在執行時會啓動一個子shell進程;
命令行中啓動的腳本會繼承當前shell環境變量
系統自動執行腳本(非命令行啓動)就須要自我定義須要各環境變量
位置變量:
$1,$2,...
特殊變量:
$?:上一個命令的執行狀態返回值
程序執行後,會產生兩類返回值:
程序執行結果
程序狀態返回代碼:(0-255)
0:正確執行
1-255:錯誤執行,1,2,127系統預留;其他可自定義
輸出重定向:
>:覆蓋重定向
>>:追加劇定向
2>:錯誤重定向
2>>:錯誤追加劇定向
&>:同時重定向
/dev/null:軟件設備(模擬設備),bit bucket 位同 ,數據黑洞
撤銷變量:
unset VARNAME 無需加$符,撤銷變量裏的值才須要加$
查看當前shell中的變量:
set (環境變量和本地變量)
查看環境變量:
printenv
env
export
變量值增長:
[root@localhost ~]# ANIMALS=pig 設置一個值爲pig的ANIMALS的變量
[root@localhost ~]# ANIMALS=$ANIMALS:goat 增長一個goat值
[root@localhost ~]# echo $ANIMALS 增長成功
pig:goat
[root@localhost ~]# ANIMALS=$ANIMALS:sheep 再增長一個sheep值
[root@localhost ~]# echo $ANIMALS 增長成功
pig:goat:sheep
腳本:命令的堆砌,按照實際須要,結合命令流程控制機制實現的源程序
腳本的第一行必須是shebang:魔數;若是不寫這行腳本會被認成ASCII碼
#!/bin/bash
# 註釋行;不執行,標註
若是不給腳本執行權限,能夠指定某個腳本解釋器來執行
bash first.sh 也能夠不賦權執行腳本
練習:
useradd user1
echo "user1" | passwd --stdin user1 &> /dev/null
echo "Add user1 successfully."
條件判斷:
若是用戶不存在
添加用戶,給密碼並顯示添加成功;
不然
顯示若是已經存在,沒有添加;
bash中如何實現條件判斷?
條件判斷類型:
一、整數測試:數值之間的對比
二、字符測試:字符串對比是否正確
三、文件測試:判斷文件是否存在等
條件測試的表達式:expression表達式
[ expression ]
[[ expression]]
test expression
整數比較:
-eq:等值比較,測試兩個整數是否相等,好比 $A -eq $B
-ne:不等值比較,測試兩個整數是否不等,不等,爲真;相等,爲假;
-gt:測試一個數是否大於另外一個數;大於,爲真;不然爲假;
-lt:測試一個數是否小於另外一個數;小於,爲真;不然爲假;
-ge:大於或等於
-le:小於或等於
命令間的邏輯關係:
邏輯與:&& 其中一個爲假結果爲假
第一個條件爲假時,第二條件不用判斷,最終結果已有
第一個條件爲真時,第二條件必須得判斷
邏輯或:|| 其中一個爲真結果爲真
第一個條件爲假時,第二條件必須判斷
第一個條件爲真時,第二條件不用判斷
例:若是用戶存在,就顯示用戶已存在;不然,就添加此用戶;
id user1 && echo "user1 exists." || useradd user1
若是用戶不存在,就添加;不然,顯示其已經存在;
! id user1 && useradd user1 || echo "user1 exists."
若是用戶不存在,添加而且給密碼;不然,顯示其已經存在;
! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."
例:添加3個用戶user1..3,但要先判斷用戶是否已存在,不存在然後再添加,最後顯示系統共有多少用戶
[root@localhost ~]# cat adduser.sh
#!/bin/bash
! id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &> /dev/null || echo "echo user1 exists."
! id user2 &> /dev/null && useradd user2 && echo "user2" | passwd --stdin user2 &> /dev/null || echo "echo user2 exists."
! id user3 &> /dev/null && useradd user3 && echo "user3" | passwd --stdin user3 &> /dev/null || echo "echo user3 exists."
USERS=`wc -l /etc/passwd | cut -d: -f1`
echo "$USERS users."
條件判斷,控制結構:
單分支的if語句
if 判斷條件; then
statement1
statement2
...
fi
雙分支的if語句
if 判斷條件; then
statement1
statement2
...
else
statement3
statement4
...
fi
多分支的if語句
if 判斷條件1; then
statement1
...
elif 判斷條件2; then
statement2
...
elif 判斷條件3; then
statement3
...
else
statement4
...
fi
例:若是用戶存在則輸出用戶存在字樣,不然建立並配置密碼輸出用戶添加完成
[root@localhost ~]# cat usertest.sh
#!/bin/bash
#
NAME=user17
if id $NAME &> /dev/null; then
echo "$NAME exist."
else
useradd $NAME
echo $NAME | passwd --stdin $NAME &> /dev/null
echo "Add $NAME finished"
fi
[root@localhost ~]# ./usertest.sh
Add user17 finished
[root@localhost ~]# ./usertest.sh
user17 exist.
練習:寫一個腳本
判斷當前系統上是否有用戶的默認shell爲bash;
若是有,就顯示有多少個這類用戶;不然就顯示沒有這類用戶;
#!/bin/bash
#
grep "bash$" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then
USERS=`grep "\<bash$" /etc/passwd |wc -l`
echo "The shells of $USERS users is bash."
else
echo "NO such user."
fi
提示:「引用」一個命令的執行結果,要使用命令引用;好比:RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;
使用一個命令的執行狀態結果,要直接執行此命令,必定不能引用;好比:if id user1 一居中的id命令就必定不能加引號;
若是想把一個命令的執行結果賦值給某變量,要使用命令引用,好比USERID=`id -u uder1`; 若是想把一個命令的執行狀態結果保存下來,並做爲命令執行成功與否的判斷條件,則須要先執行命令,然後引用其狀態結果,如:
id -u user1
RETVAL=$?
此句絕對不能夠寫爲RETVAL=`id -u user1`;
[root@localhost ~]# cat bash2.sh
#!/bin/bash
#
grep "bash$" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then
AUSER=`grep "\<bash$" /etc/passwd |head -1|cut -d: -f1`
echo "$AUSER is one of such users."
else
echo "NO such user."
腳本:給定一個用戶,判斷其UID和GID是否同樣,若是同樣,就顯示此用戶爲「good guy」;不然就顯示此用戶爲「bad guy」
#!/bin/bash
#
USERNAME=user1
USERID=`id -u $USERNAME`
GROUPID=`id -g $USERNAME`
if [ $USERID -eq $GROUPID ];then
echo "Good guy"
else
echo "Bad guy."
fi
腳本:給定一個用戶,獲取其密碼警告期限;然後判斷用戶最近一次修改密碼時間距其最長使用期限是否已經小於警告期限;
提示:算術運算的方法$[$A-$B];表示變量A的值減去變量B的值的結果;
若是小於,則顯示「Warning」;不然,就顯示「OK」。
腳本:斷定命令歷史中歷史命令的總條目是否大於1000;若是大於,則顯示「Some command will gone.」;不然顯示「OK」。
#!/bin/bash
#
HISTORY=`history | tail -l |cut -d' ' -f2`
if [ $HISTORY -gt 1000];then
echo "Some command will gone."
else
echo "OK"
fi
shell中如何進行算術運算:
一、let 算術運算表達式
let C=$A+$B
二、$[算術運算表達式]
C=$[$A+$B]
三、$((算術運算表達式))
C=$(($A+$B))
四、expr 算術運算表達式,表達式中各操做數及運算符之間要有空格,並且要使用命令引用
C=`expr $A + $B`
前三種最爲常見
圓整:丟棄小數點後的全部內容
腳本:當前用戶的密碼是否已經小於警告期限
[root@localhost ~]# vi passwdtime.sh
You have new mail in /var/spool/mail/root
[root@localhost ~]# cat passwdtime.sh
#!/bin/bash
#
W=`grep "student" /etc/shadow | cut -d: -f6` #取出Worning的時長
S=`date +%s` #取得1970年至此刻通過的秒數
T=`expr $S/86400` #計算到今天的時長
L=`grep "^student" /etc/shadow | cut -d: -f5` #密碼最長使用期限
N=`grep "^student" /etc/shadow | cut -d: -f3` #最近一次修改密碼的時間
SY=$[$L-$[$T-$N]] #計算剩餘時間
if [ $SY -lt $W ]; then #用使用時間與Worning時間比較
echo 'Worning'
else
echo 'OK'
fi
[root@localhost ~]# TIMESTAMP=`date +%s` 獲取1970年到當前的天數
[root@localhost ~]# let USEDAYS=$TIMESTAMP/86400 計算今天的時間是 除以86400
[root@localhost ~]# echo $USEDAYS 輸出到今天的使用期限
17667
exit:退出腳本。某個步驟結果得出後無需後面的執行則使用exit退出腳本
例:不適用id命令斷定user1用戶的userID和groupID是否一致。
[root@localhost ~]# cat testID.sh
#!/bin/bash
#
USERNAME=user1
if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then #找到用戶是否存在於系統,!爲假,返回真結果的反義
echo "No such user:$USERNAME."
exit 1 #若是沒有此用戶能夠直接退出腳本,1爲錯誤代碼,0爲正確1-255均爲錯誤
fi
USERID=`grep "^$USERNAME\>" /etc/passwd |cut -d: -f3`
GROUPID=`grep "^$USERNAME\>" /etc/passwd |cut -d: -f4`
if [ $USERID -eq $GROUPID ]; then
echo "Good guy."
else
echo "Bad guy."
fi
bash中經常使用的條件測試有三種:
測試方法:
[ expression ]
[[ expression ]]
test expression
整數測試:
-gt:測試一個數是否大於另外一個數;大於,爲真;不然爲假;
-le:小於或等於
-ne:不等值比較,測試兩個整數是否不等,不等,爲真;相等,爲假;
-eq:等值比較,測試兩個整數是否相等,好比
-ge:大於或等於
-lt:測試一個數是否小於另外一個數;小於,爲真;不然爲假;
INT1=63
INT2=77
[ $INT1 -eq $INT2 ]
[[ $INT1 -eq $INT2 ]]
test $INT1 -eq $INT2
文件測試:
-e FILE:測試文件是否存在
-f FILE:測試文件是否爲普通文件
-d FILE:測試指定路徑是否爲目錄
-r FILE:測試當前用戶對指定文件是否有讀權限
-w FILE:測試當前用戶對指定文件是否有寫權限
-x FILE:測試當前用戶對指定文件是否有執行權限
[ -e /etc/inittab ] 測試文件是否存在
[ ! -e /etc/inittab ] 測試文件不存在,加!取反義
[ -x /etc/inittab ] 測試當前用戶對此文件是否有執行權
文件是否存在腳本:
[root@localhost ~]# cat filetest.sh
#!/bin/bash
#
FILE=/etc/inittab
if [ -e $FILE ]; then
echo "OK"
else
echo "No such file."
fi
腳本是否有語法錯誤:
bash -n filetest.sh
bash -x 腳本:單步執行
[root@localhost ~]# bash -x filetest.sh
+ FILE=/etc/inittab
+ '[' -e /etc/inittab ']'
+ echo OK
OK
練習:
腳本:給定一個文件,若是是普通文件,就顯示普通文件,若是是目錄,也顯示目錄,不然,此爲沒法識別文件;
[root@localhost ~]# cat filetest2.sh
#!/bin/bash
#
FILE=/etc/rc.d/rc.sysinit
if [ ! -e $FILE ]; then
echo "No such file."
exit 6
fi
if [ -f $FILE ]; then
echo "Common file."
elif [ -d $FILE ]; then
echo "Directory."
else
echo "Unknown."
fi
定義腳本退出狀態碼
exit:退出腳本。
exit #
若是腳本沒有明肯定義退出狀態碼,那麼,最後執行的一條命令的退出碼即爲腳本的退出狀態碼。
bash變量的類型:
本地變量(局部變量) 做用域當前shell進程
環境變量 做用域爲當前shell進程及其子進程;
位置變量:
$1,$2,...
shift(輪換,替換)把$1剔除,$2變爲$1
例:
[root@localhost ~]# cat shift.sh
#!/bin/bash
#
echo $1
shift
echo $1
shift
echo $1
[root@localhost ~]# ./shift.sh 1 2 3
1
2
3
例:
./filetest.sh中 /etc/fstab /etc/inittab
$1表示 /etc/fstab
$2表示 /etc/inittab
特殊變量
$?:上一條名令的退出狀態碼
$#:參數的個數
$*:參數列表
$@:參數列表
腳本:能接受一個參數(文件路徑),斷定:此參數若是是一個存在的文件,就顯示「OK」;不然就顯示「No such file.」
[root@localhost ~]# cat filetest3.sh
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "Usage:./filetest3.sh ARG1 [ARG2 ...]"
exit 7
fi
if [ -e $1 ]; then
echo "OK."
else
echo "No such file."
fi
練習:腳本
給腳本傳遞兩個參數(整數);顯示此二者之和,之積
[root@localhost ~]# cat calc.sh
#!/bin/bash
#
if [ $# -lt 2 ];then
echo "Usage: cacl.sh ARG1 ARG2"
exit 8
fi
echo "The sum is:$[$1+$2]."
echo "The prod is:$[$1*$2]."
結果:
[root@localhost ~]# ./calc.sh 2 5
The sum is:7.
The prod is:10.
grep,sed(流編輯器),awk
sed基本用法:
sed:Stream EDitor;
行編輯器(全屏編輯器:vi)
sed:模式空間,內嵌模式條件,模式匹配-->處理-->輸出顯示。
默認不編輯原文件,僅對模式空間中的數據作處理;然後,處理結束後,將模式空間打印至屏幕;
sed處理流程:sed將文本文件的每一行讀進模式空間與模式條件進行匹配,匹配後用其編輯命令進行編輯並顯示出來
sed命令使用格式:
sed [options] 'AddressCommand' file ... 對file中的某些行(Address)進行編輯處理
-n:靜默模式。再也不默認顯示模式空間中的內容
-i:直接修改原文件,危險操做
-e SCRIPT -e SCRIPT:能夠同時執行多個腳本
-f /PATH/TO/SED_SCRIPT:將多個執行腳本的一行保存至此文件中
sed -f /path/to/scripts file
-r:表示使用擴展正則表達式
Address:
一、StartLine,EndLine
好比:1,100表示1-100行
$:最後一行
$-1:倒數第二行
二、/RegExp/
好比:/^root/ 使用正則表達式表示行,root開頭的行
三、/pattern1/,/pattern2/
第一次被模式1匹配到的行開始至第一次被模式2匹配到的行結束
四、LineNumber
指定的行
五、StartLine,+N
從指定行開始,向後的N行;
Command:
d:刪除符合條件的行;
例:sed '1,2d' /etc/fstab 刪除fstab文件的前兩行
sed '3,$d' /etc/fstab 刪除fstab文件的第三行到最後一行
sed '/oot/d' /etc/fstab 刪除fstab文件中含有oot字符的行
sed '1,+2d' /etc/fstab 刪除fstab文件的第1行向後2行,共刪除3行
p:顯示符合條件的行;
例:sed -n '/^\//p' /etc/fstab 符合條件的顯示出兩行,沒符合的顯示一次,加-n不顯示空間模式的內容,只顯示符合條件內容
a \string:在指定的行後面追加新行,內容爲「string」
例:sed '/^\//a \# hello world' /etc/fstab 在/開頭的行後面追加一行# hello world
sed '/^\//a \# hello world\n hello,linux' /etc/fstab 在/開頭的行後面追加兩行內容,\n爲換行符
i \string:在指定的行前面追加新行,內容爲「string」
例:sed '/^\//i \# hello world' /etc/fstab 在/開頭的行前面追加一行# hello world
r FILENAME:將指定的文件的內容添加至符合條件的行處
例:sed '2r /etc/issue' /etc/fstab 將issue文件內容加入到fstab中的第二行開始顯示
sed '1,2r /etc/issue' /etc/fstab 將issue文件內容加入到fstab中的第1行和第2行都顯示
w FILENAME:將地址指定範圍內的內容另存至指定的文件中;
例:sed '/oot/w /tmp/oot.txt' /etc/fstab 將fstab文件中含有oot字符的行保存至/tmp/oot.txt文件中
s/pattern/string/:查找並替換,默認只替換每行中第一次被匹配到的字符串;查找內容pattern能夠使用正則表達式元字符,替換內容string不能夠;
加修飾符改變默認匹配模式
g:全局替換
i:查找時忽略字符大小寫
例:sed 's/oot/OOT/' /etc/fstab 將fstab下oot的字符所有替換爲大寫的OOT
sed 's/\//#/' /etc/fstab 將文件中含有/的所有替換爲# 默認只匹配了每一行第一次匹配到的字符串一行中有兩個/的第二次的字符串未被匹配替換。
sed 's/\//#/g' /etc/fstab 後面加g將全文中的/所有替換爲#
s///將/作分隔符,也能夠爲s###以#爲分隔符,也能夠s@@@以@爲分隔符
例:sed 's#oot#OOT#' /etc/fstab
sed 's@oot@OOT@' /etc/fstab
練習:
l..e:like-->liker
love-->lover
sed 's#l..e#&r#g' sed.txt 由於後面替換內容沒法使用正則表達式,所以使用&字符表示匹配到的內容
sed 's#\(l..e\)#\1r#g' sed.txt 也能夠寫爲此方式,表示將前面括號內容定義爲1次匹配進行添加,後向引用
將l換爲L:
sed 's#l#L#g' sed.txt
sed 's#l\(..e\)#L\1#g' sed.txt
history |sed 's#^[[:space:]]*##g' 將history前面不管多少空格所有替換爲空
sed練習:
一、刪除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:space:]]+@@g' /etc/grub.conf
二、替換/etc/inittab文件中「id:3:initdefault:」一行中的數字爲5:;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
三、刪除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
四、刪除/etc/inittab文件中開頭的#號;
sed 's@^#@@g' /etc/inittab
五、刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
六、刪除某文件中以空白字符後面跟#類的航中的開頭的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
七、取出一個文件路徑的目錄名稱;
echo "/etc/rc.d/"|sed -r 's@^(/.*/)[^/]+/?@\1@g'
基名:
字符測試:
==:測試是否至關,至關爲真,不等爲假
!= :測試是否不等,不等爲真,等則爲假
>:
<:
-n string:測試指定字符串是否爲空,空則真,不空則假
-z string:測試指定字符串是否不空,不空爲真,空則爲假
例:取用戶的userID和groupID是否同樣
#!/bin/bash
#
if [ `id -n -u $1` == `id -n -g $1` ]; then
echo "Yiyang"
else
echo "Bu Yiyang"
fi
例:傳遞個參數,按照q、Q、Quit、quit即使退出不然輸出用戶參數
[root@localhost ~]# cat testid.sh
#!/bin/bash
#
if [ $1 = 'q' ]; then
echo "Quiting..."
exit 1
elif [ $1 = 'Q' ];then
echo "Quiting..."
exit 2
elif [ $1 = 'quit' ];then
echo "Quiting..."
exit 3
elif [ $1 = 'Quit' ];then
echo "Quiting..."
exit 4
else
echo $1
fi
例:傳遞三個參數給腳本,第一個爲整數,第二個爲算術運算符,第三個爲整數,將計算結果顯示出來,要求保留兩位精度。如:./calc.sh 5 / 2
[root@localhost ~]# cat calc1.sh
#!/bin/bash
#
echo "scale=2;$1$2$3;" | bc
[root@localhost ~]# ./calc1.sh 5 / 2
2.50
計算方式,精度計算.scale=2爲精度計算方式,;號爲命令分隔符
echo "scale=2;111/22;" | bc
或者:
bc <<< "scale=2;111/22;"
循環:進入條件,退出條件
一、for循環
二、while循環
三、until循環
for 變量 in 列表
do
循環體
done
for I in 1 2 3 4 5 6 7 8 9 10; do
加法運算
done
當列表被遍歷完成以後退出;
如何生成列表:
{1..100}
seq:數值序列,指定數字範圍
使用方法:
seq 起始數 步進長度 結束數
[root@localhost ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# seq 5 10
5
6
7
8
9
10
[root@localhost ~]# seq 2 2 10
2
4
6
8
10
[root@localhost ~]# seq 1 2 10
1
3
5
7
9
declare -i SUM=0 將一個變量聲明爲整數
integer
-x:將一個變量聲明爲環境變量
例:1循環加一直加到100結果是多少?
[root@localhost ~]# cat sum.sh
#!/bin/bash
#
declare -i SUM=0
for I in {1..100}; do
let SUM=$[$SUM+$I]
done
echo "The sum is: $SUM."
[root@localhost ~]# ./sum.sh
The sum is: 5050.
例:取出每個用戶,向用戶問候Hello
[root@localhost ~]# LINES=`wc -l /etc/passwd|cut -d' ' -f1`
[root@localhost ~]# for I in `seq 1 $LINES`; do echo "Hello `head -n $I /etc/passwd|tail -1|cut -d: -f1`"; done
Hello root
Hello bin
Hello daemon
Hello adm
Hello lp
Hello sync
Hello shutdown
Hello halt
Hello mail
Hello uucp
Hello operator
Hello games
Hello gopher
Hello ftp
取模,取餘:%
3%2=1
100%55=45
vim編輯器:
文本編輯器,字處理器
ASCII
nano,sed
vi:Visual Interface 可視化接口,體積小,但功能強大
vim:VI iMproved vi的加強版,在vi基礎上增長了加強功能的插件
全屏編輯器,模式化編輯器
vim模式:
編輯模式(命令模式)
輸入模式
末行模式
模式轉換:
編輯-->輸入:
i:在當前光標所在字符的前面,轉爲輸入模式;
a:在當前光標所在字符的後面,轉爲輸入模式;
o:在當前光標所在行的下方,新建一行,並轉爲輸入模式;
I:在當前光標所在行的行首,轉換爲輸入模式;
A:在當前光標所在行的行尾,轉換爲輸入模式;
O:在當前光標所在行的上方,新建一行,並轉爲輸入模式;
輸入-->編輯:
ESC鍵:輸入返回編輯模式
編輯-->末行:
:(冒號)既能夠轉爲末行模式,末行模式須要輸入命令
:10d 刪除第10行
:10,20d 刪除10至20行
:set nu 顯示行號
末行-->編輯:
ESC鍵
某些狀況下需敲兩次ESC切換模式
1、打開文件
#vim /path/to/somefile
vim +N行號 file:打開文件時定位於第N行
vim + file:打開文件定位於最後一行
vim +/pattern:打開文件,定位至第一次被pattern匹配到的行行首
默認打開文件時處於編輯模式
2、關閉文件
一、末行模式關閉文件
w:保存
w!:強行保存,只有管理員有此權限
q:不保存退出
wq或x:保存並退出
q!:不保存強行退出
二、編輯模式下退出
ZZ:大寫模式敲兩次ZZ直接保存退出
3、移動光標
一、逐字符移動:
h:向左,前加數字N表示向左移動N位
l:向右,前加數字N表示向右移動N位
j:向下,前加數字N表示向下移動N位
k:向上,前加數字N表示向上移動N位
二、以單詞爲單位移動:
w:移至下一個單詞的詞首,前加數字表示移動移至下N個單詞詞首
e:跳至當前或下一個單詞詞尾,前加數字表示移動移至下N個單詞詞尾
b:跳至當前或前一個單詞詞首,前加數字表示移動移至前N個單詞詞首
三、行內跳轉:
0或^:表示跳到行首,0跳到絕對行首,^行首的第一個非空白字符
$:表示跳到行尾,$絕對行尾;
四、行間跳轉:
#G:直接跳轉至第#行;
G:最後一行
末行模式下,直接給出行號回車便可
4、翻屏
Ctrl+f:向下翻一屏
Ctrl+b:向上翻一屏
Ctrl+d:向下翻半屏
Ctrl+u:向上翻半屏
5、刪除單個字符
x:刪除光標所在處的單個字符,在x前加數字可連續刪除N個字符
6、刪除命令:d
d命令跟跳轉命令組合使用
d$:光標所在處到行尾所有刪除
d^或d0:光標所在處到行首所有刪除
dw:光標所在處的單詞刪除
#d跳轉符:刪除跳轉符的#個,一般使用#dw、#de、#db
dd:刪除當前光標所在行
#dd:刪除包括光標所在行在內的#行
末行模式下:
起始行,終止行d
.:表示當前行
$:最後一行
+#:向下的#行
$-10 表示倒數第10行,
例:
:.,$-3d 表示從光標所在行刪除到倒數第三行
:1,8d 表示刪除第1行到第8行
:.,+5d 表示從光標所在行向下再刪除5行
:.,100d 表示當前行到第100行刪除
vim所刪除的內容不會當即被清空,可實現找回,還可實現剪切
7、粘貼命令:p
P:大寫P,若是刪除或複製爲整行內容,則粘貼至光標所在行的下方,若是複製或刪除的內容爲非整行,不然粘貼至光標所在字符的後面
p:小寫p,若是刪除或複製爲整行內容,則粘貼至光標所在行的上方,若是複製或刪除的內容爲非整行,不然粘貼至光標所在字符的前面
8、複製命令:y
用法同d命令
yy:複製一行
#yy:複製#行
9、修改:先刪除內容再轉回爲輸入模式:
c:用法同d命令
cc:刪除某行並轉換爲輸入模式
c$:在光標所在處至行尾刪除,並轉換爲輸入模式
10、替換:r
替換單個字符:r+替換字符
R:替換模式,直接敲擊內容輸入並將現有內容替換
11、撤銷編輯操做:u
u:撤銷前一次的編輯操做,連續u能夠連續撤銷此前的n次操做,默認最多撤銷前50次的操做
#u:直接撤銷#次編輯操做
還原最近一次撤銷操做:Ctrl+r
12、重複前一次的編輯操做:.
.:直接摁點可重複上次操做
十3、可視化模式:VISUAL
v或V都可進入可視化模式
v:按字符選取
V:按矩形選取
十4、查找:
/PATTERN:從文件首部到尾部查找某PATTERN
?PATTERN:從光標所在位置向文件首部查找
n:下一個匹配到的內容
N:上一個匹配到的內容
十5、查找並替換
在末行模式下
起始地址,終止地址s/PATTERN/PATTERN/g 全局替換
起始地址,終止地址s/PATTERN/PATTERN/i 忽略大小寫
例:
:.,$-1s/he/HE/g 替換當前行到倒數第2行的he替換爲HE,在範圍內全局替換
%:表示全文範圍
練習:將/etc/yum.repos.d/server.repo文件中的ftp://instructor.example.com/pub替換爲http://172.16.0.1/yum
:%s/ftp:\/\/instructor\.example\.com\/pub/http:\/\/172.16.0.1\/yum/g
:%s@ftp:\/\/instructor\.example\.com\/pub@http://172.16.0.1/yum@g
十6、使用vim編輯多個文件
vim file1 file2 默認打開爲第一個文件
切換第二個文件在末行模式下
:next 切換至下一個文件
:prev 切換至前一個文件
:last 切換至最後一個文件
:first 切換至第一個文件
:qa 所有退出,只輸入q只退出當前文件
十7、分屏顯示一個文件:
Ctrl+w,鬆開w再摁s鍵 :水平拆分窗口
Ctrl+w,鬆開再摁v鍵 :垂直拆分窗口
在窗口間切換光標:
Ctrl+w,上下箭頭ARROW鍵
:qa 所有退出,只輸入q只退出當前窗口
十8、分窗口編輯多個文件
vim -o :水平分割顯示
vim -O :垂直分割顯示
十9、將當前文件的部份內容另存爲另外一個文件
末行模式下使用w命令
:w 保存
:ADDR1,ADDR2w /path/to/somewhere
二10、將另一個文件內容填充在當前文件中
:r /path/to/somefile
二11、與shell交互
:! COMMAND
二12、高級話題
一、顯示或取消顯示行號
:set number
:set nu 也可簡寫
取消顯示
:set nonu
二、顯示忽略或區分字符大小寫
:set ignorecase
:set ic
取消忽略大小寫
:set noic
三、設定自動縮進
:set autoindent
:set ai
取消自動縮進
:set noai
四、查找到的文本高亮顯示
:set hlsearch
取消高亮顯示
:set nohlsearch
五、語法高亮
:syntax on
取消語法高亮
:syntax off
二十3、vim配置文件
全局:/etc/vimrc
當前用戶:~/.vimrc
vim命令學習導航vimtutor命令
練習:
一、添加10個用戶user1到user10,密碼同用戶名,但要求只有用戶不存在的狀況下才能添加;
[root@localhost ~]# cat adduser1.sh
#!/bin/bash
#
for i in {1..10}; do
if id user$i &> /dev/null; then
echo "user$i exists."
else
useradd user$i
echo user$i |psasswd --stdin user$i &> /dev/null
echo "Add user user$i finished."
fi
done
二、刪除10個用戶
[root@localhost ~]# cat deluser.sh
#!/bin/bash
#
for i in {1..10}; do
if id user$i &>/dev/null;then
userdel -r user$i
echo "Delete user$i finished"
else
echo "user$i not exist."
fi
done
三、用戶給的參數是add就添加10個用戶,若是給的是del就刪除10個用戶,其餘則退出
[root@localhost ~]# cat adminusers.sh
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "Usage:adminusers ARG"
exit 7
fi
if [ $1 == 'add' ]; then
for i in {1..10}; do
if id user$i &> /dev/null;then
echo "user$i exists."
else
useradd user$i
echo user$i | passwd --stdin user$i &> /dev/null
echo "Add user$i finished."
fi
done
elif [ $1 == 'del' ]; then
for i in {1..10}; do
if id user$i &> /dev/null;then
userdel -r user$i
echo "Delete user$i finished."
else
echo "No user$i."
fi
done
else
echo "Unkown ARG"
exit 8
fi
四、adminusers user1,user2,user3,hello,hi 用adminusers當命令 後面加一堆用戶名參數
[root@localhost ~]# cat adminusers2.sh
#!/bin/bash
#
echo $1
for i in `echo $1 |sed 's/,/ /g'`; do
if id $i &> /dev/null;then
echo "$i exists."
else
useradd $i
echo $i |passwd --stdin $i &> /dev/null
echo "add $i finished."
fi
done
執行結果:
[root@localhost ~]# ./adminusers2.sh user1,user2,hi,hello
user1,user2,hi,hello
user1 exists.
user2 exists.
add hi finished.
add hello finished.
若是加--add添加這些用戶,若是加--del選項刪除這些用戶
[root@localhost ~]# cat adminusers2.sh
#!/bin/bash
#
if [ $1 == '--add' ]; then
for i in `echo $2 |sed 's/,/ /g'`; do
if id $i &> /dev/null;then
echo "$i exists."
else
useradd $i
echo $i |passwd --stdin $i &> /dev/null
echo "add $i finished."
fi
done
elif [ $1 == '--del' ]; then
for i in `echo $2 |sed 's/,/ /g'`; do
if id $i &> /dev/null;then
userdel -r $i
echo "Delete $i finished."
else
echo "$i NOT exist."
fi
done
else
echo "Unkown options."
fi
測試:
整數測試
-le:小於或等於
-lt:測試一個數是否小於另外一個數;小於,爲真;不然爲假;
-ge:大於或等於
-gt:測試一個數是否大於另外一個數;大於,爲真;不然爲假;
-eq:等值比較,測試兩個整數是否相等,好比
-ne:不等值比較,測試兩個整數是否不等,不等,爲真;相等,爲假;
字符測試
==
!=
>
<
-n
-z
文件測試
-e
-f
-d
-r
-w
-x
if [ $# -gt 1 ]; then
組合測試條件
-a:與關係
-o:或關係
!:非關係
if [ $# -gt 1 -a $# -le 3 ]; then
if [ $# -gt 1 ] && [ $# -le 3 ]; then
腳本1:
輸入q,Q,quit,Quit參數就退出
[root@localhost ~]# cat quit.sh
#!/bin/bash
#
if [ $1 == 'q' -o $1 == 'Q' -o $1 == 'quit' -o $1 == 'Quit' ]; then
echo "Quiting ..."
exit 0
else
echo "Unkown Argument."
exit 1
fi
讓一個變量加上某個數值以後再從新保存回原有變量空間
let I=$[$I+1]
SUM=$[$SUM+$I]
let SUM+=$I
let I+=1
簡化寫法 let I++
例如:
[root@localhost ~]# let I+=1
[root@localhost ~]# echo $I
11
[root@localhost ~]# let I+=1
[root@localhost ~]# echo $I
12
簡寫I++
[root@localhost ~]# let I++
[root@localhost ~]# echo $I
13
[root@localhost ~]# let I++
[root@localhost ~]# echo $I
14
[root@localhost ~]# let I++
[root@localhost ~]# echo $I
15
+=:一個變量在他基礎上加另一個數,只有加1,才能夠寫成++
let I+=1 至關於 let I++
-=:一個變量在他基礎上減去另一個數
let I-=1 至關於 let I--
++I,--I
*=:一個變量在他基礎上乘以另一個數
/=:一個變量在他基礎上除以另一個數
%=:一個變量在他基礎上取模另一個數
例:使用腳本求出1-100數字中奇數的和與偶數的和
#!/bin/bash
#
declare -i ENENSUM=0
declare -i ODDSUM=0
for i in {1..100}; do
if [ $[$i%2] -eq 0 ]; then
let EVENSUM+=$i
else
let ODDSUM+=$i
fi
done
echo "Odd sum is:$ODDSUM."
echo "Even sum is:$EVENSUM."
執行結果:
[root@localhost ~]# ./showsum.sh
Odd sum is:2500.
Even sum is:2550.
grep,egrep,fgrep:文本查找
文件查找:
locate:
非實時,模糊匹配,查找是根據全系統文件數據庫完成;優點,查找速度較快
# updatedb:手動生成文件數據庫,運行時間很是長
find:
實時查找,精確匹配,經過遍歷指定目錄中的全部文件來進行查找,因此速度較慢;支持衆多查找標準;
find 查找路徑 查找標準 查找到之後的處理動做
查找路徑:默認爲當前目錄
查找標準:默認爲指定路徑下的全部文件
處理動做:默認爲顯示至屏幕
匹配標準:
-name ‘FILENAME’:對文件名做精確匹配
文件名通配:
*:任意長度的任意字符
?:單個字符
[]:範圍
-iname ‘FILENAME’:文件名匹配不區分大小寫
-regex PATTERN:基於正則表達式進行文件名匹配
-user USERNAME:根據文件的屬主進行文件名匹配
-group GROUPNAME:根據屬組查找文件
-uid UID:根據UID查找 由於用戶一旦被刪除,搜索用戶沒法匹配到文件,但繼承原有的UID或GID,使用ID號依舊能夠查到用戶原來所屬的文件
-gid GID:根據GID查找
-nouser:查找無屬主用戶的文件,用戶被刪除的文件
-nogroup:查找無屬組的文件
-type:
f:普通文件
d:目錄
c:字符設備
b:塊設備
l:連接文件
p:管道設備
s:套接字文件(socket)
-size:粗略匹配,接近某個數值的文件均顯示爲某個值;例如:10M的文件,9M左右的均會被匹配出來
#k:[+|-] +大於#k的文件,-爲小於#k的文件
#M
#G
組合條件:
-a:與條件
-o:或條件
-not:非
不是目錄,而且還不能套接字類型的文件:
find /tmp -not -type d -a -not -type s
/tmp/test目錄下既不是user1屬主也不是user2屬主的文件
find . -not -user user1 -a -not -user user2
find . -not \( -user user1 -o -user user2 \)
屬主不是user1類型也不是目錄的
find . -not -user user1 -o -not -type d
find . -not \( -user user1 -a -type d \)
根據時間戳查找文件:
-mtime:修改時間
-ctime:改變時間
-atime:訪問時間
[+|-]#: -#表示#天以內被訪問過,+#至少#天沒有訪問過,#表示正好#天被訪問過
-mmin
-cmin
-amin
[+|-]#:-#表示#分鐘以內被訪問過,+#至少#分鐘沒有訪問過,#表示正好#分鐘被訪問過
-perm MODE:根據權限來查找文件
mode:
-mode:文件權限能徹底包含此MODE時才能顯示
/mode:任意一位匹配即知足條件
動做:
-print:顯示
-ls:相似ls -l的形式顯示每個文件的詳細信息
-ok COMMAND {} \:{}表示前面找到的文件,表示每個操做都須要用戶確認
-exec COMMAND {} \:{}表示前面找到的文件,直接執行不須要確認
例如:find ./ -perm -006 -exec chmod o-w {} \;
find ./ -type d -ok chmod +x {} \;
find ./ -perm -020 -exec mv {} {}.new \; 只要命令中須要引用文件名就使用{}
find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \; 將當前目錄下sh結尾的有執行權限的文件的其餘用戶組所有去掉執行權限
練習:
一、查找/var目錄下屬主爲root而且屬組爲mail的全部文件;
find /var -user root -group mail
二、查找/usr目錄下不屬於root,bin或student的文件;
find /usr -not -user root -a -not -user bin -a -not -user student
find /usr -not \( -user root -o -user bin -o -user student \)
三、查找/etc目錄下最近一週內內容修改過且不屬於root及student用戶的文件;
find /etc -mtime -7 -not \( -user root -o -user student \)
find /etc -mtime -7 -not -user root -a -not -user student
四、查找當前系統上沒有屬主或屬組且最近1天內曾被訪問過的文件,並將其屬主屬組均修改成root;
find / \(-nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;
五、查找/etc目錄下大於1M的文件,並將其文件名寫入/tmp/etc.largefiles文件中;
find /etc -size 1M >> /tmp/etc.largefiles
六、查找/etc目錄下全部用戶都沒有寫權限的文件,顯示出其詳細信息;
find /etc -not -perm /222 -ls
xarge:從標準輸入接受命令並執行的
例:find /etc -size +1M |xargs echo {} >> /tmp/etc.largefiles
與find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles \;不一樣xargs是空格隔開,exec以行隔開
特殊權限:
passwd:s
SUID:運行某程序時,相應進程的屬主是程序文件自身的屬主,而不是啓動者;
chmod u+s FILE
chmod u-s FILE 取消SUID
若是file自己原來就有執行權限,則SUID顯示爲s;不然顯示爲S;
SGID:運行某程序時,相應進程的屬組是程序文件自身的屬組,而不是啓動者所屬的基本組;
chmod g+s FILE
chmod g-s FILE 取消SGID
develop team,hadoop,hbase,hive 將三個用戶的附加組設定爲develop
/tmp/project/
Sticky:在一個公共目錄,每一個人均可以建立文件,刪除本身的文件,但不能刪除別人的文件;
chmod o+t DIRECOTRY
chmod o-t DIRECOTRY
000:表示無特殊權限
001:表示有Sticky權限
110:表示有SUID和SGID權限
111:所有特殊權限
chmod 1755 /backup/test 目錄有755的權限,而且有Sticky權限
3755 目錄有755的權限,表示有SGID權限和Sticky
2755 目錄有755的權限,表示有SGID權限
5755 目錄有755的權限,表示有SUID權限和Sticky
1表示Sticky
2表示SGID
4表示SUID
umask 0022
文件系統訪問控制列表
tom創建的文件,想讓jerry能夠讀寫此文件
tom:
屬於tom用戶和tom基本組
jerry:屬於other用戶權限,other給rw權限又增長了安全風險
屬於jerry用戶和tom附加組
FACL:Filesystem Access Control List
利用文件擴展屬性,保存額外的訪問控制權限
無facl訪問次序:Owner-->group-->Other
facl訪問次序:Owner-->facl,user-->group-->facl,group-->Other
若是某個文件有訪問控制權限的話權限行後有+號
[root@localhost backup]# ll
total 8
-rw-rwxr--+ 1 root root 884 May 25 23:35 inittab
setfacl:設置facl
-m:設定
u:UID:germ
setfacl -m u:hadoop:rw inittab
setfacl -m d:u:hadoop:rw donray 爲某個目錄以及內容賦權控制列表,前面加d
g:GID:germ
setfacl -m g:mygourp:rw inittab
setfacl -m d:g:mygourp:rw inittab
-x:取消
例:[root@localhost backup]# setfacl -x u:hadoop inittab
[root@localhost backup]# setfacl -x g:mygroup inittab
getfacl:獲取facl
例:
[root@localhost backup]# getfacl inittab
# file: inittab
# owner: root
# group: root
user::rw-
user:hadoop:rw-
group::r--
mask::rw-
other::r--
umask:現有權限減去全部權得出的反向結果
mask:不管給訪問控制列表中用戶和組任何權限都不可超出mask的權限
例:由下可見mask的權限是根據用戶指定的權限而更改的,除非咱們給mask先設定一個固定權限
[root@localhost backup]# setfacl -m u:hbase:rwx inittab
[root@localhost backup]# getfacl inittab
# file: inittab
# owner: root
# group: root
user::rw-
user:hadoop:rw-
user:hbase:rwx
group::r--
group:mygroup:rw-
mask::rwx
other::r--
mask賦權:setfacl -m mask::rw- inittab
[root@localhost backup]# setfacl -m mask::rw- inittab
[root@localhost backup]# getfacl inittab
# file: inittab
# owner: root
# group: root
user::rw-
user:hbase:rwx #effective:rw-
group::r--
mask::rw-
other::r--
經常使用命令:
w:顯示系統當前登陸信息以及正在作的事情
who:顯示登陸到當前系統上的用戶都有哪些,su的切換用戶並非登陸用戶,因此su的用戶who看不到
-r:顯示當前運行級別
-H:顯示標題信息
例:每隔5秒檢查hadoop是否已經登陸,如登陸,顯示已登陸,並退出。
sleep:讓程序延遲一段時間
whoami:當前登陸到系統的用戶是誰
last:顯示用戶登陸歷史及系統重啓歷史。對應文件:/var/log/wtmp
-n #:顯示最近#次的相關信息
lastb:顯示用戶錯誤的登陸嘗試。對應文件:/var/log/btmp
-n #:顯示最近#次的相關信息
lastlog:顯示每一個用戶最近一次的成功登陸信息。對應文件:/var/log/
-u USERNAME:顯示特定用戶最近的登陸信息
basename:文件基名
$0:指腳本或命令自己
basename $0:輸出腳本名稱自己
mail:查看郵件,輸入mail直接進入郵件信息
選擇1回車就是第一封郵件
-s:指定標題
例:[root@localhost backup]# cat /etc/fstab | mail -s "How are you?" root
[root@localhost backup]# mail -s "How are you?" root < /etc/fstab
發送一個fstab內容的郵件給root主題爲How are you
hostname:顯示當前主機的主機名
例:若是主機名不是www.magedu.com那就改成此
[ `hostname` != 'www.magedu.com' ] && hostname www.magedu.com
例:若是當前主機名爲空或localhost,就將其改成www.magedu.com
[ -z `hostname` -o `hostname` == '(none)' -o `hostname` == 'localhost' ] && hostname www.magdu.com
生成隨機數
RANDOM:0-32768
echo $RANDOM 隨機生成數
隨機數生成器:熵池
/dev/random:到熵池中取隨機數,若是熵池內無隨機數,會提示敲擊鍵盤生成更多隨機數
/dev/urandom:熵池中沒隨機數後,會模擬生成更多隨機數
練習:寫個腳本,利用RANDOM生成10個隨機數,並找出其中的最大值和最小值;
for i in {1..10}; do echo -n "$RANDOM,";echo -e "\n"; done
[root@localhost ~]# cat random.sh
#!/bin/bash
#
declare -i MAX=0
declare -i MIN=0
for i in {1..10};do
MYRAND=$RANDOM
[ $i -eq 1 ] && MIN=$MYRAND
if [ $i -le 9 ]; then
echo -n "$MYRAND,"
else
echo "$MYRAND"
fi
[ $MYRAND -gt $MAX ] && MAX=$MYRAND
[ $MYRAND -lt $MIN ] && MIN=$MYRAND
done
echo $MAX
echo $MIN
終端類型:
console:控制檯
pty:物理終端(VGA)
tty#:虛擬控制檯(VGA)
ttys#:串行終端
pts/#:僞終端
case:
面向過程:Shell,C
控制結構:
順序結構
選擇結構
循環結構
選擇結構:
if:單分支、雙分支、多分支
if 測試條件; then
statement1
...
fi
if CONDITION; then
statenment
...
else
statenment
...
fi
if CONDITION1; then
statenment
...
elif CONDITION2; then
statenment
...
esle
statnment
...
fi
case語句:選擇結構
case SWITCH(變量值) in
value1)
statenment
...
;;
valuel2)
statement
...
;;
*)
statement
...
;;
esac
例1:
[root@localhost ~]# cat case.sh
#!/bin/bash
#
case $1 in
[0-9])
echo "A digit." ;;
[a-z])
echo "Lower." ;;
[A-Z])
echo "Upper." ;;
*)
echo "Special character.";;
例2:
[root@localhost ~]# cat service.sh
#!/bin/bash
#
case $1 in
'start')
echo "start server ..." ;;
'stop')
echo "stop server ...";;
'restart')
echo "Restarting server ...";;
'status')
echo "Running ...";;
*)
echo "`basename $0` (start|stop|restart|status)";;
esac
例3:
[root@localhost ~]# cat debug.sh
#!/bin/bash
#
case $1 in
-v|--verbose)
DEBUG=1;;
*)
echo "Unknown options"
exit 7
;;
esac
[ $DEBUG == '1' ] && echo hello
例4:
[root@localhost ~]# cat addusercase.sh
#!/bin/bash
#
DEBUG=0
case $1 in
-v|--verbose)
DEBUG=1
;;
esac
useradd tom &> /dev/null
[ $DEBUG -eq 1 ] && echo "Add user tom finished."
例5:可接受選項參數,然後能獲取每一個選項,及選項的參數;並可以根據選項及參數作出待定的操做
例如:adminuser1.sh --dd USER_LIST --del USER_LIST -v|--verbose -h|--help
[root@localhost ~]# cat adminuser1.sh
#!/bin/bash
#
DEBUG=0
ADD=0
DEL=0
for i in `seq 1 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-v|--verbose)
DEBUG=1
shift ;;
-h|--help)
echo "Usage:`basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 0
;;
--add)
ADD=1
ADDUSERS=$2
shift 2
;;
--del)
DEL=1
DELUSERS=$2
shift 2
;;
*)
echo "Usage:`basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 7
;;
esac
fi
done
if [ $ADD -eq 1 ]; then
for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do
if id $USER &> /dev/null; then
[ $DEBUG -eq 1 ] && echo "$USER exists."
else
useradd $USER
[ $DEBUG -eq 1 ] && echo "Add user $USER finished."
fi
done
fi
if [ $DEL -eq 1 ]; then
for USER in `echo $DELUSERS | sed 's@,@ @g'`; do
if id $USER &> /dev/null; then
userdel -r $USER
[ $DEBUG -eq 1 ] && echo "Delete user $USER finished."
else
[ $DEBUG -eq 1 ] && echo "$USER not exists."
fi
done
fi
結果:
[root@localhost ~]# ./adminuser1.sh -v --add tom,jerry,natasha
Add user tom finished.
Add user jerry finished.
Add user natasha finished.
[root@localhost ~]# ./adminuser1.sh -v --del tom,jerry,natasha
Delete user tom finished.
Delete user jerry finished.
Delete user natasha finished.
[root@localhost ~]# ./adminuser1.sh -v --add tom,jerry,natasha
Add user tom finished.
Add user jerry finished.
Add user natasha finished.
[root@localhost ~]# ./adminuser1.sh -v --add tom,jerry,natasha
tom exists.
jerry exists.
natasha exists.
例6:寫showlogged.sh腳本,-h選項只能單獨使用,顯示幫助信息;-c選項,顯示當前系統登陸的全部用戶;若是同時使用-v選項,則既顯示登陸用戶又顯示用戶相關信息:
[root@localhost ~]# cat showlogged.sh
#!/bin/bash
#
declare -i DEBUG=0
declare -i SHOWNUM=0
declare -i SHOWUSERS=0
for i in `seq 1 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-h|--help)
echo "Usage:`basename $0` -h|--help -c|--counts -v|--verbose."
exit 0;;
-v|--verbose)
let SHOWUSERS=1
shift ;;
-c|--count)
let SHOWNUM=1
shift ;;
*)
echo "Usage:`basename $0` -h|--help -c|--counts -v|--verbose."
exit 8;;
esac
fi
done
if [ $SHOWNUM -eq 1 ]; then
echo "Logged users:`who |wc -l`."
if [ $SHOWUSERS -eq 1 ]; then
echo "They are:"
who
fi
fi
結果:
[root@localhost ~]# ./showlogged.sh -h
Usage:showlogged.sh -h|--help -c|--counts -v|--verbose.
[root@localhost ~]# ./showlogged.sh --help
Usage:showlogged.sh -h|--help -c|--counts -v|--verbose.
[root@localhost ~]# echo $?
0
[root@localhost ~]# ./showlogged.sh --hel
Usage:showlogged.sh -h|--help -c|--counts -v|--verbose.
[root@localhost ~]# echo $?
8
[root@localhost ~]# ./showlogged.sh -c
Logged users:1.
[root@localhost ~]# ./showlogged.sh --count
Logged users:1.
[root@localhost ~]# ./showlogged.sh -c -v
Logged users:1.
[root@localhost ~]# vim showlogged.sh
[root@localhost ~]# ./showlogged.sh -c -v
Logged users:1.
They are:
root pts/0 2018-05-29 23:22 (192.168.219.1)
磁盤管理:
機械式硬盤RAM:
U盤,光盤,軟盤,硬盤,磁帶
磁盤按照柱面進行分區
越外層的磁道讀寫速率越快
分區:partition
建立獨立的文件系統
MBR(master boot record)主引導記錄:
整個磁盤的0磁道0扇面0 佔用512byte,是不會被佔用的
前446byte:BootLoader,引導加載器,一段程序,完成引導某個分區將操做系統啓動
接下來的64byte:
每16個byte標識一個分區,共劃分4個主分區
最後2byte:magic number
標記MBR是否有效
啓動過程:
首先內存加載BIOS內容,檢驗成功後
再加載BootLoader,根據BootLoader內容加載操做系統起始分區,BIOS退出內存
以後再讀取64bytes的分區表
BootLoader會找到系統的內核所在位,並將內核加載入內存中
以後BootLoader將工做交給內核,內核再加載系統啓動
主+擴展≤4
擴展分區:幾十上百均可以建立
文件系統:文件存儲的管理程序,存儲着data和metadata
data:數據存儲
Metadata:元數據,查找文件的索引數據。
分區劃分之初會劃分多個塊組(block group),而建立塊組時也會建立對應的塊組列表索引,對用戶不可見。
每一個分區的塊組中又含有塊位圖和iNode位圖
bitmap塊位圖:元數據中含有塊位圖,每一個數據塊標記一個圖位,0爲空磁盤塊,1爲非空塊。加速查找磁盤塊。
iNode:index node 索引節點,放置iNode號碼以及對應的文件的屬主、屬組、權限、時間戳、文件大小等等
若是查找/var/log/messages文件
會先從iNode索引中找到/目錄,找到/對應的磁盤塊,/的磁盤塊中又存着本身的索引,從中找到對應的var文件的iNode號,再回到iNode索引中找到對應的磁盤塊,找到log對應的iNode號,再依次找到messages的iNode號再找到它所在的磁盤塊最終找到對應messages文件
dentry:磁盤塊對應的索引中含有一個目錄項。
建立一個文件的過程:
在/backup/目錄下建立test.txt文件,文件大小爲10k,假設每一個磁盤塊爲2k
首先掃描iNode表位圖,找到空閒iNode佔用此號,找到對應的磁盤塊位圖,創建test.txt文件名並寫入對應的iNode號,再從塊位圖中找到空閒磁盤塊,依次寫入此test.txt的10k容量的文件內容。
刪除文件的過程:
找到文件,將其目錄對應的條目刪除,在iNode位圖中將此iNode的號標記爲空便可,其佔據的磁盤塊也標記爲空。但內部數據未清除,只是再次寫入時會把原有數據覆蓋掉。因此刪除的數據能夠找回。
複製與剪切文件的過程:
複製文件的過程,至關於建立文件的過程,而同分區剪切文件只是改變索引位圖的路徑位置而已,可是跨分區就會相對慢了。跨分區剪切過程在新分區創建新文件,而後再將老分區的文件複製到新分區中,再到老分區中刪除原文件。
連接文件:
硬連接:直接指向同一個iNode的不一樣路徑的文件叫作硬連接文件。權限後面跟的數字爲此文件硬連接的次數。
符號連接:指向的並非iNode號而是對應實文件的字符個數。
ls -i:顯示文件的iNode號
ln [-s -v] SRC DEST
-s:建立軟鏈接
例:建立硬連接
ln abc test/abc2
再ls -l就能夠看到權限後面的數字改變爲2了
建立軟鏈接
ln -sv /backup/abc /backup/test/abc2
硬連接:
一、只能對文件建立,不能應用於目錄;防止循環連接。
二、不能跨文件系統;iNode號不能跨區域
三、建立硬連接會增長文件被連接的次數
符號連接:
一、可應用於目錄
二、能夠跨文件系統
三、不會增長被連接文件的連接次數
四、其大小爲指定的路徑所包含的字符個數;
du:顯示文件所佔用的磁盤空間大小
-s:顯示本目錄空間大小
-h:按單位換算顯示目錄下全部文件大小
df:顯示整個磁盤使用分區的使用狀況
-h:按單位換算顯分區佔用大小
-i:可用iNode數量
-P:在同一行內顯示,不換行
塊設備:不佔用磁盤空間,主次設備號存儲在iNode當中
b:按塊爲單位,隨機訪問的設備;如:硬盤
字符設備:
c:按字符爲單位,線性設備;如:鍵盤
/dev目錄下:
中間的10,60的數字表明:指主設備號和次設備號
crw-rw----. 1 root root 10, 60 Jun 7 23:24 network_latency
crw-rw----. 1 root root 10, 59 Jun 7 23:24 network_throughput
crw-rw-rw-. 1 root root 1, 3 Jun 7 23:24 null
主設備號(majar number):
標識設備類型
次設備號(minor number):
標識同一種類型中不一樣設備
設備文件是做爲設備的訪問入口的
mknod:建立塊或字符文件命令
mknod [option]... name type [major minor]
-p:管道
-m:MODE建立時指定權限
例:
mknod mydev c 66 0
mknod -m 640 mydev2 c 66 1
硬盤設備的設備文件名:
IDE,ATA:hd
SATA:sd
SCSI:sd
USB:sd
a,b,c,...來區別同一種類型下的不一樣設備
IDE:
第一個IDE口;主hda、從hdb
第二個IDE口:主hdc、從hdd
SCSI、SATA:
sda,sdb,sdc,...
hda:
hda1:第一個主分區
hda2:
hda3:
hda4:
hda5:第一個邏輯分區
主分區最多4個,擴展分區最多1個,邏輯分區可多個
fdisk -l 查看磁盤中全部邏輯分區
fdisk -l [/dev/to/some_device_file]查看某個磁盤設備
低級格式化:建立磁道;廠商出廠便作好的無需自行格式化;
高級格式化:建立文件系統 mkfs -t ext3
vfs:virtual filesystem 負責解釋對接各類不一樣文件系統的編譯,linux特有
windows文件系統:FAT3二、NTFS;網絡層文件系統:CIFS 網上鄰居互訪
光盤:ISO9660
Linux:ext二、ext三、ext四、xfs、reiserfs、jfs、swap;網絡層文件系統:nfs、ocfs二、gfs2
管理磁盤分區:
fdisk /dev/sda 爲sda磁盤進行分區
p:顯示當前硬件的分區,包括沒保存的改動
n:建立新分區
e:擴展分區
p:主分區
d:刪除一個分區
w:保存退出
q:不保存退出
t:修改分區類型
L:與l相同
l:顯示所支持的全部類型
分區保存後只是設備分區並未被內核識別
cat /proc/partitions能夠查看到全部內核識別的分區
partprobe命令使內核重讀分區表,此時新分區才能被格式化;紅帽5以前的命令,紅帽6變換新命令partx
vfs:virtual filesystem 主要是統一不一樣文件系統調用接口,纔可以在linux下使用不一樣的文件系統
內核經過接口interface:經過system call與硬件進行交互
使用硬盤的磁盤空間就須要系統調用,跟內核申請調用磁盤空間
用戶模式與用戶空間
內核模式與內核空間
cpu運行經過4個環進行
最內側爲ring 0 內核使用,具有特權
用戶進程使用ring 3,無特權
經過iNode:index node找到對應塊
格式化後的磁盤缺乏了不少空間就是爲iNode空間預留了
每8k磁盤空間預留1個iNode,塊大小爲2的N次方;
block size:1024字節:1k、2048字節:2k、4096字節:4k
內存中的空間的單元被稱之爲頁框,一個頁框可存儲1個塊,2個塊或4個塊,頁框大小通常爲4k
bitmap塊位圖:元數據中含有塊位圖,每一個數據塊標記一個圖位,0爲空磁盤塊,1爲非空塊。加速查找磁盤塊。
iNode bitmap inode位圖;
block bitmap塊位圖;
super block超級塊:記錄整個分區的全局信息,能夠有多個備份
一、記錄多少塊組
二、每一個塊組中包含多少塊
三、塊大小
四、空閒磁盤塊,已用磁盤塊,空閒iNode,已用iNode
塊組描述符表:標識塊組的起始結束等標識符
整個磁盤空間劃分:
boot block:預留引導塊,若是按照操做系統,boot loader就安裝在此。與MBR不一樣MBR是個扇區,512k
雙系統安裝,第一個系統引導安裝在MBR中第二個系統引導boot loader就會安裝在boot block中存放
block group:塊組
super block:超級塊,每一個塊組一個
GDT:塊組描述符表,存放當前分區每塊組的塊組名以及起始和結束的塊信息,有多組備份;
block bitmap:塊位圖,存儲塊位值信息
iNode bitmap:iNode位圖,iNode對應信息
iNode table:iNode存放表
data blocks:數據塊
磁盤查找文件順序:
一、iNode表中找到根的iNode,找到對應的磁盤塊
二、根據磁盤塊再找到var對應的iNode再經過iNode找到對應磁盤塊,在此找到log對應的iNode號
三、再回到iNode表中查log所在塊,進入log所在塊內所在的messages文件所對應iNode號
四、再回到iNode表查messages所在的磁盤塊
目錄:
每一個目錄其實存放的就是一張iNode號和文件名稱的對應關係表
第一列存放iNode的號
第三列存放文件名稱的長度
第四列文件類型
最後是文件名
iNode格式:內部有直接磁盤塊引用格式,間接以及二級格式,使用逐層的引用格式進行塊位存儲。有直接指針,間接指針以及二級指針等
mode:權限
owner info:屬組屬主
size:大小
timestamps:時間戳
direct blocks:直接指針
indirect blocks:間接指針
double indirect:二級間接磁盤塊指針
triple indirect:三級間接磁盤塊指針
ext3:ext2的修復過程很是慢,出現異常時,若是想尋回以前操做必須經過遍歷的過程才能找到損壞位
journal file system:日誌文件系統
分區中會多創建一份日誌區,iNode在日誌區建立,數據存儲過程當中斷電能夠直接檢查日誌區的操做,日誌區的存放記錄就能夠直接修復,順利存儲可將日誌區完成的iNode信息存入元數據區
但此類型多了一層讀寫操做,所以速率上會慢一些,尤爲是寫操做。頻繁大量寫入小文件時較爲明顯
文件系統管理
格式化分區:從新建立文件系統會損壞原有文件
在fdisk分區時刪除鍵失效,能夠按ctrl+刪除鍵刪除便可
fdisk分區後保存退出,使用partprobe /dev/sda來刷新分區才能繼續格式化
mkfs:make file system
文件系統類型:
ext二、ext三、ext四、xfs、reiserfs、jfs、swap;網絡層文件系統:nfs、ocfs二、gfs2
mkfs:
-t FSTYPE /dev/sda4
使用cat /proc/filesystems:可查看當前內核下支持的文件系統,須要更多文件系統能夠添加新文件系統模塊來添加
ext2格式化以後顯示的信息:
filesystem label卷標:分區名
OS type:操做系統類型
Block size:塊大小
Fragment size:偏移大小
xxxx inodes(共分了多少個iNode),xxxxx blocks(共分了多少塊)
xxxx blocks reserved for the super user:有多少塊預留給超級管理員使用
First data block=0 : 起始塊
maximum filesystem blocks=xxxxxx 最大文件系統塊
xx block groups:分了多少塊組
xxxxx blocks per group,xxxxx fragments per group:每組有多少塊,每組多少個偏移
xxxxx iNodes per group 每一個組有多少個inod,基本是
superblock backups stored on blocks:都哪些塊是備份塊
xxxx,xxxxx,xxxxx,xxxxx,xxxxx
writing inode tables:done 寫inode表完成
writing superblocks and filesystem accounting information:done 寫超級塊與文件系統信息完成
this filesystem will be automatically checked every 20 mounts or 180 days,whichever comes first。use tune2fs -c or -i to override。
建議此文件系統每掛載20次或者使用180天,進行一次檢測。使用tune2fs -c 或 -i 來修復。
若是是ext3文件系統會多一行信息:
creating journal(4096 blocks):done 建立日誌塊完成
專門管理ext系列文件系統:
mke2fs:不加-j參數爲ext2
-j:加此參數爲ext3
-b BLOCK_SIZE:指定塊大小,默認爲4096;可用取值102四、2048或4096;
-L LABEL:指定分區卷標
-m #:指定預留給超級用戶的塊數百分比
-i #:用於指定多少字節的空間建立一個inode,默認爲8192;這裏給出的數值應該爲塊大小的2^n倍;
-N #:指定inode個數;
-F:強制建立文件系統;
-E:用於指定額外的文件系統屬性;
查看塊設備的文件信息
blkid:用於查詢或查看block設備的屬性或定位block設備屬性
UUID
TYPE
LABEL:分區卷標
e2label:用於查看或定義卷標
e2label 設備文件 卷標:設定卷標
tune2fs:調整文件系統的相關屬性
-j:不損壞原有數據,將ext2升級爲ext3;但沒法降級
-L LABEL:設定或修改卷標
-m #:調整預留百分比;
-r #:指定預留塊數;
-o:設定默認掛載選項;
acl:訪問控制功能
journal_data_ordered:日誌類型
-C:
-c #:指定掛載次數達到#次後進行自檢,0或-1表示關閉此功能
-i #:每掛載使用多少天后進行自檢;0或-1表示關閉此功能
-l:顯示超級塊中的信息;
dumpe2fs:顯示文件系統屬性信息
-h:只顯示超級塊信息
fsck:檢查並修復linux文件系統
-t FSTYPE:指定文件系統類型
-a:自動修復
e2fsck:專門檢查或修復EXT2/EXT3文件系統
-f:強制檢測
-a:自動修復
-p:默認選項,也是自動修復
掛載:將新的文件系統關聯至當前根文件系統
mount:掛載
mount 設備 掛載點
設備:
設備文件:/dev/sda5
卷標:LABEL=「 」
UUID:UUID=「 」
掛載點:目錄
要求:
一、此目錄沒有被其它進程使用
二、目錄需事先存在
三、目錄中原有文件將會被暫時隱藏;
mount單獨使用:顯示當前系統已經掛載的設備及掛載點
mount [options] [-o options] DEVICE MOUNT_POINT
-a:表示掛載/etc/fstab文件中定義的全部文件系統
-n:默認狀況下;mount命令每掛載一個設備,都會把掛載的設備信息保存至/etc/mtab文件中;使用-n選項意味着掛載設備時,不把信息寫入此文件;
-t FSTYPE:指定正在掛載設備上的文件系統的類型;不適用此選項時,mount會調用blkid命令獲取對應文件系統的類型;
-r:只讀掛載,掛載光盤時經常使用此選項
-w:讀寫掛載
-o:指定額外的掛載選項,也即指定文件系統啓用的屬性;
async:異步寫入,硬盤比CPU速度要慢的多,異步是將cpu計算結果先輸入至內存再寫入磁盤,若是同步寫入磁盤效率會被磁盤效率拖慢不少;
atime:最近一次訪問時間,不更新爲no atime,每次建立時間戳都會產生一次IO,影響性能
auto:設備可以使用-a選項
defaults:使用默認選項,沒指定任何選項就使用默認
dev:若是當前文件系統中有設備文件,是否啓用此設備,dev表示啓用
exec:執行權限的可執行文件運行起來;
netdev:設備網絡映射,網絡斷開等問題不重複掛礙
owner:容許普通用戶掛載此文件系統
remount:從新掛載當前文件系統
ro:掛載爲只讀
rw:讀寫掛載
sync:同步寫入
suid:
掛載完成後,要經過掛載點訪問對應文件系統上的文件;
卸載:將某文件系統與當前根文件系統的關聯關係予以移除;
umount:卸載某文件系統
umount 設備或掛載點
卸載注意事項:
掛載的設備沒有被進程使用;
任務計劃:
mail
cron
at
batch
swap分區:虛擬地址不感知底層物理內存使用狀況,當物理內存用盡,就會將虛擬地址存入臨時的存儲空間中,等待物理內存空閒後再轉入物理內存中。產生一種換進換出的過程,這個過程就叫作交換空間,能夠使內存過載使用。overcommit
page out:將內存空間交換到磁盤的過程
page in:再從磁盤交換空間中取回到內存的過程
CPU:time slice 時間片
I/O設備:多路複用
內存:x86:(32位)
物理地址:物理內存中將全部內存分爲了多個page frame頁框,每4k做爲一個存儲單元
虛擬地址,線性地址:虛擬空間對應一個物理內存頁框,交叉關聯。這樣將物理內存分配給不一樣的進程使用。
free:查看物理內存以及交換分區的使用狀況
total:總空間
used:已使用空間
free:空閒空間
buffers:緩衝;均衡設備之間使用狀況,主要是元數據
cache:緩存:緩存數據
swap空間不足如何添加:
首先新建新分區
fdisk /dev/sda
n(新建分區)默認值回車便可
L(選擇82 linux swap進行分區類型選擇)
p(查看分區)
w(保存分區並退出)
使用partprobe /dev/sda 刷新分區
建立交換分區:
mkswap /dev/sda8
-L LABEL:指定卷標
掛載交換分區:
swapon /dev/sda8
-a:啓用全部的定義在/et/fstab文件中的交換設備
關閉交換分區:
swapoff /dev/sda8
dd命令:轉換並複製一個文件
使用方式:
dd if=/etc/inittab of=/root/inittab
if=input file數據來源
of=output file數據存儲目標
bs=1024:以1個字節爲單位複製,block size 每次複製1024字節
count=2:一共複製多少個這樣的字節,一共複製2個1024
備份mbr:
dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1
恢復mbr:
dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1
將光盤製做成iso文件:
cat /dev/cdrom > /root/rhel5.iso
dd if=/dev/cdrom of=/root/rhel5.iso
迴環設備:
loopback,使用軟件來模擬實現硬件
dd if=/dev/zero of=/var/swapfile bs=1M count=1024 建立一個1G的文件,硬盤會很是快的轉速
/dev/zero:泡泡設備,是一個永遠輸出0的設備文件要多少給多少,與/dev/null黑洞給多少要走多少相反
建立一個鏡像文件,1G空間模擬爲一個硬盤能夠當作120G甚至更多使用。磁盤無空間時應急使用,性能會比磁盤更差。
[root@localhost ~]# free 查看swap爲4G空間
total used free shared buffers cached
Mem: 1004608 358960 645648 0 18976 148220
-/+ buffers/cache: 191764 812844
Swap: 4095992 0 4095992
[root@localhost ~]# dd if=/dev/zero of=/var/swapfile bs=1M count=1024 建立一個1G的設備文件
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 50.0761 s, 21.4 MB/s
[root@localhost ~]# ls -lh /var/swapfile 查看文件大小正好爲1G
-rw-r--r--. 1 root root 1.0G Jun 28 04:47 /var/swapfile
[root@localhost ~]# mkswap /var/swapfile 建立swap空間
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=6e1c16b5-d3ee-4ed4-a33b-943c9b64028f
[root@localhost ~]# swapon /var/swapfile 啓用此設備到swap空間
[root@localhost ~]# free -m 查看swap空間擴展到了5G
total used free shared buffers cached
Mem: 981 912 68 0 6 702
-/+ buffers/cache: 203 777
Swap: 5023 0 5023
dd和cp區別:
cp:以文件爲單位複製,經過vfs進行復制,依託於文件系統之上
dd:複製的是底層的數據流,01代碼爲單位,最底層複製
dd命令:
bs=#
if=數據來源
of=數據存儲目標
count=#
seek=#:開始出跳過多少。如:dd if=/dev/zero of=/var/swapfile2 seek=1023 bs=1M count=1
再查看文件[root@localhost ~]# ls -lh /var/swapfile2 仍然是1G,由於實際建立了1M可是跳過了1023M表面看是1G,實際上是個假文件,使用du查看就是實際大小。
-rw-r--r--. 1 root root 1.0G Jun 28 05:05 /var/swapfile2
mount命令,能夠掛載iso鏡像
mount DEVICE MOUNT_POINT
-o loop:掛載本地迴環設備
掛載iso鏡像文件,直接掛載會提示不是設備文件。所以使用迴環指令集進行掛載
mount -o loop /root/rhci-5.8-1.iso /media/
ls /media/ 就能夠看到iso文件中的內容了
文件系統的配置文件/etc/fstab,全部寫入此表的文件系統
OS在初始時,會自動掛載此文件中的文件系統
要掛載的設備 掛載點 文件系統類型 掛載選項 轉儲頻率 文件系統檢測次序
/dev/sda5 /mnt/test ext3 defaults,acl 0 0
第一個字段:要掛載的設備,能夠使用LABEL卷標或UUID的方式指定也能夠直接使用設備文件路徑來指定
第二個字段:掛載點,掛載位置
第三個字段:文件系統類型
第四個字段:掛載選項,在默認選項後加acl便可啓用ACL功能
第五個字段:轉儲頻率(與文件系統備份相關,表示每多少天備份一次徹底備份),定義多少天對此文件系統作一次備份。0表示不備份,1表示天天備份一次徹底備份,2表示每隔1天作一次徹底備份,
第六個字段:文件系統檢測次序,每次開機的時候依次檢測的次序,只有根爲1,其餘文件系統可同時爲2,0表示不檢查
mount -a:表示掛載fstab文件中定義的全部文件系統
掛載完成一個設備就會寫入到先的mtab文件中
/etc/mtab文件中
-n:選項意味着掛載設備時,不把信息寫入此文件;
若是一個設備卸載時提示此設備is busy,能夠用如下命令查看使用者
fuser:驗證每一個進程正在使用的文件或套接字
-v:查看某文件上正在運行的進程 如:fuser -v /dev/test
-k:結束正在訪問此文件的進程
-m:結束掛載點上的全部正在訪問的進程 如:fuser -km /dev/test
壓縮、解壓縮命令
壓縮格式:gz、bz二、xz、zip、Z、7z等等
壓縮算法:算法不一樣,壓縮比也會不一樣;
壓縮比:壓縮前減去壓縮後的大小再比原來大小
compress:壓縮,能夠解壓FILENAME.Z
uncompress:解壓
xz、bz二、gz
如下命令只能壓縮文件,並不是目錄,若是用在目錄會把目錄下的全部文件壓縮
gzip:.gz
壓縮:gzip /PATH/TO/SOMEFILE :壓縮後會刪除原文件
-d:也能夠解壓縮
-#:1-9:指壓縮比,默認爲6.最大爲9
gunzip:解壓縮
gunzip /PATH/TO/SOMEFILE.gz :解壓縮後刪除壓縮文件
zcat /PATH/TO/SOMEFILE.gz 不解壓的狀況下,查看壓縮文件內容
比gzip有着更大壓縮比的壓縮工具,使用格式近似
bzip2:.bz2
bzip2 /PATH/TO/SOMEFILE 也會刪除原文件
-d:解壓縮
-#:1-9壓縮比,默認也是6
-k:壓縮時能夠保留原文件
bunzip2 /PATH/TO/SOMEFILE 解壓壓縮文件
bzcat:不解壓直接查看壓縮包內容進行
比bzip2壓縮比還大的壓縮工具,默認不安裝,安裝前請肯定有/etc/yum.repos.d/server.repo文件,如沒有網上下載放置此目錄,放置以後,使用sed -i 's@instructor\.example\.com@172.16.0.1@g' server.repo
而後安裝
yum install xz
安裝後使用
xz:.xz
使用方式:
xz /PATH/TO/SOMEFILE :壓縮,也會刪除原文件
-d:解壓縮
-#:1-9壓縮比,默認也是6
-k:壓縮時,保留原文件
unxz /PATH/TO/SOMEFILE :解壓縮,也會刪除原文件
xzdec /PATH/TO/SOMEFILE :也是解壓縮工具
xzcat /PATH/TO/SOMEFILE :不解壓直接查看壓縮文件內容
zip:是不少操做系統默認就能夠解壓縮的文件,可壓縮目錄,但壓縮比不大
zip test.zip test/*
zip FILENAME.zip FILE1 FILE2 ... 默認不刪除原文件
unzip FILENAME.zip 解壓命令
archive:歸檔壓縮,歸檔自己並不意味着壓縮,只有須要壓縮的時候再壓縮。
zip:既能歸檔又能壓縮的工具。
tar:GNU版本的歸檔工具,只歸檔不壓縮
使用方法:
tar option 壓縮後的文件名 被壓縮元文件
tar:歸檔
-c:建立歸檔文件
-f FILE.tar:操做的歸檔文件
-x:還原歸檔
--xattrs:表示歸檔的同時,保留其擴展屬性信息,關鍵參數,備份時經常使用
-tf:不展開歸檔,直接查看歸檔了文件
歸檔後的文件能夠再壓縮,xz test.tar
這樣執行兩次才能展開文件或壓縮和歸檔文件,能夠使用
-zcf:先建立歸檔,再調用gzip壓縮
-zxf:先調用gzip解壓縮後展開歸檔,-z選項可省略
-jcf:先建立歸檔,再調用bzip2壓縮
-jxf:先調用bzip2解壓縮後展開歸檔,-z選項可省略
-Jcf:先建立歸檔,再調用xz壓縮 紅帽6以後版本支持
-Jxf:先調用xz解壓縮後展開歸檔
cpio:歸檔工具,建立歸檔或展開歸檔,比tar更早期的工具
練習:寫一個腳本
從鍵盤讓用戶輸入幾個文件,腳本可以將此幾個文件歸檔壓縮成一個文件
read 變量名:鍵盤賦值給變量
vi sum.sh
#!/bin/bash
#
echo "Input two intergers:"
read -t 5 -p "Input two intergers [100 and 1000]:" A B #使用-p選項能夠省略上面的echo內容,給出提示的意思,-t #多少秒後超時。
[ -z $A ] && A=100
[ -z $B ] && B=1000
echo "$A plus $B is: $[$A+$B]"
vi myar.sh
#!/bin/bash
#
read -p "Three files:" FILE1 FILE2 FILE3
read -p "Destination:" DEST
read -p "Compress [gzip|bzip2|xz]:" COMP
case $COMP in
gzip)
tar -zcf $(DEST).tar.bz2 $FILE1 $FILE2 $FILE3 ;;
bzip2)
tar -jcf $(DEST).tar.bz2 $FILE1 $FILE2 $FILE3
;;
xz)
tar -cf $(DEST).tar.bz2 $FILE1 $FILE2 $FILE3
xz $(DEST).tar
;;
*)
echo "Unkown."
exit 9
;;
esac
腳本編程:
順序結構
選擇結構
if
case
循環結構
for
while
until
while循環:適用於循環次數位置的場景,要有退出條件,不然陷入死循環
語法:
while CONDITION; do
statement
...
done
計算100之內全部正整數的和
vim while.sh
#!/bin/bash
#
declare -i I=1
declare -i SUM=0
while [ $I -le 100 ]; do
let SUM+=$I
let I++
done
echo $SUM
用戶輸入的字符串所有替換爲大寫,除非是quit便可退出
vim translate.sh
#!/bin/bash
#
STRING=hello world #或適用 read -p "Input something:" SRTING
while [ $STRING != 'quit' ]; do
echo $STRING | tr 'a-z' 'A-Z'
read -p "Input something:" SRTING
done
hadoop登陸腳本
#!/bin/bash
#
who | grep "hadoop" &>/dev/null
RETVAL=$?
while [ $RETVAL -ne 0 ]: do
echo " `date`, hadoop is not login."
sleep 5
who | grep "hadoop" &>/dev/null
RETVAL=$?
done
echo "Hadoop is logged in"
循環輸入查看系統性能腳本
#!/bin/bash
#
cat << EOF
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF
echo -n -e "\033[31mYour choice:\033[0m"
read -p "You choice:" CHOICE
while [ $CHOICE != 'quit' ]: do
case $CHOICE in
d|D)
echo "Disk usage:"
df -Ph ;;
m|M)
echo "Memory usage:"
free -m |grep "Mem" ;;
s|S)
echo "Swap usage:"
free -m |grep "Swap" ;;
*)
echo "Unkonw." ;;
esac
echo -n -e "\033[31mAgain, your choice:\033[0m"
read -p "Again, your choice:" CHOICE
done
輸出加色以及加粗:
echo -e "\033[1mHello\033[0m,world." # \033開始表示字體1m表示字體加粗到最後的\033結束
echo -e "\033[31mHello\033[0m,world." #31m表示Hello紅色字體,32m表示綠色,33m表示黃色,34藍色,35紫色,36淺藍,37灰色。
echo -e "\033[41mHello\033[0m,world." # 41m表示Hello背景爲紅色
echo -e "\033[37;41mHello\033[0m,world." # 37;41m表示背景色爲紅色字體爲灰色
echo -e "\033[1;37;41mHello\033[0m,world." # 1;37;41m表示背景色爲紅色字體爲灰色並加粗顯示 5;37;41m是字體閃爍,7是把字符顏色和背景顏色反轉
64位操做系統對應庫爲:/lib64
32位操做系統對應庫爲:/lib
協議:雙方都要遵循某種規則的控制方式
MB和Mb區別,Mb除以8才能獲得MB
IDE:133Mbps 並行口
SATA1:300Mbps SATA2:600Mbps SATA3:6Gbps 串行口
USB2.0 : 40Mbps USB3.0 : 480Mbps 串行口
SCSI:small computer system interface,小型計算系統接口,內部有芯片控制器,大大提升性能,10000轉、15000轉
UItraSCSI,320Mbps,並行總線
SAS:2.5英寸,轉速快
RAID控制器:獨立冗餘磁盤陣列,將多塊硬盤組合提供存儲功能
條帶化
RAID級別:僅表明磁盤組織方式不一樣,沒有上下之分;
RAID 0:條帶,速度快,性能提高,讀寫。但無冗餘能力。存儲利用率:nS 2塊及以上
RAID 1:鏡像,寫性能降低,讀性能提高。冗餘能力較強,空間利用率:50% 2塊及以上
RAID 0+1:條帶+鏡像,任何一塊盤壞掉整個磁盤體系都會受到影響。性能讀寫提高,有冗餘能力,空間利用率50%。4塊及以上
RAID 1+0:鏡像+條帶,性能與0+1差異不大,但磁盤損壞修復時會顯示出優點,隻影響單個磁盤速率,其他不影響。讀寫性能提高,冗餘能力有,空間利用率:50% 4塊及以上
RAID 5:校驗碼,校驗碼盤很容易成爲性能瓶頸,所以磁盤輪流作校驗碼盤,只容許壞1塊磁盤。讀寫都提高,冗餘能力有,空間利用率N-1/n。至少3塊盤
RAID 6:校驗碼,校驗兩次,增長可靠性,但須要增長校驗碼盤
RAID 5+0:兩個RAID5,再進行條帶華。性能讀寫提高,冗餘能力有,空間利用率(n-2)/n 至少須要6塊盤
jbod:主要目的實現將多個小盤組合成一個塊大盤來用。只是容量擴展使用。Hadoop就須要此技術。性能無提高,冗餘能力無,空間利用率100%,2塊及以上磁盤
硬RAID
BIOS界面中配置
軟RAID
linux:md:multi disks,模擬一個邏輯RIAD,建立好的邏輯RIAD會在/dev/md0設備,使用CPU進行數據分片,性能較差,依賴於操做系統,若是操做系統壞掉RIAD也將損壞。分區必須標識爲fd類型linux軟raid,使內核能夠直接識別設備。
軟RIAD命令
md:功能模塊
mdadm:將任何塊設備作成RAID,分區也能夠爲RAID,但無心義,實驗使用。
模塊化的命令:
建立模式 例如:mdadm -C /dev/dm0 -a yes -l 0 -n 2 /dev/sda{5,6} -l級別改成1就是raid1
-C
專用選項:
-l:指定級別
-n #:設備個數
-a {yes|no}:自動爲其建立設備文件
-c:chunk(數據塊)大小,2^n,默認爲64K
-x #:指定空閒盤個數,與-n設備個數對稱
管理模式 例:mdadm /dev/md1 --fail /dev/sda7 模擬/dev/sda7在md1例損壞
-a,--add,--del,-r,--remove,-f,--fail,--set-faulty
監控模式
-F
增加模式
-G
裝配模式
-A
掃描當前軟riad信息:
mdadm -d --scan
寫入到配置文件中,實現自動裝配,無需指定設備
mdadm -d --scan > /etc/mdadm.conf
中止陣列:
mdadm -S /dev/md#
--stop
顯示raid設備詳細信息
mdadm -D /dev/md1
使用此命令查詢軟RAID
cat /proc/mdstat
能夠將cat /proc/mdstat命令每隔2秒顯示一次
watch:週期性的執行指定命令,並以全屏方式顯示結果
使用格式:
watch -n # 'COMMAND'
-n #:指定週期長度,單位爲秒,默認爲2
watch 'cat /proc/mdstat'
改變塊大小來提高軟raid性能:
mke2fs -j -E stride=16 -b 4096 /dev/md0
-E stride:指定條帶大小,條帶等於chunk比上brk大倍數
列出模塊:lsmod
mdadm:用戶空間工具,管理工具
MD:Meta Device /dev/dm#
DM:Device Mapper 提供邏輯設備 RAID,LVM2
實現動態增減
DM是LVM2的核心
快照
多路徑
raid只是防止硬件損壞的數據保護機制,並沒有法保護誤刪除之類的人爲操做性數據丟失狀況。
zfs文件系統就能夠實現快照功能和卷功能
PV:Physical Volume 物理卷
建立:pvcreate
pvcreate /dev/sda{10,11} 實際狀況建立爲設備pvcreate /dev/sda
刪除:pvremove
掃描:pvscan
查看:pvdisplay
移動:pvmove ,主要用於將要移除的某個PV設備中的PE數據塊移至其餘PV
pvmove /dev/sda11 將sda11分區上的pe數據挪走
PE:Physical Extend 物理盤區,相似raid中的chunk條帶,劃分爲多個區塊
VG:Volume Group 卷組
建立:vgcreate myvg爲卷組名可自定義
vfcreate myvg /dev/sda{10,11}
-s #:可指定pe盤區大小,默認pe盤區大小爲4MB 例:vfcreate -s 8M myvg /dev/sda{10,11}
刪除:vgremove
vgremove myvg
增長:vgextend
vgextend myvg /dev/sda12
縮減:vgreduce 縮減前必定要將此pv中的pe使用pvmove挪走
vgreduce myvg /dev/sda11 將sda11從myvg卷組中移除
查看:vgdisplay,vgs
掃描:vgscan
LG:Logical Volume 邏輯卷
建立:lvcreate
lvcreate -n LV_NAME -L #G VG_NAME 例:lvcreate -n testlv -L 50M myvg
刪除:lvremove
lvremove /dev/mapper/myvg-testlv
增長:lvextend
縮減:lvreduce
改變大小:lvresize
查看:lvdisplay,lvs
掃描:lvscan
fdisk命令最多隻能支持到15個分區
建立分區的過程:
物理邊界
物理邊界內部系統邊界
邏輯邊界
1、擴展邏輯卷:
先擴展物理邊界,再擴展邏輯邊界
擴展物理邊界:
lvextend
-L [+]#G /PATH/TO/LV:#指擴展容量
擴展邏輯邊界:
resize2fs
resize2fs /PATH/TO/LV #G:#指原有容量+擴展容量的總量
-p:加-p參數後無需指定#G,指有多大的物理邊界加多大容量
2、縮減邏輯卷:
先縮減邏輯邊界,再縮減物理邊界
縮減容量風險很大,必定不要在線縮減
注意:
一、不能在線縮減,先卸載 df -lh查看分區狀況,umount卸載
二、縮減後的容量能夠容納原有數據
三、在縮減前,應先強行檢查文件系統,確保文件系統處於一致性狀態;
檢測文件系統命令:e2fsck -f /dev/myvg/testlv
縮減邏輯邊界:
resize2fs
resize2fs /PATH/TO/PV #G :#G指縮減後的容量
縮減物理邊界:
lvreduce
-L [-]#G /PATH/TO/LV:#指縮減容量
從新掛載:mount分區
3、快照卷:
快照卷主要做用是備份:
一、生命週期爲整個數據時長,在這段時長內數據增加量不能超出快照卷大小,超出就會損毀;
二、快照卷應該是隻讀的
三、快照卷跟原卷在同一卷組內
建立快照卷:
lvcreate
-s:表示快照卷
-p r|w:指定權限
格式:lvcreate -L #G -n SLV_NAME -s -p r /PATH/TO/LV
例:lvcreate -L 50M -n testlv-snap -s -p r /dev/myvg/testlv
移除快照卷順序:
umount卸載掉使用的快照卷
移除快照卷:
lvremove /dev/myvg/testlv-snap
快照卷至保留建立快照卷那一刻的數據,以後改變數據快照卷中不會保存。
腳本編程控制結構:
順序
選擇
if
case
循環
for
while
until
while CONDITION; do
statment
done
例:
#!/bin/bash
#
read -p "Input someting:" STRING
while [ $STRING != 'quit' ]; do
echo $STRING |tr 'a-z' 'A-Z'
read -p "Again,Input someting:" STRING
done
進入循環:條件知足
退出循環:條件不知足
until循環:
until CONDITION; do
statment
...
done
進入循環:條件不知足
退出循環:條件知足
例:
#!/bin/bash
#
read -p "Input someting:" STRING
until [ $STRING == 'quit' ]; do
echo $STRING |tr 'a-z' 'A-Z'
read -p "Input someting:" STRING
done
while與until相反
until循環樣例:hadoop登陸後腳本中止
#!/bin/bash
#
who |grep "hadoop" &> /dev/null
RETVAL=$?
until [ $RETVAL -eq 0 ]; do
echo "hadoop is not logged in."
sleep 5
who | grep "hadoop" &> /dev/null
RETVAL=$?
done
echo "hadoop is logged in."
簡易寫法:
#!/bin/bash
#
until who |grep "hadoop" &> /dev/null; do
echo "hadoop is not logged in."
sleep 5
done
echo "hadoop is logged in."
for 變量 in 列表;do
循環體
done
另外一種用法:
for (( expr1 ; exprl2 ; expr3 )); do
循環體
done
expr1:指定初始條件
expr2:何時退出循環
expr3:修正這個變量的值
100之內正整數的和
以前寫法:
#!/bin/bash
#
declare -i SUM=0
for I in {1..100}; do
let SUM+=$I
done
echo $SUM
新寫法:
#!/bin/bash
#
declare -i SUM=0
for ((I=1;I<=100;I++)); do
let SUM+=$I
done
echo $SUM
100之內全部偶數的和
#!/bin/bash
#
declare -i SUM=0
for ((I=2;I<=100;I+=2)); do
let SUM+=$I
done
echo $SUM
ping一個IP段,查看地址段內的IP是否存活
ping
-c #:指定ping的次數,ping #次結束
-W #:指定ping的超時秒數,ping #秒結束
awk
取值用法:
awk 'PATTERN {ACTION}' file
print $1
例:df -Ph |awk '{print $1,$3}'
$1:表示第一列;
$0:表示一整行的全部字段
NF:表示字段個數
$NF:最後一個字段
awk -F: '{print $1,$3}' /etc/passwd
-F:指定分隔符,默認狀況下爲空白
腳本完成磁盤分區格式化
取出現有磁盤:
fdisk -l 2> /dev/null |grep "^Disk /dev/[sh]d[a-z]" |awk -F: '{print $1}'
刪除一塊磁盤的全部數據:將分區表覆蓋掉便可
dd if=/dev/zero of=/dev/sdb bs=512 count=1
sync 把內存中的全部內容同步至磁盤
vim setpart.sh
#!/bin/bash
#
echo 'n
p
1
+20M
n
p
2
+512M
n
p
3
+128M
t
3
82
w' | fdisk /dev/hda
以上
寫個腳本
一、列出當前系統全部磁盤,讓用戶選擇,若是quit則退出,若是選擇錯誤提示從新選擇
二、當前用戶選擇後,提醒用戶確認接下來的操做可能會損壞數據,並請用戶確認,若是用戶選擇y就繼續,不然讓用戶從新選擇
三、抹除那塊硬盤上的全部分區(提示:抹除全部分區後執行sync命令,並讓腳本睡眠3秒鐘後再分區);並未其建立三個分區,第一個20M,第二個512M,第三個128M,且第三個爲swap分區類型;(提示:將分區命令經過echo傳送給fdisk便可實現)
vim partdisk.sh
#!/bin/bash
#
echo "Initial a disk ..."
echo -e "\033[31mWarning: \033[0m "
fdisk -l 2> /dev/null |grep -o "`Disk /dev/[sh]d[a-z]"
read -p "Your choice: " PARTDISK
if [ $PARTDISK == 'quit' ]; then
echo "quit"
exit 7
fi
until fdisk -l 2> /dev/null |grep -o "`Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK$" &>/dev/null; do
read -p "Wrong option,Your choice agein: " PARTDISK
done
read -p "Will destroy all data,continue" CHOICE
until [ $CHOICE == 'y' -o $CHOICE == 'n' ]; do
read -p "Wrong option,Your choice agein: " CHOICE
done
if [ $CHOICE == 'n' ]; then
echo "Quit"
exit 9
else
dd if=/dev/zero of=$PARTDISK bs=512 count=1 &> /dev/null
sync
sleep 3
echo "Partition"
echo 'n
p
1
+20M
n
p
2
+512M
n
p
3
+128M
t
3
82
w' | fdisk $PARTDISK &> /dev/null
partprobe $PARTDISK
sync
sleep 2
mke2fs -j ${PARTDISK}1 &> /dev/null
mke2fs -j ${PARTDISK}2 &> /dev/null
mkswap ${PARTDISK}3 &> /dev/null
fi
找到對應mount點自動卸載
vim umount.sh
#!/bin/bash
#
for I in `mount |grep "/dev/sdb" | awk '{print $1}'`; do
fuser -km $I
umount $I
echo :$I unmount ok."
done
網絡經過協議protocol進行傳輸和信號轉換
10Mbps的含義是每秒鐘傳輸的bit個數,每秒傳輸10M個bit
若是換算成咱們熟知的MB=MByte就須要把10Mbps/8 除以8以後得出大B字節
線路仲裁:解決某個時刻哪一個主機能夠使用某個傳輸介質,避免網絡衝突
以太網的核心標誌:
CSMA/CD:Carrier Sense Multi Access Collision Detection 載波偵聽多路訪問,衝突檢測
發送信號前,先探測線路是否忙碌,若是空閒當即發送信號,如忙碌則回退等待一段時間後再發起探測
IBM商業化專利產品,因此未流行起來:
令牌環網絡:此網絡中游走着一個令牌環token,誰須要發送信號就抓住這個令牌環就能夠發送信號。只有持有令牌環的主機才能夠發送信號
星型網絡結構:
也能夠理解成爲總線型網絡,典型的HUB集線器組成的網絡
MAC:media Access Control 介質訪問控制,每臺主機網絡中的標識符
MAC地址每每被封裝在TCP報文的首部,報頭
ARP:將邏輯地址(IP地址)轉換成MAC地址的過程
RARP:反向解析,將MAC地址解析爲邏輯地址(IP地址)
網橋:鏈接兩個網絡的設備,有效隔離兩個網絡的衝突
網關:兩個網絡之間通訊的接口,在兩個網絡之間轉發報文。
子網掩碼:標記網絡位和標記網絡地址,換算1與任何數相遇都得任何數,0與任何數相遇都得0
廣播:一對多
單播:一對一
半雙工:同一時刻只能向一方發送信號,同軸線
全雙工:同一時刻兩個主機能夠相互發送信號,雙絞線:綠橙白棕,
電子是由負極流向正極;電子流動過程中,會有電阻將信號衰減,所以遠距離的傳輸信號會差。
中繼器:經過中繼器來將減弱的信號從新加壓加強。
交換機:最核心的功能爲內置學習的主機與對應端口的表,利用此表進行轉發傳輸。
路由表:標記每一個網絡域對應的接口位置的表,實現不一樣網絡間的通訊
路由器學習路由:經過RIP2\OSPF等協議學習不一樣路由過程
端口號:同一個主機上的不一樣進程的標記,能夠經過端口號作主機進程之間通訊。端口號範圍:0-65536
被動打開:有人訪問端口再開放
主動打開:有沒有人端口都保持開放狀態
套接字(socket):IP與端口的綁定,IP:port
OSI(開放互聯參考模型) 7層網絡協議:
物理層:封裝報文的前導碼,報文的分隔符
數據鏈路層:封裝MAC,記錄源MAC和目標MAC
網絡層:封裝IP,記錄源IP和目標IP
傳輸層:封裝端口,記錄源端口和目標端口
會話層:雙方創建會話過程
表示層:加密解密,是否壓縮
應用層:具體應用協議,HTTP\HTTPS\FTP等等
TCP/IP協議:
物理層:封裝MAC,記錄源MAC和目標MAC
網絡層:封裝IP,記錄源IP和目標IP
傳輸層:封裝端口,記錄源端口和目標端口
應用層:具體應用協議,HTTP\HTTPS\FTP等等
IP地址分類:
A類地址:第一段爲網絡地址,後面三段全爲主機地址;範圍:2的24次方-2個主機 255.0.0.0 8位掩碼 首位:0-127 127個A類地址,127位迴環地址不可用,有效地址爲1-126。2的7次方-1個A類網絡
B類地址:前兩段爲網絡地址,後兩段爲主機地址;範圍:2的16次方-2個主機 255.255.0.0 16位掩碼 首位:128-191 64個B類地址,2的14次方個B類網絡
C類地址:前三段爲網絡地址,最後一段爲主機地址;範圍:2的8次方-2個主機 255.255.255.0 24位掩碼 首位:192-223 32個C類地址,2的7次方個主機地址,反之2的21次方的C類網絡
D類地址:範圍:224-239
E類地址:範圍:剩餘
私有地址:
A類:10.0.0.0/8
B類:172.16.0.0/16-172.31.0.0/16
C類:192.168.0.0/24-192.168.255.0/24
網絡路由:目的地址是網絡的
主機路由:目標地址是主機的
0.0.0.0表示任意主機,默認路由或缺省路由
劃分子網:
從主機位取出部分來做爲網絡位使用;
IP地址每一段共8位借出2位8-2=6位
每一位能夠容納多少主機?2的6次方減2=62個
網絡變化:
00
01
10
11
不考慮全0和全1
01 00 0001 - 01 11 1110:
網絡地址:201.1.2.64 廣播地址:201.1.2.127 子網掩碼:26位
65 - 126
10 00 0001 - 10 11 1110
網絡地址:201.1.2.128 廣播地址:201.1.2.191 子網掩碼:26位
129 - 190
反之還能夠合併爲一個大網
TCP:Transmission Control Protocol傳輸控制協議
通過三次握手創建會話,每次都會有對端確認纔會傳輸報文。
典型協議:HTTP、HTTPS、FTP、POP三、SMTP
UDP:User Datagram Protocol用戶數據報協議
報文傳輸只是將報文放置網絡中,無論是否傳輸到目的,若是沒發送成功會將報文原路返回。
典型協議:DNS、DHCP、TFTP
報文內容:
源端口號(16位);目的端口號(16位);
序列號(32位);
確認號(32位);
首部長度(4位);保留位(3位);緊急位URG,確認位ACK,推送位PSH(須要當即傳輸的位,不緩存),重置位RST(網絡抖動,斷開,從新創建鏈接的過程),同步位SYN,斷開FIN;窗口大小(16位)接收方緩衝區預留的個數和鏈路中可存儲的個數;
TCP校驗和(16位);緊急指針(16位);
可選段位;
數據包;
TCP傳輸過程:
源端首選發送請求發起:
SYN=1(請求),sn=100(請求序列號)
對端返回請求確認:
SYN=1(請求應答),ACK=1(確認請求),an=101(迴應請求序列號收到並回應能夠繼續發送),sn=300(給源端返回的報文序列號)
源端再次確認對端請求:
ACK=1(確認請求),sn=101(第101個請求報文),an=301(確認對端的第300個報文)
開始傳輸數據,已創建鏈接通訊過程:
發送,確認收到返回,再次發送的過程
發送斷開鏈接請求;
FIN=1
而後對端確認斷開請求;
ACK=1
而後對端再發起斷開請求;
FIN=1
源端確認斷開請求;最終斷開鏈接;
ACK=1
3次握手,4次斷開
User Space:全部用戶進程都在用戶空間運行
Kernel Space:全部內核功能所有在內核空間運行,網絡功能,文件系統等功能
bonding網卡來完成網卡冗餘
主機接入網絡步驟:
IP
NETMASK
GATEWAY
HOSTNAME
linux下可配置3個DNS地址
DNS1
DNS2
DNS3
手動指定
DHCP:Dynamic Host Configuration Protocol
路由
linux網絡功能屬於內核功能:
lo接口:本地迴環
eth[0-9]:以太網網卡
ppp[0-9]:點對點鏈接
RHEL5:
在/etc/modprobe.conf中有隊硬件設備的別名設置,定義了eth0和eth1對應的設備驅動
RHEL6:
在/etc/udev/rules.d/目錄下有個70-persistent-net.rules文件,明肯定義了網卡的MAC地址對應的eth0和eth1的名稱
ifconfig:關於網卡是任何屬性,RX表明接受到的報文個數,TX表明發送的數據報個數,txqueuelen傳輸隊列的長度,接收到的字節數和發送的字節數等等,
ifconfig eth[0-x]
-a:顯示全部接口的配置信息
-n:以數字方式顯示各主機或端口等相關信息
ifcofnig ethx IP/MASK [up|down]
配置當即生效,但重啓網絡服務或主機,都會失效
網絡服務:
RHEL5:/etc/init.d/network [start|stop|restart|status]
RHEL6:/etc/init.d/NetworkManager [start|stop|restart|status]
在THEL6中可禁用上面的方式迴歸RHEL5的使用方式
禁用方法;
網關:
route:Flags顯示U爲開啓的路由,UG是網關路由,無需路由經過網關可直接到達的。
格式:
route add -net|-host DEST gw NEXTHOP
route add default gw NETXTHOP
add:添加路由
-host:主機路由
-net:網絡路由
-net 0.0.0.0 如:route -net 10.0.0.0.0/8 gw 192.168.10.1
del:刪除路由
-host
-net
例:route del -net 10.0.0.0/8 [gw NEXTHOP]
route del -net 0.0.0.0
route del default
配置當即生效,但重啓網絡服務或主機,都會失效
網絡配置文件:
/etc/sysconfig/network
網絡接口配置文件:
/etc/sysconfig/network-script/ifcfg-INTERFACE_NAME
DEVICE=:關聯的設備名稱;要與文件名的後半部保持一致「INTERFACE_NAME」
BOOTPROTO={static|none|dhcp|bootp}:引導協議;要使用靜態地址,使用static或none;dhcp表示使用DHCP獲取地址;
IPADDR=:IP地址
NETMASK=:子網掩碼
GATEWAY=:設定默認網關
ONBOOT=:開機時是否自動激活此網絡設備
HWADDR=:硬件地址,要與硬件中的地址保持一致,可省;
USERCTL={yes|no}:是否容許普通用戶控制此接口;
PEERDNS={yes|no}:是否在BOOTPROTO爲dhcp時接受由DHCP服務器指定的DNS地址;
不會當即生效,但重啓網絡服務或主機都會生效,永久生效的配置方式。
永久生效路由配置方式:
/etc/sysconfig/network-script/route-ethx
添加格式1:
DEST via NETXTHOP
例:
在route-ethx文件中添加 192.168.10.0/24 via 10.10.10.254
添加格式2:
ADDRESS0=
NETMASK0=
GATEWAY0=
例:
ADDRESS0=192.168.10.0
NETMASK0=255.255.255.0
GATEWAY0=10.10.10.254
DNS服務器指定方法只有一種:
vim /etc/resolv.conf
nameserver DNS_IP_1
nameserver DNS_IP_2
nameserver DNS_IP_3
指定本地解析:
vim /etc/hosts
添加內容:
172.16.0.1 www.magedu.com www
主機IP 主機名 主機別名
正常解析順序:
DNS緩存-->hosts-->DNS服務器
配置主機名:
hostname HOSTNAME 當即生效,但不是永久有效
/etc/sysconfig/network 重啓也可生效
HOSTNAME=:寫入主機名
更改文件以後不會當即生效,甚至重啓網絡服務都不會生效,須要手動執行hostname hello.magedu.com來生效
NETWORKING=[yes|no] 本機是否啓用網絡功能的總開關,設置爲no若是配置IP都不能生效
NETWORKING_IPV6=[yes|no]:是否啓用IPV6
GATEWAY=:全局的默認網關;若是網卡也設置了網關,那麼誰的範圍小誰來生效
RHEL5:
setup:system-config-network-tui
system-config-network-gui :必須圖形化界面使用
ifconfig,老舊命令
iproute2包提供了ip命令
ip
link:網絡接口屬性
addr:協議地址,ip地址
route:路由
link:
show:查看IP地址信息
ip -s link show:查看每一個網卡流量的詳細信息
set DEVICE {up|down|arp {on|off}}: 例如:ip link set eth1 down 關閉eth1網卡
promisc {on|off}:混雜模式,抓包時會用到
mtu MTU值:設置MTU值
dynamic {on|off}:
multicast {on|off}:啓用關閉多個功能
txqueuelen PACKETS:指定傳輸隊列的長度
name NEWNAME:更改網卡名稱
addr:
add:添加地址
ip addr add ADDRESS dev DEV_NAME
例:ip addr add 10.2.2.2/8 dev eth1 也能夠添加secondary非主要地址,用ip addr show 查看,ifconfig是查看不到的
也能夠使用ip addr add 10.2.2.2/8 dev eth1 label eth1:1 來添加別名,這樣用ifconfig就能夠查到了
del:刪除地址
ip addr del ADDRESS dev DEV_NAME
例:ip addr del 10.2.2.2/8 dev eth1
show:查看地址
to:模糊查找
ip addr show eth1 to 192.168.100/24 能夠使用to匹配完整的地址信息
label:只顯示別名地址
flush:清除地址,一次性刪除多個地址
ip addr flush eth1 to 10/8 將10開頭的8位子網掩碼的地址所有刪除
route:
blackhole:黑洞,把網絡引向一個黑洞
unreachable:主機不可達,主機存在但不讓外界感知時可用
prohibit:禁ping
add:添加路由
例:ip route add to 10.0.0.0/8 dev eth0 via 172.16.0.1 添加一條路由10.0.0.0網絡經過eth0設備通往下一跳地址172.16.0.1
change:修改路由
replace:替換路由
to PREFIX(default):到某個地址
via ADDRESS:經過網關
dev DEVNAME:指定設備
show:查看路由信息
to SELECTOR:顯示某個路由,支持模糊查找
flush:清除路由表
to PREFIX:清除某些路由,支持模糊查找清除
tc命令可實現流量控制
linux下一塊網卡能夠使用多個地址;
網絡設備能夠別名:
eth0
ethX:X,eth0:0,eth0:1,....
方法:
ifconfig eth0:0 172.16.200.33/16 臨時生效
永久生效方法:
新建文件ifcfg-ethX:X
/etc/sysconfig/network-scripts/ifcfg-ethX:X
DEVICE=ethX:X
...
非主要地址不能使用DHCP動態獲取;
軟件包管理:
應用程序:
程序,Architecture
程序:指令+數據
C語言:源代碼-->(編譯)二進制格式
腳本:解釋器(二進制程序)
源代碼-->編譯(轉換爲二進制格式)-->連接()-->運行
程序:
庫:
靜態
動態
靜態連接
動態連接
共享庫
配置文件:
通常由變量組成
lnux下全部目錄
/boot
/etc
/usr
/var
/dev
/lib
/tmp
/bin
/sbin
/proc
/sys
/mnt
/media
/home
/root
/misc
/opt
/srv
系統啓動就須要用到的程序,這些目錄不能掛載額外的分區,必須在根文件系統的分區上:
二進制程序 /bin,/sbin
庫 /lib
配置文件 /etc
幫助文件 /user/share/man
操做系統的核心功能,能夠單獨分區:
/usr/
bin
sbin
lib
第三方軟件,徹底獨立的運行環境,能夠單獨分區:
/usr/local
bin
sbin
lib
etc
man
早期的第三方軟件安裝位置
/opt
內核自我管理的分區,默認爲空,不能單獨分區:
/proc
/sys
設備目錄,不能單獨分區:
/dev
udev:動態建立設備文件,2.6內核提供的新功能
用戶目錄存放位置
/home
管理員家目錄,不可單獨分區
/root
日誌文件存放目錄,建議單獨分區
/var
內核,initrd(initramfs)
/boot
內核:
系統啓動過程:bootloader沒法識別LVM,所以boot分區須要做爲基本分區使用,建立500M便可
POST自檢-->BIOS(HD)-->(MBR)bootloader(文件系統結構,ext二、ext3,xfs)-->內核
程序:指令+數據
指令:芯片
CPU:普通指令,特權指令
指令集
C語言:
PowerPC:二進制格式
x86:
x86:彙編
powerpc:彙編
軟件包管理器:
打包成一個文件:二進制程序,庫文件,配置文件,幫助文件
生成數據庫,追蹤所安裝的每個文件
軟件包管理器的核心功能:
一、製做軟件包;
二、安裝、卸載、升級、查詢、校驗;
三大主流軟件包髮型廠商:RedHat,SUSE,Debian
RedHat,SUSE:RPM
RedHat Package Manager
RPM is Package Manager
Debian:dpt
依賴關係:
x-->y-->z 循環依賴關係
前段工具:update,apt-get,yum:Yellowdog Update Modifier
後端工具:RPM,dpt
rpm命令:
rpm:
數據庫:/var/lib/rpm目錄下
rpmbuild:
安裝、查詢、卸載、升級、校驗、數據庫的重建等工做;
rpm命名:
包:組成部分
主包:
bind-9.7.1-1.i586.el5.rpm
子包:
bind-libs-9.7.1-1.i586.el5.rpm
bind-utils-9.7.1-1.i586.el5.rpm
包名格式:
name-version-release.arch.rpm
bind-major.minor.release-release.arch.rpm
主版本號:重大改進
次版本號:某個子功能發生重大變化
發行號:修正了部分bug,跳轉了一點功能
源代碼包:bind-9.7.1.tar.gz
rpm包格式:
二進制格式:安裝簡單,默認狀況下均爲二進制格式
二進制格式的rpm包是由做者下載源程序,編譯配置完成後,製做成rpm包的
noarch表示無需平臺支持,任何平臺均可以安裝
源碼格式:須要編譯,更有益發揮硬件性能
rpm:
一、安裝:
rpm -ivh /PATH/TO/PACKAGE_FILE
-v:顯示安裝詳細過程
-vv:顯示更詳細的過程
-h:以#顯示進度 ;每一個#號顯示2%的進度
--nodeps:忽略依賴關係;但可能致使軟件安裝後沒法正常使用
--replacepkgs:從新安裝,替換原有安裝
--replacepkgsfile:替換文件
--oldpackage:降級,降回原來版本
--force:強制安裝,能夠實現重裝或降級
二、查詢:
rpm -qa PACKAGE_NAME 例:rpm -qa z*
-q:查詢
--scripts:查詢指定包中包含的腳本
-qa:查詢全部rpm包
-qi:查詢指定包的說明信息
-ql:查詢指定包安裝後生成的文件列表
-qf /PATH/TO/SOMEFILE:查詢指定的文件是由哪一個rpm包安裝生成的;
-qc:查詢指定包安裝的配置文件
-qd:查詢指定包安裝的幫助文件
若是某個rpm包還沒有安裝,咱們須要查詢其說明信息、安裝之後會生成的文件;
rpm -qpi /path/to/package_file
rpm -qpl /path/to/package_file
三、升級
rpm -Uvh /PATH/TO/NET_PACKAGE_FILE:若是裝有老版本的,則升級;不然,安裝
rpm -Fvh /PATH/TO/NET_PACKAGE_FILE:若是裝有老版本的,則升級;不然,退出
--oldpackage:降級,後跟降級的包
四、卸載
rpm -e PACKAGE_NAME
--nodeps:忽略依賴關係;
五、校驗
rpm -V PACKAGE_NAME 能夠查看包相關的文件或文件內容是否有缺失
六、重建數據庫
rpm數據庫位置:/var/lib/rpm
rpm
--rebuilddb:重建數據庫,必定會從新創建;
--initdb:初始化數據庫,沒有才創建,有就不用創建;
七、檢驗來源合法性,及軟件包完整性:
加密類型:
對稱:加密解密使用同一個祕鑰
公鑰:一對兒祕鑰,公鑰,私鑰;公鑰隱含於私鑰中,能夠提取出來,並公開出去;
單向:
redhat中在/etc/pki/rpm-gpg目錄下有一個文件RPM-GPG-KEY-redhat-release
rpm -K PACKAGE_NAME
dsa,gpg:驗證來源合法性,也即驗證簽名;
sha1,md5:驗證軟件包完整性;能夠使用--nodigest,略過此項
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release:導入祕鑰文件
rpm -K --nodigest PACKAGE_NAME 只驗證簽名不驗證完整性
rpm --> yum
yum repository yum倉庫
文件服務
ftp
web
local file
yum client
配置文件
yum倉庫
RedHat
DVD
rpm包
元數據文件
createrepo
每一個RedHat系統光盤中的server目錄下爲系統自帶的全部rpm包以及repodata元數據目錄
HTML:Hypertext Mark Language 超文本標記語言
XML:eXtened Mark Language 可擴展標記語言
XML,JSON:半結構化的數據
yum倉庫中的元數據文件:
primary.xml.gz
全部RPM包的列表;
依賴關係;
每一個RPM包安裝生成的文件列表;
fileliests.xml.gz
當前倉庫中全部RMP包的全部文件列表;
other.xml.gz
額外信息,好比RPM包的修改日誌;
repomd.xml
記錄的是上面三個文件的時間戳以及校驗和
comps*-.xml
RPM包分組信息
RedHat6的repodata元數據目錄在光盤根目錄下
yum目錄掛載點RedHat5:ftp://172.16.0.1/pub/{Server,VT,Cluster,ClusterStorage}
配置文件:/etc/yum.conf
cachedir:yum緩存的目錄,yum在此存儲下載的rpm包和數據庫,通常是/var/cache/yum。
debuglevel:除錯級別,0──10,默認是2
logfile:yum的日誌文件,默認是/var/log/yum.log。 pkgpolicy:包的策略。一共有兩個選項,newest和last,這個做用是若是你設置了多個repository,而同一軟件在不一樣的repository中同時存在,yum應該安裝哪個,若是是newest,則yum會安裝最新的那個版本。若是是last,則yum會將服務器id以字母表排序,並選擇最後的那個服務器上的軟件安裝。通常都是選newest。 distroverpkg:指定一個軟件包,yum會根據這個包判斷你的發行版本,默認是redhat-release,也能夠是安裝的任何針對本身發行版的rpm包。 exactarch,有兩個選項1和0,表明是否只升級和你安裝軟件包cpu體系一致的包,若是設爲1,則如你安裝了一個i386的rpm,則yum不會用1686的包來升級。
retries,網絡鏈接發生錯誤後的重試次數,若是設爲0,則會無限重試。 tolerent,也有1和0兩個選項,表示yum是否容忍命令行發生與軟件包有關的錯誤,好比你要安裝1,2,3三個包,而其中3此前已經安裝了,若是你設爲1,則yum不會出現錯誤信息。默認是0。
除了上述以外,還有一些能夠添加的選項,如exclude=,排除某些軟件在升級名單以外,能夠用通配符,列表中各個項目要用空格隔開,這個對於安裝了諸如美化包,中文補丁的朋友特別有用。
gpgchkeck= 有1和0兩個選擇,分別表明是不是否進行gpg校驗,若是沒有這一項,默認好像也是檢查的。
yum倉庫配置文件:/etc/yum.repos.d/目錄下,只保留.repo結尾的文件便可
rhel-debuginfo.repo文件
如何爲yum定義repo文件:
[Repo_ID] 倉庫ID,惟一標識符
name=Description
baseurl=訪問路徑,有一下三種格式
ftp://
http://
file:///
enabled={1|0} 1爲啓用0位禁用
gpgcheck={1|0} 是否檢查軟件包來源的合法以及完整性,默認是1開啓的,開啓時須要指定gpgkey
gpgkey=指定路徑
yum命令:
install:安裝包
-y:自動回答爲yes
--nopgpcheck:無需檢查來源包
update:升級包
update-to:升級到所指定的版本
check-update:檢測有多少可用更新
remove|rease:卸載包
provides|whatprovides:查看指定的文件或特性是由哪一個包安裝生成的
list:列出yum倉庫當中的全部包
支持glob
all:默認
available:倉庫中有但未安裝的,可用的
installed:已經安裝的
updates:可用的升級包
repolist [all|enabled|disabled]:顯示repo列表及其簡要信息
all:
enabled:默認
disabled
clean:清除緩存
packages:清理RPM包
headers:詳細信息
metadata:元數據文件
dbcache:庫緩存
all:全部,經常使用
groupinstall:安裝組
localinstall:本地安裝
downgrade:降級
reinstall:從新安裝
search:查找
yum倉庫配置文件爲server.repo文件,手動建立
vim /etc/yum.repos.d/server.repo
[Base]
name=RHEL5 Server
baseurl=ftp://172.16.0.1/pub/Server
enabled=1
gpgcheck=0
[VT]
name=RHEL5 VT
baseurl=ftp://172.16.0.1/pub/VT
enabled=1
gpgcheck=0
或者寫成本地目錄:
vim /etc/yum.repos.d/server.repo
[Base]
name=RHEL5 CDROM Server
baseurl=file://media/cdrom/Server
enabled=1
gpgcheck=0
如何建立yum倉庫:
yum install createrepo
建立一個本地目錄/yum/VT,將CDROM裏VT下的內容拷貝到本地目錄下,而後寫配置文件到本地路徑
[VT]
name=VT
baseurl=file:///yum/VT
enabled=1
gpgcheck=0
使用createrepo /yum/VT/ 命令從新建立一下yum源,完成後能夠完成依賴關係的文件建立,才能夠正常使用本地yum源
還須要
cp comps-rhel5-vt.xml /root 拷貝依賴關係文件到本地
createrepo -g /root/comps-rhel5-vt.xml /yum/VT/ 再次建立yum源,這樣依賴關係yum源文件就指定到了root目錄下的本地配置文件
RPM安裝:
二進制格式;
源程序-->編譯-->二進制格式
有些特性是編譯選定的,若是編譯未選定此特性,將沒法使用
rpm包的版本會落後於源碼包,甚至落後不少;bind-9.8.7,bind-9.7.2
定製:手動編譯安裝
編譯環境,開發環境
開發庫,開發工具
linux:c語言開發
GNU軟件:c語言
C環境,C++
純靜態語言
C開發工具gcc:GNU C Complier,C
C++開發工具g++:
make:項目管理工具,
makefile:定義了make(調用gcc,g++)按何種次序去這些源程序文件中的源程序
automake,--> makefile.in --> makefile
autoconf,--> configure 用戶選擇啓用和禁用程序特性
make install 編譯好的文件放置相應的目錄中
編譯安裝的三步驟:
前提:準備開發環境(編譯環境)
安裝「Development Tools"和」Development Libraries「 「Compatibility libraries」
使用yum grouplist 命令查看上面的工具是否已安裝,安裝後才具有編譯環境
#tar
#cd 解壓源程序目錄下
#./configure
--help
--prefix=/path/to/somewhere
--sysconfdir=/PATH/TO/CONFFILE_PATH
功能:
一、讓用戶選定編譯特性;
二、檢查編譯環境;
#make
#make install
一、修改PATH環境變量,以可以識別此程序的二進制文件路徑;
修改/etc/profile文件
在/etc/profile.d目錄創建一個以.sh爲後綴的文件,在裏面定義export PATH=$PATH:/usr/local/apache/bin
二、默認狀況下,系統搜索庫文件的路徑/lib,/usr/lib;要增添額外搜尋路徑;
在/etc/ld.so.conf.d/中建立.conf爲後綴的文件,然後把要增添的路徑直接寫至此文件中;
#ldconfig 從新搜尋庫文件
-v:顯示從新搜尋庫文件的過程
vim /etc/ld.so.conf.d/httpd.conf 建立好httpd.conf文件後填寫一下內容:
/usr/local/apache/lib
再使用ldconfig -v|grep apr 會看到多出一條 libaprutil-1.so.0 -> libaprutil-1.so.0.2.7
三、頭文件:輸出給系統
默認:/usr/include
增添頭文件搜尋路徑,使用連接進行;
兩種方式:
ln -s /usr/local/apache/include/* /usr/include/ 或 ln -s /usr/local/apache/include /usr/include/httpd
四、man文件路徑:默認安裝在--prefix指定目錄下的man目錄:/usr/share/man
一、man -M /PATH/TO/MAN_DIR COMMAND 例:man -M /usr/local/apache/man htpasswd
二、/etc/man.config文件中的MANPATH指定了man命令的環境變量路徑 例:在/etc/man.config文件中加入MANPATH /usr/local/apache/man
netstat命令:網絡狀態監測
-r:顯示路由表
-n:以數字方式顯示
-t:創建的TCP鏈接
-u:創建的UDP鏈接
-l:顯示監聽狀態的鏈接
-p:顯示監聽指定的套接字的進程的進程號及進程名
寫一個腳本完成如下功能
說明:此腳本能於同一個repo文件中建立多個yum源的指向;
一、接受一個文件名做爲參數,此文件存放至/etc/yum.repos.d目錄中,且文件名以.repo爲後綴,要求此文件不能實現存在不然報錯;
二、在腳本中,提醒用戶輸入repo id;然後以repo文件的格式將其保存至指定文件中;
三、repo name以及baseurl的路徑,然後以repo文件的格式將其保存至指定文件中;
四、enabled默認爲1,而gpgcheck默認設定爲0;
五、此腳本會循環執行屢次,除非用戶爲repo id指定爲quit;
vim mkrepo.sh
#!/bin/bash
#
REPOFILE=/etc/yum.repos.d/$1
if [ -e $REPOFILE ]; then
echo "$1 exists."
exit 3
fi
read -p "Repository ID:" REPOID
until [ $REPOID == 'quit' ]; do
echo "[$REPOID]" >> $REPOFILE
read -p "Repository name:" REPONAME
echo "name=$REPONAME" >> $REPOFILE
read -p "Repository Baseurl:" REPOURL
echo "baseurl=$REPOURL" >> $REPOFILE
echo -e 'enabled=1\ngpgcheck=0' >> $REPOFILE
read -p "Repository ID:" REPOID
done
echo "hello,world."
循環:while,until,for
break:中斷,提早退出循環
continue:提早結束本輪循環,而進入下一輪循環;
計算1000之內全部整數的和,但當SUM值大於5000時就再也不加
vi sum.sh
#!/bin/bash
#
declare -i SUM=0
for I in {1..1000}; do
let SUM+=$I
if [ $SUM -gt 5000 ]; then
break
fi
done
echo $I
echo $SUM
while的特殊用法一:
while :;do
done
無限循環
while的特殊用法二:
while read LINE; do 注:讀取一個文件,每讀取一行就放在變量LINE中
done < /PATH/TO/SOMEFILE 注:必定要給出讀取的文件路徑
寫一個腳本:
一、判斷一個指定的bash腳本是否有語法錯誤;若是有錯誤,則提醒用戶鍵入Q或q無視錯誤並退出,其餘任何鍵能夠經過vim打開這個指定腳本;
二、若是用戶經過vim打開編輯後保存退出時仍然有錯誤,則重複第1步中的內容;不然,就正常關閉退出
使用方法,syntax.sh爲斷定腳本,a.sh是被斷定語法的腳本
執行:syntax.sh a.sh
bash -n $1 回覆狀態爲0表示沒有語法錯誤,不然就打開腳本
vi syntax.sh
#!/bin/bash
#
until bash -n $1 &>/dev/null; do
read -p "Syntax error,[Qq] to quit,others for editing:" CHOICE
case $CHOICE in
q|Q)
echo "Something wrong,quiting,"
exit 5
;;
*)
vim + $1
;;
esac
done
腳本編程之函數;
function:功能
代碼重用的概念,同一個功能和代碼屢次用到能夠獨立出來寫成一個代碼模塊,以後重複使用中調用這個代碼模塊便可
庫:so,可以被多個進程調用
腳本例子:
vim diskusage.sh
#!/bin/bash
#
cat << EOF
d|D} show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
EOF
read -p "Your chioce: " CHOICE
until [ $CHOICE == 'q' -o $CHOICE == 'Q' ]; do
case $CHOICE in
d|D} df -lh ;;
m|M) free -m |grep "^Mem" ;;
s|S) free -m |grep "^Swap" ;;
q|Q) echo "quit"; exit 0 ;;
*) read -p "Your chioce,again: " CHOICE ;;
esac
read -p "Your chioce: " CHOICE
done
bash腳本中定義函數:把其中某個功能的代碼封裝起來起一個名字,然後在後面須要用到代碼的時候調用他便可
定義一個函數的方法有兩種:
第一種:
function FUNCNAME {
command
}
第二種:
FUNCNAME () {
command
}
好比上面的腳本用函數:
vim showmenu.sh
#!/bin/bash
#
function SHOWMENU {
cat << EOF
d|D} show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
EOF
}
#調用函數就把定義的函數名寫出來便可
SHOWMENU
上面的腳本也能夠寫爲
vim showmenu.sh
#!/bin/bash
#
SHOWMENU() {
cat << EOF
d|D} show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
EOF
}
SHOWMENU
自定義執行狀態返回值:
return #
取值範圍:0-255
vim adduser.sh
#!/bin/bash
#
#定義函數ADDUSER爲若是hadoop用戶不存在則添加用戶而且給用戶定義與用戶名同樣的密碼,執行狀態定義爲0,不然執行狀態定義爲1,給出執行狀態結果。若是用戶不存在建立了用戶返回值則爲0,反之爲1.
ADDUSER () {
USERNAME=hadoop
if ! id -u $USERNAME &> /dev/null; then
useradd $USERNAME
echo $USERNAME | passwd --stdin $USERNAME &>/dev/null
return 0
else
return 1
fi
}
ADDUSER
if [ $? -eq 0 ]; then
echo "add user finished."
else
echo "Failuer."
fi
或者執行多個用戶添加:
#!/bin/bash
#
ADDUSER () {
USERNAME=$1
if ! id -u $USERNAME &> /dev/null; then
useradd $USERNAME
echo $USERNAME | passwd --stdin $USERNAME &>/dev/null
return 0
else
return 1
fi
}
for I in {1..10}; do
ADDUSER user$I
if [ $? -eq 0 ]; then
echo "add user$I finished."
else
echo "add user$I Failuer."
fi
done
接受參數的函數;
./a.sh m n
$1:m
$2:n
跟腳本調用參數同樣,函數也是如此
TWOINT 5 6
$1:5
$2:6
#!/bin/bash
#
TWOSUM() {
echo $[$1+$2]
}
SUM=`TWOSUM 5 6`
echo $SUM
或者執行多個連續相加
#!/bin/bash
#
TWOSUM() {
echo $[$1+$2]
}
for I in {1..10}; do
let J=$[$I+1]
echo "$I plus $J is `TWOSUM $I $J`"
done
寫一個腳本:斷定192.168.0.200-192.168.0.254之間的主機哪些在線。需求:
一、使用函數來實現一臺主機的斷定過程;
vim hostonline.sh
#!/bin/bash
#
PING() {
for I in {200..254}; do
if ping -c 1 -W 1 192.168.0.$I &> /dev/null; then
echo "192.168.0.$I is up."
else
echo "192.168.0.$I is down."
fi
done
}
PING
二、在主程序中來調用此函數斷定指定範圍內的全部主機的在線狀況。
vim hostonline2.sh
#!/bin/bash
#
PING() {
if ping -c 1 -W 1 $1 &> /dev/null; then
echo "$1 is up."
else
echo "$1 is down."
fi
}
for I in {200..254}; do
PING 192.168.0.$I
done
for I in {200..254}; do
PING 172.16.100.$I
done
進程管理
根據程序變化而不斷增加的內存叫作堆內存
進程屬性:
進程號
內存空間:VSZ:虛擬內存大小,RSS:常駐內存集,物理內存空間,不包含被交換出去的內存集。
用戶
父進程
CPU 運行時間
並行編程模型:單進程多線程
process
thread:被分解的進程子體
進程、線程模型:
Stopped:中止狀態,不會被調度
Ready:就緒,排隊等待CPU
Executing:正在運行
Uninterruptible sleep:不可終端的睡眠
Interruptible sleep:可中斷睡眠
Zombie:殭屍進程,致使內存泄漏的一種狀況
系統內核生成的第一個進程爲init,其他進程均爲init的子進程
經過pstree命令能夠查看到進程結構
進程優先級關係:
linux進程優先級從0到139,140種優先級變化,數字越小優先級越高
100-139:由用戶可控制
0-99:內核調整
O標準:
O(1):不管隊列有多長挑選一個時間同樣的,性能最佳
O(n):隊列越長所需時間越長的線性增加
O(logn):隊列長度所需log的時間方式增加
O(n^2):隨着隊列增加呈現快速增加
O(2^n):隨着隊列增加呈現成倍增加
優先級高:
一、得到更多的CPU運行時間;
二、更優先得到運行的機會;
100-139用戶可控級別:
nice值:優雅的,友好的,每一個進程擁有一個nice值
-20到19對應100-139,調整nice值來調整對應的優先級
例:0對應120,-5對應116,nice值越小優先級越高
普通用戶僅可以調大本身的進程nice值
管理員能夠隨意調整
PID:process ID
/proc目錄下,以數字命名的目錄均爲進程PID目錄,每一個目錄對應一個進程,保存進程相關屬性信息
init進程號永遠爲1,其餘進程均爲init的子進程
進程分類:
跟終端相關的進程
跟終端無關的進程
進程狀態:
D:不可中斷的睡眠
R:運行或就緒
S:可中斷的睡眠
T:中止
Z:殭屍態
<:高優先級進程
N:低優先級進程
+:前臺進程組中的進程
l:多線程進程
s:會話進程的首進程
ps命令:process state
SsyV風格:選項需加-
-elF
-e:顯示全部線程
-l:長格式 PRI表示優先級,NI表示nice值
-F:顯示更多詳細信息
BSD風格:選項無需-
aux
a:顯示全部跟終端有關的進程
u:顯示啓動進程的用戶
x:顯示全部跟終端無關的進程
注:加中括號的進程屬於內核進程
-o PROPERTY1,PROPERTY2 指定要顯示的字段。 例:ps -o pid,comm,ni 默認只顯示前臺進程,須要加ax
pstree:顯示當前系統上的進程樹
pgrep:以grep的風格指定符合某種特性的進程
-u:指定某個用戶運行的進程
pidof:按照進程名找到進程號
top:顯示當前系統上進程狀態(動態)5秒更新一次
load average:平均負載,三個數值分別是表示1分鐘,5分鐘,15分鐘的平均隊列長度,值越小CPU負載越低
Tasks:進程運行狀態數量,total總數量,running運行數量,sleeping睡眠狀態數量,stopped中止狀態數量,zombie殭屍狀態數量。
CPU:每一個CPU負載狀況,us用戶佔據的百分比,sy系統佔據的比例,ni表示nice值調整後影響的cpu比例,id空閒比例,wa等待IO完成所佔據的時間,hi硬件中斷佔據的時間,si軟件中斷佔據的時間,st被偷走的時間(虛擬化中經常使用)
Mem:內存,total總數,used使用數,free空閒數,buffers數量(均爲物理內存)
Swap:交換分區,total總數,used使用數,free空閒數,cached數量(均爲物理內存)
動態進程的信息:
PID進程號,USER用戶,PR表示實時優先級,NI表示nice值,VIRT虛擬內存集,RES常駐內存集,SHR共享內存大小,S表示狀態,%CPU佔用CPU百分比,%MEM佔用內存百分比,TIME+表示運行時長真正佔據CPU的時長,COMMAND表示進程名稱
top命令執行時使用參數:
M:根據主流內存大小進行排序
P:根據CPU使用百分比進行排序
T:根據累計時間進行排序
l:是否顯示平均負載和啓動時間
t:是否顯示進程和CPU狀態相關信息
m:是否顯示內存相關信息
c:是否顯示完整的命令行信息
q:退出top
k:終止某個進程
top命令後跟參數:
-d #:指定延遲時長,默認每隔5秒刷新1次,能夠更改間隔秒數,例如:top -d 1 每1秒刷新一次
-b:以批處理模式,順序翻屏式顯示。例如top -d 1 -b
-n #:在批處理模式下,定義只顯示幾屏
vmstat:系統狀態查看命令,使用樣例:vmstat 1 5 註解:動態顯示系統狀態,1爲每隔1秒顯示1次,5爲顯示5次後結束
procs:進程相關內容
r:運行隊列長度
b:阻塞隊列長度
memory:內存相關內容
swpd:交換大小
free:空閒內容
buff:用於緩衝的
cache:用於緩存的
swap:動態顯示交換空間使用狀況
si:從物理內存進入swap分區的頁面數量
so:從swap分區又調回物理內存的頁面數量
io:IO讀寫操做相關內容
bi:有多少磁盤塊被調入到了物理內存
bo:有多少磁盤塊從內存中同步到了磁盤中
system:系統內核相關內容
in:進程中斷個數
cs:上下文進程切換的次數
cpu:CPU性能使用相關內容
us:用戶佔用cpu百分比
sy:系統內核佔用cpu百分比
id:空閒cpu百分比
wa:等待IO
st:被偷走的cpu百分比
free:查看內存以及swap使用狀況
-m:
kill:結束進程
-l:顯示出全部可用信號,實現進程相互通訊
1)SIGHUP:讓一個進程不用重啓,就能夠重讀其配置文件,並讓其新的配置文件生效。例:kill -1 PID 或 kill -SIGHUP PID
2)SIGINT:Ctrl+C相同,中斷一個進程 例:kill -2 PID 或 kill -INT PID
9)SIGKILL:殺死一個進程,強行結束進程 例:kill -9 PID 或 kill -KILL PID
15)SIGTERM:終止一個進程,進程運行完畢後結束 例:kill -15 PID 或 kill -SIGTERM PID
killall COMMAND(進程名):殺死全部主進程以及子進程
pkill COMMAND(進程名):與killall近似
進程間通訊(IPC:Inter Process Communication)
共享內存
信號:Signal
旗語:Semaphore
調整未啓動進程的nice值,在啓動時調整nice值:
nice -n NI(nice值) COMMAND
調整已經啓動的進程的nice值:
renice NI(nice值) PID
前臺:佔據了命令提示符
後臺:啓動以後,釋放命令提示符,後續的操做在後臺完成
命令結尾處使用&符號便可後臺運行
前臺-->後臺:
Ctrl+z:把正在前臺的做業送日後臺,但進程會中止
bg:讓中止的命令在後臺繼續運行:
bg [%JOBID] 百分號用於區別於進程號
jobs:查看後臺的全部做業。做業號,不一樣於進程號
+:命令將默認操做的做業
-:命令將第二個默認操做的做業
fg:將後臺的做業調回前臺
fg [%JOBID] 百分號用於區別於進程號
kill:終止某個做業
kill %JOBID
COMMAND &:讓命令在後臺執行
uptime:顯示結果爲:當前時長,已運行時長,當前多少用戶登陸,平均負載,三個數值分別是表示1分鐘,5分鐘,15分鐘的平均隊列長度,值越小CPU負載越低
/proc/meminfo和cpuinfo均是顯示cpu和內存的相關信息
Linux系統啓動流程
PC:OS(Linux)
POST自檢-->BIOS(Boot-Sequence)-->MBR(bootloader,446k,大於2T之後就要更換GBG格式)-->Kernel(硬件資源調度)-->init(用戶空間的管理工做)-->(ROOTFS)/sbin/init(/etc/inittab)
kernel做用:
文件系統
進程管理
內存管理
網絡管理
安全功能
驅動程序
內核設計風格:
單內核:全部內核功能所有裝載進一個進程中運行,Linux屬於單內核(LWP:輕量級進程)
核心:ko(kernel object)
核心:動態加載 內核模塊
內核模塊:/lib/modules/「內核版本號命名的目錄」
內核名稱:/lib/modules/vmlinuz-2.6.32
內核訪問根目錄過程(須要建立臨時的根文件系統):
chroot:切換根使用,將一個臨時目錄當作根目錄使用,須要有bin/bash文件以及lib依賴庫才能夠完成切換
chroot /PATH/TO/TEMPTOOR [COMMAND..]
ldd:顯示共享庫依賴關係。例如:ldd /bin/bash 列出與bash相關的庫,將依賴庫拷貝到要切換的lib目錄下便可切換
redhat6:ramfs-->initramfs
switch_root:紅帽5的根切換命令
redhat5:ramdisk-->initrd
微內核:根據功能分別建立不一樣的子內核進程進行工做,Windows,Solaris(線程)
啓動的服務不一樣:
運行級別:0-6 共7個級別
0:halt 關機
1:single user mode 單用戶模式,直接以管理員身份切入,相似於windows安全模式。 s,S,single均可以表示單用戶
2:multi user mode 多用戶模式,no NFS 不啓用nfs
3:multi user mode,text mode 只有命令行界面不啓動圖形界面
4:reserved 保留級別,尚且未定義內容
5:multi user mode,graphic mode 啓動圖形界面
6:reboot 重啓
詳解啓動過程:
BootLoader(MBR)
LILO:Linux Loader
GRUB:GRand Unified Bootloader
Stage1:MBR
Stage1.5:識別不一樣類型的文件系統
Stage2:/boot/grub/Stage2關聯同目錄下的grub.conf配置文件
grub.conf文件詳解:
default=0 #設定默認啓動的title編號,從0開始編號
timeout=5 #等待用戶選擇的超時時長,單位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz #指定grub背景圖片
hiddenmenu #隱藏菜單
password --md5 加密密碼串 #添加此項能夠給grub加密碼訪問,加--md5能夠使用加密密碼,使用命令grub-md5-crypt生成加密密碼
#title是不一樣的操做系統的引導標識,能夠多個title信息
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64) #內核標題,或操做系統名稱,字符串,可自由修改
root (hd0,0) #內核文件所在的設備;對grub而言,全部類型硬盤一概爲hd,光盤爲cdrom;hd後面表示第幾塊磁盤,第幾塊分區
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=UUID=a6a649bb-bdde-4e9e-9548-c1e9c5e591e8 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #內核文件路徑及傳遞給內核的參數
initrd /initramfs-2.6.32-358.el6.x86_64.img #ramdisk文件路徑
password --md5 加密密碼串 #密碼加在這裏啓動此內核就須要密碼,上面是編輯時輸入密碼
gimp是linux下的圖形編輯軟件
查看運行級別:
runlevel:
who -r:也能夠顯示運行級別
查看內核release號:
uname -r
安裝或修復grub stage1:
# grub
grub> root (hd0,0) #指定安裝位置
grub> setup (hd0) #安裝命令並指定安裝到的磁盤,只寫磁盤便可
grub> quit #退出
安裝grub第二種方式:
# grub-install --root-directory=/path/to/boot's_parent_dir /path/to/device #這裏指定的root-directory指定的目錄必定是分區時boot所在的位置,最後指定硬盤
從新編輯grub.conf文件在對應的boot父目錄下
安裝命令執行後要執行sync命令進行同步
在--root-directory=/path/to/boot's_parent_dir指定的grub目錄下建立grub.conf文件
default=0 #設定默認啓動的title編號,從0開始編號
timeout=5 #等待用戶選擇的超時時長,單位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz #指定grub背景圖片
hiddenmenu #隱藏菜單
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /vilinux #非真實
initrd /initrd.img #非真實
保存退出後要使用sync從內存同步至硬盤中,不然重啓就無效了
若是不當心將grub.conf配置文件刪除,如何修復:
刪除配置文件重啓後會進入grub> 引導界面按照以下操做恢復
grub> find (hd0,0)/ #輸入到這裏敲tab鍵查看是否有內核文件,確認後執行下面的命令
grub> root (hd0,0) #指定root
grub> kernel /vmlinuz-2.6.18-308.el5 #指定kernel
grub> initrd /initrd-2.6.18-308.el5.img #指定initrd
grub> boot #從新引導系統
kernel初始化的過程:
一、設備探測
二、驅動初始化(可能會從initrd或initramfs文件中裝載驅動模塊)
三、以只讀方式掛載根文件系統
四、裝載第一個進程init(PID:1) /sbin/init:(/etc/inittab)
紅帽6之後使用upstart(ubuntu)代替init進程,d-bus,event-driven事件驅動的基於d-bus的
還有systemd進程,均支持並行啓動多個進程
inittab文件詳解:
id:runlevels:action:process
id:標識符;
runlevels:在哪一個級別運行此行;
action:在什麼狀況下執行此行;
process:要運行的程序;
si::sysinit:/etc/rc.d/rc.sysinit
OS初始化
si:標識符
##:運行級別爲空則是全部運行級別
sysinit:系統啓動時
運行程序爲:/etc/rc.d/rc.sysinit
/etc/rc.d/rc.sysinit所完成的任務:
一、激活的udev和selinux
二、根據/etc/sysctl.conf文件,來設定內核參數;
三、設定系統時鐘;
四、裝載鍵盤映射;
五、啓用交換分區;
六、設置主機名;
七、根文件系統檢測,並以讀寫方式從新掛載
八、激活軟RAID和LVM設備;
九、啓用磁盤配額;
十、根據/etc/fstab,檢測並掛載其餘文件系統;
十一、清理過時的鎖和PID文件;
ACTION:
initdefault:設定默認運行級別
sysinit:系統初始化
wait:等待級別切至此級別時執行
ctrl+alt+del:重啓
powerfail:斷電2分鐘後關機
powerokwait:斷電2分鐘內恢復,取消關機指令
respawn:一旦程序終止,會從新啓動
l0:0:wait:/etc/rc.d/rc 0
rc0.d/
K*
stop
S*
start
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
全部連接腳本所有存在:
/etc/rc.d/init.d,/etc/init.d
服務類腳本:
SysV: /etc/rc.d/init.d
start|stop|restart|status
reload|configtest
雖然前面有井號可是腳本會被讀取
# chkconfig runlevls SS KK:第一組runlevls默認啓動級別,第二組SS啓動優先次序,第三組KK關閉優先次序
當chkconfig命令來爲此腳本在rc#.d目錄下建立連接時,runlevels表示默認建立爲S*開頭的連接,runlevels:-表示,沒有級別默認爲S*開頭的連接除此以外的級別都默認建立爲K*開頭的連接;
S後面的啓動優先級爲SS所表示的數字;K後面關閉優先次序爲KK所表示的數字
# description:用於書名此腳本的簡單功能;\,續行
for I in /etc/rc3.d/K*; do
$I stop
done
for I in /etc/rc3.d/S*; do
$I start
done
##:關閉或啓動的優先次序,數據越小越優先被選定
chkconfig:
--list:列出當前系統上的全部服務以及各運行級別的啓動關閉狀態,獨立守護進程;
--add SERVICE_NAME:加到chkconfig服務列表中
--del SERVICE_NAME:刪除某個chkconfig服務
--level 24 SERVICE_NAME off|on :指定某些級別下SERVICE啓用或關閉
若是省略級別指定不填寫,默認爲2345級別;
樣例腳本:
vim myservice
#!/bin/bash
#
# chkconfig:2345 77 22 #SS和KK最好加起來是99,不強制,不是99也無所謂
# description:Test SERVICE_NAME
#
LOCKFILE=/var/lock/subsys/myservice
status() {
if [ e $LOCKFILE ]; then
echo "Running.."
else
echo "Stopped.."
fi
}
usage() {
echo "`basename $0` {start|stop|restart|status}"
}
case $1 in
start)
echo "Starting.."
touch $LOCKFILE ;;
stop)
echo "Stopped.."
rm -f $LOCKFILE &> /dev/null
;;
restart)
echo "Restarting.." ;;
status)
status ;;
*)
usage ;;
esac
設置開機啓動:
在/etc/rc.local文件中加入命令便可
此文件對應的是/etc/rc.d/rc.local:系統最後啓動的一個服務,準確說應該是執行的一個腳本
REDHAT-5
/etc/inittab的任務:
一、設定默認運行級別;
二、運行系統初始化腳本;
三、運行指定級別對應的目錄下的腳本;
四、設定Ctrl+Alt+Del組合鍵的操做;
五、定義UPS電源在電源故障/恢復時執行的操做
六、啓動虛擬終端(2345級別)
七、啓動圖形終端(5級別)
守護進程的類型:
獨立守護進程:
xinetd:超級守護進程,須要關聯運行級別,負責對瞬時守護進程的管理,是瞬時守護進程的代理人
瞬時守護進程:不須要關聯至運行級別
安裝xinetd進程並啓動後,使用chkconfig --list最下方能夠看到xinetd服務下的瞬時啓動進程狀態
使用chkconfig SERVICE_NAME on 便可啓動
核心:/boot/vmliuz-version
內核模塊(ko):/lib/modules/version
內核設計:
單內核
模塊化設計
微內核:
裝載模塊命令:
insmod
modprobe
www.kernel.org
用戶空間訪問、監控內核的方式:
/proc,/sys與內核打交道的目錄
/proc/sys:/proc目錄大多都是隻讀文件,/proc/sys目錄中的文件不少是可讀寫的,可修改內核參數
向內核文件中寫文件不要vim打開,非文本文件,須要使用如:echo 1 > /proc/sys/vm/drop_caches寫入參數,這裏舉例的命令是清除free -m中buffers和cached數值的
/proc/sys/kernel:目錄下hostname文件,cat此文件與當前主機名一至,echo 主機名到此文件也能夠重命名主機名。
/sys:某些文件可寫
設定內核參數值的方法:
echo VALUE > /proc/sys/TO/SOMEFILE
sysctl命令:
sysctl -W kernel.hostname=「重命名的主機名」 同 echo 重命名主機名 > /proc/sys/kernel/hostname
sysctl -w vm.drop_caches=1 同 echo 1 > /proc/sys/vm/drop_caches
能當即生效,但沒法永久有效。
永久有效,但沒法當即生效:/etc/sysctl.conf
將須要設定的內核參數寫入此文件方法使用sysctl命令的方式寫入
cat /proc/sys/net/ipv4/ip_forward 此文件是說若是此服務器有兩塊網卡,這兩塊網卡之間是否能夠轉發流量包的,容許把本機看成路由器來用
0 表示不可用
1 表示可用
vim /etc/sysctl.conf
將net.ipv4.ip_forward = 0 改成 = 1 保存退出
重啓後就會生效
當即生效使用:
sysctl -p :重讀配置文件 或者 sysctl -w net.ipv4.ip_forward = 1
sysctl -a:顯示全部內核參數及其值
內核模塊管理:
lsmod:列出當前內核中已裝載的模塊,以及被哪一個用戶調用了幾回
modprobe MOD_NAME:裝載某個模塊
modprobe -r MOD_NAME:卸載某個模塊
modinfo MOD_NAME:查看模塊的具體信息
filename:模塊對應的文件路徑
alias:模塊別名
license:模塊許可
descriprion:模塊描述
module_sig:簽名parm:額外的參數
depends:依賴的模塊
insmod /PATH/TO/MODULE_FLES:裝載模塊
rmmod MOD_NAME:移除模塊
depmod /PATH/TO/MODFILE_DIR:生成模塊間的依賴關係,生成後的文件會保存在這個目錄中
內核中的功能除了核心功能以外,在編譯時,大多功能都有三種選擇:
一、不使用此功能;
二、變異成內核模塊;
三、編譯進內核;
如何手動編譯內核:
使用yum grouplist查看 development libraries和development tools是否已安裝,若是未安裝須要安裝後再升級
下載好要升級的內核版本文件
將下載的內核安裝包解壓至/usr/src目錄下,如:tar xf linux-2.6.28.10.tar.gz -C /usr/src
建立連接 ln -sv linux-2.6.28.10 linux 將內核解壓的源碼包連接爲linux目錄
內核模塊安裝選擇:
圖形編譯安裝:
make gconfig:Gnome桌面環境使用,需安裝圖形開發庫:GNOME Software Development
make kconfig:KDE桌面環境,需安裝圖形開發庫:KDE Software Development
yum grouplist查看KDE或GNOME的開發庫是否已安裝
文本菜單編譯安裝:
make menuconfig:以菜單形式進行模塊選擇,連續敲擊空格鍵選擇,選擇完成後使用Esc退出,最後選擇Yes保存並退出
選擇完後再/usr/src/linux目錄下會生成一個.config的文件,就是你所選擇的內核模塊配置信息
使用make命令進行內核編譯過程
在/boot/config-2.6.18-208.el5的文件,是以前內核編譯的配置文件,在編譯前把此文件拷貝到/usr/src/linux/.config 進行覆蓋,再執行make menuconfig就是在以前內核安裝配置基礎上進行功能編輯了。此方法最爲保險
make編譯完成以後
先使用make modules_install安裝內核模塊
而後再使用make install進行安裝
注意:編譯內核時儘可能不要使用遠程鏈接完成,遠程斷開即編譯就會中止,若是使用遠程鏈接編譯安裝內核,則需安裝一個screen工具,yum install screen;能夠在當前窗口中模擬不少窗口,安裝後使用screen命令便可打開多個界面
screen命令:
screen -ls:顯示已經創建的屏幕
screen:直接打開一個新的屏幕
Ctrl+a鬆開後再摁d:拆除屏幕
screen -r ID:還原回某個屏幕
exit:退出
二次編譯時清理:
make clean:清理以前編譯好的二進制模塊
make mrproper:清理以前編譯所殘留的任何操做,包括.config文件,因此執行此命令以前要把.config備份一下
在一個操做系統下添加一塊硬盤從新建立一個操做系統:
grub-->kernel-->initrd-->ROOTFS(/sbin/init,/bin/bash)
先掛載一塊磁盤,並進行fdisk分區
內核加啓動分區:20M
根分區:512M
保存退出,partprobe /dev/hda
mke2fs -j /dev/hda1和2
建立兩個掛載目錄:
mkdir /mnt/{boot,sysroot}
mount /mnt/boot和sysroot
安裝grub:
grub-install --root-directory=/mnt /dev/hda
拷貝系統內核:
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
建立initrd:
mkinitrd initrd文件路徑 內核版本號
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
查看內核文件類型爲gzip文件
file initrd-2.6.18-308.el5.img
cp /boot/initrd-2.6.18-308.el5.img /root
mv initrd-2.6.18-308.el5.img -2.6.18-308.el5.img.gz
gzip -d initrd-2.6.18-308.el5.img.gz
再看文件類型已經變爲ASCII文件了
file initrd-2.6.18-308.el5.img
展開內核文件:
cpio -id <../initrd-2.6.18-308.el5.img <../表示父目錄中的
還能夠用下面命令,免去解壓複製以前的繁瑣操做
zcat /boot/initrd-2.6.18-308.el5.img | cpio -id
編輯init腳本文件:
vim init
找到mkrootdev選項中 把後面的路徑改成你要建立的路徑/dev/hda2便可
把resume開頭的關於SWAP的選項註釋掉
從新打包爲內核鏡像:
當前目錄下執行
find . |cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz 注:找到本目錄下全部文件歸檔-H newc指定類型--quient表示靜默模式,-o表示歸檔複製,使用管道送給gzip -9 >最大壓縮比輸出重定向爲gz文件,最終文件3.4M
建立grub配置文件:
在/mnt/boot/grub下建立grub.conf文件
vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title Test Linux (Magedu Team)
root (hd0,0)
kernel /vmlinuz
initrd /initrd.gz
編輯根文件系統:
cd /mnt/sysroot
mkdir proc sys dev etc/rc.d lib bin sbin boot home var/log usr/{bin,sbin} root tmp -pv
cp /sbin/init /mnt/sysroot/sbin/
cp /bin/bash /mnt/sysroot/bin/bash
ldd /sbin/init 按照提示結果cp庫中沒有的文件
cp /lib/libsepol.so.1 /mnt/sysroot/lib/
cp /lib/libselinux.so.1 /mnt/sysroot/lib/
cp /lib/libc.so.6 /mnt/sysroot/lib/
cp /lib/libdl.so.2 /mnt/sysroot/lib/
ldd /bin/bash
cp /lib/libtermcap.so.2 /mnt/sysroot/lib/
chroot /mnt/sysroot 試着切換至新系統的根目錄,可是有些命令還沒法執行
sync 執行如下同步寫入磁盤
建立inittab文件
vim /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
建立rc.sysinit腳本文件
vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcom to \033[31mMageEdu Team\033[0m Linux."
/bin/bash
保存退出
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
sync 同步配置
建立新的虛擬機,將此虛擬硬盤掛載上,看是否能夠正常引導啓動linux系統
系統正常啓動,可是沒法執行ls等經常使用命令,回到原linux系統進行ls的補全
登陸系統後執行:
ldd /bin/ls
出現依賴的動態連接庫文件,將依賴的庫文件cp到相應的/mnt/sysroot/lib/目錄下
bash腳本的變量截取用法:
FILE=/usr/local/src
${parameter#*word} 變量從左到右截取第一個以/爲分隔符的部分,也就是去除第一個/後面的部分
${parameter##*word} 變量從最後一個/爲分隔符從左到右的部分
如:${FILE#*/} : usr/local/src
${FILE##*/} : src
${parameter%word*} 變量與上面相反從右往左順序查找分隔符,第一個分隔符往左的全都顯示
${parameter%%word*} 變量從右往左找到最後一個分隔符往左的內容顯示
如:${FILE%/*} : /usr/local/
${FILE%%/*} : 爲空由於從右往左最後一個/前面沒有任何字符
寫一個腳本協助完成將動態連接庫文件所有拷貝到新建立的系統lib目錄下
vim bincopy.sh
#!/bin/bash
#
DEST=/mnt/sysroot
libcp() {
LIBPATH=${1%/*}
[ -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
[ ! -e $DEST$(1) ] && cp $1 $DEST$LIBPATH echo "copy lib $1 finished."
}
bincp() {
CMDPATH=${1%/*}
[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
[ ! -e $DEST$(1) ] && cp $1 $DEST$CMDPATH
for LIB in `ldd $1 |grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`
libcp $LIB
done
}
read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continue
COMMAND=`which $CMD |grep -v "^alias"|grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue:" CMD
done
保存退出
腳本執行後按照提示輸入相關命令便可將對應動態庫所有拷貝到新系統中
使用modinfo mii 和 pcnet32 查看filename路徑及文件將其cp到/mnt/sysroot/lib/modules/目錄下
sync:同步一下
執行bincopy.sh腳本將lsmod命令相關庫拷貝過來
編輯系統啓動腳本添加如下內容
vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcom to \033[31mMageEdu Team\033[0m Linux."
insmod /lib/modules/mii.ko
insmod /lib/modules/pcnet32.ko
ifconfig eth0 172.16.100.13/16
ifconfig lo 127.0.0.1/8
/bin/bash
保存退出
這樣系統就能夠認到網絡設備了
系統啓動流程:
POST-->BIOS(Boot sequence)-->BootLoader(MBR)-->kernel(initrd或initramfs)-->init(/etc/inittab,RHEL6:upstart)
RHEL6:
upstart-->init
/etc/inittab
/etc/init/*.conf
/etc/inittab:
設定默認運行級別
系統初始化腳本(/etc/rc.d/rc.sysinit)
運行指定級別的服務腳本
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
rc0.d--rc6.d
K*
S*
00-99:運行次序,數字越小越先被執行
啓動虛擬終端
啓動圖形終端
/etc/rc.d/rc.sysinit:
檢測,而且以讀寫方式從新掛載根文件系統
設定主機名;
檢測並掛載fstab中的其餘文件系統
啓用swap分區
初始化外圍硬件設備的驅動程序
根據/etc/sysctl.conf設定內核參數;
激活LVM和RAID設備;
清理過時的鎖和PID文件;
裝載鍵映射;
/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
/etc/rc.d/rc.sysinit 僅激活了bash
echo
/bin/bash
內核初始化:
硬件探測
裝載驅動
掛載根文件系統(rootfs)
啓動用戶空間中的第一個進程init
讓簡易系統能夠實現如下功能:
一、能夠開關機和重啓
二、主機名;
三、運行對應級別的服務腳本;
四、啓動終端;
五、運行用戶;
六、定義但用戶級別;
七、裝載網卡驅動,啓用網絡功能;
八、提供一個web服務器;
busybox:1M
Kernel:
RHEL5,RHEL6
定製安裝:
自動化安裝
定製引導盤
第一步:複製內核
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
mkdir test
cd test
zcat /boot/vmlinuz-2.6.18-308.el5.img | cpio -id
進入解壓後的test目錄下,編輯init腳本文件
vim init
找到mkrootdev選項中 把後面的路徑改成你要建立的路徑/dev/hda2便可
把resume開頭的關於SWAP的選項註釋掉
DM模塊所有註銷掉
:.,+20s@^@#@g 注:從當前行向下20行,行首爲任意字符的均添加#符號註釋
lib目錄下刪除全部dm開頭的文件
rm -f dm-*
製做爲
find . | cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz
第二步:安裝grub
grub-install --root-directory=/mnt /dev/hda
ls /mnt/boot 檢驗目下是否已經有grub目錄
建立grub配置文件:
在/mnt/boot/grub下建立grub.conf文件
vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title MageEdu Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz
initrd /initrd.gz
保存退出
第三步:建立根文件系統:
cd /mnt/sysroot
建立所需目錄:
mkdir proc sys dev etc/{rc.d/init.d} lib bin proc sys sbin boot media home var/{log,run,lock/subsys,tmp} usr/{bin,sbin} root tmp opt -pv
建立inittab配置文件:
vim /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
建立rc.sysinit腳本文件
vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcom to \033[31mMageEdu Team\033[0m Linux."
/bin/bash
保存退出
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
sync 同步配置
第四步:cp相應的命令動態庫,由於較多所以咱們編寫了bincp.sh腳本執行
運行bincp.sh腳本
依次輸入command:init、bash、ls等命令
sync同步
chroot /mnt/sysroot 切換系統看一下
使用command:touch、mkdir、rm、mv、cat、mount、vi、chmod、chown、vim、umount、ping、ifconfig、insmod、modprobe、rmmod、route、halt、reboot、shutdown、hostname
sync同步
切換虛擬機
獲取可讀寫權限:
mount -n -o remount,rw / 提示mtab文件只讀沒法更新
mount -n :掛載時不更新/etc/mtab文件
cat /proc/mounts :能夠查看當前系統上所掛載的全部文件系統
第五步:提供關機重啓服務
此時,讓新系統關機,直接執行halt命令,只是關閉了進程,但沒法切斷電源
cd /mnt/sysroot
vim etc/rc.d/rc.sysdone
#!/bin/bash
#
sync
sleep 2
sync
exec /sbin/halt -p
保存退出
chmod +x etc/rc.d/rc.sysdone
./bincp.sh 使用此腳本爲sync和sleep拷貝庫文件
在/mnt/sysroot/etc/inittab中添加下行
l0:0:wait:/etc/rc.d/rc.sysdone
保存退出
sync同步
再切換新系統中啓動,使用init 0和halt 都可關機了
重啓還須要再
在/mnt/sysroot/etc/inittab中添加下行
l6:6:wait:/etc/rc.d/rc.reboot
保存退出
sync同步
vim etc/rc.d/rc.reboot
#!/bin/bash
#
sync
sleep 2
sync
exec /sbin/reboot
保存退出
mount -n -o remount,rw /
chmod +x etc/rc.d/rc.reboot
sync同步
此時執行init 6或者reboot便可重啓
關機和重啓腳本
vim /mnt/sysroot/etc/rc.d/init.d/halt
#!/bin/bash
#
case $0 in
*halt)
COMMAND='/sbin/halt -p' ;;
*reboot)
COMMAND='/sbin/reboot' ;;
*)
echo "Only cal this script by *reboot OR *halt;"
;;
esac
case $1 in
start)
;;
stop)
;;
*)
echo "Usage:`basename $0` {start|stop}"
;;
esac
exec $COMMAND
保存退出
chmod +x etc/rc.d/init.d/halt
mkdir rc0.d rc6.d
cd rc0.d
ln -sv ../init.d/halt S99halt
cd rc6.d
ln -sv ../init.d/halt S99reboot
開機自啓動執行K*或S*的開啓或關閉腳本
vim rc
#!/bin/bash
#
RUNLEVEL=$1
for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do
$I stop
done
for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do
$I start
done
保存退出
chmod +x rc
在inittab中更改兩行
l0:0:wait:/etc/rc.d/rc 0
l6:6:wait:/etc/rc.d/rc 6
l3:3:wait:/etc/rc.d/rc 3
cd etc/rc.d/
mkdir rc3.d
建立tserver腳本,顯示服務狀態
使用bincp.sh腳本加載seq、stty命令
vim init.d/tserver
#!/bin/bash
#
#chconfig:35 66 33
#description:test service script
. /etc/rc.d/init.d/function #將function腳本中定義的函數裝載過來
prog=tserver
lockfile=/var/lock/subsys/$prog
start() {
echo "Starting $prog..."
touch $lockfile
[ $? -eq 0 ] && success 「Starting $prog" || failure "Starting $prog"
}
stop() {
echo "Stopping $prog ..."
rm -f $lockfile
[ $? -eq 0 ] && success 「Stopping $prog" || failure "Stopping $prog"
}
status() {
if [ -f $lockfile ]; then
echo "Running..."
else
echo "Stopping..."
fi
}
usage() {
echo "Usage: $prog {start|stop|status|restart}"
case $1 in
start)
start ;;
stop)
stop ;;
restart)
stop
start
;;
status)
status
;;
*)
usage
exit 1
;;
esac
保存退出
chmod +x /init.d/tserver
cd rc3.d
ln -sv ../init.d/tserver S66tserver
cd rc0.d
ln -sv ../init.d/tserver K33tserver
cd rc6.d
ln -sv ../init.d/tserver K33tserver
第六步:加載終端啓動內容
mingetty:啓動終端命令/sbin/mingetty
先使用bincp.sh,將mingetty命令和basename命令加載進新系統
cd /mnt/sysroot/bin
ln -s bash sh
繼續編輯/mnt/sysroot/etc/inittab添加啓動終端命令
1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1
2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2
在執行mingetty時須要執行另一個程序叫login,表示已登陸終端,因此須要添加--loginprog=/bin/bash參數
此時在/mnt/sysroot/etc/rc.d/rc.sysinit腳本中的/bin/bash就能夠刪除了,由於默認啓動終端已經完成bash啓動
sync同步
stty命令能夠顯示串行終端的速率
stty -F /dev/console size 25 80爲顯示終端大小,橫向顯示80個字符,縱向顯示25個字符
stty -F /dev/console speed 38400爲顯示終端速率,每秒顯示的終端字符數量
使用bincp.sh,將agetty加入新系統中
vim /mnt/sysroot/etc/inittab 更改一下內容
1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1
2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2
sync同步
新系統啓動提示找不到inittab文件,說明文件系統錯亂,系統來回切換的過程當中會產生此問題發生,此時來修復文件系統mke2fsck命令能夠修復,可是會致使文件丟失;
cd /mnt/sysroot將根目錄下的全部文件打包備份
find . |cpio -H newc --quiet -o |gzip > /root/sysroot.gz 備份
fuser -km /dev/hda2
umount /dev/hda2
mke2fs -j /dev/hda2 或者 e2fsck -f /dev/hda2
mount /dev/hda2 /mnt/sysroot
cd /mnt/sysroot
zcat /root/sysroot.gz |cpio -id
sync同步,完成修復
第七步:讓根文件系統能直接讀寫方式掛載
cd /mnt/sysroot
vim etc/fstab
/dev/hda2 / ext3 defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
保存退出
vim etc/rc.d/rc.sysinit添加
echo "Remount rootfs..."
mount -n -o remount,rw /
保存退出
mkdir etc/sysconfig
vim network
HOSTNAME=minilinux
保存退出
再編輯vim etc/rc.d/rc.sysinit添加
echo "Set the hostname..."
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
[ -z $HOSTNAME -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME
保存退出
sync同步
第八步:在系統啓動時設置一些啓動成功或失敗的提示信息
cat /etc/rc.d/init.d/functions 定義了一些函數,公共功能啓動時表示出相應的提示信息
定義顯示顏色
vim /mnt/sysroot/etc/rc.d/init.d/functions 此腳本在tserver腳本中裝載函數調用
SCREEN=`stty -F /dev/console size 2> /dev/null`
COLUMNS=${SCREEN#* }
[ -z $COLUMNS ] && COLUMNS=80
SPA_COL=$[$COLUMNS-12]
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
NORMAL='\033[0m'
success() {
string=$1
RT_SPA=$[$SPA_COL-${#string}]
echo -n "$string"
for I in seq 1 $RT_SPA; do
echo -n " "
done
echo -e "[ ${GREEN}OK${NORMAL} ]"
failure() {
string=$1
RT_SPA=$[$SPA_COL-${#string}]
echo -n "$string"
for I in seq 1 $RT_SPA; do
echo -n " "
done
echo -e "[ ${RED}FAILED${NORMAL} ]"
保存
腳本編程知識點:
變量中字符的長度:${$VARNAME}
A=「Startting tserver」
echo ${#A} A爲變量名,在變量明前加#顯示變量字符串長度個數,包括空格
使用stty -F /dev/console size 顯示咱們的物理終端設備顯示的大小第一個數字爲縱向的行,後面的數字爲橫向的列
stty -F /dev/console size | cut -d'' -f2
stty -F /dev/console size | awk '{print $2}'
A=`stty -F /dev/console size`
echo ${A#* } 表示從左往右第一個空格爲分隔符的位置往左的字符顯示出來
echo ${A##* } 表示從左往右最後一個空格爲分隔符的位置往左的字符顯示出來
echo ${A% *} 表示從右往左第一個空格爲分隔符的位置往右的字符顯示出來
echo ${A%% *} 表示從右往左最後一個空格爲分隔符的位置往右的字符顯示出來
第九步:正常系統啓動服務的service常規操做
cd /mnt/sysroot
mkdir lib/modules
modinfo pcnet32 查看模塊是否存在,並查看模塊存放位置,並拷貝到新系統對應位置
cp /lib/modules/2.6.18-308.el5/kernel/deivers/net/pcnet32.ko /mnt/sysroot/lib/modules
cp /lib/modules/2.6.18-308.el5/kernel/deivers/net/mii.ko /mnt/sysroot/lib/modules
按需裝載模塊,啓動網絡服務時裝載
vim etc/rc.d/rc.sysinit 添加如下內容
echo "Initializing network device..."
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
保存退出
配置IP地址
mkdir -pv etc/sysconfig/network-scripts
vim etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=172.16.100.5
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
ONBOOT=yes
保存退出
vim etc/rc.d/init.d/network
#!/bin/bash
#
#chkconfig:35 09 90
#descriprion:network service
prog=network
. /etc/rc.d/init.d/functions
CONF=/etc/sysconfig/network-scripts/ifcfg-eth0
. $CONF
start() {
ifconfig eth0 $IPADDR/$NETMASK up
[ -z $GATEWAY ] && route add default gw $GATEWAY
return 0
}
stop() {
ifconfig eth0 down
}
status() {
ifconfig eth0
}
usage() {
echo "$prog:{start|stop|restart|status}
}
case $1 in
start)
start
success "Config network eth0"
;;
stop)
stop
success "Stop network card eth0"
;;
restart)
stop
start
success "Restart network card eth0"
;;
status)
status
;;
*)
usage
exit 1
;;
esac
保存退出
chmod +x etc/rc.d/init.d/network
在不一樣級別下建立啓動腳本連接文件
cd etc/rc.d/rc0.d
ln -sv ../init.d/network K90network
cd etc/rc.d/rc6.d
ln -sv ../init.d/network K90network
cd etc/rc.d/rc3.d
ln -sv ../init.d/network S09network
sync同步
切換mini系統便可使用service network start 啓動網絡
第十步:編輯用戶登陸以後登陸信息以前的內容
終端提示信息:
/etc/issue內的內容而已
只須要提供此文件便可
cp /etc/issue /mnt/sysroot/etc/issue
而且編輯一下此文件,該爲編輯系統的內容
vim /mnt/sysroot/etc/issue
MageEdu LINUX
Kernel \r on an \m
Mage Education Learning Services
http://www.magedu.com
第十一步:rc.sysinit:掛載額外文件系統/etc/fstab中定義其餘文件系統
grep -E -v "\<swap|proc|sysfs\>" /etc/fstab | awk '{print $1}' | while read LINE; do awk '{print $1}' /proc/mounts | grep "`$LINE`" ; done
使用上面的命令過濾哪些設備還未掛載
vim /mnt/sysroot/etc/rc.d/rc.sysinit
在mount -a下添加:
[ $? -eq 0 ] && success "Mount others filesystem." || failure "Mount others filesystem."
第十二步:如何設定內核參數
/etc/sysctl.conf文件中行首的空白符;
sysctl -p
使用bincp.sh移植sysctl命令
vim etc/sysctl.conf腳本
#!/bin/bash
#
net.ipv4.ip_forward = 1
保存退出
在編輯vim /mnt/sysroot/etc/rc.d/rc.sysinit文件
添加
sysctl -p &> /dev/null
[ $? -eq 0] && success "Set kernel parameter" || failure "Set kernel parameter"
保存退出
sync同步
第十三步:如何支持用戶帳號登陸
須要添加不少安全法則,好比密碼規則等
PAM:pluggable Authentication Module
/etc/pam.d/* 都是跟PAM相關的
繞過PAM的方法
登陸信息實際上是有/bin/login程序來執行登陸認證的,依賴於PAM,如今繞過此方法
從新編輯login程序,放置/bin目錄下
用戶登陸:UID
組:GID
負責生成UID和GID的是
login:驗證
/etc/passwd;/etc/shadow 系統默認爲此
但能夠放在NIS,LDAP,MYSQL等數據庫中認證
nsswitch:Network Services Switch
框架:指定登陸從哪裏完成認證
若是想換登陸認證方式就更改nsswitch便可
有一堆庫文件:libnss_file.so(本地文件認證),libnss_nis.so(在nis中認證),libnss_ladp.so(到ladp中認證),須要什麼認證方式就拷貝哪一種庫文件
再到配置文件:/etc/nsswitch.conf中指定庫即可以選擇哪一種方式
定義了名稱解析是如何工做的?主機名解析爲ID,主機名解析爲IP等等定義
庫文件:
/lib/libnss* 的文件所有都是跟此nsswitch相關庫,主要將files,compat相關的庫文件複製新系統
/user/lib/libnss* 也有不少庫,通常都連接到上面地址的庫文件,只有libnssutil3.so,libnss3.so,libnssckbi.so三個文件是獨立的,通常新系統拷貝這幾個庫文件便可
cp /lib/libnss_files* /mnt/sysroot/lib/ -d
cp /usr/lib/libnss_files* /mnt/sysroot/usr/lib/ -d
cp /usr/lib/libnss3.so /mnt/sysroot/usr/lib/ -d
cp /usr/lib/libnssckbi.so /mnt/sysroot/usr/lib/ -d
cp /usr/lib/libnssutil3.so /mnt/sysroot/usr/lib/ -d
sync
cp /etc/nsswitch /mnt/sysroot/etc/
vim /mnt/sysroot/etc/nsswitch.conf 作一些修改
hosts所屬行,後面的內容所有刪除便可
建立用戶:
grep -E "^(root|hadoop)\>" /etc/passwd > /mnt/sysroot/etc/passwd
grep -E "^(root|hadoop)\>" /etc/shadow > /mnt/sysroot/etc/shadow
grep -E "^(root|hadoop)\>" /etc/group > /mnt/sysroot/etc/group
sync
bincp腳本添加passwd,userdel,usermod,groupadd等用戶相關命令
此時能夠將inittab中的agetty更改成mingetty的終端啓動模式
編輯新的login腳本
ldd login查看是否有動態連接庫
sync同步
切換新系統會提示用戶登陸信息
登陸新系統後不是root的家目錄,由於此時用戶權限是不對的
所以須要編輯vim .pash_profile文件
PS1='[\u@\h \W]\$' #大寫W爲基名,小w爲全名,會在前面顯示整個路徑
exprot PS1
保存退出
第十四步:添加單用戶模式
chmod -R og=--- root/ 回收root目錄權限
vim root/.bash_profile
exprot PS1='[\u@\h \W]\$'
vim etc/inittab
添加單用戶級別模式
l1:1:wait:/etc/rc.d/rc 1
去掉與單用戶無關的服務
cd etc/rc.d目錄下
mkdir rc1.d
ln -sv ../init.d/network K90network
ln -sv ../init.d/tserver K33tserver
查看less /etc/init.d/single文件中如何定義
exec init -t1 S
拷貝single腳本直接用也能夠
也能夠本身編輯
vim etc/rc.d/init.d/single
#!/bin/bash
#
#chkconfig:
#descriprion:
#
case $1 in
start)
;;
*)
echo "Usage:single start"
;;
esac
exec init -t1 S 或 exec /sbin/init S
保存退出
chmod +x etc/rc.d/init.d/single
cd rc.d/rc1.d
ln -sv ../init.d/single S98single
sync同步
內核編譯:
www.busybox.net
busybox
編譯安裝以後
/mnt/sysroot/bin下有個busybox的二進制文件
系統命令基本都連接到此程序
Kernel+ROOTFS()
Kernel+initrd(ramdisk)
busybox-->initrd
kernel+initrd(busybox)-->rootfs(busybox)
查看本機硬件設備信息:
一、cat /proc/cpuinfo
二、lsusb:列出本機的usb屬性信息
三、lspci:列出本機的pci總線全部屬性信息
四、hal-device:Hardware Abstract Layer,硬件抽象層
驅動的編譯過程有兩種:
一、直接作進內核;會使內核體積變大
二、作成模塊進行加載;任意添加更便捷
二者需選擇性編譯,體積較小的能夠作進內核,較大的編譯爲模塊
編譯內核:
一、配置
make menuconfig:以菜單形式進行模塊選擇,連續敲擊空格鍵選擇,選擇完成後使用Esc退出,最後選擇Yes保存並退出
make gconfig:Gnome桌面環境使用,需安裝圖形開發庫:GNOME
make kconfig:KDE桌面環境,需安裝圖形開發庫:KDE
make oldconfig
make config
最終都會保存.config文件
二、編譯安裝
make
make modules_install安裝內核模塊
make install
模塊安裝位置:/lib/modules/KERNEL_VERSION
如何實現部分編譯:
一、只編譯某子目錄下的相關代碼;
make dir/ 表示只編譯此目錄下的相關代碼;如:make arch/ 表示跟硬件平臺相關的內核核心,除了模塊意外的全部內容;make drivers/只編譯驅動
二、只編譯部分模塊:
make M=drivers/net/ 只編譯網絡驅動模塊
三、只編譯某一個模塊
make M=drivers/net/pcnet32.ko
四、將編譯完成的結果放置於別的目錄中
make O=/tmp/kernel
五、交叉編譯
make ARCH=
如何編譯busybox:
下載Busybox源代碼
tar xf busybox-1.20.2.tar.bz2
cd busybox-1.20.2
make menuconfig
進入菜單進行選擇與編譯內核同樣
選擇完須要使用的模塊
進入busybox settings --->
再進入Build Options ---> 編譯選項
選擇Build BusyBox as a static binary(no shared libs)(NEW)靜態的二進制程序
退出並進入Installation Options("make install" behavior) ---> 安裝位置指定,可進行安裝位置更改
yes保存退出
IDE:
/dev/hda1:ext3 /boot
/dev/hda2:ext3 /
編譯好以後進行安裝
make install 進行安裝
安裝相應busybox須要對應的內核版原本支持,不然會安裝報錯
找到新版本的內核包解壓並進入對應目錄
cd linux-2.6.38.5/include/mtd/
此目錄下有個ubi-user.h的文件
mkdir /root/busybox-1.20.2/include/mtd 在源碼包目錄下建立mtd目錄文件
將ubi-user.h文件複製到busybox源碼目錄下的mtd目錄
cp linux-2.6.38.5/include/mtd/ubi-user.h /root/busybox-1.20.2/include/mtd/
cd busybox-1.20.2
在運行make install安裝
安裝完成後本目錄下回出現一個_install目錄將目錄拷貝到相應目錄
cp _install /tmp/busybox -a
cd /tmp/busybox
rm linuxrc 刪除連接文件
一、創建rootfs
mkdir proc sys etc dev sysroot lib/modules sys
二、建立兩個必要的設備文件:
mknod dve/console c 5 1
mknod dev/null c 3 1
modinfo ext3
可查到ext3依賴jbd
modinfo jbd
無依賴關係
cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules/
三、爲initrd製做init程序,此程序的主要任務是實現rootfs的切換,所以,能夠以腳本的方式來實現它
編輯init腳本
#rm linuxrc
vim init
#!/bin/sh
#
mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot
exec switch_root /mnt/sysroot /sbin/init
保存退出
chmod +x init
四、製做initrd
mkdir tmp
find . |cpio -H newc -quiet -o |gzip -9 > /mnt/boot/initrd.gz
ls -lh /mnt/boot/initrd.gz
拷貝內核
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmliunz
grub-install --root-directory=/mnt /dev/hda
vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title MageEdu Linux2(2.6.18)
root(hd0,0)
kernel /vmlinuz ro root=/dev/hda2
initrd /initrd.gz
保存退出
cd busybox-1.20.2
cp _install/* /mnt/sysroot/ -a
cd /mnt/sysroot/
rm linuxrc
mkdir proc sys dev tmp var/{log,lock,run} lib /etc/rc.d/init.d root boot mnt media
vim etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltfdel:/sbin/reboot
::shutdown:/bin/umount -a -r
保存退出
五、爲系統準備一個「文件系統表」配置文件/etc/fstab
vim /etc/fstab
添加以下內容:
sysfs /sys sysfs default 0 0
proc /proc proc default 0 0
/dev/hda1 /boot ext3 default 0 0
/dev/hda2 / ext3 default 1 1
sync
mknod dev/console c 5 1
mknod dev/null c 1 3
六、建立系統初始化腳本文件
vim etc/rc.d/rc.sysinit
#!/bin/sh
echo -e Welcome to \033[34mMageEdu \033[0m Linux"
echo -e "Remounting the root filesystem ..........[ \033[32mOK\033[0m ]"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /
echo -e "Creating the files of device.............[ \033[32mOK\033[0m ]"
mdev -s
echo -e " Mounting the filesystem..................[ \033[32mOK\033[0m ]"
mount -a
swapon -a
echo -e "Starting the log daemon ..................[ \033[32mOK\033[0m ]"
syslogd
klogd
echo -e "Configuring loopback initerface ...........[ \033[32mOK\033[0m ]
ifconfig lo 127.0.0.1/24
ifconfig eth0 172.16.100.9/16
保存退出
chmod +x etc/rc.d/rc.sysinit
sync
cross compile:交叉編譯
在x8六、32bit、ARM等不一樣系統中想讓系統在另外一個平臺運行,就須要交叉編譯,須要用目標平臺的內核進行編譯
腳本編程知識點:
一、變量中字符的長度:$(#VARNAME)
二、變量賦值等:
${parameter:-word}:若是parameter爲空或未定義,則變量展開爲」word「;不然,展開爲parameter值
${parameter:+word}:若是parameter爲空或未定義,不作任何操做;不然,展開爲parameter值
${parameter:=word}:若是parameter爲空或未定義,則變量展開爲」word「;並將展開後的值賦值給parameter
${parameter:offset}
${parameter:offset:length}:取子串,從offset處的後一個字符開始,取lenth長的子串;
腳本賦值:
賦值案例:
A=3:賦值A的變量爲3
echo ${A:-30}:若是A有值則顯示本身以前定義值,若是沒有值則定義爲30
unset A:將A的變量撤銷回收
再次執行echo ${A:-30}時,賦值則變爲了30,此時echo $A的值爲空
A=${A:-30}:此時A的值爲30,若是A有值則用本身,若是沒有將A的值定義爲30
echo ${A:+30}:結果爲空則最終值爲空,若是A不空則使用後面的30
echo ${A:=30}:若是A爲空,不但展開字符串爲30,則A的變量也定義爲30,所以echo $A結果也是30
變量字符截取案例:
A='hello world'
echo ${A:2:3}:取出結果爲llo,2表示從字符串開頭開始略過幾個字符,3表示日後截取幾個字符;3字符可省略,結果就是略過2個字符後面全部的字符;
三、腳本配置文件
/etc/rc.d/init.d/服務腳本
服務腳本支持配置文件:/etc/sysconfig/服務腳本同名的配置文件
例如:寫一個腳本,腳本做用只要變量不爲空就顯示出來
vim a.sh
#!/bin/bash
#
[ -n "$TEST" ] && echo $TEST
保存退出
再編輯一個配置文件
vim a.conf
TEST='hello world'
保存退出
若是要讓腳本順利如初配置文件的內容則在腳本中添加
. /root/a.conf
若是配置文件也沒有賦值則使用
TEST=${TEST:-info}
四、局部變量:local VAR_NAME=
a=1
test() {
a=${3+4}
}
test
for I in `seq $a 10`; do
echo $I
done
局部變量前加local,就不是全局變量了,一樣是這個腳本
test() {
local a=${3+4}
}
在函數中加了local那麼這個a就不會引用前面a=1的變量了,因此若是變量只在某個函數中生效那就在變量前加local
五、命令mktemp:建立臨時文件或目錄
mktemp /tmp/file.XX
一樣一個file文件能夠屢次建立,使用mktemp命令會生成不一樣版本的file.93,file.94依次建立不一樣版本
還能夠一樣mktemp /tmp/file.XXXX 都會生成不一樣字符串來區分不一樣的文件
變量引用:
FILE=·mktemp /tmp/file.XXXXX
echo $FILE 就會輸出最近一次生成的臨時文件,若是刪除就直接rm $FILE便可
mktemp -d /tmp/file.XX 生成臨時目錄
tmp目錄每隔30天未被訪問過的文件或目錄就會被清理掉
六、信號:進程間相互傳遞的信息
kill -l:查看全部信號的ID號
kill -SIGNAL PID
1:HUP
2:INT
9:KILL
15:TERM
腳本中,能實現信號捕捉,但9和15沒法捕捉
Ctrl+c:SIGINT
trap命令:實現信號捕捉
trap 'COMMAND' 信號列表
腳本示例:
vim showdate.sh
#!/bin/bash
#
trap 'echo "You go..." INT #捕捉信息是Ctrl+c沒法終止
while :; do
date
sleep 2
done
保存退出
Ctrl+z:SIGCONT 後臺執行,在沒法執行Ctrl+c的時候能夠用此命令送至後臺執行
而後執行kill %1將後臺進任務殺死便可
vim ping.sh
#!/bin/bash
#
NET=192.168.0
for I in {200..254}; do
if ping -c 1 -W 1 $NET.$I &> /dev/null; then
echo "$NET.$I is up."
else
echo "$NET.$I is down."
fi
done
此腳本執行時沒法執行Ctrl+c終止,由於ping命令捕捉了Ctrl+c信號,ping命令不進行了而已,可是bash腳本並無接收到終止信號
除非在腳本中添加捕捉腳本的信息:
trap 'echo "quit.";exit 1' INT
若是想在腳本執行時出現的一些變量或臨時文件在腳本執行結束後清理掉添加:
clearup() {
echo "quit..."
exit 1
}
trap 'clearup' INT 添加此信號捕捉能夠將函數中的項清理掉
七、一行執行多個語句,語句間用分號隔開便可
如:trap 'echo "quit.";exit 1' INT
輸出了quit.而且執行了exit 1退出命令
任務計劃:
一、在將來的某個時間點執行一次某個任務;
/etc/at.deny和/etc/at.allow文件能夠拒絕或容許某些用戶不能執行at命令,兩個文件都有的用戶只有allow生效,兩個都不存在的狀況下只有root能夠使用,文件爲空表示任何人都容許或不容許
at 時間 執行執行時間
at> Command:要執行的內容
at>Ctrl+d 提交
指定時間:
絕對時間:
HH:MM,DD.MM.YY MM/DD/YY 如:10:20:指定某個時間點
相對時間:now+#(minutes,hours,days,weeks)
單位:minutes,hours,days,weeks
now+3minutes:從如今開始日後3分鐘
MM/DD/YY 或 DD.MM.YY:某月/某日/某年 或者 某日.某月.某年
模糊時間:
noon,midnight,teatime
命令的執行結果:將以郵件的行事發送給安排任務的用戶。
at -l:查看當前全部做業列表信息
at -d 做業號:刪除某個做業
batch:自動選擇系統較空閒的時刻運行任務,所以不須要指定時間
二、週期性的執行某任務;
cron:自身是一個不間斷運行的服務
一、系統cron
/etc/crontab:每一個段之間用空格隔開
格式:分鐘 小時 天 月 周 用戶 任務
二、用戶cron
/var/spool/cron/USERNAME
格式:分鐘 小時 天 月 周 任務
時間的有效取值範圍:
分鐘:0-59
小時:0-23
天:1-31
月:1-12
周:0-7,0和7都表示週日
時間通配表示:
*:對應時間的全部有效取值
3 * * * *:表示每一個小時的第3分執行一次
3 * * * 7:每一個週日每一個小時的第3分鐘
13 12 * * *:天天12點13分執行一次
13 12 6 * 3:每月6號而且是星期3的12點13分執行一次,概率很低
13 12 6 7 *:每一年7月6號的12點13分執行
,:離散時間點:
10,40 * * * 2,5:每週2和周5的每小時的第10分和第40分執行一次
-:連續時間點
10 02 * * 1-5:每週1到周5的2點10分都執行一次
/#:對應取值範圍內每多久執行一次
*/3 * * * *:每3分鐘執行一次
用戶任務的管理:
crontab:
-l:列出當前用戶的全部cron任務
-e:以vi形式進行編輯任務和執行時間
-r:移除全部任務
-u USERNAME -e:管理其餘用戶的cron任務
執行結果將以郵件形式發送給管理員:
*/3 * * * * /bin/cat /etc/fstab > /dev/null :便可避免每次發送郵件,但保留錯誤信息,若是都不顯示&> /dev/null便可
cron的環境變量:cron執行全部命令都去PATH環境變量指定路徑下去照
PATH:/bin:/sbin:/usr/bin:/usr/sbin
調用腳本時先定義PATH環境變量
#!/bin/bash
exprot PATH=/bin:/sbin:/usr/bin:/usr/sbin
cron系統任務執行爲目錄,在某個時間點將目錄下腳本所有執行一次,按字母順序排位陸續執行若是想提早或者用靠前的字母或者使用數字00,01來進行排序執行
anacron:cron的補充,可以實現讓cron由於各類緣由在過去的時間點該執行而未執行的任務在恢復正常後執行一次
/etc/anacrontab
文件內第一列數字表示有#天未執行了,第二列數字表示開機後的第##分鐘開始運行,
確保service crond status是運行的
service anacron status 若是用到anacron也能夠開啓此服務,但服務器通常不會關機所以基本用不到
chkconfig --list crond 能夠查看是否開機運行
Linux內核及編譯
linux系統安裝和kickstart
故障排除
Kernel + initrd (busybox製做,提供ext3文件系統模塊) + ROOTFS(busybox製做)
make arch/ 只編譯對應目錄下的全部源程序,但依舊會遍歷各模塊
arch/x86/boot/bzImage 表示以bz方式壓縮以後的內核鏡像文件,拷貝到/boot下改名爲linuzimage
硬件驅動:
initrd:僅須要提供內核訪問真正的根文件系統所在設備須要的驅動
存儲設備和文件系統相關的模塊
rc.sysinit:系統初始化腳本
初始其餘硬件的驅動程序
ROOTFS:busybox,init不支持運行級別
/etc/inittab:格式也不相同
默認支持:ash,hush
須要移至bash
內核編譯:
先準備內核文件linux-2.6.38.5.tar.bz2
解壓後ln linux-2.6.38.5 linux 連接到同目錄下的linux目錄
cd linux
開始編譯模塊製做.config文件
也能夠下載本身製做號的文件,kernel-2.6.38.1-i686.cfg
mv kernel-2.6.38.1-i686.cfg .config 改名爲.config就在內核源碼包目錄下
以此文件做爲基礎模板進行修改
make menuconfig
在Local version一項更改一下咱們的版本名稱
若是須要支持iscsi的話fusion MPT device support 若是在vmware環境下使用必須添加此模塊,還有SCSI low-level drivers
備份.config文件
cp .config /root/config-2.6.38.5-i686.cfg
make drivers/net/pcnet32.ko 只編譯網絡模塊
modinfo drivers/net/pcnet32.ko 查看依賴關係
無依賴模塊便可
make arch/x86/ 或者 make SUBDIR=arch/ 只編譯核心,不指定x86的話會根據當前系統的平臺版本進行選擇,有時會報錯
一、安裝grub
grub-install --root-directory=/mnt /dev/hda
檢查/mnt/boot下有grub目錄便可
二、拷貝內核
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
sync
三、下載busybox
下載最新版的busybox
tar xf busybox-1.20.2.tar.bz2
mkdir busybox-1.20.2/include/mtd
因當前系統內核版本太低最新的busybox須要拷貝新內核的ubi-user.h文件到busybox源碼包內
cp /usr/src/linux-2.6.38.5/include/mtd/ubi-user.h /busybox-1.20.2/include/mtd/
make menuconfig 按需選擇所需功能
make install
此時出現編譯未完成的狀況,須要從新編譯
make clean:清理以前編譯好的二進制模塊
make mrproper:清理以前編譯所殘留的任何操做,包括
cp /root/config-2.6.38.5-i686.cfg .config
make SUBDIR=arch/
mkdir /tmp/initrd
cp _install/* /tmp/initrd/ -a
cd /tmp/initrd
mkdir proc sys mnt/sysroot dev tmp lib/modules etc -pv
rm linuxrc
mknod dev/console c 5 1
mknod dev/null c 1 3
ls dev/ -l 能夠看到console和null文件
編輯init腳本文件:
vim init
#!/bin/sh
#
mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s #經過sys目錄輸出全部硬件信息給用戶空間
mount -t ext3 /dev/hda2 /mnt/sysroot
exec switch_root /mnt/sysroot /sbin/init #切換根文件系統,表示把根切換到/mnt/sysroot,而且執行/sbin/init
chmod +x init
find . |cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz
ll -h /mnt/boot 查看備份
modinfo jbd
modinfo ext3
cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/
cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules/
find . |cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz
編輯grub.conf配置文件
vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title MageEdu Tiny Linux(2.6.18)
root(hd0,0)
kernel /vmlinuz ro root=/dev/hda2
initrd /initrd.gz
保存退出
cp busybox-1.20.2/_install/* /mnt/sysroot/ -a
rm linuxrc
mkdir boot root etc/rc.d/init.d var/{log,lock,run} proc sys dev lib/modules tmp home mnt meida -pv
mknod dev/console c 5 1
mknod dev/null c 1 3
編輯inittab文件
vim etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltfdel:/sbin/reboot
::shutdown:/bin/umount -a -r
保存退出
編輯sysinit腳本
vim etc/rc.d/rc.sysinit
#!/bin/sh
echo -e Welcome to \033[34mMageEdu \033[0m Linux"
echo -e "Remounting the root filesystem ..........[ \033[32mOK\033[0m ]"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /
echo -e "Creating the files of device.............[ \033[32mOK\033[0m ]"
mdev -s
echo -e " Mounting the other filesystem..................[ \033[32mOK\033[0m ]"
mount -a
swapon -a
echo -e "Starting the log daemon ..................[ \033[32mOK\033[0m ]"
syslogd
klogd
echo -e "Configuring loopback initerface ...........[ \033[32mOK\033[0m ]
ifconfig lo 127.0.0.1/24
ifconfig eth0 172.16.100.9/16
保存退出
chmod +x etc/rc.d/rc.sysinit
sync
編輯fstab文件
vim /etc/fstab
添加以下內容:
sysfs /sys sysfs default 0 0
proc /proc proc default 0 0
/dev/hda1 /boot ext3 default 0 0
/dev/hda2 / ext3 default 1 1
sync
此時便可啓動新的操做系統了
啓用bash
使用bincp.sh腳本執行加載bash命令便可
chroot /mnt/sysroot 切換便可驗證
cd /mnt/sysroot/bin/目錄下有個sh連接文件當前連接到busybox咱們須要從新連接他到bash便可
或者編輯配置文件
vim etc/inittab
更改console::respawn:-/bin/sh
改成console::respawn:-/bin/bash便可
實現用戶登陸:
grep -E "^root:" /etc/passwd > /mnt/sysroot/etc/passwd
grep -E "^root:" /etc/shadow > /mnt/sysroot/etc/shadow
grep -E "^root:" /etc/group > /mnt/sysroot/etc/group
ls /mnt/sysroot/etc檢查三個文件是否已存在
查看passwd是不是bash啓動
sync
vim etc/inittab
去掉console::respawn:-/bin/bash這一行
添加兩行:
::respawn:/sbin/getty 9600 tty1 #9600是傳輸速率
::respawn:/sbin/getty 9600 tty2
保存退出
sync同步
添加主機名:
vim /mnt/sysroot/etc/hostname
HOSTNAME=tiny.magedu.com
vim /mnt/sysroot/etc/rc.d/rc.sysinit
添加:
echo "Set the hostname"
[ -f /etc/hostname ] && . /etc/hostname
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] HOSTNAME=localhost
hostname $HOSTNAME
提供登陸前信息:
cp /etc/issue /mnt/sysroot/etc/issue
sync同步
爲避免文件系統出錯,首先備份配置
find .|cpio -H newc --quiet -o |gaip -9 > /root/tiny.1.gz
恢復備份:
umount /mnt/sysroot
mke2fs -j /dev/hda2
mount /dev/hda2 /mnt/sysroot
cd /mnt/sysroot
zcat /root/tiny.1.gz | cpio -id
sync
裝載網卡驅動配置網卡:
modinfo mii
modinfo pcnet32
cp /lib/modules/2.6.18-308.el5/kernel/deivers/net/pcnet32.ko /mnt/sysroot/lib/modules
cp /lib/modules/2.6.18-308.el5/kernel/deivers/net/mii.ko /mnt/sysroot/lib/modules
按需裝載模塊,啓動網絡服務時裝載
vim etc/rc.d/rc.sysinit 添加如下內容
echo "Initializing network device..."
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
保存退出
配置IP地址
mkdir -pv etc/sysconfig/network-scripts
vim etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=172.16.100.5
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
ONBOOT=yes
保存退出
vim etc/rc.d/init.d/network
#!/bin/bash
#
#chkconfig:35 09 90
#descriprion:network service
prog=network
. /etc/rc.d/init.d/functions
CONF=/etc/sysconfig/network-scripts/ifcfg-eth0
. $CONF
start() {
ifconfig eth0 $IPADDR/$NETMASK up
[ -z $GATEWAY ] && route add default gw $GATEWAY
return 0
}
stop() {
ifconfig eth0 down
}
status() {
ifconfig eth0
}
usage() {
echo "$prog:{start|stop|restart|status}
}
case $1 in
start)
start
success "Config network eth0"
;;
stop)
stop
success "Stop network card eth0"
;;
restart)
stop
start
success "Restart network card eth0"
;;
status)
status
;;
*)
usage
exit 1
;;
esac
保存退出
chmod +x etc/rc.d/init.d/network
在不一樣級別下建立啓動腳本連接文件
cd etc/rc.d/rc0.d
ln -sv ../init.d/network K90network
cd etc/rc.d/rc6.d
ln -sv ../init.d/network K90network
cd etc/rc.d/rc3.d
ln -sv ../init.d/network S09network
sync同步
切換mini系統便可使用service network start 啓動網絡
系統建立過程:
一、安裝grub
二、提供內核
三、提供initrd
四、建立根文件系統
Linux上的日誌系統:
RHEL5:syslog
RHEL6:syslog-ng:syslog升級版,分開源版和商業版
日誌系統:syslog()
syslog服務:
syslogd:系統,非內核的其餘日誌
klogd:內核日誌,專門負責記錄內核產生的日誌信息
kernel --> 物理終端(/dev/console)--> /var/log/dmesg
#dmesg命令查看內核日誌文件
能夠查看到啓動init程序以前所產生的信息
#cat /var/log/dmesg 也可查看
日誌須要滾動(日誌切割):
messages是最新的日誌內容,按期會將舊日誌生成messages.1 messages.2等舊日誌歸檔
/sbin/init
/var/log/messages:系統標準錯誤日誌信息;各子系統的產生的信息,非內核產生的引導信息,
logrotate:日誌切割命令
/etc/cron.daily/logrotate:此腳本是系統定義的計劃任務按期對日誌進行滾動切割,默認每週滾動一次,只保留4個文件
編輯/etc/logrotate.conf文件進行滾動策略定義
/var/log/maillog:郵件系統產生的日誌信息;
/var/log/secure:安全相關日誌信息;默認權限爲600;
syslog:
syslogd
服務配置文件:/etc/syslog.conf
配置文件定義格式爲:facility.priority action
facility:能夠理解爲日誌的來源或者設備目前經常使用的facility有如下幾種:
auth:# 認證相關的
authpriv # 權限,受權相關的
cron # 任務計劃相關的
daemon # 守護進程相關的
kern # 內核相關的
lpr # 打印相關的
mail # 郵件相關的
mark # 標記相關的
news # 新聞相關的
security # 安全相關的,與auth相似
syslog # syslog本身的
user # 用戶相關
uucp # unix to unix cp 相關的
local0 到 local7 # 用戶自定義使用
* # *表示全部facility
priority(log level)日誌的級別,通常有如下幾種級別(從低到高),級別越低記錄越詳細
debug # 程序或系統的調試信息
info # 通常信息
notice # 不影響正常功能,須要注意的消息
waring/warn # 可能影響系統功能,須要提醒用戶的重要事件
err/error # 錯誤信息
crit # 比較嚴重的
alert # 必須立刻處理的
emerg/panic # 會致使系統不可用的
* # 表示全部的日誌級別
none # 跟*相反,表示啥也沒有
action(動做)日誌記錄的位置
系統上的絕對路徑 # 普通文件 如:/var/log/xxx
| # 管道 經過管道送給其餘的命令處理
終端 # 終端 如:/dev/console
@HOSTNAME # 遠程主機 如:@10.0.0.1
用戶ID # 系統用戶 如:root
* # 登陸到系統上的全部用戶,通常emerg級別的日誌是這樣定義的
定義格式例子:
mail.info /var/log/mail.log # 表示將mail相關的,級別爲info及info以上級別的信息記錄到/var/log/mail.log文件中
auth.=info @10.0.0.1 # 表示將auth相關的,基本爲info的信息記錄到10.0.0.1主機上去,前提是10.0.0.1要能接收其餘主機發來的日誌信息
user.!=error # 表示記錄user相關的,不包括error級別的信息
user.!error # 與user.error相反
*.info # 表示記錄全部的日誌信息的info級別
mail.* # 表示記錄mail相關的全部級別的信息
*.* #
cron.info;mail.infor # 多個日誌來源能夠用「;」隔開
cron,mail.info # 與cron.info;mail.info 是一個意思
mail.*;mail.!=info # 表示記錄mail相關的全部級別信息,可是不包括info級別的
瞭解這些能夠查看syslog.conf配置文件裏的內容定義了
配置文件更改後通常使用servcie syslog reload來進行配置加載,儘可能不要用restart有可能影響日誌記錄
在 /etc/sysconfig/syslog文件中
SYSLOG_OPTIONS="-r -m 0" 在此項配置中添加-r選項並重啓服務便可把此服務器看成日誌文件服務器,可接受其餘服務器的日誌文件;
在新建的小系統中添加日誌功能
在etc/rc.d/rc.sysinit中添加syslogd和klogd便可啓用日誌服務
並建立etc/syslog.conf配置文件
若是沒法正常生產日誌,請檢查文件系統是否ext3
klogd
信息詳細程度:日誌級別
子系統:facility,設施;把每一個程序理解爲一個子系統,每一個子系統均可以生成本身的日誌
動做:記錄日誌的過程
telnet:遠程登陸,tcp應用層協議,23/tcp
C/S
S:telnet服務器
C:telnet客戶端
發送機製爲明文,所以安全不高
ssh:Secure Shell,應用層協議,22/tcp
通訊過程及認證過程是加密的,主機認證,用戶認證過程加密,數據傳輸過程加密
服務器端會發送主機祕鑰:
非對稱加密:公鑰和私鑰可以配對才能完成認證
Secret key 服務器端發送私鑰
Public key 客戶端存有公鑰
對稱加密:加密和解密使用同一個密碼
密鑰交換
ssh v1版,v2版
v1版已經不算安全,容易被中間人截取用戶祕鑰並假裝客戶端向服務器端發送請求,返回時假裝成服務器返回給客戶端
man-in-middle
v2版本相對安全
認證過程:
基於口令認證
基於祕鑰認證
協議:規範
實現:服務器端、客戶端
Linux:openSSH
C/S
服務器端:sshd,配置文件/etc/ssh/sshd_config
客戶端:ssh,配置文件/etc/ssh/ssh_config
ssh:遠程登陸對端服務器
ssh-keygen:祕鑰生成器
ssh-copy-id:將公鑰傳輸至遠程服務器
scp:跨主機安全複製工具
ssh:
ssh USERNAME@HOST
第一次登陸會接受一個祕鑰:存放位置默認在root用戶的/root/.ssh/目錄下known_hosts文件
ssh -l USERNAME HOST
ssh USERNAME@HOST ‘COMMAND’:這樣在對端執行輸入的命令後自動退出,不會登陸到對端服務器
scp:
scp SRC DEST
-r:遞歸複製
-a:所有複製
例:
scp USERNAME@HOST:/path/to/somafile /path/to/local
scp /path/to/local USERNAME@HOST:/path/to/somafile
ssh-keygen:
-t rsa
祕鑰保存在:~/.ssh/id_rsa
~/.ssh/id_rsa.pub 公鑰複製到遠程主機對應用戶的家目錄下的.ssh/authorized_keys文件或者.ssh/authorized_keys2文件中,不能覆蓋要追加入此文件中
例:生成祕鑰並與對端認證
ssh-keygen -t rsa回車,會通知你生成祕鑰的位置,輸入密碼無需輸入直接回車生成
-f /path/to/key_file:直接指定存放的祕鑰名稱和位置
-P '':指定加密私鑰的密碼
scp .shh/id_rsa.pub root@172.16.200.1:/root 複製到對端
登陸對端主機:
mkdir .ssh
chmod 700 .ssh # .ssh目錄的權限必定是700的
cat id_rsa.pub >> .ssh/authorized_keys
再次登陸對端無需輸入密碼,完成基於祕鑰的認證過程
刪除建立的.ssh目錄,在id_rsa.pub生成以後使用ssh-copy-id命令進行復制,會自動完成建立目錄追加文件內容的動做
ssh-copy-id -i ~/.ssh/id_rsa.pub root@176.16.200.1 # 無需輸入具體位置直接回車便可
向新建立的小系統移至ssh遠程登陸:
dropbear:嵌入式系統專用的ssh服務器端和客戶端工具
服務器端:dropbear
dropbearkey:爲服務器端實現主機認證
客戶端:dbclient
一、dropbear默認使用nsswitch實現名稱解析
/etc/nsswitch.conf
/lib/libnss_files*
/usr/lib/libnss3.so
/usr/lib/libnss_files*
二、dropbear會在用戶登陸檢查其默認shell是否當前系統的安全shell
/etc/shells
三、必須掛載僞終端
具體建立步驟:
下載dropbear-2013.56.tar.bz2文件
tar xf dropbear-2013.56.tar.bz2
cd dropbear-201.56
.configure
make
make install
執行bincp.sh將dropbear、dropbearkey、dbclient命令移至過去
sync同步
添加支持的shell
cd /mnt/sysroot
vim etc/shells
/bin/sh
/bin/bash
/bin/ash
/bin/hush
vim etc/fstab 添加下面一行僞終端
devpts /dev/pts devpts mod=620 0 0
保存退出
mkdir dev/pts
sync同步
建立主機密鑰默認位置:
etc/dropbear/
RSA:dropbear_rsa_host_key
長度可變,只要是8的整數倍,默認爲1024
DSS:dropbear_dss_host_key
長度固定,默認1024
mkdir etc/dropbear
dropbearkey
-t rsa|dsa:指定祕鑰類型
-f /path/to/KEY_FILE :指定位置和名稱
-s SIZE :指定長度
dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key -s 2048 # 回車生成rsa祕鑰
dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key # 回車生成dss祕鑰,無需指定長度
ls etc/dropbear/ # 查看兩個生成的祕鑰文件是否存在/dropbear_rsa_host_key和dropbear_dss_host_key
複製NSS
mkdir usr/lib
cp -d /lib/libnss_files* /mnt/sysroot/lib/
cp -d /lib/libnss3.so /lib/libnss_file.so /mnt/sysroot/lib/
cp /etc/nsswitch.conf /mnt/sysroot/etc/
vim /mnt/sysroot/etc/nsswitch.conf
只保留4行便可
passwd: files
shadow: files
group: files
hosts: files dns
保存退出
sync同步
在小系統中啓動dropbear
/usr/local/sbin/dropbear -E -F # 第一次啓動能夠使用-E和-F選項表示前端運行
而後用ssh客戶端進行遠程登陸測試
確認服務沒有問題後能夠取消前臺運行
/usr/local/sbin/dropbear # 直接執行後臺運行此命令
使用dbclient命令遠程登陸其餘服務器
如:
/usr/local/bin/dbclient -l root 172.16.200.1
輸入密碼便可遠程登陸
系統安裝過程:利用kickstart工具完成自制自定義自動安裝光盤;
anaconda:stage2.img
text,GUI
kickstart:三部分
/root/anaconda-ks.cfg:保存了安裝過程當中自定義安裝的內容
命令段:
必備命令
keyboard
lang
timezone Asia/Shanghai
authconfig --useshadow
bootloader --location
clearpar
--initlabe :初始化分區表
--linux :清除系統中linux的分區信息
driverdisk --source=ftp://path/to/dd.img 或 http://path/to/dd.img
firewall --enabled|disabled:通常爲禁用
firstboot --disabled:通常爲禁用,安裝結束後還要配置一些信息,關閉後無需配置
text|graphical:文本界面或圖形界面安裝,不選則爲圖形界面
key --skip :跳過提供祕鑰
keyboard us:指定鍵盤類型爲us
lang en_US 或 zh_CN:指定語言
#建立分區過程:
#clearpart --all --initlabel
#part /boot --fstype ext3 --size=100
#part pv.100000 --size=40960 #pv.100000數字可任意使用前面建立和後面分配一致便可,ID號
#part swap --size=1024
#volgroup vol0 --pesize=32768 pv.100000
#logvol / --fstype ext3 --name=root --vgname=vol0 --size=32000
#logvol /home --fstype ext3 --name=home --vgname=vol0 --size=1984
配置網絡
network --bootproto=dhcp|static --ip=10.0.2.15 --netmask=255.255.255.0 --gateway=10.0.2.254 --nameserver=10.0.2.1,192.168.1.1
rootpw --iscrypted:加密設置root密碼
selinux --disabled|permissive|enabled:通常爲禁用,建議使用--permissive
skipx:跳過圖形配置
upgrade:升級系統
#yum install system-config-kickstart
ksvalidator:檢查ks中是否有語法錯誤
kevalidator /root/anaconda-ks.cfg #不報任何信息則爲無語法錯誤
運行system-config-kickstart命令直接跳出圖形界面進行配置,全部配置項都會有,能夠打開某個配置文件爲範本基礎上更改,最後保存
用下面命令生成安裝引導盤:
mkisofs -R -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso iso/
生成後的boot.iso文件掛載到cdrom中設置cdrom啓動,引導到boot界面直接回車,完成安裝過程
可選命令
軟件包選擇段:%packages
腳本段:
%pre:預安裝腳本段
%post:後安裝腳本段
安裝過程當中,boot提示符中能夠使用的命令:
askmehod
dd=:加載額外的驅動盤
ip=地址
netmask=子網掩碼
gateway=網關
dns=DNS服務器地址
ks=指定哪裏獲取ks配置文件
ks=http://
ks=cdrom:/
ks=hd:<device>:/<file> 硬盤某個分區獲取,例:ks=hd:sda3:/mydir/ks.cfg
ks=file:/<file> 表示在系統中initrd中獲取配置信息
ksdevice=<device> 指定某個網卡設備,例:ksdevice=eth1 或 ks=nfs:<server>:/<path> ksdevice=eth1
noprobe:不裝載硬件設備
rescue:進入緊急救援模式
常見的系統故障排除:
一、肯定問題的故障特徵
二、故障重現
三、使用工具收集進一步信息
四、排除不可能的緣由
五、定位故障:
從簡單的問題入手
一次嘗試一種方式
故障排除規則:
一、備份原文件
二、儘量藉助於工具
可能會出現的故障:
一、管理員密碼忘記
進入單用戶模式,讀寫方式掛載根目錄,運行passwd 直接更改root密碼便可
二、系統沒法正常啓動
a、grub損壞(MBR損壞、grub配置文件丟失)
dd if=/dev/sda of=/root/mbr.backup count=1 bs=512 # 最好放置其餘磁盤備份,備份mbr
dd if=/dev/zero of=/dev/sda count=1 bs=200 #清除mbr空間
sync同步
shutdown -r now 重啓
修復方式:
一、藉助別的主機修復;
二、使用緊急救援模式;
a、boot.iso
b、使用完整的系統安裝光盤
boot:linux rescue # 進入救援模式,相似於WinPE,須要掛載真正的根文件系統
選擇語言以及鍵盤輸入類型,然後調用anaconda啓動一個小型的linux系統
通常會將根掛載到/mnt/sysimage掛載
輸入grub進入grub命令行模式
grub>find (hd0,0)/ # 挨個輸入設備號進行查找,若是找到vmlinuz內核文件便可
grub>root (hd0,0) # 設定根
grub>setup (hd0) # 安裝grub
quit退出grub
sync同步
reboot重啓主機便可完成修復
grub配置文件丟失:
grub>find (hd0,0)/
grub>root (hd0,0)
grub>kernel /vmlinuz-對應內核版本號 後面的根指定不指定都可 ro root=/dev/vol0/root rhgb quiet
grub>initrd /initrd-xxx.img 對應內核版本號必須徹底匹配
grub>boot
啓動以後進入到grub目錄下重建grub配置文件便可
grub.conf
default=0
timeout=10
title RHEL 5.8
root (hd0,0)
kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root quiet
initrd /initramfs-2.6.32-358.el6.x86_64.img #ramdisk文件路徑
b、系統初始化故障(某文件系統沒法正常掛載、驅動不兼容、kernel panic:內核恐慌)
一、沒法正常掛載和驅動不兼容
grub:編輯模式,進入1級別單用戶模式emergency
進入系統後修復相應的fstab或者修復驅動等配置腳本文件便可
二、默認級別設定爲了0或6
grub:編輯模式,進入1級別單用戶模式emergency
修改inittab啓動級別修改成3或5便可
三、誤刪除/etc/rc.d/rc3.d目錄不當心刪除了
進入1級別單用戶模式emergency
修復目錄內腳本
c、服務故障
某服務故障致使啓動中止,相似sendmail修復以下:
sendmail服務,系統時鐘不許確時會致使配置文件時間戳檢查沒法經過啓動系統時停留在sendmail服務處卡住
一、修復sendmail時間戳
二、單用戶模式下,中止sendmail服務隨系統啓動
三、啓動系統時,出現紅色redhat字樣時會提示按I鍵進入交互式模式,進入後選擇卡住的服務中止啓動
在rc.local文件中啓動了關機或者重啓命令也會對啓動有影響
進入單用戶,將相應啓動級別目錄下的rc.local中內容修改
d、用戶沒法登錄系統(mingetty,bash程序故障)
好比不當心將/bin/bash刪除了,關機都沒法執行了
修復過程:沒法進入單用戶模式
修復bash:
緊急救援模式:重裝bash
bios裏設置CDROM啓動,使用系統光盤啓動
boot:linux rescue 進入救援模式
掛載hdc設備既是光驅設備
mount /dev/hdc /media
cd /media
cd Server
ls |grep bash
rpm -ivh --replacepkgs --root /mnt/sysimage bash-3.2-32.el5.i386.rpm # --replacepkgs 替換安裝,若是這樣執行就安裝到當前救援模式的小系統中了
所以咱們須要添加--root /mnt/sysimage表示安裝時以此目錄爲根進行安裝
固然也能夠直接使用chroot /mnt/sysimage切到本機系統中進行光驅掛載和bash安裝也能夠完成bash修復
修復完成切記使用sync進行同步
修復mingetty:
能夠進入單用戶模式後手動啓動網絡服務
再將相應的mingetty程序包拷貝過來進行安裝修復
三、命令沒法運行
環境變量被損壞
例如:本應添加環境變量時 export PATH=$PATH:/data/bin,但不當心寫成export PATH=/data/bin,結果只能執行/data/bin下的命令了,任何命令都沒法執行了
修復:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:....將環境變量從新指定回來
或者最簡單的,修改不是改的配置文件,把當前shell關閉,從新登陸便可
或者使用全路徑更改配置文件:
/usr/bin/vim /etc/profile 修改全局環境變量配置文件便可
最好選擇一款版本控制軟件進行備份關鍵配置文件
svn,git均是經常使用版本控制軟件,能夠恢復至以前的版本
四、編譯過程沒法繼續(開發環境缺乏基本組件)
將開發環境安裝進去便可,主要觀察編譯命令最後報錯信息來找到關鍵錯誤所在
50臺服務器:
網絡:定義網絡屬性,tom
用戶:用戶管理,jerry
Linux:root
Tom:root,
用戶:管理員和普通用戶
sudo COMMAND:某個用戶可以以另外哪一個用戶的身份經過哪些主機執行某命令的機制
須要輸入:jerry密碼
sudo的配置文件:/etc/sudoers 默認爲440權限
visudo:編輯sudoers命令,可檢查語法錯誤
sudo以條目形式添加規則:
who which_hosts=(runas) command
誰 在哪些主機上以哪一種身份 運行什麼命令
別名:別名必須所有並且只能使用大寫英文字母的組合 ALL爲全部
用戶別名:User_Alias,爲who定義別名,能夠定義多個用戶
語法:User_Alias USERADMIN = %用戶名 # 前面加!能夠取反值
可包含系統用戶的用戶名
組名,使用%引導組名
還能夠包含其它已經定義的用戶別名
Host別名:Host_Alias,能夠定義主機組
語法:Host_Alias HOSTADMIN = %主機名,IP # 前面加!能夠取反值
主機名
IP地址
網絡地址
其它主機別名
runas別名:Runas_Alias,定義多種身份別名
語法:Runas_Alias RUNASADMIN = 用戶名,組名 # 前面加!能夠取反值
用戶名
%組名
其它的Runas別名
command別名:Cmnd_Alias,定義多個命令
語法:Cmnd_Alias CMNDADMIN = 命令路徑,目錄 # 前面加!能夠取反值
命令路徑
目錄(此目錄內的全部命令)
其它事先定義過的命令別名
在COMMAND前加TAG標籤能夠在執行命令前作一些其餘動做例如:
NOPASSWD:/usr/sbin/useradd,/usr/sbin/usermod 這樣寫在sudo執行命令時就無需輸入密碼認證了
NOPASSWD:/usr/sbin/useradd, PASSWD: /usr/sbin/usermod 這樣寫是useradd無需密碼,usermod還須要密碼
別名設置示例:
visudo
User_Alias USERADMIN = hadoop,%hadoop,%useradmin
Cmnd_Alias USERADMINCMND = /usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel,/user/bin/passwd [A-Za-z]*,! /user/bin/passwd root # !後面是排除掉不容許執行的root密碼更改的命令,取反優先級更高
USERADMIN ALL=(root) NOPASSWD:USERADMINCMND
使用示例:hadoop以管理員身份執行useradd和usermod命令
useradd hadoop
su hadoop
sudo /usr/sbin/useradd tom
輸入密碼
提示sudoers文件中沒有hadoop信息
visudo
在最後新增一行
hadoop ALL=(root) /usr/sbin/useradd,/usr/sbin/usermod
保存退出
再次執行
sudo /usr/sbin/useradd tom
sudo第一次輸入密碼後,5分鐘以內是無需再次輸入密碼的
sudo -k:讓認證信息失效,並從新認證
sudo -l:列出當前用戶全部能夠使用的全部sudo命令
sudo執行的任何操做都會記錄在/var/log/secure日誌中
TCP/IP:安全
機密性:明文傳輸(ftp,http,smtp,telnet)
加密:plaintext明文 --> 轉換規則 --> ciphertext密文
解密:ciphertext密文 --> 轉換規則 --> plaintext明文
轉換算法:密鑰
對稱加密:算法結合密鑰進行加密解密,密鑰是相同的
對稱加密算法:
DES:Data Encrption Standard,56bit加密祕鑰
3DES:將數據3次DES加密,經常使用
AES:Advanced Encrption Standard, 128bit加密祕鑰,經常使用
AES192,AES256,AES512,可定義祕鑰長度,越長安全性越高,但耗時越多
Blowfish:常見的對稱加密算法
單向加密算法:
MD4
MD5
SHA1
SHA192,SHA256,SHA384這裏指輸出長度
CRC-32:循環冗餘校驗碼
公鑰加密:核心功能(加密、簽名)
身份認證
數據加密
祕鑰交換
RSA:dropbear_rsa_host_key 加密、簽名
DSA:只能實現簽名,公開使用軟件,美國國家安全局
ElGamal:商業算法,須要付費使用
數據完整性:數據篡改
單向加密算法:提取數據特徵碼
一、輸入相同;輸出必然相同
二、雪崩效應:輸入的微小改變,將會引發結果的巨大改變
三、定長輸出:不管原始數據是多大,結果大小都是相同的
四、不可逆:沒法根據特徵碼還原原來的數據
協商生成密碼:密鑰交換(Internet Key Exchange,IKE)
須要Diffie-Hellman協議完成互聯網交換算法
P,G(大素數,生成數)
傳輸方和接收方各選擇一個隨機數x和y
A:將g^x%p --> B
B:將g^y%p --> A
A:(g^y%p)^x=g^yx%p
B:(g^x%p)^y=g^xy%p
身份驗證:
公鑰加密算法:非對稱加密算法
祕鑰對:
公鑰:p
私鑰:s
發送方用本身的私鑰加密數據,能夠實現身份驗證
發送方用對方的公鑰加密數據,能夠保證數據機密性
公鑰加密算法不多用來加密數據:速度太慢
PKI:Public Key Infrastructure
CA:Certificate Authority
證書格式:
x509:主流格式
公鑰及其有效期限
證書的合法擁有者
證書該如何被使用
CA的信息
CA簽名的校驗碼
pkcs12
PKI:
TLS/SSL:x509格式證書
SSL:Secure Scoket Layer 安全套接字層,目前使用版本爲v2和v3
TLS:Transport Layer Security 傳輸層安全
OpenGPG:另外一種PKI加密格式,格式類似
https(tcp):
客戶端發起鏈接請求
雙方互相協商創建SSL會話,協商使用SSL仍是TLS協議以及使用的版本號
協商好後server端會將本身的公鑰證書發給客戶端,客戶端驗證證書是否安全機構頒發,而且驗證完整性
客戶端創建一個會話祕鑰,而且經過server端公鑰將生成的會話祕鑰一併加密後傳遞給server端
server端使用此客戶端密碼即可以加密數據發送給客戶端了
私鑰丟失:經過CRL:證書吊銷列表。仍未過時由於其餘緣由而提早失效的證書信息
收到信息的一方會先從CRL中查看是否有此證書,若是有則失效
加密工具:
OpenSSL:SSL的開源實現,功能強大,涵蓋世面全部加密格式
libcrypto:通用加密庫,提供各類加密函數
libsshl:TLS/SSL的實現
基於會話的、實現了身份認證、數據機密性和會話完整性的TLS/SSL庫
openssl:多用途命令行工具
實現私有證書辦法機構
子命令:
openssl ? :能夠給出標準子命令選項
speed:測試每種加密算法的性能評估,可跟加密算法,不加默認顯示全部加密速率
enc -ciphername加密算法 -in filename從哪一個文件讀入 -out filename
加密後輸出到哪一個文件:
-e:加密
-d:解密
-k:指定加密祕鑰
-salt:實現更高的安全性
例:加密:openssl enc -des3 -salt -a -in inittab -out inittab.des3
輸入密碼後生成加密文件
讀取:openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab
輸入密碼解密看原文件
passwd:給用戶生成密碼串
-1:指定使用MD5方式加密,輸入正常的密碼最後得出加密後的密碼串
-1 -salt 輸入指定的salt內容,得出內容一致,salt和passwd同樣的狀況下得出結果相同,salt內容在加密密碼串的第二個$和第三個$中間的內容
rsa:加密、簽名
rsautl
dsa:簽名
rand:生成僞隨機數,得到隨機數openssl rand -base64 指定任意隨機數長度位數,得出加密後的內容
查看文件特徵碼:
md5sum inittab:查看inittab的MD5校驗碼
sha1sum inittab:查看sha1校驗碼,長度不一樣
openssl dgst -sha1 inittab:查看sha1校驗碼,與上面的sha1校驗碼一致
註解:若是碰到與系統命令衝突的選項,先使用whatis passwd查看,找對應的選項來man,例如:man sslpasswd
rpm -ql openssl 能夠查看與openssl包相關的全部文件
openssl實現私有CA:
一、先生成一對祕鑰
openssl
genrsa 指定祕鑰長度:生成一個rsa私鑰,權限應是600,輸出重定向爲server.key保存爲文件
-out 輸出名稱:也能夠保存成文件
小竅門:
在輸出命令時用()括起來,表示括號中的內容在子shell中執行,而且執行結束後自動退出子shell
例如:
(umask 077; openssl genrsa server1024.key 1024) # 直接執行命令並設置權限爲600
再使用umask查看當前shell仍然是0022,不影響當前shell環境
提取公鑰
openssl rsa -in server1024.key私鑰文件 -pubout # 這樣就輸出了對應此私鑰的公鑰
二、生成自簽署證書
openssl
req:生成證書工具
例:openssl req -new -x509 -key server1024.key -out server.crt -days 365
輸入證書擁有者的信息:
國家代碼:中國CN
省份名稱:HeBei
城市名稱:ShiJiaZhuang
單位名稱:NanTian
部門名稱:Tech
主機名稱:與hostname保持一致(重要)
郵箱地址:donray_h@163.com
證書生成
cat server.crt 能夠直接查看證書內容,可是密文
openssl x509 -text -in server.crt 以文本格式輸出信息
使用祕鑰證書:
cd /etc/pki/tls/
vim openssl.cnf
[ CA_default ]
下面的內容按照證書內容更改,最好寫爲絕對路徑
[ req_distinguished_name ]
更改默認內容,上面生成證書過程的內容均可以默認爲本身隨填寫的內容
爲CA準備私鑰和證書:
cd /etc/pki/CA
(umask 077,openssl genrsa -out private/cakey.pem 2048)
req -new -x509 -key private/cakey.pem -out cacert.pem
一直回車生成自簽署證書
在CA目錄下建立所需目錄
mkdir certs newcerts crl
touch index.txt
touch serial
echo 01 > serial
此時CA服務器已建立完成
在另外一臺服務器使用這個CA服務器提供祕鑰服務
登陸另外一臺web服務器
cd /etc/httpd
mkdir ssl
cd ssl
(umask 077; openssl genrsa -out httpd.key 1024) 生成本身的私鑰
生成證書頒發請求:
openssl req -new -key httpd.key -out httpd.csr # csr爲證書籤署請求
輸入請求內容,必須與CA一致,更改則沒法簽署
最後可輸入密碼加密證書,直接敲回車則爲不加密
遠程發送請求給CA服務器
openssl ca -in httpd.csr -out httpd.crt -days 365
第一次y爲是否簽署
第二次爲是否提交
當前目錄就生成了httpd.crt
完成後再證書服務器中CA目錄下查看index.txt文件能夠看到相關注冊信息
再 cat serial 也有相關信息便可
另外工具:
cd /etc/pki/tls/certs/
使用Makefile快速生成祕鑰證書,只能在測試環境中使用,不能用在生產環境
在此目錄直接執行make httpd.pem
生成私鑰填寫相關證書信息便可完成
將httpd.pem拷貝走便可,但此文件中既有私鑰又有證書,也能夠make xx.crt xx.csr等任何後綴的祕鑰文件,能夠查看makefile內容具體使用
OpenSSH:
開源版本的SSH工具
ssh:Secure SHell,TCP/22
C/S架構
v1,v2版本,v1已基本廢棄
客戶端:
Linux:ssh
Windows:putty,SecureCRT(商業版),SSHSecureShellClient,Xmanager(商業版)
服務器端:
sshd
openssh(ssh,sshd)
sshd:主機祕鑰(第一次鏈接時發送)
一、客戶端先贊成接收服務器端的公鑰
二、生成會話對稱祕鑰,用此祕鑰加密數據發送便可
netstat
-r:查看路由
-n:以數字方式顯示各主機或端口等相關信息
-l:listening監聽狀態
-t:表明TCP鏈接
-u:表明UDP鏈接
-p:process 進程
配置文件:
/etc/ssh/目錄下
ssh客戶端配置文件(ssh_config)
每次使用ssh命令登陸另外一臺主機後,在主機目錄下會建立.ssh目錄,目錄下會有known_host文件,裏面會有主機IP地址和對應公鑰信息,所以第二次再登陸就無需再認證了
ssh -l USERNAME REMOTE_HOST ['command'] # 不登陸對方主機,只顯示對端主機執行命令的結果
-X:登陸到對端並執行X11圖形窗口命令
-Y:Y是開啓X11並轉換圖形界面,所以Y比X更安全可靠
-p 端口號:指定端口號鏈接
sshd服務器端配置文件(sshd_config)
配置文件中,井號開頭的全爲註釋,井號後面有空格的爲純註釋行,沒有空格的爲能夠啓用的參數選項
Protocol 2 # ssh版本爲v2版
Port 22 # 端口號,能夠自定義爲其餘端口號
AddressFamily any # 支持IPv4 仍是IPv6,any指都支持
ListenAddress 0.0.0.0 # 表示監聽在哪一個地址上,若是服務器多個地址,指定一個IP地址爲對外提供sshd服務的地址,其餘地址不對外提供此服務
HostKey for protocol version 1或2 # 爲v1或v2版本指定key的私鑰文件
KeyRegenerationInterval 1h # 祕鑰多久更換一次,1h表示1小時
ServerKeyBits 768 # 此項表示服務器端祕鑰長度爲768位
SyslogFacility AUTHPRIV # 使用哪一個Facility來記錄日誌
LogLevel INFO # 日誌級別
LoginGraceTime 2m # 登陸寬限期,表示輸入用戶名和輸入密碼之間的時長,超過多少就還原爲初始狀態
PermitRootLongin yes|no # 是否容許root用戶直接登陸
StrictModes yes|no # 是否使用嚴格限定模式
MaxAuthTries 6 # 超過多少次錯誤,鎖定終端,禁止登陸
PubkeyAuthentication yes|no # 基於祕鑰的認證機制
AuthorizedKeysFile .ssh/authorized_keys # 客戶端會生成祕鑰併發送給服務器端的用戶的家目錄下指定文件位置和名稱
PasswordAuthentication yes|no # 是否支持基於口令的認證
UsePAM yes|no # 是否使用PAM進行認證
X11Forwarding yes|no # 是否轉發X11請求
Banner /some/path # 登陸信息提示存儲文件
PrintMotd yes|no # 是否顯示MOTD文件內容/etc/motd
PrintLastLog yes|no # 是否顯示上一次經過那個主機登陸過,不該顯示
Subsystem sftp /usr/libexec/openssh/sftp-server # ssh子系統sftp,能夠基於ssh服務使用sftp
想更深刻了解sshd_config文件內容,能夠使用man sshd_config命令查看詳細狀況
AllowUsers # 容許哪些用戶訪問,白名單
DenyUsers # 拒絕哪些用戶訪問,黑名單
AllowGroup # 容許哪些組成員訪問,白名單組
DenyGroup # 拒絕哪些組成員訪問,黑名單組
黑白名單同時存在時,黑名單失效
目錄下還有文件:
如下兩套私鑰和公鑰是爲v2版本算法使用的
ssh_host_dsa_key
ssh_host_dsa_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub
如下私鑰公鑰是爲v1算法使用的
ssh_host_key
ssh_host_key.pub
私鑰文件是600權限
基於祕鑰的認證:
一臺主機位客戶端(基於某個用戶實現):
一、生成一對祕鑰
ssh-keygen -t rsa # 回車後在用戶家目錄下.ssh/id_rsa,公鑰就是id_rsa.pub
-t {rsa|dsa}:指定加密算法
-f /path/to/keyfile:自定義保存到哪一個文件
.ssh目錄爲700權限,若是本身建立記得改目錄權限,不改則沒法使用
-N 'password':指定密碼,也能夠什麼不寫密碼爲空
二、將公鑰傳輸至服務器端某用戶的家目錄下的.ssh/authorized_keys文件中
使用文件傳輸工具傳輸(ssh-copy-id,scp)
ssh-copy-id
-i /path/to/pubkey USERNAME@REMOTE_HOST
另外一種方式:
scp -a /path/to/pubkey USERNAME@REMOTE_HOST:/home/hadoop/.ssh/pubkey
cat .ssh/pubkey >> .ssh/authorized_keys
三、測試登陸
scp:基於ssh的遠程複製命令,能夠實如今主機之間傳輸數據
scp [options] SRC DEST
-r:複製目錄
-a:遞歸複製
-p:保存原來權限信息,-a=-rp
sftp:基於ssh方式加密傳輸數據的命令
sftp root@172.16.100.2
get file # 下載某個文件
mget files # 下載多個文件
put file # 上傳某個文件
mput files # 上傳多個文件
總結:
一、密碼應該常常換且足夠複雜;
二、使用非正常端口;
三、限制登陸客戶端地址;
四、禁止管理員直接登陸;
五、僅容許有限制用戶登陸;
六、使用基於祕鑰的認證;
七、不要使用協議版本1;
遠程免密登陸:
在遠程登陸客戶端生成本機的密鑰
傳到linux服務器上
cat id_rsa_1024.pub >> .ssh/authorized_keys
便可完成免密登陸
登陸時輸入用戶名後選擇pubkey選項進行登陸便可
使用其餘端口號
ssh IP地址 端口號 #便可登陸
嵌入式系統專用的ssh軟件:dropbear 移至入自制操做系統,也能夠實現遠程鏈接
DNS:域名解析,BIND:Berkeley Internet Name Domain
SSL/TLS:http --> https --> OpenSSL,CA,Digital Certificate,PKI
HTTP:HTTP協議,Apache,LAMP,Nginx(Engine X),LNMP(LEMP),MySQL,PHP,varnish
CDN:DNS(View)智能DNS,varnish
File Server:NFS、SMB/CIFS、FTP
Netfilter:iptables(fileter,nat,mangle,raw)、tcp wrapper
NSSwitch:網絡服務轉換,實現名稱解析,framework框架,platform平臺;PAM:插入式認證模塊
SMTP/POP3/IMAP4:Mail Server
SELinux:Sercurity Enhenced Linux,安全增強的Linux,操做系統分爲ABCD4個級別,A級別最高,D級別最低,Linux和Windows均爲C2級別
Linux相對更穩定十年八年不重啓不會有影響,Windows則沒法作到,但安全性其實相同
C2-->SELinux-->B1 開啓SElinux能夠將C2級別提高至B1,可是開啓後配置過程很是複雜,所以不建議開啓
MySQL:
DNS:Domain Name Service 名稱解析,Name Resolving 名稱轉換(背後有查詢過程,數據庫)
域名:www.magedu.com(主機名或者FQDN:Full Qualified Domain Name,徹底限定域名)
FQDN<-->IP 雙向轉換
數據庫內存儲內容以下:
172.16.0.1 www.magedu.com.
172.16.0.2 mail.magedu.com.
nsswitch:配置文件:/etc/nsswitch.conf
libnss_files.so
libnss_dns.so
系統啓動過程有一行:
hosts: files dns
file:/etc/hosts
dns:DNS服務
stub resolver:名稱解析器,經過某個庫先找對應文件再找對應服務
hosts:
IPADDR FQDN Ailases
172.16.0.1 www.magedu.com www
IANA:互聯網地址名稱分配機構,美國機構
ICANN:頂級域名管理組織
TLD:Top Level Domain 頂級域
組織域:.com,.org,.net,.cc
國家域:.cn,.tw,.jp,.hk,.iq,.ir
反向域:IP-->FQDN,正反向均爲不一樣數據庫
正向:FQDN-->IP
請求方式分兩種:
遞歸:A請求B找答案,B沒有去照C,C返回答案給B,B再返回給A;A只發送一次請求獲得答案。
迭代:A請求B找答案,B告訴A去找C要,A再請求C給答案,C返回答案給A;A發送屢次請求獲得答案。
實際解析過程是迭代方式,用戶發起請求給NS服務器,由NS服務器找根,找頂級域,找最終域名解析,反饋給NS,並緩存在本身的服務器中,再反饋給用戶。
FQDN-->IP:
www.magedu.com. 綁定多IP,起到負載均衡做用
查詢:
遞歸:只發出一次請求
迭代:可能發出屢次請求
解析:
正向:FQDN-->IP
反向:IP-->FQDN
兩段式:遞歸,迭代
DNS:分佈式數據庫
上級僅知道其直接下級;
下級只知道根的位置;
DNS服務器:
接受本地客戶端查詢請求(遞歸)
外部客戶端請求:請求權威答案
確定答案:TTL(緩存時長)
否認答案:TTL(緩存時長)
外部客戶端請求:非權威答案
根節點服務器共13個:
a.root-server.net 至 m.root-server.net
主、從DNS:
主DNS服務器:數據修改
輔助DNS服務器:請求數據同步
serial number:有更改序列號加1,輔助發現版本不一致就會同步數據,最長不能超過10位
refresh:刷新時間,多久刷新序列號版本
retry:重試時間
expire:過時時間,多久主DNS無響應定義爲主服務器掛了
nagative answer TTL:否認答案的緩存時長
緩存DNS服務器:只負責緩存本地DNS解析
轉發器:不緩存只轉發請求,即去掉緩存服務的DNS服務器
數據庫中的:每個條目稱做一個資源記錄(Resource Record,簡寫:RR)
資源記錄的格式:
NAME TTL(緩存時長) IN(代表INTERNET) RRT(資源記錄類型) VALUE(數據)
例:
正向:
www.magedu.com. IN A 1.1.1.1
反向:
1.1.1.1 IN A www.magedu.com.
資源記錄類型RRT:
SOA(Start of Authority):起始受權記錄,代表一個區域內部主從服務器之間如何同步數據以及起始受權對象是誰
ZONE NAME TTL IN SOA FQDN ADMINISTRATOR_MAILBOX (serial number) (refresh) (retry) (expire) (na ttl)
時間:H(小時)、M(分鐘)、D(天)、W(周),默認單位是秒
郵箱格式:admin@magedu.com @在記錄中表示區域所以要寫爲 admin.magedu.com
例:在此配置項例;爲註釋
magedu.com. 600 IN SOA ns1.magedu.com. admin.magedu.com. (2013040101 1H 5M 1W 1D )
NS(Name Server):ZONE NAME --> FQDN
例:magedu.com. 600 IN NS ns1.magedu.com.
magedu.com. 600 IN NS ns2.magedu.com.
ns1.magedu.com. 600 IN A 1.1.1.2
ns2.magedu.com. 600 IN A 1.1.1.5
以上必須成對出現,有代表自身爲DNS服務器,也要有自身IP信息
A(addrss):FQDN-->IPV4 經常使用DNS記錄
AAAA:FQDN-->IPV6
PTR(pointer):IP-->FQDN
MX(Mail eXchanger):郵件服務器,ZONE NAME --> FQDN
ZONE NAME TTL IN MX pri VALUE
優先級pri:0-99,數字越小級別越高
magedu.com. 600 IN MX 10 mail.megedu.com.
mail.magedu.com. 600 IN A 1.1.1.3
CNAME(Canonical NAME):FQDN-->FQDN 別名
www2.magedu.com. IN CNAME www.magedu.com.
不經常使用:
TXT
CHAOS
SRV
域:Domain(邏輯概念)
域的受權由上級決定
區域:Zone(物理概念)
創建正反向區域文件:
正向:
magedu.com. IN SOA
www IN A 192.168.0.1
反向:
0.168.192.in-addr.arpa. IN SOA
PTR:
1.0.168.192.in-addr.arpa. IN PTR www.magedu.com.
簡寫:
1 IN PTR www.magedu.com.
區域傳送的類型:
徹底區域傳送:axfr
增量區域傳送:ixfr
區域類型:
主區域:master
從區域:slave
提示區域:hint
轉發區域:forward
建立域名服務器:
magedu.com 172.16.100.0/24
ns 172.16.100.1
www 172.16.100.1,172.16.100.3
mail 172.16.100.2
ftp www
DNS:BIND
Berkeley Internel Name Domain
ISC:互聯網系統協會,目前由ISC來維護,www.isc.org能夠提供BIND和DHCP下載源碼包
檢查包安裝:
yum list all|grep "^bind"
rpm -ql bind-utils # 查看bind提供的客戶端工具
rpm -e bind-libs bind-utils # 卸載原始自帶bind已安裝包
yum install bind97-libs bind97-utils #安裝97版本的bind
bind97-libs:bind所需的庫文件
bind97-utils:bind所需的客戶端工具
yum info bind97-devel #查看bind97-devel包的詳細信息
bind全部頭文件和庫文件,針對BIND9或者BIND8進行二次開發的時候使用的包
bind-chroot:
默認:named
用戶:named
組:named
/var/named/chroot/ # DNS服務的根目錄
etc/named.conf # 基於DNS根目錄下的配置文件,並不是系統根目錄下
etc/rdnc.key
sbin/named
var/named/
yum info caching-nameserver
使BIND成爲緩存DNS服務器的工具
緩存-->主-->從
bind97:
/etc/named.conf
BIND進程的工做屬性
區域的定義
/etc/rndc.key
rndc:Remote Name Domain Controller,遠程名稱控制服務的祕鑰文件
配置信息:/etc/rncd.conf
/var/named/目錄下建立數據文件
區域數據文件
/etc/rc.d/init.d/named
{start|stop|restart|status|reload|configtest}
configtest:檢查語法錯誤的
二進制程序:named
yum install bind97 -y # 安裝bind97的包
rpm -ql bind97 # 查看安裝後生成的全部文件和命令
named-checkconfig
named-checkzone
named.ca
13個根節點服務器的地址,部分根節點有IPV4和IPV6兩個地址
named.localhost
本地主機
named.loopback
本地主機名的正反向解析
經常使用命令:
dig:Domain Information Gropher
-t:指定資源記錄類型內的全部結果,如:dig -t NS . 此命令指查詢全部根域服務器
後面跟@某個NS服務器也能夠在此主機中查找根域服務器信息
service named start 啓動dns服務
監聽的協議及端口:
53/UDP:查詢快速
53/TCP:傳輸可靠數據時用tcp
953/tcp,rndc:遠程域名控制器使用
SOCKET:套接字
IP:PORT
C/S:Client/Server
172.0.0.1:53
172.16.100.1:53
重寫配置文件,此配置文件每行都要以;號結尾
vim /etc/named.conf # 權限爲640
options {
directory "/var/named";
allow-recursion { 172.16.0.0/16; };
notify yes; # 啓動通知功能
};
zone "." IN {
type hint
file "named.ca";
};
zone "localhost" IN {
type master
file "named.localhost";
allow-transfer { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master
file "named.loopback";
};
zone "mageedu.com" IN {
type master
file "mageedu.com.zone";
allow-transfer { 172.16.100.1; };
};
zone "100.16.127.in-addr.arpa" IN {
type master;
file "172.16.100.zone";
allow-transfer { 172.10.100.2; };
};
根區域:
zone "ZONE NAME" IN {
type {master|slave|hint|forward}
}:
主區域:
file "區域數據文件";
從區域:
file "區域數據文件";
masters {master1_ip;};
更改屬組屬主:
chown root:named /etc/named.conf
改權限:
chmod 640 /etc/named.conf
檢查語法:
named-checkconf # 不報任何信息爲無語法錯誤
named-checkzone "." /var/named/named.ca # 格式均爲"區域名" 後跟相應的配置文件
"localhost" /var/named/named.localhost
以上爲逐條檢測,也能夠用下面的命令一次性檢查:
service named configtest
啓動服務:
service named start
啓動後查看日誌內容
tail /var/log/messages 能夠查看到關於named進程啓動狀況
臨時性的關閉SELinux
#getenforce 查看當前狀態
Enforcing 開啓狀態
#setenforce 0 關閉
#getenforce
Permissive 已關閉
永久關閉SELinux
#vim /etc/selinux/config
SELINUX=enforcing改成permissive或者disabled
檢查開啓狀態:
netstat -tunlp 查看是否有53端口開啓
首先將本機DNS解析服務器改成所配置的服務器:
vim /etc/resolv.conf
nameserver 172.16.100.1
檢測解析狀態:
dig -t NS . # 解析根,能夠查看到
設置開機啓動:
chkconfig --list named 檢查named服務開機啓動級別
chkconfig named on 開啓開機啓動,默認級別345均開啓
建立本身的域:
編輯vim /etc/named.conf配置文件
添加正向解析:
zone "mageedu.com" IN {
type master;
file "mageedu.com.zone";
};
保存退出
named-checkconf 檢測配置文件語法,不報錯則經過
建立mageedu.com.zone文件,區域數據文件中只能放記錄,SOA以及TTL值等
vim /var/named/mageedu.com.zone
$TTL 600 # 前面加$符號表示宏,全局引用
@或mageedu.com IN SOA ns1.mageedu.com. admin.mageedu.com. ( 2013040101 1H 5M 2D 6H )
空(表示與上一條內容一致) 600 IN NS ns1
IN MX 10 mail
ns1 IN A 172.16.100.1 任何一個NS記錄都必須有個A記錄與之相隨
mail IN A 172.16.100.2
www IN A 172.16.100.1
www IN A 172.16.100.3
ftp IN CNAME www
保存退出
chmod 640 mageedu.com.zone
chown root:named mageedu.com.zone
named-checkzone "mageedu.com" /var/named/mageedu.com.zone
service named restart 重啓服務
dig命令用法:
-t RT資源記錄類型 name @IP:表示查詢某個名稱在某資源記錄類型中是否存在,後面@IP表示直接去某個IP查找
-t NS mageedu.com:是否有mageedu.com域下的NS服務器是哪臺
例如:
dig -t A www.mageedu.com
QUESTION SECTION:表示你命令的問題是想要www.mageedu.com的全部A記錄內容
ANSWER SECTION:表示答案有兩條
AUTHORITY SECTION:受權區域段,是由哪一個dns承載權威域解析的
ADDITIONAL SECTION:附加段,任何一個NS記錄都會有一個A記錄與之相隨,所以這是受權區域的A記錄
dig -x IP:
根據IP查找FQDN
host命令用法:
host -t RT NAME:查詢名稱的解析結果,RT表示資源類型例如:SOA、NS、MX、A等
nslookup:交互式模式
nslookup:回車後填寫DNS server解析
set q=A 表示查詢A記錄
NAME 輸入域能夠獲得此域A記錄全部內容
反向區域配置:
編輯vim /etc/named.conf配置文件
添加:
zone "100.16.172.in-addr.arpa" IN {
type master
file "172.16.100.zone";
};
保存退出
cp -p mageedu.com.zone 172.16.100.zone 直接把正向複製爲反向改一下內容便可,-p保留權限
vim 172.16.100.zone # 反向解析中NS不準跟隨A記錄,而且不須要寫MX的mail記錄
$TTL 600 # 前面加$符號表示宏,全局引用
@ IN SOA ns1.mageedu.com. admin.mageedu.com. ( 2013040101 1H 5M 2D 6H )
IN NS ns1.mageedu.com. # 反向區域中不能簡寫
1 IN PTR ns1.mageedu.com.
1 IN PTR www.mageedu.com.
2 IN PTR mail.mageedu.com.
3 IN PTR www.mageedu.com.
保存退出 # 配置中1 2 3表示172.16.100.1-2-3
named-checkconf
named-checkzone "100.16.172.in-addr.arpa" 172.16.100.zone
service named restart
檢查結果:
nslookup
set q=PTR
172.16.100.1
set q=PTR
172.16.100.3
godaddy.com 註冊域名,無需工信部備案
dig:
aa:Authority ANSWER
泛域解析:
*.mageedu.com. IN A
vim /etc/named.conf 在options全局配置下添加recursion yes;容許遞歸打開,收到惡意攻擊時不會馬上掛掉
options {
recursion yes; # 開啓遞歸功能,針對全局
allow-recursion { 172.16.0.0/16; }; #定義遞歸範圍和來源
allow-query { 範圍; }; #只容許哪些範圍來查詢
allow-transfer { 範圍; }; #只容許誰來傳送
}
使用dig測試遞歸模式
dig +recurse -t A www.sohu.com @172.16.100.1 #回車後無反饋結果則爲遞歸未開啓,正常會反饋遞歸解析的過程
dig +norecurse -t A www.baidu.com @172.16.100.1 #不適用遞歸則通知去照根進行解析
dig +norecurse -t A www.baidu.com @a.gtld-servers.net #則由根反饋baidu的dns服務器的結果
dig +norecurse -t A www.baidu.com @dns.baidu.com #此時才能獲得最終的解析結果
使用dig查詢區域傳送
axfr:徹底區域傳送
ixfr:增量區域傳送
dig -t axfr mageedu.com #獲得查詢區域內的全部數據
dig -t ixfr=2013040201 mageedu.com #在 2013040201這個版本中更新的增量內容
區域傳送存在於主從結構:
allow-transfer { 範圍; }; #只容許誰來傳送,能夠寫到全局模式下也能夠寫到某個zone下
建立從服務器:
在第二臺dns服務器安裝包:
rpm -e bind-libs bind-utils
yum -y install bind97 bind97-utils
setenforce 0
mv /etc/named.conf /etc/named.conf.orig
scp 172.16.100.1:/etc/named.conf /etc/ # 拷貝主dns的配置文件
vim /etc/named.conf
options {
directory "/var/named";
allow-recursion { 172.16.0.0/16; };
notify yes; # 啓動通知功能
};
zone "." IN {
type hint
file "named.ca";
};
zone "localhost" IN {
type master
file "named.localhost";
allow-transfer { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master
file "named.loopback";
};
zone "mageedu.com" IN {
type slave; #修改
file "slaves/mageedu.com.zone"; #修改
masters { 172.16.100.1; }; #添加
allow-transfer { none; }; #修改
};
zone "100.16.127.in-addr.arpa" IN {
type slave; #修改
file "slaves/172.16.100.zone"; #修改
masters { 172.16.100.1; }; #添加
allow-transfer { none; }; #修改
};
named-checkconf 檢查配置文件
serivce named restart #可能沒法啓動,經過查看/var/log/messages日誌發現配置文件權限問題
chgrp named /etc/named.conf #更改成named屬組權限,從新啓動named服務便可
重啓完以後再主DNS端查看/var/log/massages裏會有AXFR started和ended信息說明將主域正向反向配置信息徹底同步至從服務器
從DNS服務器也能夠看到傳送開始的日誌
此時在主服務器的zone文件下添加
imap IN A 172.16.100.5
保存並記得更改版本號
再查看主從服務器的messages日誌
此時未出現日誌同步結果,解決方法:
由於zone文件中未標記ns2從服務器的指向,需在正反向zone文件添加從服務器信息:
IN NS ns2
ns2 IN A 172.16.100.2
將從服務器的zone文件刪除,重啓服務作徹底同步
再次在主服務器添加一條新記錄,service named reload從新加載,查看日誌會有
IXFR started和ended的增量同步信息
rndc:遠程域名控制器使用
rndc-confgen > /etc/rndc.conf
cat /etc/rndc.conf
將裏面的key開頭到結尾的內容所有複製到named.conf文件中去
vim /etc/rndc.conf
進入後冒號輸入模式從當前行到結尾倒數第2行內容追加到/etc/named.conf文件中去
:.,$-1w >> /etc/named.conf
vim /etc/named.conf
進入後冒號輸入模式從當前行到結尾的全部以#開頭並後跟空格的內容所有替換爲空,去掉井號註釋
:.,$s/^# //g
保存退出
此時再看rndc.conf能看到多了key的內容
使用命令:
service named restart
rndc -c /etc/rndc.conf status #此時日式key文件有問題的話,須要rm /etc/rndc.key刪除這個文件
rndc -c /etc/rndc.conf notify "mageedu.com" #手動通知
rndc -c /etc/rndc.conf flush #清空緩存
rndc -c /etc/rndc.conf stop #中止服務
控制遠程主機:
控制遠程DNS服務器必須更改端口
vim /etc/named.conf
controls {
inet 172.16.100.1 port 953
allow { 172.16.100.2; } keys { "rndc-key"; };
}
保存退出,重啓服務
scp /etc/rndc.conf 172.16.100.2:/root/ #將配置文件拷貝到從服務器
到從服務器編輯rndc.conf
vim /root/rndc.conf
將default-server 172.16.100.1 #將服務器更改成主DNS地址,系統時間不一樣步也會影響DNS的解析
子域受權:
正向區域:
SUB_ZONE_NAME IN NS NSSERVER_SUB_ZONE_NAME
NSSERVER_SUB_ZONE_NAME IN A IP
父域受權子域:看到類型爲NS則爲域或子域
vim /var/named/mageedu.com.zone
添加ns記錄
fin.mageedu.com. IN NS ns1.fin.mageedu.com.
fin.mageedu.com. IN NS ns2.fin.mageedu.com.
ns1.fin.mageedu.com. IN A 172.16.100.8
ns2.fin.mageedu.com. IN A 172.16.100.9
maerket.mageedu.com. IN NS ns1.market.mageedu.com.
ns1.market.mageedu.com. IN A 172.16.100.108
子域沒法解析轉發:
vim /etc/named.conf
options 下添加以下內容,表示全局生效
forward {only|first} # 若是解析不了,都轉發給某個地址
only:只轉發給某個地址
first:先轉發,轉發無果找根
forwarders { 172.16.100.1; }; # 轉發給誰,指定轉發對象
指定轉發域:
zone "ZONE_NAME" IN {
type forward;
forward {only|first};
forwarders { 172.16.100.1; };
};
測試:
dig +trace -t A www.badu.com # 追蹤解析過程
DNS視圖及日誌系統
acl的使用
allow-recursion {}; # 可以被遞歸的客戶端來源
allow-query {}; # 容許查詢的客戶端
allow-transfer {}; # 區域傳送
axfr:徹底區域傳送
ixfr:增量區域傳送
acl ACL_NAME {
172.16.0.0/16;
127.0.0.0/8;
};
如:
acl innet {
172.16.0.0/16;
127.0.0.0/8;
};
allow-query { innet; };
none;
any;
acl策略通常會寫到named.conf文件的最上方,options上方
acl innet {
172.16.0.0/16;
127.0.0.0/8;
}
options {
directory "/var/named";
allow-recursion { innet; }; #在options中容許acl策略便可
}
智能DNS
telecom:電信
unicom:聯通
兩套獨立網絡
在方莊附近有100G的帶寬線路鏈接兩個網絡
致使聯通和電信之間通訊很是慢
網站站點訪問最多須要3秒鐘,超過5秒網站流量會損失60%
split brain
按照不一樣網絡區分解析結果:
telecom:電信
unicom:聯通
web對象緩存
CDN:Content Delivery Network 內容分發網絡
DNS View配置:
vim named.conf
view VIEW_NAME {
};
一旦定義了視圖,全部的區域都必須定義在視圖中
按照模擬設定,劃分三個視圖:內網、聯通、電信
cp /etc/named.conf /etc/named.conf.bak
vim /etc/named.conf
在options下添加
acl telecom {
172.16.0.0/16;
127.0.0.0/8;
};
acl unicom {
192.168.0.0/24;
};
view telecom {
match-clients { telecom; };
zone "mageedu.con" IN {
type master;
file "telecom.mageedu.com.zone";
};
};
view unicom {
match-clients { unicom; };
zone "mageedu.con" IN {
type master;
file "unicom.mageedu.com.zone";
};
};
建立新的區域文件
vim /var/named/telecom.mageedu.com.zone
$TTL 43200
@ IN SOA ns1.mageedu.com. admin.mageedu.com. (
2013040201
1H
10M
7D
1D )
IN NS ns1
IN MX 10 mail
ns1 IN A 172.16.100.1
mail IN A 172.16.100.2
www IN A 172.16.100.3
保存退出
chgrp named /var/named/telecom.mageedu.com.zone
chmod 640 /var/named/telecom.mageedu.com.zone
cp -p /var/named/telecom.mageedu.com.zone /var/named/unicom.mageedu.com.zone
vim /var/named/unicom.mageedu.com.zone
$TTL 43200
@ IN SOA ns1.mageedu.com. admin.mageedu.com. (
2013040201
1H
10M
7D
1D )
IN NS ns1
IN MX 10 mail
ns1 IN A 172.16.100.1
mail IN A 192.168.0.16
www IN A 192.168.0.17
保存退出
重啓服務
service named restart
分別在192和172網段的客戶端使用dig -t A www.mageedu.com查看解析結果分別是本身的網絡IP
本地客戶端192和172地址都有
nslookup
server 172.16.100.1 # 指定DNS Server
set q=A # 設置要查詢的記錄類型
www.mageedu.com
返回結果是172.16.100.3
dnspod:
中國著名的免費智能DNS提供商
www.dns.la
國內排名第二的智能DNS提供商,馬哥建立
DLZ技術建立智能DNS
bind-sdb也是bind自帶的將DNS數據放入數據庫的工具
DNS開啓日誌功能:互聯網中使用不建議開啓日誌,對DNS服務器磁盤IO消耗較大
vim named.conf
在options中加入
querylog yes; # 便可開啓日誌功能,在/var/log/messages中能夠看到查詢解析日誌
DNS日誌系統能夠定義只記錄那些內容:
channel:日誌保存位置
一個category能夠被定義到多個channel,但一個channel只能夠定義一個category
syslog
file:自定義存放文件
日誌級別:
critical、error、warning、notice、info:默認級別、debug、dynamic
category:日誌願,可自定義日誌來願
查詢
區域傳送
default、general、queries(查詢操做產生日誌)、xfer-in(從服務器傳入的信息)、config(配置文件產生的問題)、network(網絡相關問題)、notify(通知相關內容)、security(拒絕的查詢請求)、
使用示例:
vim /etc/named.conf
添加
logging {
channel querylog {
file "/var/log/named/bind_query.log" versions 5 size 10M; #大小10M,日誌滾動大小,到10M及產生另外一個文件,最多保存5個版本
severity dynamic; # 日誌級別是dynamic
print-time yes;
print-severity yes;
print-category yes;
};
channel xfer_log {
file "/var/log/named/transfer.log" versions 3 size 10k; #大小10M,日誌滾動大小,到10M及產生另外一個文件,最多保存5個版本
severity dyebug 3; # 日誌級別是debug 3級別
print-time yes;
};
category query { querylog; }; # 查詢的信息保存至querylog定義的文件中
category xfer-out { xfer_log; };
};
模擬傳輸過程:
dig -t axfr mageedu.com @172.16.100.1
查看transfer.log就能夠看到日誌結果
注意:查詢和安全最好不要開啓,由於記錄內容過多,更新相關信息應該開啓。
dns服務器性能測試工具:
dnstop工具:監控dns服務器每秒能夠接受多少查詢,並記錄查詢哪一個域名。評估服務器查詢能力。
queryperf:壓力測試,bind包自帶,文件中解析很是快,而數據庫中主要看硬件性能,解析700-800個就很是不錯,而文件則會達到10000個查詢每秒是沒有問題的
queryperf使用方式:
源碼包安裝:
tar xf bind-9.7.4.tar.gz
cd bind-9.7.4
cd contrib
cd queryperf
yuminstall gcc make
./configure
make
cp queryperf /bin/
使用:
vim test # 把要解析的域名及類型寫入到測試文件中
www.mageedu.com A
mageedu.com NS
mageedu.com MX
保存退出
測試命令:
queryperf -d test -s 172.16.100.1 # -d指定測試文件,-s指定域服務器
會產生最終結果
queries per second:1899.936669 qps # 查詢內容過少可能時間不許確,多寫一些測試域名
寫入20萬條解析後結果:
queries per second:15025.942721 qps
跨主機進行解析,在其餘服務器進行測試結果:
queries per second:10328.214217 qps
dnstop使用:
源碼包安裝:
tar xf dnstop-20110502.tar.gz
cd dnstop-20110502
./configure
make
報錯缺乏軟件包libcap(抓包工具)
yum -y install libcap
yum -y install libpcap-devel
make clean
從新./configure
make
make install
默認安裝路徑:/usr/local/bin下
使用:
dnstop -4 -i 172.16.100.1 -R -Q eth0 # -4是指定ipv4 -i是指定dnsserver的IP地址 -Q統計查詢數 -R統計響應數
查看到動態統計內容,此時配合壓力測試,能夠監控到dns服務器工做狀態
注:named.conf註釋使用//,與C語言註釋方式相似。多行註釋方法:在註釋首行 /*在註釋末行輸*/ 完成多行註釋
將日誌記錄內容註銷掉後,性能會獲得明顯提高。
DHCP服務:Dynamic Host Configration Protocol 前身爲bootp
lease:租約
DHCP分配過程(廣播):
client--> DHCPDISCOVER 發現報文
server--> DHCPOFFER 服務端迴應報文
client--> DHCPREQUEST 應答報文決定使用DHCP分配IP
server--> DHCPACK 確認報文
續租過程(單播):
client--> DHCPREQUEST 應答報文繼續使用DHCP分配IP
server--> DHCPACK 確認報文
注:由於路由沒法廣播,所以DHCP服務器沒法跨網絡使用
跨網DHCP功能:
DHCP Relay:DHCP中繼器
DHCP安裝配置:
yum list all | grep dhcp # 檢查安裝
yum -y install dhcp # 安裝
rpm -ql dhcp #查看安裝相關文件
/etc/dhcpd.conf:dhcp主配置文件
/etc/sysconfig/dhcpd:dhcp服務進程
/etc/sysconfig/dhcrelay:dhcp中繼進程
/usr/sbin/dhcpd:dhcp服務啓動進程
/usr/sbin/dhcrelay:dhcp中繼器啓動進程
/var/lib/dhcpd/dhcpd.leases:租約信息記錄文件
vim /etc/dhcpd.conf # 內容爲空,讓拷貝配置文件dhcpd.conf.sample覆蓋
cp /usr/share/doc/dhcpd-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
vim /etc/dhcpd.conf
將網段範圍,網關,子網,DNS主副服務器,可分配的網絡地址段落,默認租約時間和最大租約時間以秒爲單位。其餘不用修改,保存退出便可。
dhcp服務器端監聽:67/udp
客戶端:68/udp
netstat -unlp # 查看監聽
綁定IP和mac地址:
vim /etc/dhcpd.conf
添加:
host ns {
hardware ethernet 00:0C:29:77:A2:EC;
fixed-address 172.16.100.33;
保存退出
service dhcpd restart 重啓服務
tail /var/lib/dhcpd/dhcpd.leases # 能夠看到租約信息
經常使用命令:
dhclient:down掉某個網卡,直接執行,能夠看到網卡分配地址續租詳細過程
-d:工做在前臺,ctrl+c結束進程,無需killall dhclient進程
HTTP:HyperText Transfer Protocol:超文本傳輸協議
超連接:連接之間跳轉
web:
http/0.9:僅純文本(超連接),ASCII
HTML:HyperText Mark Language:超文本編輯語言
<h2>Title</h2> 標記Title字體顯示格式
Browser:客戶端瀏覽器
URI:Uniform Resource Indentifier 統一資源標識符,全局範圍內,資源訪問路徑的命名方式
統一:路徑格式上的統一
URL:Uniform Resource Locator 統一資源定位符,URI的子集,互聯網範圍內的統一表示
protocol://host:port/path/to/file
如:
http://www.magedu.com/download/linux.tar.gz
web資源:http://www.magedu.com/logo.gif
多個資源極可能被整合爲一個html文檔
web對象:與web資源相同
HTTP方法:
GET:獲取web資源到本地
http/1.0:PUT,POST,DELETE
MIME:Multipurpose Internet Mail Extension,多用途互聯網郵件擴展
SMTP:Simple Mail Transmission Protocol,簡單郵件傳輸協議,只能傳輸純文本
MIME:將非文本數據在傳輸前從新編碼爲文本格式,接收方可以用相反的方式將其從新還原爲原來的格式,還可以調用相應的程序來打開此文件。
Base64:文本編碼格式
協議首部:
image/jpeg:會標記文件類型和格式,來標記打開其的相應程序
動態效果:ActiveX、Flash
Java,Applet,JRE
動態網頁:服務器端存儲的文檔非HTML格式,而是編程語言開發的腳本,腳本接受參數以後在服務器端執行一次,運行完成後會生成HTML格式的文檔,把生成的文檔發給客戶端;
web:index.php腳本,服務器根據擴展名經過某種協議調用相應的PHP解釋器來運行index.php,將生成的HTML文檔發送給客戶端
index.html:
引用N個web對象:URL
動態網頁:包含靜態內容和動態內容
動態內容部分才須要運行
IP首部:
Source IP
Destination IP
TCP首部:
Source Port
Destination Port
http首部:
GET /2.html
Host:www.magedu.com(虛擬主機)
HTTP報文:請求報文,響應報文
請求報文語法:
<method><request-URL><version> 資源獲取方法 請求資源URL 資源版本號
<headers> 首部
空白行必須留
<entity-body> 報文主體
響應報文語法:
<version><status><reason-phrase> 版本 狀態碼 詳細解釋成功錯誤的信息
<headers>
<entity-body>
狀態碼:5類
1xx:純信息
2xx:「成功」類狀態信息(200:正常響應)
3xx:重定向類的信息(301:永久重定向、302:臨時重定向、304:請求無改變用緩存便可)
4xx:客戶端錯誤類狀態信息:(404:請求了不存在的文件)
5xx:服務器端錯誤類狀態信息:
請求報文樣例:
GET / HTTP/1.1 請求訪問/目錄爲默認頁面,http協議版本1.1
Host:www.magedu.com 首部名稱
Connection:keep-alive 首部
響應報文:
HTTP/1.1 200 OK 響應協議版本 狀態碼 詳細信息
X-Powered-By:PHP/5.2.17 首部經過PHP解釋器解析
Very:Accept-Encoding,Cookie,User-Agent 額外標記變化類內容
Cache-Control:max-age=3,must-revalidate 控制客戶端可否緩存
Content-Encoding:gzip 內容編碼機制壓縮後發佈
Content-Length:6931 內容長度
上面兩個報文的第一行一般稱做報文"起始行(start line)";後面的標籤格式的內容稱做首部域(Header field),每一個首部域都由名稱(name)和值(value)組成,中間用逗號分隔。另外,響應報文一般還有一個稱做Body的信息主體,即響應給客戶端的內容。
web服務器的主要操做:
一、創建鏈接--接受或拒絕客戶端鏈接請求;
二、接收請求--經過網絡讀取HTTP請求報文;
三、處理請求--解析請求報文並做出響應的動做;
四、訪問資源--訪問請求報文中相關的資源;
五、構建響應--使用正確的首部生成HTTP響應報文;
六、發送響應--向客戶端發宋生成的響應報文;
七、記錄日誌--當已經完成的HTTP事務記錄進日誌文件。
每一個web資源都須要單獨請求單獨響應
http/1.1:
加強了緩存
增長了長鏈接:TCP三次握手創建鏈接後,長時間鏈接狀態持續傳輸文件,併發量過大時會阻塞。長鏈接對服務器性能影響較大
一、設置鏈接超時時長
二、設置鏈接次數
Server模型:
一、單進程/單線程服務器模型
一個進程處理一個請求,後面的請求排隊
二、多進程/多線程服務器模型
一個進程接受請求後生成子進程處理,再接受另外一個請求生成另外一個子進程處理
三、單進程多請求
事件驅動結合狀態反饋通知,一個進程負責多個請求,均有一個進程響應,按期掃描請求完成狀況反饋響應,多個用戶請求同一個文件時能夠統一響應,減小資源使用量
四、多進程多請求(最優)
多進程事件驅動模型,每一個進程均可以接受多個請求,請求減小時進程能夠根據請求數量減小
httpd,MPM
prefork
work
event
C/S架構:
C:Client Agent (browser,spider)
S:Server
Client-->request-->Server
URL
Server-->response-->Client
HTTP Method
GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECTION
客戶端瀏覽器:
IE
Firefox
Chrome
Opera
Safari
Server:
Apache,httpd
IIS
Nignx
lighttpd
thttpd
應用程序服務器:不只能夠處理靜態內容,還能夠處理某種動態內容
IIS
Tomcat(apache,JSP,open source)java
Websphere(IBM,JSP,commodity)java
Weblogic(Oracle,JSP,commodity)java
JBoss(RedHat,核心是Tomcat)
最流行的web服務器統計:
www.netcraft.com 每半年或三個月統計一次web服務器排名
第一名:apache 58%
第二名:Microsoft 16%
第三名:Nginx 12%
第四名:Google 3.48%
web代理:
web代理服務器工做與web客戶端和web服務器之間,它負責接收來自於客戶端的HTTP請求,並將其轉發至對應的服務:然後接收來自於服務端的響應,並將響應報文回送至客戶端。
httpd安裝配置:
apache:A Patchy Server
開源組織基金會:
FSF:Free Software Foundation ,GNU組織,GPL
ASF:Apache Software Foundation 阿帕奇軟件基金會 www.apache.org
web:httpd
Tomcat(JSP應用發佈程序)
Hadoop(並行處理環境,提供高性能處理環境的框架)
web:http://httpd.apache.org
httpd:
web Server,Open Source
2.2主流,2.4最新,2.0穩定著稱,1.3老版本現已中止更新
httpd特性:
事先建立進程:
按需維持適當的進程
模塊設計,核心比較小,各類功能都經過模塊添加(包括PHP)
支持運行配置,支持單獨編譯模塊
支持多種方式的虛擬主機配置
Socket:IP:Port
虛擬主機:
基於IP的虛擬主機;
基於端口的虛擬主機;
基於域名的虛擬主機;
支持HTTPS協議(mod_ssl)
支持用戶認證
支持基於IP或主機名的ACL
支持每目錄的訪問控制
支持URL重寫,/imeage/a.jpeg,/bbs/images/abc.jpeg
nginx:多進程響應N用戶響應模型
RedHat(httpd):
rpm包:容易出現須要的模塊未編譯,不須要的卻編譯了,版本較老
源碼編譯:
HTTPD:SELinux(事先讓其處於permssive,disabled狀態)
getenforce查看SELinux狀態
使用setenforce 0 禁用,臨時方法
vim /etc/sysconfig/selinux
vim /etc/selinux/config
SELINUX=enforcing改成permssive # 爲方便往後啓用,最好改成permssive
httpd:
/usr/sbin/httpd (MPM:prefork)
一個httpd進程:root用戶,root組 (master process) 主導進程
其他httpd進程:apache用戶,apache組 (wrker process)工做進程
/etc/rc.d/init.d/httpd
port:(80/tcp),(ssl:443/tcp)
/etc/httpd:工做根目錄,至關於程序安裝目錄
/etc/httpd/conf:配置文件目錄
主配置文件:httpd.conf
/etc/httpd/conf.d/*.conf #也都是相關配置文件,只不過在主配置文件中用include加載到一塊兒了
/etc/httpd/modules:模塊目錄
/etc/httpd/logs --> /var/log/httpd:日誌目錄
日誌文件有兩類:訪問日誌access_log,錯誤日誌:err_log
/var/www/
html目錄:靜態頁面所在路徑
cgi-bin目錄:動態內容所使用路徑
cgi:Common Gateway Interfave,讓web服務器可以讓額外的應用程序處理動態內容
Client --> httpd(index.cgi)--> Spawn Process(index.cgi)--> httpd --> Client
perl,python,java(Servlet,JSP),php,
fastcgi:
程序:指令和數據組成 cpu-bound CPU密集型應用
數據:數據庫服務 cpu-bound CPU密集型應用
httpd安裝:
yum -y install httpd httpd-manual # httpd爲主程序,httpd-manual爲幫助手冊,安裝手冊後再訪問根目錄後面輸入manual訪問便可
安裝完成後查看生成的文件
rpm -ql httpd | less
存在配置文件,模塊,日誌等常規文件
/usr/bin/ab # apache壓力評估工具,經常使用
service httpd start # 啓動服務
netstat -tnlp|grep :80 # 查看監聽
pa aux|grep httpd # 查看進程
httpd配置:
cd /etc/httpd/conf
cp httpd.conf httpd.conf.bak1181023 # 先執行備份,若是改錯能夠保證恢復前一版
grep "Section" httpd.conf # 會顯示主配置文件的三個主要段落,一、全局配置;二、主服務器配置;三、虛擬主機配置
httpd.conf全局配置內容:
directive value
指令不區分大小寫
value則根據須要有可能要區分
ServerTokens OS # 定義打開apache頁面可輸出系統信息內容的詳細程度
ServerRoot "/etc/httpd" # 服務器根目錄
PidFile run/httpd.pid # 進程pid號存放
Timeout 120 # 建立鏈接超時時長
KeepAlive Off|On # 是否使用長鏈接,用戶量不是很大時打開優化性能
MaxKeepAliveRequests 100 # 打開長鏈接個數設定,0爲不限定
KeepAliveTimeout 15 # 長鏈接超時時長,單位秒
注:具體參數設定值,能夠使用ab或者LoadRunner進行壓測後優化參數值設定
MPM:Multi Path Modules,多道處理模塊
mpm_winnt:windows專用線程處理機制
perfork:一個請求用一個進程響應,預先生成進程 # 2.2版本默認使用perfork機制,穩定但併發量大時性能較差
worker:一個請求用一個線程響應,基於線程工做,啓動多個進程(默認兩個),每一個進程生成多個線程 # 性能較高,避免進程間爭搶資源就會加鎖,所以經測試,linux下性能不及perfork
event:一個進程處理多個請求 # 2.4版本後默認就是event機制,2.2中event是測試模型,不建議使用
使用 httpd -l查看當前服務器支持的模型類型,當前只支持prefork模型
rpm -ql httpd |grep bin # 能夠看到/usr/sbin/httpd.event和/usr/sbin/httpd.worker文件
使用這兩個文件便可開啓響應的模型模塊
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker 取消註釋,便可開啓worker模式
模塊配置屬性:
<IfModule prefork.c>
StartServers 8 # 開啓時啓動進程數
MinSpareServers 5 # 最少空閒進程數
MaxSpareServers 20 # 最大空閒進程數
ServerLimit 256 # MaxClients的上限值,硬限制
MaxClients 256 # 最大客戶端數,最多可鏈接進來的請求
MaxRequestsPerChild 4000# 一個進程最多響應多少次用戶請求,達到後就會被Kill掉,從新生成
</IfModule>
<IfModule worker.c>
StartServers 2 # 開啓時啓動進程數
MaxClients 150 # 最多客戶端請求數
MinSpareThreads 25 # 最小空閒線程數
MaxSpareThreads 75 # 最大空閒線程數
ThreadsPerChild 25 # 每一個進程可生成多少個線程
MaxRequestsPerChild 0 # 每一個進程接受多少次請求,由於由線程接受,所以不作限定
</IfModule>
Listen 80 # 監聽爲80端口
LoadModule auth_basic_module modules/mod_auth_basic.so # 加載模塊,加載指令 模塊名稱 模塊路徑
Include conf.d/*.conf # 將conf.d目錄下的全部.conf結尾的配置文件所有加載進主配置文件中
User apache # 啓動進程用戶
Group apache # 啓動進程組
主要Server配置端:
主server配置文件中的配置絕大多數都能在虛擬主機中使用
httpd.conf Main Server配置內容:
vim httpd.conf
ServerAdmin root@localhost
ServerName www.example.com:80 # 默認不啓用,若是不啓用會反向解析當前IP地址,解析到的主機名爲名稱,不然會報錯
UseCanonicalName Off # 自身名稱,默認關閉
DocumentRoot "/var/www/html" # 文檔根目錄,存放web頁面程序的
<Directory "/var/www/html"> #在此內容定義URL根目錄是如何被訪問的
Options Indexes FollowSymlinks #根目錄中全部頁面程序的展現屬性;
None:不支持任何選項,設置此項最爲安全;
Indexes:容許索引目錄,生成環境建議關閉;
FollowSymlinks:跟隨符號連接,容許訪問符號連接文件所指向原文件,生成應關閉,而且下降服務器性能;
Includes:容許執行服務端包含(SSI:格式的網頁文件);
SymLinksifOwnerMatch:容許執行符號連接原文件,但屬主必須跟httpd進程屬主相符合;
ExecCGI:容許運行CGI腳本;
MultiViews:多功能視圖,內容協商機制,較消耗資源,根據客戶端匹配語言或其餘相應內容
All:容許全部功能
AllowOverride None # 容許覆蓋下面兩項內容
FileInfo:
AuthConfig:須要創建一個訪問用戶名和密碼文件,容許此文件中的用戶使用密碼登陸後才能訪問
AuthType basic:基本認證
AuthName "Restricted Files":用戶認證時顯示名稱,告知用戶爲何認證
AuthUserFile /usr/local/apache/passwd/passwords:指定認證用戶列表文件
AuthUserFile /usr/local/apache/passwd/groups:指定認證組列表文件
Require user marion:只容許此用戶才能夠登陸
Require user GroupName:只容許某個組訪問
Require valid-user:只要出如今文件中的用戶都可登陸
htpasswd:專用建立httpd訪問用戶列表的命令
-c:第一次建立使用選項,已有的文件切忌使用,會將原文件覆蓋
-m:已MD5方式加密存放
-D:刪除用戶
例子:
htpasswd -c -m /etc/httpd/conf/htpasswd hadoop # 建立文件並添加hadoop用戶,回車後輸入密碼便可完成建立
再次添加去掉-c使用:htpasswd -m /etc/httpd/conf/htpasswd tom 便可
組文件自行建立vim htgroup 內容添加 myusers:hadoop tom # 組名稱冒號後跟用戶名,之間加空格
Limit:
Order allow,deny # 用於定義基於主機的訪問控制功能的,IP,網絡地址或主機定義訪問控制機制,此項爲先容許後拒絕,默認項爲拒絕
allow from 192.168.0.0/24 # 只容許此網段訪問
地址表示方式:IP,network/netmask,HOSTNAME,DOMAINNAME,Partial IP:172.16,
deny from
Allow from all # 容許全部訪問
<Directory>
DirectoryIndex index.html index.html.var # 訪問索引,按照順序逐一訪問,若是都沒有就會列出文件列表
AccessFileName .htaccess # 每目錄的訪問控制,會嚴重影響apache的效率,由於層級設定,通常不啓用
<Files ~ "^\.ht"> # 以.ht開頭的文件訪問權限
Order allow,deny
Deny from all
</Files>
TypesConfig /etc/mime.types # mime多功能互聯網郵件擴展,開啓HTTPD協議支持mime類型
DefaultType text/plain # 若是未指定類型,默認是純文本類型
<IfModule mod_mime_magice.c> # 開啓mime_magice.c模塊
MIMEMagiceFile conf/magic
</IfModule>
HostnameLookups Off # 訪問日誌中是否記錄主機名,默認關閉,影響性能
ErrorLog logs/error_log # 定義錯誤日誌位置
LogLevel warn # 定義日誌級別
LogFormat "%h %l %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined # 定義之日格式
%h:遠端客戶地址
%l:遠端用戶登陸名稱,通常爲-,由於對方不對將遠端用戶系統名暴露出來
%t:訪問時間
%r:先後的\表示轉譯就表示「自己,須要用引號隔開的內容,請求報文第一行即訪問方法
%>s:最後一次請求的狀態碼
%b:影響報文的大小
%{Referer}i:上一個訪問頁面,首部
%{User-Agent}i:瀏覽器類型
CustomLog logs\access_log combined 指定訪問日誌使用上面定義的combined日誌格式記錄
Alies /icons/ "/var/www/icons/" # 路徑別名,指定某個路徑爲某個簡寫別名,先後格式必定一致
<Directory "/var/www/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
httpd -t # 命令用於檢測當前web server配置文件語法規範的
elinks http://172.16.100.1 純文本瀏覽器,用於打開純文本頁面
-dump:顯示網頁後當即退出,不進入交互模式
-source:顯示網頁源代碼
httpd -M # 查看全部web服務器中支持的模塊,mod_userdir.c表示是否支持用戶在本身家目錄中創建我的網頁
<IfModule mod_userdir.c>
UserDir disabled # 默認不容許,啓用將其註釋掉
UserDir public_html # 取消註釋這行,啓用家目錄訪問
</IfModule>
須要給文件設定執行權限,chmod o+x /home/hadoop
若是容許則可經過 http://172.16.100.1/~hadoop/訪問本身家目錄網頁
PV:Page View 網站訪問量,網站頁面被訪問次數量
UV:User View 用戶訪問量,也就是獨立IP訪問的量
apache虛擬主機:
中心主機
虛擬主機:
apache服務:
服務於多個不一樣的站點;
基於IP
IP1:80
IP2:80
基於端口
IP:80
IP:8080
基於域名
IP:80
主機名不一樣
www.mageedu.com
www.a.org
www.b.net
apache 2.2
啓用NameVirtualHost
apache 2.4
ServerName:
DocumentRoot:
Directory定義訪問文件系統路徑屬性方法
<Directory "/www/a.org">
Option
AllowOverride
</Directory>
Location定義URL訪問路徑屬性方法
<Location "/images">
</Location>
開啓下面的Location能夠顯示當前服務器的狀態信息,通常默認關閉,但能夠設定對某個主機開放訪問
<Location "/images">
SetHandler server-status # SetHandler是執行一個動做的標記命令,後跟要執行的動做
Order Deny,Allow
Deny from all
Allow from .foo.com # 只有.foo.com的訪問被容許
</Location>
指定可執行CGI腳本路徑
ScriptAlias
CGI協議:Common Gateway Interface 動態網關接口
客戶端動態腳本:客戶端訪問時將腳本下載到本地客戶端執行
服務端動態腳本:在服務端執行腳本,將結果返回客戶端
MVC:
先取消中心主機,註釋中心主機的DocumentRoot便可。
虛擬主機的定義:
<VirtualHost HOST>
</VirtualHost>
HOST寫法:
基於IP:HOST寫法
IP1:80
IP2:80
基於端口:
IP:80
IP:8080
基於域名:
*:80
ServerName不一樣便可
建立方法:
在httpd.conf中寫也能夠或者建立新的virtual.conf文件
基於IP的虛擬主機寫法:
vim /etc/httpd/conf.d/virtual.conf
<VirtualHost 172.16.100.1:80>
ServerName hello.magedu.com
DocumentRoot "/www/magedu.com"
</VirtualHost>
<VirtualHost 172.16.100.2:80>
ServerName hello.magedu.com
DocumentRoot "/www/a.org"
</VirtualHost>
基於端口的虛擬主機寫法:首先在httpd.conf主配置文件中添加Listen 8080 添加8080的監聽,不然apache不會解析8080端口
<VirtualHost 172.16.100.1:80>
ServerName hello.magedu.com
DocumentRoot "/www/magedu.com"
CustomLog "/var/www/httpd/magedu.com/access_log combined"
</VirtualHost>
<VirtualHost 172.16.100.1:8080>
ServerName www.a.org
DocumentRoot "/www/a.org"
CustomLog "/var/www/httpd/a.org/access_log combined"
</VirtualHost>
基於域名的虛擬主機寫法:
NameVirtualHost 172.16.100.2:80
<VirtualHost 172.16.100.2:80>
ServerName www.a.org
DocumentRoot "/www/a.org"
<Directory "/www/a.org">
Options none
AllowOverride authconfig
AuthType basic
AuthName "Restrict area."
AuthUserFile "/etc/httpd/.htpasswd" # 用戶訪問此站點需登陸
Require valid-user
</Directory>
</VirtualHost>
<VirtualHost 172.16.100.2:80>
ServerName www.d.gov
DocumentRoot "/www/d.gov"
CustomLog "/var/www/httpd/d.gov/access_log combined"
<Directory "/www/d.gov">
Options none
AllowOverride none
Order deny,allow
Deny from 172.16.100.177 # 拒絕177的IP訪問此站點
</Directory>
</VirtualHost>
測試基於域名的虛擬主機須要在本地hosts文件中將兩個解析都寫入,作到能夠本地解析
定義好log日誌的位置後更改屬組屬主爲apache權限
設定默認虛擬主機:必須寫在名稱虛擬主機第一個位置
<VirtualHost _default_:80>
DocumentRoot "/www/default80"
# ...
</VirtualHost>
或
<VirtualHost _default_:*>
DocumentRoot "/www/default"
# ...
</VirtualHost>
基於openssl的https服務配置
一、安裝ssl模塊
httpd -M # 查看是否支持ssl模塊
yum install mod_ssl # 安裝模塊
rpm -ql mod_ssl # 查看生成的文件
二、CA生成
cd /etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.pem 2048) # 生成私鑰文件
ls -l private/cakey.pem # 查看權限是600
生成自簽證書
vim /etc/pki/tls/openssl.cnf
countryName_default = CN # 默認國家名稱改成CN
stateOrProvinceName_default = HeBei # 默認省份名稱隨意改
localityName_default = ShiJiaZhuang # 默認城市名稱
0.organizationName_default = MageEdu # 默認組織名稱
organizationalUnitName_default = Tech # 默認部門名稱
保存退出
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 # 生成CA自簽證書
Common Name 填寫主機名稱 :ca.magedu.com
Email Address :admin@magedu.com
完成自簽證書製做
vim ../tls/openssl.cnf
[ CA_default ]
dir =/etc/pki/CA # 更改目錄位置
保存退出
mkdir certs crl newcerts # 建立配置文件中的目錄
touch index.txt # 建立文件
echo 01 > serial
準備完成
三、回到服務器端
cd /etc/httpd/
mkdir ssl
(umask 077; openssl genrsa 1024 > httpd.key) # 生成服務器端私鑰文件
openssl req -new -key httpd.key -out httpd.csr # 生成CA證書
須要輸入內容必定和CA服務器生成內容保持一致
CN
HeBei
ShiJiaZhuang
MageEdu
Tech
hello.magedu.com # 這裏必定填寫服務器端你須要使用ssl服務的站點名稱
hello@magedu.com
後面默認便可
證書籤署請求完成
scp httpd.csr 172.16.100.8:/tmp # 拷貝到CA服務器
四、回到CA服務器簽署證書
openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3650
確認簽署選擇y
最終確認y
簽署完成
cat /etc/pki/CA/index.txt # 能夠看到01生成
cat /etc/pki/CA/serial # 顯示02,表示下一個註冊爲02
五、回到服務器端拷貝證書
scp 172.16.100.8:/tmp/httpd.crt ./
啓用服務器端使用證書
cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak
vim /etc/httpd/conf.d/ssl.conf
<VirtyalHost _default_:443> # 將_default_改成發佈web請求的服務器IP地址
ServerName hello.magedu.com # 含多個虛擬主機的寫清楚使用ssl的站點名稱
DocumentRoot "/www/magedu.com" # 填寫此虛擬主機對應的發佈目錄
SSLCertificateFile /etc/httpd/ssl/httpd.crt # 填寫證書文件位置
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key # 私鑰文件位置
保存退出便可
service httpd restart 重啓服務
查看監聽端口是否有443端口
六、使用客戶端訪問https://hello.magedu.com訪問測試
提示沒有可信證書
將服務器CA證書拷貝到本地一份
將/etc/pki/CA/cacert.pem 拷貝到本地
在本地重命名爲cacert.crt,雙擊安裝證書,將全部的證書放入下列存儲選項中點擊瀏覽選擇受信任的根證書頒發機構,完成證書安裝
再次訪問https://hello.magedu.com
注意:一個地址只能創建一個ssl虛擬主機
php相關概念及配置:
MIME:能夠使HTTP協議傳輸非文本格式的文件,例如:.mp3
動態網站:根據客戶端請求執行程序後,返回不一樣執行結果的。
JVM:Java Virtual Machine java是運行一次處處執行的語言程序,在多個平臺運行
CGI:讓服務器端能夠執行程序的協議
web服務器進程根據請求程序不一樣調用對應執行環境來運行對應的程序文件,而且將結果取回至web進程的協議
編程語言:
靜態語言:編譯型語言,強類型,先編譯才能運行,適合底層運行,性能優點大。針對實時場景,性能要求高的場景:驅動程序、數據庫服務器軟件、操做系統等
C,C++,JAVA
優點:性能好
劣勢:每一次改動都須要從新編譯,開發週期長,維護成本大
動態語言:解釋型語言,弱類型,無需編譯,變量可直接拿來用,直接運行程序
shell,perl,python
優點:便於維護,衆多共享模塊,開發週期短,
劣勢:性能差
Facebook
動態語言-->靜態語言
php --> Hiphop(轉換器) --> C++ 提升web性能
PHP:Hypertext Preprocessor 超文本預處理器
php解釋型語言
php source code --> 編譯成二進制 --> 執行二進制格式
zend:opcode 編譯好的php進程
opcode緩存器,共享編譯好的opcode使用
常見加速器:
APC(Alternative PHP Cache)
eAccelerator
XCache 最經常使用,快速且穩定
Zend Opeimizer和Zend Guard Loader
NuSphere PhpExpress
PHP源碼目錄結構:
build:主要放置一些跟源碼編譯相關的文件,好比開始構建以前的buildconf腳本及一些檢查環境的腳本等
ext:官方的擴展目錄,包括了絕大多數的PHP的函數的定義和實現,如:array系列,pdo系列,spl系列等函數的實現
我的開發的擴展在測試時也能夠放到這個目錄,以方便測試等。
main:這裏存放的就是PHP最爲核心的文件,是實現PHP的基礎設施,這裏和zend引擎不同,zend引擎主要實現語言最核心的語言運行環境。
zend:zend引擎的實現目錄,好比腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。
pear:PHP擴展與應用倉庫,包含PEAR的核心文件
sapi:包含了各類服務器抽象層的代碼,例如:apache的mod_php,cgi,fastcgi以及fpm等等接口
TSRM:PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏一般是對TSRM的封裝,TSRM及線程安全資源管理器
tests:PHP的測試腳本集合,包含PHP各項功能的測試文件。
win32:這個目錄主要包括windows平臺相關的一些實現,好比:sokcet的實如今windows下的*Nix平臺不太同樣,同時也包括了windows下編譯PHP相關的腳本。
嵌入式web開發語言
apache:
DSO:dynamic shared object
php_mod:合併處理靜動態內容,整合爲一個進程處理
FastCGI:
fpm:快速php模塊
apache爲客戶端後端php爲服務器提供php服務給apache
apache+php:
CGI
Modules:最簡單的
FastCGI:配置php服務
Nginx+fpm:更適合FastCGI
php安裝配置:
yum install php53-mbstring
數據庫及MySQL:
程序:指令+數據
數據庫查找用戶:
排序:
索引:
二分法索引:針對用戶排序取中間ID進行對比依次縮小範圍查找,平均14次能夠查找到最終結果
B+樹索引:搜索碼
程序與數據庫鏈接方式:
鏈接數據庫經過API鏈接:很是不方便
API就是一堆function()函數
優化由數據庫提供ODBC統一接口鏈接:
各種程序語言使用各自的驅動翻譯成數據庫識別的API來鏈接:
DBMS:DataBase Management System
用戶視圖:
物理視圖:
數據的組織結構:
層次型
網狀型
關係型:主流
RDBMS:Relational DataBase Management System
一、數據庫建立、刪除
二、建立表、刪除表、修改表
三、索引的建立、刪除
四、用戶和權限
五、數據增、刪、改
六、查詢
DML:Data Manapulate Language:數據操做語言
INSERT,REPLACE,UPDATE,DELETE
DDL:Data Defination Language:數據定義語言
CREATE,ALTER,DROP
DCL:Data Control Language:數據控制語言
GRANT,REVOKE
RDBMS軟件:egreSQL第一款數據庫軟件
Oracle、Sybase、Infomix 三大數據庫廠商
SQL Server
MySQL、PostgreSQL、EnterpriseDB
MySQL被Oracle收購後又延伸出更多開源SQL版本
MySQL-->MariaDB,Percona
反關係模型:NoSQL非關係型數據庫
MongoDB
Redis
HBase
MySQL初步,數據類型及SQL語句
DBMS:
數據掛了你獨立性;
有效的完成數據存取;
數據完整性和安全性;
數據集中管理;
開發存儲與故障恢復;
減小應用程序開發時間;
SQL:結構化查詢語言 ANSI,遵循標準
sql86,sql89,sql92,sql99
SQL命令:
分析器:詞法分析,語法分析
計劃執行器:有多少種方式可執行
優化器:選擇最優的執行方式
文件存取:選擇一種存取方式進行數據的存取
緩存器:將文件讀至緩存器中
磁盤空間管理器:實現對數據存儲至磁盤中的規劃管理
故障恢復管理器:出現數據庫管理器出現故障時,保障其處理數據可以恢復原始狀態
事務管理器:處理數據事務
鎖管理器:處理併發時數據鎖定機制
MySQL:
Community Edtion:社區版
Enterprise Edtion:企業版,區別在於商業版有加強的性能監控工具,企業級的功能插件等
軟件包格式:
軟件包管理器特有格式
rpm包,.exe格式等
通用二進制格式(相似綠色版解壓便可使用)
源程序
RHEL 5.8 (64bit)
mysql,mysql-server
MySQL的官方RPM包:
LAMP:
MySQL源碼包
通用二進制格式
mysql監聽 TCP/3306端口
運行mysql進程的用戶和組爲mysql用戶和組
RDBMS:
數據文件默認存儲路徑:/var/lib/mysql 建議建立單獨存儲位置
安裝mysql:
yum -y install mysql-server
初始化:
爲了建立元數據的數據庫,mysql的元數據庫就叫mysql,存儲mysql初始時的內容
啓動mysql數據庫:
service mysqld start
安裝完成登陸mysql服務器:
mysql命令就能直接登陸
-u username 默認root
-p PASSWORD 默認爲空
-h MYSQL_SERVER 默認本機
-h 127.0.0.1 若是鏈接本機mysql,意味着不須要經過網絡鏈接,這種方式會比網絡鏈接快不少
linux:socket方式鏈接
windows:memory方式鏈接
樣例:mysql -uroot -p -h localhost或172.16.100.1
輸入密碼,爲空則直接敲回車
用戶:USERNAME@HOST
mysql客戶端:
交互式模式
批處理模式
執行mysql腳本
交互式模式中的命令類型:
客戶端命令:\命令
\h 能夠獲取幫助
服務器端命令:
都必須使用語句結束符,默認是分號;
SQL接口:
Oracle,PL/SQL
SQL Server,T-SQL
MySQL
MySQL使用:
show databases; #查詢mysql中是庫
默認mysql有3個庫:test,mysql,information_schema
在/var/lib/mysql目錄中存在test,mysql目錄,但沒有information_schema,由於這個庫存在內存中
也能夠在/var/lib/mysql目錄建立新的目錄文件,在使用show databases; 查看能夠看到新建的庫
關係數據庫對象:
庫
表
索引
視圖
約束
存儲過程
存儲函數
觸發器
遊標
用戶
權限
事務
表:
行,列
表:實體
行:row
列:field,column
字段名稱,數據類型,類型修飾(限制),
字符
CHAR(n) 定長的CHAR,最多256個字符
VARCHAR(n) 可變長度的CHAR,最多65536個字符兩個字節
BINARY(n) 區分大小寫的字符,二進制方式存儲
VARBINARY(n) 不區分大小寫的字符
TEXT(n)
BLOB(n) 二進制的大對象
數值
精確數值
整型
TINYINT 1字節
SMALLINT 2字節
MEDIUMINT 3字節
INT 4字節
BIGINT 8字節
修飾符:UNSIGNED,無符號,表示只有正數和0
NOT NULL:不容許爲空
十進制
DECIMAL
近似數值
浮點型
FLOAT 單晶
DOUBLE 雙晶
日期時間:
DATE
TIME
DATETIME
STAMP 時間戳
布爾
內置:ENUM,SET
MYSQL命令:mysql中命令不區分大小寫
DDL:
CREATE
ALTER
DROP
DML:
INSERT
UPDATE
DELETE
DCL:
GRANT
REVOKE
獲取幫助:
help CREATE TABLE; 獲取跟CREATE TABLE相關的命令幫助
查看庫:
SHOW DATABASES;
查看錶:
SHOW TABLES FROM db_name;
查看錶結構:
DESC tb_name;
建立數據庫:
CREATE DATABASE db_name;
CREATE DATABASE IF NOT EXISTS db_name; 若是不存在則建立
刪除數據庫;
DROP DATABASE db_name;
DROP DATABASE [IF EXISTS] db_name; 存在則刪除庫
建立表:
USE db_name; 指定建立表存放的庫
CREATE TABLE tb_name(col1,col2,...);
例:CREATE TABLE students(Name CHAR(20) NOT NULL,Age TINYINT UNSIGNED, Gender CHAR(1) NOT NULL);
刪除表:
DROP TABLE tb_name [IF EXISTS]; 不可逆,存在則刪除表
修改表:
ALTER TABLE tb_name
MODIFY:修改某個字段,更改字段屬性
CHANGE:改變某個字段,改字段自己
ADD:添加字段
DROP:刪除字段
例:ALTER TABLE students ADD course VARCHAR(100); 在students表中添加了course字段字符長度100
DESC students; 查看錶結構就多出了course字段信息
ALTER TABLE students CHANGE course Course VARCHAR(100) AFTER Name; 將原來的course改成Course,並將其放在Name字段的後面
ALTER TABLE students DROP Course; 刪除某個字段
DML:
INSERT INTO tb_name (col1,col2,...) VALUES|VALUE ('STRING',NUM,...); #插入一組數據
INSERT INTO tb_name (col1,col2,...) VALUES|VALUE ('STRING',NUM,...),('STRING',NUM,...); #插入多組數據
例:INSERT INTO students (Name,Gender) VALUE ('LingHuchong','M'),('XiaoLongnv','F');
SELECT * FROM students; #查看students表內容
INSERT INTO students (‘XiaoXiangzi’,'HaMagong',57,'M'); # 不指定字段,直接按照表字段格式插入鍵值
UPDATE tb_name SET clumn=value WHERE
例:UPDATE students SET Course='Pixiejianfa'; # 若是不加where條件,則會將Course字段所有改成Pixiejianfa
UPDATE students SET Course='Hamagong' WHERE Name='Xiaoxiangzi';
DELETE FROM tb_name WHERE CONDITION; # 刪除表中符合條件的行
例:DELETE FROM students WHERE Course='Pixiejianfa'; # 刪除students表中Course是Pixiejianfa的行
查詢:
SELECT 字段 FROM tb_name WHERE CONDITION;
*:表示全部字段
WHERE:沒有條件表示顯示全部行
建立用戶:
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'PASSWORD'];
例:CREATE USER 'jerry'@'%' IDENTIFIED BY 'jerry'; # 建立jerry用戶針對全部主機並設置密碼爲jerry
SHOW GRANTS FOR 'jerry'@'%'; # 查看jerry用戶權限
HOST:
IP;
HOSTNAME;
NETWORK;
通配符; 通配符要使用''引發來
_:匹配任意單個字符,172.16.0._
%:匹配任意字符;
刪除用戶:
DROP USER 'USERNAME'@'HOST';
選擇:指定以某字段做爲搜索碼,作邏輯比較,篩選符合條件的行;選擇針對行;
WHERE指定選擇條件
投影:投影針對列
SELECT Name,Course FROM students; # 只顯示Name和Course字段列的內容
SELECT Name,Course FROM students WHERE Gender='M'; # 顯示Name和Course字段中Gender爲M的內容
DCL:
增長受權:
GRANT pri1,pri2,... ON DB_NAME.TB_NAME TO 'USERNAME'@'HOST' [IDENTIFIED BY 'PASSWORD'];
刪除受權:
REVOKE pri1,pri2,... ON DB_NAME.TB_NAME FROM 'USERNAME'@'HOST';
全部權限:
ALL PRIVILEGES
例:GRANT ALL PRIVILEGES ON mydb.* TO 'jerry'@'%'; # 給jerry用戶增長全部權限
對於mysql而言,localhost 和127.0.0.1是不一樣host登陸方式,用戶列爲空的爲匿名用戶。
設定密碼:
一、SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('password');
FLUSH PRIVILEGES; 每次更改須要重讀受權表
二、# mysqladmin -uUSERNAME -hHOST -p password 'password' #password爲老密碼'password'爲新密碼
三、直接改mysql庫中user表內的密碼列對應內容,在對應用戶的密碼列插入一行密碼便可,比較複雜不經常使用
方法:
mysql> UPDATE user SET Password=PASSWORD('password') WHERE USER='root' AND Host='127.0.0.1';
mysql> FLUSH PRIVILEGES;
受權遠程訪問:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.%.%' IDENTIFIED BY 'redhat';
mysql> FLUSH PRIVILEGES;
建立LAMP平臺
圖形客戶端:
一、phpMyAdmin(經常使用)
二、Workbench,mysql官方提供
三、MySQL Front
四、NaVicat for MySQL
五、Toad
PHP與mysql相連的程序安裝:
yum install php53_mysql 安裝php鏈接mysql的驅動程序
php鏈接mysql並獲取數據測試代碼:
<?php
$conn=mysql_connect('localhost','root','123456');
if (!$conn)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("mydb",$conn);
$result = mysql_query("SELECT * FROM tb1");
while($row - mmysql_fetch_array($result))
(
echo $row['Name'] . " " . $row['Age'];
echo "<br />";
)
mysql_close();
?>
簡單的寫法:
<title>A</title>
<hl>a.org</hl>
<?php
$conn=mysql_connect('localhost','root','redhat');
if ($conn)
echo "Success...";
else
echo "Failure...";
?>
LAMP:
phpMyAdmin
get phpMyAdmin-3.4.3.2-all-languages.tar.bz2 下載包
tar xf phpMyAdmin-3.4.3.2-all-languages.tar.bz2 解壓壓縮文件
mv phpMyAdmin-3.4.3.2-all-languages pma 改個簡單的名字
IE訪問
www.a.org/pma 便可打開phpMyAdmin頁面
使用mysql的登陸密碼進行登陸
安裝php擴展功能
php53-mcrypt-5.3.3-1.el5.i386.rpm
php53-xcache-1.3.2-1.el5_0.wing.i686.rpm 加速php執行效率
論壇:
discuz 免費開源,賺錢要向對方付費
phpwind 阿里巴巴收購
phpbb
PHP頁面處理過程及優化架構:
PHP:腳本編程語言,php解釋器
WebApp:面向對象的特性
Zend:
第一段:詞法分析、語法分析、編譯未Opcode(操做碼);
opcode放置於內存中關機就會清除
第二段:執行opcode;
PHP 緩存器:將文件讀至緩存器中
APC
eAccelerator
XCache
PHP解釋器-->MySQL,如何交互?
bash:a.sh
php53-mysql
httpd+php:
CGI:服務進程,能夠將httpd內須要處理的php動態傳輸至php進行處理,完成後返回httpd進程
Module:裝載相關模塊進行交互
FastCGI/FPM:php單獨進程經過套接字方式處理httpd傳輸過來的php動態請求
動態內容的靜態化:
將冬天訪問請求結果緩存至靜態服務器,一樣訪問請求進來直接從靜態服務器反饋便可。無需再進行動態處理。
淘寶有專門部門將動態內容靜態化,處理能力達到全站的百分之97的動態內容均可以靜態化。
編譯安裝LAMP之httpd-2.4.4
Apache:ASF(apache 軟件基金會),httpd,tomcat,cloudware
httpd:2.4.4
php:5.4.13
MySQL:5.6.10(rpm,通用二進制,源碼)
安裝前確保未安裝過RPM包等相關安裝
安裝依賴關係:httpd-->MySQL-->PHP-->XCache
httpd:
apr:Apache Portable Runtime 針對不一樣版本的操做系統安裝的httpd程序相互兼容的插件
rpm -q apr 檢查安裝
rpm -q apr-util util就是工具組件,apr是一個庫,而util是這個庫的命令工具組件
rpm包二進制格式文件存放位置:
rpm包:/bin,/sbin,/usr/bin,/usr/sbin
庫文件:/lib,/usr/lib
配置文件:/etc
幫助文件:/usr/share/{doc,man}
編譯安裝:
/usr/local
二進制通用:bin,sbin
庫:lib
配置:etc
幫助:man
二進制安裝卸載:直接刪除安裝後的目錄便可
/usr/local/apr/
bin,sbin,lib,includes,etc,share/man
編譯安裝:
先安裝開發環境,確保"Development Tools"和"Development Librarides"均已安裝
yum grouplist 查看安裝組件
yum groupinstall "Development Librarides"
安裝apr:
下載源程序:apr和apr-util包
安裝次序:apr-->apr-util-->httpd--
安裝apr:
hwclock同步時間爲硬件時間
tar xf apr-1.4.6.tar.bz2 解壓
cd arp-1.4.6
./configure --help|less 查看編譯幫助,由於默認值均已知足需求所以不用指定更多編譯內容
./configure --prefix=/usr/local/apr 指定安裝目錄直接安裝
make && make install
apr-util安裝
tar xf apr-util-1.4.1.tar.bz2
cd arp-util-1.4.1
./configure --perfix=/usr/local/apr-uril --with-arp=/usr/local/apr
make && make install
安裝httpd,MPM:prefork,worker,event
2.4之後版本默認安裝模式爲event模式,以前爲prefork
tar xf httpd-2.4.4.tar.bz2
cd httpd-2.4.4
./configure --prefix=/usr/local/apache --sysconfigdir=/etc/httpd --enabled-so --enabled-rewrite --enabled-ssl --enabled-cgi --enabled-cgid --enabled-modules=most --enabled-mods-shared=most --enabled-mpms-shared=all --with-mpms=event --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
可能會報錯信息:
未安裝PCRE模塊
yum -y install pcre-devel 安裝
再次編譯成功
make && make install
httpd 2.4新特性:
一、MPM可於運行時裝載;
--enable-mpms-shared=all --with-mpm=event
二、Event MPM
三、異步讀寫
四、在每模塊及每目錄上指定日誌級別
五、每請求配置:<If>,<ElseIf>,<Else>;
六、加強的表達式分析器;
七、毫秒級的KeepAlive Timeout;
八、基於域名的虛擬主機再也不須要NameVirtualHost指令;
九、下降了內存佔用;
十、支持在配置文件中使用自定義變量;
新增長的模塊:
mod_proxy_fcgi
mod_proxy_scgi
mod_proxy_express
mod_remoteip
mod_session
mod_ratelimit
mod_request
等等;
對於基於IP的訪問控制
2.2:
Order allow,deny
allow from all
2.4:
使用Require user
Require user USERNAME 容許某用戶訪問
not user USERNAME 不容許某用戶訪問
Require group GROUPNAME
Require ip IPADDR
IP
NETWORK/NETMASK
NETWORK/LENGTH
NET
172.16.0.0/255.255.0.0 = 172.16.0.0/16 = 172.16
Require host HOSTNAME
容許全部主機訪問:
Require all granted
拒絕全部主機訪問:
Require all deny
編譯安裝LAMP之MySQL-5.5.28(通用二進制格式)
tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local
cd /usr/local
ln -sv mysql-5.5.28-linux2.6-i686 mysql 作連接文件到同目錄下的mysql,不要mv更改原始的源碼包名
cd mysql
useradd -r mysql #-r表示建立系統用戶不可刪除的,與group一塊兒建立
也能夠手動建立
groupadd -r -g 306 mysql
useradd -g 306 -r -u 306 mysql
id mysql
安裝過程能夠經過INSTALL-BINARY文件進行解讀
chown -R mysql.mysql /usr/local/mysql/*
ls scripts/mysql_install_db 此腳本是mysql初始化腳本,需手動還行 --help能夠查看多個選項的解釋
指定一個新的數據目錄
pvcreate /dev/sda5
vgcreate myvg /dev/sda5
lvcreate -n mydata -L 5G myvg
mke2fs -j /dev/myvg/mydata
mkdir /mydata
vi /etc/fstab
/dev/myvg/mydata /mydata ext3 defaults 0 0
mount -a
mount 檢查掛載
mkdir /mydata/data
chown -R mysql.mysql /mydata/data/
chmod o-rx /mydata/data/
初始化
scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
屬主改回root用戶
chown -R root /usr/local/mysql/*
ls suport-files/mysql.server 目錄下有啓動腳本
cp suport-files/mysql.server /etc/init.d/mysqld 複製腳本至自動啓動目錄
chkconfig --add mysqld
chkconfig --list mysqld
建立mysql配置文件:
MySQL:/etc/my.conf
配置文件格式:
[mysql] 客戶端用
配置參數內容
[mysqld] 服務端用
配置參數內容
[client] 對全部客戶端都生效
配置參數內容
mysql啓動時查找配置文件過程,依次以下:
/etc/my.cnf --> /etc/mysql/my.cnf --> $BASEDIR/my.cnf --> $DATADIR/my.cnf --> ~/.my.cnf
複製配置文件:
ls suport-files/mysql.server # my-small.cnf(小規模)\my-medium.cnf(中級別)\my-large.cnf(大型)\my-huge.cnf(巨大型)
還有特殊的my-innodb-heavy-4G.cnf mysql的一種存儲引擎
查看各配置文件中內容,便知是根據實際物理資源量來評估承載數據量的配置文件
cp suport-files/my-large.conf /etc/my.cnf
vim /etc/my.cnf
查找內容
thread_concurrency = 8 線程併發量,最多啓動多少mysql線程,改成你的CPU個數*2的結果
添加數據目錄
datadir = /mydata/data
啓動mysql進程
service mysqld start
vim /etc/profile.d/mysql.sh
exprot PATH=$PATH:/usr/local/mysql/bin
保存退出
從新登陸便可
MySQL服務器維護了兩類變量:
服務器變量:
定義MySQL服務器運行特性
SHOW GLOBAL VARIABLES
SHOW GLOBAL VARIABLES LIKE 'STRING'; 特定變量查看 調優mysql主要看內容
狀態變量:
保存了MySQL服務器運行統計數據
SHOW GLOBAL STATUS
SHOW GLOBAL STATUS LIKE 'STRING'; 特定變量查看 調優後是否獲得提高查看內容
MySQL通配符:
_:任意單個字符
%:任意長度的任意字符
SELECT VERSION(); 顯示當前數據庫版本號
SELECT DATABASE(); 顯示當前數據庫
SELECT USER(); 顯示登陸用戶
系統幫助文件添加mysql幫助內容
vim /etc/man.config
添加:
MANPATH /usr/local/mysql/man
輸出庫文件:
vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
保存退出
ldconfig -v 讓系統從新讀取庫文件,從新讀取到緩存
ls -l /etc/ld.so.cache 緩存文件位置
輸出頭文件:
ln -sv /usr/local/mysql/include /usr/include/mysql
ls /usr/include/mysql 能看到一些頭文件
編譯安裝LAMP之php-5.4.1三、xcache-2.0及使用ab命令實現壓力測試
tar xf php-5.4.13.tar.bz2
cd php-5.4.13
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts
支持FastCGI模式可將
--with-apxs2=/usr/local/apache/bin/apxs 更改成 --enable-fpm便可
說明:
一、這裏爲了支持apache的worker或event這兩個MPM,編譯時使用了--enable-maintainer-zts選項
二、若是使用PHP5.3以上版本,爲了連接MySQL數據庫,能夠指定mysqlnd,這樣在本機就不須要先安裝MySQL或MySQL開發包了。mysql從php5.3開始可用,能夠編譯時綁定到它(而不用和具體的MySQL客戶端庫綁定造成依賴),但從PHP 5.4開始它就默認設置了。
# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
報錯:
mcrypt.h沒有相關的頭文件依賴,不使用加密功能可不加此參數
也可安裝依賴包
mhash、mhash-devel、libmcrypt、libmcrypt-devel這4個包便可
找rpm安裝依賴包能夠到rpmfind.net網站中查找下載
make && make install
cp php.ini-production /etc/php.ini cp配置文件到默認目錄
vim /etc/php.ini
vim /etc/httpd/httpd.conf
查找AddType字樣,添加apache對php頁面的處理
在後面添加一行:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
再查找DirectoryIndex index.html
修改成DirectoryIndex index.php index.html
php支持擴展功能:
xcache
xcache加速
tar xf xcache-2.0.0.tar.bz2
cd xcache-2.0.0
/usr/local/php/bin/phpize #準備好的php擴展功能準備編譯,編譯任何php相關擴展功能,都須要先執行此命令,識別擴展
./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make && make install
加載xcache到php配置中
一、能夠將xcache解壓目錄下的xcache.ini文件內容加載到php.ini配置文件中
二、mkdir /etc/php.d 建立配置文件目錄
cp xcache.ini /etc/php.d/
vim /etc/php.d/xcache.ini
找到zend_extension = 路徑 將xcache安裝的路徑貼入 /usr/local/php/lib/extensions/no-debug-zts-20100525/xcache.so
將zend_extension_ts = 這行註銷掉,在行首輸入;便可
gc=垃圾回收器
更改xcache配置後須要重啓httpd生效
啓用虛擬主機:
註釋掉中心主機
vim /etc/httpd/httpd.conf
查找DcoumentRoot行 註銷掉#
而後找到
#Virtual hosts
Include /etc/httpd/extra/httpd-vhosts.conf
將虛擬主機單獨配置到此配置文件
再查找到LoadModule中的mod_log_config.so是否啓用
保存退出
編輯虛擬主機配置文件
vim /etc/httpd/extra/httpd-vhosts.conf
樣例:
<VitrualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com"
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
本身編輯主機
<VitrualHost *:80>
ServerName www.a.org
<Directory "/www/a.org">
Options none
AllowOverride none
Require all granted
</Directory>
DocumentRoot "/www/a.org"
ErrorLog "/var/log/httpd/a.org-error_log"
CustomLog "/var/log/httpd/a.org-access_log" combined
</VirtualHost>
<VitrualHost *:80>
ServerName www.b.net
<Directory "/www/b.net">
Options none
AllowOverride none
Require all granted
</Directory>
DocumentRoot "/www/b.net"
ErrorLog "/var/log/httpd/b.net-error_log"
CustomLog "/var/log/httpd/b.net-access_log" common
</VirtualHost>
保存退出
mkdir /www/{a.org,b.net} -pv
mkdir /var/log/httpd
httpd -t #檢查語法
web壓力測試
cd /usr/local/apache
ab命令:apache benchmark,apache壓力測試工具
ab
-c concurrency #:併發量,一次性發起的請求數量,默認爲1;
-i :測試時使用HEAD方法,默認爲GET;
-k :啓用HTTP長鏈接請求方式;
-n requests #:發起的模擬請求個數,默認爲1個,請求數要大於等於併發鏈接數;
-q :靜默模式,在請求數大於150個時不輸出請求完成百分比;
-r :忽略錯誤
例如:ab -c 10 -n 100 http://www.a.org/index.html
結果指標:
Time taken for tests : # seconds 從第一個請求鏈接簡歷到收到最後一個請求的相應報文結束所經歷的時長;
Complete requests :成功的請求數;
Total transferred : 100次請求全部的報文大小
HTML transferred : HTML文件請求的報文大小
Requests per second : 每秒鐘處理的請求數量
Time per request : 每一個請求花費時長,此時長爲全部請求所有完成後的平均時長,10個併發所有完成的時間
Time per request : 單個請求花費的時長,應該是上面的十分之一
Transfer rate : 傳輸速率,大概每秒鐘傳輸的字節
Linux操做系統限定每一個進程不容許打開1024個文件
ulimit -n 10000 從新設定每一個進程打開文件爲10000個
測試動態站點
tar xf phpMyAdmin-3.5.1-all-languages.tar.bz2 -C /www/b.net
cd /www/b.net
mv phpMyAdmin-3.5.1-all-languages/ pma
cd pma
cp config.sample.inc.php config.inc.php
vim config.inc.php
使用openssl生成一段隨機碼
openssl rand -base64 10
將生成的==前面的字符串拷貝出來
放置於config.inc.php配置文件中的xxxx中
$cfg['blowfish_secret'] = 'xxxxxx';
保存退出
訪問頁面進行mysql客戶端登陸
再使用ab進行動態頁面測試
ab -c 100 -n 1000 http://www.b.net/pma/index.php
壓力測試工具:
ab
http_load
webbench
siege
啓用https功能
vim /etc/httpd/httpd.conf
找到LoadModule
找到ssl_module_modules一行取消註釋
再找到Include /etc/httpd/extra/httpd-ssl.conf 取消註釋啓用
保存退出
vim /etc/httpd/extra/httpd-ssl.conf
更改
DocumentRoot "/www/a.org"
ServerName www.aorg
ErrorLog "/var/log/httpd/a.org-error_log
TransferLog "/var/log/httpd/a.org-access_log
私鑰和公鑰內容指定
保存退出
從起web服務
編譯安裝LAMP之配置httpd以FastCGI方式與php整合
httpd+php結合方式:
cgi
module
fastcfi(fpm)
httpd:
fastcgi模塊
2.4,fcgi
--enable-module=most
通用二進制格式包安裝mysql5.6版本:
tar xf mysql-5.6.10-linux-glibc2.5-i686.tar.gz -C /usr/local
cd /usr/local
ln -sv mysql-5.6.10-linux-glibc2.5-i686 mysql
cd mysql
chown -R mysql.mysql .
scripts/mysql)instal_db --user=mysql --datadir=/mydata/data
cd support-files/
cp mysql.server /etc/init.d/mysqld 複製啓動腳本到自啓動目錄
chkconfig --add mysqld
chkconfig --list mysqld
cp my-default.cnf /etc/my.cnf 拷貝配置文件
vim /etc/my.cnf
找到datadir
datadir = /mydata/data
保存退出
chown -R root .
service mysqld start
vim /etc/profile.d/mysql.sh 輸出mysql目錄
export PATH=$PATH:/usr/local/mysql/bin
保存退出
編譯安裝php5.4.13
tar xf php-5.4.13.tar.bz2
cd php-5.4.13
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
此版本支持FastCGI模式可將
--with-apxs2=/usr/local/apache/bin/apxs 更改成 --enable-fpm便可
make && make install
cp php.ini-production /etc/php.ini
爲php-fmp提供Sysv init腳本,並將其添加至服務列表:
cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
爲php-fpm提供配置文件:
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
編輯php-fpm的配置文件:
vim /usr/local/php/etc/php-fpm.conf
配置fpm的相關選項爲你所須要的值,並啓用pid文件(以下最後一行);
pm.max_children = 50 # 最多有多少子進程
pm.start_servers = 5 # 啓動的空閒進程數
pm.min_spare_servers = 2 # 最小的空閒進程數
pm.max_spare_servers = 8 # 最大的空閒進程數
pid = /usr/local/php/var/run/php-fpm.pid # 定義pid存放文件位置
接下來就能夠啓動php-fpm了:
service php-fpm start
啓動監聽在:
127.0.0.1:9000端口上
配置httpd-2.4.4
一、啓用httpd的相關模塊
在apache httpd 2.4之後的版本已經專門有一個模塊針對FastCGI的實現,此模塊未mod_proxy_fcgi.so,它實際上是做爲mod_proxy.so模塊的擴充,所以,這兩個模塊都要加載
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
二、配置虛擬主機支持使用fcgi
在響應的虛擬主機中添加相似以下兩行:
ProxyRequests off # 關閉正向代理功能
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/POCUMENT_ROOT/$1 # 全部訪問php的所有解析到對應的fcgi://127.0.0.1:9000地址去
例如:
<VirtualHost *:80>
DocumentRoot "/www/magedu.com"
ServerName magedu.com
ServerAlias www.magedu.com
ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/POCUMENT_ROOT/$1
<Directory "/www/magedu.com">
Options none
AllowOverride none
Require all granted
</Driectory>
</VirtualHost>
郵件服務系列之基礎原理
Mail Server:
SMTP:Simple Mail Transfer Protocol 簡單郵件傳輸協議 25/tcp
ESMTP:Extended 檢測身份認證
POP3:Post Office Protocol 郵局協議
IMAP4:Internet Mail Access Protocol 互聯網郵件訪問協議
早期:
UUCP:Uinx to Unix Copy
Unix主機複製文件的協議
SMTP:就是文件傳輸協議,實現傳輸路由功能
郵件傳輸:MT
郵件投遞:MD
郵件用戶:MU
MUA:Mail User Agent 郵件用戶代理,就是郵件客戶端軟件
Outlook Express,Outlook
Foxmail
Thunderbird
Evolution
mutt(純文本界面)
MTA:Mail Transfer Agent 郵件傳輸代理,SMTP服務器
SendMail,UUCP
單體結構,SUID,配置文件語法(m4編寫)
qmail
性能很是良好,但做者是個數學家玩了兩三年就放棄此項目,一個PC機可投遞20封每秒
postfix
郵件新貴,模塊化設計,安全,與SendMail兼容性良好,投遞效率很高
exim
配置語法簡單,使用簡易
Exchange(Windows,異步消息協做平臺)
必須與AD整合,可同步日曆
SASL:v2版本使用較多
cyrus-sasl,認證框架,但不提供認證服務,例如:比如圍牆,但不提供圍牆門鎖進出的過程
courier,可提供MTA,MDA,MRA服務,但提供不如postfix好,所以只選用此軟件的courier-authlib功能
MDA:Mail Deliyery Agent 郵件投遞代理
SendMail:procmail負責投遞的
maildrop:專業的郵件投遞代理,自帶垃圾郵件過濾功能
MRA:Mail Retrival Agent,郵件檢索或取回代理,此時使用的POP三、imap4協議
cyrus-imap
dovecot(鴿子籠)
WebMail:
Openwebmail,使用perl語言研發
squirrelmail(小松鼠mail),使用PHP語言研發
Extmail(Extman),國產開源
EMOS:定製的CentOS,直接安裝好以後即成爲mail服務器
發郵件爲SMTP協議,收郵件爲POP3或IMAP協議
LMTP:local 本地郵件傳輸協議
Open Relay:開放式中繼
郵件服務要藉助第三方認證工具:
SASL:Simple Authintication Secure Layer,簡單認證安全層
WebMail
LDAP:Lightweight Directory Access Protocol,輕量級目錄訪問協議
讀快寫慢,一次寫入屢次讀取的場景適合使用。大數量用戶認證會使用例如網易郵箱等
MySQL:寫比LDAP快一個量級,而讀要比LDAP慢一個量級。
虛擬用戶:僅用於訪問某個服務的數字標識;
用戶:字符串,憑證
POP3可直接訪問MySQL或LDAP服務器進行驗證;
SMTP須要藉助SASL完成用戶驗證;SASL還須要經過 工具去鏈接MySQL數據庫進行驗證;
垃圾郵件過濾器,進行內容檢索。
郵件服務系列之編譯安裝Postfix-2.10.0
發郵件:Postfix + SASL(courier-authlib) + MySQL
收郵件:Dovecot + MySQL
Webmail:Extmail + Extman + httpd
Postfix:rpm包安裝不支持基於SASL對虛擬用戶的認證,所以系統自帶rpm包不符合須要,需本身編譯安裝
紅帽6版本之後默認安裝的都是Postfix,以前都是SendMail
卸載SendMail
service sendmail stop
chkconfig sendmail off
yum list all|grep sendmail
rpm -e sendmail --nodeps 忽略依賴關係卸載
安裝準備工做:
安裝器說明:郵件服務依賴於DNS服務,請事先確認您的DNS服務已經爲郵件應用配置完成。
安裝所需包以下:
httpd,mysql,mysql-server,mysql-devel,openssl-devel,dovecot,perl-DBD-MySQL,tcl,tcl-devel,libart-lgpl,libart-lgpl-devel,libtool-ltdl,libtool-ltdl-devel,expect
安裝Postfix
先安裝MySQL(步驟忽略)
service mysqld start
chkconfig mysqld on
mysqladmin -uroot password 'your_passwrod'
啓動saslauthd服務,並將其加入到自動啓動隊列
service saslauthd start
chkconfig saslauthd on
下載Postfix,在官方www.postfix.org下載,找到download中Souce code下載
groupadd -g 2525 postfix
useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
groupadd -g 2526 postdrop
useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop 郵件投遞用戶和組
tar zxvf postfix-2.10.0.tar.gz
cd postfix-2.10.0
less INSTALL 查看安裝文件
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
make
make install
按照如下的提示輸入相關的路徑([]號中的是缺失值,"]"後的是輸入值,省略的標識採用默認值
install_root:[/]/
tempdir:[/root/postfix-2.10.0] /tmp/postfix
config_firectory:[/etc/postfix] /etc/postfix
.....
都可使用默認值
生成別名二進制文件:
newaliases
進行一些基本配置,測試啓動postfix並進行發信
postfix模塊化:
master:/etc/postfix/master.cf 核心模塊,主進程
mail:/etc/postfix/main.cf 郵件實現功能的配置文件
格式:參數 = 值 # 參數必須寫在行的絕對行首;以空白開頭的行被認爲是上一行的延續
postconf:配置postfix
-d:顯示默認的配置
-n:修改了的配置
-m:顯示所支持的查找表類型
-A:顯示客戶端支持的SASL插件類型
-a:顯示服務器端支持的SASL插件類型
-e PARMATER=VALUE:更改某參數配置信息,並保持至main.cf文件中
vim /etc/postfix/main.cf
修改如下幾項爲您須要的配置
myhostname = mail.magedu.com # 當前所配置郵件服務器的主機名稱
myorigin = magedu.com # 郵件地址假裝或補全
mydomain = magedu.com # 當前主機所在域
mydestination = $myhostname,localhost.$mydomain,localhost,$mydomain # 定義本地全部郵件目標收件服務器,也就是除此以外的須要中繼轉發
mynetworks = 192.168.1.9/24,127.0.0.0/8 # 給來自哪些網段的郵件中繼轉發
說明:
myorigin 參數用來知名發件人所在的域名,即作發件地址假裝;
mydestination 參數指定postfix接收郵件時收件人的域名,即您的postfix系統要接受到哪一個域名的郵件
myhostname 參數指定運行postfix郵件系統的主機的主機名,默認狀況下,其值被設定爲本機器名
mydomain 參數指定您的域名,默認狀況下,postfix將myhostname的第一部分刪除而做爲mydomain的值
mynetworks 參數指定你所在的網絡的網絡地址,postfix系統根據其值來區別用戶是遠程的仍是本地的,若是是本地網絡用戶則容許其訪問;
inet_interfaces 參數指定postfix系統監聽的網絡接口;
注意:
一、在postfix的配置文件中,參數行和註釋行是不能出在同一行中的;
二、任何一個參數的值都不須要加引號,不然,引號將會被看成參數值的一部分來使用;
三、每一個修改參數及其值後執行postfix reload便可令其生效;但若修改了inet_interface,則需從新啓動postfix
四、若是一個參數的值有多個,能夠將它們放在不一樣的行中,只須要在其後的每一個行前多置一個空格便可;postfix會把第一個字符爲空格或tab的文件行視爲上一行的延續;
爲postfix提供SysV服務腳本/etc/rc.d/init.d/postfix,
#!/bin/bash
#
# postfix Postfix Mail Transfer Agent
#
# chkconfig:2345 80 30
# description:Postfix is a Mail Transport Agent, which is the program \
that moves mail from one machine to another
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
# Source function library
. /etc/rc.d/init.d/function
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
RETVAL=0
prog="postfix"
start() {
# Start daemons.
echo -n $"Starting postfix:"
/usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/locak/subsys/postfix
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down postfix:"
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/locak/subsys/postfix
echo
return $RETVAL
}
reload() {
# Reload daemons.
echo -n $"Reloading postfix:"
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
[ -f /var/lock/subsys/postfix ] && restart || ;
;;
*)
echo $"Usage:$0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?
#END
爲此腳本賦予執行權限:
chmod +x /etc/rc.d/init.d/postfix
設置開機啓動:
chkconfig --add postfix
chkconfig postfix on
service postfix restart
telnet localhost 25
郵件與web服務同樣會返回狀態碼
SMTP狀態碼:
1開頭爲純信息
2開頭爲正確碼
3開頭web爲重定向,但郵件爲信息處理還沒有完畢還須要進一步操做
4開頭web爲客戶端錯誤,郵件爲暫時性錯誤
5開頭web爲服務端錯誤,郵件爲永久性錯誤
SMTP協議原語:
helo (smtp協議)
ehlo (esmtp協議)
mail from:root (指定發件人)
rcpt to:openstack (指定收件人)
data (郵件內容,正文)
內容
. # 結束編輯標記
quit
tail /var/log/maillog
能夠查看到已發送的信息
su - openstack
使用mail命令查看新收到的郵件
alias:郵件別名,郵件服務沒法直接寫入/etc/aliases別名,所以須要從新定義
/etc/aliases --> hash --> /etc/aliases.db
須要使用newaliases命令散列此別名
postfix默認吧本機的IP地址所在的網段識別爲本地網絡,而且爲之中繼
郵件服務系列之Postifx經常使用配置
SMTP --> SMTPS 安全版
ESMTP 功能加強版
接收郵件:
POP3:郵局協議
IMAP4:互聯網郵件訪問協議
用戶認證框架:
SASL:簡單認證安全層
v1,v2
MDA:郵件投遞代理
procmail,maildrop
MUA:郵件用戶代理
mutt,mail
Mail Relay:郵件中繼
MTA:sendmail,qmail,postfix,exim,exchange
postfix:模塊化設計,master(/etc/postfix/master.cf)
(/etc/postfix/main.cf)
MX:Mail.magedu.com
配置DNS服務:
將主機名改成mail.magedu.com
改hosts和network文件
rpm -qa |grep bind # 檢查是否有裝bind
rpm -e bind-libs bind-utils # 卸載現有版本
yum install bind97 bind-utils
vim /etc/named.conf
找到options內容53端口號一行註銷掉
重啓named服務
netstat -tunlp 查看53監聽
vim /etc/named.rfc1912.zones
未行添加新區域
zone "magedu.com" IN {
type master;
file "magedu.com.zone";
allow-update { none; };
allow-transfer { none; };
};
zone "100.16.172.in-addr.arpa" IN {
type master;
file "172.16.100.zone";
allow-update { none; };
allow-transfer { none; };
};
保存退出
named-checkconf # 檢查語法
cd /var/named
vim magedu.com.zone
$TTL 600
@ IN SOA ns.magedu.com. admin.magedu.com. (
2013041201
2H
10M
3D
1D )
IN NS ns
IN MX 10 mail
ns IN A 172.16.100.1
mail IN A 172.16.100.1
保存退出
cp magedu.com.zone 172.16.100.zone
vim 172.16.100.zone
$TTL 600
@ IN SOA ns.magedu.com. admin.magedu.com. (
2013041201
2H
10M
3D
1D )
IN NS ns.magedu.com.
1 IN PTR ns.magedu.com.
1 IN PTR: mail.magedu.com.
保存退出
chgrp named magedu.com.zone 172.16.100.zone
chmod 640 magedu.com.zone 172.16.100.zone
service named start
checkconfig named on
dig -t MX magedu.com @172.16.100.1
dig -t A mail.magedu.com @172.16.100.1
dig -x 172.16.100.1 @172.16.100.1
繼續配置郵件服務器:
cd /etc/postfix
vim main.cf
添加
mynetwork = 172.16.0.0/16, 127.0.0.0/8
找到myhostname,添加
myhostname = mail.magedu.com
找到myorigin,添加
myorigin = $mydomain
找到mydomain,添加
mydomain = magedu.com
找到mydestination,添加
mydestination = $myhostname,$mydomain,localhost,ns.$mydomain
保存退出
service postfix restart
tail /var/log/maillog
vim /etc/resolv.conf
添加
nameserver 172.16.100.1
telnet mail.magedu.com 25
helo mail.magedu.com # 建立連接
mail from:abc@abc.com # 發件人
rcpt to:obama@whitehouse.com # 收件人
data # 提示內容編寫
hello # 郵件正文內容
. # 編寫內容結束
quit # 退出鏈接
tail /var/log/maillog
禁用掉mynetwork中的172.16.0.0/16測試
rcpt to:a@b.net
提示 554 Relay access denied
使用outlook客戶端接收發送郵件
郵件編碼解密:base64編碼
openssl base64 可解碼
如:echo "abc" | openssl base64
得出編碼結果
安裝配置POP3接收郵件服務器:
MRA組件:
cyrus-imap,dovecot
dovecot依賴於MySQL客戶端
yum install dovecot
收件協議:
pop3:110/tcp
imap4:143/tcp
以明文方式工做,後期須要添加加密方式。
dovecot支持四中協議:pop3,imap4,pops,imaps
配置文件:/etc/dovecot.conf
自帶SASL認證能力
郵箱格式:
mbox:一個文件存儲全部郵件,redhat默認安裝的此格式;
maildir:一個文件存儲一封郵件,全部郵件存儲在一個目錄中;
vim /etc/dovecot.conf
查找protocols,取消註釋啓用,將imaps和pop3s去掉
保存退出
service dovecot start
telnet收取郵件:
telnet mail.magedu.com 110
USER openstack # 用戶名
PASS openstack # 密碼
List # 列出郵件列表
RETR 1 # 讀取第一封郵件
RETR 2 # 讀取第二封郵件
quit
這樣查看到的郵件內容爲密文
實現postfix + SASL 用戶認證:
一、啓動sasl服務
啓動文件:/etc/init.d/saslouthd
配置文件:/etc/sysconfig/saslauthd
vim /etc/sysconfig/saslauthd
MECH=pam改成shadow # 認證機制
saslauthd -v # 顯示當前服務器saslauthd服務所支持的認證機制。
啓動服務:
service saslauthd start
chkconfig saslauthd on
測試認證:
testsaslauthd -u username -p password
如:gtestsaslauthd -u openstack -p openstack
二、postconf -a # 查看是否支持sasl
反饋結果有cyrus和dovecot則表示支持
在postfix開啓sasl功能
vim /etc/postfix/main.cf
添加如下內容:
#########################CYRUS-SASL#####################
broken_sasl_auth_chlients = yse # 是否開啓SASL驗證postfix客戶端身份
smtpd_recipient_restrictrions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtp_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_secutity_options = noannoymous
2.3版本以後被廢棄 smtpd_sasl_application_name = stmpd
smtpd_sasl_path = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning;Version not Available!
########################################################
解釋:
permit_mynetworks 容許本地網絡
permit_sasl_authenticated 容許sasl認證經過的帳戶
reject_invalid_hostname 拒絕主機名不合法的主機
reject_non_fqdn_hostname 決絕非fqdn格式的帳戶收發郵件
reject_unknown_sender_domain 決絕沒法識別的發件人
reject_non_fqdn_sender 拒絕無fqdn解析用戶
reject_non_fqdn_recipient 拒絕沒有fqdn格式的收件人
reject_unknown_recipient_domain 決絕沒法識別的收件人域
reject_unauth_pipelining 拒絕沒法驗證的管道
reject_unauth_destination 拒絕未知目標主機
SASL支持smtpd協議
vim /usr/lib/sasl2/smtpd.conf
添加一下內容:
pwcheck_method:saslouthd # 密碼檢查方法
mech_list:PLAIN LOGIN # 兩種認證機制,OUTLOOK是基於LOGIN認證機制
讓postfix從新加載配置文件:
/usr/local/postfix reload
service saslauthd restart
實現postfix基於客戶端的訪問控制:
postfix內置了多種反垃圾郵件的機制,其中就包括"客戶端"發送郵件限制。
限定類型:IP,域名,用戶等等
smtpd_client_restrictions # 限定那些人鏈接郵件服務器
smtpd_data_restrictions # 限定那些人能夠發送data指令
smtpd_helo_restrictions # 限定哪些人能夠發送helo指令
smtpd_recipient_restrictions # 限定那些人能夠發送rcpt指令
smtpd_sender_restrictions # 限定哪些人能夠發送mail from指令
以上是smtp會話過程的特定階段,postfix會根據smtpd_client_restrictions參數來判別此客戶端IP的訪問權限;相應的,mtpd_helo_restrictions則用於根據用戶的helo信息判別客戶端的訪問能力等
若是DATA命令以前的全部內容被接受,客戶端接着就能夠開始傳送郵件內容了。郵件內容一般兩部分組成,前半部分是標題(header),其能夠由header_check過濾,後半部分是郵件正文(body),其能夠由check_body過濾。這兩項實現的是郵件"內容檢查"。
postfix的默認配置以下:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/data-access
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions = check_helo_access mysql:/etc/postfix/mysql_user # 表示去此文件連接mysql庫進行控制訪問
smtpd_recipient_restrictions = permit_mynetworks(容許),reject_unauth_destination(拒絕)
smtpd_sender_restrictions =
這限制了只有mynetworks參數中定義的本地網絡中的客戶端菜能經過postfix轉發郵件,其餘客戶端則不容許,從而關閉了開放式中繼(open relay)的功能。
配置文件配置方式:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient,permit_mynetworks,reject_unauth_destination
postfix有多個內置的限制條件,如上面的permit_mynetworks和reject_unauth_destination,但管理員也能夠使用訪問表(access map)
例如:建立訪問列表:/etc/postfix/access --> hash格式 --> /etc/postfix/access.db
轉換二進制命令:postmap /etc/postfix/access
內容: obama@aol.com reject # 拒絕此用戶訪問
microsoft.com OK # 容許此域訪問
訪問列表也能夠經過MySQL數據庫來建立
來自定義限制條件,自定義訪問表的條件一般使用check_client_access,check_helo_access,check_sender_access,check_recipient_access進行,他們後面一般跟上type:mapname格式的訪問表類型和名稱。其中,check_sender_access和check_recipient_access用來檢查客戶端提供的郵件地址,所以,其訪問表中能夠使用完整的郵件地址,如:admin@magedu.com;也能夠只使用域名,如:magedu.com;還能夠只有用戶名的部分,如:marion@。
別名使用:
別名即當收件人爲某某時均轉發給某某地址
配置:
vim /etc/aliases
添加:
a@magedu.com: hadoop
tomcat: hadoop
保存退出
newaliases # 刷新別名
service postfix restart
發給tomcat的郵件即轉發給了hadoop,而tomcat收不到此郵件。而且沒有a@magedu.com帳戶也會轉發給hadoop用戶
注意:使用2.10.0版本增長了訪問控制和SASL認證後始終沒法中繼轉發,更換2.9.6就ok了,所以多是2.10.0的bug問題,建議都選用次新版本進行配置使用
郵件服務系列之 postifx+sasl+dovecot及虛擬域相關概念
myorigin:發件人地址假裝
inet_interfaces:定義postfix進程監聽的IP地址
127.0.0.1
dovecot
RHEL 6.3
Development Tools
Server Platform Development
Desktop Platform Development
mysql
rpm:
mysql-server
mysql-devel
postfix,sasl
httpd,openssl,openssl-devel
全部程序編譯安裝都須要安裝其devel包,由於關聯的庫文件和頭文件都存在與devel包中
RHEL自身提供的rpm包:
頭文件:/usr/include/
庫文件:/lib,/usr/lib
第三方的rpm包:
/usr/local,/opt
頭文件:/usr/include,/usr
庫文件:/usr/local/lib 操做系統不會主動查找
/etc/ld.so.conf.d/local.conf
/etc/ld.so.conf
添加一行 include ld.so.conf.d/*.conf
ldconfig命令
rpm包安裝postfix
yum install mysql-server mysql-devel
chkconfig mysqld on
service mysqld start
tar xf postfix-2.9.6.tar.gz
cd postfix-2.9.6
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
make
make install
建立響應用戶和組:
groupadd -g 2525 postfix
useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
groupadd -g 2526 postdrop
useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop 郵件投遞用戶和組
newaliases
ls /etc/aliases.db 確保此文件生成結束
vim /etc/postfix/main.cf
修改如下幾項爲您須要的配置
myhostname = mail.magedu.com # 當前所配置郵件服務器的主機名稱
myorigin = magedu.com # 郵件地址假裝或補全
mydomain = magedu.com # 當前主機所在域
inet_interfaces = all # 指定監聽端口和範圍
mydestination = $myhostname,localhost.$mydomain,localhost,$mydomain # 定義本地全部郵件目標收件服務器,也就是除此以外的須要中繼轉發
mynetworks = 192.168.1.9/24,127.0.0.0/8 # 給來自哪些網段的郵件中繼轉發
其餘配置信息解釋:
alias_maps = hash:/etc/aliases # 別名映射表,對應的是/etc/aliases.db
alias_database = hash:/etc/aliases # 別名映射數據庫
home_mailbox = Mailbox # 投遞郵箱格式類型定義
mail_spool_directory = /var/spool/mail # 用戶投遞郵箱存放位置定義
mailbox_command = /some/where/procmail # 郵件投遞代理,若是maildrop須要在master.cf中配置
保存退出
postconf -n
service postfix start
tail /var/log/maillog # 因sendmail已啓動佔用了25監聽端口
service sendmail stop
chkconfig sendmail off
service postfix start
tail /var/log/maillog
配置收郵件服務器:
yum install dovecot -y
vim /etc/dovecot.conf
protocols = imap imaps pop3 pop3s
保存退出
service dovecot start
chkconfig dovecot on
echod "redhat" | passwd --stdin openstack # 爲openstack設定密碼爲redhat
測試收郵件
mutt命令:收郵件命令
mutt
-f file:file指定用戶郵箱。 如:mutt -f pop://openstack@mail.magedu.com 打開後輸入密碼,登陸後可看到郵件列表,打開郵件可查看內容,使用i鍵回到主界面,r爲回覆郵件
使用虛擬域時須要寫成:mutt -f pop://openstack@mail.magedu.com@172.16.100.1,指定主機
配置認證sasl功能
cyrus-sasl
服務腳本:saslauthd
postfix --> /usr/lib/sasl2/smtpd.conf # 與postfix相關聯的配置文件
內容:
pwcheck_method:saslauthd # 通知postfix須要使用sasl進行用戶認證
mech_list:PLAIN LOGIN # 選用那種方式認證
配置:
vim /etc/sysconfig/saslauthd
將MECH=pam 改成 MECH=shadow
保存退出
service saslauthd start
chkconfig saslauthd on
testsaslauthd -uhadoop -phadoop # 測試
vim /usr/lib/sasl2/smtpd.conf
pwcheck_method:saslauthd
mech_list:PLAIN LOGIN
log_level:3
保存退出
service saslauthd restart
配置postfix:
vim /etc/postfix/main.cf
找到mynetworks
mynetworks = 127.0.0.0/8
文件尾部添加內容:
#########################CYRUS-SASL#####################
broken_sasl_auth_chlients = yse # 是否開啓SASL驗證postfix客戶端身份
smtpd_recipient_restrictrions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtp_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_secutity_options = noannoymous
smtpd_sasl_path = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning;Version not Available!
保存退出
service postfix restart
主機概念:
中心主機:一個服務器只能提供一個站點
虛擬主機:可提供多個站點
郵件虛擬域:
一臺服務器爲多個域收發郵件
mydestination = 指定多個域
使用虛擬域就須要註銷掉中心域相關內容:
#mydomain =
使用查找表
#myorigin =
虛擬域的內容對接方式:
一、postmap生成hash文件
二、mysql
虛擬域
用戶別名
用戶帳號:虛擬帳號
使用mysql進行虛擬用戶認證支撐郵件服務器
發郵件SMTP:postfix --> sasl --> Courier-authlib --> mysql server
收郵件POP3:Dovecot --> mysql driver --> mysql server
web郵箱:
webmail:httpd
Extmail
Extman
郵件服務系列之虛擬域、虛擬用戶和webmail
安裝Courier-authlib
yum install expect
tar xf courier-authlib-0.65.0.tar.bz2
cd courier-authlib-0.65.0
./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --without-authpam --without-authshadow --without-authvchkpw --without-authpgsql --with-authmysql --with-mysql-libs=/usr/lib/mysql --with-mysql-includes=/usr/include/mysql --with-redhat --with-authmysqlrc=/etc/authmysqlrc --with-authdaemonrc=/etc/authdoemonrc --with-mailuser=postfix --with-mailgroup=postfix --with-ltdl-lib=/usr/lib --with-ltdl-include=/usr/include --with-sqlite-libs=/usr/lib --with-sqlite-includes=/usr/include
make && make install
備註:能夠使用--with-authdaemonvar=/var/spool/authdaemon選項來指定進程套接字目錄路徑
備註:在RHEL5上要使用0.64.0及以前版本,不然,可能會因爲sqlite版本太低問題致使configure檢查沒法經過或編譯沒法進行
chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
cp /etc/authdaemonrc.dist /etc/suthdoemonrc
cp /etc/authmysqlrc.dist /etc/authmysqlrc
修改/etc/authdoemonrc文件
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=10
檢測ltdl安裝狀況:動態模塊加載器
yum list all|grep ltdl
確保libtool-ltdl.i386和libtool-ltdl-devel.i386已經安裝
yum -y install libtool-ltdl libtool-ltdl-devel
配置其經過mysql進行郵件帳號認證
編輯/etc/authmysqlrc爲一下內容,其中2525,2525位postfix用戶的UID和GID
MYSQL_SERVER localhost
MYSQL_PORT 3306 # 指定你的mysql監聽的端口,這裏使用默認的3306
MYSQL_USERNAME extmail # 這時爲後文要用的數據庫的全部者的用戶名
MYSQL_PASSWORD extmail # 密碼
MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD '2525'
MYSQL_GID_FIELD '2525'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir)
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir)
加載SysV服務
cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
chmod 755 /etc/rc.d/init.d/courier-authlib
chkconfig --add courier-authlib
chkconfig --level 2345 courier-authlib on
echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
ldconfig -v
service courier-authlib start
配置postfix和courier-authlib
虛擬用戶:
Maildir:/var/mailbox/
新建虛擬用戶郵箱所在的目錄,並將其權限賦予postfix用戶:
mkdir -pv /var/mailbox
chown -R postfix /var/mailbox
接下來從新配置SMTP認證,編輯/usr/lib/sasl2/smtpd.conf,確保其爲如下內容
pwcheck_method:authdaemond
log_level:3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
讓postfix支持虛擬域和虛擬用戶
編輯/etc/postfix/main.cf,添加以下內容:
#######################Virtual Mailbox Settings############################
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domain_maps.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual
maildrop_destination_recipient_limit = 1
maildrop_destination_concurrency_limit = 1
################################QUOTA Settins###############################
message_size_limit = 14336000 # 每封郵件大小限制
virtual_mailbox_limit = 20971520 # 每一個用戶郵箱大小限制
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please Tidy your mailbox and try again later.
virtual_overquota_bounce = yes
使用extman源碼目錄下docs目錄中的extmail.sql和init.sql創建數據庫:
tar zxvf extman-1.1.tar.gz
cd extman-1.1
mysql -u root -p < exmail.sql
mysql -u root -p < init.sql
cp mysql* /etc/postfix/
授予用戶extmail訪問extmail數據庫的權限
mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
mysql> GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail';
mysql> FLUSH PRIVILEGES;
說明:
一、啓用虛擬域之後,須要取消中心域,即註釋掉myhostname,mydestination,mydomain,myorigin幾個指令,固然,你也能夠把mydestination的值改成你本身須要的。
二、對於mysql-5.1以後的版本,其中的服務腳本extmail.sql執行會有語法錯誤;extmail.sql文件中的TYPE=MyISAM字段在5.1以後TYPE選項不支持,應改成ENGINE;如:# sed -i 's@TYPE=MyISQM@ENGINE=InnoDB@g' extmail.sql
安裝httpd
yum install httpd
配置dovecot
vim /etc/dovecot.conf # 按照如下內容找到對應行取消註釋並修改args = 內容,將無需使用sql對接的pam等認證取消
mail_location = maildir:/var/mailbox/%d/%n/Maildir
....
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
....
vim /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir,uidnumber AS uid,gidnumber AS gid FROM mailbox WHERE username = '%u'
說明:若是mysql服務器是本地主機,即host=localhost時,若是mysql.sock文件不是默認/var/lib/mysql/mysql.sock,可以使用host="sock文件路徑"來指定新位置;
接下來啓動dovecot服務:
service dovecot start
chkconfig dovecot on
安裝extmail-1.2
說明:若是extmail的放置路徑作了修改,那麼配置文件webmail.cf中的/var/www路徑必須修改成你所須要的位置。本文默認使用的爲/var/www,因此,如下示例中並無包含路徑修改的相關內容
tar zxvf extmail-1.2.tar.gz
mkdir -pv /var/www/extsuite
mv extmail-1.2 /var/www/extsuite/extmail
cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf
修改主配置文件
vim /var/www/extsuite/extmail/webmail.cf
部分修改選項的說明:
SYS_MESSAGE_SIZE_LIMIT = 5242880
用戶能夠發送的最大郵件
SYS_USER_LANG = en_US
語言選項;可該作:
SYS_USER_LANG = zh_CN
SYS_MAILDIR_BASE = /home/domains
此處即爲您在前文所設置的用戶郵件的存放目錄,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_MYSQL_USER = db_user
SYS_MYSQL_PASS = db_pass
以上兩句用來設置鏈接數據庫服務器所使用的用戶名、密碼和郵件服務器用到的數據庫,這裏修改成:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_HOST = localhost
指明數據庫服務器主機名,這裏默認便可
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password 以上用來指定驗證用戶登陸裏所用到的表,以及用戶名、域名和用戶密碼分別對應表中列的名稱,這裏默認便可。
SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket
此句用來指明authdaemo socket文件的位置,這裏修改成:
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
apache相關配置:
vim httpd.conf
註銷中心主機DocumentRoot一行
建立虛擬主機
<VirtualHost *:80>
ServerName mail.magedu.com
DocumentRoot /var/www/extsuite/extmail/html/
ScripAlias /extmail/cgi /var/www/extsuite/extmail/cgi # 指定cgi腳本目錄
Alias /extmail /var/www/extsuite/extmail/html # 別名設置
SuexecUserGroup postfix postfix # 若是配置文件改了屬組屬主不用此項
</VirtualHost>
註解:Suexec:實現僅在運行某些內容時調用指定的用戶和組
apache,httpd
User
Group
httpd(apache,apache) --> cgi(postfix,postfix)
找到User項將原來的apache用戶改成postfix,Group組也同樣將apache改成postfix
修改cgi運行目錄的屬組屬主改成postfix
chown -R postfix.postfix /var/www/extsuite/extmail/cgi
解決依賴關係
extmail將會用perl的Unix::syslogd功能,您能夠去http://search.cpan.org搜索下載源碼包進行安裝
tar zxvf Unix-Syslog-0.100.tar.gz
cd Unix-Syslog-0.100
perl Makefile.PL
make
make install
啓動apache服務
service httpd start
chkconfig httpd on
安裝extman
tar zxvf extman-1.1.tar.gz
mv extman-1.1 /var/www/extsuite/extman
修改配置文件以符合本例的須要:
cp /var/www/extsuite/extman/webman.cf.default /var/www/extsuite/extman/webman.cf
vim /var/www/extsuite/extman/webman.cf
SYS_MAILDIR_BASE = /home/domains
此處即爲您在前文所設置的用戶郵件的存放目錄,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_DEFAULT_UID = 1000
SYS_DEFAULT_GID = 1000
此兩處後面設定的ID號需更改成前面建立的postfix用戶和組的ID號
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
修改成:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
然後修改cgi目錄的屬主
chown -R postfix.postfix /var/www/extsuite/extman/cgi/
在apache的主配置文件中Extmail的虛擬主機部分,添加以下兩行:
ScriptAlisa /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
建立其運行時所需的臨時目錄,並修改其相應的權限:
mkdir -pv /tmp/extman
chown postfix.postfix /tmp/extman
若是用戶使用webman的話,登陸mysql建立用戶:
mysql>GRANT ALL PRIVILEGES ON extmail.* TO webman@localhost IDENTIFIED BY 'webman';
mysql>GRANT ALL PRIVILEGES ON extmail.* TO webman@127.0.0.1 IDENTIFIED BY 'webman';
mysql>FULSH PRIVILEGES;
修改
SYS_CAPTCHA_ON = 1
爲
SYS_CAPTCHA_ON = 0
郵件服務系列之pop3s、maildrop
ssl:SMTP.POP3,IMAP4
plaintext:明文,純文本
http --> https(ssl/tls)
smtps端口:465
S/MIME:因爲SMIPS沒法保障郵件傳輸過程的安全所以使用S/MIME進行加密
Security
USER<-->USER
用戶證書:
mail,hash(finger print)
OpenSSL,GPG(PGP):PGP是一種技術,GPG是一種軟件:GNU Privacy Guard。
PKI:CA
pop3s,imaps:
SSL:會話加密
建立私有CA
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048) #建立私鑰
ls private/cakey.pem
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3656 # 生成自簽證書,不加-x509表示生成證書籤署請求,
填寫證書內容:
Country Name :CN
......:Hebei
......:ZZ
......:MageEdu
......:Tech
......:ca.magedu.com
......:caadmin@magedu.com
完成
編輯證書配置文件:
vim /etc/pki/tls/openssl.cnf
找到
dir項 將=後面改成 /etc/pki/CA
保存退出
mkdir /etc/dovecot/ssl -pv
cd /etc/devecot/ssl
(umask 077;openssl genrsa 1024 > dovecot.key) #生成dovecot私鑰
openssl req -new -key dovecot.key -out dovecot.csr # 生成證書籤署請求
填寫證書內容:
Country Name :CN
......:Hebei
......:ZZ
......:MageEdu
......:Tech
......:mail.magedu.com
......:postadmin@magedu.com
完成
此時使用服務器簽署一下便可
cd /etc/pki/CA
mkdir certs newcerts crl
touch index.txt
echo 01 > serial
cd /etc/dovecot/ssl
openssl ca -in dovecot.csr -out dovecot.crt -days 3656
簽署成功將dovecot.csr文件改成其餘用戶無任何權限
編輯dovecot配置文件支持pop3s
vim /etc/dovecot.conf
找到protocols = pop3 pop3s #添加pop3s
注:pop3s:995/tcp imaps:993/tcp
找到ssl相關內容
ssl_listen =
ssl_disable = no
ssl_cert_file = /etc/dovecot/ssl/dovecot.crt
ssl_key_file = /etc/dovecot/ssl/dovecot.key
若是私鑰有密碼須要添加以下內容:
ssl_key_password = password
保存退出
service dovecot restart
netstat -tnlp
查看是否有995監聽
遠程測試使用如下命令:
openssl s_client -connect SERVER:PORT -CAfile /path/to/CA_CERT
使用mutt登陸加密傳輸郵件
mutt -f pops://hadoop@magedu.com@172.16.100.1
登錄後服務器方會發來認證證書,提問是否接受r表示拒絕,o表示接受一次,選擇o
成功建立會話,輸入密碼便可登陸
整個過程均爲加密過程
抓包分析通訊過程:藉助協議報文分析器
tcpdump:linux自帶抓包工具,支持多種協議的分析,須要捕包庫支持
sniffer:商業工具
wireshark(GUI):圖形化工具
tshark(CLI):命令行工具,wireshark的命令行版
tcpdump [options] 過濾條件
例如:tcp src host 172.16.100.1
tcp src or dst port 21
獲取報文的條件:
udp dst port 53
tcp src or dst port 21 AND src host 172.16.100.1
tcp port 21 AND host 172.16.100.1
src發送端
dst接受端
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]
抓包選項:
-c:指定要抓取的包數量。注意,是最終要獲取這麼多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是知足條件的包。
-i interface:指定tcpdump須要監聽的接口。若未指定該選項,將從系統接口列表中搜尋編號最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),
:一旦找到第一個符合條件的接口,搜尋立刻結束。能夠使用'any'關鍵字表示全部網絡接口。
-n:對地址以數字方式顯式,不然顯式爲主機名,也就是說-n選項不作主機名解析。
-nn:除了-n的做用外,還把端口顯示爲數值,不然顯示端口服務名。
-N:不打印出host的域名部分。例如tcpdump將會打印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入仍是流出的包。能夠給定的值爲"in"、"out"和"inout",默認爲"inout"。
-s len:設置tcpdump的數據包抓取長度爲len,若是不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷,
:輸出行中會出現"[|proto]"的標誌(proto實際會顯示爲協議名)。可是抓取len越長,包的處理時間越長,而且會減小tcpdump可緩存的數據包的數量,
:從而會致使數據包的丟失,因此在能抓取咱們想要的包的前提下,抓取長度越小越好。
輸出選項:
-e:輸出的每行中都將包括數據鏈路層頭部信息,例如源MAC和目標MAC。
-q:快速打印輸出。即打印不多的協議相關信息,從而輸出行都比較簡短。
-X:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出。
-XX:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出,更詳細。
-v:當分析和打印的時候,產生詳細的輸出。
-vv:產生比-v更詳細的輸出。
-vvv:產生比-vv更詳細的輸出。
其餘功能性選項:
-D:列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們均可以用於"-i"後。
-F:從文件中讀取抓包的表達式。若使用該選項,則命令行中給定的其餘表達式都將失效。
-w:將抓包數據輸出到文件中而不是標準輸出。能夠同時配合"-G time"選項使得輸出文件每time秒就自動切換到另外一個文件。可經過"-r"選項載入這些文件以進行分析和打印。
-r:從給定的數據包文件中讀取數據。使用"-"表示從標準輸入中讀取。
垃圾郵件過濾方式:
關閉OpenRelay
RBL:Realtime Black List 實時黑名單(付費)
由互聯網上的不少組織來維護
內容過濾器:
APACHE:SpamAssassin:垃圾郵件刺客
Perl語言開發:垃圾郵件分揀器
根據垃圾郵件特徵碼分析
註解:Perl解釋型語言,所以性能表現不太出色
病毒郵件網關:
clamav:開源殺毒軟件
病毒郵件服務器網關
呼叫器:caller,與郵件服務器進行交互分析過濾做用
MIMEDefang,Mailscanner,Amavisd-new(開源組件,經常使用)
經過Amavisd-new調用SpamAssassin和clamav
perl:CPAN
配置postfix使用maildrop投遞郵件
自帶郵件過濾功能,屬於courier旗下軟件
安裝:
將courier-authlib的頭文件及庫文件連接至/usr目錄
ln -sv /usr/local/courier-authlib/bin/courierauthconfig /usr/bin
ln -sv /usr/local/courier-authlib/include/* /usr/include
maildrop須要pcre的支持,所以,須要實現提供pcre的頭文件及庫文件等開發組件,若是選擇以yum源來提供pcre,請確保安裝pcre-devel包
yum -y install pcre-devel
groupadd -g 1001 vmail
useradd -g vmail -u 1001 -M -s /sbin/nologin vmail
tar jxvf maildrop-2.6.0.tar.bz2
cd maildrop-2.6.0
./configure --enable-sendmail=/usr/sbin/sendmail --enable-trusted-users='root vmail' --enable-syslog=1 --enable-maildirquoto --enable-maildrop-uid=1001 --enable-maildrop-gid=1001 --with-trashquoto --with-dirsync
make
make install
檢查安裝結果,請確保有"Courier Authentication library extension enable."這句話出現
maildrop -v 檢查安裝結果,是否支持courier authlib library是否已開啓
新建其配置文件/etc/maildroprc文件,首先指定maildrop的日誌記錄位置;
vim /etc/maildroprc
添加:
logfile "/var/log/maildrop.log"
保存退出
#touch /var/log/maildrop.log
#chown vmail.vmail /var/log/maildrop.log
配置postfix
編輯master.cf
vim /etc/postfix/master.cf
啓用以下兩行:
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
注意:定義transport的時候,即如上兩行中的第二行,其參數行必須以空格開頭,不然會出錯。
編輯main.cf
vim /etc/postfix/main.cf
virtual_transport = virtual
修改成:
virtual_transport = maildrop
將下面兩項指定的UID和GID做相應的修改:
virtual_uid_maps = static:2525
virtual_uid_maps = static:2525
修改成:
virtual_uid_maps = static:1001
virtual_uid_maps = static:1001
編輯/etc/authmysqlrc
vim /etc/authmysqlrc
MYSQL_UID_FIELD '2525'
MYSQL_GID_FIELD '2525'
修改成:
MYSQL_UID_FIELD '1001'
MYSQL_GID_FIELD '1001'
注意:沒有此處的修改,maildrop可能會報告「signal 0x06」的錯誤報告
編輯/etc/httpd/httpd.conf,修改運行用戶:
若是啓用了suexec的功能,則將虛擬主機中指定的
SuexecUserGroup postfix postfix
修改成:
SuexecUserGroup vmail vmail
若是沒有使用上面的功能,則修改User和Group指令後的用戶爲vmail
將前文中的以下項:
User postfix
Group postfix
修改成:
User vmail
Group vmail
將用戶郵件所在的目錄/var/mailbox和extman的臨時目錄/tmp/extman的屬主和屬組指定爲vmail
chown -R vmail.vmail /var/mailbox
chown -R vmail.vmail /tmp/extman
修改extman的主配置文件中的默認用戶ID和組ID,確保其爲相似以下內容:
vim /var/www/extsuite/extman/webman.cf
SYS_DEFAULT_UID = 1001
SYS_DEFAULT_GID = 1001
驗證:
接下來重啓postfix和apache,進行發新測試後,若是日誌中的記錄類同如下項,則安裝成功
(delivered via maildrop service)而且relay=maildrop便可
Name Resolve:Username --> UID,Group --> GID,Service Name --> PORT,HOSTNAME --> IP
Username --> UID:/etc/passwd
Hostname --> IP:DNS,/etc/hosts
Service Name --> Ports:/etc/services,MYSQL:services,ports
只要一種數據存儲格式:解析庫,不一樣的解析庫須要不一樣的查詢方式
nsswitch:nsswitch是一個框架,用於完成不一樣解析庫的解析
ftp服務
File Transfer Protocol 文件傳輸協議
21/tcp
文件共享服務:應用層協議,ftp
NFS:Network File System(RPC:Remote Procedure Call,遠程過程調用)
可以讓位於不一樣主機上的兩個進程可以基於二進制的格式實現數據通訊
Samba:CIFS/SMB,
FTP:有兩個連接
一、命令連接,控制連接(創建連接)鏈接後持續打開狀態;21/tcp
二、數據連接(傳輸)發起請求時打開,傳輸完成斷開。
主動模式:
20/tcp 服務器端發起請求向客戶端傳輸數據
被動模式:
端口隨機,有服務器端發起兩個字符串給客戶端,由客戶端按照這兩個字符串生成隨機端口,第一個字符串乘以256再加第二個字符串爲隨機端口號。有效的避免客戶端防火牆拒絕的問題。
數據傳輸模式(自動選擇):傳輸遵循傳輸文件自己格式
二進制:
文本:
ftp Server --> ftp client
上傳下載命令:
get:下載單個文件
put:上傳單個文件
mget:下載多個文件
mput:上傳多個文件
數據類型:
結構化數據
半結構化數據
非結構化數據
FTP服務器端軟件:
Linux:
wu-ftpd:華盛頓大學FTP
vsftpd:Very Secure Ftp Daemon
proftpd:
pureftpd
win:
Serv-U
Filezilla(Linux也支持)
FTP客戶端程序:
CLI:
ftp
lftp
GUI:
gftpd
FlashFxp
Cuteftp
Filezilla
vsftpd:
/etc/vsftpd:配置文件目錄
/etc/init.d/vsftpd:服務腳本
/usr/sbin/vsftpd:主程序
/var/ftp:放置文件目錄,此目錄對於vsftp進程來講不能有寫權限,在此目錄下建立子目錄給予ftp權限
基於PAM實現用戶認證:
/etc/pam.d/*
/lib/security/*
/lib64/security/*
支持虛擬用戶
安裝vsftp
更新yum源
yum install fsftpd
ftp:不管哪一種用戶最終都會映射給一個系統用戶
匿名用戶 --> 系統用戶
虛擬用戶
系統用戶 --> 系統用戶
/var/ftp:ftp用戶的家目錄
匿名用戶訪問目錄,由於被映射給了ftp用戶
service vsftpd start 啓動
chkconfig vsftpd on
使用anonymous匿名用戶登陸
登錄後執行help能夠查看可執行命令
chroot:鎖定用戶根目錄
cd /etc/vsftpd
cp vsftpd.conf vsftpd.conf.bak
man vsftpd.conf
經過查看幫助文檔瞭解各功能打開關閉選項詳情
getenforce # 查看SELinux狀態
setenforce 0 # 關閉SELinux
vim vsftpd.conf
anonymous_enable = YES # 是否啓用匿名用戶
local enable = YES # 是否啓用系統用戶
write_enable = YES # 系統用戶是否能夠上傳文件
anon_upload_enable = YES # 是否容許匿名用戶上傳文件
anon_mkdir_write_enable = YES # 是否容許匿名用戶建立文件
anon_other_write_enable = YES # 是否容許匿名用戶其餘寫權限
須要在上傳目錄設置ftp寫權限:
#setfacl -m u:ftp:rwx /var/ftp/upload
#getfacl /var/ftp/upload # 查看權限信息
dirmessage_enable=YES # 登陸至某目錄顯示歡迎信息,在登陸的默認目錄下建立.message文件寫提示語保存便可,ftp帳戶登陸至此目錄就會顯示輸入的提示語。
xferlog_enable=YES # 打開傳輸日誌信息
xferlog_file=/var/log/xferlog # 打開日誌存儲文件位置
xferlog_std_format=YES # 日誌標準格式
chown_uploads=YES # 是否容許當用戶完成文件上傳後是否把用戶屬組屬主改成其餘用戶
chown_username=whoever # 改成哪一個用戶,與上一條搭配使用
idle_session_timeout=600 # 定義會話超時時間,超過600秒斷開用戶會話控制鏈接
data_connection_timeout=120 # 定義數據傳輸超時時間,超過120秒不傳輸數據斷開鏈接
ascii_upload_enable=YES # 是否啓用文本模式上傳功能,若是打開只使用純文本模式上傳文件
ascii_download_enable=YES # 是否啓用文本模式下載功能,若是打開只使用純文本模式下載文件
chroot_list_enable=YES # 是否用一個文件將特定用戶鎖在家目錄下
chroot_list_file=/etc/vsftpd/chroot_list # 在哪一個文件中建立一個用戶列表,將列表中用戶禁錮在雜技目錄中,與上一條搭配使用
如:建立文件vim /etc/vsftpd/chroot_list,添加用戶名 hadoop 保存退出,重啓服務
若是嫌棄一個個用戶填寫太麻煩能夠使用如下參數:
chroot_local_user=YES # 此時將全部系統用戶所有禁錮在家目錄下
listen=YES # vsftpd是否工做在一個獨立守護進程
改成瞬時守護進程方法:
/etc/xinetd.d/目錄下建立一個vsftpd的腳本便可
守護進程;
獨立守護進程:用於用戶量較大,鏈接時間較長的場景
瞬時守護進程:不須要關聯至運行級別,用戶量訪問較小,訪問時間較短的場景
由超級守護進程xinetd代爲管理,xinetd是一個獨立守護進程
pam_service_name=vsftpd # 定義pam相關配置文件名稱
userlist_enable=YES # 全部寫在/etc/vsftpd/ftpusers文件中的用戶都禁止訪問FTP,pam.d/vsftpd文件中指定了此文件拒絕訪問的內容。
userlist_deny=YES # 拒絕userlist訪問列表中的用戶訪問FTP,改成NO爲僅容許列表內用戶登陸,其餘用戶不能登陸
max_clients=# # 容許最大的訪問客戶端數
max_per_ip=# # 同一個IP最多可同時發起多少鏈接數
tcp_wrappers=YES #
vsftpd支持兩種安全通訊方式:
ftps:ftps_ssl/tls
一、建立證書和祕鑰文件
cd /etc/pki/CA
mkdir certs newcerts crl
touch index.txt
echo 01 > serial
(umask 077:openssl genrsa -out private/caksy.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days=3650
CN
Hebei
SJZ
MageEdu
Tech
ca.magedu.com
完成證書建立
mkdir /etc/vsftpd/ssl
cd /etc/vsftpd/ssl
(umask 077:openssl genrsa -out vsftpd.key2048)
openssl req -new -key vsftpd.key -out vsftpd.csr
CN
Hebei
SJZ
MageEdu
Tech
ftp.magedu.com
完成私鑰建立
vim /etc/pki/tls/openssl.cnf
dir = /etc/pki/CA
保存退出
openssl ca -in vsftpd.csr -out vsftpd.crt # 簽署證書
二、在vsftpd.conf文件中添加以下內容:
ssl_enable=YES # 啓用ssl功能
ssl_tlsv1=YES # 支持tlsv1版本ssl
ssl_sslv2=YES
ssl_sslv3=YES # 支持sslv3版本
allow_anon_ssl=NO # 匿名是否啓用ssl
force_local_data_ssl=YES # 強制本地用戶傳輸使用ssl
force_local_login_ssl=YES # 強制本地用戶登陸使用ssl
rsa_cert_file=/etc/vsftpd/ssl/vsftpd_crt # 使用的證書文件
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key # 使用的祕鑰文件
保存退出
重啓服務
sftp:OpenSSH,SubSystem,sftp(SSH)
chroot:禁錮用戶於其家目錄中
文件服務權限:
文件系統權限*文件共享權限
vsftpd:PAM(手動定義配置文件)
虛擬用戶:
mysql:VSFTPD,users;Name,Password
/etc/vsftpd/vusers --> db_load 使用db4-utils包實現轉換爲二進制格式文件
USERNAME
PASSWORD
ftp用戶使用mysql數據庫管理:
一、事先安裝好開發環境和mysql數據庫
yum -y install mysql-server mysql-devel
yum -y groupinstall "Development Libraries" # 準備好開發包組
二、安裝pam_mysql-0.7RC1
tar zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-mysql=/usr/local/mysql --with-openssl
make && make install
cp /usr/lib/security/pam_mysql.so /lib/security/
三、安裝vsftpd-2.0.5
mkdir -pv /usr/share/empty /var/ftp
useradd -s /bin/false -d /var/ftp ftp
tar zxvf vsftpd-2.0.5.tar.gz
cd vsftpd-2.0.5
make && make install
安裝配置文件
cp vsftpd.conf /etc
編輯配置文件/etc/vsftpd.conf
添加:listen=YES
啓動服務器:
/usr/local/sbin/vsftpd &
chmod og-w /var/ftp
配置
一、準備數據庫及相關表
再次,咱們創建名爲vsftp的數據庫來存放相關虛擬用戶的帳號
mysql>create database vsftp;
mysql>grant select an vsftp.* to vsftpd@localhost identified by '123456';
mysql>grant select an vsftp.* to vsftpd@127.0.0.1 identified by '123456';
mysql>flush privileges;
mysql>use vsftp;
mysql>create table users (
id int AUTO_INCREMENT NOT NULL,
name char(20) binary NOT NULL,
paaswd char(48) binary NOT NULL,
primary key(id)
);
添加測試的虛擬用戶,其密碼採起加密存放的方式
mysql>insert into users(name,passwd) values('benet',password('123456'));
mysql>insert into users(name,passwd) values('apatech',password('123456'));
查看結果
mysql> select * from users;
二、創建pam認證所需文件
vim /etc/pam.d/vsftp.mysql
添加以下兩行:
auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp tables=users userclumn-name passwdcolumn=passwd crypt=2
account required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp tables=users userclumn-name passwdcolumn=passwd crypt=2
註解:crypt參數詳解
此參數爲0時密碼以明文存放,爲1表示,爲2時表示用mysql數據庫方式以密文存放,爲3是MD5方式加密,爲4以SHA1方式加密。啓用加密方式存放,可能會致使ftp虛擬用戶沒法正常登錄,密碼驗證可能沒法經過。
三、修改vsftpd的配置文件,使其適應mysql認證
創建虛擬用戶映射的系統用戶及對應的目錄
useradd -s /sbin/nologin -d /var/ftp2 vsftp
chmod go+rx /var/ftp2
請確保/etc/vsftpd.conf中已經啓用瞭如下選項
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
添加一下選項:
guest_enable=YES # 容許來賓用戶訪問
guest_username=vsftp # 來賓用戶映射給哪一個系統用戶
listen=YES
pam_service_name=vsftpd.mysql # 認證使用mysql方式
爲不一樣用戶建立不一樣權限:
vim /etc/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
保存退出
mkdir /etc/vsftpd/vusers_dir/
touch tony peter
vim tony
anon_upload_enable=NO
anon_mkdir_write_enable=NO
vim peter
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
啓動vsftpd服務
/usr/local/sbin/vsftpd &
查看端口開啓狀況
netstat -tnlp|grep :21
使用虛擬用戶登陸,驗證配置結果,一下爲本機的命令方式測試,你也能夠再其餘win Box上用IE或者FTP客戶端工具登陸驗證。
NFS服務:
Network File System
ext3,ext2:Kernel Space
mke2fs:用戶空間,文件系統管理工具
read()和write()均爲函數
local procedure call 本地過程調用
RPC:Remote procedure call 遠程過程調用
linux:提供rpc服務的程序:portmap:111/tcp,111/udp
RPC:編程技術,簡化分佈式應用程序的開發,RPC:C --> RPC C --> RPC S --> S
NFS Client --> NFS Server 由RPC完成此過程
web服務:
Browser --> Server html格式
RPC實現:二進制格式,文本格式(XMLRPC)都可 --> SOAP(Simple Object Access Protocol)
NFS:由SUN發開的文件系統
NFSv1-NFSv4
服務器端:nfs-utils
rpm -ql nfs-utils
service nfs start 啓動nfs server服務,nfs會啓動三個進程,監聽在TCP/UDP的2049端口
nfsd:nfs主服務
mountd:接受客戶端掛載請求進程,端口半隨機
quotad:磁盤配額進程,限制能夠在本地使用多大空間,端口半隨機,向RPC申請分配的
service portmap status 確保關聯服務已經啓動,tcp/111 udp/111,與RPC客戶端通訊使用,向RPC申請分配的
rpcinfo -p localhost 查看全部rpc程序所關聯的端口號
/etc/rc.d/init.d/nfs.lock # 鎖機制,當一個共享文件由兩個程序同時訪問時來控制訪問的進程。
配置文件:
/etc/exports
man exports 能夠查看使用方式
內容格式以下:
/path/to/somedir CLIENT_LIST
多個客戶之間使用空白字符分隔
每一個客戶端後面必須跟一個小括號,裏面定義了此客戶訪問特性,如訪問權限等
例如:172.16.0.0/16(ro,async) ro爲只讀權限,async爲異步寫入 192.16.0.0/24(rw,sync) rw爲讀寫權限,sync爲同步寫入
服務端建立過程:
mkdir /shared
vim /etc/exports
內容:
/shared 172.16.0.0/16(ro)
保存退出
service nfs restart
爲保障nfs不中斷,能夠使用如下命令刷新配置
exportfs命令:
-a:跟-r或-u選項同時使用,表示從新掛載全部文件系統或取消導出全部文件系統;
-r:從新導出
-u:取消導出
-v:顯示詳細信息
showmount -a NFS_SERVER # 查看本地及其被掛載已經掛載的文件系統,以及客戶端對應列表
-e NFS_SERVER # 查看本地服務器已經共享的目錄,在其餘網絡主機也能夠查看其餘服務器的共享目錄
-d NFS_SERVER # 顯示NFS服務器全部導出的文件系統中被客戶端掛載了的文件系統
客戶端使用mount命令掛載
mount -t nfs NFS_SERVER:/PATH/TO/SOME_EXPORT /PATH/TO/SOMEWHERE
文件系統導出屬性:能夠使用man exports查看具體屬性參數
ro:只讀
rw:讀寫
async:異步
sync:同步
root_squash:將root用戶映射爲來賓帳號,默認開啓;
no_root_squash:root用戶映射訪問,很是不安全的選項
all_squash:任何用戶都映射爲來賓帳號
anonuid和anongid:指定映射的來賓帳號
no_acl:不支持acl
用戶權限:
useradd -u 510 nfstest
touch /shared/nfstest
chown nfstest.nfstest /shared/nfstest
vim /etc/exports
/shared 172.16.0.0/16(rw,all_squash,anonuid=510,anongid=510)
客戶端從新掛載後
ls -l nfstest目錄屬組屬主爲510
自動掛載nfs目錄:
vim /etc/fstab
添加一行:
172.16.100.7:/shared /mnt/nfs nfs defaults._rnetdev 0 0
保存退出便可
_rnetdev選項爲若是掛在不上能夠忽略
讓mountd和quotad等進程監聽在固定端口,編輯配置文件/etc/sysconfig/nfs
內容:
MOUNTD_PORT=892
QUOTAD_PORT=875
LOCKD_UDPPORT=32769
重啓nfs服務便可生效
iptables系列之基礎原理
iptables不是服務,但有服務腳本,服務腳本的主要做用在於管理保存的規則
裝載及移除iptables/netfilter相關的內核模塊:
iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_nat,ip_conntrack
linux:網絡防火牆
netfilter:Frame
iptables:數據報文過濾,NAT、mangle等規則生成的工具
MSL:Maximum Segment Lifetime 最大生存時長,通常爲120秒
防火牆:硬件,軟件:規則(匹配標準,處理辦法)
Framework:框架
默認規則:
開放:堵
關閉:通
規則:匹配標準
IP:SIP源IP,DIP目標IP
TCP:SPORT源端口,DPORT目標端口,1次握手狀態:SYN=1,FIN=0,RST=0,ACK=0; 2次握手狀態:SYN=1,ACK=1,FIN=0,RST=0; 3次握手狀態:ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)
UDP:SPORT,DPORT目標端口
ICMP:icmp-type
數據報文過濾
早期Linux沒有防火牆,移至了OpenBSD的機制
Linux2.0:ipfw/firewall
Linux2.2:ipchain/firewall
Linux2.4:iptables/netfilter
hook function:鉤子函數,每一個鉤子函數對應一個鏈
prerouting:路由以前
input:進入
output:發出
forward:轉發
postrouting:路由以後
規則鏈:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
filter(過濾):表
INPUT
OUTPUT
FORWARD
NAT(地址轉換):表
PREROUTING
POSTROUTING
mangle(修改報文首部):表
拆開、修改、封裝
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():表
PREROUTING
OUTPUT
規則前後次序:
PREROUTING:raw --> mangle --> nat --> filter
INPUT:mangle --> filter
FORWARD:mangle --> filter
OUTPUT:raw --> mangle --> nat --> filter
POSTROUTING:mangle --> nat
自定義鏈:
被默認鏈調用後才能發揮做用,並且若是沒有被任何自定義鏈中的任何規則匹配,還應該有返回機制;
用戶能夠刪除自定義的空鏈
默認鏈沒法刪除
每一個規則都有2個內置的計數器
一、被匹配到的報文個數
二、被匹配到的報文體積之和
規則:匹配標準,處理動做
常見使用格式:
iptables [-t TABLE] COMMAND CHAIN [num] 匹配標準 -j 處理辦法
iptables啓動時會加載/etc/sysconfig/iptables文件,使用命令添加的條目會保存在此文件中才能夠永久有效
所以 使用命令添加的規則,須要使用 service iptabels save 便可保存規則,不然重啓後即使失效
匹配標準:
通用匹配
-s.--src 源地址
-d,--dst 目標地址
-p {tcp|udp|icmp} 指定協議
-i interface 指定數據報文流入的接口
可用於定義標準的鏈:PREROUTING,INPUT,FORWARD
-o interface 指定數據報文流出的接口
可用於標準定義的鏈:OUPUT,POSTROUTING,FORWARD
-j TARGET 跳轉
ACCEPT 容許經過
DROP 丟棄,悄悄丟棄
REJECT 拒絕
LOG 並不作用戶請求去向的處置,只是記錄日誌,log必定要放在前面,不然匹配到以後再也不追溯後面的內容,就不會記錄日誌
--log-level level:指定日誌級別
--log-prefix prefix:log的前綴
--log-tcp-sequence:tcp的序列號
--log-tcp-options:tcp報文選項
--log-ip-options:ip報文選項
--log-uid:哪一個用戶請求的,請求用戶的UID
例:iptables -I INPUT 4 -d 172.16.100.7 -p icmp --icmp-type 8 -j LOG --log-perfix "---firewall log for icmp---"
記錄日誌ping本機的內容,並加前綴信息,查看tail -f /var/massages看到日誌內容
擴展匹配:依賴於模塊.so文件
隱含擴展:不需特別指明由哪一個模塊進行的擴展,由於此時使用-p{tcp|udp|icmp}已指明
-p tcp
--sport PORT[-PORT]:源端口,能夠後面加-port指定一堆連續的端口
--dport PORT[-PORT]:目標端口,同上
--tcp-flags mask comp:只檢查mask指定的標誌位,是逗號分隔的標誌位列表,comp:此列表中的位必須爲1,而mask中出現的,必須爲0;
如:--tcp-flags SYN,FIN.ACK,RST SYN,ACK = --syn
--syn:表示TCP三次握手中的第一次
-p icmp
--icmp-type:
0:echo-reply,響應報文
8:echo-request,請求報文
-p udp
--sport
--dport
顯示擴展:使用額外的匹配機制。必須指明由哪一個模塊進行的擴展,在iptables中使用-m選項可完成此功能
-m EXTESTION --spe-opt
-m state:狀態擴展
結合ip_conntrack追蹤會話的狀態
NEW:新鏈接情求
ESTABLISHED:已創建的連接
INVALID:非法鏈接請求
RELATED:相關聯的
-m state --state NEW,ESTABLISHED -j ACCEPT # 狀態是NEW和ESTABLISHED的數據報放行
-m multiport:離散的多端口匹配擴展
--source-ports:源端口
--destination-ports:目標端口
--ports:不區分源和目標,只要是端口就匹配
例:表示21,22,80端口所有打開並作狀態追蹤
-m multipor --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
-m iprange:ip地址範圍取值的擴展功能
--src-range
--dst-range
-m connlimit:鏈接數限制
! --connlimit-above n :給出鏈接最大數值,n爲數值,容許狀況下前面須要加!使用。
例:iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT # 表示低於2個的容許,若是不加!號,最後應該是-j DROP
-m limit:限制請求數量
--limit RATE:明確速率,單位時間內最多容許放行的數量
--limit-burst num:蜂擁而至的數量最多容許多少
例:iptables -I INPUT -d 172.16.100.7 -p tcp -dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
表示本機的22端口連接數量最多每秒容許3個請求進入,而且峯值也僅容許3個進入
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
iptables -R OUTPUT 1 -s 172.16.100.7 -m state --state ESTABLISHED,RELATED -j ACCEPT
以上兩條將進出ping都打開,接下來咱們更改成限制模式:
iptables -R INPUT 3 -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
測試過程不易過快,不然沒法測出效果,限定每秒1個ping請求處理,此時使用ping -t 172.16.100.7進行ping請求測試
-m string:字符串匹配,根據某種字符串匹配不一樣策略2.6.14之後版本才支持此選項。
--algo bm|kmp:bm和kmp是兩種不一樣算法,區別不大
--string "pattern":匹配哪個字符串,請求中包含此字符串則會拒絕或者放行
例:在httpd的訪問頁面文件中含有h7n9內容,測試訪問是否正常,測試屏蔽此字符
iptables -I OUTPUT -s 172.16.100.7 -m string --algo kmp --string "h7n9" -j REJECT
範圍取反:
能夠使用!條件取反
例如:-s 172.16.100.7 表示源端爲172.16.100.7可是中間加!取反 -s ! 172.16.100.7則表達爲除172.16.100.7意外的IP均爲源端
ip範圍取值顯示擴展的方式,也支持取反一樣是加!號:
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m --state NEW,ESTABLISHED -j ACCEPT
開啓ssh端口對服務器的訪問例子:
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
容許本機ping任意主機但拒絕其餘主機ping:
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT
放行外部主機ping本機:
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
容許udp和tcp 53端口訪問並解析,須要8條規則
sshd和httpd服務器防火牆策略,並開通追蹤功能:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
使用iptstate命令查看連接狀態,已經能夠看到端口連接狀況而且可看到已鏈接狀態的TTL爲120小時倒計時(5天)狀態,若是鏈接一直不斷開此條目會一直存放,所以可能會致使不停存放沒法釋放的狀況。
sysctl -w net.ipv4.ip_conntrack_max=65536 # 增長條目數量到65536
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established #能查看最大超時時長 432000秒
經過sysctl命令寫入只是臨時生效,永久生效須要以下操做:
vim /etc/sysctl.conf
添加:
sysctl -w net.ipv4.ip_conntrack_max=65536
用一條規則所有囊括以上規則:
iptables -I OUTPUT -s 172.16.100.7 -m state --state ESTABLISHED -j ACCEPT # 全部端口所有放行,-I表示放置爲第一條規則
刪除以前全部規則:
iptables -D OUTPUT 2 # 從第二條刪除,可重複執行,由於刪除第二條以後,後面的就成爲第二條規則。
放行FTP的21端口:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
由於ftp爲mysql虛擬用戶認證,所以須要放行本地鏈接
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
此時能夠登陸成功,但ls沒法看到任何數據,由於控制協議打開並未開放傳輸協議,可是傳輸協議爲隨機端口,下面還需進行對應的隨機端口的放行
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -R OUTPUT 1 -s 172.16.100.7 -m state --state ESTABLISHED,RELATED -j ACCEPT
還須要裝載ip_conntrack_ftp和ip_nat_ftp模塊
裝載模塊編輯文件以下:
vim /etc/sysconfig/iptables-config
找到以下添加選項ip_nat_ftp ip_conntrack_ftp便可
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
iptables系列之基本應用及顯式擴展
iptables命令:能夠用man iptables查看具體詳情
管理規則:
-A:附加一條規則,添加在鏈的尾部
-I CHAIN [num]:插入一條規則,插入爲對應CHAIN上的第num條,不寫num則默認爲第一條;
-D CHAIN [num]:刪除指定鏈中的第num條規則;
-R CHAIN [num]:替換指定的規則
管理鏈
-F [CHAIN]:flush,清空指定規則鏈,若是省略CHAIN,則能夠刪除對應表中的全部鏈
-P CHAIN:設定指定鏈的默認策略
-N:自定義一個新的空鏈
-X:刪除一個自定義的空鏈,非空的須要使用-F清空後刪除
-Z:置零指定鏈中全部規則的計數器
-E:重命名自定義的鏈
查看類:
-L:顯示指定表中的全部規則
-n:以數字格式顯示主機地址和端口號
-v:顯示鏈及規則的詳細信息
-vv或-vvv:按v的出現次數顯示更爲詳盡的內容
-x:顯示計數器的精確值
--line-numbers:顯示規則號碼
動做(target)
ACCEPT:容許經過
DROP:丟棄,悄悄丟棄
REJECT:拒絕經過
DNAT:目標地址轉換
SNAT:源地址轉換
REDIRECT:端口重定向
MASQUERADE:地址假裝
LOG:記錄日誌
MARK:給報文加標記
例子:
將默認規則所有清除
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
只保留了22端口的手動添加策略
此時httpd和ping都沒有響應
放行對外的80端口
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
ip_conntrack模塊:
能夠追蹤會話過程,不管TCP仍是UDP報文
/proc/net/ip_conntrack文件,內核文件,保存當前系統每一個客戶端與主機創建的連接關係和狀態
使用iptstate命令同樣能夠查到以上文件內容
-t:顯示當前主機全部請求狀態信息
lsmod|grep ip # 能夠查看跟IP網絡相關的全部加載模塊
modprobe -r ip_conntrack # 卸載ip_conntrack模塊,會提示模塊正在使用沒法移除,即使添加-f強制選項也沒法移除,由於此功能均被iptables所調用的,中止iptables服務既可卸載,一旦卸載不會記錄追蹤。
cat /proc/sys/net/ipv4/ip_conntrack_max # 能夠定義ip_conntrack文件最大能保存多少條目,默認32768,若是超出則會超時被丟棄。
所以,在很是繁忙的服務器上就不要啓動此模塊了。
註解:卸載ip_conntrack模塊後,只要使用iptables -t nat -L 就會自動加載此模塊,由於iptable_nat與ip_conntrack有依賴關係,所以在負載較高的服務器儘可能避免查看nat相關iptables表。有案例由於此命令致使服務器大量鏈接包被丟棄損失三十萬。
保存規則:
service iptabels save # 命令保存規則永久生效,不然重啓後規則失效
/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables.20190110
iptabels-restore < /etc/sysconfig/iptables.20190110
流量控制工具:
tc:traffic control
實現流量控制方式:
令牌桶機制:設定一個令牌桶裏面只有500個令牌,只有獲取令牌的用戶才能夠獲取訪問權,回收必定令牌以後再次發放。須要設定一個總量,而後再設定一個同一時間可進如的峯值便可。
iptables系列之nat及其過濾功能
新建立鏈:
iptables -N clean_in # 自定義建立一條名爲clean_in的新鏈
iptables -L -n # 查看結果有一條references的新鏈,此爲引用鏈,表示被主鏈調用的鏈
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP # 添加到新鏈一條規則
iptables -L -n --line-nubmers # 查看結果而且加序列號顯示規則
iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP # 繼續添加新鏈來保障主機安全
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP # tcp的同步數據的新數據包
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 172.16.100.7 -j RETURN # 任何數據報進來先到clean_in鏈進行清理,均未匹配的轉發至主鏈調用
iptables -I INPUT -j clean_in # 調用規則,先由clean_in處理,而後再回到主鏈第二條規則匹配
iptables -X clean_in # 刪除鏈,但必須爲空鏈纔可刪除
利用iptables的recent模塊來抵禦DOS攻擊:
iptables -I 2 INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I 3 INPUT -p tcp -dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I 4 INPUT -p tcp -dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
recent:即記錄最近請求的IP記錄保存在名爲SSH的空間中,有新用戶請求就使用update參數更新此記錄,在300s中以內出現了3次請求以上的就拒絕此請求
一、放置在第二條保障優先級,利用connlimit模塊將單IP的併發設置爲3,;會誤殺使用NAT上網的用戶,能夠根據實際狀況增大該值
二、放置在INPUT鏈的第三條,利用recent和state模塊限制單IP在300s內只能與本機創建3個新鏈接,被限制五分鐘後便可恢復訪問
下面對最後兩句作一個說明:
一、第二句是記錄訪問tcp 22端口的新鏈接,記錄名稱爲SSH
--set 記錄數據報的來源IP;若是IP已經存在將更新已經存在的條目
二、第三局是指SSH記錄中的IP,300s內發起超過3次鏈接則拒絕此IP的連接。
--update是指每次創建鏈接都更新列表
--seconds 必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用
三、iptables的記錄:/proc/net/ipt_recent/SSH
也能夠使用下面的這句記錄日誌:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300s --hitcount 3 -j LOG --log-prefix "SSH Attack"
NAT:Network Address Translation
DNAT:目標地址轉換
SNAT:源地址轉換(POSTROUTING,OUTPUT)
路由功能也能夠將不一樣網段的地址進行轉換:
vim /proc/sys/net/ipv4/ip_forward 默認值爲0改成1便可打開路由功能
設置NAT轉換防火牆,先清理以前策略:
設置以前要在真實環境中設置兩個網絡,並在中間防火牆的主機上添加兩邊網絡的網卡。
iptables -P INPUT ACCEPT # 將INPUT鏈的默認策略改成ACCEPT
iptables -P OUTPUT ACCEPT # 將OUTPUT鏈的默認策略改成ACCEPT
iptables -F # 清除全部規則
iptables -L -n # 查看規則列表爲空
iptables -X clean_in # 刪除clean_in鏈
service iptables save # 保存當前結果
vim /proc/sys/net/ipv4/ip_forward 默認值爲0改成1 # 打開轉發功能
永久生效:vim /etc/sysctl.conf 將net.ipv4.ip_forward = 1 保存便可
sysctl -p 刷新設置便可生效
更改一臺客戶端的默認網關:
route del -net 0.0.0.0
route add default gw 172.16.100.7
添加路由以後便可完成互訪;
但這樣就能完成網絡互訪爲何還須要NAT呢?
由於假如咱們與互聯網通訊的時候,就沒法返回你的主機了,所以要經過NAT轉換爲本機的公有地址才能回到本機
-j SNAT
--to-source:指定源地址是哪裏
例:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7
使用iptables -t nat -L -n # 查看nat表中是否有新的規則生效
-j MASQUERADE:地址假裝 ,外網地址是動態時使用,但性能效率較低
轉發:拒絕192.168.10.0段的全部ping包的轉發
iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT
iptables -P FORWARD DROP # 全部轉發所有丟棄
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT # 只打開了FTP控制規則
iptables -R FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # 將已鏈接的添加RELATED便可打開FTP傳輸規則
使用前必須先打開兩個模塊:
vim /etc/sysconfig/iptables-config
添加以下模塊:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
lsmod|grep ftp # 查看模塊是否打開
DNAT:目標地址轉換,目標地址轉換的鏈爲PREROUTING
-j DNAT
--to-destination IP:[port]
iptabels -t nat -A PREROUTING -d 172.16.100.7 -p tcp -dport 80 -j DNAT --to-destination 192.168.10.22
# 訪問外網地址的172.16.100.7的80端口時則跳轉爲內網的192.168.10.22的80端口
iptabels -t nat -R PREROUTING 1 -d 172.16.100.7 -p tcp -dport 80 -j DNAT --to-destination 192.168.10.22:8080 #上面一條爲將剛添加的第一條80端口改成目標地址訪問的8080端口,即外網訪問172.16.100.7的80端口實際訪問的是內網192.168.10.22的8080端口
目標地址轉換放行FTP端口比較複雜,由於ftp被動模式時返回端口是隨機的。
PNAT:Port NAT,端口轉換
# 過濾從外網訪問內網的含h7n9內容的web頁面都丟棄掉
iptables -A FORWARD -m string --algo kmp --string "h7n9" -j DROP
基於時間作控制的iptables:
由於redhat自帶版本沒有time模塊,所以須要自定義編譯安裝來支持time模塊
須要安裝layer7支持功能才能夠支持time模塊,而且還支持應用級過濾例如迅雷、QQ等
iptables系列之layer7
DMZ:軍事化區域
內核編譯:
單內核:模塊化(文件系統、驅動、安全)
配置:.config(/proc/cpuinfo,lspci,lsusb,hal-device)
make menuconfig
make gconfig
make kconfig
make config
make oldconfig
編譯
make
只編譯部分源碼:
make SUBDIR=arch/
make drivers/net/pcnet32.ko
轉存編譯結果
make O=/path/to/somewhere
安裝內核模塊
make module_install
安裝內核
make install
make clean:清理以前編譯好的二進制模塊,清理以前須要備份.config文件,不然將被清理
make mrproper:清理以前編譯所殘留的任何操做
busybox+kernel = Linux
linux:
開發工具gcc
工程工具make
頭文件glibc
微型系統ulibc
layer 7 -- l7
應用:xunlei,qq,netfilter<--path
一、給內核打補丁,並從新編譯內核
二、給iptables源碼打補丁,並從新編譯iptabels
三、安裝l7proto
kernel,patch
iptabels,patch
iptables:2、3、四層
string:字符串過濾
netfilter:是一個框架,完成應用級過濾,須要打補丁完成
rules規則依靠iptables來實現,netfilter框架進行補丁升級以後,還須要完善iptables實現相應的規則語法補丁,才能實現7層過濾
安裝補丁與l7過程:
Kernel Patch
tar zxvf linux-2.6.28.10.tar.gz -C /usr/src
tar zxvf netfilter-layer7-v2.22.tar.gz -C /usr/src
cd /usr/src
ln -sv linux-2.6.28.10 linux
cd /usr/src/linux
patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
cp /boot/config-2.6.18-164.el5 /usr/src/linux/.config
make menuconfig
選擇補丁項:
在networing support -> Networking options -> network packet filtering framework -> core netfiler configuration
選擇以下:
<M> netfilter connection tracking support
<M> 「layer7」 match support
<M> 「string」 match support
<M> 「time」 match support
<M> 「iprange」 match support
<M> 「connlimit」 match support
<M> 「state」 match support
<M> 「conntrack」 connection match support
<M> 「mac」 address match support
<M> 「multiport」 multiple port match support
<M> FTP protocol support (NEW)
networking support -> networking options -> network packet filtering framework -> IP:netfiler configuration
選擇以下:
<M> IPv4 connection tracking support (required for NAT)
<M> full NAT
<M> MASQUERADE target support
<M> NETMAP target support
<M> REDIRECT target support
選擇完成以後執行以下:
screen # 打開一個新窗口,以免更新內核階段鏈接斷開致使的升級終端
make # 編譯開始後使用ctrl+a+d能夠退出打開screen,但更新不斷開
make modules_install # 安裝內核模塊
make install # 安裝內核
vim /etc/grub.conf
將下面選項將1改成0便可
default=0
shutdown -r now # 重啓生效
uname -r # 查看內核版本是否爲新版本
編譯新版本的iptabels:
Compiles iptabels:
cp /etc/init.d/iptabels ~/ # 備份iptables啓動腳本到家目錄
cp /etc/sysconfig/iptables-config ~/ # 備份配置文件到家目錄
cp /etc/sysconfig/iptables ~/iptables.rules # 備份以前的策略到家目錄
service iptables stop
rpm -e iptaebls-ipv6 iptables iptstate --nodeps # 卸載以前的安裝
tar jxvf iptables-1.4.6.tar.bz2 -C /usr/src
cd /usr/src/iptables-1.4.6
cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* ./extension/
./configure --prefix=/usr --with-ksource=/usr/src/linux
make
make install
which iptabels # 查找一下安裝路徑
在/usr/sbin/iptables目錄
vim ~/iptables # 更改一下啓動腳本
將/sbin的安裝目錄路徑所有更改成/usr/sbin,共3處
保存退出
mv ~/iptables /etc/rc.d/init.d/
chkconfig --add iptables
cp ~/iptables-config /etc/sysconfig/ # 配置文件恢復
cp ~/iptables.rules /etc/sysconfig/iptables # 恢復以前備份的iptables策略
安裝協議特徵包:此包用於識別xunlei、qq等應用特徵碼過濾的
tar zxvf l7-protocols-2009-05-28.tar.gz
cd l7-protocols-2009-05-28
make install
service iptables start
l7-filter uses the standard iptabels extension syntax
# iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
l7所支持的協議能夠再一下路徑下查找:
cd /etc/l7-protocols/protocols/
寫規則:172.16.100.7爲外網地址,182.168.10.6爲內網地址
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7 # 可訪問互聯網
iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto qq -j REJECT # 拒絕內網訪問qq
QQ:基於UDP協議,所以此規則執行後,已鏈接QQ的不會受影響,只針對新鏈接拒絕
時間過濾控制:
-m time:
--datestart --datestop
--timestart --timestop
--monthdays day
--weekdays day
--utc
例:拒絕上午8點10分到中午12點10分拒絕上互聯網
iptables -A FORWARD -s 192.168.10.0/24 -m time --timestart 08:10:00 --timestop 12:10:00 -j DROP
# 下午14點半到18點20分禁止互聯網
iptables -A FORWARD -s 192.168.10.0/24 -m time --timestart 14:30:00 --timestop 18:20:00 -j DROP
保存規則:
service iptables save
iptables-save > /etc/sysconfig/iptables.tus
iptables-restore < /etc/sysconfig/iptables.tus
iptables腳本:生效一套iptables的規則
#!/bin/bash
#
ipt=/usr/sbin/iptables
einterface=eth1
iinterface=eth0
eip=172.16.100.7
iip=192.168.10.6
$ipt -t nat -F
$ipt -t filter -F
$ipt -t mangle -F
$ipt -N clean_up
$ipt -A clean_up -d 255.255.255.255 -p icmp -j DROP
$ipt -A clean_up -j RETURN
# rules
$ipt -A
寫好規則保存退出便可
POST-->MBR(bootloader)-->Kernel(initrd)-->init(/etc/inittab)
一、設定默認級別
二、系統初始化腳本
三、運行指定級別的服務
/etc/rc.d/rcN.d
S*
K*
S99local此文件連接到了/etc/rc.d/rc.local文件,也就意味着每次開機都會運行此腳本下的內容
vim /etc/rc.local # 也連接到/etc/rc.d/rc.local是同一個文件
/usr/local/sbin/ipt.sh # 若是這是iptabels生效規則的腳本,放在此處保存退出便可
IDS:入侵檢測系統
nids:網絡入侵檢測系統
snort+iptables:入侵防護系統,發現供給後報警,關聯iptables便可完成入侵防護
hids:主機入侵檢測系統
xen,kvm:虛擬機也會自動建立iptables,以完成虛擬機之間網絡規則防護
samba之一
Linux:
NFS(RPC:遠程過程調用)
Windows:
CIFS:Common Internet File System,通用互聯網文件系統
SMB:Service Message Block 服務信息塊
NetBIOS(WINNS):網絡輸入輸出系統
UNC:\\IP\Share_path\
映射網絡驅動器
Linux/Uinx:
模擬一個NetBIOS和CIFS/SMB環境,來實現和windows之間的文件共享,實現工具就是Samba
還能夠提供Winbind服務,讓linux主機能夠加入至windows的AD域的進程,須要結合LDAP(Openldap)
使用Samba必須開放端口:
NetBIOS:137/udp,138/udp
共享文件:139/tcp,445/tcp
掛載時使用本地服務器系統用戶或其餘服務器的用戶認證,但Samba密碼是單獨存放的。
SMB安全級別:
user:默認級別
share:容許匿名訪問
server:認證用戶在其餘服務器
domian:使用域帳戶的
安裝配置samba:
yum list all samba*
rpm -e samba-client samba-common # 卸載系統自帶版本
yum -y install samba3x samba3x-client samba3x-common
啓動進程:
nmbd:提供NetBIOS
smbd:提供文件共享
winbindd:提供域服務
啓動文件:/etc/rc.d/init.d/smb
配置文件:/etc/samba/smb.conf
主機解析:/etc/samba/lmhosts
存放smb用戶文件:/etc/samba/smbusers
vim /etc/samba/smb.conf
注:#號;號均爲註釋,# 表示能夠啓用的參數或指令參數,;號純註釋信息
smb配置文件分幾段:
Global Settings:全局配置
workgroup = MYGROUP
server string = Samba Server Version %v # 版本信息,%v爲宏:變量,引用
netbios name = MYSERVER # 默認當前主機主機名第一段
interface = lo eth0 192.168.12.2/24 192.168.13.2/24 # 容許訪問的網卡
hosts allow = 127. 192.168.12. 192.168.13. # 容許訪問的網絡
Logging Options:日誌定義
log file = /var/log/samba/log.%m # 日誌文件存放位置
max log size = 50 # 單位爲KB,超出會滾動
Share Definitions:共享定義,用戶家目錄設置
[homes]
comment = Home Directories
browseable = no # 用戶以外的沒法訪問
writable = yes # 用戶是否具備寫權限
; valid users = %S
; valid users = MYDOMAIN\%S
[printers]
comment = ALL Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
Domain Members Options:關於域成員用戶配置
Standalone Server Options:單獨服務器配置
security = user # 安全級別配置
passdb backend = tdbsam # 用戶帳戶密碼存放格式,tdb格式的sam
Browser Control Options:瀏覽控制選項,跟domain相關
Name Resolution:名稱解析相關信息
wins support = yes # 是否支持wins服務
wins proxy = yes # 是否支持代理
Printing Options:打印機共享選項
load printers = yes # 是否加載打印機
cups options = raw # 使用哪一種打印驅動程序共享,raw機制
主要參數:
[shared_name] # 共享名稱,自定義
comment = # 共享的標註
path = # 共享路徑
browseable = # 是否容許全部人瀏覽
public = # 是否容許全部人訪問
read only = # 是否只讀權限
writable = # 是否可寫權限
write_list = user1,user2,@group,+group # 定義可寫用戶列表
valid_users = # 用戶白名單,黑白名單同時存在時,白名單生效
invalid_users = # 用戶黑名單
保存退出
testparm命令,專門測試samba配置文件有誤錯誤內容
service smb start # 啓動服務
getenforce # 確保selinux未開啓
建立用戶帳號
useradd 2532:2532 eucalyptus # 先建立系統用戶
smbpasswd -a eucalyptus # 將系統用戶添加爲smb用戶,並設置密碼
New SMB password: # 提示輸入設置SMB密碼
setfacl -m u:eucalyptus:rwx /share/test # 給用戶更改權限
測試掛載:
\\172.16.100.1或者\\172.16.100.1\tools
提示輸入帳戶密碼,便可登陸linux共享目錄,建立一個文件,在linux的用戶目錄下查看是否寫入
Windows共享目錄給Linux
Windows上建立共享目錄並設置共享,勾選網絡共享選項
在Linux下使用smbclient:
-L NetBIOS_Name
-U username
-P password
smbclient -L 172.16.100.66 # 可直接查看對端共享列表
能夠再windows端建立一個系統用戶wuser建立密碼
smbclient -L 172.16.100.66 -U wuser
輸入密碼
訪問失敗,報錯(Called name not present)訪問名稱不存在
smbclient //172.16.100.66/test -U wuer
輸入密碼
smb:\>ls # 便可查看到掛載目錄內容
smbclient //172.16.100.1/tools -U eucalyptus
輸入密碼
登陸至linux的samba共享目錄
smb:\>help # 便可查看到能夠使用的命令
lcd:切換本地目錄
put:上傳單個文件
cd:切換對端目錄
pwd:查看當前登陸位置
!pwd:本地當前位置
!cd /home:本地切換到home目錄,同lcd
使用mount也能夠掛載smb共享目錄:
mount -t cifs //172.16.100.1/tools /mnt -o username=eucalyptus
輸入密碼便可完成掛載
自動掛載,在fstab文件中
//172.16.100.1/tools /mnt cifs credentials=/etc/samba/cred.passwd 0 0
保存退出便可
credentials=/etc/samba/cred.passwd 須要建立此文件存放登陸的用戶密碼信息
vim /etc/samba/cred.passwd
內容:
username=eucalyptus
password=redhat
保存退出
chmod og=--- /etc/samba/cred.passwd
umount /mnt
mount -a
查看是否掛載mnt目錄
新建一個共享,共享名爲tools,開放給mygrp中的全部用戶具備讀寫權限,其餘用戶只有讀權限;
[tools]
comment =
path =
guest ok = yes
write list = @mygrp
samba:基於IP的訪問控制
iptabels:
TCP:139,445
UDP:137,138
samba:
hosts allow = 172.16. 127. # IP白名單
samba-swat
web GUI:基於web的圖形配置界面
安裝samba-swat:
yum -y install samba3x-swat
守護進程:
standalone
transient,瞬時守護進程,平時不啓動,利用xinetd超級守護進程,來監聽這些瞬時守護進程,有人訪問瞬時進程時,先訪問xinetd進程,而後啓動瞬時進程,並轉交給此進程,結束後關閉瞬時進程
chkconfig --list 查看進程列表時
xinetd base services: # 此項列表中的進程均爲xinetd進程監聽的全部瞬時進程
安裝samba3x-swat以後
service xinetd start
在執行:
chkconfig swat on
service xinetd restart # 啓動了swat服務,監聽爲tcp的901端口
另外一種啓動方法:
cd /etc/xinetd.d/
此目錄下存放着全部xinetd相關進程
找到swat文件查看
將disable = no 並重啓xinetd端口便可
文件中還定義了port端口號和協議類型等信息,wait選項表示否是接受多個用戶同時訪問,only_from是白名單,後面輸入IP地址便可接受訪問,user是容許的訪問用戶
使用瀏覽器訪問172.16.100.1:901
用戶名密碼登陸
status選項是服務狀態,能夠啓動和中止Samba服務
tcp_wraper&xinetd
tcp_wraper:tcp層的訪問控制工具
只對TCP的應用進行控制,依賴libwrap.so庫文件
/etc/hosts.allow # 容許訪問列表,tcp_wraper先檢查allow文件,容許訪問的直接放行
/etc/hosts.deny # 拒絕訪問列表,allow匹配完檢查deny,並拒絕
默認 # 以上均未匹配到則被容許
編寫規則:
daemon_list: # daemon_list寫的是進程可執行的二進制文件名稱
如:sshd:192.168.0. # 容許或拒絕192.168.0段的地址sshd服務
vsftpd,sshd,in.telnetd: # 多個服務
ALL # 全部接受tcp_wraper的服務
daemon@host
如:vsftpd@192.168.0.186:1.0.0.0/255.0.0.0 # 容許或拒絕192.168.0.186的vsftpd訪問1.0.0.0/255.0.0.0段
client_list[:Options]
如:IP # 使用單IP
network address # 使用單個IP地址
network/mask # 使用網絡地址,只能使用長度格式,不能寫爲:1.0.0.0/8
172.16. # 使用IP段
HOSTNAME
fqdn # 域名解析
.a.org # 域名
MACRO # 宏
ALL # 全部來賓
LOCAL,KNOWN,UNKNOWN,PARANOID # 本地、能夠正常解析的、沒法解析的、正反向解析不匹配的
EXCEPT # 排除,不包含
ldd:顯示共享庫依賴關係。例如:ldd
ldd `which sshd` # 查看與sshd相關的庫文件,其中就有libwrap.so.0文件
ldd `which httpd` # 查看沒有與libwrap.so.0文件相關文件,所以httpd是不接受libwrap控制的
以上查找出的均爲動態連接庫
靜態編譯:也能夠將庫編譯進某個程序
RPC服務依靠portmap
ldd `which portmap` # 查看雖然沒有libwrap.so庫,但不表明不支持
strings `which portmap` |grep hosts # 查看是否有靜態編譯的支持
/etc/hosts.allow # 容許訪問列表
/etc/hosts.deny # 拒絕訪問列表
xinetd:超級守護進程,須要關聯運行級別,負責對瞬時守護進程的管理,是瞬時守護進程的代理人
ldd `which xinetd` # 也能夠查到libwrap.so文件
服務分兩類:進程能夠在兩類進程之間切換
standalone:獨立守護進程
進程本身管理,響應速度快,但一直佔用資源。
transient:瞬時守護進程,非獨立守護進程
依賴於超級守護進程來代爲管理,響應慢,但合理利用資源,偶爾鏈接的進程能夠使用非獨立的
sshd僅容許172.16.0.0/16網段訪問;
方法:
一、/etc/hosts.allow # 先檢查allow文件匹配到直接容許
sshd:172.16.
二、/etc/hosts.deny # 再檢查拒絕爲ALL,其餘的網段均被拒絕
sshd:ALL
telnet僅不容許172.16.0.0/16網段訪問,但容許172.16.100.200訪問,其餘客戶端不作控制;
方法1:
一、/etc/hosts.allow
in.telnetd:172.16.100.200
二、/etc/hosts.deny
in.telnetd:172.16.
方法2:
一、/etc/hosts.deny
in.telnetd:172.16. EXCEPT 172.16.100.200
方法3:
一、/etc/hosts.allow
in.telnetd:ALL EXCEPT 172.16. EXCEPT 172.16.100.200
二、/etc/hosts.deny
in.telnetd:ALL
client_list[:Options]
/etc/hosts.allow
in.telnetd:172.16. :DENY # Options的用法,在最後能夠定義決絕仍是容許
/etc/hosts.deny
in.telnetd:ALL :ALLOW
spawn:表示啓動
/etc/hosts.allow
in.telnetd:172.16. :spawn echo " somebody entered,`date` " >> /var/log/tcpwraper.log # 觸發日誌記錄
tcp wrapper macro:tcp wrapper使用的宏
%c:client infomation (user@host)
%s:service info(server@host)
%h:client hostname
%p:server PID
# man 5 hosts_access # 能夠經過此命令查詢tcp_wraper宏的使用方式
/etc/hosts.allow
in.telnetd:172.16. :spawn echo " `date`, Login attempt from %c to %s " >> /var/log/tcpwraper.log # 附加的內容中不能使用冒號:
xinetd:超級守護進程,須要關聯運行級別,負責對瞬時守護進程的管理,是瞬時守護進程的代理人
/etc/xinetd.conf # 配置文件,可管理N個非獨立進程
/etc/xinetd.d/* # 被拆分後的非獨立進程的配置文件存放位置
/etc/xinetd.conf配置文件主要有兩部分:
一、全局配置(服務的默認配置)
二、服務配置
service <serivce name>
{
<attribute(屬性)> <assign_op(賦值操做符)> <value(值)> <value> ...
...
}
註解:
service telnet
{
disable = no # 服務啓動仍是關閉
flags = REUSE # 默認爲REUSE,表示重用,重複啓用
socket_type = stream # 表示TCP協議,dgram表示udp
wait = no # 一個用戶在訪問時另外一個用戶是否等待,此處表示不用等待
user = root # 運行此服務的用戶
only_from = 172.16.0.0/16 # 僅容許此網段的IP訪問
bind = 172.16.100.1 # telnet監聽僅經過某個IP地址訪問23端口
access_times = 10:00-14:00 # 僅容許10點到14點之間訪問
cps = 2 10 # 最大鏈接數1個,高於2個的請求禁止10秒鐘
per_source = 1 # 每個IP容許最大併發鏈接數
instances = 50 # 本服務的最大鏈接數
server = /usr/sbin/in.telnetd # 定義應用程序是哪一個文件啓動
log_type = FILE /var/log/telnet.log # 自定義日誌格式和位置
log_on_failure += USERID # 失敗時記錄日誌格式,+=表示默認值基礎上增長的項,還能夠-=表示在默認項中移除哪項
}
日誌一般會記錄在/var/log/messages中,也能夠自定義位置和格式
xinetd訪問控制:
only_from = :是白名單
IP:172.16.100.200
NETWORK:172.16.0.0/16 172.16.0.0/255.255.0.0
HOSTNAME:FQDN
DOAMIN:.magedu.com
no_access = :僅拒絕訪問,最好不要與only_from同時使用,如一塊兒使用匹配最小範圍生效。
時間控制:
access_times = hh:mm-hh:mm : 使用時間控制訪問
hh:0-23
mm:0-59
監聽的地址(提供服務的地址):
bind = :綁定在哪一個地址
interface = :綁定在哪一個網卡
資源訪問控制:
cps = :限制每秒鐘訪問的個數。第一個表示每秒鐘入站最大鏈接數,第二個若是高出第一個值,須要禁用的時間,以秒爲單位。默認第一個50,第二個爲10.
per_source = :同一個IP地址容許訪問的最大併發鏈接數
instances = :定義本服務的最大鏈接數
默認訪問控制參數:
server = :指定啓用此服務的二進制進程文件
server_args = :向啓動的server傳遞參數
banner = :歡迎標語,指定某個文件的內容爲登陸後顯示的標語
port = :自定義端口號
SYSLOG:專門用於記錄日誌的服務(syslogd,klogd)
nss&pam:用戶認證
Authentication:認證,驗證一個用戶身份的手段
md5:/etc/shadow
mysql
ldap
nis
kerberos
Authorization:受權,一個用戶是否被容許訪問一個服務或資源的過程
名稱解析:用戶熟悉的字符串轉換爲系統識別的標識
username-->UID
groupname-->GID
FQDN-->IP
http-->80
FQDN-->IP
dns
/etc/hosts
mysql
nis
ldap:輕量級目錄訪問協議,比mysql查詢速率高不少
系統登陸程序login:
內置/etc/passwd進行用戶帳戶ID號對應,可是過於龐大的系統用戶羣此方式效率會慢不少
APP-->nsswitch-->resolve_lib
nsswitch
/etc/nsswitch.conf # 配置文件
寫法:passwd:file # 後面指定的file就是對應要去哪裏查找的對應文件或方法
group:file
hostname:file dns # 也能夠寫多種
service nisplus [NOTFOUND=return] files # 另外一種寫法,表示查找後的返回機制。此句表示,若是nisplus查找service服務服務正常單無對應名稱,則返回信息,其餘的狀況,則到files中查找
SUCCESS:服務正常,找到名稱,正常轉換
NOTFOUND:服務正常,無對應名稱
UNAVAIL:服務不可用
TRYAGAIN:服務出現臨時性故障
return:是一種執行機制和動做,不然就繼續。
/etc/protocols # 存放經常使用協議以及端口號對應關係的存儲文件
/etc/services # 也存放着各服務對應的協議端口
getent命令:從管理庫得到條目內容
getent passwd # 直接獲取/etc/passwd文件中內容。與cat相似
名稱解析完成後須要驗證用戶機制:
認證過程:
APP--> username:password
root-->nsswitch.conf-->passwd:files
'123456'-->nsswitch.conf-->shadow:files
auth:123456-->md5(salt)-->compare(比對) 經過比對覈實以後認證經過,完成認證過程
認證自己也能夠不用藉助名稱解析服務去查找用戶原來存放的密碼
PAM:Pluggable Authentication Modules:可插入式認證模塊,是一個框架,不作任何認證工做,須要依靠lib庫文件完成認證
64位系統庫文件在:/lib/security,/lib64/security兩個目錄中
pam_unix.so文件實現用戶密碼比對
/etc/pam.d/login # 完成login系統用戶認證過程的配置文件
首先是pam認證中的四種認證站stack:
auth類型:用戶輸入的用戶密碼是否匹配
account類型:審覈用戶帳號是否依然有效,與auth結合使用
password類型:用戶修改密碼時,審覈用戶密碼的合規性等信息
session類型:定義用戶登陸後的會話屬性內容,如可登陸多長時間等
/etc/pam.d/service:service表示服務名
格式:
type:類型
auth類型:用戶輸入的用戶密碼是否匹配
account類型:審覈用戶帳號是否依然有效,與auth結合使用
password類型:用戶修改密碼時,審覈用戶密碼的合規性等信息
session類型:定義用戶登陸後的會話屬性內容,如可登陸多長時間等
control:控制,某類型出現屢次如何相互做用
required:必須符合的條件,一票否決權,若是不過繼續後面的條件匹配
requisite:必須符合條件,絕對意義上的一票否決,若是不過,無需匹配後面的條件
sufficient:充分條件,此條經過完成認證過程,無需後面的檢查。一票經過權
optional:補充可選條件
include:映射到其餘文件,由另外的文件進行條件匹配
審覈回值:
ok:此模塊經過,繼續下一條檢查
done:一票經過,最終結果經過
bad:審覈失敗,繼續下一條檢查
die:結果失敗,無需下面的檢查,直接拒絕,一票否決權
ignore:忽略,無決定結果
reset:忽略此前的審覈結果,從這裏從新開始
格式:
required [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
requisite [success=ok new_authtok_reqd=ok ignore=ignore default=die]
sufficient [success=done new_authtok_reqd=done default=ignore]
optional [success=ok new_authtok_reqd=ok default=ignore]
module-path [module-arguments]:模塊路徑及模塊參數,後面的模塊參數並不是必須
pam_unix:使用md5的方式校對認證,相同經過不一樣拒絕
options:
nullok:容許密碼爲空,空也ok
shadow:用戶密碼認證在shadow中校對
md5:使用md5方式的加密方式
try_first_pass:輸入此前輸入過的密碼,可以經過便可
use_authtok:當密碼修改時要求密碼設置爲此項可經過的密碼
pam_permit:容許訪問
pam_deny:拒絕訪問,一般用在other中
pam_cracklib.so:檢測是否在密碼字典中存在,密碼安全性檢測模塊
minlen:最短長度
difok:密碼是否與以前相同
dcredit=N:包含至少幾位數字
ucredit=N:包含至少幾位大寫字母
lcredit=N:包含至少幾位小寫字母
ocredit=N:包含至少幾位特殊字符
retry=N:最多嘗試多少次
pam_shells:用戶登陸時必須使用/etc/shells存在的shell
pam_securetty:限定管理員只能在限定設備登陸,必須使用/etc/securetty內容許的tty類型
pam_listfile:到某個文件中驗證用戶登陸是否合法
item=[tty|user|rhost|ruser|group|shell] # 定義文件以哪一種類型取值
sense=[allow|deny] # 在這個文件中的類型拒絕或容許
file=/path/filename # 指定文件
onerr=[succeed|fail] # 一旦發生錯誤,指定success仍是fail
[apply=[user|@group]] # 屬於文件中的用戶和組能夠容許登陸
[quiet]
pam_rootok:root用戶直接經過
pam_limits:資源限定控制
/etc/security/limits.conf
格式:
<domain> <type> <item> <value>
<domain>:指定範圍
username
group
通配符*或%
<type>:類型
soft:軟限制
hard:硬限制,只有管理員可調整硬限制
<item>:限制規則
core:所可以打開核心文件的size KB單位
nofile:所能打開的最大文件個數
rss:所能使用的最大內存集KB單位
as:地址空間限制
cpu:所能使用的最大cpu時間,單位分鐘
nproc:用戶能運行的進程最大個數
<value>:限制值
如:
* soft core 0 # 全部對象軟限制core打開限制爲0KB
@student - maxlogins 4 # student組軟硬類型最大登陸次數爲4
/etc/security/limits.d/* # 這些文件均可以完成限定
pam_env:設置或撤銷環境變量
/etc/security/pam_env.conf配置文件中設定
pam_wheel:設置限定哪些用戶能夠su到root用戶,啓用功能後只有wheel組纔可su
pam_time:根據時間限定登陸
login;tty*&!ttyp*;!root;!AL0000-2400 # servicename 指定終端 指定用戶 指定時間段
時間表示WD表示工做日,WK表示週末,時間之間能夠用|隔開,表示多個時間段
/etc/pam.d/other文件:定義默認規則的文件,無對應服務配置文件時以此文件定義爲準
cat /etc/pam.d/system-auth-ac :認證機制type和control配置文件
bash編程系列之數組
變量:內存空間,字符
array:數組,既變量的集合
element:數組元素,沒個數組中去某個變量
tndex:索引,每一個元素的數字編號,從0開始編號
例如:${AA[0]} 表示一個屬組中第一個元素
使用生命一個數組:
賦值方法1:
declare -a AA
AA[0]=jerry
AA[1]=tom
AA[2]=wendy
AA[6]=natasha # 表示有7個元素,其中3-5位空
賦值方法2:
AA=(jerry tom wendy)
AA=([0]=jerry [1]=tom [2]=wendy [6]=natasha)
AA[3]=selina # 想補全3-5的空缺能夠直接添加引用便可
AA[4]=nikita
腳本示例:
vim testarray.sh
#!/bin/bash
#
AA=([0]="jerry" [1]="tom" [6]="nikita") # 預防數組元素中出現空格等特殊字符最好用""號括起來
echo ${#AA[0]} # 表示AA數組中的第0個元素的字符個數,也就是jerry字符數5,若是不輸入[0],默認顯示的也是第一個元素的字符數
echo ${#AA[*]} # 引用整個數組當中值不爲空的元素的個數
echo ${#AA[@]} # 引用整個數組當中值不爲空的元素的個數
for I in {1..20}; do # 連續取值20次
INDEX=$[$RANDOM%7] # 數組中的6個賦值中隨機選一個0-6之間的值,此句爲對7其他
echo ${AA[$INDEX]} # 輸出隨機取值,輸出大部分爲空,偶爾會出現tom或jerry和nikita
done
echo ${AA[0]}
echo ${AA[6]}
echo ${AA[2]} # 輸出結果爲空,由於未給2賦值
寫一個腳本:隨機從人員中選擇5位回答問題。
vim
#!/bin/bash
#
寫一個腳本:找出一組數據中的最大數,這組數據用數組保存
vim findmax.sh
#!/bin/bash
#
for I in {1..10}; do
ARRAY[$I]=$RANDOM # 隨機生成10個隨機數
sleep 1 # 間隔1秒,生成一個數
echo -n "${$ARRAY[$I]}" # 輸出隨機生成的數值,-n爲不換行輸出
done
echo # 此處的echo是讓腳本換行顯示,不然會將最大的放在上一行鏈接在一塊兒
ARRAY=(34 73 25 91 49 25 75 133 92 951) # 也能夠正常輸入,生成一組數組
declare -i MAX=${ARRAY[0]} # 生命變量爲第一個元素
INDEX=$[${#ARRAY[*]}-1] # 將數組中元素個數引用到INDEX變量
for I in `seq 1 $INDEX`; do # 循環執行從1到數組個數的次數
if [ $MAX -lt ${ARRAY[$I]} ]: then # 依次對比第一個元素到最後一個元素的數值
MAX=${ARRAY[$I]} # 取出最大的賦值到MAX變量
fi
done
echo $MAX # 輸出MAX變量查看是否爲最大值951
保存退出
寫一個腳本:生成一個數組
一、數組的元素個數爲1-39
read
二、數組元素值不能相同
三、顯示此數組各元素的值
vim creatarray.sh
#!/bin/bash
#
read -p "The element numbers[1-39]:" ELENUM
declare -a ARRAY
function COMELE {
for J in `seq 0 $[${#ARRAY[@]}-1]`; do
if [ $1 -eq ${ARRAY[$I]} ]; then
return 1
fi
done
return 0
}
for I in `seq 0 $[$ELENUM-1]; do
while true; do
ELEMENT=$[$RANDOM%40]
COMELE $ELEMENT
if [ $? -eq 0 ]; then
break
fi
done
ARRAY[$i]=$ELEMENT
echo "${ARRAY[$I]}"
done
保存退出
trap:在腳本中捕捉信號,而且能夠待定處理
信號:
1:SIGHUP
2:SIGINT
9:SIGKILL # 不容許捕捉
15:SIGTERM # 不容許捕捉
18:SIGCONT
19:SIGSTOP
捕捉信號方法:
trap命令
樣例:trap '處理操做' SIGINT
如:trap 'echo "No quit..."' INT # 拒絕ctrl+c終端信號操做並提示No quit...
vim traptest.sh
#!/bin/bash
#
trap 'rm -rf /var/tmp/test;echo "clean...";exit 5' INT
mkdir -p /var/tmp/test
while true; do
touch /var/tmp/test/file-`date +%F-%H-%M-%S`
sleep 2
done
保存退出
一旦未寫exit 5 之類的退出命令,則會循環執行沒法退出,此時須要執行kill %1來終止腳本
bash腳本編程之在bash腳本中使用選項
爲腳本寫好標頭,並在寫每一個新腳本中套用
vim mkscript
內容以下:
#!/bin/bash
# Name:mkscript
# Descriprion:Create script
# Version:0.0.1
# Author:magedu
# Datetime:
# Usage:mkscript FILENAME
while getopts ":d:" SWITCH; do # 將mkscript腳本加一個-d選項,後跟參數,參數內容能夠寫腳本簡介
case $SWITCH in
d)
DESC=$OPTARG ;;
\?)
echo "Usage:mkscript [-d DESCRIPRION] FILENAME"
esac
done
shift $[OPTIND-1] # OPTIND選項索引,依次指向第一個參數,減1就將選項去掉一個
if ! grep "[^[:space:]]" $1 &> /dev/null; then
cat > $1 << EOF
#!/bin/bash
# Name:`basename $1`
# Descriprion:$DESC
# Version:0.0.1
# Author:magedu
# Datetime:`date '+%F %T'`
# Usage:`basename $1`
EOF
fi
vim + $1
until bash -n $1 &> /dev/null; do
read -p "Syntax error, q|Q for quiting, others for editing:" OPT
case $OPT in
q|Q)
echo "Quit."
exit 8 ;;
*)
vim + $1
;;
esac
done
if ! bash -n $1 &> /dev/null; then
vim + $1
fi
chmod +x $1
保存退出
chmod +x mkscript
每次新建腳本時使用
./mkscript test.sh
便可直接進入編輯模式,而且寫好標頭內容
cp mkscript /bin 拷貝到bin目錄下便可看成命令使用建立腳本
getopts命令使用:
mkscript opttest.sh
除了標頭內容添加:
getopts ":b:d:" OPT # 定義了b和d爲選項,加冒號能夠對應$OPTARG參數的輸出,不加冒號只表明選項;在全部選項前面加:號是不輸出全部錯誤信息;
echo $OPT # 輸出選項
echo $OPTARG # 輸出選項後面的參數
兩個選項均可以使用的方式編寫:
USAGE() {
echo "Usage: optitest.sh [-d argu] [-b argu]"
}
while getopts ":b:d:" SWITCH; do
case $SWITCH in
b) echo "The option is b." ;;
echo $OPTARG ;;
d) echo "The option is d." ;;
echo $OPTARG ;;
\?) echo USAGE ;;
esac
done
寫一個腳本getinterface.sh,腳本能夠接受選項(-i -I -a),完成如下任務
使用如下形式,getinterface.sh [-i interface|-I IP|-a]
用戶使用-i時,顯示其指定的網卡的IP地址,-I時,顯示其後面的IP地址所屬的網絡接口卡,-a時所有顯示
mkscript -d "Get ethernet information" getinterface.sh
#!/bin/bash
# Name:getinterface.sh
# Descriprion:Get ethernet information
# Version:0.0.1
# Author:magedu
# Datetime:
# Usage:getinterface.sh
SHOWIP() {
if ! ifconfig | grep -o "[^[:space:]]\{1,\}" | grep $1 &> /dev/null; then
return 13
fi
echo -n "${1}:"
if ! ifconfig $1 |grep "inet addr:[0-9\.{1,\}]" |cut -d: -f2
}
SHOWETHER() {
if ! ifconfig|grep -o "inet addr:[0-98\.]\[1,\]"|cut -d: -f2 | grep $1 &> /dev/null; then
return 14
fi
echo -n "${1}:"
ifconfig |grep -B 1 "$1" | grep -o "^[^[:space:]]\{1,\}"
}
USAGE() {
echo "getinterface.sh <-i interface|-I IP>"
while getopts ":i:I:" SWITCH; do
case $SWITCH in
i)
SHOWIP $OPTARG
[ $? -eq 13 ] && echo "Wrong ehtercard."
;;
I)
SHOWETHER $OPTARG
[ $? -eq 13 ] && echo "Wrong IP."
;;
\?)
USAGE ;;
esac
done
保存退出
當前主機全部IP地址取出:
ifconfig|grep -o "inet addr:[0-98\.]\[1,\]"|cut -d: -f2
配置使用vnc服務
明文傳輸,互聯網慎用
rpm -qa vnc* # 檢查vnc安裝狀況,有vnc-server包便可
vnc的密碼非shadow文件中,所以設定vnc密碼須要使用vncpasswd設定
vncpasswd
Password:輸入新密碼
Verify:再次輸入
service vncserver start # 啓動vnc服務,第一次啓動時不建議使用此命令
第一次啓用vncserver建議使用如下命令
vncserver &
稍等片刻會有反饋信息,提示使用:#數字來鏈接,啓動第一次就生成:1,表示生成第一個桌面,再次執行返回:2,客戶端鏈接哪一個桌面就寫入:#便可
客戶端:
VNC viewer程序安裝以後啓動
在打開界面中服務器輸入 172.16.100.1:1 輸入密碼便可登陸
twm:窗口管理器
配置使用gnome桌面
vncserver啓動以後會在當前目錄下生成一個.vnc的目錄
cd .vnd
vim xstartup # 編輯xstartup文件
在最後一行
twm & 替換成 gnome-session &
並將一下兩行取消註釋
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc
保存退出
重啓vncserver
service vncserver restart # 此命令不建議,可能不會生效
使用如下命令先殺掉當前鏈接:
vncserver -kill :2
vncserver -kill :1
而後再啓動
vncserver &
此時打開的界面就是REDHAT徹底的圖形化界面了
mysql系列之一關係型數據庫基礎理論
MySQL
SQL\MySQL
事務,隔離,併發控制,鎖
用戶和權限
監控
STATUS
索引類型:查詢
VARIABLES
備份和恢復
複製功能
集羣
文件數據弊端:
數據冗餘和不一致性
數據訪問困難
數據孤立
完整性問題
原子性問題
併發訪問異常
安全性問題
DBMS
層次模型
網狀模型
關係模型
RDBMS
文件數據層次:
表示層
文件
邏輯層
文件系統:存儲引擎
物理層
元數據
數據:數據塊
關係模型(結構化數據模型):
關係模型
實體-關係模型
對象關係模型:基於對象的數據模型
半結構化數據模型:XML(擴展標記語言)
將每一個屬性標記出來,避免一張表內出現不一樣標記的內容
<name>Jerry</name>
<age>50</age>
關係:代數運算
交集;一組實體的組合
並集:屬於A或者屬於B
差集:屬於A但不屬於B
全集:全部實體的組合
補集:全集減去集合剩餘內容
SQL:Structure Query Language結構化查詢語言
70年代IBM公司開發出System R:SQL第一款關係型數據庫
Ingres,伯克利分校開發的關係型數據庫
Oracle,Sybase等相繼面世
ANSI:SQL標準,美國國家標準委員會制定,ansi-sql
sql86,sql89,sql92,sql99均爲標準,以年份命名
DML:數據操做語言
增刪查改
INSERT
DELETE
SELECT
UPDATE
DDL:數據定義語言
RDB對象:
庫、表、索引、視圖、用戶、存儲過程、存儲函數、觸發器、事件調度器
CREATE
DROP
ALTER
約束:保障數據完整性,定義有效數據範圍
域約束:數據類型約束,必須符合數據類型
外鍵約束:引用完整性約束,須要另一張表約束主表數據插入是不是合規數據的
主鍵約束:某字段能惟一標識此字段所屬的實體,而且不容許爲空
一張表只能有一個主鍵
惟一性約束:每一行的某字段都不容許出現相同值,能夠爲空
一張表中能夠有多個惟一鍵
檢查性約束:自定義某鍵的取值範圍,保障不出現違反常理的數據
mysql對檢查性約束能力有限,Oracle與SQL Server功能較全
constraint
DCL:數據控制語言
定義數據的訪問權限
GRANT
REVOKE
關係型數據層次:
表示層:表
邏輯層:存儲引擎,解構
物理層:數據文件
數據存儲和查詢
存儲管理器
權限及完整性管理:違反約束的不能操做數據
事務管理器:處理數據存儲讀取一致性等操做,保障原子性
文件管理器:將表數據保存在磁盤分區上,並維護管理這些對應關係
緩衝區管理器:負責將表的熱數據從硬盤讀取到內存中
查詢管理器
DML解釋器:理解DML表示意思
DDL解釋器:
查詢執行引擎
mysql:單進程
多線程
守護線程
應用線程
線程重用,thread reuse
緩存數據優化
32bit操做系統:
最大4G空間
內核佔用1G
有效使用只有2.7G,mysql一個表可能就會佔滿
所以mysql服務器必須使用64位系統
SMP:對稱多處理器,mysql對此功能支持不好,一個查詢只能在一個CPU執行
但能夠用多個服務器進行集羣式的解決方案,所以SMP也不是mysql發展的瓶頸
鏈接mysql的方式和處理過程:
應用程序,DBA,API,查詢工具
以上接口接入查詢管理器
查詢管理器轉存到存儲管理器
關係運算:
投影:只輸出指定屬性
選擇:只輸出符合條件的行,WHERE
天然鏈接:具備相同名字的屬性上全部取值相同的行
笛卡爾積:(a+b)*(c+d)=ac+ad+bc+bd,將表的每一個值與另外一表的值相關聯結果
並:集合運算
SQL查詢語句:
sequel,早期叫法,後期更名爲SQL
SQL語言的組成部分:
DDL
DML
完整性定義語言:DDL的一部分功能
視圖定義語言:
事務控制語句
嵌入式SQL和動態SQL:須要其餘語言配合完成
受權:DCL
使用程序設計語言如何跟RDBMS交互:
嵌入式SQL:與動態SQL相似,但其語句必須在程序編譯時徹底你肯定下來;並由預處理器完成處理;
ODBC:比JDBC底層的多,嵌入的是ODBC內置查詢邏輯
動態SQL:程序設計語言使用函數(mysql_connect())或者方法與RDBMS服務器創建鏈接,並進行交互;經過創建的連接向SQL服務器發送查詢語句,並將結果保存至變量中,然後進行處理;
JDBC:Java服務器與SQL服務器的接口
MySQL處理過程:
鏈接管理器:用於接受用戶請求並轉交解析器
一、鏈接管理器:監聽端口套接字
二、線程管理器:爲用戶分配響應線程
三、用戶模塊:管理用戶是否可以鏈接請求,驗證用戶身份
四、命令分發模塊:將不一樣的命令分發不一樣的解析器中去
與緩存器交互
完成日誌記錄
解析器:詞法分析,語法分析處理,生成解析樹,轉交熱數據給緩存器,非熱數據轉交給優化器
一、select語句交給優化器
二、update、insert、delete語句交給表定義模塊
三、修復模塊:repair命令修復表中某些邏輯錯誤
四、狀態報告模塊:執行反饋表中某些狀態反饋
五、複製模塊:完成數據主從複製過程
六、訪問控制模塊:檢查用戶特定操做是否有相應操做權限
七、表管理器:負責建立讀取或修改表定義文件;完成最終操做,交給存儲引擎,也是存儲引擎的接口
表結構定義:專門有表結構定義文件來保存表結構
維護表描述符高速緩存
管理表鎖
表修改模塊:表刪除,重命名,移除,更新,插入等操做
表維護模塊:檢查,修改,備份,恢復,優化(碎片整理)及解析;
緩存器:緩存熱數據,有結果直接返回結果
優化器:優化MySQL語句,優化解析器提供的語言路徑
存儲引擎:將物理邏輯轉換爲表示邏輯
插件式存儲引擎:能夠根據不一樣數據類型選擇不一樣的存儲引擎
5.5.8以前:默認MyISAM,不支持事務,性能較好,用於查詢多修改少的場景,例如數據倉庫
5.5.8以後:默認InnoDB,支持事務,極其接近Oracle機制,適用於在線事務處理系統
行:定長,變長
文件中記錄組織:
堆文件組織:一條記錄能夠放在文件中的任何地方;
順序文件組織:根據「搜索碼」索引字段值爲序進行存放;
散列文件組織:
表結構定義文件,表數據文件
表空間:table space,多個表的數據存儲在一個數據文件
數據字典:Data Dictionary,默認在mysql初始化完成後,有個mysql庫就是mysql的數據字典
關係的元數據
關係名
字段名
字段的類型和長度
視圖
約束
用戶名,權限,密碼
緩衝區管理器:
緩存置換策略
被釘住的塊:不容許被置換的塊
mysql系列之三MySQL數據庫基礎及編譯安裝
Alpha:內測版
Beta:公測版
RC(Release Candidate):發行候選版
GA(General Availablility):正式版
MySQL產品組成
MySQL Server(mysqld服務端,mysql客戶端)
MySQL Cluster:mysql集羣性能很是好,至少須要4個節點組成,數據在內存中處理不丟失,5個9的標準;可是不多商業使用,均使用第三方插件進行集羣配置。
MySQL Proxy:代理,前段不處理按需轉發至後端處理,讀寫分離場景使用,能夠重寫sql語句
MySQL Adminitrator:可視化管理工具
MySQL Query Browser:查詢瀏覽器
MySQL Workberch:數據庫設計工具,已和以上兩個工具整合在一塊兒
MySQL Migration Toolkit:移至工具箱,實現不一樣平臺和版本的sql數據導入導出的工具
MySQL Embedded Server:嵌入式環境專用工具
MySQL Drivers and Connectors:驅動和鏈接器工具
MySQL:商業版和社區版
MySQL
MariaDB:MySQL被收購後,做者又開發的新的開源的MySQL數據庫
Percona:MySQL性能優化站點,發佈大量MySQL優化文章
安裝MySQL介紹:
專用軟件包管理器包
deb,rpm:RHEL(Oracle Linux),CentOS,SUSE
通用二進制格式包
gcc編譯,GUN編譯,x86,x64
icc編譯,Intel編譯
源代碼包:
5.5以前版本用make編譯
5.5版本開始使用cmake編譯,可是再RHEL5以前的版本沒有cmake工具須要安裝,6之後版本所有支持
MySQL安裝後的目錄結構:
bin:二進制執行程序,服務端以及客戶端
data:數據目錄
include:頭文件
lib:庫文件
man:幫助文檔
mysql-test:測試組件
scripts:初始化腳本目錄
share:錯誤信息的不一樣語言版本支持
sql-bench:基準性能測試工具包
support-files:腳本,啓動服務腳本等等
MySQL讀取配置文件在UNIX系統中啓動過程:
啓動時:/etc/my.cnf
而後:/etc/mysql/my.cnf
而後:$MYSQL_HOME/my.cnf
而後:/path/to/file when defaults-extra-file=/path/to/file is specified :即指定
最後:~/.my.cnf
以最後一次讀取的配置爲最終生效的結果。按次序第一次讀取的反而優先級低
MySQL在Windows中加載順序:
啓動時:%WINDIR%\my.ini,%WINDIR%\my.cnf
而後:C:\my.ini,C:\my.cnf
而後:%INSTALLDIR%\my.ini,%INSTALLDIR%\my.cnf
最後:/path/to/file when default-extra-file=/path/to/file is specified:即自定義
安裝完成後操做:
安裝完成以後會有5個用戶:
三個root用戶:root@127.0.0.1,root@localhost,root@hostname 默認沒密碼,爲用戶加密
一、# mysqladmin -u USERNAME -h HOSTNAME password 'NEW_PASS' -p
二、mysql>SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('new_pass');
三、mysql>UPDATE mysql.user SET PASSWORD=PASSWORD('new_pass') WHERE CONDITION;
mysql>privileges;
兩個匿名用戶:''@localhost,''@hostname 匿名用戶儘可能刪除
drop user ''@localhost; # 刪除匿名用戶
MySQL安裝:
源碼安裝MySQL
安裝cmake
tar xf cmake-2.8.8.tar.gz
./bootstrap
make
make install
安裝mysql-5.5.25a
使用cmake編譯mysql-5.5
cmake指定編譯選項的方式不一樣於make,其實現方式對好比下:
./configure cmake .
./configure --help cmake . -LH or ccmake .
指定安裝文件的安裝路徑時經常使用的選項:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DCMAKE_DATEDIR=/data/mysql
-DSYSCONFDIR=/etc
默認編譯的存儲引擎包括:csv、myisam、myisammrg和heap,若要安裝其餘存儲引擎,能夠使用相似以下的編譯選項:
-DWITH_INNOBASE_STORAGE_ENGINE=1 # 使用innoDB存儲引擎,必須加載
-DWITH_ARCHIVE_STORAGE_ENGINE=1 # ARCHIVE存儲引擎,推薦加載
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 # 黑洞存儲引擎,推薦加載
-DWITH_FEDERATED_STORAGE_ENGINE=1 # 聯合存儲引擎,5.5不支持
若要明確指定不編譯某存儲引擎,能夠使用相似以下的選項:
-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1
好比:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 # 不加載某個存儲引擎
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
如若要編譯進其餘功能,如SSL等,則可以使用相似以下選項來實現編譯時使用某庫或不適用某庫:
-DWITH_READLINE=1 # 支持批量導入mysql數據的功能
-DWITH_SSL=system # 支持SSL會話,複製功能使用
-DWITH_ZLIB=system # 壓縮庫
-DWITH_LIBWRAP=0 # TCP-wrap提供訪問控制
其餘經常使用的選項:
-DMYSQL_TCP_PORT=3306 # 默認端口
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock # 默認套接字文件路徑
-DENABLED_LOCAL_INFILE=1 # 是否啓用local_infile
-DEXTRA_CHARSETS=all # 是否支持其餘字符集
-DDEFAULT_CHARESET=utf8 # 默認啓用位長
-DDEFAULT_COLLATION=utf8_general_ci # 默認排序規則,與字符集相匹配
-DWITH_DEBUG=0 # 不啓用debug模式
-DENABLE_PROFILING=1 # MySQL性能分析
註解:字符集:定義01代碼與字符之間的對應關係,中文字符集:GBK,GB2312,GB10030,UTF8等
排序規則:不一樣字符集的排序方式不一樣,所以須要按照不一樣字符集定義不一樣的排序方式
若是詳情裏此前的編譯所生成的文件,則須要使用以下命令:
make clean
rm CMakeCache.txt
正式安裝mysql:
groupadd -r msyql
useradd -g mysql -r -d /data/mydata mysql
tar xf mysql-5.5.25a.tar.gz
cd mysql-5.5.25a
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYQL_DATADIR=/data/mydata \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARESET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make
make install
chown -R :mysql /usr/local/mysql # 改屬組爲mysql
cd /usr/local/msyql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
vim /etc/profile.d/mysql.sh
內容:
export PATH=$PATH=/usr/local/mysql/bin
保存退出
sh /etc/profile.d/mysql.sh
echo $PATH
mysql 直接登陸
msyql>show databases; # 查看庫
mysql>show engines; # 查看存儲引擎
mysql>DROP USER ''@localhost;
mysql>DROP USER ''@localhost.localdomain; # 刪除兩個匿名用戶
mysql>UPDATE user SET Password=PASSWORD('redhat') WHERE user='root'; #root用戶加密
vim /etc/my.cnf
datadir = /mydata/data
mysql客戶端與服務器通訊過程:
同一Unix主機:
經過mysql.sock完成進程間通訊
同一臺Windows主機:
經過memory(pipe)內存或管道方式通訊
不一樣主機:
TCP/IP協議通訊
mysql架構:
mysql服務端程序,對應配置文件中[server]內定義的內容
mysqld服務端程序
mysql客戶端程序,對應配置文件中[client]內定義的內容
-u USERNAME
-h HOST
-p 'PASSWORD'
--protocol
tcp
socket # 默認使用socket
pipe # win使用
memory # win使用
--host # 指定主機
--port # 指定端口
--shared-memory-base-name
--socket # 指定套接字
mysql:客戶端主進程
mysqlimport:
mysqldump:數據庫備份程序
mysqladmin:管理工具
mysqlcheck:檢查數據庫完整性工具
mysql非客戶端程序
myisamchk:檢查和修復myisam表
myisampack:壓縮myisam表
數據目錄下內容介紹:
cd /mydata/data/mysql
有不少數據庫文件
db.opt文件存放的是數據庫默認的字符集與排序規則
MyISAM:
.frm:表結構定義
.MYD:表數據
.MYI:表索引
InnoDB:
全部表共享一個表空間文件:
建議:每表一個獨立的表空間文件,默認不打開此特性
.frm:表結構
.ibd:表空間(表數據和表索引),建立之初有初始數據
打開方式:
mysql>SHOW VARIABLES LIKE '%innodb%'; # 查看全部與InnoDB相關選項
innodb_file_per_table選項,默認爲OFF改成ON,但臨時生效
或者編輯配置文件:
vim /etc/my.cnf 永久生效
在[mysqld]中加入:
innodb_file_per_table = 1
重啓mysql數據庫服務
mysql系列之四mysql客戶端工具的使用
mysql
--user,-u
--host,-h
--password,-p
--port
--protocol
--database SATABASE, -D
mysql>
交互式模式
mysql>\? # 查看交互式命令的使用方式
source或者\. 後跟指定的sql腳本 能夠批量導入執行sql語句
批處理模式(腳本模式)
# mysql -uroot -ppassword < /root/init.sql
mysql>
命令兩類:
客戶端命令
clear或\c:提早終止語句執行,命令輸入一半取消直接輸入\c便可,結束符以前輸入
connect或\r:鏈接到服務器
ego或者\G:代替結束符,忘記結束符命令末尾執行\G同樣會顯示,縱向顯示
go或者\g:同上,可是顯示爲橫向不分列顯示
print或\p:顯示當前執行命令
quit或\q:退出mysql
delimiter 後跟結束符號 也可寫爲 \d ; # 用來定義語句結束符
\d ; # 表示使用;號做爲結束符
status或\s # 查看服務器狀態
system或\!:執行shell命令,無需退出mysql登陸界面執行
如:\! ls /root # 直接在mysql中顯示root目錄下內容
warnings或\W:語句執行結束後顯示警告信息
nowaring或\w:語句執行結束後不顯示警告信息
prompt或\R:修改登陸後mysql>的提示符
\#:對於新建的對象,支持補全功能;
rehash:對全部對象支持命令補全
服務器語句
help COMMAND:獲取幫助信息
如:mysql>help SELECT # 獲取select的使用方式,與man贊成
正常登錄後顯示爲mysql>符號,其餘提示符表示:
->:表示未輸入完整,繼續輸入
'>:表示表示在語句中缺乏'引號,只有前面輸入了後面未輸入
">:表示語句缺乏"引號的後一半
`>:表示語句中缺乏`反引號的後一半
/*>:表示語句中缺乏C語言註釋的後一半符號
C語言註釋標準方法:
/* d
ddfadfa
*/
其餘選項:
--compress:語句先壓縮再發送和返回,節省帶寬
--ssl-*:全部與SSL加密相關內容指定
客戶端命令使用技巧:
客戶端命令支持補全
開啓此功能,每次執行要在內存中遍歷每一個表,影響性能儘可能禁用
登陸mysql時使用-A選項禁用補全功能
--no-auto-rehash
--disable-auto-rehash
\#:對於新建的對象,支持補全功能;
rehash:對全部對象支持命令補全
mysql輸出格式:
mysql --html
登錄後在mysql>SELECT User,Host FROM user;執行完畢顯示爲html格式的返回語言,複製出來再瀏覽器執行就能夠看到頁面展現的風格
mysql --xml
同上的使用方式,支持xml方式輸出
其餘命令工具:
mysqladmin:管理命令
格式:mysqladmin [options] command [arg] [command [arg]] ...
如:mysqladmin -uroot -p password 'new_pass'
選項:
create DATABASE # 直接建立庫
drop DATABASE # 刪除庫
ping # 測試mysql服務器在不在線,反饋爲mysqld is alive說明在線
processlist # 進程列表,列出服務器全部正在執行的線程列表
status # mysql服務器狀態
--sleep N # 加此參數會睡眠幾秒鐘再次顯示
--count N # 顯示多少次狀態
extended-status # 顯示狀態變量,統計狀態數據
variables # 顯示服務器變量
flush-privileges # 讓mysqld重讀受權表
flush-tables # 關閉全部已打開的表
flush-threads # 重置線程緩存
flush-status # 重置大多數的服務器狀態變量,計數器置零
flush-logs # 日誌滾動和中繼日誌滾動
flush-hosts # 清除主機內部信息,如:DNS解析緩存,屢次鏈接錯誤致使的用戶鏈接錯誤
kill # 終止線程
reload # 等同於flush-privileges
refesh # 等同於flush-logs和flush-hosts同時執行
shutdown # 關閉mysql服務器
version # mysql服務器版本號和當前狀態信息
start-slave # 啓動從服務器進程複製功能
SQL thread
IO thread
stop-slave # 中止從服務器進程複製功能
mysqldump:備份工具
mysqlimport:導入工具
mysqlcheck:檢查數據庫完整性工具
MySQL數據類型及sql模型
開發視角:
數據類型
約束
建立數據庫、表、索引、視圖
SELECT語句
存儲引擎:也被成爲表類型;
MyISAM:無事務,表鎖
.frm:表結構定義文件
.MYD:表數據
.MYI:表索引
InnoDB:事務,行鎖
默認配置,全部表共享一個表空間文件:
建議:每表一個獨立的表空間文件,默認不打開此特性
.frm:表結構
.ibd:表空間(表數據和表索引),建立之初有初始數據
MySQL查看某個表示什麼表類型:
mysql>SHOW TABLE STATUS LIKE 'user'; 查看user表的狀態信息,Engine項爲表類型
程序語言鏈接數據庫的方式:
動態SQL:經過函數或方法與數據庫服務創建鏈接
嵌入式SQL:與動態SQL相似,但其語句必須在程序編譯時徹底你肯定下來;並由預處理器完成處理;
客戶端組件:mysql、mysqladmi、mysqldump、mysqlimport、mysqlcheck
服務器端:mysqld、mysqld_safe、mysqld_multi
/usr/local/mysql/bin目錄下均爲mysql服務端的執行工具
mysqlbinlog:查看mysql二進制日誌
mysqld_safe:安全線程方式啓動mysql
mysqlhotcopy:mysql備份工具
my.cnf配置文件
MySQL讀取配置文件在UNIX系統中啓動過程:
啓動時:/etc/my.cnf
而後:/etc/mysql/my.cnf
而後:$MYSQL_HOME/my.cnf
而後:/path/to/file when defaults-extra-file=/path/to/file is specified :即指定
最後:~/.my.cnf
以最後一次讀取的配置爲最終生效的結果。按次序第一次讀取的反而優先級低
mysqld --help --verbose # 此命令能夠查看mysqld的默承認寫入配置文件的參數
datadir = /mydata/data # 數據存放目錄
hostname.err:錯誤日誌,生成數據目錄後建立文件
一、此前服務未關閉
二、數據初始化失敗
三、數據目錄位置錯誤
四、數據目錄權限問題
DBA:
開發DBA:
數據庫設計
SQL語句
存儲過程、存儲函數、觸發器
管理DBA:
安裝、升級
備份、恢復
用戶、權限管理
監控、性能分析
基準測試
數據類型:
數值型
精確數值
int
decimal
近似數值
float
double
real
字符型
定長
CHAR(N)
BINARY
變長
VARCHAR(N)
VARBINARY
text,blob
ENUM
SET
日期時間型
date,time,datetime,timestamp
域屬性,修飾符:定義域限制
數據類型定義:
一、可以表示哪一種種類數據
二、限定字符長度和佔用存儲空間
三、定義變長和定長
四、如何比較及排序
五、是否能夠被索引
MySQL數據類型分類:遵循ISO 2003標準數據類型
一、字符型
二、數值型
三、日期時間型
數值類型:
一、精確數值型
NUMERIC(g,f):精肯定點數值,總長度精度
DECIMAL(g,f):精肯定點數值,總長度精度
TINYINT:微整型 1字節,255byte
SMALLINT:小整型 2字節,2byte,最大65535個字符,64K
MEDIUMINT:中整型 3字節,3byte,最大16777215個字符,16M
INT:整型 4字節,4byte,最大4294967295個字符,4G
BIGINT:大整型 8字節,8byte,最大18446744073709551615個字符,8G
整數可用屬性:
AUTO_INCREMENT:自動增加
必須使用一個整數類型
必須無符號整型,UNSIGNED
必須創建爲PRIMARY KEY或UNIQUE KEY index
必須不能爲空
LAST_INSERT_ID():顯示出上一次自動生成的數字序列排序到哪裏
二、近似數值型:
FLOAT(g,f):單精度浮點型 4字節
DOUBLE(g,f):雙精度浮點型 8字節
REAL:獨立類型,有時爲FLOAT,有時爲DOUBLE,以不一樣平臺區分
BIT:按位存儲
三、布爾型:TINYINT(1),顯示的數值爲1
BOOLEAN:
BOOL:
字符類型:
CHAR(M):定長,不區分大小寫,最大255個字符
VARCHAR(M):變長,不區分大小寫,1-2個byte,最大65535個字符
BINARY:定長,區分大小寫
VARBINARY:變長,區分大小寫
TINYBLOB:微型大對象,區分大小寫,1byte,最大255個bytes
BLOB:標準大對象,區分大小寫,2byte,最大65535個字符,64K
MEDIUMBLOB:中型大對象,區分大小寫,3byte,最大16777215個字符,16M
LONGBLOB:長大對象,區分大小寫,4byte,最大4294967295個字符,4G
TINYTEXT:微型大對象,不區分大小寫,1byte,最大255個字符
TEXT:標準大對象,不區分大小寫,2byte,最大65535個字符,64K
MEDIUMTEXT:中型大對象,不區分大小寫,3byte,最大16777215個字符,16M
LONGTEXT:長大對象,不區分大小寫,4byte,最大4294967295個字符,4G
ENUM:枚舉型,必須填寫列出的字符串,65535種變化
SET:集合型,必須填寫列出的字符串,1-64個字符串,存儲的是位圖
日期時間型:
DATE:日期,CCYY-MM-DD 3byte
TIME:時間,HH:MM:SS 3byte
DATETIME:日期和時間,CCYY-MM-DD HH:MM:SS 8byte
TIMESTAMP:日期和時間,CCYY-MM-DD 4byte HH:MM:SS,內部轉換後顯示,從UNIX元年計算秒數得出結果
YEAR:年,CCYY或YY 1byte
字符串限定:
NOT NULL:不容許爲空
NULL:容許空
DEFAULT:默認值
BINARY:是否區分大小寫,已經棄用
CHARACTER SET:字符集,只有字符使用
msyql>SHOW CHARACTER SET; # 顯示mysql服務器支持的全部字符集
COLLATION:排序規則,只有字符使用
msyql>SHOW COLLATION; # 顯示各字符集下的排序規則
SQL模型:
ANSI QUOTES:雙引號和反引號意義相同引用字段名稱和代表,單引號用於標識字符串
IGNORE_SPACE:在內建環境中忽略多餘空白字符
STRICT_ALL_TABLES:不設置此項則容許全部非法字符,但會有錯誤警告信息提示
STRICT_TRANS_TABLES:向支持事務的表中插入數據時是不容許的,而且會返回錯誤
TRADITIONAL:
查詢當前模型:
mysql>SHOW GLOBAL VARIABLES LIKE 'sql_mode';
msyql服務器變量:
做用域劃分,分爲兩類:
全局變量:只有root權限才能夠修改
SHOW GLOBAL VARIABLES;
對全局生效的變量
會話變量:
SHOW [SESSION] VARIABLES;
只對當前會話生效的變量
生效時間劃分,分爲兩類:
動態調整:可即時修改並生效,臨時生效
無需重啓服務器,調整後當即生效
靜態調整:永久生效
寫在配置文件中
經過參數傳遞給mysqld進程
動態調整參數的生效方式:
全局:對當前會話無效,只對新創建會話有效;
會話:即時生效,但只對當前會話有效
服務器變量:@@變量名
顯示:SELECT
SELECT @@global.sql_mode; # @@顯示用戶變量,一個@顯示用戶自定義變量
SELECT @@session.sql_mode; # 查看會話變量
設定:SET GLOBAL|SESSION 變量名='value'
MySQL管理表和索引
數據庫:
建立數據庫:
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name # 指定此庫字符集
[DEFAULT] COLLATE [=] collation_name # 指定排序規則
例:CREATE SCHEMA IF NOT EXISTS students CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
cd /mydata/data 目錄下會建立一個students的目錄,內有db.opt的文件,保存了默認字符集合排序規則
修改數據庫:
ALTER {DATABASE|SCHEMA} [db_name] alter_specification ...
ALTER {DATABASE|SCHEMA} [db_name] UPDATE DATA DIRECOTRY NAME
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name # 指定此庫字符集
[DEFAULT] COLLATE [=] collation_name # 指定排序規則
刪除數據庫:
DROP {DATABASE|SCHEMA} [IF EXISTS] db_name
表:
建立表:
一、直接定義一張空表;
CREATE TABLE [IF NOT EXISTS] tb_name (col_name col_defination,constraint)
col_defination:
data_type [NOT NULL | NULL] | ...
例:CREATE TABLE courses(CID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,Couse VARCHAR(50) NOT NULL);
建立表同時建立索引:
CREATE TABLE tb1 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,Name CHAR(20) NOT NULL,Age TINYINT NOT NULL) ENGINE [*] engine_name
另外一種建立索引寫法:
CREATE TABLE tb2 (id INT UNSIGNED NOT NULL AUTO_INCREMENT,Name CHAR(20) NOT NULL,Age TINYINT NOT NULL,PRIMARY KEY(id),UNIQUE KEY(name),INDEX(age))
單字段:
PRIMARY KEY
UNIQUE KEY
單或多字段:
PRIMARY KEY (col,...)
UNIQUE KEY (col,...)
INDEX (col,...)
二、從其餘表中查詢出數據,並以之建立新表;
CREATE TABLE testcourses SELECT * FROM courses WHERE CID <=2;
建立一個新表爲testcourses從表courses中查找CID前兩行的數據做爲新表內容
三、以其餘表爲模板建立一個空表;
CREATE TABLE test LIKE courses;
desc test; # 查看錶結構是否與courses同樣
修改表:
ALTER TABLE tb_name;
添加、刪除、修改字段
ALTER TABLE student MODIFY CID TINYINT UNSIGNED NOT NULL;
# 在student表中修改CID的字段類型爲TINYINT UNSIGNED NOT NULL
ALTER TABLE test CHANGE Couse Course VARCHAR(50) NOT NULL;
# 修改test表中Couse的行名
ALTER TABLE test ADD starttime date default '2013-04-12';
# 添加一行內容starttime類型爲date默認值爲2013-04-12
添加、刪除、修改索引
ALTER TABLE test ADD UNIQUE KEY (Couse);
# 在test表中將Couse字段加惟一鍵索引
改表名:兩種方法更名
ALTER TABLE test RENAME TO testcourses;
RENNAME testcour TO test;
修改表屬性:
ALTER TABLE courses ENGINE=InnoDB; # 修改表引擎爲InnoDB
刪除表:
DROP TABLE tb_name;
選項:
CASCADE:容許級聯,刪除表時將此表相關聯的表所有刪除
RESTRICT:不容許級聯,刪除時不刪除關聯內容
鍵也稱做約束,可用做索引,屬於特殊索引(有特殊限定):B+Tree索引
索引:索引是不能被修改的,只能先刪除再建立
建立索引:
CREATE INDEX index_name NO tb_name index_type{BTREE|HASH}
例:CREATE INDEX name_on_student ON student (Name(5) DESC) USING BTREE;
# 建立索引名爲name_on_studen的索引在student表中的Name字段中只匹配從左邊起的5個字符並以降序排序(ASC表示升序|DESC表示降序),使用BTREE的索引類型
查看索引:
SHOW INDEXES FROM tb_name; 查看錶中的索引
刪除索引:
DROP INDEX name_on_student ON student;
添加外鍵索引:
ALTER TABLE student ADD FOREIGN KEY foreign_cid(CID) REFERENCES courses (CID);
# 在表student中將foreign_cid設置爲表courses(CID)的外鍵
SHOW INDEXES FROM student;
# 查看student表的索引是否包含foreign_cid
DELETE FROM courses WHERE CID=3;
# 此時刪除courses表中的CID行中的3是沒法刪除的,由於與student表有關聯
外鍵:
InnoDB支持外鍵
外鍵約束不建議使用,會消耗服務器資源
單表查詢、多表查詢和子查詢
DML:
SELECT
INSERT INTO
DELETE
UPDATE
SELECT:查詢操做語句
SELECT select-list FROM tb WHERE qualification
查詢語句類型:
單表查詢:
多表查詢:
子查詢:
查詢全部內容:
SELECT * FROM tb_name;
投影:
SELECT field1,field2 FROM tb_name;
選擇:
SELECT * FROM tb_name WHERE qualification;
SELECT * FROM students WHERE Age>=20;
去重,相同的行只顯示一次
SELECT DISTINCT Gender FROM students; # 性別選項都有的內容顯示出來並去重
FROM子句:要查詢的關係 表、多個表、其餘SELECT語句
WHERE子句:布爾關係表達式,數值比較無需加符號,字符必須加單引號
=、>、>=、<、<=、<>和!=均爲不等於、<=>表示空值也比較的相等符號
+、-、*、%、
邏輯關係(與或非):
AND:SELECT Name.Age,Gender FROM student WHERE Age>20 AND Gender='M';
OR:SELECT Name.Age,Gender FROM student WHERE Age>20 OR Gender='M';
NOT:SELECT Name.Age,Gender FROM student WHERE NOT Age>20;
SELECT Name.Age,Gender FROM student WHERE NOT Age>20 AND NOT Gender='M';
SELECT Name.Age,Gender FROM student WHERE NOT (Age>20 OR Gender='M');
查詢區間:查詢年齡在20至25之間的人員
SELECT Name.Age,Gender FROM student WHERE Age>=20 AND Age<=25;
SELECT Name.Age,Gender FROM student WHERE Age BETWEEN 20 AND 25;
特殊查詢:
BETWEEN ... AND ...
區間查詢匹配
LIKE ''
%:任意長度任意字符
_:任意單個字符
REGEXP 或 RLIKE:使用正則表達式
例:SELECT Name FROM student WHERE Name RLIKE '^[XY].*$';
查詢名字以X或Y開頭的學生
IN:離散取值
例:SELECT Name FROM student WHERE Age IN (18,20.25);
查詢年齡爲1八、20、25的同窗
IS NULL 和 IS NOT NULL:匹配爲空或不空的
例:SELECT Name FROM student WHERE CID2 IS NOT NULL;
找到表中CID2列不爲空的
排序:ORADER BY 默認爲升序,所以升序能夠省略ASC
ORDER BY field_name {ASC|DESC}
AS:字段或表重命名 例如將Name字段取別名Student
SELECT Name AS Student_Name FROM students;
Name字段就會顯示爲Student_Name
LIMIT子句:LIMIT [offset,]Count 只顯示有限的行
SELECT Name AS Student_Name FROM students LIMIT 2;
只顯示結果的前兩段
SELECT Name AS Student_Name FROM students LIMIT 2,3;
表示略過前兩個從第三個開始顯示後3個字段
聚合運算:SUM(),MIN(),MAX(),AVG(),COUNT()
SELECT AVG(Age) FROM students;
# 字段Age的平均值
SELECT MAX(Age) FROM students;
# 找到年齡最大的
SELECT MIN(Age) FROM students;
# 找到年齡最小的
SELECT SUM(Age) FROM students;
# 年齡之和
SELECT COUNT(Age) FROM students;
# 查看有年齡的人共多少個
GROUP BY:分組
SELECT Age,Gender FROM students GROUP BY Gender;
# 按照Gender分組顯示
SELECT AVG(Age) FROM students GROUP BY Gender;
# 求男女的平均年齡並排升序
SELECT COUNT(CID1) AS Persons,CID1 FROM students GROUP BY CID1;
# 查詢共有多少同窗選擇了那些課程
組合子句:HAVING qualidication 將group by的結果再次過濾
SELECT COUNT(CID1) AS Persons,CID1 FROM students GROUP BY CID1 HAVING Persons>=2;
# 選出大於或等於2個同窗以上的課程
多表查詢:例如學生表爲students課程表爲courses進行組合查詢
鏈接:
交叉鏈接:笛卡爾乘積
天然鏈接:兩表中某字段值相同的創建鏈接
SELECT students.Name,courses.Cname FROM students,courses WHERE students.CID1 = courses.CID;
# 表students的CID1列內容與courses表的CID列相同的字段列出
# 以上寫法長度太長,能夠給表取別名,下面的寫法取別名查詢
SELECT s.Name,c.Cname FROM students AS s,courses AS c WHERE s.CID1 = c.CID;
外連接:以一張表內容的字段爲基準來關聯查詢
左外鏈接:... LEFT JOIN ... ON ...
SELECT s.Name,c.Cname FROM students AS s LEFT JION courses AS c ON s.CID1 = c.CID;
# 以students表爲準找出Name與課程表courses的Cname進行鏈接,courses表中不存在的課程顯示爲空
右外鏈接:... RIGHT JOIN ... ON ...
SELECT s.Name,c.Cname FROM students AS s RIGHT JION courses AS c ON s.CID1 = c.CID;
# 與上相反,以courses表的Cname爲基準,程序有但Name沒有的爲空
自鏈接:本表相關聯的內容匹配
SELECT c.Name AS student,s.Name AS teacher FROM students AS c,students AS s WHERE c.TID=s.SID;
# 在students表中同一列內容作匹配,以TID和SID匹配老師和學生的關係
子查詢:
比較操做中使用子查詢:子查詢只能返回單個值;
SELECT Name FROM students WHERE Age > (SELECT AVG(Age) FROM students);
# 找出表內同窗中大於平均年齡的同窗,後面的SELECT爲子查詢
IN():使用子查詢:
SELECT Name FROM students WHERE Age IN (SELECT Age FROM tutors);
# 查找出同窗年齡與tutors表老師年齡同樣的同窗
在FROM中使用子查詢:
SELECT Name,Age FROM (SELECT Name,Age FROM students) AS t WHERE t.Age >= 20;
# students表中大於等於20年齡的同窗
聯合查詢:
(SELECT Name,Age FROM students) UNION (SELECT TName,Age FROM tutors);
# 將兩個表的相同內容合併
示例:
一、全部不被學習的課程查詢
SELECT Cname FROM courses WHERE CID NOT IN (SELECT DISTINCT CID2 FROM students WHERE CID2 IS NOT NULL);
二、挑選出沒有教授任何課程的老師
SELECT Tname FROM tutors WHERE TID NOT IN (SELECT DISTINCT TID FROM courses);
三、找出students表中CID1有兩個或兩個以上同窗學習了同一門課程的課表名稱
SELECT Cname FROM courses WHERE CID IN (SELECT CID1 FROM students GROUP BY CID1 HAVING COUNT(CID1) >=2);
四、顯示每位老師及其所教授課程,沒有教授的課程保持爲NULL;
SELECT t.Tname,c.Cname FROM tutors AS t LEFT JOIN courses AS c ON t.TID=c.TID;
五、顯示每一個課程及其相關老師,沒有老師教授的課程將其老師顯示爲空
SELECT t.Tname,c.Cname FROM tutors AS t RIGHT JOIN courses AS c ON t.TID=c.TID;
六、顯示每位同窗CID1課程的課程名稱及其講授了相關課程的老師名稱
SELECT Name,Cname,Tname FROM students,courses,tutors WHERE students.CID1=courses.CID AND courses.TID=tutors.TID;
視圖:存儲下來的SELECT語句
基於基表的查詢結果;
建立視圖:
CREATE VIEW view_name AS 查詢語句
例:CREATE VIEW sct AS SELECT Tname FROM tutors WHERE TID NOT IN (SELECT DISTINCT TID FROM courses);
# 將SELECT開始後面的查詢結果建立爲視圖名爲sct
SHOW TABLES; # 查看錶會有一張sct的表
SELECT * FROM sct; # 查看此表爲視圖查詢語句結果
刪除視圖:
DROP VIEW sct;
物化視圖:基表更新物化視圖也會更新,消耗資源。mysql不支持物化視圖
查看視圖對應的SELECT語句:
SHOW CREATE VIEW sct; # 查看sct視圖建立的SELECT語句
查看建立表時語句:
SHOW CREATE table courses; # 查看建立表時的語句
mysql命令:
-e:不登陸mysql直接執行mysql內部命令,寫腳本時經常使用
例:mysql -e 'CREATE DATABASE edb';
mysql -e 'SHOW DATABASE';
SELECT總結:
選擇:SELECT * FOME tb_name WHERE
布爾表達式:
算術運算
比較操做符
其餘運算符:IN,BETWEEN ... AND ...,LIKE.RLIKE(REGEXP),IS NULL,IS NOT NULL
邏輯運算:AND,OR,NOT,XOR
DISTINCT
投影:SELECT field1, ... FROM tb_name;
ORDER BY field,... {ASC|DESC}
聚合計算:COUNT(),SUM(),MAX(),MIN(),AVG()
GROUP BY field1,...
HAVING
LIMIT [offset],num
多表查詢:
交叉鏈接:笛卡爾乘積
天然鏈接:兩表中某字段值相同的創建鏈接
WHERE tb1.field=tb2.field
外鏈接:
左外
FROM tb1 LEFT JOIN tb2 ON condition
右外
FROM tb1 RIGHT JOIN tb2 ON condition
天然鏈接
子查詢:
FROM
WHERE
比較操做符:子查詢只能返回一個字段的單值;
IN:列表(某字段的多個值)
廣義查詢:包含以下幾個操做,由於下面操做都是在查詢後纔可操做的內容
DML語句:
DELETE
INSERT INTO
UPDATE
INSERT INTO:插入語句
INSERT INTO tb_name(col1,col2,...) VALUES(val1,val2...)[,(val1,val2,...),...]
字符型:單引號
數值型:不須要引號
日期時間型:不須要引號
空值:NULL
例如1:
INSERT INTO tutors SET Tname='Tom',Gender='F',Age=30;
SELECT * FROM tutors ORDER BY TID DESC LIMIT 1;
# 顯示tutors表TID最後一行,LIMIT1 是隻顯示一行的意思,DESC降序排序最後一個顯示
SELECT LAST_INSERT_ID();
# 此語句能夠查詢TID排序到的最後一個數值
例2:
INSERT INTO tutors (Tname,Gender,Age) SELECT Name,Gender,Age FROM students WHERE Age > 20;
# 將後面的SELECT查詢結果插入到表tutors中對應的字段裏
REPLACE INTO:替換插入
DELETE:刪除語句
DELETE FROM tb_name WHERE condition;
例如:
DELETE FROM students; # 清空students表
DESC students; # 查看錶結構
INSERT INTO students (Name,Age,Gender) VALUES ('tom',30,'F');
# 插入新的一行
SELECT * FROM students; # 查看錶內容,能夠看到SID不是從新計數的,是繼續跟此前刪除表時最後一個ID繼續編號
INSERT INTO students (Name,Age,Gender) VALUES ('jerry',30,'F');
# 查看依舊繼續排號
TRUNCATE:清空表,並重置AUTOINCREMENT計數器,ID號重寫
TRUNCATE tb_name;
例如:
接上面DELETE的例子繼續
TRUNCATE students; # 清空表
INSERT INTO students (Name,Age,Gender) VALUES ('tom',30,'F'); # 插入行
SELECT * FROM students; # 查看結果,SID重1開始計數
UPDATE:更新表
UPDATE tb_name SET col1*...,col2*... WHERE
MySQL事務和隔離級別
鏈接管理器:
接受請求
建立線程
認證用戶
創建安全鏈接
併發控制:
多版本併發控制:MVCC,操做時非元數據而是快照,最後以快照合併方式進行數據整合
鎖:
讀鎖:共享鎖
寫鎖:獨佔鎖或排他鎖
LOCK TABLES tb_name {READ|WRITE};
UNLOCK TABLES;
鎖粒度:從大到小,MySQL服務器僅支持表級鎖,行鎖須要存儲引擎的支持
表鎖:鎖定整張表
頁鎖:鎖定數據塊,數據頁面
行鎖:鎖定行
例:
lock tables tutors READ; # 將tutors表READ鎖
在另外一個會話中執行查詢;
select * from tutors; # 依舊能夠查詢
INSERT INTO tutors (Tame,Gender,Age) VALUES ('jerry','M',50); # 提示等待釋放鎖
unlock tables; # 釋放鎖
在另外一個會話提示執行結束,執行時間爲等待直到執行結束的時間
事務:多項操做做爲一個處理單元,要麼同時完成,要麼同時都不完成。
產生大量的CPU和IO操做
RDBMS:ACID
Automicity,原子性,事務所引發的數據庫操做,要麼都完成,要麼都不執行
Consistency,一致性,事務執行完成後,最終結果仍然一直
Isolation,隔離性,保持彼此間互不影響的方式進行併發;
事務調度:事務之間影響最小
MVCC:多版本併發控制
Durability,持久性,事務成功完成,系統必須保證任何故障都不引發事務出現不一致性;
一、事務提交以前就已經寫出數據至持久性存儲
二、結合事務日誌完成;
事務日誌:順序IO
數據文件:隨機IO
事務狀態:
活動的:active
部分提交的:最後一條語句執行後
失敗的:未執行完成的
停止的:不執行
提交的:事務一旦提交沒法停止
事務:併發執行
一、提升吞吐量和資源利用率
二、減小等待時間
事務調度:
可恢復調度:
無級聯調度:
MyISAM:不支持
InnoDB:支持
啓動事務:一堆SQL語句或者ODBC指令
START TANSACTION:啓動
提交事務:
COMMIT:提交
回滾事務:
ROLLBACK:回滾
事務提交纔算完成操做
事務日誌:日誌與數據磁盤分別放置在不一樣設備,避免沒法恢復
重作日誌:每次數據庫操做先寫入日誌,整個事務完成再到ibd表空間中執行
redo log
撤銷日誌:將原始狀態保留到日誌,以便於出現問題時能夠撤銷回原始狀態
undo log
日誌組:寫滿一個寫另外一個,輪詢寫入
隔離性:
隔離級別:級別越高安全性越高,但併發能力越低
一、READ UNCOMMITTED:讀未提交
二、READ COMMITTED:讀提交
三、REPEATABLE READ:可重讀,MySQL中默認使用級別,別的會話提交,本會話不變,本會話提交纔可讀到新數據
四、SERIALIZABLE:可串行,別的會話提交,本會話不變,本會話提交纔可讀到新數據,但未提交以前對端會話不容許執行任何操做,對方提交後才能夠進行事務修改
查看隔離級別:
SHOW GLOBAL VARIABLES LIKE '%iso%';
tx_isolation選項爲REPEATABLE READ
併發控制依賴的技術手段:
鎖
時間戳
多版本和快照隔離
服務器變量:動態和靜態
全局變量:只有root權限才能夠修改
修改後不影響當前會話,只對新建會話有效
會話變量:
僅對當前會話有效,並且當即生效
永久有效:
修改配置文件
動態修改:
SET {SESSION|GLOBAL} VAR_NAME='';
SET tx_isolation='READ UNCOMMITTED'; # 將隔離級別改成讀未提交
SELECT @@tx_isolation; # 查看某個特定變量的值,已經改成讀未提交了
鎖飢餓:
死鎖:
啓動事務:
START TANSACTION; # 啓動事務
select * from tutors; # 查看tutors表
delete from tutors where Tname LIKE 'stu%'; # 刪除兩行stu開頭的內容
ROLLBACK; # 回滾事務
select * from tutors; # 再查看tutors表,stu條目又回來了
COMMIT; # 若是刪除後直接提交,回滾也沒有用了
select @@autocommit; # 自動提交變量,能夠查看是否開啓自動提交事務
若是沒有明確啓動事務:
autocommit:能實現自動提交,每個操做都直接提交;
建議:明確使用事務,而且關閉自動提交。優化策略
set autocommit=0; # 關閉自動提交
保存點:SAVEPOINT sid
回滾至保存點:ROLLBACK TO sid
例如事務執行100個操做,執行到75時錯誤,撤銷到某個保存點
START TANSACTION; # 啓動事務
delete from tutors where TID=18; # 刪除一行
SAVEPOINT ab; # 建立一個保存點叫ab
delete from tutors where TID=14; # 再刪除一行
SAVEPOINT ac; # 建立一個保存點叫ac
delete from tutors where TID=12; # 再刪除一行
SAVEPOINT ad; # 建立一個保存點叫ad
ROLLBACK TO ac; # 恢復到12一級,保存點以前的數據會保留,以後的不會
MySQL用戶和權限管理
帳號:認證
權限:
受權
這些信息保存在mysql庫中的
user表:用戶帳號,全局權限,非權限字段
db表:數據庫級別的權限定義
host表:已廢棄再也不使用,已整合進user表
tables_priv表:表級別權限
columns_priv表:列級別權限
procs_priv表:存儲過程與存儲函數相關的權限
proxies_priv表:代理用戶權限
mysql服務器進程啓動時,經過以上表在內存中生成受權表,以後的訪問均經過檢查上述表進行受權
用戶帳號:
用戶名@主機
用戶名:16字符之內
主機:
主機名:www.magedu.com,mysql
IP:172.16.10.177
網絡地址:172.16.0.0/255.255.0.0
通配符:%,_ 例如:172.16.%.% 或 %.magedu.com
--skip-name-resolve:啓動時加入參數,提升用戶鏈接時的速率
權限級別:
全局級別:SUPER,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES
庫級別
USE mysql;
SELECT * FROM db\G; # 查看庫級別權限表,內有可查詢建立庫之類的選項
表級別:DELETE,ALTER,TRIGGER,INDEX
列級別:SELECT,INSERT,UPDATE
存儲過程和存儲函數
臨時表:內存表
heap:16MB
觸發器:主動數據庫建立
INSERT,DELETE,UPDATE
user表插入數據同時在log表內記錄數據
建立用戶:
一、create user username@host [IDENTIFIED BY 'password'];
# create user能夠不執行flush privileges,他會直接出發讀取受權表
二、 GRANT ALL PRIVILEGES ON db.* TO username@'%' IDENTIFIED BY 'password';
ALL PRIVILEGES:全部權限
GRANT EXECUTE ON FUNCTION db.abc TO username@'%';
# db.abc 表示db庫的abc表或者abc存儲過程或存儲函數,所以須要指定對象類型
object_type:TABLE(表),FUNCTION(存儲函數),PROCEDURE(存儲過程)
GRANT UPDATE(Age) ON cacatidb.testtb TO 'cactiuser'@'%';
# 表示受權給cactiuser用戶只能針對cacatidb庫的testtb表進行Age列更新
須要執行flush privileges
SHOW GRANTS FOR 'username@host' # 查看某用戶的受權信息
WITH GRANT OPTION:此參數表示建立用戶能夠受權給其餘用戶與之相同的權限
三、INSERT INTO mysql.user; # 插入數據到MySQL庫的user表中,須要執行flush privileges
刪除用戶:DROP USER 'username'@'host'
用戶重命名:RENAME USER old_name TO new_name
注意:用戶名須要加主機'username'@'host'
取消受權:
REVOKE ... RROM user
例如:收回cactiuser的SELECT權限
REVOKE SELECT ON cactidb.* RROM 'cactiuser'@'%';
mysql管理員帳號密碼忘記:
若是無數據初始化數據庫便可
有有效數據的狀況:
service mysqld stop # 先關閉數據庫
啓動mysql_safe時傳遞參數
--skip-grant-tables和--skip-networking # 從新登陸時加此兩項參數,跳過受權表和網絡,跳過網絡主要是預防此時有他人訪問
直接進入後
use mysql
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123456');
# 重置密碼,可是使用跳過受權表的方式沒法執行重置
UPDATE user SET PASSWORD=PASSWORD('123456') WHERE User='root';
# 改user表的Password項內容
SELECT User,Host,Password FROM user;
# 查看是否更改了Password內容
從新登陸便可
MySQL日誌管理
建議:
日誌與數據最好不要放置在同目錄,避免磁盤損壞形成數據沒法找回,和性能衝突
錯誤日誌:默認放在數據存放目錄內以主機名開頭.err結尾
log_error # error log記錄位置
log_warnings # 警告日誌位置
服務器啓動和關閉過程當中的信息
服務器運行過程當中的錯誤信息
事件調度器運行一個事件時產生的信息,event
在從服務器上啓動從服務器進程時產生的信息
通常查詢日誌:
general_log # 默認關閉,改成ON便可開啓,會產是大量日誌IO
general_log_file # 日誌位置再數據目錄下的主機名.log文件
log # 5.6已經棄用,打開後將全部sql語句所有記錄
log_output {TABLE|FILE|NONE} # 輸入格式,可用逗號隔開寫兩種
慢查詢日誌:
long_query_time # 指定超過此值則定義爲慢查詢,默認爲10 單位爲秒,也能夠定義爲毫秒
log_slow_queries={YES|NO} # 是否記錄慢查詢日誌
slow_query_log # 開啓或關閉慢查詢日誌功能,默認OFF
slow_query_log_file # 記錄慢查詢日誌的位置名爲localhost-slow.log
二進制日誌:任何引發數據庫變化的日誌都會記錄下來,DML,DDL,DCL操做,
MySQL複製和即時點恢復重要依據;
mysqlbinlog:查看mysql二進制日誌,在數據目錄下存放,每次重啓mysql服務就會滾動一次
重放每一個操做,可以生成如出一轍的多個服務器
二進制日誌的格式:
基於語句:statement
基於行:row
混合方式:mixed
二進制日誌事件:
產生的時間,starttime
相對位置,position
二進制日誌文件:
索引文件:mysql-bin.index,文本文件,記錄起始文件與最近使用文件
二進制日誌文件:mysql-bin.000001
查看當前正在運行的二進制
SHOW MASTER STATUS; # Position記錄改變語句內容
SHOW BINLOG EVENTS IN 'msyql-bin.00005'; # 查看binlog信息,pos記錄了詳細對應Position的變化操做
SHOW BINLOG EVENTS IN 'msyql-bin.00005' FROM 107; # 從pos的107開始顯示
查看二進制日誌文件詳細內容起止時間
mysqlbinlog
--start-datetime:起始時間
--stop-datetime:終止時間
--start-position:起始位置
--stop-position:終止位置
例如:
mysqlbinlog mysql-bin.000005 # 查看二進制日誌文件內容,at後面的數字表示起始下面的at表示上一個的終止也表示下一個的起始位置
mysqlbinlog --start-position=107 --stop-position=358 mysql-bin.000005 # 指定起止位置顯示
mysqlbinlog --start-datetime='2013-04-26 15:14:39' mysql-bin.000005 # 從起始時間顯示,會找到最符合時間點的時間節點開始,不指定截止時間會顯示到日誌尾部
重定向二進制日誌文件:
mysqlbinlog --start-datetime='2013-04-26 15:14:39' mysql-bin.000005 > /root/a.sql
手動滾動日誌:針對二進制日誌,從服務器滾動中繼日誌
mysql> FLUSH LOGS;
刪除二進制日誌文件:
mysql> PURGE BINARY LOGS TO 'mysql-bin.000003';
mysql> SHOW BINARY LOGS; # 查看二進制日誌信息,000001和2已經被刪除
查看二進制日誌文件選項:
SHOW GLOBAL VARIABLES LIKE '%log%';
binlog_format值爲MIXED混雜模式
log_bin # 是否記錄二進制日誌,默認爲ON,還能夠指定位置
sql_log_bin # 控制二進制日誌是否記錄至日誌文件,與上同啓用,mysql數據庫備份導入時需臨時關閉此項,導入後再開啓
sql_log_off # 是否記錄通常查詢文件到查詢日誌文件
binlog_cache_size # 二進制日誌文件緩存大小
max_binlog_cache_size # 二進制日誌文件緩存最大上限
binlog_stmt_cache_size # 二進制日誌語句相關的緩存大小,與事務相關的日誌
max_binlog_stmt_cache_size # 最大的語句相關緩存上限
sync_binlog=# # 多久同步一次二進制日誌到磁盤,0位不一樣步,數字表示對二進制日誌每多少次寫操做以後同步一次
sync:每次操做日誌都從內存同步到磁盤
async:先寫入內存,必定時間內的操做一併同步至磁盤
expire_logs_days # 日誌存放週期,自動清理二進制日誌,默認關閉
中繼日誌:從主服務器的二進制日誌文件中複製而來的事件,並保持爲的日誌文件;
複製主節點二進制日誌,而後再從服務器中執行一樣的SQL和IO操做的日誌
事務日誌:主要維護數據庫事務自己的可靠性,ACID,將隨機IO轉換爲順序IO;
事務性存儲引擎用於保證原子性,一致性,隔離性和持久性;
事務日誌針對的是數據,將舊數據更新爲新數據,回撤時再恢復爲舊數據便可
查看事務日誌文件選項:
SHOW GLOBAL VARIABLES LIKE '%log%';
innodb_flush_log_at_trx_commit # 將內存中的事務日誌同步至日誌文件,日誌文件同步至數據文件的過程由mysql後臺完成。取值:0表示每秒同步,並執行磁盤flush操做;1表示每事務同步,並執行磁盤flush操做;2表示每事務同步,但不執行磁盤flush,性能優;
注:mysql一次寫操做先寫入到用戶空間的緩存中,再被傳遞到內核空間的緩存中,最後被寫入磁盤,這樣雙緩存的機制可能會致使數據丟失,用戶空間已經完成了但其實還未從內核空間轉存至磁盤,一旦down機極可能會數據丟失,所以上面提到的0選項就略過內核空間直接寫磁盤操做。
innodb_log_buffer_size # 內存緩存大小
innodb_log_file_size # 日誌文件大小,默認5M
innodb_log_files_in_group # 定義事務日誌文件組由幾個文件組成,默認2個,兩個文件交替寫入
innodb_log_group_home_dir # 日誌組文件存放位置,./指當前目錄爲數據目錄
innodb_mirrored_log_groups # 鏡像事務日誌文件組,容許1組鏡像
查看日誌相關參數:
SHOW GLOBAL VARIABLES LIKE '%log%'; # 查看跟log相關的服務器變量
FIO:fusion-IO
IOPS:
普通pc:100
scsi:200
SSD:500-2000
數據庫存儲引擎:
SHOW ENGINES; # 查看mysql支持的存儲引擎
MyISAM:
不支持事務,性能優
只支持表鎖,致使併發能力差
不支持外鍵
B樹索引、FULLTEXT索引、空間索引
支持表壓縮
.frm:表結構文件
.MYD:表數據文件
.MYI:表索引文件
InnoDB:OLTP,大量寫操做的業務
事務
行級鎖,並行寫入執行快
B樹索引、聚簇索引、自適應hash索引
表空間,raw磁盤設備
.frm:表結構文件
.ibd:表空間文件
MRG_MyISAM:
將兩個MyISAM合併爲一個表使用
CSV:
利用文本文件的格式存儲表,量數據庫之間移至時使用
ARCHIVE:
實現歸檔
MEMORY:
內存存儲引擎,性能極高,數據安全性差
BLACKHOLE:黑洞存儲引擎
還有不少第三方存儲引擎
存儲引擎也稱之爲表類型:不建議混合使用存儲引擎,保持一致性
MySQL備份和還原
備份:副本
RAID1,RAID10:保證硬件損壞而不會業務終止;邏輯不會有任何保障。
備份類型:
熱備份:讀、寫不受影響
溫備份:僅可讀操做
冷備份:離線備份,讀寫操做均終止
物理和邏輯備份:
物理備份:複製數據文件
邏輯備份:將數據導出至文本文件中
徹底備份、增量備份和差別備份:
徹底備份:備份所有數據
增量備份:僅備份上次徹底備份或增量備份之後變化的數據
差別備份:僅備份上次徹底備份以來變化的數據
備分內容:
數據、配置文件、二進制日誌、事務日誌、
離線備份:經過主從架構方式停庫作備份。
數據安全有保障
熱備份:
MyISAM:
藉助於LVM快照進行熱備
溫備份,鎖表備份
InnoDB:
xtrabackup
mysqldump:性能差一些
物理備份:速度快,可移植性差
邏輯備份:速度慢,丟失浮點數精度;方便使用文本處理工具直接對其處理,可移植性強
備份策略:主要看業務量和可忍受的還原時長
徹底+增量:還原較慢
一週一次徹底,天天一次增量
天天一次徹底,每小時一次增量
徹底+差別:還原快
一週一次徹底,天天一次差別
天天一次徹底,每小時一次差別
MySQL備份工具:
mysqldump:邏輯備份工具,MyISAM(溫)、InnoDB(熱)
msyqldump(徹底備份)+二進制日誌=徹底+增量或差別
mysqlhotcopy:物理備份工具,冷備工具
文件系統工具:
cp、scp:冷備份
lvm:邏輯卷的快照功能,幾乎熱備;
mysql>FLUSH TABLES;
mysql>LOCK TABLES;
建立快照;釋放鎖,然後複製數據
MyISAM:可直接備份
InnoDB:緩衝區內容同步至磁盤才能夠開始備份
三方備份工具:
ibbackup:每臺服務器受權5000美圓
xtrabackup:開源工具
Amanda和Bacula:網絡備份工具,有for MySQL的版本
mysqldump:
db_name [tb1] [tb2]:備份某個庫或某張表,此備份可能會丟失數據,因此需先FLUSH TABLES WITH READ LOCK; 先清表再以只讀方式鎖表,再備份,完成後執行UNLOCK TABLES;
例如:mysqldump -uroot -p jiaowu > /root/jiaowu.sql
還原時需先建立數據庫CREATE DATABASE studb;
mysql studb < jiaowu.sql
--all-database:備份全部庫
--master-data={0|1|2}
0:不記錄二進制日誌文件及事件位置
1:以CHANGE MASTER TO的方式記錄位置,可用於恢復後直接啓動從服務器;
2:以CHANGE MASTER TO的方式記錄位置,但默認爲被註釋掉
--lock-all-tables:備份前鎖定全部表,MyISAM數據庫必須加此選項
--lock-tables:鎖定一張表以後備份
--flush-logs:備份以前鎖表後,自動執行日誌滾動
--events:備份事件的
--routines:備份存儲過程和存儲函數
--triggers:備份觸發器
若是指定庫中的表類型均爲InnoDB的,可以使用
--single-transaction # 啓動熱備,熱備無需鎖表等操做
備份多個庫:
--all-databases:備份全部庫
--databases DB_NAME,DB_NAME,... :備份指定庫
還原時無需建立庫
例如:
mysqldump -uroot -p --lock-all-tables -flush-logs -all-databases --master-data=2 > /root/all.sql
備份策略:每週徹底+每日增量實現即時點還原
徹底備份:mysqldump
增量備份:備份二進制日誌文件(flush logs)
徹底備份:
mysqldump -uroot -p --lock-all-tables -flush-logs -all-databases --master-data=2 > /root/alldatabases.sql
鏈接mysql操做:最好先複製二進制文件再刪除
mysql>PURGE BINARY LOGS TO 'mysql-bin.000011';
mysql>SHOW BINARY LOGS;
mysql>use tudb;
mysql>DELETE FROM tutors WHERE Age>80;
mysql>FLUSH LOGS;
\q
退出mysql
cd /mydata/data # 進入數據目錄
cp mysql-bin.00011 /root/ # 備份二進制日誌文件
mysqlbinlog mysql-bin.000011 > /root/mon-incremental.sql # 一樣是備份二進制日誌文件,推薦使用此方式
模擬週二插入新數據
mysql>use studb;
mysql>INSERT INTO tutors (Tname) Values ('stu123');
mysql>\q
退出mysql
模擬故障
cd /mydata/data
cp mysql-bin.000012 /root
rm -rf ./* # 模擬誤刪除mysql庫數據目錄
恢復MySQL庫:
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data # 初始化庫
service mysqld start
mysql -uroot -p < alldatabases.sql # 還原徹底備份
mysql -uroot -p < mon-incremental.sql # 還原週一執行的操做
mysqlbinlog mysql-bin.000012 > temp.sql # 將週二的二進制日誌轉換爲sql文本文件
mysql -uroot -p < temp.sql # 還原週二執行的操做
還原到了故障的時刻
使用LVM快照進行數據庫備份
二進制日誌:
format:
statment
row
mixed
mysqldump:還原時最好關閉二進制日誌記錄,還原結束後再開啓,由於還原時執行的內容無需記錄在二進制日誌中,而且還會產生大量IO影響還原性能
mysql> SHOW MASTER STATUS; # 查看當前二進制日誌狀態
mysql>SHOW BINLOG EVENTS IN 'mysql-bin.000001'; # 查看二進制日誌詳細事件
mysql>SET sql_log_bin=0; # 臨時關閉二進制日誌
mysql>./ /root/jiaowu.sql # 在mysql內部還原教務數據庫
mysql>SET sql_log_bin=1; # 開啓二進制日誌
邏輯備份缺點:
一、浮點數據丟失精度;
二、備份出的數據更佔用存儲空間;壓縮後可大大節省空間;
三、速度他們,消耗資源,不適合對大數據庫作徹底備份;
對InnoDB:建議使用熱備
--lock-all-tables 或 mysql>FLUSH TABLES WITH READ LOCK;
# 針對事務過程鎖過程要等待好久;即使鎖定,事務日誌還可能在執行寫操做,還要等待事務日誌同步到磁盤以後才能完成鎖定狀態
SHOW ENGINE INNODB STATUS; # 查看事務日誌執行操做狀態,緩衝區無操做後鎖定
MVCC:多版本併發控制 REPEATABLE-READ
--single-transaction
使用SELECT INTO OUTFILE備份:只適用於但張表內的數據備份
備份:SELECT * INTO OUTFILE '/tmp/t1.txt' FROM t1 [WHERE clause];
還原:LOAD DATA INFILE '/tmp/t1.txt' INTO TABLE t1; # 須要提早建立表和表格式
# 此備份還原過程不會被記錄到二進制日誌中,由於非DML語句,但會將備份數據以二進制格式記錄在二進制日誌中
根據上述備份,使用二進制日誌恢復:
use jiaowu;
CREATE TABLE tutors LIKE tutor; # 建立新的tutors表與tutor一致
TRUNCATE TABLE tutor; # 清空tutor表數據
SELECT * FROM tutor; # 查看tutor表內容爲空
SELECT * FROM tutors; # 查看tutors表內容也爲空
set sql_log_bin=0; # 關閉二進制日誌記錄
SOURCE /root/a.sql; # 導入a.sql數據
執行裸備份:
幾乎熱備:LVM
前提:
一、數據文件要在邏輯捲上;
二、此邏輯卷所在卷組必須有足夠空間使用快照卷;容納全部變化的數據;
三、數據文件與事務日誌必須在同一邏輯卷,由於若是不在同一邏輯卷就須要分開作快照,此時事務日誌與數據文件的一致性就會被破壞;
執行步驟:
mysql>FLUSH TABLES WITH READ LOCK; # 鎖定表,快照卷以前要鎖表
mysql>FLUSH LOGS; # 日誌回滾
mysql>SHOW MASTER STATUS; # 當前二進制日誌事件位置Position保存下來
# msyql -e 'SHOW MASTER STATUS\G' > /backup/master-`date +%F`.info # 備份日誌位置命令
# lvcreate -L 50M -s -p r -n mydata-snap /dev/myvg/mydata # 爲/dev/myvg/mydata卷作快照,大小爲50M,只讀方式,快照名爲mydata-snap
# lvs # 查看lv信息,會有一個mydata-snap的快照卷
mysql>UNLOCK TABLES; # 解鎖
mysql>commit # 提交事務,二進制日誌會有變化
# mount /dev/myvg/mydata-snap /mnt -o ro # 掛載快照卷至mnt目錄
# cd mnt/data # 進入快照卷
# mkdir /backup/full-backup-`date +%F` # 建立徹底恢復的目錄
# cp -a ./* /backup/full-backup-2013-05-03 # 將快照文件備份到恢復目錄
# umount /mnt
# lvremove --force /dev/myvg/mydata-snap # 刪除快照卷
# cd /backup/full-backup-2013-05-03/ # 切換到恢復目錄
# rm mysql-bin.* -f # 刪除二進制日誌
# cat /backup/master-2013-05-03.info # 查看二進制日誌文件備份節點
# mysqlbinlog --start-datetime='2013-05-03 20:18:34' mysql-bin.000003 mysql-bin.000004 > /backup/incremental-`date +%F-%H-%M-%S`.sql # 將二進制日誌備份出來,若是備份時間點後出現多個mysql-bin的日誌,那就使用時間作起始,後面跟須要備份的mysql-bin日誌文件一併導出到一個sql文件
# service mysqld stop # 中止mysql服務
# rm -rf ./* # 在mysql數據目錄下吧全部數據文件所有刪除
# cp -a /backup/full-backup-2013-05-03/* /mydata/data/ # 恢復備份
# ls /mydata/data -l # 查看屬組屬主是否爲mysql
# service msyqld start # 啓動mysql數據庫
mysql>set sql_log_bin=0; # 關閉二進制日誌記錄
mysql>source /backup/incremental-2013-05-03-20-32-57.sql # 把備份的二進制日誌還原
mysql>select * from tutors; # 查看數據是否存在
mysql>set sql_log_bin=1; # 開啓二進制日誌記錄
還原至故障點數據
步驟:
一、打開會話,施加讀鎖,鎖定全部表;
mysql>FLUSH TABLES WITH READ LOCK;
mysql>FLUSH LOGS;
二、經過另外一個終端,保存二進制日誌文件及相關位置信息;
msyql -e 'SHOW MASTER STATUS\G' > /backup/master-`date +%F`.info
三、建立快照卷
# lvcreate -L 50M -s -p r -n mydata-snap /dev/myvg/mydata
四、釋放鎖
mysql>UNLOCK TABLES;
五、掛載快照卷,備份
# mount /dev/myvg/mydata-snap /mnt -o ro
# cp -a ./* /backup/full-backup-2013-05-03
六、刪除快照卷
# lvremove --force /dev/myvg/mydata-snap
七、增量備份二進制日誌:
# mysqlbinlog --start-datetime='2013-05-03 20:18:34' mysql-bin.000003 mysql-bin.000004 > /backup/incremental-`date +%F-%H-%M-%S`.sql
使用xtrabackup進行數據庫備份
二進制日誌相關的幾個選項:
innodb_suppot_xa={TRUE|FLASE}
存儲引擎事務在存儲引擎內部被賦予了ACID屬性,分佈式(XA)事務是一種高層次的事務,他利用「準備」而後「提交」(preparp-then-commit)兩段式的方式將ACID屬性擴展到存儲引擎外部,甚至是數據庫外部。
sync_binlog=# # 設定多久同步一次二進制日誌文件,0表示不一樣步,建議此項設定爲1,保證安全方式寫入
percona:商業版
ibbackup:InnoDB online physical backup,$5000每服務器
full
incremental
MyISAM:warm backup,full
LVM --> mylvmbackup(perl scripts)
互聯網開源工具,自動化對邏輯捲上的數據文件以快照方式作備份,依舊是幾乎熱備
percona:開源版
xtrabackup:開源工具
xtradb:xtra專用存儲引擎,也是innodb的加強版
可將xtradb下載源碼,放置在數據中目錄中,替換原有的innodb存儲引擎
innodb:
官方:www.percona.com
安裝工具:
rpm -ivh percona-xtrabackup-2.0.0-417.rhel5.i386.rpm
rpm -ql percona-xtrabackup
xtrabackup徹底備份:
innobackupex
# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
若是要使用一個最小權限的用戶進行備份,則可基於以下命令建立此類用戶:
mysql>CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'password';
mysql>REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';
mysql>GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql>FLUSH PRIVILEGES;
使用innobackupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm),以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息的相關的文件,這些文件會被保存至一個以時間命令的目錄中。
在備份的同事,innobackupex還會在備份目錄中建立以下文件:
(1)xtrabackup_checkpoints -- 備份類型(如徹底或增量)、備份狀態(如是否已經爲perpared狀態)和LSN(日誌序列號)範圍信息
# 每一個InnoDB頁(一般爲16K大小)都會包含一個日誌序列號,即LSN,LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info -- mysql服務器當前正在使用的二進制日誌文件及至備份這一刻位置的二進制日誌事件的位置。
(3)xtrabackup_binlog_pos_innodb -- 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
(4)xtrabackup_binary -- 備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf -- 備份命令用到的配置選項信息:
在使用innobackupex進行備份時,還能夠使用--no-timestamp選項來組織命令自動建立一個以時間命令的目錄,如此一來,innobackupex命令將會建立一個backup-dir目錄來存儲備份數據。
二、準備(perpare)一個徹底備份
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobackupex命令的--apply-log選項可用於實現上述功能。以下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
若是執行正確,其最後輸出的幾行信息一般以下:
xtrabackup:starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB:Starting shutdown
120407 9:01:40 InnoDB:Shutdown completed;log sequence number 92036620
120407 9:01:36 innobackupex:completed OK!
在實現「準備」的過程當中,innobackupex一般能夠使用--user-memory選項來指定其能夠使用的內存大小,默認一般爲100M,若是有足夠的內存可用,能夠多劃分一些內存給perpare的過程,以提升其完成速度
三、從一個徹底備份中恢復數據
innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。
# innobackupex --copy-back /path/to/BACKUP-DIR
若是執行正確,其輸出信息的最後幾行一般以下:
innobackupex:Finished copying back files
120407 09:36:10 innobackupex:completed OK!
請確保如上信息的最後一行出現"innobackupex:completed OK!"
當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然在啓動mysqld以前還須要事先修改數據文件的屬主屬組如:
# chown -R mysql:mysql /mydata/data
service mysqld start 啓動mysql服務查看數據是否已恢復
xtrabackup+二進制日誌:實現即時恢復
四、使用innobackupex進行增備份
每一個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增加,這正是InnoDB表能夠進行增量備份的基礎,即innobackupex經過備份上次徹底備份以後發生改變的頁面來實現。
要實現第一次增量備份,能夠使用如下命令進行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中建立一個新的以時間命名的目錄以存放全部增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在目錄
須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
"準備"(perpare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:
(1)須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」,「重放」以後,全部的備份數據將會合併到徹底備份上。
(2)基於全部的備份將未提交的事務進行「回滾」。
因而,操做變成了:BASE-DRI指向徹底備份目錄
# innobackupex --apply-log --redo-only BASE-DIR
接着執行:指向上一次增量備份目錄
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR=1
然後是第二個增量:指向最近一次增量備份目錄
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR=2
其中BASE-DIR指的是徹底備份所在的目錄,而INCREMENTAL-DIR=1至的是第一次增量備份的目錄,INCREMENTAL-DIR=2指的是第二次增量備份的目錄,其餘依次類推,即若是有屢次增量備份,每一次都要執行如上操做;
恢復依舊是:
# innobackupex --copy-back /path/to/BACKUP-DIR # 指向徹底備份目錄便可,增量已合併
五、Xtrabackup的「流」及「備份壓縮」功能
xtrabackup對備份的數據文件支持「流」功能,便可以將備份的數據經過STDOUT傳輸給tar程序進行歸檔,而不是默認的直接保存至某備份目錄中。要使用此功能,僅須要使用--stream選項便可。如:
#innobackupex --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz
甚至也能夠使用相似以下命令將數據備份至其餘服務器:
# innobackupex --stream=tar /backup | ssh user@www.magedu.com "cat - > /backup/`date +%F_%H-%M-%S`.tar"
此外,在執行本地備份時,還能夠使用--parallel選項對多個文件進行並行複製。此選項用於指定在複製時啓動的線程數目。固然,在實際進行備份時要利用此功能的便利性,也要啓用innodb_file_per_table選項或共享的表空間經過innodb_data_file_path選項存儲在多個ibdata文件中。對某一數據庫的多個文件的複製沒法利用到此項功能。其簡單實用方法以下:
# innobackupex --parallel /path/to/backup
同時,innobackupex備份的數據文件也能夠存儲至遠程主機,這能夠實用--remote-host選項來實現:
# innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup
六、導入或導出單張表
默認狀況下,InnoDB表不能經過直接複製表文件的方式再mysql服務器之間進行移植,即使實用了innodb_file_per_table選項,而使用xtrabackup工具能夠實現此種功能,不過,此時須要「導出」表的mysql服務器啓用了innodb_file_per_table選項(嚴格來講:是要「導出」的表在其建立以前,mysql服務器就啓用了innodb_file_per_table選項),而且「導入」表的服務器同事啓用了innodb_file_per_table和innodb_expand_import選項。
(1)「導出」表
導出表是在備份的perpare階段進行的,所以,一旦徹底備份完成,就能夠在perpare過程當中經過--export選項將某表導出了:
# innobackupex --apply-log --export /path/to/backup
此命令會爲每一個innodb表的表空間建立一個以.exp結尾的文件,這些以.exp結尾的文件則能夠用於導入至其餘服務器。
(2)「導入」表
要在mysql服務器導入來自其餘服務器的某innodb表,須要先在當前服務器上建立一個跟原表表結構一致的表,然後才能實現將表導入:
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
而後將此表的表空間刪除:
mysql>ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
接下來,未來自於「導出」表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,而後使用以下命令將其「導入」:
mysql>ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
七、使用xtrabackup對數據庫進行部分備份
xtrabackup也能夠實現部分備份,即只備份某個或某些指定的數據庫或某數據庫中的某個或某些表。但要使用此功能,必須啓用innodb_file_per_table選項,即每張表保存爲一個獨立的文件。同事,其也不支持--stream選項,即不支持將數據庫經過管道傳輸給其餘進程進行處理。
此外,還原部分備份跟還原所有數據的備份也有不一樣,即你不能經過簡單地將perpare的部分備份使用--copy-back選項直接複製回數據目錄,而是要經過導入表的方式來實現還原。固然,有些狀況下,部分備份也能夠直接經過--copy-back進行還原,但這種方式還原而來的數據多數會產生數據不一致的問題,所以,不管如何不推薦使用這種方式。