Linux程式管理與SELinux初探 1 什麼是程式程式檔案:通常以二進位檔案的形式存放在儲存介質中程式與許可權:程式被執行時,執行者的許可權與屬性,程式的代碼,(二進位檔案內容)等資料會被作業系統載入到記憶體中, 作業系統給予這個記憶體中的單元一個標識符(PID)。 www.2cto.com 子程式與父程式:登入系統後會取得一個shell,例如bash程式。在這個bash中啟動另一個bash,新啟動的bash即是原來bash 的子程式,原來的bash是新bash的父程式。可以通過Parent PID(PPID)得知一個程式的父程式。 下面來看一個例子:minix007:~$ ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 1000 7538 7530 5 80 0 - 2315 wait pts/1 00:00:00 bash0 R 1000 7598 7538 0 80 0 - 1177 - pts/1 00:00:00 psminix007:~$ bashminix007:~$ ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 1000 7538 7530 0 80 0 - 2315 wait pts/1 00:00:00 bash0 S 1000 7599 7538 9 80 0 - 2316 wait pts/1 00:00:00 bash0 R 1000 7655 7599 0 80 0 - 1177 - pts/1 00:00:00 ps第一次輸入ps -l,發現兩個程式,第一個bash是我們正在使用的shell,PID為7538,第二個為ps,是我們剛剛在這個 shell中啟動的程式,可以看到ps的PPID是7538,即其父程式PID為7538。 第二個命令啟動了另一個bash,可以看到此bash的PID為7599。其PPID為7538,即正在使用的shell的PID 第三個命令啟動了ps程式,可以看到這個ps程式的PPID為7599,即其父程式為剛剛啟動的bash。 www.2cto.com fork and exec 程式的啟動過程:先由父程式fork一個一模一樣的子程式,此子程式再以exec的方式執行真正要執行的程式常駐記憶體的程式: 平時執行的命令,如ls,執行一次就完了,但是有些程式需要一直執行,比如檢測程式,這些程式就 常駐在記憶體。Linux的多人多任務環境 Linux可以供多人同時登入系統,並且互不干擾,每個人像是在獨立地使用電腦。Linux中預設提供了六個命令列終端和 一個圖形終端:tty1~tty7。其中tty7是圖形終端。Ubuntu中可以通過Ctrl+Alt+F1~F7切換這7個終端。當一個終端中程式 死掉時,可以切換到其它終端,用ps -aux查看哪個程式出錯,然後kill掉.2 工作管理(job control)將程式放入後台執行為什麼:如果一個程式執行時間很長,我們在shell中執行它,就要等待它執行完以後才能輸入下一個命令,Linux是多 任務的作業系統,這樣一來,就變成了一個命令一個命令地執行,為了執行一個程式的同時可以繼續使用終端,可以將 程式放入後台執行,這樣一來就不影響終端在前台的使用。 www.2cto.com 怎麼做:可以在要執行的程式命令後加上 & 符號,例如:tar -jcv -f tctar.tar.bz2 t.c &注意:後台執行的程式不能和使用者互動,不能用ctrl+c中斷。在vim中輸入Ctrl+Z可以將vim暫時調入後台,從而可在 前台執行命令,又不退出vim。觀察背景程式狀態: jobs$ jobs[1]+ Stopped vim t.c$ jobs -l[1]+ 8705 Stopped vim t.c將背景程式調入前台執行:fg %num # num是job的id號$ fg %1vim t.c將背景程式暫停與恢複執行Ctrl+z:暫停bg %num:恢複後台中暫停程式將程式停止或重啟:kill$ kill -9 %1 #強制移除1號job離線時仍然執行:nohup$ nohup ./foo.sh &此時,即使你登出,系統仍然會執行foo.sh程式3 程式管理程式觀察ps -l :觀察自己bash中的程式F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 1000 8594 8583 0 80 0 - 2318 wait pts/1 00:00:00 bash0 T 1000 8828 8594 0 80 0 - 12020 signal pts/1 00:00:00 vim0 R 1000 8877 8594 0 80 0 - 1177 - pts/1 00:00:00 psF:程式許可權S:程式狀態R:運行態,S:睡眠態,可喚醒,D:不可喚醒的睡眠態,如等待I/OT:停止態,Z:殭屍態,程式已經終止但無法被移出記憶體UID:啟動程式的使用者的IDPID:程式標識 www.2cto.com PPID:父程式標識C:cpu使用率PRI/NI:與優先順序有關ADDR/SZ/WCHAN:與記憶體有關,ADDR:記憶體哪個部分,SZ:佔用記憶體大小,WCHAN:運行狀態,-表示正在運行TTY:登入的終端位置TIME:使用掉的CPU時間CMD:使用的命令ps aux:觀察系統中所有啟動並執行程式USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDminix007 8828 0.0 0.2 48080 8568 pts/1 Tl 21:29 0:00 vim t.croot 8988 0.6 0.0 0 0 ? S 21:40 0:03 [kworker/1:2]root 9045 0.2 0.0 0 0 ? S 21:45 0:00 [kworker/1:1]minix007 9100 0.0 0.0 4948 1176 pts/1 R+ 21:49 0:00 ps auxVSZ:該程式佔用的虛擬記憶體量RSS:該程式佔用的固定記憶體量top:動態觀察程式變化Tasks: 193 total, 2 running, 189 sleeping, 1 stopped, 1 zombieCpu(s): 0.5%us, 1.8%sy, 0.0%ni, 97.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%stMem: 3962820k total, 3283620k used, 679200k free, 400800k buffersSwap: 3905532k total, 0k used, 3905532k free, 1915036k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9156 root 20 0 0 0 0 R 4 0.0 0:00.21 kworker/0:1 1900 minix007 20 0 247m 71m 32m S 3 1.8 15:53.01 compiz 1089 root 20 0 126m 65m 8904 S 1 1.7 7:30.94 Xorg 18 root 20 0 0 0 0 S 1 0.0 0:44.87 kworker/3:0 1969 minix007 20 0 113m 20m 10m S 0 0.5 1:06.10 unity-panel-ser 6651 minix007 20 0 268m 26m 8880 S 0 0.7 0:53.59 chrome 操作:按P按CPU使用率排序,按M按記憶體使用量率排序,按r修改NI值,按h協助,按q退出。pstree:顯示程式樹,可以看到程式之間的關係。程式管理基本原理:可以通過發送給程式一個訊號,告訴程式你想讓它做什麼。這些訊號包括SIGNUP(重新啟動), SIGINT(相當於ctrl+c)等等,可用man 7 signal查詢詳細資料。基本方式kill -signal PIDkillall processNamekillall emacs程式執行的優先順序priority(PRI):PRI越低表示越優先,由核心動態調整,使用者無法改變nicePRI(new) = PRI(old) + nice,所以可以通過nice值調整PRI,但並不是修改後就能生效,系統還要去分析判斷。 www.2cto.com nice值設定方式方式一:啟動程式時,用 nice -n command 設定,n為nice值,範圍-20~19方式二:程式已經啟動,用 renice [number] PID 設定系統資源觀察free: 觀察記憶體$ free total used free shared buffers cachedMem: 3962820 2067520 1895300 0 379912 925868-/+ buffers/cache: 761740 3201080Swap: 3905532 0 3905532uname: 查看系統和核心資訊(eg: uname -a)$ uname -aLinux minix007-ubuntu-desktop 3.2.0-37-generic-pae #58-Ubuntu SMP Thu Jan 24 15:51:02 UTC 2013 i686 i686 i386 GNU/Linuxuptime: 觀察系統啟動時間和工作負載$ uptime 15:14:15 up 4:31, 2 users, load average: 0.23, 0.24, 0.23netstat: 查看網路狀態$ netstat -t #列出tcp網路封包資料Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address State tcp 1 0 minix007-ubuntu-des:44769 mistletoe.canonica:http CLOSE_WAIT tcp 0 0 minix007-ubuntu-des:37063 112.90.137.192:http ESTABLISHEDdmesg: 查看核心產生的資訊 開機時,核心會檢測硬體資訊,運行中,核心也會產生一些資訊,這些資訊被放在記憶體中一個受保護的地區,使用 dmesg可以得到這些資訊。vmstat: 偵測系統資源變化$ vmstat 1 3 #統計系統狀態,每秒1次,共3次procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 1889048 380780 929772 0 0 17 14 160 286 2 2 96 1 2 0 0 1889172 380780 929772 0 0 0 0 435 788 1 1 99 0 2 0 0 1889164 380780 929772 0 0 0 0 428 767 1 1 99 04 特殊檔案與程式這一節討論的是SUID/SGID/SBIT與程式許可權的關係passwd:為什麼普通使用者執行passwd時擁有了root許可權?這是因為執行passwd時,會取得一個新的程式與PID,該PID 產生時通過SUID賦予這個程式相應許可權。 www.2cto.com /proc:記憶體中啟動並執行程式都以檔案或目錄的形式存在於/proc目錄下。fuser:找出使用指定檔案,檔案系統,或目錄的程式。例如使用umount時發現[device is busy],就可以使用fuser找出哪個程式在使用 檔案系統。lsof:找出程式使用的檔案pidof:找出正在執行的程式的PID$ pidof emacs70215 SELinux初探SELinux是什麼:Security Enhanced Linux,安全強化的Linux。SELinux是在進行程式,檔案等細部許可權設定 依據的一個核心模組。