鸟哥私房菜linux就该这么学-学习记录
1.操作系統也會提供一整組系統呼叫接口來給軟件設計師開發用喔!
2.過去每種操作系統都是在他專門 的硬件機器上面運行的喔!
3.Linux 由于是 Open Source 的操作系統,所以他的程序代碼可 以被修改成適合在各種機器上面運行的。
4. Unix 是以較高階的 C 語言寫的。 高階的 C 語言與硬件的相關性就沒有這么大了!
5.現在的硬件基本上都是一種架構。
6.因此他便開始撰寫 C 語言的編譯程序,那就是現在相當有名的GNU C Compiler(gcc)!
7.可以被使用來操作操作系統的基本接口 BASH shell!
8.圖形用戶接口為 X,Window 的 W 接的就是 X 啦!
9.GNU 計劃對于整個自由軟件與開放原始碼軟件來說是占有非常重要的角色!
10.寫程序最大的快樂就是讓自己發展的良 好的軟件讓大家來使用了! 另外,如果使用方撰寫程序的能力比自己強,那么當對方修改完自己的 程序并且回傳修改后的程序代碼給自己,那自己的程序撰寫功力無形中就更往上爬了! 這就是最早 之前 AI 實驗室的黑客風格!
11.什么要稱為 GNU 呢?其實 GNU 是 GNU's Not Unix 的縮寫,意思是說,GNU 并不 是 Unix 啊!那么 GNU 又是什么呢? 就是 GNU's Not Unix 嘛!.....如果你寫過程序就會知道,這個 GNU = GNU's Not Unix 可是無窮循環啊!忙碌~
12. GPL(GNU General Public License, GPL)是什么玩意兒?使用者可以自由的執行、復制、再發行、學習、修改與強化 自由軟件。你不能將一個 GPL 授權的自由軟件,在你修改后而將他取消 GPL 授權~ 不能單純的販賣自由軟件。
13.目前自由軟件工作者,他們所賴以維生的,幾乎都是在『服務』這個領域呢!
14.GPL也有很多細分。
15.社群版UBUNTU,商業版redhat
16.現在手機市場的主流 操作系統是 Linux 分支出來的 Android 喔!
17.嵌入式linux系統。
18.單一主機的能力太過強大,導致硬件資源經常閑置, 這個現象讓虛擬化技術得以快速發展!
19.云程序的底層就是 Linux ,而云程序搭建出來的虛擬機,內容也是 Linux 操作系統哩!
20.『在 Linux 系統中,每個裝置都被當成一個文件來對待』
21、幾乎所有的硬件裝置文件都在/dev 這個目錄內, 所以你會看到
/dev/sda, /dev/sr0 等等的檔名喔。
22.SCSI/SATA/USB 硬盤機 /dev/sd[a-p]
23.由于是使用偵測到的順序來決定裝置文件名,并非與實際插槽代號有關,因此裝置的文件名如下:
1. SATA1 插槽上的檔名:/dev/sda
2. SATA5 插槽上的檔名:/dev/sdb
3. USB 磁盤(開機完成后才被系統捉到):/dev/sdc
24. Linux 內的所有數據都是以文件的形態來呈現的。
25./usr 是 Linux 的可執行程序及相關的文件擺放的目錄,
26.初次接觸 Linux:只要分區『 / 』及『swap』即可。#swap能不用就不用,速度很慢,如果用的多了說明要用內存了。
27.請特別注意您的服務項目!然后才來進行 硬盤的規劃。
28.文本模式登入后所取得的程序被稱為殼(Shell),#我們項目上用的是bash shell,還有shell scripts
29.man,http://-help.info?三個類似。#不僅僅是Man
30.linux中有許多的編輯器。#vim只是其中一個。
31.LINUX關機別亂關。#有很多亂起八糟的東西需要弄的。
32.用戶(文件擁有者),群組(團隊),其他。例如一個家庭有三個人,每個人一個房間(用戶),公用一個客廳(群組),客人就是其他。
33.但是在 Linux 底下,我們的文件是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟 檔名是沒有絕對的關系的!#跟后綴沒有關系。
34.目錄的 x 代表的是用戶能否進入該目錄成為工作目錄的用途!能不能CD過去。R就是讀里面的文件名,W就是對里面的文件進行各種操作。對目錄來說里面的東西就是數據。#目錄的rwx與文件的rwx是不一樣的。
35.oracle的家目錄下有個ROOT:ROOT -rwx------- 怎么辦?只能刪。#不能執行其他操作。
36.而在 Linux 底下,只要你 的權限當中具有 x 的話,例如[ -rwxr-xr-x ] 即代表這個文件具有可以被執行的能力喔!但是 能不能執行成功,當然就得要看該文件的內容啰~
37.我們仍然希望可以藉由擴展名來了解該文件是什么東西-------------擴展名的作用。
38.linux特殊字符* ? > < ; & ! [ ] | \ ' " ` ( ) { }。 #沒有等號。
39./etc (配置文件)
/opt (第三方協力軟件)
/usr (軟件放置處)
40.可分享的:能夠分享給網絡上其他主機掛載用的目錄; #除了rwx外還有可分享,不變等權限。
不變的:有些數據是不會經常變動的,跟隨著 distribution 而不變動。
41.? / (root, 根目錄):與開機系統有關;
? /usr (unix software resource):與軟件安裝/執行有關;
? /var (variable):與系統運作過程有關。
/bin:放置命令。
42.根目錄(/)所在分區槽應該越小越好,
43.root 系統管理員(root)的家目錄。#/root,不是/
44.? . :代表當前的目錄,也可以使用 ./ 來表示; #.等于./ ..等于../
? .. :代表上一層目錄,也可以 ../ 來代表。
45.cd 回到自己的家 cd - 回到上一次在的目錄。
46.為什么我在任何目 錄下輸入 ls 就一定可以顯示出一些訊息而不會說找不到該 /bin/ls 指令呢? 這是因為環境變量 PATH?的幫助所致呀!#找不到因該是path的問題。
47.隱藏屬性:不能被移動。可分享,不變之云。
48.find 的特殊功能就是能夠進行額外的動作(action)。
? {} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
? -exec 一直到 \; 是關鍵詞,代表 find 額外動作的開始 (-exec) 到結束 (\;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』啰! #exec只能一個一個,xargs能全部一起。
? 因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜杠來跳脫。
49.dmtsai 執行 passwd 的過程中,會『暫時』獲得 root 的權限;----suid
50. which 命令用于查找并顯示給定命令的絕對路徑.which與whereis一般都查命令的所在路徑。
51, find 是很強大的搜尋指令,但時間花用的很大!#locate要少很多。
52. locate命令其實是“find -name”的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb), 但是功能也輕量級很多。
53.touch 的目的在修改文件的時間參數,但亦可用來建立空文件;
54. 為 什么需要進行『格式化』呢?成為操作系統能夠利用的『文件系統格式 (filesystem)』
55. 將文件系統與目錄樹結合的動作我們稱為『掛載』。
56.基本上,磁盤陣列 (RAID) 就是透過將文件先細分為數個小型的分區區塊 (stripe) 之后,然后將眾多 的 stripes 分別放到磁盤陣列里面的所有磁盤,當你的系統大多是大型文件時,一般建議 stripe 可以設?定大一些,這樣磁盤陣列讀/寫的頻率會降低,效能會提升。 #Block類似。
57.我們在本章一開始時的掛載點的意義當中提過掛載點是目錄, 而這個目錄是進入磁盤分區槽(其實是文件系統啦!)的入口就是了。
58.一般來說,如果硬件的配備資源足夠的話,那么 swap 應該不會被我們的系統所使用到,?swap 會?被利用到的時刻通常就是物理內存不足的情況了。當內存不足的時候,為了讓后續的程序可以順利的運作,因此在內存中?暫不使用的程序與數據就會被挪到 swap 中了。#內存中暫不使用的會被挪到swap中去。
59.多種壓縮技術。將多個文件打包!#打包再壓縮。
60.指令大多僅能針對單一文件來進行壓縮。為什么打包?多個打包成單個,再壓縮。#指令一般只能針對單個文件,所以才要打包啊!
61.『 -f filename 』是緊接在一起的。
62.。此外,vim 是進階版的 vi , vim 不但可以用 不同顏色顯示文字內容,還能夠進行諸如 shell script, C program 等程序編輯功能, 你可以將?vim 視為一種程序編輯器!#程序編輯器而不僅僅是文字處理器。
63.vim 是一個『程序開發工具』而不是文字處理軟件~^_^。vim的三種模式!
64.vim練習題
----------------
1. 請在 /tmp 這個目錄下建立一個名為 vitest 的目錄;
2. 進入 vitest 這個目錄當中;
3. 將 /etc/man_db.conf 復制到本目錄底下(或由上述的連結下載 man_db.conf 文件);
4. 使用 vi 開啟本目錄下的 man_db.conf 這個文件;
5. 在 vi 中設定一下行號;
6. 移動到第 43 列,向右移動 59 個字符,請問你看到的小括號內是哪個文字?
7. 移動到第一列,并且向下搜尋一下『 gzip 』這個字符串,請問他在第幾列?
8. 接著下來,我要將 29 到 41 列之間的『小寫 man 字符串』改為『大寫 MAN 字符串』,并且一個一個挑
選是否需要修改,如何下達指令?如果在挑選過程中一直按『y』, 結果會在最后一列出現改變了幾個 man
呢?
9. 修改完之后,突然反悔了,要全部復原,有哪些方法?
10. 我要復制 66 到 71 這 6 列的內容(含有 MANDB_MAP),并且貼到最后一列之后;
11. 113 到 128 列之間的開頭為 # 符號的批注數據我不要了,要如何刪除?
12. 將這個文件另存成一個 man.test.config 的檔名;
13. 去到第 25 列,并且刪除 15 個字符,結果出現的第一個單字是什么?
14. 在第一列新增一列,該列內容輸入『I am a student...』;
15. 儲存后離開吧!
整個步驟可以如下顯示:
1. 『mkdir /tmp/vitest』
2. 『cd /tmp/vitest』
3. 『cp /etc/man_db.conf .』
4. 『/bin/vi man_db.conf』
5. 『:set nu』然后你會在畫面中看到左側出現數字即為行號。
6. 先按下『43G』再按下『59→』會看到『 as 』這個單字在小括號內;
7. 先執行『1G』或『gg』后,直接輸入『/gzip』,則會去到第 93 列才對!
8. 直接下達『 :29,41s/man/MAN/gc 』即可!若一直按『y』最終會出現『在 13 列內置換 13 個字符串』的
說明。
9. (1)簡單的方法可以一直按『 u 』回復到原始狀態,(2)使用不儲存離開『 :q! 』之后,再重新讀取一次
該文件;
10. 『66G』 然后再『 6yy 』之后最后一列會出現『復制 6 列』之類的說明字樣。 按下『 G 』到最后一列,
再給他『 p 』貼上 6 列!
11. 因為 113~128 共 16 列,因此『 113G 』→『 16dd 』就能刪除 16 列,此時你會發現游標所在 113 列
的地方變成 『 # Flags. 』 開頭啰
12. 『 :w man.test.config 』,你會發現最后一列出現 "man.test.config" [New].. 的字樣。
13. 『25G』 之后,再給他『 15x 』即可刪除 15 個字符,出現『 tree 』的字樣;
14. 先『 1G 』去到第一列,然后按下大寫的『 O 』便新增一列且在插入模式;開始輸入『I am a student...』
后, 按下[Esc]回到一般指令模式等待后續工作;
15. 『:wq』
------------------------
65.如果你之前的 vim 處理動作尚未儲存,此時你應該要按下『R』,亦即使用 (R)ecover 的項目, 此時 vim 會載入 .man_db.conf.swp 的內容,讓你自己來決定要不要儲存!這樣就能夠救回來你之前未儲存的工作。 不過那個 .man_db.conf.swp 并不會在你結束 vim 后自動刪除,所以你離開 vim 后還得要自行刪除 .man_db.conf.swp 才能避免每次打開這個文件都會出現這樣的警告!如果你確定這個暫存盤是沒有用的,那么你可以直接按下『D』刪除掉這個暫存盤,亦即 (D)elete it這個項目即可。 此時 vim 會載入 man_db.conf ,并且將舊的 .man_db.conf.swp 刪除后,建立這次會使用的新的 .man_db.conf.swp 喔!
#D會刪除.swap文件,R不會。
66.linux默認用bash shell來跟核心溝通,其中更是提供強大的script進行腳本編寫!懂了bash嗎? #bash shell 與Bash shell scripts
67.為什么用bash?支持tab,script,回滾,通配符等多重強大的功能。#比一般的shell功能更多。
68.指令別名!#指令別名你可以自己研究下。
69. export命令用于將shell變量輸出為環境變量,或者將shell函數輸出為環境變量。#export ORACLE_SID=sqmmt,環境變量里面有了這個東西。
70.source 。。。。只在當前shell生效。由于 /etc/profile 與 ~/.bash_profile (環境變量到這里面去)都是在取得 login shell 的時候才會讀取的配置文件,所以, 如果你將自己的偏好設定寫入上述的文件后,通常都是得注銷再登入后,該設定才會生效。那么,能不能直接讀取配置文件而不注銷登入呢? 可以的!那就得要利用 source (或者小數點)這個指令了!#有些配置文件只有剛進入shell的時候才會讀取,為了不重啟,可以用source或者. 但是只在當前的shell中生效。
71.# xargs與exec的寫法是不一樣的。
find /opt/ltedecoder/log -type f -name "*.log" -mtime +3 |xargs -n 5 rm -rf {} ;
find ./ -mtime +1 -exec ls -l {} \; #沒有管道。
find . -maxdepth 1 ! -type d -name "*.ctrl" |xargs -n 5 rm -rf {};#!是反向查找。
72.通配符:*,?,[],[-],[^].
73.特殊字符(通配符不算特殊字符,遇到特殊字符要\)
# 批注符號:這個最常被使用在 script 當中,視為說明!在后的數據均不執行
\ 跳脫符號:將『特殊字符或通配符』還原成一般字符
| 管線 (pipe):分隔兩個管線命令的界定(后兩節介紹);
; 連續指令下達分隔符:連續性命令的界定 (注意!與管線命令并不相同)
~ 用戶的家目錄
$ 取用變數前導符:亦即是變量之前需要加的變量取代值
& 工作控制 (job control):將指令變成背景下工作
! 邏輯運算意義上的『非』 not 的意思!
/ 目錄符號:路徑分隔的符號
>, >> 數據流重導向:輸出導向,分別是『取代』與『累加』
<, << 數據流重導向:輸入導向 (這兩個留待下節介紹)
' ' 單引號,不具有變量置換的功能 ($ 變為純文本)
" " 具有變量置換的功能! ($ 可保留相關功能)
` ` 兩個『 ` 』中間為可以先執行的指令,亦可使用 $( )
( ) 在中間為子 shell 的起始與結束
{ }在中間為命令區塊的組合!
74.『標準輸出 (STDOUT)』與『標準錯 誤輸出 (STDERR)』, 這兩個玩意兒默認都是輸出到屏幕上面來的啊!#還有標準輸入。
75.,標準輸出指的是『指令執行所回傳的正確的訊息』,而標準錯誤輸出可理解為『 指令執 行失敗后,所回傳的錯誤訊息』
76.#輸入為0,正確輸出為1,錯誤輸出為2。
1. 標準輸入 (stdin) 鍵盤輸入。管道之前也是,:代碼為 0 ,使用 < 或 << ;
2. 標準輸出 (stdout)屏幕輸出,管道之后也是:代碼為 1 ,使用 > 或 >> ;
3. 標準錯誤輸出(stderr)錯誤信息:代碼為 2 ,使用 2> 或 2>>
77. find /home - - name .bashrc > list 2>&1
78. cat > catfile < ~/.bashr catfile是新建立的。 用文件代替標準輸入。
79.[dmtsai@study ~]$ cat > catfile << "eof" #<<的作用。就是能eof!
> This is a test.
> OK now stop
> eof <==輸入
#> >>都是輸出到文件,后者是追加。<是文件輸入 <<是屏幕輸入,多了個eof結束。
80.一次性執行多個命令的方法:
1.腳本。
2.沒有關聯性情況下用;
3.有關聯情況下:
cmd1 && cmd2
若 cmd1 執行完畢且正確執行($?=0),則開始執行 cmd2。
若 cmd1 執行完畢且為錯誤 ($?≠0),則 cmd2 不執行。
cmd1 || cmd2
若 cmd1 執行完畢且正確執行($?=0),則 cmd2 不執行。
若 cmd1 執行完畢且為錯誤 ($?≠0),則開始執行 cmd2。
81.范例三:我不清楚 /tmp/abc 是否存在,但就是要建立 /tmp/abc/hehe 文件
[dmtsai@study ~]$ ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/heh
82.這個管?線命令『 | 』僅能處理經由前面一個指令傳來的正確信息,也就是 standard output 的信息,對于stdandard error 并沒有直接處理的能力。
83.ll |?more?....more也可以 #有些命令前面不支持管道。
84.管道后面的指令必須要能夠接受?standard input?(屏幕輸入)的 數據才行,這樣的指令才可以是為『管線命令』,例如 less, more, head, tail 等都是可以接受 standard input 的管線命令啦。至于例如 ls, cp, mv 等就不是管線命令了!
85.管道要注意82和84兩點。#只能傳送standard output信息,不能傳送standard error信息,且后面的命令必須能接受standard input命令。
86.如果你硬要讓 standard error 可以被管線命令所使用,那該如何處理?其實就 是透過上一小節的數據流重導向即可! 讓 2>&1 加入指令中~就可以讓 2> 變成 1> 啰!
87擷取命令: cut, grep。cut 主要的用途在于將『同一行里面的數據進行分解!』最常使用在分析一些數據或文字數據的時候!比如每一行都一樣,取一段。取一行中的某段。cut 在處理多空格相連的 數據時,可能會比較吃力一點,所以某些時刻可能會使用下一章的 awk 來取代的!awk是cut的進階。
88.sort命令:萬能的排序!不僅僅是-t!unique重復的只取一個。wc?統計命令!不僅僅用在有多少行。
#sort取多個行,從第一列開始對比。
89.雙向重導向: tee 不僅在屏幕上輸出,在文件中也有。#既傳送到文件,也傳送到屏幕輸出。
90.舉例來 說,要將大寫改成小寫,或者是將數據中的 [tab] 按鍵轉成空格鍵?還有,如何將兩篇訊息整合成一篇? 底下我們就來介紹一下這些字符轉換命令在管線當中的使用方法:字符轉換命令: tr, col, join, paste, expand。
sed替換算是這些的進階?算吧。
91.分區命令: split。如果你有文件太大,導致一些攜帶式裝置無法復制的問題,嘿嘿!找 split 就對了!
92.xargs 可以讀入 stdin 的數據(標準輸出到管道的過來的也算標準輸入),并?且以空格符或斷行字符作為分辨,將 stdin 的資料分隔成為 arguments 。 因為是以空格符作為分隔, 所以,如果有一些檔名或者是其他意義的名詞內含有空格符的時候, xargs 可能就會誤判了。#xargs與exec的區別:前者能一批處理,但是無法識別有特殊字符的文件名。
93.很多指令其實并不支持管 線命令,因此我們可以透過 xargs 來提供該指令引用 standard input 之用!#Xargs和exec是很多不支持管道的命令的救星啊。
94.tar - - cvf - - /home | tar - - xvf - - - - C /tmp/homeback
上面這個例子是說:『我將 /home 里面的文件給他打包,但打包的數據不是紀錄到文件,而是傳送 到 stdout; 經過管線后,將 tar -cvf - /home 傳送給后面的 tar -xvf - 』。后面的這個 - 則是取用前 一個指令的 stdout, 因此,我們就不需要使用 filename 了!這是很常見的例子喔!注意注意!#管道可以省去文件名。
95.type 可以用來找到執行指令為何種類型,亦可用于與 which 相同的功能;
96.使用 env 與 export 可觀察環境變量,其中 export 可以將自定義變量轉成環境變量;
97.set 可以觀察目前 bash 環境下的所有變量;
98.locale 可用于觀察語系資料
99.可用 read 讓用戶由鍵盤輸入變量的值 read -p
100.ulimit 可用以限制用戶使用系統的資源情況
101.bash 的配置文件主要分為 login shell 與 non-login shell。login shell 主要讀取 /etc/profile 與 ~/.bash_profile,但是 /etc/profile 還會呼叫出其他的配置文件,non-login shell 則僅讀取?~/.bashrc.。source執行系統配置只會在當簽到shell中生效。
login shell:取得 bash 時需要完整的登入流程的,就稱為 login shell。所以non-loginshell(X windows登入)
102.stty 也可以幫 助設定終端機的輸入按鍵代表意義喔!(比如設置quit的熱鍵)^ 表示 [Ctrl] 那個按鍵的意思#熱鍵,更改文件名。
103.正規表示法是透過一些特殊字符的排列,用以『搜尋/取代/刪除』一列或多列 文字字符串, 簡單的說,正規表示法就是用在字符串的處理上面的一項『表示式』。正規表示法并不是一個工具程序, 而是一個字符串處理的標準依據,如果您想要以正規表示法的方式處理字符串,就得要使用支持正規表示法的工具程序?才行, 這類的工具程序很多,例如 vi, sed, awk 等等。簡單的說,正規表示法就是處理字符串的方法,他是以行(正則)為單位來進行字符串的處理行為, 正規表示法透過一些特殊符號的輔助,可以讓使用者輕易的達到『搜尋/刪除/取代』某特定字符串的處 理程序。但例如 cp, ls 等指令并未支持正規表示法, 所以就只能使用 bash 自己本身的通 配符而已。正規表示法基本上是一種『表示法』, 只要工具程序支持這種表 示法,那么該工具程序就可以用來作為正規表示法的字符串處理之用。grep用了正則后不用通配符了。正則相當于通配符的進階。
104.正則是重中之重
105.延伸的正規表示法
106.使用正規表示法時,需要特別留 意當時環境的語系為何, 否則可能會發現與別人不相同的擷取結果喔!
107.因為 * 代表的是『重復 0 個或多個前面的 RE 字符』的意義, 因此,『o*』代表的是:『擁有空?字符或一個 o 以上的字符』!那如果是『oo*』呢?則第一個 o 肯定必須要存在.『.* 就代表零個或多個任 意字符』
108.正則中\{n,m\}。正則中*就是正則,{}在“” #特殊字符的排列。
11.2.4 基礎正規表示法字符匯整 (characters)
RE 字符 意義與范例
^word
意義:待搜尋的字符串(word)在行首!
范例:搜尋行首為 # 開始的那一行,并列出行號
grep -n '^#' regular_express.txt
word$
意義:待搜尋的字符串(word)在行尾!
范例:將行尾為 ! 的那一行打印出來,并列出行號
grep -n '!$' regular_express.txt
.
意義:代表『一定有一個任意字符』的字符!
范例:搜尋的字符串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e
中間『一定』僅有一個字符,而空格符也是字符!
grep -n 'e.e' regular_express.txt
\
意義:跳脫字符,將特殊符號的特殊意義去除!
范例:搜尋含有單引號 ' 的那一行!
grep -n \' regular_express.txt
*
意義:重復零個到無窮多個的前一個 RE 字符
范例:找出含有 (es) (ess) (esss) 等等的字符串,注意,因為 * 可以是 0 個,所以 es 也
是符合帶搜尋字符串。另外,因為 * 為重復『前一個 RE 字符』的符號, 因此,在 * 之前必須
要緊接著一個 RE 字符喔!例如任意字符則為 『.*』 !
grep -n 'ess*' regular_express.txt
[list]
意義:字符集合的 RE 字符,里面列出想要擷取的字符!
范例:搜尋含有 (gl) 或 (gd) 的那一行,需要特別留意的是,在 [] 當中『謹代表一個待搜尋
的字符』, 例如『 a[afl]y 』代表搜尋的字符串可以是 aay, afy, aly 即 [afl] 代表 a 或
f 或 l 的意思!
grep -n 'g[ld]' regular_express.txt
[n1-n2]
意義:字符集合的 RE 字符,里面列出想要擷取的字符范圍!
范例:搜尋含有任意數字的那一行!需特別留意,在字符集合 [] 中的減號 - 是有特殊意義的,
他代表兩個字符之間的所有連續字符!但這個連續與否與 ASCII 編碼有關,因此,你的編碼需要
設定正確(在 bash 當中,需要確定 LANG 與 LANGUAGE 的變量是否正確!) 例如所有大寫字
符則為 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list]
意義:字符集合的 RE 字符,里面列出不要的字符串或范圍!
范例:搜尋的字符串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時,代表的意
義是『反向選擇』的意思。 例如,我不要大寫字符,則為 [^A-Z]。但是,需要特別注意的是,
如果以 grep -n [^A-Z] regular_express.txt 來搜尋,卻發現該文件內的所有行都被列
出,為什么?因為這個 [^A-Z] 是『非大寫字符』的意思, 因為每一行均有非大寫字符,例如第
一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字
grep -n 'oo[^t]' regular_express.txt
\{n,m\}
意義:連續 n 到 m 個的『前一個 RE 字符』
意義:若為 \{n\} 則是連續 n 個的前一個 RE 字符,
意義:若是 \{n,\} 則是連續 n 個以上的前一個 RE 字符! 范例:在 g 與 g 之間有 2 個到
3 個的 o 存在的字符串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt
109. 雙引號中的三種特殊字符不被忽略:$,\,`
110.通配符不算特殊字符,正則是通配符的進階,是特殊字符的特殊結合。在工具中遇到特殊字符卻又不想用他的原含義的可以用\。在雙引號中只有·$\三個特殊字符有原含義。
111. printf 可以幫我們將資料輸出的結果格式化,而且支持一些特殊的字符
112.printf ' 打印格式 ' 實際內容
113.awk中$0 代表『一整?列資料』的意思~
單引號已經是 awk 的指令固定用法,非變量的文字部分 ,需要使用雙引號來定義出來。
cat test2 | awk 'NR==1 {printf "%10s\t %10s\t %10s\t %10s\t %10s\t?\n",$1,$2,$3,$4,"total"};NR>1{total=$2+$3+$4;printf "%10s\t %10d\t %10d\t %10d\t %10f\t?\n",$1,$2,$3,$4,total}' #必須要有\n,變量total不用$,注意分號的位置。
printf:可以自定義輸出的模式,另外輸出內容之后不自動換行
print:輸出內容之后自動換行
#printf與print的區別是前者可以自定義模式。
114.diff 通常是用在同一的文件(或軟件)的新舊版本差異 上!
115.diff 主要是 以『行』為單位比對, cmp 則是以『字節』為單位去比對,這并不相同!
116.正規表示法與通配符是完全不一樣的東西!通配符 (wildcard) 代表的是 bash 操作接口的一個功能, 但正規表示法則是一種字符串處理的表示方式!
117.shell是一個文字接口底下讓我們與系統溝通的一個工具接口.script是『腳本、劇本』的意思.shell script?是針對 shell 所寫的『劇本!』
118.shell script 是利用 shell 的功能所寫的一個『程序 (program)』,這個程序是使用純文本文件,將一些 shell 的語法與指令(含外部指令)寫在里面, 搭配正規表示法、管線命令與數據流重導向等功能,以達到我們所想要的處理目的。shell script 可以簡單的被看成是批處理文件。且這個程序語言由于都是利用 shell 與相關工具指令, 所以不需要編譯即可執行。
119.系統的服務 (services) 啟動的接口是在 /etc/init.d/ 這個目錄下,目錄下的所有文件都是 scripts ;
120.另外,包括開機 (booting) 過程也都是利用 shell script 來幫忙搜尋系統的相關設定數據。
121。因為 shell script 用的是外部的指令與 bash shell 的一些默認工具,所以shell script 處理數據的速度上是不太夠的。shell script 用在系統管理上?面是很好的一項工具,但是用在處理大量數值運算上, 就不夠好了,因為 Shell scripts 的速度較慢,?且使用的 CPU 資源較多,造成主機資源的分配不良。
122.CentOS 默認用戶家目錄下的 ~/bin 目錄會被設定到 ${PATH} 內,所以你也可以將 shell.sh 建立在
/home/dmtsai/bin/ 底下 ( ~/bin 目錄需要自行設定) 。此時,若 shell.sh 在 ~/bin 內且具有 rx 的權限,
那就直接輸入 shell.sh 即可執行該腳本程序!sh shell.sh?亦即告訴系統,我想要直接以 bash 的功能來執行 shell.sh 這個文件內的相關指令的意思,所以此時?你的 shell.sh 只要有 r 的權限即可被執行喔!而我們也可以利用 sh 的參數,如 -n 及 -x 來檢查與?追蹤 shell.sh 的語法是否正確呢! ^_^。./shell會去指令搜索順序中找。
123.?PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒號使目錄與目錄之間隔開。
124.linux 中“\a”什么意思?\a 發出警告聲;
125.因為我們使用的是 bash ,所以,必須要以『 #!/bin/bash 』來宣告這個文件內的語法使用 bash 的語法!
126.一般來說, 建議你一定要養成說明該 script 的:1. 內容與功能; 2. 版本信息; 3. 作者與聯絡方式; 4. 建檔日期;5. 歷史紀錄 等等。這將 有助于未來程序的改寫與 debug 呢!
127.建議務必要將一些重要的環境變量設定好,比如PATH等等,后面將會方便很多。
128.我們也可 以利用 exit 這個指令來讓程序中斷,并且回傳一個數值給系統。
129.echo -e :激活轉義字符。
130.vim與vi相比 會有額外的語法檢驗機制。格外的許多功能。
131filename=${fileuser:-"filename"}
fileuser 變量未設定或者為空,filename取"-"后面的值;否則filename=$fileuser
132.鳥哥比較建議使用這樣的方式來進行運算: var=$((運算內容))
133.bc命令:支持浮點運算。
134.?time命令:獲取一個程序的執行時間,可以獲取到實際運行時間以及程序在用戶態和內核態分別的時間,大部分的性能測試,可能只需要關注實際時間。
135.執行shell scripts的4種方式:
1./bin中放置路徑,然后直接文件名,
2../filename或者絕對路徑,
3.sh。這三種都是在子bash中運行,
4.source是在父bash中運行。
136.test進行各種條件判斷。與[]類似。
137.[□"$HOME"□==□"$MAIL"□] []作為判斷這些地方必須有空格。#[]要注意空格。
138.在 bash 當中使用一 個等號與兩個等號的結果是一樣的! 不過在一般慣用程序的寫法中,一個等號代表『變量的設定』,兩個等號則是 代表『邏輯判斷 (是與否之意)』。#形式上的不一樣。
? 在中括號 [] 內的每個組件都需要有空格鍵來分隔;
? 在中括號內的變數,最好都以雙引號括號起來;
? 在中括號內的常數,最好都以單或雙引號括號起來
[ "${name}" == "VBird" ]#注意空格和雙引號。
139.簡單的方式 可以利用 && 與 || ,但如果我還想要執行一堆指令呢?那真的得要 if then 來幫忙啰.#多條指令堆積:腳本,;,&&
140.[ "${yn}" == "Y" -o "${yn}" == "y" ]
上式可替換為
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]
# &&同理。
141.在 shell script 當中的 function 的設定一 定要在程序的最前面
142.for 這種語法,則是『 已經知道 要進行幾次循環』的狀態!
143. 在 bash shell 中,$( ) 與 ` ` (反引號) 都是用來做命令替換用(command substitution)的。
144.$(( ))的用途用來作整數運算。#$()與··是命令替換,$(())是整數運算。
145.shell scripts學習方法:『多看、多模仿、并加以修改成自己的樣式!』 是最快的學習手段了!網絡上有相當多的 朋友在開發一些相當有用的 scripts ,若是你可以將對方的 scripts 拿來,并且改成適合自己主機的 樣子!那么學習的效果會是最快的呢!#將別人的scripts拿來,然后轉換成自己主機的模樣。
146. Linux 主機并不會直接認識你的 『賬號名稱』的,他僅認識 ID 啊
147.~每個登入的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、一個是群組 ID (Group ID ,簡稱 GID)。
148.那么你輸入賬 號密碼后,系統幫你處理了什么呢?
1.?先找尋 /etc/passwd 里面是否有你輸入的賬號?如果沒有則跳出,如果有的話則將該賬號對應的 UID 與?GID (在 /etc/group 中) 讀出來,另外,該賬號的家目錄與 shell 設定也一并讀出;
2. 再來則是核對密碼表啦!這時 Linux 會進入 /etc/shadow 里面找出對應的賬號與 UID,然后核對一下你剛 剛輸入的密碼與里頭的密碼是否相符?
3. 如果一切都 OK 的話,就進入 Shell 控管的階段啰!
4.root:x:0:0:root:/root:/bin/bash
username;密碼;usedid;groupid;說明;家目錄;shell;
149.新版的 Linux 中,初始群組的用戶群已經不會加入在第四個字段!
150.有效群組(effective group) ,次要群組與初始群組(initial group) ? /etc/passwd中的是初始群組。
groups命令后第一個就是有效群組。
151.
152.所以當有使用者想要加入 某些群組時, root 或許會沒有空管理。此時如果能夠建立群組管理員的話,那么該群組管理員就能夠將那個賬號加入自己管理的群組中! 可以免去 root 的忙碌啦!
153.系統賬號主要是用來進行運作系統所需服務的權限設定。UID小于1000.所以系統賬號默認都不會主動建立家目錄的
154.私有群組機制與公共群組機制。redhat和centos都是私有群組機制,默認群組是自己。而不是gid=100;同一個群組會產生很多問題。
155.你希望每個賬號都只能使用 email 的收發信件功能, 而不許用戶登入系統取得 shell ,那么可以將這里設定為 /sbin/nologin
156.SKEL=/etc/skel:用戶家目錄參考基準目錄 這個咚咚就是指定用戶家目錄的參考基準目錄啰
157.用戶的數據有:
? 用戶賬號/密碼相關參數:/etc/passwd, /etc/shadow
? 使用者群組相關參數:/etc/group, /etc/gshadow
? 用戶個人文件數據: /home/username, /var/spool/mail/username..
#與user相關的操作都是在這些文件上操作的。
158.linux ACL是比普通權限更加細節的權限設定。#比如共享啥的。
159. apache ,我們可以額外建立一個名為 apache 的用戶來啟動 apache 軟件啊,如此一來,如果這個程序被攻破,至少系統還不至于就損毀了~#apache不能訪問root用戶的。
160.su - 與 sudo都可以進行用戶切換。sudo需要提前設定,不需要root密碼。#但是只能執行某些操作。并且要在文件里面設定。
161.單純使用『 su 』切換成為 root 的身份,讀取的變量設定方式為?non-login shell 的方式(xshell與su 都是這種方式),這種方式 很多原本的變量不會被改變
162、雖然使用 su 很方便啦,不過缺點是,當我的主機是多人共管的環境時,如果大家都要使用 su 來切 換成為 root 的身份,那么不就每個人都得要知道 root 的密碼,這樣密碼太多人知道可能會流出去, 很不妥當呢!怎辦?透過 sudo 來處理即可!相對于 su 需要了解新切換的用戶密碼 (常常是需要 root 的密碼), sudo 的執行則僅需要自己的密 碼即可! 事實上,一般用戶能夠具有 sudo 的使用權,就是管理員事先審核通過后,才開放 sudo 的使用權的!因此, 除非是信任用戶,否則一般用戶默認是不能操作 sudo 的喔!
163.系統賬號的 shell 是 /sbin/nologin), 這個時候 sudo 真是他 X 的好用了!
164.舉例來說,各個系統賬號,打印作業由 lp 這個 賬號在管理, WWW 服務由 apache 這個賬號在管理, 他們都可以進行系統程序的工作,但是就 是無法登入主機取得互動的 shell』而已啦!^_^
165.?PAM?(驗證機制)是一個獨立的 API 存在,只要任何程序有需求時,可以向 PAM 發出驗證要 求的通知, PAM 經過一連串的驗證后,將驗證的結果回報給該程序
166如果隨便輸入字典上面找的到的字符串, passwd 就會回報錯 誤信息了!這是為什么呢?這就是 PAM 的 pam_cracklib.so 模塊的功能!
167所以,當你有任何需要判斷是否在字典當中的密碼字符串時,就可以使用 pam_cracklib.so 這個模塊 來驗證! 并根據驗證的回報結果來撰寫你的程序呢!這樣說,可以理解 PAM 的功能了吧?
168.例題:
為什么 root 無法以 telnet 直接登入系統,但是卻能夠使用 ssh 直接登入?
答:
一般來說, telnet 會引用 login 的 PAM 模塊,而 login 的驗證階段會有 /etc/securetty 的限制! 由于遠程聯機
屬于 pts/n (n 為數字) 的動態終端機接口裝置名稱,并沒有寫入到 /etc/securetty , 因此 root 無法以 telnet 登
入遠程主機。至于 ssh 使用的是 /etc/pam.d/sshd 這個模塊, 你可以查閱一下該模塊,由于該模塊的驗證階段并
沒有加入 pam_securetty ,因此就沒有 /etc/securetty 的限制!故可以從遠程直接聯機到服務器端。#不同的驗證機制
169.密碼登錄錯誤可以到/var/log/secure, /var/log/messages等文件中尋找錯誤。
170.linux用戶間的通信:
wall(廣播) ,write,mail
171.在 Linux 系統中,由于是多人多任務的環境,所以會有多人共同使用一個硬盤空間的情況發生.---使用quota進行規劃。 Quota 是針對整個 filesystem 進行限制,XFS 文件系統可以限制目錄!Quota 的使用必須要核心與文件系統均支持。文件系統的參數必須含有 usrquota, grpquota, prjquota------需要軟件之云的支持。
新版的 CentOS 預設都有啟用 SELinux 這個核心功能,該功能會加強某些細部的權限控制!
柔性勸導,硬性規定 (soft/hard)與gracetime(寬限時間):
172.RAID 可以透過一個技術(軟件或硬件),將多個較小的磁盤整合成為一個較大的磁盤裝置; 而這個較大的磁盤功能可不止是儲存而已,他還具有數據保護,快速讀取的功能呢。
在組成?RAID-0?時,每顆磁盤 (Disk A 與 Disk B) 都會先被區隔成為小區塊 (chunk)。 當有數據要寫入 RAID 時,資料會先被切割成符合小區塊的大小,然后再依序一個一個的放置到不 同的磁盤去。當你有 100MB 的數據要寫入時,每個磁盤會各被分配到 50MB 的儲存量想一想,如果某一顆磁盤損毀了,那么文件數據 將缺一塊,此時這個文件就損毀了。 由于每個文件都是這樣存放的,因此 RAID-0 只要有任何一顆 磁盤損毀,在 RAID 上面的所有數據都會遺失而無法讀取。我用 200G 與 500G 組成 RAID-0 , 那么最初的 400GB 數據可同時寫入兩顆磁盤 (各消耗 200G 的容 量),后來再加入的數據就只能寫入 500G 的那顆磁盤中了。 此時的效能就變差了,因為只剩下一顆
可以存放數據嘛!
RAID-5?至少需要三顆以上的磁盤才能夠組成這種類型的磁盤陣列。這種磁盤陣列的數據寫入有點類 似 RAID-0 , 不過每個循環的寫入過程中 (striping),在每顆磁盤還加入一個同位檢查數據 (Parity) , 這個數據會記錄其他磁盤的備份數據。 RAID 5 的總容量會是整體磁盤數 量減一顆。以上圖為例, 原本的 3 顆磁盤只會剩下 (3-1)=2 顆磁盤的容量。而且當損毀的磁盤數量 大于等于兩顆時,這整組 RAID 5 的資料就損毀了。?因為 RAID 5 預設僅能支持一顆磁盤的損毀情 況。讀取的效能還不賴!與 RAID-0 有的比!不過寫的效能就不見得能夠增加很 多! 這是因為要寫入 RAID 5 的數據還得要經過計算同位檢查碼 (parity) 的關系。(讀取都有變慢)由于加上這個計 算的動作, 所以寫入的效能與系統的硬件關系較大!因為 RAID5, RAID6 讀寫都需要經過 parity 的計算器制,因此讀/寫效能都不會剛好滿足于使用 的磁盤數量喔!
當磁盤陣列的磁盤損毀時,就得要將壞掉的磁盤拔除,然后換一顆新的磁盤。換成新磁盤并且順利啟 動磁盤陣列后, 磁盤陣列就會開始主動的重建 (rebuild)?原本壞掉的那顆磁盤數據到新的磁盤上!然 后你磁盤陣列上面的數據就復原了! 這就是磁盤陣列的優點。#raid0不行。raid5可以。
Spare Disk :預備磁盤的功能:
當磁盤陣列的磁盤損毀時,就得要將壞掉的磁盤拔除,然后換一顆新的磁盤。換成新磁盤并且順利啟 動磁盤陣列后, 磁盤陣列就會開始主動的重建 (rebuild) 原本壞掉的那顆磁盤數據到新的磁盤上!然 后你磁盤陣列上面的數據就復原了! 這就是磁盤陣列的優點。不過,我們還是得要動手拔插硬盤, 除非你的系統有支持熱拔插,否則通常得要關機才能這么做。
所謂的硬件磁盤陣列 (hardware RAID) 是透過磁盤陣列卡來達 成數組的目的(我們的服務器好像都用的這個)。?磁盤陣列卡上面有一塊專門的芯片在處理 RAID 的任務,因此在效能方面會比較好。軟件磁盤陣列主要是透過軟件來 仿真數組的任務, 因此會損耗較多的系統資源,比如說 CPU 的運算與 I/O 總線的資源等。不過目 前我們的個人計算機實在已經非常快速了, 因此以前的速度限制現在已經不存在!所以我們可以來 玩一玩軟件磁盤陣列!
我們的 CentOS 提供的軟件磁盤陣列為 mdadm 這套軟件,這套軟件會以 partition 或 disk 為磁盤 的單位,也就是說,你不需要兩顆以上的磁盤,只要有兩個以上的分區槽 (partition) 就能夠設計你的 磁盤陣列了。#軟件磁盤陣列只需要2個分區。
熱插拔與冷插拔。
硬件磁盤 陣列的裝置文件名為 /dev/sd[a-p] ,因為使用到 SCSI 的模塊之故。至于軟件磁盤陣列則是系統仿真 的,因此使用的裝置文件名是系統的裝置文件, 文件名為 /dev/md0, /dev/md1...,兩者的裝置文件名 并不相同!
173.LVM 的重點在于『可以彈性的調整 filesystem 的容量!』而并非在于效能與數據保全上面。 需要 文件的讀寫效能或者是數據的可靠性,請參考前面的 RAID 小節。
我們剛剛有談到 LVM 可彈性的變更 filesystem 的容量,那是如何辦到的?其實他就是透 過『交換 PE 』來進行數據轉換。
基本上,LVM 最主要的用處是在實現一個可以彈性調整容量的文件系統上, 而不是在建立一個效 能為主的磁盤上。如果要強調效能與備份,那么就直接使用 RAID 即可, 不需要用到 LVM 啊!
如果你想要保有放大、縮小的本事, 那還請回去使用 EXT 家族最新的 EXT4 文件系統啰!XFS 目前是辦不到的!
什么是 LVM thin Volume 呢?這東西其實挺好玩的,他的概念是:先建立一個可以實支實付、用多 少容量才分配實際寫入多少容量的磁盤容量儲存池 (thin pool), 然后再由這個 thin pool 去產生一個 『指定要固定容量大小的 LV 裝置』,這個 LV 就有趣了!雖然你會看到『宣告上,他的容量可能 有 10GB ,但實際上, 該裝置用到多少容量時,才會從 thin pool 去實際取得所需要的容量』!就 如同上面的環境說的,可能我們的 thin pool 僅有 1GB 的容量, 但是可以分配給一個 10GB 的 LV 裝置!而該裝置實際使用到 500M 時,整個 thin pool 才分配 500M 給該 LV 的意思!當然啦! 在 所有由 thin pool 所分配出來的 LV 裝置中,總實際使用量絕不能超過 thin pool 的最大實際容量啊! 如這個案例說的, thin pool 僅有 1GB, 那所有的由這個 thin pool 建置出來的 LV 裝置內的實際 用量,就絕不能超過 1GB 啊!
其實LVM還有一個重要的能力,那就 是 LV 磁盤的快照 (snapshot)。 什么是 LV 磁盤快照啊?快照就是將當時的系統信息記錄下來,就
好像照相記錄一般! 未來若有任何資料更動了,則原始資料會被搬移到快照區,沒有被更動的區域 則由快照區與文件系統共享。-------其實就是備份。
174.從上面的說明當中,我們可以很清楚的發現兩種工作排程的方式:
? 一種是例行性的,就是每隔一定的周期要來辦的事項;
? 一種是突發性的,就是這次做完以后就沒有的那一種 ( 3C 大降價...)
at :at 是個可以處理僅執行一次就結束排程的指令,
crontab :crontab 這個指令所設定的工作將會循環的一直進行下去!
要使用單一工作排程時(行程表),我們的 Linux 系統上面必須要有負責這個排程的服務,那就是 atd 這個玩 意兒。at:我要在某個時刻干某件事。#服務,所以要+d
由于 at 工作排程的使用上,系統會將該項 at 工作獨立出你的 bash 環境中, 直接交給系統的 atd 程序來接管,因此,當你下達了 at 的工作之后就可以立刻脫機了, 剩下的工作就完全交給 Linux 管 理即可!所以啰,如果有長時間的網絡工作時,嘿嘿! 使用 at 可以讓你免除網絡斷線后的困擾喔!batch使at在cpu不繁忙的時候運行
? /etc/cron.allow:?#at類似。
將可以使用 crontab 的賬號寫入其中,若不在這個文件內的使用者則不可使用 crontab;
? /etc/cron.deny:
將不可以使用 crontab 的賬號記錄到這寫入其中,若未個文件當中的使用者,就可以使用 crontab 。當用戶使用 crontab 這個指令來建立工作排程之后,該項工作就會被紀錄到 /var/spool/cron/ 里面去 了,而且是以賬號來作為判別的喔!舉例來說, dmtsai 使用 crontab 后, 他的工作會被紀錄到 /var/spool/cron/dmtsai 里頭去!但請注意,不要使用 vi 直接編輯該文件, 因為可能由于輸入語法錯 誤,會導致無法執行 cron 喔!另外, cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄 檔中,所以啰,如果你的 Linux 不知道有否被植入木馬時,也可以搜尋一下 /var/log/cron?這個登錄 檔呢
系統的例行性任務在/etc/crontab里,與用戶的例行任務不是一個文件。
cron 這個服務的最低偵測限制是『分鐘』,所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 里面的數據內容
在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工 作事項,但是某些原因或者是其他的 Unix 系統中,由于 crontab 是讀到內存當中的,所以在你修改完 /etc/crontab 之后,可能并不會馬上執行, 這個時候請重新啟動?crond?這個服務吧! 這樣才能加到內存中。#支持脫機
175.一般來說,crond 預設有三個地方會有執行腳本配置文件,他們分別是: #命令套路都一樣。
? /etc/crontab #不同的情況使用不同的crontab方式,也會帶來不同的后果。
? /etc/cron.d/*
? /var/spool/cron/*
個人化的行為使用『 crontab -e 』:如果你是依據個人需求來建立的例行工作排程,建議直接使用 crontab -e 來建立你的工作排程較佳! 這樣也能保障你的指令行為不會被大家看到 (/etc/crontab 是大家都能讀取的權 限喔!);
? 系統維護管理使用『 vim /etc/crontab 』:如果你這個例行工作排程是系統的重要工作,為了讓自己管理方 便,同時容易追蹤,建議直接寫入 /etc/crontab 較佳!
? 自己開發軟件使用『 vim /etc/cron.d/newfile 』:如果你是想要自己開發軟件,那當然最好就是使用全新的配 置文件,并且放置于 /etc/cron.d/ 目錄內即可。
? 固定每小時、每日、每周、每天執行的特別工作:如果與系統維護有關,還是建議放置到 /etc/crontab 中來 集中管理較好。 如果想要偷懶,或者是一定要再某個周期內進行的任務,也可以放置到上面談到的幾個目 錄中,直接寫入指令即可
如果每個流程都在同一個時間啟動的話,那么在某個時段時,我的系統會變的相當的繁忙,所以,這
個時候就必須要分別設定啦!我可以這樣做:
[root@study ~]# vim /etc/crontab
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD4
這時候就得要靠?anacron 這個指令的功能了!在處理非 24 小 時一直啟動的 Linux 系統的 crontab 的執行!這家伙可以?主動幫你進行時間到了但卻沒有執行的排程喔!
為什么隔了一陣子才將 CentOS 開機,開機過后約 1 小時左 右系統會有一小段時間的忙碌!而且硬盤會跑個不停!那就是因為?anacron 正在執行過去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里頭的未進行的各項工作排程啦!
如果你每個周日的需要執行的動作是放置于 /etc/crontab 的話,那么該動作只要過期了就 過期了,并不會被抓回來重新執行。anacron不會去這里運行。
觸發
176.
任何一個事件時,系統都會將他定義成為一個進程,并且給予這個進程一個 ID ,稱為 PID,同時 依據啟發這個進程的用戶與相關屬性關系,給予這個 PID 一組有效的權限設定。』 從此以后,這 個?PID 能夠在系統上面進行的動作,就與這個 PID 的權限有關了!#PID與權限。
177.當 dmtsai 登入后,他取得一個 PID 號碼為 2234 的進程,這個進程的 User/Group 都是 dmtsai ,而當這個程序進行其他作業時,例如上面提到的 touch 這個指令時, 那 么由這個進程衍生出來的其他進程在一般狀態下,也會沿用這個進程的相關權限的!
咦!明明我將有問題的進程關閉了,怎么過一陣子他又自動的產生?肯定有一支父進程存在,所以你殺掉子進程后, 父進程就會主動再生一支!
系統先以 fork 的方式復制一個與父進程相同的暫存進程,這個進程與父進程唯一的差別就是 PID 不同! 但是這個暫存進程還會多一個 PPID 的參數,PPID 如前所述,就是父進程的進程標識符啦! 然后(2)暫存進程開始以 exec 的方式加載實際要執行的程序,以上述圖標來講,新的程序名稱為 qqq , 最終子進程的程序代碼就會變成 qqq 了! 這樣了解乎!
常駐在內存當中的進程,常駐程序 就會被我們稱為:服務 (daemon)。
啟動一個可以負責網絡監聽的端口 (port) ,以提供外部客戶端 (client) 的聯機要求。
以 crontab 來說,他的主要執行程序名稱應該是 cron 或 at 才對,為啥要加個 d 在 后面?而成為?crond, atd?呢?就是因為 Linux 希望我們可以簡單的判斷該程序是否為?daemon(服務,常駐內存的程序), 所以,一般 daemon 類型的程序都會加上 d 在文件名后頭~包括服務器篇我們會看到的 httpd, vsftpd 等等都是 ^_^。
178.當多人同時登入系統時,其實會感受到整部主機好像就 為了你存在一般! 這就是多人多任務的環境啦!
在 Linux 當中,默認提供了六個文字界面登入窗口,以及一個圖形界面
老實說,?Linux 幾乎可以說絕對不會當機的!因為他可以在任何時 候, 將某個被困住的進程殺掉,然后再重新執行該進程而不用重新啟動!
179要注意的是,放入背景的工作想要 運作時, 他必須不能夠與使用者互動。舉例來說, vim 絕對不可能在背景里面執行 (running) 的! 因為你沒有輸入數據他就不會跑啊! 而且放入背景的工作是不可以使用 [ctrl]+c 來終止的!
如前所述,bash 只能夠管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能夠 將別人的 bash 底下的 job 給他拿過來執行。#各個Bash各管各的,root也不能管別人。
將『目前』的工作丟到背景中『暫停』:[ctrl]-z
[root@study ~]# jobs - -l l
[1]- 14566 Stopped vim ~/.bashrc #-代表倒數第二個放到背景中運行的job
[2]+ 14567 Stopped find / -print # +代表最新放到背景中運行的JOb
fg %number調用后臺中暫停的Job
如果輸入『 fg - 』 則代表將 - 號的那個工作號碼拿出來
bg%number 讓stop的后臺程序running.
&直接在后臺運行。
-9 這個 signal 通常是用在『強制刪除一個不正常的工作』時所使用的, -15 則是 以正常步驟結束一項工作(15 也是默認值)。兩者之間并不相同呦!舉上面的例子來說, 我用 vim 的 時候,不是會產生一個 .filename.swp 的文件嗎? 那么,當使用 -15 這個 signal 時, vim 會嘗試 以正常的步驟來結束掉該 vi 的工作, 所以 .filename.swp 會主動的被移除。但若是使用 -9 這個 signal 時,由于該 vim 工作會被強制移除掉,因此, .filename.swp 就會繼續存在文件系統當中。這 樣您應該可以稍微分辨一下了吧?
kill -9 %jobnumber 殺死job
&是 bash 的背景,并不是放到系統的背景去喔!在工作尚未結束的情況下你脫機了,該工作還會繼續進行嗎?答 案是『否』。脫機代表關閉bash!不會繼續進行,而是會被中斷掉。at 與cron是將工作放置到系統背景, 而與終端機無關。你也可以嘗試使用 nohup 這個指令來處理喔!這個 nohup (disown)可以讓你在脫機或 注銷系統后,還能夠讓工作繼續進行。
Linux命令有內部命令(內建命令)和外部命令之分,內部命令和外部命令功能基本相同,但也有些細微差別。內部命令實際上是shell程序的一部分,其中包含的是一些比較簡單的linux系統命令,這些命令由shell程序識別并在shell程序內部完成運行,通常在linux系統加載運行時shell就被加載并駐留在系統內存中。內部命令是寫在bashy源碼里面的,其執行速度比外部命令快,因為解析內部命令shell不需要創建子進程。比如:exit,history,cd,echo等。
外部命令是linux系統中的實用程序部分,因為實用程序的功能通常都比較強大,所以其包含的程序量也會很大,在系統加載時并不隨系統一起被加載到內存中,而是在需要時才將其調用內存。通常外部命令的實體并不包含在shell中,但是其命令執行過程是由shell程序控制的。shell程序管理外部命令執行的路徑查找、加載存放,并控制命令的執行。外部命令是在bash之外額外安裝的,通常放在/bin,/usr/bin,/sbin,/usr/sbin......等等。可通過“echo $PATH”命令查看外部命令的存儲路徑,比如:ls、vi等。#內部命令沒外部命令強大和復雜,但是調用較快。
我們在操作系統時的各項工作其實都是經過某個 PID 來達成的 (包括你的 bash 環境)
系統整體的進程運作是非常多的,但如果使用?ps -l 則僅列出與你的操作環境 (bash) 有關的進程?而已亦即最上層的父進程會是你自己的 bash 而沒有延伸到 systemd (后續會交待!)
TTY:登入者的終端機位置,若為遠程登錄則使用動態終端接口 (pts/n);除此之外,我們必須要知道的是『僵尸 (zombie) 』進程是什么? 通常,造成僵尸進程的成因是 因為該進程應該已經執行完畢,或者是因故應該要終止了, 但是該進程的父進程卻無法完整的將 該進程結束掉,而造成那個進程一直存在內存當中。 如果你發現在某個進程的 CMD 后面還接上?<defunct> 時,就代表該進程是僵尸進程啦
事實上,通常僵尸進程都已經無法控管,而直接是交給 systemd 這支程序來負責了,偏偏 systemd 是系統第一支執行的程序, 他是所有程序的父程序!我們無法殺掉該程序的 (殺掉他,系統就死 掉了!),所以啰,如果產生僵尸進程, 而系統過一陣子還沒有辦法透過核心非經常性的特殊處理 來將該進程刪除時,那你只好透過 reboot 的方式來將該進程抹去了!
虛擬內存 (Mem/Swap)?再次重申,要注意的是 swap 的使用量要盡量的少!如果 swap 被用的很大量,表示系統的物理內存實在不足!
top 預設使用 CPU 使用率 (%CPU) 作為排序的重點。
所有的進程都是依附在 systemd 這支進程底下的!?仔 細看一下,這支進程的 PID 是一號喔!因為他是由 Linux 核心所主動呼叫的第一支程序!所以 PID 就是一號了。 這也是我們剛剛提到僵尸進程時有提到,為啥發生僵尸進程需要重新啟動? 因為 systemd 要重新啟動,而重新啟動 systemd 就是 reboot 啰!
如果 子進程掛點或者是老是砍不掉子進程時,該如何找到父進程嗎?呵呵!用這個 pstree 就對了!
進程是如何互相管理的呢?其 實是透過給予該進程一個訊號 (signal) 去告知該進程你想要讓她作什么!
kill -1 SIGHUP 啟動被終止的進程,可讓該 PID 重新讀取自己的配置文件,類似重新啟動
kill -9 SIGKILL 代表強制中斷一個進程的進行,如果該進程進行到一半, 那么尚未完成的部分可能會有『半產 品』產生,類似 vim 會有 .filename.swp 保留下來。
kill -15 SIGTERM 以正常的結束進程來終止該進程。由于是正常的終止,?所以后續的動作會將他完成。不過,如 果該進程已經發生問題,就是無法使用正常的方法終止時, 輸入這個 signal 也是沒有用的。
killall -9 httpd(不是pid號)
優先度:PRI 值越低代表越優先的意思。不過這個 PRI 值是由核心動態調整的, 用戶無法直接調整 PRI 值的。
PRI(new) = PRI(old) + nice #通過nice調整優先級,但是核心會動態調整Old系統設定。整個 nice 值是可以在父進程 --> 子進程之間傳遞的 呢!
free命令后后面的 shared/buffers/cached 則是在已被使用的量當中,用來作為緩沖及快取的量,這些 shared/buffers/cached 的用量中,在系統比較忙碌時, 可以被釋出而繼續利用!因此后面就有一個 available (可用的) 數值!
一般來說, swap 最好不要被使用,尤其 swap 最好不要被使用超過 20% 以上, 如果您發現 swap 的用量超過 20% ,那么,最好還是買物理內存來 插吧! 因為, Swap 的效能跟物理內存實在差很多,而系統會使用到 swap , 絕對是因為物理內 存不足了才會這樣做的!如此,了解吧!
由于有 socket file,因此類似 X Window 這種需要透過網絡連接的軟件,目前 新版的 distributions 就以 socket 來進行窗口接口的聯機溝通了。
SELinux 是由美國國家安全局 (NSA) 開發的,當初開發這玩意兒的目的是因為很多企業界發現, 通 常系統出現問題的原因大部分都在于『內部員工的資源誤用』所導致的,實際由外部發動的攻擊反而 沒有這么嚴重。她們便使用 Linux 來作為研究的目標, 最后更 將研究的結果整合到 Linux 核心里面去,那就是 SELinux 啦!所以說,?SELinux 是整合到核心的 一個模塊喔!
SELinux 是在進行進程、文件等細部權限設定依據的一個核心模塊!由于啟動網 絡服務的也是進程,因此剛好也能夠控制網絡服務能否存取系統資源的一道關卡!
這種存取文件系統的方式被稱為『自主式訪問控制 (Discretionary Access Control, DAC)』,基本上, 就是依據進程的擁有者與文件資源的 rwx 權限來決定有無存取的能力。 為 了避免 DAC 容易發生的問題,因此 SELinux 導入了委任式訪問控制 (Mandatory Access Control, MAC) 的方法!我們針對控制的『主體』變成了『進程』而不是使用者喔!這個主體進程也不能任意使用系統文件資源,因為每個文件資源也有針對該主體進程設定可取用 的權限!
? 主體 (Subject) :
SELinux 主要想要管理的就是進程,因此你可以將『主體』跟本章談到的 process 劃上等號;
? 目標 (Object) :
主體進程能否存取的『目標資源』一般就是文件系統。因此這個目標項目可以等文件系統劃上等號;
? 政策 (Policy) :
由于進程與文件數量龐大,因此 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策內還會
有詳細的規則 (rule)?來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 7.x 里面僅有提供三個
主要的政策,分別是:
o targeted:針對網絡服務限制較多,針對本機限制較少,是預設的政策;
o minimum:由 target 修訂而來,僅針對選擇的進程來保護!
o mls:完整的 SELinux 限制,限制方面較為嚴格
主體與目標的安全性 本文必須一致才能夠順利存取。
查閱某個文件系統底下有多少進程正在占用該文件系統--fuser
fuser 是由文件或者裝置去找出使用該文件或裝置的進程,反過來說,如何查出某個進程開啟 或者使用的文件與裝置呢?--lsof
進程與文件之間的關系。
我們前面不是談過主體進程需要經過政策規則、安全本文 比對之后,加上 rwx 的權限規范, 若一切合理才會讓進程順利的讀取文件
Disabled 的 模式,那么 SELinux 將不會運作,當然受限的進程也不會經過 SELinux , 也是直接去判斷 rwx 而 已。那如果是寬容 (permissive) 模式呢?這種模式也是不會將主體進程抵擋 (所以箭頭是可以直接穿 透的喔!),不過萬一沒有通過政策規則,或者是安全本文的比對時, 那么該讀寫動作將會被紀錄起 來 (log),可作為未來檢查問題的判斷依據。 至于最終那個 Enforcing 模式,就是實際將受限主體進入規則比對、安全本文比對的流程,若失敗, 就直接抵擋主體進程的讀寫行為,并且將他記錄下來。 如果通通沒問題,這才進入到 rwx 權限的判 斷喔!
如果改變了政策則需要重新啟動是因為 SELinux 是整合到核心里面去的
SELinux 當初的設計是為了避免使用者資源的誤用,而 SELinux 使用的是 MAC 委任式存取設定系統為了某些功能必須要提供一些服務 (不論是系統本身還是網絡方面),這個服務就稱 為 service 。 但是 service 的提供總是需要程序的運作吧!否則如何執行呢?所以達成這個 service 的程序我們就稱呼他為 daemon 啰!
每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!不 過,無論如何,這些服務的名稱被建立之后,被掛上 Linux 使用時,通常在服務的名稱之后會加上一個 d .這個 d 代表的就是 daemon 的意思
系統核心第一支 呼叫的程序是 init , 然后 init 去喚起所有的系統所需要的服務
/etc/init.d/
init 服務的分類中,依據服務是獨立啟動或被一只總管程序管理而分為兩大類:
o 獨立啟動模式 (stand alone):服務獨立啟動,該服務直接常駐于內存中,提供本機或用戶的服務行
為,反應速度快。
o 總管程序 (super daemon):由特殊的 xinetd 或 inetd 這兩個總管程序提供 socket 對應或 port 對應
的管理。當沒有用戶要求某 socket 或 port 時, 所需要的服務是不會被啟動的。若有用戶要求時,
xinetd 總管才會去喚醒相對應的服務程序。
從 CentOS 7.x 以后,Red Hat 系列的 distribution 放棄沿用多年的 System V 開機啟動服務的流程, 就是前一小節提到的 init 啟動腳本的方法, 改用 systemd 這個啟動服務管理機制
平行處理所有服務,加速開機流程:
舊的 init 啟動腳本是『一項一項任務依序啟動』的模式,因此不相依的服務也是得要一個一個的等待。但
目前我們的硬件主機系統與操作系統幾乎都支持多核心架構了, 沒道理未相依的服務不能同時啟動啊!
systemd 就是可以讓所有的服務同時啟動,因此你會發現到,系統啟動的速度變快了!
? 一經要求就響應的 on-demand 啟動方式:
systemd 全部就是僅有一只 systemd 服務搭配 systemctl 指令來處理,無須其他額外的指令來支持。不像systemV 還要 init, chkconfig, service... 等等指令。 此外, systemd 由于常駐內存,因此任何要求(on-demand) 都可以立即處理后續的 daemon 啟動的任務。還有很多更先進的地方,
systemd是Init的增強版。
systemd 這個啟動服務的機制,主要是透過一只名為 systemctl 的指令來處理的!跟以前 systemV 需要 service / chkconfig / setup / init 等指令來協助不同, systemd 就是僅有 systemctl 這個 指令來處理而已呦!
180.什么是登錄檔?『詳細而確實的分析以及備份系統的登錄文件』就是記錄系統活動信息的幾個文件, 例如:何時、何地 (來源 IP)、何人 (什么服務名稱)、做了什么動作 (訊息登錄啰)。 換句話說就是:記錄系統在什么時候由哪個程序做 了什么樣的行為時,發生了何種的事件等等。
你可以透過 (1)察看屏幕上面的錯誤訊息與 (2) 登錄文件的錯誤信息,幾乎可以解決大部分的 Linux 問題!
登錄檔無非就是一些Log,一般都在某個文件夾下面,
180.開機管理程序可以指定使用哪個核心文件來開機,并實際加載核心到內存當中解壓縮與執行, 此時 核心就能夠開始在內存內活動,并偵測所有硬件信息與加載適當的驅動程序來使整部主機開始運作, 等到核心偵測硬件與加載驅動程序完畢后,一個最陽春的操作系統就開始在你的 PC 上面跑了。MBR 就代表該磁盤的最前面可 安裝 boot loader 的那個區塊就對了!
BIOS (Basic Input Output System)
但由于不同的操作系統他的文件系統格式不相同,因此我們必須要以一個開 機管理程序來處理核心文件加載 (load) 的問題, 因此這個開機管理程序就被稱為 Boot Loader 了。 那這個 Boot Loader 程序安裝在哪里呢?就在開機裝置的第一個扇區 (sector) 內,也就是我們一直談 到的 MBR (Master Boot Record, 主要啟動記錄區)。
那么如果我的主機上面有兩顆硬盤的話, 系統會去哪顆硬盤的最前面區塊讀取 boot loader 呢?這個就得要看 BIOS 的設定了。
你會發現 systemd 的 PID 號碼是一號啦。 systemd 最主要的功能就是準備軟件執行的 環境,包括系統的主機名、網絡設定、語系處理、文件系統格式及其他服務的啟動等。
談完了整個開機的流程,您應該會知道,在整個開機的過程當中,是否能夠成功的驅動我們主機的硬 件配備,?是核心 (kernel) 的工作!由一只程序帶動整個系統的其他程序。
181.在 W 牌的操作系統上面安裝軟件時,不是只要一直給他按 『下一步』 就可以安裝妥當了嗎?話是這樣說沒錯啦,不過,也由于如此,所以在 Windows 系統上面的軟件都 是一模一樣的,也就是說,你『無法修改該軟件的源代碼』,因此, 萬一你想要增加或者減少該軟 件的某些功能時,大概只能求助于當初發行該軟件的廠商了!
linux可以提早自己補漏。
這樣說可以了解 Linux 的優點了嗎?沒錯!因為 Linux 上面的軟件幾乎都是經過 GPL 的授權,所 以每個軟件幾乎均提供源代碼, 并且你可以自行修改該程序代碼,以符合你個人的需求呢!
Linux 系統上真 正認識的可執行文件其實是二進制文件 ( binary program)
gcc-----編譯鏈接。
以除了每個主程序與子程序均需要寫上一筆編譯過程的指令外,還需要 寫上最終的鏈接程序。程序代碼小的時候還好,如果是類似 WWW 服務器軟件 (例如 Apache) , 或者是類似核心的原始碼,動則數百 MBytes 的數據量,編譯指令會寫到瘋掉~這個時候,我們就 可以使用 make 這個指令的相關功能來進行編譯過程的指令簡化了!
當執行 make 時,make 會在當時的目錄下搜尋 Makefile (or makefile) 這個文本文件,而 Makefile 里 面則記錄了原始碼如何編譯的詳細信息! make 會自動的判別原始碼是否經過變動了,而自動更新 執行檔,是軟件工程師相當好用的一個輔助工具呢!
咦!make 是一支程序,會去找 Makefile ,那 Makefile 怎么寫? 通常軟件開發商都會寫一支偵測 程序來偵測用戶的作業環境, 以及該作業環境是否有軟件開發商所需要的其他功能,該偵測程序偵 測完畢后,就會主動的建立這個 Makefile 的規則文件啦!通常這支偵測程序的文件名為 configure 或 者是 config 。
所以同 一套軟件要在不同的平臺上面執行時, 必須要重復編譯!#環境不一樣,所以要重新編譯。所以才需要原始碼嘛!了解乎!
謂的 Tarball 文件,其實就是將軟件的所有原始碼文件先以 tar 打包,然后再以壓縮技術來壓縮, 通常最常見的就是以 gzip 來壓縮了。
編寫hello.c(C語言程序)--gcc -c 編譯生成.o文件(有排錯功能)。----gcc -o 可將多個.o文件鏈接生成.最終文件。然后執行。
進階: ----configure偵測環境生成makefile,然后Make程序再執行makefile。 make是gcc的進階。
如果有一天,你更新了 thanks_2.c 這個文件的內容,則你只要重新編譯 thanks_2.c 來產生新的 thanks_2.o ,然后再以連結制作出新的 binary 可執行文件即可!而不必重新編譯其他沒有更動過的 原始碼文件。
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
# 2. 以新的目標 (clean) 測試看看執行 make 的結果:
[root@study ~]# make clean <==就是這里!透過 make 以 clean 為目標
rm -rf main main.o haha.o sin_value.o cos_value.o
跨平臺就重新編譯一下就可以了。
剛剛我們在 Linux 底下寫的程序『理論上,是可以 在 Windows 上面編譯的!』這就是原始碼的好處啦!所以說,如果朋友們想要學習程序語言的話, 鳥哥個人是比較建議學習『具有跨平臺能力的程序語言』,例如 C 就是很不錯的一個!
gcc 或 cc 等 C 語言編譯程序 (compiler)
源碼安裝,yum安裝與rpm安裝。---一共有三種安裝。
源碼安裝流程:
1. 取得原始檔:將 tarball 文件在 /usr/local/src 目錄下解壓縮;
2. 取得步驟流程:進入新建立的目錄底下,去查閱 INSTALL 與 README 等相關文件內容 (很重要的步驟!);
3. 相依屬性軟件安裝:根據 INSTALL/README 的內容察看并安裝好一些相依的軟件 (非必要);
4. 建立 makefile:以自動偵測程序 (configure 或 config) 偵測作業環境,并建立 Makefile 這個文件;
5. 編譯:以 make 這個程序并使用該目錄下的 Makefile 做為他的參數配置文件,來進行 make (編譯或其他)
的動作;
6. 安裝:以 make 這個程序,并以 Makefile 這個參數配置文件,依據 install 這個目標 (target) 的指定來安
裝到正確的路徑!
make 生成目標文件, make install 執行目標文件然后安裝到指定目錄。 clean是clean這個目標。通常刪除.o。
通常『make clean』代表著將目標文件 (object file) 清除掉,『make』則是將原始碼進行編譯而已。 注 意喔!編譯完成的可執行文件與相關的配置文件還在原始碼所在的目錄當中喔!因此,最后要進行 『make install』來將編譯完成的所有咚咚都給他安裝到正確的路徑去,這樣就可以使用該軟件啦!
!使用 make 就是要將原始碼編譯成為可以被執行的可執行文件,而這個可執行文件會放置在 目前所在的目錄之下, 尚未被安裝到預定安裝的目錄中;make install 通常這就是最后的安裝步驟了,make 會依據 Makefile 這個文件里面關于 install 的項目,將上一個步驟所 編譯完成的數據給他安裝到預定的目錄中,就完成安裝啦!
我們曉得幾乎每個軟件都會提供聯機幫助的服務,那就是 info 與 man 的功能。在預設 的情況下, man 會去搜尋 /usr/local/man 里面的說明文件, 因此,如果我們將軟件安裝在 /usr/local 底下的話,那么自然安裝完成之后, 該軟件的說明文件就可以被找到了。此外,如果你所管理的主 機其實是由多人共同管理的, 或者是如同學校里面,一部主機是由學生管理的,但是學生總會畢業 吧? 所以需要進行交接,如果大家都將軟件安裝在 /usr/local 底下,那么管理上不就顯的特別的容 易嗎!而且找庫也會默認去找的。
靜態函式庫的特色:
? 擴展名:(擴展名為 .a)--升級要重新編譯,庫放到軟件中,較大。
這類的函式庫通常擴展名為 libxxx.a 的類型;
? 編譯行為:
這類函式庫在編譯的時候會直接整合到執行程序當中,所以利用靜態函式庫編譯成的文件會比較大一些喔;
? 獨立執行的狀態:
這類函式庫最大的優點,就是編譯成功的可執行文件可以獨立執行,而不需要再向外部要求讀取函式庫的
內容 (請參照動態函式庫的說明)。
? 升級難易度:
雖然執行檔可以獨立執行,但因為函式庫是直接整合到執行檔中, 因此若函式庫升級時,整個執行檔必須
要重新編譯才能將新版的函式庫整合到程序當中。 也就是說,在升級方面,只要函式庫升級了,所有將此
函式庫納入的程序都需要重新編譯!
? 動態函式庫的特色:
? 擴展名:(擴展名為 .so)---通過指針外面找,文件較小,庫升級不需要重新編譯。
這類函式庫通常擴展名為 libxxx.so 的類型;
? 編譯行為:
動態函式庫與靜態函式庫的編譯行為差異挺大的。 與靜態函式庫被整個捉到程序中不同的,動態函式庫在
編譯的時候,在程序里面只有一個『指向 (Pointer)』的位置而已。也就是說,動態函式庫的內容并沒有被
整合到執行檔當中,而是當執行檔要使用到函式庫的機制時, 程序才會去讀取函式庫來使用。由于執行文
件當中僅具有指向動態函式庫所在的指標而已, 并不包含函式庫的內容,所以他的文件會比較小一點。
? 獨立執行的狀態:
這類型的函式庫所編譯出來的程序不能被獨立執行, 因為當我們使用到函式庫的機制時,程序才會去讀取
函式庫,所以函式庫文件『必須要存在』才行,而且,函式庫的『所在目錄也不能改變』,因為我們的可執
行文件里面僅有『指標』亦即當要取用該動態函式庫時, 程序會主動去某個路徑下讀取,呵呵!所以動態
函式庫可不能隨意移動或刪除,會影響很多相依的程序軟件喔!
? 升級難易度:
雖然這類型的執行檔無法獨立運作,然而由于是具有指向的功能, 所以,當函式庫升級后,執行檔根本不
需要進行重新編譯的行為,因為執行檔會直接指向新的函式庫文件 (前提是函式庫新舊版本的檔名相同喔!)。
函數庫一幫放在/usr/lib64下。
如何將動態函式庫加載高速緩存當中呢?
1. 首先,我們必須要在 /etc/ld.so.conf 里面寫下『 想要讀入高速緩存當中的動態函式庫所在的目錄』,注意
喔, 是目錄而不是文件;
2. 接下來則是利用 ldconfig 這個執行檔將 /etc/ld.so.conf 的資料讀入快取當中;
3. 同時也將數據記錄一份在 /etc/ld.so.cache 這個文件當中吶!
183.軟件管理員:源碼安裝需要編譯安裝(gcc---make)大量的編譯容易報錯。從而引出了rpm。rpm是一些經過編譯的東西,不再需要編譯,有特定的硬軟件要求,不合格安裝不了。可以進行安裝,升級,重建等操作。rpm升級非常麻煩,從而引出了ymp機制,支持通過rpm所建立的數據庫信息,到os共享的服務器上在線批量更新,升級安裝所需軟件的功能。rpm現在已經被yum取代了。優先考慮yum再考慮源碼安裝。
使用的軟件管理機制為 RPM 機制,而用來作為在線 升級的方式則為 yum !
RPM 全名是『 RedHat Package Manager 』。RPM 是以一種數據庫記錄的方式來將你所需要的軟件安裝到 你的 Linux 系統的一套管理機制。
有沒有想過,如果我的 Linux 系統與廠商的系統一模一樣,那么在廠商的系統上面編譯出來的執
行檔, 自然也就可以在我的系統上面跑啰!也就是說,廠商先在他們的系統上面編譯好了我們用戶
所需要的軟件, 然后將這個編譯好的可執行的軟件直接釋出給用戶來安裝--rpm的原理,避開了麻煩的源碼安裝。
客戶端取得這個文件后,只要透過特定的指令來安裝, 那么該軟件文件就會依照內部的 腳本來偵測相依的前驅軟件是否存在,若安裝的環境符合需求,那就會開始安裝。
沒錯!您真聰明!目前新的 Linux 開發商都有提供這樣的『在線升級』機制,透過這個機制, 原版
光盤就只有第一次安裝時需要用到而已,其他時候只要有網絡,你就能夠取得原本開發商所提供的任
何軟件了呢! 在 dpkg 管理機制上就開發出 APT 的在線升級機制,RPM 則依開發商的不同,有
Red Hat 系統的 yum , SuSE 系統的 Yast Online Update (YOU) 等。---升級也不用編譯了。
rpm的好處:
1. 由于已經編譯完成并且打包完畢,所以軟件傳輸與安裝上很方便 (不需要再重新編譯);
2. 由于軟件的信息都已經記錄在 Linux 主機的數據庫上,很方便查詢、升級與反安裝
該軟件文件幾乎只能安裝在原本默認的硬件與操作系統版本中。
舉例來說,rp-pppoe 這個 ADSL 撥接軟件,他必須要在 ppp 這個軟件存在的環境下才能進行安裝!
有時候CentOS 6.x 的 RPM 文件就無法直接套用在 CentOS 7.x !
rpm要注意的問題:
1. 軟件文件安裝的環境必須與打包時的環境需求一致或相當;
2. 需要滿足軟件的相依屬性需求;
3. 反安裝時需要特別小心,最底層的軟件不可先移除,否則可能造成整個系統的問題!
那怎么辦?如果我真的想要安裝其他 distributions 提供的好用的 RPM 軟件文件時? 呵呵!還好,
還有 SRPM 這個東西!SRPM 是什么呢?顧名思義,他是 Source RPM 的意思,也就是這個 RPM 文
件里面含有原始碼哩!特別注意的是,這個 SRPM 所提供的軟件內容『并沒有經過編譯』, 它提供
的是原始碼喔!
為何說 CentOS 是『社群維護的企業版』呢? Red Hat 公司的 RHEL 釋出后,連帶
會將 SRPM 釋出。 社群的朋友就將這些 SRPM 收集起來并重新編譯成為所需要的軟件,再重復釋出成為 CentOS,
所以才能號稱與 Red Hat 的 RHEL 企業版同步啊!真要感謝 SRPM 哩!如果你想要理解 CentOS 是如何編譯一
支程序的, 也能夠透過學習 SRPM 內含的編譯參數,來學習的啊!
在安裝的過程中, RPM 會去檢驗 一下數據庫里面是否已經存在相關的軟件了, 如果數據庫顯示不存在,那么這個 RPM 文件『預設』
就不能安裝。呵呵!沒有錯,這個就是 RPM 類型的文件最為人所詬病的『軟件的屬性相依』問題 啦!
那想一想,要是我將這些相依屬性的軟件先列表, 在有要安裝軟件需求的時候,先到
這個列表去找,同時與系統內已安裝的軟件相比較,沒安裝到的相依軟件就一口氣同時安裝起來, 那
不就解決了相依屬性的問題了嗎?有沒有這種機制啊?有啊!那就是 YUM 機制的由來!
yum 就可以直接用來進行安裝的動作,基本上 rpm 這個指 令真的就只剩下查詢與檢驗的功能啰! 所以,查詢與檢驗還是要學的,至于安裝,透過 yum 就好了!
若環境檢查合格了,那么 RPM 文件就開始被安裝到你的 Linux 系統上。安裝完畢后,該軟件相關的信息就會被寫入 /var/lib/rpm/ 目錄下的數據庫文件中了。 上面這個目錄內的數據很重要喔!因為未來如果我們有任何軟件升級的需求,版本之間的比較就是來自于這個數據庫, 而如果你想要查詢系統已經安裝的軟件,也是從這里查詢的!同時,目前的 RPM 也提供數字簽名信息, 這些數字簽名也是在這個目錄內記錄的呢!所以說,這個目錄得要注意不要被刪除了啊!
rpm安裝,升級。
在查詢的部分,所有的參數之前都需要加上 -q 才是所謂的查詢!查詢主要分為兩部分, 一個是查 已安裝到系統上面的的軟件信息,這部份的信息都是由 /var/lib/rpm/ 所提供。
如果我誤砍了某個重要文件,例如 /etc/crontab,偏偏不曉得他屬于哪一個軟件,該怎么辦?通過rpm命令解決。
rpm軟件包安裝需要數字簽名 (digital signature)。
RPM 反安裝(卸載)與重建數據庫(出問題的時候可用)。
要注意的是,『解安裝的過程一定要由最上層往下解除』。
從范例一我們知道 pam 所提供的函式庫是讓非常多其他軟件使用的,因此你不能移除 pam ,除非 將其他相依軟件一口氣也全部移除!你當然也能加 --nodeps 來強制移除, 不過,如此一來所有會用 到 pam 函式庫的軟件,都將成為無法運作的程序。
我們想要使用 yum 的功能時,必須要先找到適合的 yum server 才行啊!
事實上 CentOS 在釋出軟件時已經制作出多部映像站臺 (mirror site) 提供全世界的軟件更新之用。 所以,理論上我們不需要處理任何設定值,只要能夠連上 Internet ,就可以使用 yum 啰!
,似乎不需要 rpm 這個指令也能夠快樂的安裝所有的軟件了! 雖然是如 此,但是 yum 畢竟是架構在 rpm 上面所發展起來的,所以,鳥哥認為你還是得需要了解 rpm 才行! 不要學了 yum 之后就將 rpm 的功能忘記了呢!切記切記!
優先選擇rpm安裝,然后選擇源碼安裝。
自己制作RPM.
SRPM 最大的優點就是可以讓使用者自行修改設定參數 (makefile/configure 的參數) ,以 符合使用者自己的 Linux 環境;
RPM 軟件的屬性相依問題,已經可以藉由 yum 或者是 APT 等方式加以克服。
184.X windows系統包括xserver和xclient(包括Manager,其主要功能為控制多個client)兩個主要模塊。全部裝在linux服務器上。server負責控制顯示器等等的配置。client負責描繪數據傳輸到server進行展示。x windows系統不是一個操作系統,只是一個軟件集合。多個client能夠展示很多軟件。
在 Linux 上頭的圖形接口我們稱之為 X Window System,簡稱為 X 或 X11 啰! 為何稱之為系統呢?這是因為 X 窗口 系統又分為 X server 與 X client ,既然是 Server/Client (主從架構) 這就表示其實 X 窗口系統是可以跨網絡且跨平臺的!X 窗口系統對于 Linux 來說僅是一個軟件。
? 在 Unix Like 上面的圖形用戶接口 (GUI) 被稱為 X 或 X11;
? X11 是一個『軟件』而不是一個操作系統;
? X11 是利用網絡架構來進行圖形接口的執行與繪制;
? 較著名的 X 版本為 X11R6 這一版,目前大部分的 X 都是這一版演化出來的 (包括 X11R7);
? 現在大部分的 distribution 使用的 X 都是由 Xorg 基金會所提供的 X11 軟件;
? X11 使用的是 MIT 授權,為類似 GPL 的開放原始碼授權方式。
其中 X Server 在管理硬件,
而 X Client 則是應用程序。
X Server 的重點就是在管理客戶端的硬件,包括接受鍵盤/鼠標等設備的 輸入信息, 并且將圖形繪制到屏幕上 (請注意上圖的所有組件之間的箭頭指示)。
遠程服務器提供的是 X client 軟件啊!
包括鍵盤、鼠標、手寫板、顯示器 (monitor) 、屏幕分辨率與顏色深度、顯 示適配器 (包含驅動程序) 與顯示的字型等等,都是 X Server 管理的。
X Server 的主要功能就是 在管理『主機』上面的顯示硬件與驅動程序。--有自己的驅動要配置,與Linux不一定相同。
每部客戶端主機都需要安裝 X Server,而服務器端則是提供 X Client 軟件, 以 提供客戶端繪圖所需要的數據數據。
每個 X Client 并不知道其他 X Client 的存在, 意思 是說,如果有兩個以上的 X client 同時存在時,兩者并不知道對方到底傳了什么數據給 X Server , 因此 X Client 的繪圖常常會互相重迭而產生困擾喔!
X Client 不需要知道 X Server 的硬件配備與操作系統!
X client 彼此不知道對方在屏幕的哪個位置啊!為了克服這個問題,因此就有 ,Window Manager (WM, 窗口管理員) 的產生了。 窗口管理員也是 X client ,只是他主要在負責全部 。
X client 的控管,還包括提供某些特殊的功能,例如:
? 提供許多的控制元素,包括任務欄、背景桌面的設定等等;
? 管理虛擬桌面 (virtual desktop);
? 提供窗口控制參數,這包括窗口的大小、窗口的重迭顯示、窗口的移動、窗口的最小化等等。
這兩個窗口管理員上面還有提供非常多的 X client 軟件, 包括辦公室生產力軟件 (Open Office) 以及常用的網絡功能 (firefox 瀏覽器、 Thunderbird 收發信件軟件) 等。
X server/X client/Window Manager 是同時存在于我們一部 Linux 主機上頭的 啦!
184.核心主要管理系統的硬件,啟動操作系統必須要有核心的支持,但是里面只有常用的功能,不常用的功能都變成了模塊,需要時調用。如果你有需要可以重新編譯核心。核心經過編譯后才能到內存中被操作系統識別。
如果你想要 將你的 Linux 安裝到 USB 隨身碟、想要將你的 Eee PC 小筆電安裝自己的 Linux , 想讓你的 Linux 可以驅動你的小 家電,此時,核心編譯就是相當重要的一個任務了!
你想要讓計算機 進行的工作,都必須要『核心有支持』才可以!
這個核心文件通常被放置成 /boot/vmlinuz-xxx
.亦即是將一 些不常用的類似驅動程序的咚咚獨立出核心,編譯成為模塊,然后, 核心可以在系統正常運作的過 程當中加載這個模塊到核心的支持。驅動程序就是模塊。
核心其實是一個文件.為什么會是一個文件呢?是經過核心編譯的!變成文件放到主存中。
核心是操作系統中最早被加載到內存的咚咚。
Kernel 可以隨時、隨各人喜好而更動。
核心的主要工作是在控制硬件!。
185.LINUX命令格式: command 選項 參數
選項是 -h 或者全稱 --help
186
如果要我們一個一個的去檢查這些模塊的主要信息,然后定義出他們的相依性, 我們可能會瘋掉吧!所以說,我們的 Linux 當然會提供一些模塊相依性的解決方案啰~ 對啦!那就是檢查 /lib/modules/$(uname -r)/modules.dep?這個文件啦!
[root@study ~]# depmod [- - Ane]
選項與參數:
-A :不加任何參數時, depmod 會主動的去分析目前核心的模塊,并且重新寫入
/lib/modules/$(uname -r)/modules.dep 當中。若加入 -A 參數時,則 depmod
會去搜尋比 modules.dep 內還要新的模塊,如果真找到新模塊,才會更新。
使用?lsmod?之后,系統會顯示出目前已經存在于核心當中的模塊,顯示的內容包括有:
? 模塊名稱(Module);
? 模塊的大小(size);
? 此模塊是否被其他模塊所使用 (Used by)。
模塊其實真的有相依性喔!舉上表為例,nf_conntrack 先被加載后,nf_conntrack_ftp 這個
模塊才能夠進一步的加載系統中!
這個?modinfo?除了可以『查閱在核心內的模塊』之外,還可以檢查『某個模塊文件』,
好了,如果我想要自行手動加載模塊,又該如何是好?有很多方法啦,最簡單而且建議的,是使用?modprobe這個指令來加載模塊,這是因為 modprobe 會主動的去搜尋?modules.dep?的內容,先克 服了模塊的相依性后,再加載模塊到核心之中。
[root@study ~]#?modprobe vfat #加載,不需要完整路徑名,因為modules.dep中有的。
# 很方便吧!不需要知道完整的模塊文件名,這是因為該完整文件名已經記錄到
# /lib/modules/`uname -r`/modules.dep 當中的緣故啊!如果要移除的話:
[root@study ~]#?modprobe - - r vfat#在核心中刪除模塊。
核心就是一個文件。是有源碼編譯來的,放到內存中,然后才能運行操作系統。
其實核心就是系統上面的一個文件而已, 這個文件包含了驅動主機各項硬 件的偵測程序與驅動模塊。
因為一部主機上面可以擁有多個核 心文件,只是開機的時候僅能選擇一個來加載而已。
這個核心文件通常被放置成 /boot/vmlinuz-xxx
/lib/modules/$(uname -r)/kernel/放置核心源碼。模塊什么的也放在這里。
剛剛上面談到的核心其實是一個文件,那么這個文件怎么來的?當然是透過原始碼 (source code) 編 譯而成的啊!因為核心是直接被讀入到主存儲器當中的,所以當然要將他編譯成為系統可以認識的數 據才行!
一 般入門的使用者,基本上, 不太需要編譯核心
重新編譯核心的最主要目的是『想讓系統變的更穩!』
/usr/src/kernels/下面是核心源碼。和很多的模塊。
make clean 僅會刪除類似目標文件之類的編譯過程產生的中間文件,而不會刪除配置文件! 比如.o文件。
make mrproper 請注意,這個動作會將你以前進行過的核心功能選擇文件也刪除掉,
既然我們是第一次進行編譯,因此,請下達『make mrproper』 吧!
如果你需要更加強大的核心功能則需要編譯核心,如果你需要更加強大的模塊功能,則重新編譯模塊。
.ko。模塊后綴。
核心、核心模塊。
/dev/shm/ 目錄,其實是利用內存虛擬出來的磁盤空間,通常是總物理內存的一半! 由于
是透過內存仿真出來的磁盤,因此你在這個目錄底下建立任何數據文件時,訪問速度是非常快速的!
/proc 這個掛載點,但是里面的東西都是0 ,不要緊張! /proc 的東西都是 Linux 系統所需要加載的系統數據,而且是掛載在『內存當中』
的, 所以當然沒有占任何的磁盤空間啰!
/pro 掛載在內存中,所以df -ah顯示為0.
/dev/shm是內存虛擬出來的磁盤空間,通常是內存的一半,訪問速度極快,
由于 df 主要讀取的數據幾乎都是針對一整個文件系統,因此讀取的范圍主要是在 Superblock 內的
信息, 所以這個指令顯示結果的速度非常的快速!
與 df 不一樣的是,du 這個指令其實會直接到文件系統內去搜尋所有的文件數據,
df訪問superblock達到列出整個文件系統的顯示,du遍歷整個文件系統 從而達到顯示容量
磁盤busy?『離開該文件系統的掛載點』
第一欄:磁盤裝置文件名/UUID/LABEL name:
這個字段可以填寫的數據主要有三個項目:
? 文件系統或磁盤的裝置文件名,如 /dev/vda2 等
? 文件系統的?UUID 名稱,如 UUID=xxx
? 文件系統的?LABEL 名稱,例如 LABEL=xxx
開機MOUNT注意Linux很可能將無法順利開機完成!所以請務必要測試測試喔!
/etc/fstab 是開機時的配置文件,不過,實際 filesystem 的掛載是記錄到 /etc/mtab 與?/proc/mounts這兩個文件當中的。
你在 /etc/fstab 輸入的數據錯誤,導致無法順利開機成功,而進入單人維護模式當中,那時候的/ 可是 read only 的狀態,當然你就無法修改 /etc/fstab ,也無法更新?/etc/mtab 與/proc/mounts 都是記錄信息,后者記錄的是私有Namespace不然都在mtab中就混亂了。
cpu-靜態隨機存取內存(Static Random Access Memory?)-動態隨機存取內存(Dynamic?Random Access Memory, DRAM)
BIOS(Basic Input Output System)是一套程序,這套程序是寫死到主板上面的一個內存芯片中, 這個內存芯片在沒有通電時也能夠將數據記錄下來,那就是只讀存儲器(Read OnlyMemory, ROM)。因為ROM不可更改,所以現在BIOS通常放在閃存或者EEPROM中。
BIOS 就是一個韌體, BIOS雖然對于我們日常操作計算機系統沒有什么太大的關系,但是他卻控制著開機時各項硬件參數的取得!所以我們會知道很多的硬件上頭都會有 ROM 來寫入韌體這個軟件。
因此 BIOS 程序代碼也可能需要作適度的修改才行,所以你才會在很多主板官網找到 BIOS 的更新程序啊!但是 BIOS 原本使用的是無法改寫的 ROM ,因此根本無法修正 BIOS 程序代碼!為此,現在的 BIOS 通常是寫入類似閃存 (flash) 或 EEPROM (注 13) 中。
SATA與SAS型磁盤插口。
SSD就是拿閃存(ROM)做磁盤。
由于CMOS的記錄要電,所以主板上才有電池。
CMOS記錄機器的基本配置信息,里面有一個叫BIOS的程序,開機時,啟動BIOS讀取CMOS,然后調動開機程序啟動機器。BIOS也可以修改CMOS里面的數據。
因為所謂的 Linux 版本指的應該是核心版本,centos6.3指的是distribution版本。
因為每個 Linux distributions 使用的 kernel 都是?http://www.kernel.org?所釋出的
redhat以rpm來管理。有些distribution不以rpm來管理。
因為CentOS是抓RHEL的原始碼來重新兜起來的一個Linux distribution,所以號稱兼容于RHEL。
基礎學好了,其他的部份大概找個keyword ,再 google 一下,一大堆數據就可以讓你去分析判斷了!
/dev/sda, /dev/sdb,/dev/sdc, 及 /dev/sdd 這四個文件
如果你插在SATA1和SATA5,但是根據 Linux 核心偵測到磁盤的順序來標注sda.sdb。
以前磁盤狀況:
磁盤(比如sda,vg1)第一個扇區 512bytes 會有這兩個數據:
? 主要啟動記錄區(Master Boot Record, MBR):可以安裝開機管理程序的地方,有 446 bytes
? 分區表(partition table):記錄整顆硬盤分區的狀態,有 64 bytes
分區槽的最小單位『通常』為磁柱(cylinder),1-100磁柱為sda1。
為什么要分區?對安全和性能都有影響。
延伸分區的目的是使用額外的扇區來記錄分區信息。(下面在p1和L1上有記錄信息)
? P1:/dev/sda1
? P2:/dev/sda2
? L1:/dev/sda5
? L2:/dev/sda6
? L3:/dev/sda7
? L4:/dev/sda8
? L5:/dev/sda9
怎么裝置文件名沒有/dev/sda3 與/dev/sda4 呢?因為前面四個號碼都是保留給 Primary 或Extended 用的嘛!
BIOS 會依據使用者的設定去取得能夠開機的硬盤, 并且到該硬盤里面去讀取第一個扇區的 MBR 位置。 MBR 這個僅有 446 bytes的硬盤容量里面會放置最基本的開機管理程序。這個開機管理程序的目的是在加載(load)核心文件。
由于開機管理程序是操作系統在安裝的時候所提供的,所以他會認識硬盤內的文件系統格式,因此就能夠讀取核心文件, 然后接下來就是核心文件的工作,開機管理程序與 BIOS 也功成圓滿,將之后的工作就交給大家所知道的操作系統啦!
1. BIOS:開機主動執行的韌體,會認識第一個可開機的裝置;
2. MBR:第一個可開機裝置的第一個扇區內的主要啟動記錄區塊,內含開機管理程序;
3. 開機管理程序(boot loader):一支可讀取核心文件來執行的軟件;
4. 核心文件:開始操作系統的功能...
boot loader 的主要任務有底下這些項目:
? 提供選單:用戶可以選擇不同的開機項目,這也是多重引導的重要功能!
? 載入核心文件:直接指向可開機的程序區段來開始操作系統;
? 轉交其他 loader:將開機管理功能轉交給其他 loader 負責。
開機管理程序除了可以安裝在 MBR 之外, 還可以安裝在每個分區槽(sda1,sda2)的啟動扇區(boot sector)喔!
Windows 在安裝的時候,他的安裝程序會主動的覆蓋掉 MBR 以及自己所在分區槽的啟動扇區,你沒有選擇的機會, 而且他沒有讓我們自己選擇選單的功能。--裝兩個系統要注意。
UEFI BIOS是以前BIOS的進階。
USB:windows 概念下的掛載。
一個分區內有一個細節壞掉,那整個分區可能都會GG
標準分區與LVM同級別。
swap 是當物理內存容量不夠用時,可以拿這個部份來存放內存中較少被使用的程序項目。是拿硬盤虛擬的內存。
MSDOS(MRT)---->GPT磁盤分區表。
『KDUMP』項目,這個項目主要在處理,當 Linux 系統因為核心問題導致的當機事件時, 會將該當機事件的內存內數據儲存出來的一項特色!
如果你有需要的話,也可以啟動它! 若不需要,也能夠關閉它,對系統的影響似乎并不太大。--LINUX核心人員操作的。
p1p1, em1 等等比較特殊的網卡代號! 這是因為新的設計中,它是以網卡安插的插槽來作為網卡名稱的由來。
目前的主流是BIOS+MRB
文本模式登入后所取得的程序被稱為殼(Shell)---殼程序,各種各樣的程序。
空格是很重要的特殊字符!隔開命令,選項和參數。
『第一個被輸入的數據絕對是指令或者是可執行的文件』!
指令之后的選項除了前面帶有減號『-』之外,某些特殊情況下,選項或參數前面也會帶有正號『+』的情況!
選項/參數的補齊需要安裝一個軟件。
先按著[Ctrl]不放,且再按下 c 按鍵,是組合按鍵), 那就是中斷目前程序的按鍵啦!
ctrl+d 相當于exit,結束文字接口輸入。
重啟系統執勤的操作:sync,將有些在內存中運行沒有放到硬盤中的數據放到硬盤中,因為硬盤與內存間的交互很浪費時間,不可能時時寫入。
以前 shutdown 后面一定得要加時間參數才行,如果沒有加上的話,系統會跳到單人維護模式中
上面談到的 halt, poweroff, reboot, shutdown 等等,其實都是呼叫這個 systemctl 指令的喔!
ssh是pts,實際終端是tty
當你對一個文件具有 w 權限時,你可以具有寫入/編輯/新增/修改文件的內容的權限, 但并不具備有刪除該文件本身的權限!對于文件的 rwx 來說, 主要都是針對『文件的內容』而言。
目錄主要的內容在記錄文件名列表,目錄只是記錄文件名和其詳細信息而已。目錄沒有r就不能讀取文件的詳細信息,只能讀取文件名。
對一般文件來說,rwx 主要是針對『文件的內容』來設計權限,對目錄來說,rwx 則是針對『目錄內的文件名列表』來設計權限。X就是進入目錄的鑰匙。
文件數據的mv只需要r就可以。
正規文件包括數據文件,二進制文件和可讀文件。
具有『可執行的權限』以及『具有可執行的程序代碼』是兩回事!
FHS 的重點在于規范每個特定的目錄下應該要放置什么樣子的數據而已。
root 在 Linux 里面的意義真的很多很多
/bin 放置的是在單人維護模式下還能夠被操作的指令。 在/bin底下的指令可以被root與一般賬號所使用
/boot這個目錄主要在放置開機會使用到的文件
/dev在 Linux 系統上,任何裝置與接口設備都是以文件的型態存在于這個目錄當中的
/etc系統主要的配置文件幾乎都放置在這個目錄內
/lib 放置的則是在開機時會用到的函式庫, 以及在/bin 或/sbin 底下的指令的呼叫的函式庫而已
tty與pts。直接文字終端顯示器接入是tty。其他基本上都是pts。
Login-shell與non-login-shell。前者需要完整的登錄驗證,比如說直接文字終端登錄,xshell登錄。后者是圖形界面登錄,su oracle。
Login shell的流程:/etc/profile及其衍生文件,~/.bash_profile及其衍生文件。
non-login-shell:只會讀取~/.bash_profile的衍生文件。
su - 會去讀取bash_profile及其衍生物。
185:grep,awk,sed的運作機制。
grep 以行為單位進行抓取分析。
awk: awk [-參數 變量] 'BEGIN{初始化}條件類型1{動作1}條件類型2{動作2}。。。。END{后處理}'
其中:BEGIN和END中的語句分別在開始讀取文件(in_file)之前和讀取完文件之后發揮作用,可以理解為初始化和掃尾。
1. 讀入第一行,并將第一行的資料填入 $0, $1, $2.... 等變數當中;
2. 依據 "條件類型" 的限制,判斷是否需要進行后面的 "動作";
3. 做完所有的動作與條件類型;
4. 若還有后續的『行』的數據,則重復上面 1~3 的步驟,直到所有的數據都讀完為止。
sed:以行為單位進行操作。
187.yum server提供 centosplus, cloud, extras, fasttrack, os, updates 等軟件庫
最重要的特色就是那個『 repodata 』的目錄!該目錄就是分析 RPM 軟件后所產生的軟件屬性相依數據放置處!因此,當你要找軟件庫所在網址時, 最重要的就是該網址底下一定要有個名為 repodata 的目錄存在!那就是軟件庫的網址了!
1.需要訪問外網才能訪問阿里云等這些yum源網站。內網只能訪問自己的yum源。
2.yum配置文件是/etc/yum.conf可進行多個屬性配置。
3.訪問設置為/etc/yum.d.repo/....
4.redhat yum 要錢。
[root@study ~]# yum [option] [ 查 詢 工作 項 目 ] [ 相 關參數] ]
選項與參數:
[option]:主要的選項,包括有:
-y :當 yum 要等待用戶輸入時,這個選項可以自動提供 yes 的響應;
--installroot=/some/path :將該軟件安裝在 /some/path 而不使用默認路徑
[查詢工作項目] [相關參數]:這方面的參數有:
search :搜尋某個軟件名稱或者是描述 (description) 的重要關鍵字; 去yum server找。
list :列出目前 yum 所管理的所有的軟件名稱與版本,有點類似 rpm -qa;
info :同上,不過有點類似 rpm -qai 的執行結果;
provides:從文件去搜尋軟件!類似 rpm -qf 的功能!
[base]:代表軟件庫的名字!中括號一定要存在,里面的名稱則可以隨意取。但是不能有兩個相同的軟件庫
名稱, 否則 yum 會不曉得該到哪里去找軟件庫相關軟件列表文件。
? name:只是說明一下這個軟件庫的意義而已,重要性不高!
? mirrorlist=:列出這個軟件庫可以使用的映射站臺,如果不想使用,可以批注到這行;
? baseurl=:這個最重要,因為后面接的就是軟件庫的實際網址! mirrorlist 是由 yum 程序自行去捉映像站
臺, baseurl 則是指定固定的一個軟件庫網址!我們剛剛找到的網址放到這里來啦!
? enable=1:就是讓這個軟件庫被啟動。如果不想啟動可以使用 enable=0 喔!
? gpgcheck=1:還記得 RPM 的數字簽名嗎?這就是指定是否需要查閱 RPM 文件內的數字簽名!
? gpgkey=:就是數字簽名的公鑰文件所在位置!使用默認值即可
y所有軟件庫數據都刪除!
范例一:刪除已下載過的所有軟件庫的相關數據 (含軟件本身與列表)
[root@study ~]#yum clean all
#yum只修改URL不改名字會起沖突。
如果想要讓 groupinstall 預設安裝好所有的 optional 軟件呢?那就得要修改配置文件!更改選groupinstall 選擇的軟件項目即可!如下所示:
[root@study ~]# vim /etc/yum.conf
.....(前面省略).....
distroverpkg=centos-release # 找到這一行,底下新增一行!
group_package_types=default, mandatory, optional
https://dl.fedoraproject.org/pub/epel/7/x86_64/#滿足不足的軟件倉庫。
yum -- enablerepo=epel install netcdf R
188.直接輸入 ifconfig 就會列出目前已經被啟動的卡,而如果是輸入 ifconfig eth0,則僅會秀出這張接口的相關數據,而不管該接口是否有啟動。
2.2.5 MTU 最大傳輸單位:一般網絡上所有機器默認1500.一個封包越大,拆解越小,帶寬越高。
ifconfig命令后面接選項和參數能夠直接修改網絡配置。
ifconfig etum repolist all
[root@study ~]# yum clean [packages|headers|all]
選項與參數:
packages:將已下載的軟件文件刪除
headers :將下載的軟件文件頭刪除#就是yum數據列表里的數據
all :將h0:0 192.168.50.50#一個網卡上設置多個IP,可以一個作為內網IP,一個作為外網IP。
[root@www ~]# /etc/init.d/network restart
# 剛剛設定的數據全部失效,會以 ifcfg-ethX 的設定為主!
如果是要直接以配置文件, 亦即是在 /etc/sysconfig/network-scripts 里面的 ifcfg-ethx 等檔案的設定參數來啟動的話, 那就得要透過 ifdown 或 ifup 來達成了。
# Flags :共有多個旗標可以來表示該網域或主機代表的意義:
# U:代表該路由可用;
# G:代表該網域需要經由 Gateway 來幫忙轉遞;
# H:代表該行路由為一部主機,而非一整個網域;
萬一我們要傳送的封包目的地 IP 不在路由規則里面,那么就會將封包傳送到『default』所在的那個路由規則去,也就是 192.168.0.254 那個 Gateway 喔!因為在最后一行啊。
局域網內主機連接外網的方式:1.每臺主機自己撥號管理,不好統一管理,適合家庭用戶。2.專門設置一臺IP分享器,便于管理,例如DCN。
linux服務器當做簡單的硬件防火墻
dmesg | grep -in eth查詢網卡信息,全雙工所以來回500M!
? /etc/init.d/network restart
這個 script 最重要!因為可以一口氣重新啟動整個網絡的參數! 他會主動的去讀取所有的網絡配置文件,所以可以很快的恢復系統默認的參數值。
盡量不要用networkManager。
GATEWAY:代表的是『整個主機系統的 default gateway』,?所以,設定這個項目時,請特別留意!不要有重復設定的情況發生喔!也就是當你有 ifcfg-eth0, ifcfg-eth1.... 等多個檔案,只要在其中一個檔案設定 GATEWAY 即可
/etc/hosts中配置的hostname是dns解析用的
/etc/sysconfig/network是你的真正的hostname
主機服務很多需要HOSTNAME所以你再ping過hostName后必須重啟
DHCP只需要在ifcfg-eh0中設置一小部分。
因為 ppp0 撥接成功后, ISP 會主動的給予 ppp0 接口一個可以連上 Internet 的 defaultgateway , 如果你又設定另一個 default gateway ,兩個網關可能會造成你的
網絡不通喔!
ip :復合式的指令:里面有route,ifconfig,ifdown,ifup幾個命令結合。
如果以 ifconfig eth0 .... 來設定或者是修改了網絡接口后, 那就無法再以ifdown eth0 的方式來關閉了!因為 ifdown 會分析比對目前的網絡參數與ifcfg-eth0 是否相符,不符的話,就會放棄該次動作。因此,使用 ifconfig 修改完畢后,應該要以 ifconfig eth0 down 才能夠關閉該接口喔
路由順序:根據路由表從上到下。最后到默認路由。
[root@www ~]# route del -net 169.254.0.0 netmask 255.255.0.0?dev eth0#網關不通的時候寫dev
# 上面這個動作可以刪除掉 169.254.0.0/16 這個網域!
# 請注意,在刪除的時候,需要將路由表上面出現的信息都寫入
# 包括 netmask , dev 等等參數喔!注意注意
linux網絡偵錯命令
linux網絡代理文件。---TCP協議之類的文件形式
tcpdump文字接口,wireshark是圖形接口。
靜態路由與動態路由。
< 取代鍵盤輸入。
現在的分區通常使用扇區為最小分區單位,磁盤分區完畢后還需要進行格式化(format),之后操作系統才能夠使用這個文件系統。
這些技術可以將一個分區槽格式化為多個文件系統(例如 LVM),也能夠將多個分區槽合成一個文件系統(LVM, RAID)!
較新的操作系統的文件數據除了文件實際內容外, 通常含有非常多的屬性,例如 Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、群組、時間參數等)。 文件系統通常會將這兩部份的數據分別存放在不同的區塊,權限與屬性放置到inode 中,至于實際數據則放置到 data block 區塊中。
每個文件都會占用一個 inode ,inode 內則有文件數據放置的 block 號碼。
掛載點一定是目錄,該目錄為進入該文件系統的入口。
1個磁盤可以對應多個分區,分區與文件系統可以是1對多,1對1,多對1,多對多。
硬鏈接與CP的區別。前者指向同一個inode,修改其中一個,另一個也會變。
硬鏈接與軟連接:前者連到同一個inode與block,刪掉一個,另一個繼續指向。軟連接只是新建一個Inode與block,然后指向原inode,原文件刪掉就指向不了了。
目錄不支持硬鏈接,因為如果目錄下的所有文件都建立硬鏈接相當復雜。
硬鏈接與bind-mount的區別:
1.mount --bind連接的兩個目錄的inode號碼并不一樣,只是被掛載目錄的block被屏蔽掉,inode被重定向到掛載目錄的inode(被掛載目錄的inode和block依然沒變)
2.兩個目錄的對應關系存在于內存里,一旦重啟掛載關系就不存在了
其實 + 代表最近被放到背景癿工作號碼, - 代表最近最后第二個被放置到背景中癿工作號碼。 而超過
最后第三個以后癿工作,就丌會有 +/- 符號存在了!
一般一個核心一個線程。
CPU 每次能夠處理的數據量稱為字組大小(word size),字組大小依據 CPU 的設計而有 32 位與 64 位。 我們
現在所稱的計算機是 32 或 64 位主要是依據這個 CPU 解析的字組大小而來的!
關于 CPU 的頻率部分:外頻指的是 CPU 與外部組件進行數據傳輸時的速度,倍頻則是 CPU 內部用來加速
工作效能的一個倍數, 兩者相乘才是 CPU 的頻率速度;
Unix 的前身是由貝爾實驗室(Bell lab.)的 Ken Thompson 利用匯編語言寫成的, 后來在 1971-1973 年間由
Dennis Ritchie 以 C 程序語言進行改寫,才稱為 Unix
linux與linux distribution.
redhat與centos 只有服務的區別。
centos與ubuntun的區別,軟件,rpm,用的核心可能不一樣,其他的標準什么的幾乎都一樣。
一般要求 swap 應該要是 1.5~2 倍的物理內存量,但即使沒有 swap 依舊能夠安裝與運作 Linux 操作系統;
info page 可將一份說明文件拆成多個節點(node)顯示,并具有類似超鏈接的功能,增加易讀性
正則表達式是一個字符串的處理依據。find命令不支持正則表達式,所以只能用通配符。
linux中有許多特殊字符,這些特殊字符包括通配符。
正規表達式是通過特殊字符的輔助而形成的一種字符串處理依據。
find這些命令不支持正規表達式所以只能用特殊字符(其中有通配符)
sed支持正規表示法,功能更強大,所以就不用通配符了。
shell scripts是利用shell的功能縮寫的一個程序,一個工具,sed,awk,grep這些都是一個程序和工具!
acl控制細分權限,比如規定某個人不能訪問某個目錄。
selinux也對權限做了規定,規定某些程序不能訪問在其權限之外的目錄。selinux就是增強安全型Linux的意思,最大程度限制linux服務進程的訪問資源(最小權限原則)。當一個程序以root身份運行時,如果出現漏洞,黑客進入將能為所欲為,這個權限管理機制的主體是用戶,而selinux權限管理機制的主體是進程,這樣能夠最大程度保障安全。
quota控制多用戶每個用戶的磁盤大小,防止某個用戶過多使用。
為什么會出現LVM?將多個磁盤合在一起,然后再按照需要進行分區。
PE:LVM的基本單位。
PV:一個DISK一個PV標志。
VG:多個磁盤可以組合成一個VG。
LV:將VG分區后,每個分區槽就是一個LV。
RPM是經過編譯的。
make和make install是gcc編譯的進步,通過尋找本目錄內的makefile文件,make生成目標文件,make install將目標文件安裝到指定目錄。
top里的cpu利用率不是代表真正的cpu利用率,期間包括了堵塞。
export與source都是僅在當前shell下生效。
總結
以上是生活随笔為你收集整理的鸟哥私房菜linux就该这么学-学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用VC 2005打开VC 2008的
- 下一篇: 使用VC2005编译静态应用程序的方法