久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

鸟哥的Linux私房菜(基础篇)- 第十七章、程序管理与 SELinux 初探

發(fā)布時間:2025/3/21 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸟哥的Linux私房菜(基础篇)- 第十七章、程序管理与 SELinux 初探 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第十七章、程序管理與 SELinux初探
最近升級日期:2009/09/11
一個程序被加載到內(nèi)存當中運行,那么在內(nèi)存內(nèi)的那個數(shù)據(jù)就被稱為程序(process)。程序是操作系統(tǒng)上非常重要的概念,所有系統(tǒng)上面跑的數(shù)據(jù)都會以程序的型態(tài)存在。那么系統(tǒng)的程序有哪些狀態(tài)?不同的狀態(tài)會如何影響系統(tǒng)的運行?程序之間是否可以互相控管等等的,這些都是我們所必須要知道的項目。另外與程序有關(guān)的還有 SELinux 這個加強文件存取安全性的咚咚,也必須要做個了解呢!

1. 什么是程序 (Process)
  1.1 程序與程序 (process & program): 子程序與父程序, fork-and-exec,系統(tǒng)服務(wù)
  1.2 Linux 的多人多工環(huán)境
2. 工作管理 (job control)
  2.1 什么是工作管理
  2.2 job control 的管理:&, [ctrl]-z, jobs, fg, bg, kill
  2.3 離線管理問題: nohup
3. 程序管理
  3.1 程序的觀察: ps (ps -l,ps aux, zombie), top,pstree
  3.2 程序的管理: signal, kill, killall
  3.3 關(guān)於程序的運行順序: priority, nice, renice
  3.4 系統(tǒng)資源的觀察: free, uname, uptime, netstat, dmesg, vmstat
4. 特殊文件與程序
  4.1 具有 SUID/SGID 權(quán)限的命令運行狀態(tài)
  4.2 /proc/* 代表的意義
  4.3 查詢已開啟文件或已運行程序開啟之文件: fuser, lsof, pidof
5. SELinux 初探
  5.1 什么是 SELinux: 目標, DAC,MAC
  5.2 SELinux 的運行模式: 組件, 安全性本文,domain/type
  5.3 SELinux 的啟動、關(guān)閉與觀察: getenforce,sestatus, 啟動與關(guān)閉, setenforce
  5.4 SELinux 網(wǎng)絡(luò)服務(wù)運行范例: 啟動 (ps -Z), 錯誤情況, 解決 (chcon, restorecon)
  5.5 SELinux 所需的服務(wù): setroubleshoot, sealert, auditd, audit2why
  5.6 SELinux 的政策與守則管理: seinfo, sesearch, getsebool, setsebool,semanage
6. 重點回顧
7. 本章習(xí)題
8. 參考數(shù)據(jù)與延伸閱讀
9. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23890

什么是程序 (process)

由前面一連幾個章節(jié)的數(shù)據(jù)看來,我們一直強調(diào)在 Linux 底下所有的命令與你能夠進行的動作都與權(quán)限有關(guān),而系統(tǒng)如何判定你的權(quán)限呢?當然就是第十四章帳號管理當中提到的 UID/GID 的相關(guān)概念,以及文件的屬性相關(guān)性羅!再進一步來解釋,你現(xiàn)在大概知道,在 Linux 系統(tǒng)當中:『觸發(fā)任何一個事件時,系統(tǒng)都會將他定義成為一個程序,并且給予這個程序一個 ID ,稱為 PID,同時依據(jù)啟發(fā)這個程序的使用者與相關(guān)屬性關(guān)系,給予這個 PID 一組有效的權(quán)限配置。』從此以后,這個 PID 能夠在系統(tǒng)上面進行的動作,就與這個 PID 的權(quán)限有關(guān)了!

看這個定義似乎沒有什么很奇怪的地方,不過,您得要了解什么叫做『觸發(fā)事件』才行啊!我們在什么情況下會觸發(fā)一個事件?而同一個事件可否被觸發(fā)多次?呵呵!來了解了解先!


程序與程序(process & program)

我們?nèi)绾萎a(chǎn)生一個程序呢?其實很簡單啦,就是『運行一個程序或命令』就可以觸發(fā)一個事件而取得一個 PID 羅!我們說過,系統(tǒng)應(yīng)該是僅認識 binary file 的,那么當我們要讓系統(tǒng)工作的時候,當然就是需要啟動一個 binary file 羅,那個 binary file 就是程序 (program) 啦!

那我們知道,每個程序都有三組人馬的權(quán)限,每組人馬都具有 r/w/x 的權(quán)限,所以:『不同的使用者身份運行這個 program 時,系統(tǒng)給予的權(quán)限也都不相同!』舉例來說,我們可以利用 touch 來創(chuàng)建一個空的文件,當 root 運行這個 touch 命令時,他取得的是 UID/GID = 0/0 的權(quán)限,而當 dmtsai (UID/GID=501/501) 運行這個 touch 時,他的權(quán)限就跟 root 不同啦!我們將這個概念繪制成圖示來瞧瞧如下:


圖 1.1.1、程序被加載成為程序以及相關(guān)數(shù)據(jù)的示意圖

如上圖所示,程序一般是放置在實體磁碟中,然后透過使用者的運行來觸發(fā)。觸發(fā)后會加載到內(nèi)存中成為一個個體,那就是程序。為了操作系統(tǒng)可管理這個程序,因此程序有給予運行者的權(quán)限/屬性等參數(shù),并包括程序所需要的命令碼與數(shù)據(jù)或文件數(shù)據(jù)等,最后再給予一個 PID 。系統(tǒng)就是透過這個 PID 來判斷該 process 是否具有權(quán)限進行工作的!他是很重要的哩!

舉個更常見的例子,我們要操作系統(tǒng)的時候,通常是利用連線程序或者直接在主機前面登陸,然后取得我們的 shell 對吧!那么,我們的 shell 是 bash 對吧,這個 bash 在 /bin/bash 對吧,那么同時間的每個人登陸都是運行 /bin/bash 對吧!不過,每個人取得的權(quán)限就是不同!也就是說,我們可以這樣看:


圖 1.1.2、程序與程序之間的差異

也就是說,當我們登陸并運行 bash 時,系統(tǒng)已經(jīng)給我們一個 PID 了,這個 PID 就是依據(jù)登陸者的 UID/GID (/etc/passwd) 來的啦~以上面的圖 1.1.2 配合圖 1.1.1 來做說明的話,我們知道 /bin/bash 是一個程序 (program),當 dmtsai登陸后,他取得一個 PID 號碼為 2234 的程序,這個程序的 User/Group 都是 dmtsai,而當這個程序進行其他作業(yè)時,例如上面提到的 touch 這個命令時,那么由這個程序衍生出來的其他程序在一般狀態(tài)下,也會沿用這個程序的相關(guān)權(quán)限的!

讓我們將程序與程序作個總結(jié):

  • 程序 (program):通常為 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等),為實體文件的型態(tài)存在;

  • 程序 (process):程序被觸發(fā)后,運行者的權(quán)限與屬性、程序的程序碼與所需數(shù)據(jù)等都會被加載內(nèi)存中,操作系統(tǒng)并給予這個內(nèi)存內(nèi)的單元一個識別碼 (PID),可以說,程序就是一個正在運行中的程序。


  • 子程序與父程序:

在上面的說明里面,我們有提到所謂的『衍生出來的程序』,那是個啥咚咚?這樣說好了,當我們登陸系統(tǒng)后,會取得一個 bash 的 shell ,然后,我們用這個 bash 提供的介面去運行另一個命令,例如 /usr/bin/passwd 或者是 touch 等等,那些另外運行的命令也會被觸發(fā)成為 PID ,呵呵!那個后來運行命令才產(chǎn)生的 PID 就是『子程序』了,而在我們原本的 bash 環(huán)境下,就稱為『父程序』了!借用我們在 十一章 Bash 談到的 export所用的圖示好了:


圖 1.1.3、程序相關(guān)系之示意圖

所以你必須要知道,程序彼此之間是有相關(guān)性的!以上面的圖示來看,連續(xù)運行兩個 bash 后,第二個 bash 的父程序就是前一個 bash。因為每個程序都有一個 PID ,那某個程序的父程序該如何判斷?就透過 Parent PID (PPID) 來判斷即可。此外,由十一章的 export 內(nèi)容我們也探討過環(huán)境變量的繼承問題,子程序可以取得父程序的環(huán)境變量啦!讓我們來進行底下的練習(xí),以了解什么是子程序/父程序。

例題: 請在目前的 bash 環(huán)境下,再觸發(fā)一次 bash ,并以『 ps -l 』這個命令觀察程序相關(guān)的輸出資訊。 答: 直接運行 bash ,會進入到子程序的環(huán)境中,然后輸入 ps -l 后,出現(xiàn): F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 8074 8072 2 76 0 - 1287 wait pts/1 00:00:00 bash 0 S 0 8102 8074 4 76 0 - 1287 wait pts/1 00:00:00 bash 4 R 0 8118 8102 0 78 0 - 1101 - pts/1 00:00:00 ps 有看到那個 PID 與 PPID 嗎?第一個 bash 的 PID 與第二個 bash 的 PPID 都是 8074 啊,因為第二個 bash 是來自於第一個所產(chǎn)生的嘛!另外,每部主機的程序啟動狀態(tài)都不一樣,所以在你的系統(tǒng)上面看到的 PID 與我這里的顯示一定不同!那是正常的!詳細的ps 命令我們會在本章稍后介紹,這里你只要知道 ps -l 可以查閱到相關(guān)的程序資訊即可。

很多朋友常常會發(fā)現(xiàn):『咦!明明我將有問題的程序關(guān)閉了,怎么過一陣子他又自動的產(chǎn)生?而且新產(chǎn)生的那個程序的 PID 與原先的還不一樣,這是怎么回事呢?』不要懷疑,如果不是crontab 工作排程的影響,肯定有一支父程序存在,所以你殺掉子程序后,父程序就會主動再生一支!那怎么辦?正所謂這:『擒賊先擒王』,找出那支父程序,然后將他刪除就對啦!


  • fork and exec:程序呼叫的流程

其實子程序與父程序之間的關(guān)系還挺復(fù)雜的,最大的復(fù)雜點在於程序互相之間的呼叫。在 Linux 的程序呼叫通常稱為 fork-and-exec 的流程 (注1)!程序都會藉由父程序以復(fù)制 (fork) 的方式產(chǎn)生一個一模一樣的子程序,然后被復(fù)制出來的子程序再以 exec 的方式來運行實際要進行的程序,最終就成為一個子程序的存在。整個流程有點像底下這張圖:


圖 1.1.4、程序使用 fork and exec 呼叫的情況示意圖

(1)系統(tǒng)先以 fork 的方式復(fù)制一個與父程序相同的緩存程序,這個程序與父程序唯一的差別就是 PID 不同!但是這個緩存程序還會多一個 PPID 的參數(shù),PPID 如前所述,就是父程序的程序識別碼啦!然后(2)緩存程序開始以 exec的方式加載實際要運行的程序,以上述圖示來講,新的程序名稱為 qqq ,最終子程序的程序碼就會變成 qqq 了!這樣了解乎!


  • 系統(tǒng)或網(wǎng)絡(luò)服務(wù):常駐在內(nèi)存的程序

如果就我們之前學(xué)到的一些命令數(shù)據(jù)來看,其實我們下達的命令都很簡單,包括用 ls 顯示文件啊、用 touch 創(chuàng)建文件啊、rm/mkdir/cp/mv 等命令管理文件啊、chmod/chown/passwd 等等的命令來管理權(quán)限等等的,不過,這些命令都是運行完就結(jié)束了。也就是說,該項命令被觸發(fā)后所產(chǎn)生的 PID 很快就會終止呢!那有沒有一直在運行的程序啊?當然有啊!而且多的是呢!

舉個簡單的例子來說好了,我們知道系統(tǒng)每分鐘都會去掃瞄 /etc/crontab 以及相關(guān)的配置檔,來進行工作排程吧?那么那個工作排程是誰負責(zé)的?當然不是鳥哥啊!呵呵!是 crond 這個程序所管理的,我們將他啟動在背景當中一直持續(xù)不斷的運行,套句以前 DOS 年代常常說的一句話,那就是『常駐在內(nèi)存當中的程序』啦!

常駐在內(nèi)存當中的程序通常都是負責(zé)一些系統(tǒng)所提供的功能以服務(wù)使用者各項任務(wù),因此這些常駐程序就會被我們稱為:服務(wù) (daemon)。系統(tǒng)的服務(wù)非常的多,不過主要大致分成系統(tǒng)本身所需要的服務(wù),例如剛剛提到的 crond 及 atd ,還有 syslog 等等的。還有一些則是負責(zé)網(wǎng)絡(luò)連線的服務(wù),例如 Apache, named, postfix, vsftpd... 等等的。這些網(wǎng)絡(luò)服務(wù)比較有趣的地方,在於這些程序被運行后,他會啟動一個可以負責(zé)網(wǎng)絡(luò)監(jiān)聽的端口 (port) ,以提供外部用戶端 (client) 的連線要求。


Linux 的多人多工環(huán)境

我們現(xiàn)在知道了,其實在 Linux 底下運行一個命令時,系統(tǒng)會將相關(guān)的權(quán)限、屬性、程序碼與數(shù)據(jù)等均加載內(nèi)存,并給予這個單元一個程序識別碼 (PID),最終該命令可以進行的任務(wù)則與這個 PID 的權(quán)限有關(guān)。根據(jù)這個說明,我們就可以簡單的了解,為什么 Linux 這么多用戶,但是卻每個人都可以擁有自己的環(huán)境了吧!^_^!底下我們來談?wù)?Linux 多人多工環(huán)境的特色:

  • 多人環(huán)境:

Linux 最棒的地方就在於他的多人多工環(huán)境了!那么什么是『多人多工』?在 Linux 系統(tǒng)上面具有多種不同的帳號,每種帳號都有都有其特殊的權(quán)限,只有一個人具有至高無上的權(quán)力,那就是root (系統(tǒng)管理員)。除了 root 之外,其他人都必須要受一些限制的!而每個人進入Linux 的環(huán)境配置都可以隨著每個人的喜好來配置 (還記得我們在第十一章 BASH 提過的 ~/.bashrc 吧?對了!就是那個光!)!現(xiàn)在知道為什么了吧?因為每個人登陸后取得的 shell 的 PID 不同嘛!

  • 多工行為:

我們在第零章談到 CPU 的速度,目前的 CPU 速度可高達幾個 GHz。這代表 CPU 每秒鐘可以運行 109 這么多次命令。我們的 Linux 可以讓 CPU 在各個工作間進行切換,也就是說,其實每個工作都僅占去 CPU 的幾個命令次數(shù),所以 CPU 每秒就能夠在各個程序之間進行切換啦!誰叫 CPU 可以在一秒鐘進行這么多次的命令運行。

CPU 切換程序的工作,與這些工作進入到 CPU 運行的排程 (CPU 排程,非 crontab 排程) 會影響到系統(tǒng)的整體效能!目前 Linux 使用的多工切換行為是非常棒的一個機制,幾乎可以將 PC 的性能整個壓榨出來!由於效能非常好,因此當多人同時登陸系統(tǒng)時,其實會感受到整部主機好像就為了你存在一般!這就是多人多工的環(huán)境啦!(注2)

  • 多重登陸環(huán)境的七個基本終端窗口:

在 Linux 當中,默認提供了六個文字界面登陸窗口,以及一個圖形界面,你可以使用[Alt]+[F1].....[F7] 來切換不同的終端機界面,而且每個終端機界面的登陸者還可以不同人!很炫吧!這個東西可就很有用啦!尤其是在某個程序死掉的時候!

其實,這也是多工環(huán)境下所產(chǎn)生的一個情況啦!我們的 Linux 默認會啟動六個終端機登陸環(huán)境的程序,所以我們就會有六個終端機介面。您也可以減少啊!就是減少啟動的終端機程序就好了。詳細的數(shù)據(jù)可以先查閱 /etc/inittab 這個文件,未來我們在啟動管理流程 (第二十章) 會再仔細的介紹的!

  • 特殊的程序管理行為:

以前的鳥哥笨笨的,總是以為使用 Windows 98 就可以啦!后來,因為工作的關(guān)系,需要使用 Unix 系統(tǒng),想說我只要在工作機前面就好,才不要跑來跑去的到 Unix 工作站前面去呢!所以就使用 Windows 連到我的 Unix 工作站工作!好死不死,我一個程序跑下來要 2~3 天,唉~偏偏常常到了第 2.5 天的時候, Windows 98 就給他掛點去!當初真的是給他怕死了~

后來因為換了新計算機,用了隨機版的 Windows 2000 ,呵呵,這東西真不錯 (指對單人而言) ,在死機的時候,他可以僅將錯誤的程序踢掉,而不干擾其他的程序進行,呵呵!從此以后,就不用擔(dān)心會死機連連羅!不過,2000 畢竟還不夠好,因為有的時候還是會死當!

那么 Linux 會有這樣的問題嗎?老實說, Linux 幾乎可以說絕對不會死機的!因為他可以在任何時候,將某個被困住的程序殺掉,然后再重新運行該程序而不用重新啟動!夠炫吧!那么如果我在Linux 下以文字界面登陸,在螢?zāi)划斨酗@示錯誤信息后就掛了~動都不能動,該如何是好!?這個時候那默認的七個窗口就幫上忙啦!你可以隨意的再按[Alt]+[F1].....[F7] 來切換到其他的終端機界面,然后以ps -aux 找出剛剛的錯誤程序,然后給他kill 一下,哈哈,回到剛剛的終端機界面!恩~棒!又回復(fù)正常羅!

為什么可以這樣做呢?我們剛剛不是提過嗎?每個程序之間可能是獨立的,也可能有相依性,只要到獨立的程序當中,刪除有問題的那個程序,當然他就可以被系統(tǒng)移除掉啦!^_^

  • bash 環(huán)境下的工作管理 (job control)

我們在上一個小節(jié)有提到所謂的『父程序、子程序』的關(guān)系,那我們登陸 bash 之后,就是取得一個名為 bash 的 PID 了,而在這個環(huán)境底下所運行的其他命令,就幾乎都是所謂的子程序了。那么,在這個單一的 bash 介面下,我可不可以進行多個工作啊?當然可以啦!可以『同時』進行喔!舉例來說,我可以這樣做:

[root@www ~]# cp file1 file2 &

在這一串命令中,重點在那個 & 的功能,他表示將 file1 這個文件復(fù)制為 file2 ,且放置於背景中運行,也就是說運行這一個命令之后,在這一個終端介面仍然可以做其他的工作!而當這一個命令 (cp file1 file2)運行完畢之后,系統(tǒng)將會在你的終端介面顯示完成的消息!很便利喔!

  • 多人多工的系統(tǒng)資源分配問題考慮:

多人多工確實有很多的好處,但其實也有管理上的困擾,因為使用者越來越多,將導(dǎo)致你管理上的困擾哩!另外,由於使用者日盛,當使用者達到一定的人數(shù)后,通常你的機器便需要升級了,因為 CPU 的運算與 RAM 的大小可能就會不敷使用!

舉個例子來說,鳥哥之前的網(wǎng)站管理的有點不太好,因為使用了一個很復(fù)雜的人數(shù)統(tǒng)計程序,這個程序會一直去取用 MySQL 數(shù)據(jù)庫的數(shù)據(jù),偏偏因為流量大,造成 MySQL 很忙碌。在這樣的情況下,當鳥哥要登陸去寫網(wǎng)頁數(shù)據(jù),或者要去使用討論區(qū)的資源時,哇!慢的很!簡直就是『龜速』啊!后來終於將這個程序停止不用了,以自己寫的一個小程序來取代,呵呵!這樣才讓 CPU 的負載 (loading) 整個降下來~用起來順暢多了! ^_^


工作管理 (job control)

這個工作管理 (job control) 是用在 bash 環(huán)境下的,也就是說:『當我們登陸系統(tǒng)取得 bash shell之后,在單一終端機介面下同時進行多個工作的行為管理 』。舉例來說,我們在登陸 bash 后,想要一邊復(fù)制文件、一邊進行數(shù)據(jù)搜尋、一邊進行編譯,還可以一邊進行 vi 程序撰寫!當然我們可以重復(fù)登陸那六個文字介面的終端機環(huán)境中,不過,能不能在一個 bash 內(nèi)達成?當然可以啊!就是使用 job control 啦! ^_^


什么是工作管理?

從上面的說明當中,你應(yīng)該要了解的是:『進行工作管理的行為中,其實每個工作都是目前 bash 的子程序,亦即彼此之間是有相關(guān)性的。我們無法以 job control 的方式由 tty1 的環(huán)境去管理 tty2 的 bash !』這個概念請你得先創(chuàng)建起來,后續(xù)的范例介紹之后,你就會清楚的了解羅!

或許你會覺得很奇怪啊,既然我可以在六個終端介面登陸,那何必使用 job control 呢?真是脫褲子放屁,多此一舉啊!不要忘記了呢,我們可以在 /etc/security/limits.conf (第十四章)里面配置使用者同時可以登陸的連線數(shù),在這樣的情況下,某些使用者可能僅能以一個連線來工作呢!所以羅,你就得要了解一下這種工作管理的模式了!此外,這個章節(jié)內(nèi)容也會牽涉到很多的數(shù)據(jù)流重導(dǎo)向,所以,如果忘記的話,務(wù)必回到第十一章 BASH Shell 看一看喔!

由於假設(shè)我們只有一個終端介面,因此在可以出現(xiàn)提示字節(jié)讓你操作的環(huán)境就稱為前景 (foreground),至於其他工作就可以讓你放入背景 (background) 去暫停或運行。要注意的是,放入背景的工作想要運行時,他必須不能夠與使用者互動。舉例來說, vim 絕對不可能在背景里面運行 (running) 的!因為你沒有輸入數(shù)據(jù)他就不會跑啊!而且放入背景的工作是不可以使用 [ctrl]+c 來終止的』!

總之,要進行 bash 的 job control 必須要注意到的限制是:

  • 這些工作所觸發(fā)的程序必須來自於你 shell 的子程序(只管理自己的 bash);
  • 前景:你可以控制與下達命令的這個環(huán)境稱為前景的工作 (foreground);
  • 背景:可以自行運行的工作,你無法使用 [ctrl]+c 終止他,可使用 bg/fg 呼叫該工作;
  • 背景中『運行』的程序不能等待 terminal/shell 的輸入(input)

接下來讓我們實際來管理這些工作吧!


job control 的管理

如前所述,bash 只能夠管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能夠?qū)e人的 bash底下的 job 給他拿過來運行。此外,又分前景與背景,然后在背景里面的工作狀態(tài)又可以分為『暫停 (stop)』與『運行中(running)』。那實際進行 job 控制的命令有哪些?底下就來談?wù)劇?br />


  • 直接將命令丟到背景中『運行』的 &

如同前面提到的,我們在只有一個 bash 的環(huán)境下,如果想要同時進行多個工作,那么可以將某些工作直接丟到背景環(huán)境當中,讓我們可以繼續(xù)操作前景的工作!那么如何將工作丟到背景中?最簡單的方法就是利用『 & 』這個玩意兒了!舉個簡單的例子,我們要將 /etc/ 整個備份成為 /tmp/etc.tar.gz 且不想要等待,那么可以這樣做:

[root@www ~]# tar -zpcf /tmp/etc.tar.gz /etc & [1] 8400 <== [job number] PID [root@www ~]# tar: Removing leading `/' from member names # 在中括號內(nèi)的號碼為工作號碼 (job number),該號碼與 bash 的控制有關(guān)。 # 后續(xù)的 8400 則是這個工作在系統(tǒng)中的 PID。至於后續(xù)出現(xiàn)的數(shù)據(jù)是 tar 運行的數(shù)據(jù)流, # 由於我們沒有加上數(shù)據(jù)流重導(dǎo)向,所以會影響畫面!不過不會影響前景的操作喔!

仔細的瞧一瞧,我在輸入一個命令后,在該命令的最后面加上一個『 & 』代表將該命令丟到背景中,此時 bash 會給予這個命令一個『工作號碼(job number)』,就是那個 [1] 啦!至於后面那個 8400 則是該命令所觸發(fā)的『 PID 』了!而且,有趣的是,我們可以繼續(xù)操作 bash 呢!很不賴吧!不過,那么丟到背景中的工作什么時候完成?完成的時候會顯示什么?如果你輸入幾個命令后,突然出現(xiàn)這個數(shù)據(jù):

[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc

就代表 [1] 這個工作已經(jīng)完成 (Done) ,該工作的命令則是接在后面那一串命令列。這樣了解了吧!另外,這個 & 代表:『將工作丟到背景中去運行』喔!注意到那個『運行』的字眼!此外,這樣的情況最大的好處是:不怕被 [ctrl]+c 中斷的啦!此外,將工作丟到背景當中要特別注意數(shù)據(jù)的流向喔!包括上面的信息就有出現(xiàn)錯誤信息,導(dǎo)致我的前景被影響。雖然只要按下 [enter] 就會出現(xiàn)提示字節(jié)。但如果我將剛剛那個命令改成:

[root@www ~]# tar -zpcvf /tmp/etc.tar.gz /etc &

情況會怎樣?在背景當中運行的命令,如果有 stdout 及 stderr 時,他的數(shù)據(jù)依舊是輸出到螢?zāi)簧厦娴?#xff0c;所以,我們會無法看到提示字節(jié),當然也就無法完好的掌握前景工作。同時由於是背景工作的 tar ,此時你怎么按下 [ctrl]+c 也無法停止螢?zāi)槐桓愕幕ɑňG綠的!所以羅,最佳的狀況就是利用數(shù)據(jù)流重導(dǎo)向,將輸出數(shù)據(jù)傳送至某個文件中。舉例來說,我可以這樣做:

[root@www ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 & [1] 8429 [root@www ~]#

呵呵!如此一來,輸出的資訊都給他傳送到 /tmp/log.txt 當中,當然就不會影響到我們前景的作業(yè)了。這樣說,您應(yīng)該可以更清楚數(shù)據(jù)流重導(dǎo)向的重要性了吧!^_^

Tips:
工作號碼 (job number) 只與你這個 bash 環(huán)境有關(guān),但是他既然是個命令觸發(fā)的咚咚,所以當然一定是一個程序,因此你會觀察到有 job number 也搭配一個 PID !

  • 將『目前』的工作丟到背景中『暫停』:[ctrl]-z

想個情況:如果我正在使用 vi ,卻發(fā)現(xiàn)我有個文件不知道放在哪里,需要到 bash環(huán)境下進行搜尋,此時是否要結(jié)束 vi 呢?呵呵!當然不需要啊!只要暫時將 vi 給他丟到背景當中等待即可。例如以下的案例:

[root@www ~]# vi ~/.bashrc # 在 vi 的一般模式下,按下 [ctrl]-z 這兩個按鍵 [1]+ Stopped vim ~/.bashrc [root@www ~]# <==順利取得了前景的操控權(quán)! [root@www ~]# find / -print ....(輸出省略).... # 此時螢?zāi)粫浅5拿β?#xff01;因為螢?zāi)簧蠒@示所有的檔名。請按下 [ctrl]-z 暫停 [2]+ Stopped find / -print

在 vi 的一般模式下,按下 [ctrl] 及 z 這兩個按鍵,螢?zāi)簧蠒霈F(xiàn) [1] ,表示這是第一個工作,而那個 + 代表最近一個被丟進背景的工作,且目前在背景下默認會被取用的那個工作 (與 fg 這個命令有關(guān) )!而那個 Stopped 則代表目前這個工作的狀態(tài)。在默認的情況下,使用 [ctrl]-z 丟到背景當中的工作都是『暫停』的狀態(tài)喔!


  • 觀察目前的背景工作狀態(tài): jobs
[root@www ~]# jobs [-lrs] 選項與參數(shù): -l :除了列出 job number 與命令串之外,同時列出 PID 的號碼; -r :僅列出正在背景 run 的工作; -s :僅列出正在背景當中暫停 (stop) 的工作。范例一:觀察目前的 bash 當中,所有的工作,與對應(yīng)的 PID [root@www ~]# jobs -l [1]- 10314 Stopped vim ~/.bashrc [2]+ 10833 Stopped find / -print

如果想要知道目前有多少的工作在背景當中,就用 jobs 這個命令吧!一般來說,直接下達 jobs 即可!不過,如果你還想要知道該 job number 的 PID 號碼,可以加上 -l 這個參數(shù)啦!在輸出的資訊當中,例如上表,仔細看到那個 + - 號喔!那個 + 代表默認的取用工作。所以說:『目前我有兩個工作在背景當中,兩個工作都是暫停的,而如果我僅輸入 fg 時,那么那個 [2] 會被拿到前景當中來處理』!

其實 + 代表最近被放到背景的工作號碼, - 代表最近最后第二個被放置到背景中的工作號碼。而超過最后第三個以后的工作,就不會有 +/- 符號存在了!


  • 將背景工作拿到前景來處理:fg

剛剛提到的都是將工作丟到背景當中去運行的,那么有沒有可以將背景工作拿到前景來處理的?有啊!就是那個 fg (foreground) 啦!舉例來說,我們想要將上頭范例當中的工作拿出來處理時:

[root@www ~]# fg %jobnumber 選項與參數(shù): %jobnumber :jobnumber 為工作號碼(數(shù)字)。注意,那個 % 是可有可無的!范例一:先以 jobs 觀察工作,再將工作取出: [root@www ~]# jobs [1]- 10314 Stopped vim ~/.bashrc [2]+ 10833 Stopped find / -print [root@www ~]# fg <==默認取出那個 + 的工作,亦即 [2]。立即按下[ctrl]-z [root@www ~]# fg %1 <==直接規(guī)定取出的那個工作號碼!再按下[ctrl]-z [root@www ~]# jobs [1]+ Stopped vim ~/.bashrc [2]- Stopped find / -print

經(jīng)過 fg 命令就能夠?qū)⒈尘肮ぷ髂玫角熬皝硖幚砹_!不過比較有趣的是最后一個顯示的結(jié)果,我們會發(fā)現(xiàn) + 出現(xiàn)在第一個工作后!怎么會這樣啊?這是因為你剛剛利用 fg %1 將第一號工作捉到前景后又放回背景,此時最后一個被放入背景的將變成 vi 那個命令動作,所以當然 [1] 后面就會出現(xiàn) + 了!了解乎!另外,如果輸入『 fg -』則代表將 - 號的那個工作號碼拿出來,上面就是 [2]- 那個工作號碼啦!


  • 讓工作在背景下的狀態(tài)變成運行中: bg

我們剛剛提到,那個 [ctrl]-z 可以將目前的工作丟到背景底下去『暫停』,那么如何讓一個工作在背景底下『 Run 』呢?我們可以在底下這個案例當中來測試!注意喔!底下的測試要進行的快一點!^_^

范例一:一運行 find / -perm +7000 > /tmp/text.txt 后,立刻丟到背景去暫停! [root@www ~]# find / -perm +7000 > /tmp/text.txt # 此時,請立刻按下 [ctrl]-z 暫停! [3]+ Stopped find / -perm +7000 > /tmp/text.txt范例二:讓該工作在背景下進行,并且觀察他!! [root@www ~]# jobs ; bg %3 ; jobs [1]- Stopped vim ~/.bashrc [2] Stopped find / -print [3]+ Stopped find / -perm +7000 > /tmp/text.txt [3]+ find / -perm +7000 > /tmp/text.txt & <==用 bg%3 的情況! [1]+ Stopped vim ~/.bashrc [2] Stopped find / -print [3]- Running find / -perm +7000 > /tmp/text.txt &

看到哪里有差異嗎?呼呼!沒錯!就是那個狀態(tài)列~以經(jīng)由 Stopping 變成了 Running 羅!看到差異點,嘿嘿!命令列最后方多了一個 & 的符號羅!代表該工作被啟動在背景當中了啦! ^_^


  • 管理背景當中的工作: kill

剛剛我們可以讓一個已經(jīng)在背景當中的工作繼續(xù)工作,也可以讓該工作以 fg 拿到前景來,那么,如果想要將該工作直接移除呢?或者是將該工作重新啟動呢?這個時候就得需要給予該工作一個訊號 (signal) ,讓他知道該怎么作才好啊!此時, kill 這個命令就派上用場啦!

[root@www ~]# kill -signal %jobnumber [root@www ~]# kill -l 選項與參數(shù): -l :這個是 L 的小寫,列出目前 kill 能夠使用的訊號 (signal) 有哪些? signal :代表給予后面接的那個工作什么樣的指示羅!用 man 7 signal 可知:-1 :重新讀取一次參數(shù)的配置檔 (類似 reload);-2 :代表與由鍵盤輸入 [ctrl]-c 同樣的動作;-9 :立刻強制刪除一個工作;-15:以正常的程序方式終止一項工作。與 -9 是不一樣的。范例一:找出目前的 bash 環(huán)境下的背景工作,并將該工作『強制刪除』。 [root@www ~]# jobs [1]+ Stopped vim ~/.bashrc [2] Stopped find / -print [root@www ~]# kill -9 %2; jobs [1]+ Stopped vim ~/.bashrc [2] Killed find / -print # 再過幾秒你再下達 jobs 一次,就會發(fā)現(xiàn) 2 號工作不見了!因為被移除了!范例:找出目前的 bash 環(huán)境下的背景工作,并將該工作『正常終止』掉。 [root@www ~]# jobs [1]+ Stopped vim ~/.bashrc [root@www ~]# kill -SIGTERM %1 # -SIGTERM 與 -15 是一樣的!您可以使用 kill -l 來查閱!

特別留意一下, -9 這個 signal 通常是用在『強制刪除一個不正常的工作』時所使用的,-15 則是以正常步驟結(jié)束一項工作(15也是默認值),兩者之間并不相同呦!舉上面的例子來說,我用 vi 的時候,不是會產(chǎn)生一個 .filename.swp 的文件嗎?那么,當使用 -15 這個 signal 時, vi 會嘗試以正常的步驟來結(jié)束掉該 vi 的工作,所以 .filename.swp 會主動的被移除。但若是使用 -9 這個 signal 時,由於該 vi 工作會被強制移除掉,因此, .filename.swp 就會繼續(xù)存在文件系統(tǒng)當中。這樣您應(yīng)該可以稍微分辨一下了吧?

其實, kill 的妙用是很無窮的啦!他搭配 signal 所詳列的資訊 (用 man 7 signal 去查閱相關(guān)數(shù)據(jù))可以讓您有效的管理工作與程序 (Process),此外,那個 killall 也是同樣的用法!至於常用的 signal 您至少需要了解 1, 9, 15 這三個 signal 的意義才好。此外, signal 除了以數(shù)值來表示之外,也可以使用訊號名稱喔!舉例來說,上面的范例二就是一個例子啦!至於 signal number 與名稱的對應(yīng),呵呵,使用 kill -l 就知道啦(L的小寫)!

另外, kill 后面接的數(shù)字默認會是 PID ,如果想要管理 bash 的工作控制,就得要加上 %數(shù)字 了,這點也得特別留意才行喔!


離線管理問題

要注意的是,我們在工作管理當中提到的『背景』指的是在終端機模式下可以避免 [crtl]-c 中斷的一個情境,并不是放到系統(tǒng)的背景去喔!所以,工作管理的背景依舊與終端機有關(guān)啦!在這樣的情況下,如果你是以遠程連線方式連接到你的 Linux 主機,并且將工作以 & 的方式放到背景去,請問,在工作尚未結(jié)束的情況下你離線了,該工作還會繼續(xù)進行嗎?答案是『否』!不會繼續(xù)進行,而是會被中斷掉。

那怎么辦?如果我的工作需要進行一大段時間,我又不能放置在背景底下,那該如何處理呢?首先,你可以參考前一章的 at 來處理即可!因為 at 是將工作放置到系統(tǒng)背景,而與終端機無關(guān)。如果不想要使用 at 的話,那你也可以嘗試使用 nohup 這個命令來處理喔!這個 nohup 可以讓你在離線或注銷系統(tǒng)后,還能夠讓工作繼續(xù)進行。他的語法有點像這樣:

[root@www ~]# nohup [命令與參數(shù)] <==在終端機前景中工作 [root@www ~]# nohup [命令與參數(shù)] & <==在終端機背景中工作

有夠好簡單的命令吧!上述命令需要注意的是, nohup 并不支持 bash 內(nèi)建的命令,因此你的命令必須要是外部命令才行。我們來嘗試玩一下底下的任務(wù)吧!

# 1. 先編輯一支會『睡著 500 秒』的程序: [root@www ~]# vim sleep500.sh #!/bin/bash /bin/sleep 500s /bin/echo "I have slept 500 seconds."# 2. 丟到背景中去運行,并且立刻注銷系統(tǒng): [root@www ~]# chmod a+x sleep500.sh [root@www ~]# nohup ./sleep500.sh & [1] 5074 [root@www ~]# nohup: appending output to ‘nohup.out’ <==會告知這個信息! [root@www ~]# exit

如果你再次登陸的話,再使用 pstree 去查閱你的程序,會發(fā)現(xiàn) sleep500.sh 還在運行中喔!并不會被中斷掉!這樣了解意思了嗎?由於我們的程序最后會輸出一個信息,但是 nohup 與終端機其實無關(guān)了,因此這個信息的輸出就會被導(dǎo)向『 ~/nohup.out 』,所以你才會看到上述命令中,當你輸入 nohup 后,會出現(xiàn)那個提示信息羅。

如果你想要讓在背景的工作在你注銷后還能夠繼續(xù)的運行,那么使用 nohup 搭配 & 是不錯的運行情境喔!可以參考看看!


程序管理

本章一開始就提到所謂的『程序』的概念,包括程序的觸發(fā)、子程序與父程序的相關(guān)性等等,此外,還有那個『程序的相依性』以及所謂的『僵尸程序』等等需要說明的呢!為什么程序管理這么重要呢?這是因為:

  • 首先,本章一開始就談到的,我們在操作系統(tǒng)時的各項工作其實都是經(jīng)過某個 PID 來達成的 (包括你的 bash 環(huán)境),因此,能不能進行某項工作,就與該程序的權(quán)限有關(guān)了。
  • 再來,如果您的 Linux 系統(tǒng)是個很忙碌的系統(tǒng),那么當整個系統(tǒng)資源快要被使用光時,您是否能夠找出最耗系統(tǒng)的那個程序,然后刪除該程序,讓系統(tǒng)恢復(fù)正常呢?
  • 此外,如果由於某個程序?qū)懙牟缓?#xff0c;導(dǎo)致產(chǎn)生一個有問題的程序在內(nèi)存當中,您又該如何找出他,然后將他移除呢?
  • 如果同時有五六項工作在您的系統(tǒng)當中運行,但其中有一項工作才是最重要的,該如何讓那一項重要的工作被最優(yōu)先運行呢?

所以羅,一個稱職的系統(tǒng)管理員,必須要熟悉程序的管理流程才行,否則當系統(tǒng)發(fā)生問題時,還真是很難解決問題呢!底下我們會先介紹如何觀察程序與程序的狀態(tài),然后再加以程序控制羅!


程序的觀察

既然程序這么重要,那么我們?nèi)绾尾殚喯到y(tǒng)上面正在運行當中的程序呢?很簡單啊!利用靜態(tài)的 ps 或者是動態(tài)的 top,還能以 pstree 來查閱程序樹之間的關(guān)系喔!


  • ps :將某個時間點的程序運行情況擷取下來
[root@www ~]# ps aux <==觀察系統(tǒng)所有的程序數(shù)據(jù) [root@www ~]# ps -lA <==也是能夠觀察所有系統(tǒng)的數(shù)據(jù) [root@www ~]# ps axjf <==連同部分程序樹狀態(tài) 選項與參數(shù): -A :所有的 process 均顯示出來,與 -e 具有同樣的效用; -a :不與 terminal 有關(guān)的所有 process ; -u :有效使用者 (effective user) 相關(guān)的 process ; x :通常與 a 這個參數(shù)一起使用,可列出較完整資訊。 輸出格式規(guī)劃: l :較長、較詳細的將該 PID 的的資訊列出; j :工作的格式 (jobs format) -f :做一個更為完整的輸出。

鳥哥個人認為 ps 這個命令的 man page 不是很好查閱,因為很多不同的 Unix 都使用這個 ps 來查閱程序狀態(tài),為了要符合不同版本的需求,所以這個 man page 寫的非常的龐大!因此,通常鳥哥都會建議你,直接背兩個比較不同的選項,一個是只能查閱自己 bash 程序的『 ps -l 』一個則是可以查閱所有系統(tǒng)運行的程序『 ps aux 』!注意,你沒看錯,是『 ps aux 』沒有那個減號 (-) !先來看看關(guān)於自己 bash 程序狀態(tài)的觀察:

  • 僅觀察自己的 bash 相關(guān)程序: ps -l
范例一:將目前屬於您自己這次登陸的 PID 與相關(guān)資訊列示出來(只與自己的 bash 有關(guān)) [root@www ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 13639 13637 0 75 0 - 1287 wait pts/1 00:00:00 bash 4 R 0 13700 13639 0 77 0 - 1101 - pts/1 00:00:00 ps

系統(tǒng)整體的程序運行是非常多的,但如果使用 ps -l 則僅列出與你的操作環(huán)境 (bash) 有關(guān)的程序而已,亦即最上一級的父程序會是你自己的 bash 而沒有延伸到 init 這支程序去!那么 ps -l 秀出來的數(shù)據(jù)有哪些呢?我們就來觀察看看:

  • F:代表這個程序旗標 (process flags),說明這個程序的總結(jié)權(quán)限,常見號碼有:
    • 若為 4 表示此程序的權(quán)限為 root ;
    • 若為 1 則表示此子程序僅進行復(fù)制(fork)而沒有實際運行(exec)。

  • S:代表這個程序的狀態(tài) (STAT),主要的狀態(tài)有:
    • R (Running):該程序正在運行中;
    • S (Sleep):該程序目前正在睡眠狀態(tài)(idle),但可以被喚醒(signal)。
    • D :不可被喚醒的睡眠狀態(tài),通常這支程序可能在等待 I/O 的情況(ex>列印)
    • T :停止狀態(tài)(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態(tài);
    • Z (Zombie):僵尸狀態(tài),程序已經(jīng)終止但卻無法被移除至內(nèi)存外。

  • UID/PID/PPID:代表『此程序被該 UID 所擁有/程序的 PID 號碼/此程序的父程序 PID 號碼』

  • C:代表 CPU 使用率,單位為百分比;

  • PRI/NI:Priority/Nice 的縮寫,代表此程序被 CPU 所運行的優(yōu)先順序,數(shù)值越小代表該程序越快被 CPU 運行。詳細的 PRI 與 NI 將在下一小節(jié)說明。

  • ADDR/SZ/WCHAN:都與內(nèi)存有關(guān),ADDR 是 kernel function,指出該程序在內(nèi)存的哪個部分,如果是個 running的程序,一般就會顯示『 - 』 / SZ 代表此程序用掉多少內(nèi)存 / WCHAN 表示目前程序是否運行中,同樣的,若為 - 表示正在運行中。

  • TTY:登陸者的終端機位置,若為遠程登陸則使用動態(tài)終端介面 (pts/n);

  • TIME:使用掉的 CPU 時間,注意,是此程序?qū)嶋H花費 CPU 運行的時間,而不是系統(tǒng)時間;

  • CMD:就是 command 的縮寫,造成此程序的觸發(fā)程序之命令為何。

所以你看到的 ps -l 輸出信息中,他說明的是:『bash 的程序?qū)凫?UID 為 0 的使用者,狀態(tài)為睡眠 (sleep),之所以為睡眠因為他觸發(fā)了 ps (狀態(tài)為 run) 之故。此程序的 PID 為 13639,優(yōu)先運行順序為 75 ,下達 bash 所取得的終端介面為 pts/1 ,運行狀態(tài)為等待 (wait) 。』這樣已經(jīng)夠清楚了吧?您自己嘗試解析一下那么 ps 那一行代表的意義為何呢? ^_^

接下來讓我們使用 ps 來觀察一下系統(tǒng)內(nèi)所有的程序狀態(tài)吧!

  • 觀察系統(tǒng)所有程序: ps aux
范例二:列出目前所有的正在內(nèi)存當中的程序: [root@www ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2064 616 ? Ss Mar11 0:01 init [5] root 2 0.0 0.0 0 0 ? S< Mar11 0:00 [migration/0] root 3 0.0 0.0 0 0 ? SN Mar11 0:00 [ksoftirqd/0] .....(中間省略)..... root 13639 0.0 0.2 5148 1508 pts/1 Ss 11:44 0:00 -bash root 14232 0.0 0.1 4452 876 pts/1 R+ 15:52 0:00 ps aux root 18593 0.0 0.0 2240 476 ? Ss Mar14 0:00 /usr/sbin/atd

你會發(fā)現(xiàn) ps -l 與 ps aux 顯示的項目并不相同!在 ps aux 顯示的項目中,各欄位的意義為:

  • USER:該 process 屬於那個使用者帳號的?
  • PID :該 process 的程序識別碼。
  • %CPU:該 process 使用掉的 CPU 資源百分比;
  • %MEM:該 process 所占用的實體內(nèi)存百分比;
  • VSZ :該 process 使用掉的虛擬內(nèi)存量 (Kbytes)
  • RSS :該 process 占用的固定的內(nèi)存量 (Kbytes)
  • TTY :該 process 是在那個終端機上面運行,若與終端機無關(guān)則顯示 ?,另外, tty1-tty6是本機上面的登陸者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡(luò)連接進主機的程序。
  • STAT:該程序目前的狀態(tài),狀態(tài)顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
  • START:該 process 被觸發(fā)啟動的時間;
  • TIME :該 process 實際使用 CPU 運行的時間。
  • COMMAND:該程序的實際命令為何?

一般來說,ps aux 會依照 PID 的順序來排序顯示,我們還是以 13639 那個 PID 那行來說明!該行的意義為『root 運行的 bash PID 為 13639,占用了 0.2% 的內(nèi)存容量百分比,狀態(tài)為休眠 (S),該程序啟動的時間為 11:44 ,且取得的終端機環(huán)境為 pts/1 。』與 ps aux 看到的其實是同一個程序啦!這樣可以理解嗎?讓我們繼續(xù)使用 ps 來觀察一下其他的資訊吧!

范例三:以范例一的顯示內(nèi)容,顯示出所有的程序: [root@www ~]# ps -lA F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 76 0 - 435 - ? 00:00:01 init 1 S 0 2 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0 1 S 0 3 1 0 70 -5 - 0 worker ? 00:00:00 events/0 ....(以下省略).... # 你會發(fā)現(xiàn)每個欄位與 ps -l 的輸出情況相同,但顯示的程序則包括系統(tǒng)所有的程序。范例四:列出類似程序樹的程序顯示: [root@www ~]# ps axjfPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND0 1 1 1 ? -1 Ss 0 0:01 init [5] .....(中間省略).....1 4586 4586 4586 ? -1 Ss 0 0:00 /usr/sbin/sshd4586 13637 13637 13637 ? -1 Ss 0 0:00 \_ sshd: root@pts/1 13637 13639 13639 13639 pts/1 14266 Ss 0 0:00 \_ -bash 13639 14266 14266 13639 pts/1 14266 R+ 0 0:00 \_ ps axjf .....(后面省略).....

看出來了吧?其實鳥哥在進行一些測試時,都是以網(wǎng)絡(luò)連線進主機來測試的,所以羅,你會發(fā)現(xiàn)其實程序之間是有相關(guān)性的啦!不過,其實還可以使用 pstree 來達成這個程序樹喔!以上面的例子來看,鳥哥是透過 sshd 提供的網(wǎng)絡(luò)服務(wù)取得一個程序,該程序提供 bash 給我使用,而我透過 bash 再去運行 ps axjf !這樣可以看的懂了嗎?其他各欄位的意義請 man ps (雖然真的很難 man 的出來!) 羅!

范例五:找出與 cron 與 syslog 這兩個服務(wù)有關(guān)的 PID 號碼? [root@www ~]# ps aux | egrep '(cron|syslog)' root 4286 0.0 0.0 1720 572 ? Ss Mar11 0:00 syslogd -m 0 root 4661 0.0 0.1 5500 1192 ? Ss Mar11 0:00 crond root 14286 0.0 0.0 4116 592 pts/1 R+ 16:15 0:00 egrep (cron|syslog) # 所以號碼是 4286 及 4661 這兩個羅!就是這樣找的啦!

除此之外,我們必須要知道的是『僵尸 (zombie) 』程序是什么?通常,造成僵尸程序的成因是因為該程序應(yīng)該已經(jīng)運行完畢,或者是因故應(yīng)該要終止了,但是該程序的父程序卻無法完整的將該程序結(jié)束掉,而造成那個程序一直存在內(nèi)存當中。如果你發(fā)現(xiàn)在某個程序的 CMD 后面還接上 <defunct> 時,就代表該程序是僵尸程序啦,例如:

apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd <defunct>

當系統(tǒng)不穩(wěn)定的時候就容易造成所謂的僵尸程序,可能是因為程序?qū)懙牟缓美?#xff0c;或者是使用者的操作習(xí)慣不良等等所造成。如果你發(fā)現(xiàn)系統(tǒng)中很多僵尸程序時,記得啊!要找出該程序的父程序,然后好好的做個追蹤,好好的進行主機的環(huán)境最佳化啊!看看有什么地方需要改善的,不要只是直接將他 kill 掉而已呢!不然的話,萬一他一直產(chǎn)生,那可就麻煩了! @_@

事實上,通常僵尸程序都已經(jīng)無法控管,而直接是交給 init 這支程序來負責(zé)了,偏偏 init 是系統(tǒng)第一支運行的程序,他是所有程序的父程序!我們無法殺掉該程序的 (殺掉他,系統(tǒng)就死掉了!),所以羅,如果產(chǎn)生僵尸程序,而系統(tǒng)過一陣子還沒有辦法透過核心非經(jīng)常性的特殊處理來將該程序刪除時,那你只好透過 reboot 的方式來將該程序抹去了!


  • top:動態(tài)觀察程序的變化

相對於 ps 是擷取一個時間點的程序狀態(tài), top 則可以持續(xù)偵測程序運行的狀態(tài)!使用方式如下:

[root@www ~]# top [-d 數(shù)字] | top [-bnp] 選項與參數(shù): -d :后面可以接秒數(shù),就是整個程序畫面升級的秒數(shù)。默認是 5 秒; -b :以批量的方式運行 top ,還有更多的參數(shù)可以使用喔!通常會搭配數(shù)據(jù)流重導(dǎo)向來將批量的結(jié)果輸出成為文件。 -n :與 -b 搭配,意義是,需要進行幾次 top 的輸出結(jié)果。 -p :指定某些個 PID 來進行觀察監(jiān)測而已。 在 top 運行過程當中可以使用的按鍵命令:? :顯示在 top 當中可以輸入的按鍵命令;P :以 CPU 的使用資源排序顯示;M :以 Memory 的使用資源排序顯示;N :以 PID 來排序喔!T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序。k :給予某個 PID 一個訊號 (signal)r :給予某個 PID 重新制訂一個 nice 值。q :離開 top 軟件的按鍵。

其實 top 的功能非常多!可以用的按鍵也非常的多!可以參考 man top 的內(nèi)部說明文件!鳥哥這里僅是列出一些鳥哥自己常用的選項而已。接下來讓我們實際觀察一下如何使用 top 與 top 的畫面吧!

范例一:每兩秒鐘升級一次 top ,觀察整體資訊: [root@www ~]# top -d 2 top - 17:03:09 up 7 days, 16:16, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie Cpu(s): 0.5%us, 0.5%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 742664k total, 681672k used, 60992k free, 125336k buffers Swap: 1020088k total, 28k used, 1020060k free, 311156k cached<==如果加入 k 或 r 時,就會有相關(guān)的字樣出現(xiàn)在這里喔! PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14398 root 15 0 2188 1012 816 R 0.5 0.1 0:00.05 top1 root 15 0 2064 616 528 S 0.0 0.1 0:01.38 init2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/03 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0

top 也是個挺不錯的程序觀察工具!但不同於 ps 是靜態(tài)的結(jié)果輸出, top 這個程序可以持續(xù)的監(jiān)測整個系統(tǒng)的程序工作狀態(tài)。在默認的情況下,每次升級程序資源的時間為 5 秒,不過,可以使用 -d 來進行修改。top 主要分為兩個畫面,上面的畫面為整個系統(tǒng)的資源使用狀態(tài),基本上總共有六行,顯示的內(nèi)容依序是:

  • 第一行(top...):這一行顯示的資訊分別為:
    • 目前的時間,亦即是 17:03:09 那個項目;
    • 啟動到目前為止所經(jīng)過的時間,亦即是 up 7days, 16:16 那個項目;
    • 已經(jīng)登陸系統(tǒng)的使用者人數(shù),亦即是 1 user項目;
    • 系統(tǒng)在 1, 5, 15 分鐘的平均工作負載。我們在第十六章談到的 batch 工作方式為負載小於 0.8 就是這個負載羅!代表的是 1, 5, 15 分鐘,系統(tǒng)平均要負責(zé)運行幾個程序(工作)的意思。越小代表系統(tǒng)越閑置,若高於 1 得要注意你的系統(tǒng)程序是否太過繁復(fù)了!

  • 第二行(Tasks...):顯示的是目前程序的總量與個別程序在什么狀態(tài)(running, sleeping, stopped, zombie)。比較需要注意的是最后的 zombie 那個數(shù)值,如果不是 0 !好好看看到底是那個 process 變成僵尸了吧?

  • 第三行(Cpus...):顯示的是 CPU 的整體負載,每個項目可使用 ? 查閱。需要特別注意的是 %wa ,那個項目代表的是 I/O wait,通常你的系統(tǒng)會變慢都是 I/O 產(chǎn)生的問題比較大!因此這里得要注意這個項目耗用 CPU 的資源喔!另外,如果是多核心的設(shè)備,可以按下數(shù)字鍵『1』來切換成不同 CPU 的負載率。

  • 第四行與第五行:表示目前的實體內(nèi)存與虛擬內(nèi)存 (Mem/Swap) 的使用情況。再次重申,要注意的是 swap 的使用量要盡量的少!如果 swap 被用的很大量,表示系統(tǒng)的實體內(nèi)存實在不足!

  • 第六行:這個是當在 top 程序當中輸入命令時,顯示狀態(tài)的地方。

至於 top 下半部分的畫面,則是每個 process 使用的資源情況。比較需要注意的是:

  • PID :每個 process 的 ID 啦!
  • USER:該 process 所屬的使用者;
  • PR :Priority 的簡寫,程序的優(yōu)先運行順序,越小越早被運行;
  • NI :Nice 的簡寫,與 Priority 有關(guān),也是越小越早被運行;
  • %CPU:CPU 的使用率;
  • %MEM:內(nèi)存的使用率;
  • TIME+:CPU 使用時間的累加;

top 默認使用 CPU 使用率 (%CPU) 作為排序的重點,如果你想要使用內(nèi)存使用率排序,則可以按下『M』,若要回復(fù)則按下『P』即可。如果想要離開 top 則按下『 q 』吧!如果你想要將 top 的結(jié)果輸出成為文件時,可以這樣做:

范例二:將 top 的資訊進行 2 次,然后將結(jié)果輸出到 /tmp/top.txt [root@www ~]# top -b -n 2 > /tmp/top.txt # 這樣一來,嘿嘿!就可以將 top 的資訊存到 /tmp/top.txt 文件中了。

這玩意兒很有趣!可以幫助你將某個時段 top 觀察到的結(jié)果存成文件,可以用在你想要在系統(tǒng)背景底下運行。由於是背景底下運行,與終端機的螢?zāi)淮笮o關(guān),因此可以得到全部的程序畫面!那如果你想要觀察的程序 CPU與內(nèi)存使用率都很低,結(jié)果老是無法在第一行顯示時,該怎辦?我們可以僅觀察單一程序喔!如下所示:

范例三:我們自己的 bash PID 可由 $$ 變量取得,請使用 top 持續(xù)觀察該 PID [root@www ~]# echo $$ 13639 <==就是這個數(shù)字!他是我們 bash 的 PID [root@www ~]# top -d 2 -p 13639 top - 17:31:56 up 7 days, 16:45, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 742664k total, 682540k used, 60124k free, 126548k buffers Swap: 1020088k total, 28k used, 1020060k free, 311276k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13639 root 15 0 5148 1508 1220 S 0.0 0.2 0:00.18 bash

看到?jīng)]!就只會有一支程序給你看!很容易觀察吧!好,那么如果我想要在 top 底下進行一些動作呢?比方說,修改 NI 這個數(shù)值呢?可以這樣做:

范例四:承上題,上面的 NI 值是 0 ,想要改成 10 的話? # 在范例三的 top 畫面當中直接按下 r 之后,會出現(xiàn)如下的圖樣! top - 17:34:24 up 7 days, 16:47, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.5%si, 0.0%st Mem: 742664k total, 682540k used, 60124k free, 126636k buffers Swap: 1020088k total, 28k used, 1020060k free, 311276k cached PID to renice: 13639 <==按下 r 然后輸入這個 PID 號碼 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13639 root 15 0 5148 1508 1220 S 0.0 0.2 0:00.18 bash

在你完成上面的動作后,在狀態(tài)列會出現(xiàn)如下的資訊:

Renice PID 13639 to value: 10 <==這是 nice 值 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

接下來你就會看到如下的顯示畫面!

top - 17:38:58 up 7 days, 16:52, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 742664k total, 682540k used, 60124k free, 126648k buffers Swap: 1020088k total, 28k used, 1020060k free, 311276k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13639 root 26 10 5148 1508 1220 S 0.0 0.2 0:00.18 bash

看到不同處了吧?底線的地方就是修改了之后所產(chǎn)生的效果!一般來說,如果鳥哥想要找出最損耗 CPU 資源的那個程序時,大多使用的就是 top 這支程序啦!然后強制以 CPU 使用資源來排序 (在 top 當中按下 P 即可),就可以很快的知道啦! ^_^。多多愛用這個好用的東西喔!


  • pstree
[root@www ~]# pstree [-A|U] [-up] 選項與參數(shù): -A :各程序樹之間的連接以 ASCII 字節(jié)來連接; -U :各程序樹之間的連接以萬國碼的字節(jié)來連接。在某些終端介面下可能會有錯誤; -p :并同時列出每個 process 的 PID; -u :并同時列出每個 process 的所屬帳號名稱。范例一:列出目前系統(tǒng)上面所有的程序樹的相關(guān)性: [root@www ~]# pstree -A init-+-acpid|-atd|-auditd-+-audispd---{audispd} <==這行與底下一行為 auditd 分出來的子程序| `-{auditd}|-automount---4*[{automount}] <==默認情況下,相似的程序會以數(shù)字顯示 ....(中間省略)....|-sshd---sshd---bash---pstree <==就是我們命令運行的那個相依性! ....(底下省略).... # 注意一下,為了節(jié)省版面,所以鳥哥已經(jīng)刪去很多程序了!范例二:承上題,同時秀出 PID 與 users [root@www ~]# pstree -Aup init(1)-+-acpid(4555)|-atd(18593)|-auditd(4256)-+-audispd(4258)---{audispd}(4261)| `-{auditd}(4257)|-automount(4536)-+-{automount}(4537) <==程序相似但 PID 不同!| |-{automount}(4538)| |-{automount}(4541)| `-{automount}(4544) ....(中間省略)....|-sshd(4586)---sshd(16903)---bash(16905)---pstree(16967) ....(中間省略)....|-xfs(4692,xfs) <==因為此程序擁有者并非運行 pstree 者!所以列出帳號 ....(底下省略).... # 在括號 () 內(nèi)的即是 PID 以及該程序的 owner 喔!不過,由於我是使用 # root 的身份運行此一命令,所以屬於 root 的程序就不會顯示出來啦!

如果要找程序之間的相關(guān)性,這個 pstree 真是好用到不行!直接輸入 pstree 可以查到程序相關(guān)性,如上表所示,還會使用線段將相關(guān)性程序連結(jié)起來哩!一般連結(jié)符號可以使用 ASCII 碼即可,但有時因為語系問題會主動的以 Unicode 的符號來連結(jié),但因為可能終端機無法支持該編碼,或許會造成亂碼問題。因此可以加上 -A 選項來克服此類線段亂碼問題。

由 pstree 的輸出我們也可以很清楚的知道,所有的程序都是依附在 init 這支程序底下的!仔細看一下,這支程序的 PID 是一號喔!因為他是由 Linux 核心所主動呼叫的第一支程序!所以 PID 就是一號了。這也是我們剛剛提到僵尸程序時有提到,為啥發(fā)生僵尸程序需要重新啟動?因為 init 要重新啟動,而重新啟動 init 就是 reboot 羅!

如果還想要知道 PID 與所屬使用者,加上 -u 及 -p 兩個參數(shù)即可。我們前面不是一直提到,如果子程序掛點或者是老是砍不掉子程序時,該如何找到父程序嗎?呵呵!用這個 pstree 就對了! ^_^


程序的管理

程序之間是可以互相控制的!舉例來說,你可以關(guān)閉、重新啟動服務(wù)器軟件,服務(wù)器軟件本身是個程序,你既然可以讓她關(guān)閉或啟動,當然就是可以控制該程序啦!那么程序是如何互相管理的呢?其實是透過給予該程序一個訊號 (signal)去告知該程序你想要讓她作什么!因此這個訊號就很重要啦!

我們也在本章之前的 bash 工作管理當中提到過,要給予某個已經(jīng)存在背景中的工作某些動作時,是直接給予一個訊號給該工作號碼即可。那么到底有多少 signal 呢?你可以使用 kill -l (小寫的 L ) 或者是 man 7 signal 都可以查詢到!主要的訊號代號與名稱對應(yīng)及內(nèi)容是:

代號名稱內(nèi)容
1SIGHUP啟動被終止的程序,可讓該 PID 重新讀取自己的配置檔,類似重新啟動
2SIGINT相當於用鍵盤輸入 [ctrl]-c 來中斷一個程序的進行
9SIGKILL代表強制中斷一個程序的進行,如果該程序進行到一半,那么尚未完成的部分可能會有『半產(chǎn)品』產(chǎn)生,類似 vim會有 .filename.swp 保留下來。
15SIGTERM以正常的結(jié)束程序來終止該程序。由於是正常的終止,所以后續(xù)的動作會將他完成。不過,如果該程序已經(jīng)發(fā)生問題,就是無法使用正常的方法終止時,輸入這個 signal 也是沒有用的。
17SIGSTOP相當於用鍵盤輸入 [ctrl]-z 來暫停一個程序的進行

上面僅是常見的 signal 而已,更多的訊號資訊請自行 man 7 signal 吧!一般來說,你只要記得『1, 9, 15』這三個號碼的意義即可。那么我們?nèi)绾蝹魉鸵粋€訊號給某個程序呢?就透過 kill 或 killall 吧!底下分別來看看:


  • kill -signal PID

kill 可以幫我們將這個 signal 傳送給某個工作 (%jobnumber) 或者是某個 PID (直接輸入數(shù)字)。要再次強調(diào)的是: kill 后面直接加數(shù)字與加上 %number 的情況是不同的!這個很重要喔!因為工作控制中有 1 號工作,但是 PID 1 號則是專指『 init 』這支程序!你怎么可以將 init 關(guān)閉呢?關(guān)閉 init ,你的系統(tǒng)就當?shù)袅税?#xff01;所以記得那個 % 是專門用在工作控制的喔!我們就活用一下 kill 與剛剛上面提到的 ps 來做個簡單的練習(xí)吧!

例題: 以 ps 找出 syslog 這個程序的 PID 后,再使用 kill 傳送信息,使得 syslog 可以重新讀取配置檔。 答: 由於需要重新讀取配置檔,因此 signal 是 1 號。至於找出 syslog 的 PID 可以是這樣做: ps aux | grep 'syslog' | grep -v 'grep'| awk '{print $2}' 接下來則是實際使用 kill -1 PID,因此,整串命令會是這樣: kill -SIGHUP $(ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}') 如果要確認有沒有重新啟動 syslog ,可以參考登錄檔的內(nèi)容,使用如下命令查閱: tail -5 /var/log/messages 如果你有看到類似『Mar 19 15:08:20 www syslogd 1.4.1: restart』之類的字樣,就是表示 syslogd 在 3/19 有重新啟動 (restart) 過了!

了解了這個用法以后,如果未來你想要將某個莫名其妙的登陸者的連線刪除的話,就可以透過使用 pstree -p 找到相關(guān)程序,然后再以 kill -9 將該程序刪除,該條連線就會被踢掉了!這樣很簡單吧!


  • killall -signal 命令名稱

由於 kill 后面必須要加上 PID (或者是 job number),所以,通常 kill 都會配合ps,pstree 等命令,因為我們必須要找到相對應(yīng)的那個程序的 ID 嘛!但是,如此一來,很麻煩~有沒有可以利用『下達命令的名稱』來給予訊號的?舉例來說,能不能直接將 syslog 這個程序給予一個 SIGHUP 的訊號呢?可以的!用 killall 吧!

[root@www ~]# killall [-iIe] [command name] 選項與參數(shù): -i :interactive 的意思,互動式的,若需要刪除時,會出現(xiàn)提示字節(jié)給使用者; -e :exact 的意思,表示『后面接的 command name 要一致』,但整個完整的命令不能超過 15 個字節(jié)。 -I :命令名稱(可能含參數(shù))忽略大小寫。范例一:給予 syslogd 這個命令啟動的 PID 一個 SIGHUP 的訊號 [root@www ~]# killall -1 syslogd # 如果用 ps aux 仔細看一下,syslogd 才是完整的命令名稱。但若包含整個參數(shù), # 則 syslogd -m 0 才是完整的呢!范例二:強制終止所有以 httpd 啟動的程序 [root@www ~]# killall -9 httpd范例三:依次詢問每個 bash 程序是否需要被終止運行! [root@www ~]# killall -i -9 bash Kill bash(16905) ? (y/N) n <==這個不殺! Kill bash(17351) ? (y/N) y <==這個殺掉! # 具有互動的功能!可以詢問你是否要刪除 bash 這個程序。要注意,若沒有 -i 的參數(shù), # 所有的 bash 都會被這個 root 給殺掉!包括 root 自己的 bash 喔! ^_^

總之,要刪除某個程序,我們可以使用 PID 或者是啟動該程序的命令名稱,而如果要刪除某個服務(wù)呢?呵呵!最簡單的方法就是利用 killall ,因為他可以將系統(tǒng)當中所有以某個命令名稱啟動的程序全部刪除。舉例來說,上面的范例二當中,系統(tǒng)內(nèi)所有以 httpd 啟動的程序,就會通通的被刪除啦! ^_^


關(guān)於程序的運行順序

我們知道 Linux 是多人多工的環(huán)境,由 top 的輸出結(jié)果我們也發(fā)現(xiàn),系統(tǒng)同時間有非常多的程序在運行中,只是絕大部分的程序都在休眠 (sleeping) 狀態(tài)而已。想一想,如果所有的程序同時被喚醒,那么 CPU 應(yīng)該要先處理那個程序呢?也就是說,那個程序被運行的優(yōu)先序比較高?這就得要考慮到程序的優(yōu)先運行序 (Priority) 與 CPU 排程羅!

Tips:
CPU 排程與前一章的例行性工作排程并不一樣。 CPU 排程指的是每支程序被 CPU 運行的演算守則,而例行性工作排程則是將某支程序安排在某個時間再交由系統(tǒng)運行。 CPU 排程與操作系統(tǒng)較具有相關(guān)性!

  • Priority 與 Nice 值

我們知道 CPU 一秒鐘可以運行多達數(shù) G 的微命令次數(shù),透過核心的 CPU 排程可以讓各程序被 CPU 所切換運行,因此每個程序在一秒鐘內(nèi)或多或少都會被 CPU 運行部分的命令碼。如果程序都是集中在一個佇列中等待 CPU 的運行,而不具有優(yōu)先順序之分,也就是像我們?nèi)ビ螛穲鐾鏌衢T游戲需要排隊一樣,每個人都是照順序來!你玩過一遍后還想再玩 (沒有運行完畢),請到后面繼續(xù)排隊等待。情況有點像底下這樣:


圖 3.3.1、并沒有優(yōu)先順序的程序佇列示意圖

上圖中假設(shè) pro1, pro2 是緊急的程序, pro3, pro4 是一般的程序,在這樣的環(huán)境中,由於不具有優(yōu)先順序,唉啊!pro1, pro2 還是得要繼續(xù)等待而沒有優(yōu)待呢!如果 pro3, pro4 的工作又臭又長!那么緊急的 pro1, pro2 就得要等待個老半天才能夠完成!真麻煩啊!所以羅,我們想要將程序分優(yōu)先順序啦!如果優(yōu)先序較高則運行次數(shù)可以較多次,而不需要與較慢優(yōu)先的程序搶位置!我們可以將程序的優(yōu)先順序與 CPU 排程進行如下圖的解釋:


圖 3.3.2、具有優(yōu)先順序的程序佇列示意圖

如上圖所示,具高優(yōu)先權(quán)的 pro1, pro2 可以被取用兩次,而較不重要的 pro3, pro4 則運行次數(shù)較少。如此一來 pro1, pro2 就可以較快被完成啦!要注意,上圖僅是示意圖,并非較優(yōu)先者一定會被運行兩次啦!為了要達到上述的功能,我們 Linux 給予程序一個所謂的『優(yōu)先運行序 (priority, PRI)』,這個PRI 值越低代表越優(yōu)先的意思。不過這個 PRI 值是由核心動態(tài)調(diào)整的,使用者無法直接調(diào)整 PRI 值的。先來瞧瞧 PRI 曾在哪里出現(xiàn)?

[root@www ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 18625 18623 2 75 0 - 1514 wait pts/1 00:00:00 bash 4 R 0 18653 18625 0 77 0 - 1102 - pts/1 00:00:00 ps

由於 PRI 是核心動態(tài)調(diào)整的,我們使用者也無權(quán)去干涉 PRI !那如果你想要調(diào)整程序的優(yōu)先運行序時,就得要透過 Nice值了!Nice 值就是上表的 NI 啦!一般來說, PRI 與 NI 的相關(guān)性如下:

PRI(new) = PRI(old) + nice

不過你要特別留意到,如果原本的 PRI 是 50 ,并不是我們給予一個 nice = 5 ,就會讓 PRI 變成 55 喔!因為 PRI 是系統(tǒng)『動態(tài)』決定的,所以,雖然 nice 值是可以影響 PRI ,不過,最終的 PRI 仍是要經(jīng)過系統(tǒng)分析后才會決定的。另外, nice 值是有正負的喔,而既然 PRI 越小越早被運行,所以,當 nice 值為負值時,那么該程序就會降低 PRI 值,亦即會變的較優(yōu)先被處理。此外,你必須要留意到:

  • nice 值可調(diào)整的范圍為 -20 ~ 19 ;
  • root 可隨意調(diào)整自己或他人程序的 Nice 值,且范圍為 -20 ~ 19 ;
  • 一般使用者僅可調(diào)整自己程序的 Nice 值,且范圍僅為 0 ~ 19 (避免一般用戶搶占系統(tǒng)資源);
  • 一般使用者僅可將 nice 值越調(diào)越高,例如本來 nice 為 5 ,則未來僅能調(diào)整到大於 5;

這也就是說,要調(diào)整某個程序的優(yōu)先運行序,就是『調(diào)整該程序的 nice 值』啦!那么如何給予某個程序 nice值呢?有兩種方式,分別是:

  • 一開始運行程序就立即給予一個特定的 nice 值:用 nice 命令;
  • 調(diào)整某個已經(jīng)存在的 PID 的 nice 值:用 renice 命令。


  • nice :新運行的命令即給予新的 nice 值
[root@www ~]# nice [-n 數(shù)字] command 選項與參數(shù): -n :后面接一個數(shù)值,數(shù)值的范圍 -20 ~ 19。范例一:用 root 給一個 nice 值為 -5 ,用於運行 vi ,并觀察該程序! [root@www ~]# nice -n -5 vi & [1] 18676 [root@www ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 18625 18623 0 75 0 - 1514 wait pts/1 00:00:00 bash 4 T 0 18676 18625 0 72 -5 - 1242 finish pts/1 00:00:00 vi 4 R 0 18678 18625 0 77 0 - 1101 - pts/1 00:00:00 ps # 原本的 bash PRI 為 75 ,所以 vi 默認應(yīng)為 75。不過由於給予 nice 為 -5 , # 因此 vi 的 PRI 降低了!但并非降低到 70 ,因為核心還會動態(tài)調(diào)整![root@www ~]# kill -9 %1 <==測試完畢將 vi 關(guān)閉

就如同前面說的, nice 是用來調(diào)整程序的運行優(yōu)先順序!這里只是一個運行的范例罷了!通常什么時候要將 nice 值調(diào)大呢?舉例來說,系統(tǒng)的背景工作中,某些比較不重要的程序之進行:例如備份工作!由於備份工作相當?shù)暮南到y(tǒng)資源,這個時候就可以將備份的命令之 nice 值調(diào)大一些,可以使系統(tǒng)的資源分配的更為公平!


  • renice :已存在程序的 nice 重新調(diào)整
[root@www ~]# renice [number] PID 選項與參數(shù): PID :某個程序的 ID 啊!范例一:找出自己的 bash PID ,并將該 PID 的 nice 調(diào)整到 10 [root@www ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 18625 18623 0 75 0 - 1514 wait pts/1 00:00:00 bash 4 R 0 18712 18625 0 77 0 - 1102 - pts/1 00:00:00 ps[root@www ~]# renice 10 18625 18625: old priority 0, new priority 10[root@www ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 18625 18623 0 85 10 - 1514 wait pts/1 00:00:00 bash 4 R 0 18715 18625 0 87 10 - 1102 - pts/1 00:00:00 ps

如果要調(diào)整的是已經(jīng)存在的某個程序的話,那么就得要使用 renice 了。使用的方法很簡單,renice 后面接上數(shù)值及 PID 即可。因為后面接的是 PID ,所以你務(wù)必要以 ps 或者其他程序觀察的命令去找出 PID 才行啊!

由上面這個范例當中我們也看的出來,雖然修改的是 bash 那個程序,但是該程序所觸發(fā)的 ps 命令當中的 nice 也會繼承而為 10 喔!了解了吧!整個 nice 值是可以在父程序 --> 子程序之間傳遞的呢!另外,除了 renice 之外,其實那個top 同樣的也是可以調(diào)整 nice 值的!


系統(tǒng)資源的觀察

除了系統(tǒng)的程序之外,我們還必須就系統(tǒng)的一些資源進行檢查啊!舉例來說,我們使用 top 可以看到很多系統(tǒng)的資源對吧!那么,還有沒有其他的工具可以查閱的?當然有啊!底下這些工具命令可以玩一玩!


  • free :觀察內(nèi)存使用情況
[root@www ~]# free [-b|-k|-m|-g] [-t] 選項與參數(shù): -b :直接輸入 free 時,顯示的單位是 Kbytes,我們可以使用 b(bytes), m(Mbytes)k(Kbytes), 及 g(Gbytes) 來顯示單位喔! -t :在輸出的最終結(jié)果,顯示實體內(nèi)存與 swap 的總量。范例一:顯示目前系統(tǒng)的內(nèi)存容量 [root@www ~]# free -mtotal used free shared buffers cached Mem: 725 666 59 0 132 287 -/+ buffers/cache: 245 479 Swap: 996 0 996

仔細看看,我的系統(tǒng)當中有 725MB 左右的實體內(nèi)存,我的 swap 有 1GB 左右,那我使用 free -m 以 MBytes 來顯示時,就會出現(xiàn)上面的資訊。Mem 那一行顯示的是實體內(nèi)存的量,Swap 則是虛擬內(nèi)存的量。 total 是總量, used 是已被使用的量, free 則是剩余可用的量。后面的 shared/buffers/cached 則是在已被使用的量當中,用來作為緩沖及緩存的量。

仔細的看到范例一的輸出喔,我們的 Linux 測試用主機是很平凡的,根本沒有什么工作,但是,我的實體內(nèi)存是幾乎被用光光的情況呢!不過,至少有 132MB 用在緩沖記憶 (buffers) 工作,287MB 則用在緩存 (cached) 工作,也就是說,系統(tǒng)是『很有效率的將所有的內(nèi)存用光光』,目的是為了讓系統(tǒng)的存取效能加速啦!

很多朋友都會問到這個問題『我的系統(tǒng)明明很輕松,為何內(nèi)存會被用光光?』現(xiàn)在了了吧?被用光是正常的!而需要注意的反而是 swap 的量。一般來說, swap 最好不要被使用,尤其 swap 最好不要被使用超過 20% 以上,如果您發(fā)現(xiàn) swap 的用量超過 20% ,那么,最好還是買實體內(nèi)存來插吧!因為, Swap 的效能跟實體內(nèi)存實在差很多,而系統(tǒng)會使用到 swap ,絕對是因為實體內(nèi)存不足了才會這樣做的!如此,了解吧!

Tips:
Linux 系統(tǒng)為了要加速系統(tǒng)效能,所以會將最常使用到的或者是最近使用到的文件數(shù)據(jù)緩存 (cache) 下來,這樣未來系統(tǒng)要使用該文件時,就直接由內(nèi)存中搜尋取出,而不需要重新讀取硬盤,速度上面當然就加快了!因此,實體內(nèi)存被用光是正常的喔!

  • uname:查閱系統(tǒng)與核心相關(guān)資訊
[root@www ~]# uname [-asrmpi] 選項與參數(shù): -a :所有系統(tǒng)相關(guān)的資訊,包括底下的數(shù)據(jù)都會被列出來; -s :系統(tǒng)核心名稱 -r :核心的版本 -m :本系統(tǒng)的硬件名稱,例如 i686 或 x86_64 等; -p :CPU 的類型,與 -m 類似,只是顯示的是 CPU 的類型! -i :硬件的平臺 (ix86)范例一:輸出系統(tǒng)的基本資訊 [root@www ~]# uname -a Linux www.vbird.tsai 2.6.18-92.el5 #1 SMP Tue Jun 10 18:49:47 EDT 2008 i686 i686 i386 GNU/Linux

這個咚咚我們前面使用過很多次了喔!uname 可以列出目前系統(tǒng)的核心版本、主要硬件平臺以及 CPU 類型等等的資訊。以上面范例一的狀態(tài)來說,我的 Linux 主機使用的核心名稱為 Linux,而主機名稱為 www.vbird.tsai,核心的版本為2.6.18-92.el5 ,該核心版本創(chuàng)建的日期為 2008/6/10,適用的硬件平臺為 i386 以上等級的硬件平臺喔。


  • uptime:觀察系統(tǒng)啟動時間與工作負載

這個命令很單純呢!就是顯示出目前系統(tǒng)已經(jīng)啟動多久的時間,以及 1, 5, 15 分鐘的平均負載就是了。還記得 top 吧?沒錯啦!這個 uptime 可以顯示出 top 畫面的最上面一行!

[root@www ~]# uptime15:39:13 up 8 days, 14:52, 1 user, load average: 0.00, 0.00, 0.00 # top 這個命令已經(jīng)談過相關(guān)資訊,不再聊!


  • netstat :追蹤網(wǎng)絡(luò)或插槽檔

這個 netstat 也是挺好玩的,其實這個命令比較常被用在網(wǎng)絡(luò)的監(jiān)控方面,不過,在程序管理方面也是需要了解的啦!這個命令的運行如下所示:基本上, netstat 的輸出分為兩大部分,分別是網(wǎng)絡(luò)與系統(tǒng)自己的程序相關(guān)性部分:

[root@www ~]# netstat -[atunlp] 選項與參數(shù): -a :將目前系統(tǒng)上所有的連線、監(jiān)聽、Socket 數(shù)據(jù)都列出來 -t :列出 tcp 網(wǎng)絡(luò)封包的數(shù)據(jù) -u :列出 udp 網(wǎng)絡(luò)封包的數(shù)據(jù) -n :不以程序的服務(wù)名稱,以埠號 (port number) 來顯示; -l :列出目前正在網(wǎng)絡(luò)監(jiān)聽 (listen) 的服務(wù); -p :列出該網(wǎng)絡(luò)服務(wù)的程序 PID 范例一:列出目前系統(tǒng)已經(jīng)創(chuàng)建的網(wǎng)絡(luò)連線與 unix socket 狀態(tài) [root@www ~]# netstat Active Internet connections (w/o servers) <==與網(wǎng)絡(luò)較相關(guān)的部分 Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 132 192.168.201.110:ssh 192.168.:vrtl-vmf-sa ESTABLISHED Active UNIX domain sockets (w/o servers) <==與本機的程序自己的相關(guān)性(非網(wǎng)絡(luò)) Proto RefCnt Flags Type State I-Node Path unix 20 [ ] DGRAM 9153 /dev/log unix 3 [ ] STREAM CONNECTED 13317 /tmp/.X11-unix/X0 unix 3 [ ] STREAM CONNECTED 13233 /tmp/.X11-unix/X0 unix 3 [ ] STREAM CONNECTED 13208 /tmp/.font-unix/fs7100 ....(中間省略)....

在上面的結(jié)果當中,顯示了兩個部分,分別是網(wǎng)絡(luò)的連線以及 linux 上面的 socket 程序相關(guān)性部分。我們先來看看網(wǎng)際網(wǎng)絡(luò)連線情況的部分:

  • Proto :網(wǎng)絡(luò)的封包協(xié)議,主要分為 TCP 與 UDP 封包,相關(guān)數(shù)據(jù)請參考服務(wù)器篇;
  • Recv-Q:非由使用者程序連結(jié)到此 socket 的復(fù)制的總 bytes 數(shù);
  • Send-Q:非由遠程主機傳送過來的 acknowledged 總 bytes 數(shù);
  • Local Address :本地端的 IP:port 情況
  • Foreign Address:遠程主機的 IP:port 情況
  • State :連線狀態(tài),主要有創(chuàng)建(ESTABLISED)及監(jiān)聽(LISTEN);

我們看上面僅有一條連線的數(shù)據(jù),他的意義是:『透過 TCP 封包的連線,遠程的 192.168.:vrtl.. 連線到本地端的192.168.201.110:ssh ,這條連線狀態(tài)是創(chuàng)建 (ESTABLISHED) 的狀態(tài)!』至於更多的網(wǎng)絡(luò)環(huán)境說明,就得到鳥哥的另一本服務(wù)器篇查閱羅!

除了網(wǎng)絡(luò)上的連線之外,其實 Linux 系統(tǒng)上面的程序是可以接收不同程序所發(fā)送來的資訊,那就是 Linux 上頭的插槽檔 (socket file)。我們在第六章的文件種類有稍微提到 socket 文件,但當時未談到程序的概念,所以沒有深入談?wù)摗ocket file 可以溝通兩個程序之間的資訊,因此程序可以取得對方傳送過來的數(shù)據(jù)。由於有 socket file,因此類似 X Window 這種需要透過網(wǎng)絡(luò)連接的軟件,目前新版的 distributions 就以 socket 來進行窗口介面的連線溝通了。上表中 socket file 的輸出欄位有:

  • Proto :一般就是 unix 啦;
  • RefCnt:連接到此 socket 的程序數(shù)量;
  • Flags :連線的旗標;
  • Type :socket 存取的類型。主要有確認連線的 STREAM 與不需確認的 DGRAM 兩種;
  • State :若為 CONNECTED 表示多個程序之間已經(jīng)連線創(chuàng)建。
  • Path :連接到此 socket 的相關(guān)程序的路徑!或者是相關(guān)數(shù)據(jù)輸出的路徑。

以上表的輸出為例,最后那三行在 /tmp/.xx 底下的數(shù)據(jù),就是 X Window 窗口介面的相關(guān)程序啦!而 PATH 指向的就是這些程序要交換數(shù)據(jù)的插槽文件羅!好!那么 netstat 可以幫我們進行什么任務(wù)呢?很多喔!我們先來看看,利用 netstat 去看看我們的哪些程序有啟動哪些網(wǎng)絡(luò)的『后門』呢?

范例二:找出目前系統(tǒng)上已在監(jiān)聽的網(wǎng)絡(luò)連線及其 PID [root@www ~]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 4566/hpiod tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4328/portmap tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 4597/cupsd tcp 0 0 0.0.0.0:728 0.0.0.0:* LISTEN 4362/rpc.statd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 4629/sendmail: tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 4571/python tcp 0 0 :::22 :::* LISTEN 4586/sshd # 除了可以列出監(jiān)聽網(wǎng)絡(luò)的介面與狀態(tài)之外,最后一個欄位還能夠顯示此服務(wù)的 # PID 號碼以及程序的命令名稱喔!例如最后一行的 4586 就是該 PID范例三:將上述的本地端 127.0.0.1:631 那個網(wǎng)絡(luò)服務(wù)關(guān)閉的話? [root@www ~]# kill -9 4597 [root@www ~]# killall -9 cupsd

很多朋友常常有疑問,那就是,我的主機目前到底開了幾個門(ports)!其實,不論主機提供什么樣的服務(wù),一定必須要有相對應(yīng)的 program 在主機上面運行才行啊!舉例來說,我們鳥園的 Linux 主機提供的就是 WWW 服務(wù),那么我的主機當然有一個程序在提供 WWW 的服務(wù)啊!那就是 Apache 這個軟件所提供的啦! ^_^。所以,當我運行了這個程序之后,我的系統(tǒng)自然就可以提供 WWW 的服務(wù)了。那如何關(guān)閉啊?就關(guān)掉該程序所觸發(fā)的那個程序就好了!例如上面的范例三所提供的例子啊! ^_^


  • dmesg :分析核心產(chǎn)生的信息

系統(tǒng)在啟動的時候,核心會去偵測系統(tǒng)的硬件,你的某些硬件到底有沒有被捉到,那就與這個時候的偵測有關(guān)。但是這些偵測的過程要不是沒有顯示在螢?zāi)簧?#xff0c;就是很飛快的在螢?zāi)簧弦婚W而逝!能不能把核心偵測的信息捉出來瞧瞧?可以的,那就使用 dmesg 吧!

所有核心偵測的信息,不管是啟動時候還是系統(tǒng)運行過程中,反正只要是核心產(chǎn)生的信息,都會被記錄到內(nèi)存中的某個保護區(qū)段。dmesg 這個命令就能夠?qū)⒃搮^(qū)段的信息讀出來的!因為信息實在太多了,所以運行時可以加入這個管線命令『 | more 』來使畫面暫停!

范例一:輸出所有的核心啟動時的資訊 [root@www ~]# dmesg | more范例二:搜尋啟動的時候,硬盤的相關(guān)資訊為何? [root@www ~]# dmesg | grep -i hdide0: BM-DMA at 0xd800-0xd807, BIOS settings: hda:DMA, hdb:DMAide1: BM-DMA at 0xd808-0xd80f, BIOS settings: hdc:pio, hdd:pio hda: IC35L040AVER07-0, ATA DISK drive hdb: ASUS DRW-2014S1, ATAPI CD/DVD-ROM drive hda: max request size: 128KiB ....(底下省略)....

由范例二就知道我這部主機的硬盤的格式是什么了吧!沒錯啦!還可以查閱能不能找到網(wǎng)絡(luò)卡喔!網(wǎng)絡(luò)卡的代號是 eth ,所以,直接輸入 dmesg | grep -i eth 試看看呢!


  • vmstat :偵測系統(tǒng)資源變化

如果你想要動態(tài)的了解一下系統(tǒng)資源的運行,那么這個 vmstat 確實可以玩一玩!vmstat 可以偵測『 CPU /內(nèi)存 / 磁碟輸入輸出狀態(tài) 』等等,如果你想要了解一部繁忙的系統(tǒng)到底是哪個環(huán)節(jié)最累人,可以使用 vmstat 分析看看。底下是常見的選項與參數(shù)說明:

[root@www ~]# vmstat [-a] [延遲 [總計偵測次數(shù)]] <==CPU/內(nèi)存等資訊 [root@www ~]# vmstat [-fs] <==內(nèi)存相關(guān) [root@www ~]# vmstat [-S 單位] <==配置顯示數(shù)據(jù)的單位 [root@www ~]# vmstat [-d] <==與磁碟有關(guān) [root@www ~]# vmstat [-p 分割槽] <==與磁碟有關(guān) 選項與參數(shù): -a :使用 inactive/active(活躍與否) 取代 buffer/cache 的內(nèi)存輸出資訊; -f :啟動到目前為止,系統(tǒng)復(fù)制 (fork) 的程序數(shù); -s :將一些事件 (啟動至目前為止) 導(dǎo)致的內(nèi)存變化情況列表說明; -S :后面可以接單位,讓顯示的數(shù)據(jù)有單位。例如 K/M 取代 bytes 的容量; -d :列出磁碟的讀寫總量統(tǒng)計表 -p :后面列出分割槽,可顯示該分割槽的讀寫總量統(tǒng)計表范例一:統(tǒng)計目前主機 CPU 狀態(tài),每秒一次,共計三次! [root@www ~]# vmstat 1 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------r b swpd free buff cache si so bi bo in cs us sy id wa st0 0 28 61540 137000 291960 0 0 4 5 38 55 0 0 100 0 00 0 28 61540 137000 291960 0 0 0 0 1004 50 0 0 100 0 00 0 28 61540 137000 291964 0 0 0 0 1022 65 0 0 100 0 0

利用 vmstat 甚至可以進行追蹤?quán)?#xff01;你可以使用類似『 vmstat 5 』代表每五秒鐘升級一次,且無窮的升級!直到你按下 [ctrl]-c 為止。如果你想要即時的知道系統(tǒng)資源的運行狀態(tài),這個命令就不能不知道!那么上面的表格各項欄位的意義為何?基本說明如下:

  • 內(nèi)存欄位 (procs) 的項目分別為:
    r :等待運行中的程序數(shù)量;b:不可被喚醒的程序數(shù)量。這兩個項目越多,代表系統(tǒng)越忙碌 (因為系統(tǒng)太忙,所以很多程序就無法被運行或一直在等待而無法被喚醒之故)。

  • 內(nèi)存欄位 (memory) 項目分別為:
    swpd:虛擬內(nèi)存被使用的容量; free:未被使用的內(nèi)存容量; buff:用於緩沖內(nèi)存; cache:用於高速緩存。這部份則與 free 是相同的。

  • 內(nèi)存置換空間 (swap) 的項目分別為:
    si:由磁碟中將程序取出的量; so:由於內(nèi)存不足而將沒用到的程序?qū)懭氲酱诺?swap 的容量。如果 si/so 的數(shù)值太大,表示內(nèi)存內(nèi)的數(shù)據(jù)常常得在磁碟與主內(nèi)存之間傳來傳去,系統(tǒng)效能會很差!

  • 磁碟讀寫 (io) 的項目分別為:
    bi:由磁碟寫入的區(qū)塊數(shù)量; bo:寫入到磁碟去的區(qū)塊數(shù)量。如果這部份的值越高,代表系統(tǒng)的 I/O 非常忙碌!

  • 系統(tǒng) (system) 的項目分別為:
    in:每秒被中斷的程序次數(shù); cs:每秒鐘進行的事件切換次數(shù);這兩個數(shù)值越大,代表系統(tǒng)與周邊設(shè)備的溝通非常頻繁!這些周邊設(shè)備當然包括磁碟、網(wǎng)絡(luò)卡、時間鐘等。

  • CPU 的項目分別為:
    us:非核心層的 CPU 使用狀態(tài); sy:核心層所使用的 CPU 狀態(tài); id:閑置的狀態(tài); wa:等待 I/O 所耗費的 CPU 狀態(tài);st:被虛擬機器 (virtual machine) 所盜用的 CPU 使用狀態(tài) (2.6.11 以后才支持)。

由於鳥哥的機器是測試機,所以并沒有什么 I/O 或者是 CPU 忙碌的情況。如果改天你的服務(wù)器非常忙碌時,記得使用 vmstat 去看看,到底是哪個部分的資源被使用的最為頻繁!一般來說,如果 I/O 部分很忙碌的話,你的系統(tǒng)會變的非常慢!讓我們再來看看,那么磁碟的部分該如何觀察:

范例二:系統(tǒng)上面所有的磁碟的讀寫狀態(tài) [root@www ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec ram0 0 0 0 0 0 0 0 0 0 0 ....(中間省略).... hda 144188 182874 6667154 7916979 151341 510244 8027088 15244705 0 848 hdb 0 0 0 0 0 0 0 0 0 0

詳細的各欄位就請諸位大德查閱一下 man vmstat 羅!反正與讀寫有關(guān)啦!這樣了解乎!


特殊文件與程序

我們在第七章曾經(jīng)談到特殊權(quán)限的 SUID/SGID/SBIT,雖然第七章已經(jīng)將這三種特殊權(quán)限作了詳細的解釋,不過,我們依舊要來探討的是,那么到底這些權(quán)限對於你的『程序』是如何影響的?此外,程序可能會使用到系統(tǒng)資源,舉例來說,磁碟就是其中一項資源。哪天你在 umount 磁碟時,系統(tǒng)老是出現(xiàn)『 device is busy 』的字樣~到底是怎么回事啊?我們底下就來談一談這些和程序有關(guān)系的細節(jié)部分:


具有 SUID/SGID 權(quán)限的命令運行狀態(tài)

SUID 的權(quán)限其實與程序的相關(guān)性非常的大!為什么呢?先來看看 SUID 的程序是如何被一般使用者運行,且具有什么特色呢?

  • SUID 權(quán)限僅對二進位程序(binary program)有效;
  • 運行者對於該程序需要具有 x 的可運行權(quán)限;
  • 本權(quán)限僅在運行該程序的過程中有效 (run-time);
  • 運行者將具有該程序擁有者 (owner) 的權(quán)限。

所以說,整個 SUID 的權(quán)限會生效是由於『具有該權(quán)限的程序被觸發(fā)』,而我們知道一個程序被觸發(fā)會變成程序,所以羅,運行者可以具有程序擁有者的權(quán)限就是在該程序變成程序的那個時候啦!第七章我們還沒談到程序的概念,所以你或許那時候會覺得很奇怪,為啥運行了 passwd 后你就具有 root 的權(quán)限呢?不都是一般使用者運行的嗎?這是因為你在觸發(fā) passwd 后,會取得一個新的程序與 PID,該 PID 產(chǎn)生時透過 SUID 來給予該 PID 特殊的權(quán)限配置啦!我們使用 dmtsai 登陸系統(tǒng)且運行 passwd 后,透過工作控制來理解一下!

[dmtsai@www ~]$ passwd Changing password for user dmtsai. Changing password for dmtsai (current) UNIX password: <==這里按下 [ctrl]-z 并且按下 [enter] [1]+ Stopped passwd[dmtsai@www ~]$ pstree -u init-+-acpid ....(中間省略)....|-sshd---sshd---sshd(dmtsai)---bash-+-more| |-passwd(root)| `-pstree ....(底下省略)....

從上表的結(jié)果我們可以發(fā)現(xiàn),底線的部分是屬於 dmtsai 這個一般帳號的權(quán)限,特殊字體的則是 root 的權(quán)限!但你看到了, passwd 確實是由 bash 衍生出來的!不過就是權(quán)限不一樣!透過這樣的解析,你也會比較清楚為何不同程序所產(chǎn)生的權(quán)限不同了吧!這是由於『SUID 程序運行過程中產(chǎn)生的程序』的關(guān)系啦!

那么既然 SUID/SGID 的權(quán)限是比較可怕的,您該如何查詢整個系統(tǒng)的 SUID/SGID 的文件呢?應(yīng)該是還不會忘記吧?使用 find 即可啊!

find / -perm +6000
/proc/* 代表的意義

其實,我們之前提到的所謂的程序都是在內(nèi)存當中嘛!而內(nèi)存當中的數(shù)據(jù)又都是寫入到/proc/* 這個目錄下的,所以羅,我們當然可以直接觀察 /proc 這個目錄當中的文件啊!如果你觀察過 /proc 這個目錄的話,應(yīng)該會發(fā)現(xiàn)他有點像這樣:

[root@www ~]# ll /proc dr-xr-xr-x 5 root root 0 Mar 11 08:46 1 dr-xr-xr-x 5 root root 0 Mar 11 00:46 10 dr-xr-xr-x 5 root root 0 Mar 11 00:46 11 ....(中間省略).... -r--r--r-- 1 root root 0 Mar 20 12:11 uptime -r--r--r-- 1 root root 0 Mar 20 12:11 version -r--r--r-- 1 root root 0 Mar 20 12:11 vmstat -r--r--r-- 1 root root 0 Mar 20 12:11 zoneinfo

基本上,目前主機上面的各個程序的 PID 都是以目錄的型態(tài)存在於 /proc 當中。舉例來說,我們啟動所運行的第一支程序 init 他的 PID 是 1 ,這個 PID 的所有相關(guān)資訊都寫入在 /proc/1/* 當中!若我們直接觀察 PID 為 1 的數(shù)據(jù)好了,他有點像這樣:

[root@www ~]# ll /proc/1 dr-xr-xr-x 2 root root 0 Mar 12 11:04 attr -r-------- 1 root root 0 Mar 17 14:32 auxv -r--r--r-- 1 root root 0 Mar 17 14:32 cmdline <==就是命令串 -rw-r--r-- 1 root root 0 Mar 17 14:32 coredump_filter -r--r--r-- 1 root root 0 Mar 17 14:32 cpuset lrwxrwxrwx 1 root root 0 Mar 17 14:32 cwd -> / -r-------- 1 root root 0 Mar 17 14:32 environ <==一些環(huán)境變量 lrwxrwxrwx 1 root root 0 Mar 17 14:32 exe -> /sbin/init <==實際運行的命令 ....(以下省略)....

里面的數(shù)據(jù)還挺多的,不過,比較有趣的其實是兩個文件,分別是:

  • cmdline:這個程序被啟動的命令串;
  • environ:這個程序的環(huán)境變量內(nèi)容。

很有趣吧!如果你查閱一下 cmdline 的話,就會發(fā)現(xiàn):

[root@www ~]# cat /proc/1/cmdline init [5]

就是這個命令、選項與參數(shù)啟動 init 的啦!這還是跟某個特定的 PID 有關(guān)的內(nèi)容呢,如果是針對整個 Linux 系統(tǒng)相關(guān)的參數(shù)呢?那就是在 /proc 目錄底下的文件啦!相關(guān)的文件與對應(yīng)的內(nèi)容是這樣的:(注3)

檔名文件內(nèi)容
/proc/cmdline加載 kernel 時所下達的相關(guān)參數(shù)!查閱此文件,可了解系統(tǒng)是如何啟動的!
/proc/cpuinfo本機的 CPU 的相關(guān)資訊,包含時脈、類型與運算功能等
/proc/devices這個文件記錄了系統(tǒng)各個主要裝置的主要裝置代號,與 mknod 有關(guān)呢!
/proc/filesystems目前系統(tǒng)已經(jīng)加載的文件系統(tǒng)羅!
/proc/interrupts目前系統(tǒng)上面的 IRQ 分配狀態(tài)。
/proc/ioports目前系統(tǒng)上面各個裝置所配置的 I/O 位址。
/proc/kcore這個就是內(nèi)存的大小啦!好大對吧!但是不要讀他啦!
/proc/loadavg還記得 top 以及 uptime 吧?沒錯!上頭的三個平均數(shù)值就是記錄在此!
/proc/meminfo使用 free 列出的內(nèi)存資訊,嘿嘿!在這里也能夠查閱到!
/proc/modules目前我們的 Linux 已經(jīng)加載的模塊列表,也可以想成是驅(qū)動程序啦!
/proc/mounts系統(tǒng)已經(jīng)掛載的數(shù)據(jù),就是用 mount 這個命令呼叫出來的數(shù)據(jù)啦!
/proc/swaps到底系統(tǒng)掛加載的內(nèi)存在哪里?呵呵!使用掉的 partition 就記錄在此啦!
/proc/partitions使用 fdisk -l 會出現(xiàn)目前所有的 partition 吧?在這個文件當中也有紀錄喔!
/proc/pci在 PCI 匯流排上面,每個裝置的詳細情況!可用 lspci 來查閱!
/proc/uptime就是用 uptime 的時候,會出現(xiàn)的資訊啦!
/proc/version核心的版本,就是用 uname -a 顯示的內(nèi)容啦!
/proc/bus/*一些匯流排的裝置,還有 U盤 的裝置也記錄在此喔!

其實,上面這些文件鳥哥在此建議您可以使用 cat 去查閱看看,不必深入了解,不過,觀看過文件內(nèi)容后,畢竟會比較有感覺啦!如果未來您想要自行撰寫某些工具軟件,那么這個目錄底下的相關(guān)文件可能會對您有點幫助的喔!


查詢已開啟文件或已運行程序開啟之文件

其實還有一些與程序相關(guān)的命令可以值得參考與應(yīng)用的,我們來談一談:


  • fuser:藉由文件(或文件系統(tǒng))找出正在使用該文件的程序

有的時候我想要知道我的程序到底在這次啟動過程中開啟了多少文件,可以利用 fuser 來觀察啦!舉例來說,你如果卸載時發(fā)現(xiàn)系統(tǒng)通知:『 device is busy 』,那表示這個文件系統(tǒng)正在忙碌中,表示有某支程序有利用到該文件系統(tǒng)啦!那么你就可以利用 fuser 來追蹤羅!fuser 語法有點像這樣:

[root@www ~]# fuser [-umv] [-k [i] [-signal]] file/dir 選項與參數(shù): -u :除了程序的 PID 之外,同時列出該程序的擁有者; -m :后面接的那個檔名會主動的上提到該文件系統(tǒng)的最頂層,對 umount 不成功很有效! -v :可以列出每個文件與程序還有命令的完整相關(guān)性! -k :找出使用該文件/目錄的 PID ,并試圖以 SIGKILL 這個訊號給予該 PID; -i :必須與 -k 配合,在刪除 PID 之前會先詢問使用者意愿! -signal:例如 -1 -15 等等,若不加的話,默認是 SIGKILL (-9) 羅!范例一:找出目前所在目錄的使用 PID/所屬帳號/權(quán)限 為何? [root@www ~]# fuser -uv .USER PID ACCESS COMMAND .: root 20639 ..c.. (root)bash

看到輸出的結(jié)果沒?他說『.』底下有個 PID 為 20639 的程序,該程序?qū)凫?root 且命令為 bash 。比較有趣的是那個 ACCESS 的項目,那個項目代表的意義為:

  • c :此程序在當前的目錄下(非次目錄);
  • e :可被觸發(fā)為運行狀態(tài);
  • f :是一個被開啟的文件;
  • r :代表頂層目錄 (root directory);
  • F :該文件被開啟了,不過在等待回應(yīng)中;
  • m :可能為分享的動態(tài)函式庫;

那如果你想要查閱某個文件系統(tǒng)底下有多少程序正在占用該文件系統(tǒng)時,那個 -m 的選項就很有幫助了!鳥哥的測試主機僅有分割出 /, /boot, /home ,所以無法進行測試。不過好在還有個 /proc 的虛擬文件系統(tǒng),讓我們來了解一下這個 /proc 的文件系統(tǒng)有多少程序正在利用他吧!

范例二:找到所有使用到 /proc 這個文件系統(tǒng)的程序吧! [root@www ~]# fuser -uv /proc # 不會顯示任何數(shù)據(jù),因為沒有任何程序會去使用 /proc 這個目錄啊! # 會被用到的是 /proc 底下的文件啦!所以你應(yīng)該要這樣做:[root@www ~]# fuser -mvu /procUSER PID ACCESS COMMAND /proc: root 4289 f.... (root)klogdroot 4555 f.... (root)acpidhaldaemon 4758 f.... (haldaemon)haldroot 4977 F.... (root)Xorg # 有這幾支程序在進行 /proc 文件系統(tǒng)的存取喔!這樣清楚了嗎?

既然可以針對整個文件系統(tǒng),那么能不能僅針對單一文件啊?當然可以羅!看一下底下的案例先:

范例三:找到 /var 底下屬於 FIFO 類型的文件,并且找出存取該文件的程序 [root@www ~]# find /var -type p /var/gdm/.gdmfifo <==我們針對這玩意即可! /var/run/autofs.fifo-misc /var/run/autofs.fifo-net[root@www ~]# fuser -uv /var/gdm/.gdmfifoUSER PID ACCESS COMMAND /var/gdm/.gdmfifo: root 4892 F.... (root)gdm-binary范例四:同范例三,但試圖刪除該 PID?且『不要』刪除喔! [root@www ~]# fuser -ki /var/gdm/.gdmfifo /var/gdm/.gdmfifo: 4892 Kill process 4892 ? (y/N) n

如何?很有趣的一個命令吧!透過這個 fuser 我們可以找出使用該文件、目錄的程序,藉以觀察的啦!他的重點與 ps, pstree 不同。 fuser 可以讓我們了解到某個文件 (或文件系統(tǒng)) 目前正在被哪些程序所利用!


  • lsof :列出被程序所開啟的文件檔名

相對於 fuser 是由文件或者裝置去找出使用該文件或裝置的程序,反過來說,如何查出某個程序開啟或者使用的文件與裝置呢?呼呼!那就是使用 lsof 羅~

[root@www ~]# lsof [-aUu] [+d] 選項與參數(shù): -a :多項數(shù)據(jù)需要『同時成立』才顯示出結(jié)果時! -U :僅列出 Unix like 系統(tǒng)的 socket 文件類型; -u :后面接 username,列出該使用者相關(guān)程序所開啟的文件; +d :后面接目錄,亦即找出某個目錄底下已經(jīng)被開啟的文件!范例一:列出目前系統(tǒng)上面所有已經(jīng)被開啟的文件與裝置: [root@www ~]# lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,2 4096 2 / init 1 root rtd DIR 3,2 4096 2 / init 1 root txt REG 3,2 38620 1426405 /sbin/init ....(底下省略).... # 注意到了嗎?是的,在默認的情況下, lsof 會將目前系統(tǒng)上面已經(jīng)開啟的 # 文件全部列出來~所以,畫面多的嚇人啊!您可以注意到,第一個文件 init 運行的 # 地方就在根目錄,而根目錄,嘿嘿!所在的 inode 也有顯示出來喔!范例二:僅列出關(guān)於 root 的所有程序開啟的 socket 文件 [root@www ~]# lsof -u root -a -U COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME udevd 400 root 3u unix 0xedd4cd40 1445 socket auditd 4256 root 7u unix 0xedd4c380 9081 socket audispd 4258 root 0u unix 0xedd4c1e0 9080 socket # 注意到那個 -a 吧!如果你分別輸入 lsof -u root 及 lsof -U ,會有啥資訊? # 使用 lsof -u root -U 及 lsof -u root -a -U ,呵呵!都不同啦! # -a 的用途就是在解決同時需要兩個項目都成立時啊! ^_^范例三:請列出目前系統(tǒng)上面所有的被啟動的周邊裝置 [root@www ~]# lsof +d /dev COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root 10u FIFO 0,16 1147 /dev/initctl udevd 400 root 0u CHR 1,3 1420 /dev/null udevd 400 root 1u CHR 1,3 1420 /dev/null udevd 400 root 2u CHR 1,3 1420 /dev/null # 看吧!因為裝置都在 /dev 里面嘛!所以羅,使用搜尋目錄即可啊!范例四:秀出屬於 root 的 bash 這支程序所開啟的文件 [root@www ~]# lsof -u root | grep bash bash 20639 root cwd DIR 3,2 4096 648321 /root bash 20639 root rtd DIR 3,2 4096 2 / bash 20639 root txt REG 3,2 735004 1199424 /bin/bash bash 20639 root mem REG 3,2 46680 64873 /lib/libnss_files-2.5.so ....(底下省略)....

這個命令可以找出您想要知道的某個程序是否有激活哪些資訊?例如上頭提到的范例四的運行結(jié)果呢! ^_^


  • pidof :找出某支正在運行的程序的 PID
[root@www ~]# pidof [-sx] program_name 選項與參數(shù): -s :僅列出一個 PID 而不列出所有的 PID -x :同時列出該 program name 可能的 PPID 那個程序的 PID范例一:列出目前系統(tǒng)上面 init 以及 syslogd 這兩個程序的 PID [root@www ~]# pidof init syslogd 1 4286 # 理論上,應(yīng)該會有兩個 PID 才對。上面的顯示也是出現(xiàn)了兩個 PID 喔。 # 分別是 init 及 syslogd 這兩支程序的 PID 啦。

很簡單的用法吧,透過這個 pidof 命令,并且配合 ps aux 與正規(guī)表示法,就可以很輕易的找到您所想要的程序內(nèi)容了呢。


SELinux 初探

在進入了 CentOS 5.x 之后,SELinux 已經(jīng)是個非常完備的核心模塊了!CentOS 5.x 提供了很多管理 SELinux 的命令與機制,因此在整體架構(gòu)上面比以前的版本要單純且容易操作管理!所以,在這一版以后,我們建議大家千萬不要關(guān)掉 SELinux 這玩意兒!讓我們來仔細的玩玩這家伙吧!


什么是 SELinux

什么是 SELinux 呢?其實他是『 Security Enhanced Linux 』的縮寫,字面上的意義就是安全強化的 Linux 之意!那么所謂的『安全強化』是強化哪個部分?是網(wǎng)絡(luò)資安還是權(quán)限管理?底下就讓我們來談?wù)劙?#xff01;


  • 當初設(shè)計的目標:避免資源的誤用

SELinux 是由美國國家安全局 (NSA) 開發(fā)的,當初開發(fā)這玩意兒的目的是因為很多企業(yè)界發(fā)現(xiàn),通常系統(tǒng)出現(xiàn)問題的原因大部分都在於『內(nèi)部員工的資源誤用』所導(dǎo)致的,實際由外部發(fā)動的攻擊反而沒有這么嚴重。那么什么是『員工資源誤用』呢?舉例來說,如果有個不是很懂系統(tǒng)的系統(tǒng)管理員為了自己配置的方便,將網(wǎng)頁所在目錄 /var/www/html/ 的權(quán)限配置為 drwxrwxrwx 時,你覺得會有什么事情發(fā)生?

現(xiàn)在我們知道所有的系統(tǒng)資源都是透過程序來進行存取的,那么 /var/www/html/ 如果配置為 777 ,代表所有程序均可對該目錄存取,萬一你真的有啟動 WWW 服務(wù)器軟件,那么該軟件所觸發(fā)的程序?qū)⒖梢詫懭朐撃夸?#xff0c;而該程序卻是對整個 Internet 提供服務(wù)的!只要有心人接觸到這支程序,而且該程序剛好又有提供使用者進行寫入的功能,那么外部的人很可能就會對你的系統(tǒng)寫入些莫名其妙的東西!那可真是不得了!一個小小的 777 問題可是大大的!

為了控管這方面的權(quán)限與程序的問題,所以美國國家安全局就著手處理操作系統(tǒng)這方面的控管。由於 Linux 是自由軟件,程序碼都是公開的,因此她們便使用 Linux 來作為研究的目標,最后更將研究的結(jié)果整合到 Linux 核心里面去,那就是 SELinux 啦!所以說, SELinux 是整合到核心的一個模塊喔!更多的 SELinux 相關(guān)說明可以參考:

  • http://www.nsa.gov/research/selinux/

這也就是說:其實 SELinux 是在進行程序、文件等細部權(quán)限配置依據(jù)的一個核心模塊!由於啟動網(wǎng)絡(luò)服務(wù)的也是程序,因此剛好也能夠控制網(wǎng)絡(luò)服務(wù)能否存取系統(tǒng)資源的一道關(guān)卡!所以,在講到 SELinux 對系統(tǒng)的存取控制之前,我們得先來回顧一下之前談到的系統(tǒng)文件權(quán)限與使用者之間的關(guān)系。因為先談完這個你才會知道為何需要 SELinux 的啦!


  • 傳統(tǒng)的文件權(quán)限與帳號關(guān)系:自主式存取控制, DAC

我們第十四章的內(nèi)容,知道系統(tǒng)的帳號主要分為系統(tǒng)管理員 (root) 與一般用戶,而這兩種身份能否使用系統(tǒng)上面的文件資源則與 rwx 的權(quán)限配置有關(guān)。不過你要注意的是,各種權(quán)限配置對 root 是無效的。因此,當某個程序想要對文件進行存取時,系統(tǒng)就會根據(jù)該程序的擁有者/群組,并比對文件的權(quán)限,若通過權(quán)限檢查,就可以存取該文件了。

這種存取文件系統(tǒng)的方式被稱為『自主式存取控制 (Discretionary Access Control, DAC)』,基本上,就是依據(jù)程序的擁有者與文件資源的 rwx 權(quán)限來決定有無存取的能力。不過這種 DAC 的存取控制有幾個困擾,那就是:

  • root 具有最高的權(quán)限:如果不小心某支程序被有心人士取得,且該程序?qū)凫?root 的權(quán)限,那么這支程序就可以在系統(tǒng)上進行任何資源的存取!真是要命!

  • 使用者可以取得程序來變更文件資源的存取權(quán)限:如果你不小心將某個目錄的權(quán)限配置為 777 ,由於對任何人的權(quán)限會變成 rwx ,因此該目錄就會被任何人所任意存取!

這些問題是非常嚴重的!尤其是當你的系統(tǒng)是被某些漫不經(jīng)心的系統(tǒng)管理員所掌控時!她們甚至覺得目錄權(quán)限調(diào)為 777 也沒有什么了不起的危險哩...


  • 以政策守則訂定特定程序讀取特定文件:委任式存取控制, MAC

現(xiàn)在我們知道 DAC 的困擾就是當使用者取得程序后,他可以藉由這支程序與自己默認的權(quán)限來處理他自己的文件資源。萬一這個使用者對 Linux 系統(tǒng)不熟,那就很可能會有資源誤用的問題產(chǎn)生。為了避免 DAC 容易發(fā)生的問題,因此 SELinux 導(dǎo)入了委任式存取控制 (Mandatory Access Control, MAC) 的方法!

委任式存取控制 (MAC) 有趣啦!他可以針對特定的程序與特定的文件資源來進行權(quán)限的控管!也就是說,即使你是 root ,那么在使用不同的程序時,你所能取得的權(quán)限并不一定是 root ,而得要看當時該程序的配置而定。如此一來,我們針對控制的『主體』變成了『程序』而不是使用者喔!此外,這個主體程序也不能任意使用系統(tǒng)文件資源,因為每個文件資源也有針對該主體程序配置可取用的權(quán)限!如此一來,控制項目就細的多了!但整個系統(tǒng)程序那么多、文件那么多,一項一項控制可就沒完沒了!所以 SELinux 也提供一些默認的政策 (Policy) ,并在該政策內(nèi)提供多個守則 (rule) ,讓你可以選擇是否激活該控制守則!

在委任式存取控制的配置下,我們的程序能夠活動的空間就變小了!舉例來說, WWW 服務(wù)器軟件的達成程序為 httpd 這支程序,而默認情況下, httpd 僅能在 /var/www/ 這個目錄底下存取文件,如果 httpd 這個程序想要到其他目錄去存取數(shù)據(jù)時,除了守則配置要開放外,目標目錄也得要配置成 httpd 可讀取的模式 (type) 才行喔!限制非常多!所以,即使不小心 httpd 被 cracker 取得了控制權(quán),他也無權(quán)瀏覽 /etc/shadow 等重要的配置檔喔!


SELinux 的運行模式

再次的重復(fù)說明一下,SELinux 是透過 MAC 的方式來控管程序,他控制的主體是程序,而目標則是該程序能否讀取的『文件資源』!所以先來說明一下這些咚咚的相關(guān)性啦!(注4)

  • 主體 (Subject):
    SELinux 主要想要管理的就是程序,因此你可以將『主體』跟本章談到的 process 劃上等號;

  • 目標 (Object):
    主體程序能否存取的『目標資源』一般就是文件系統(tǒng)。因此這個目標項目可以等文件系統(tǒng)劃上等號;

  • 政策 (Policy):
    由於程序與文件數(shù)量龐大,因此 SELinux 會依據(jù)某些服務(wù)來制訂基本的存取安全性政策。這些政策內(nèi)還會有詳細的守則 (rule)來指定不同的服務(wù)開放某些資源的存取與否。在目前的 CentOS 5.x 里面僅有提供兩個主要的政策,分別是:

    • targeted:針對網(wǎng)絡(luò)服務(wù)限制較多,針對本機限制較少,是默認的政策;
    • strict:完整的 SELinux 限制,限制方面較為嚴格。

    建議使用默認的 targeted 政策即可。

  • 安全性本文 (security context):
    我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了政策指定之外,主體與目標的安全性本文必須一致才能夠順利存取。這個安全性本文 (security context) 有點類似文件系統(tǒng)的 rwx 啦!安全性本文的內(nèi)容與配置是非常重要的!如果配置錯誤,你的某些服務(wù)(主體程序)就無法存取文件系統(tǒng)(目標資源),當然就會一直出現(xiàn)『權(quán)限不符』的錯誤信息了!

圖 5.2.1、SELinux 運行的各組件之相關(guān)性(本圖參考小州老師的上課講義)

上圖的重點在『主體』如何取得『目標』的資源存取權(quán)限!由上圖我們可以發(fā)現(xiàn),主體程序必須要通過 SELinux 政策內(nèi)的守則放行后,就可以與目標資源進行安全性本文的比對,若比對失敗則無法存取目標,若比對成功則可以開始存取目標。問題是,最終能否存取目標還是與文件系統(tǒng)的 rwx 權(quán)限配置有關(guān)喔!如此一來,加入了 SELinux 之后,出現(xiàn)權(quán)限不符的情況時,你就得要一步一步的分析可能的問題了!


  • 安全性本文 (Security Context)

CentOS 5.x 已經(jīng)幫我們制訂好非常多的守則了,這部份你只要知道如何開啟/關(guān)閉某項守則的放行與否即可。那個安全性本文比較麻煩!因為你可能需要自行配置文件的安全性本文呢!為何需要自行配置啊?舉例來說,你不也常常進行文件的 rwx 的重新配置嗎?這個安全性本文你就將他想成 SELinux 內(nèi)必備的 rwx 就是了!這樣比較好理解啦。

安全性本文存在於主體程序中與目標文件資源中。程序在內(nèi)存內(nèi),所以安全性本文可以存入是沒問題。那文件的安全性本文是記錄在哪里呢?事實上,安全性本文是放置到文件的 inode內(nèi)的,因此主體程序想要讀取目標文件資源時,同樣需要讀取 inode ,這 inode 內(nèi)就可以比對安全性本文以及 rwx 等權(quán)限值是否正確,而給予適當?shù)淖x取權(quán)限依據(jù)。

那么安全性本文到底是什么樣的存在呢?我們先來看看 /root 底下的文件的安全性本文好了。觀察安全性本文可使用『 ls -Z 』去觀察如下:(注意:你必須已經(jīng)啟動了 SELinux 才行!若尚未啟動,這部份請稍微看過一遍即可。底下會介紹如何啟動 SELinux 喔!)

[root@www ~]# ls -Z drwxr-xr-x root root root:object_r:user_home_t Desktop -rw-r--r-- root root root:object_r:user_home_t install.log -rw-r--r-- root root root:object_r:user_home_t install.log.syslog # 上述特殊字體的部分,就是安全性本文的內(nèi)容!

如上所示,安全性本文主要用冒號分為三個欄位,這三個欄位的意義為:

Identify:role:type 身份識別:角色:類型

這三個欄位的意義仔細的說明一下吧:

  • 身份識別 (Identify):

    相當於帳號方面的身份識別!主要的身份識別則有底下三種常見的類型:

    • root:表示 root 的帳號身份,如同上面的表格顯示的是 root 家目錄下的數(shù)據(jù)啊!
    • system_u:表示系統(tǒng)程序方面的識別,通常就是程序羅;
    • user_u:代表的是一般使用者帳號相關(guān)的身份。

    你會發(fā)現(xiàn)身份識別中,除了 root 之外,其他的識別后面都會加上『 _u 』的字樣呢!這個身份識別重點再讓我們了解該數(shù)據(jù)為何種身份所有哩~而系統(tǒng)上面大部分的數(shù)據(jù)都會是 system_u 或 root 啦!至於如果是在 /home 底下的數(shù)據(jù),那么大部分應(yīng)該就會是 user_u 羅!

  • 角色 (Role):

    透過角色欄位,我們可以知道這個數(shù)據(jù)是屬於程序、文件資源還是代表使用者。一般的角色有:

    • object_r:代表的是文件或目錄等文件資源,這應(yīng)該是最常見的羅;
    • system_r:代表的就是程序啦!不過,一般使用者也會被指定成為 system_r 喔!

    你也會發(fā)現(xiàn)角色的欄位最后面使用『 _r 』來結(jié)尾!因為是 role 的意思嘛!

  • 類型 (Type) :(最重要!)

    在默認的 targeted 政策中, Identify 與 Role 欄位基本上是不重要的!重要的在於這個類型 (type) 欄位!基本上,一個主體程序能不能讀取到這個文件資源,與類型欄位有關(guān)!而類型欄位在文件與程序的定義不太相同,分別是:

    • type:在文件資源 (Object) 上面稱為類型 (Type);
    • domain:在主體程序 (Subject) 則稱為領(lǐng)域 (domain) 了!

    domain 需要與 type 搭配,則該程序才能夠順利的讀取文件資源啦!


  • 程序與文件 SELinux type 欄位的相關(guān)性

那么這三個欄位如何利用呢?首先我們來瞧瞧主體程序在這三個欄位的意義為何!透過身份識別與角色欄位的定義,我們可以約略知道某個程序所代表的意義喔!基本上,這些對應(yīng)數(shù)據(jù)在 targeted 政策下的對應(yīng)如下:

身份識別角色該對應(yīng)在 targeted 的意義
rootsystem_r代表供 root 帳號登陸時所取得的權(quán)限
system_usystem_r由於為系統(tǒng)帳號,因此是非交談式的系統(tǒng)運行程序
user_usystem_r一般可登陸使用者的程序羅!

但就如上所述,其實最重要的欄位是類型欄位,主體與目標之間是否具有可以讀寫的權(quán)限,與程序的 domain 及文件的type 有關(guān)!這兩者的關(guān)系我們可以使用達成 WWW 服務(wù)器功能的 httpd 這支程序與 /var/www/html 這個網(wǎng)頁放置的目錄來說明。首先,看看這兩個咚咚的安全性本文內(nèi)容先:

[root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html -rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html # 兩者的角色欄位都是 object_r ,代表都是文件!而 httpd 屬於 httpd_exec_t 類型, # /var/www/html 則屬於 httpd_sys_content_t 這個類型!

httpd 屬於 httpd_exec_t 這個可以運行的類型,而 /var/www/html 則屬於 httpd_sys_content_t 這個可以讓httpd 領(lǐng)域 (domain) 讀取的類型。文字看起來不太容易了解吧!我們使用圖示來說明這兩者的關(guān)系!


圖 5.2.2、主體程序取得的 domain 與目標文件資源的 type 相互關(guān)系

上圖的意義我們可以這樣看的:

  • 首先,我們觸發(fā)一個可運行的目標文件,那就是具有 httpd_exec_t 這個類型的 /usr/sbin/httpd 文件;
  • 該文件的類型會讓這個文件所造成的主體程序 (Subject) 具有 httpd 這個領(lǐng)域 (domain),我們的政策針對這個領(lǐng)域已經(jīng)制定了許多守則,其中包括這個領(lǐng)域可以讀取的目標資源類型;
  • 由於 httpd domain 被配置為可以讀取 httpd_sys_content_t 這個類型的目標文件 (Object),因此你的網(wǎng)頁放置到 /var/www/html/ 目錄下,就能夠被 httpd 那支程序所讀取了;
  • 但最終能不能讀到正確的數(shù)據(jù),還得要看 rwx 是否符合 Linux 權(quán)限的規(guī)范!
  • 上述的流程告訴我們幾個重點,第一個是政策內(nèi)需要制訂詳細的 domain/type 相關(guān)性;第二個是若文件的 type 配置錯誤,那么即使權(quán)限配置為 rwx 全開的 777 ,該主體程序也無法讀取目標文件資源的啦!不過如此一來,也就可以避免使用者將他的家目錄配置為 777 時所造成的權(quán)限困擾。


    SELinux 的啟動、關(guān)閉與觀察

    并非所有的 Linux distributions 都支持 SELinux 的,所以你必須要先觀察一下你的系統(tǒng)版本為何!鳥哥這里介紹的 CentOS 5.x 本身就有支持 SELinux 啦!所以你不需要自行編譯 SELinux 到你的 Linux 核心中!目前 SELinux 支持三種模式,分別如下:

    • enforcing:強制模式,代表 SELinux 運行中,且已經(jīng)正確的開始限制 domain/type 了;
    • permissive:寬容模式:代表 SELinux 運行中,不過僅會有警告信息并不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用;
    • disabled:關(guān)閉,SELinux 并沒有實際運行。

    那你怎么知道目前的 SELinux 模式呢?就透過 getenforce 吧!

    [root@www ~]# getenforce Enforcing <==諾!就顯示出目前的模式為 Enforcing 羅!

    另外,我們又如何知道 SELinux 的政策 (Policy) 為何呢?這時可以使用 sestatus 來觀察:

    [root@www ~]# sestatus [-vb] 選項與參數(shù): -v :檢查列於 /etc/sestatus.conf 內(nèi)的文件與程序的安全性本文內(nèi)容; -b :將目前政策的守則布林值列出,亦即某些守則 (rule) 是否要啟動 (0/1) 之意;范例一:列出目前的 SELinux 使用哪個政策 (Policy)? [root@www ~]# sestatus SELinux status: enabled <==是否啟動 SELinux SELinuxfs mount: /selinux <==SELinux 的相關(guān)文件數(shù)據(jù)掛載點 Current mode: enforcing <==目前的模式 Mode from config file: enforcing <==配置檔指定的模式 Policy version: 21 Policy from config file: targeted <==目前的政策為何?

    如上所示,目前是啟動的,而且是 Enforcing 模式,而由配置檔查詢得知亦為 Enforcing 模式。此外,目前的默認政策為 targeted 這一個。你應(yīng)該要有疑問的是, SELinux 的配置檔是哪個文件啊?其實就是 /etc/selinux/config 這個文件喔!我們來看看內(nèi)容:

    [root@www ~]# vi /etc/selinux/config SELINUX=enforcing <==調(diào)整 enforcing|disabled|permissive SELINUXTYPE=targeted <==目前僅有 targeted 與 strict

    • SELinux 的啟動與關(guān)閉

    上面是默認的政策與啟動的模式!你要注意的是,如果改變了政策則需要重新啟動;如果由 enforcing 或 permissive改成 disabled ,或由 disabled 改成其他兩個,那也必須要重新啟動。這是因為 SELinux 是整合到核心里面去的,你只可以在 SELinux 運行下切換成為強制 (enforcing) 或?qū)捜?(permissive) 模式,不能夠直接關(guān)閉 SELinux 的!同時,由 SELinux 關(guān)閉 (disable) 的狀態(tài)到開啟的狀態(tài)也需要重新啟動啦!所以,如果剛剛你發(fā)現(xiàn) getenforce 出現(xiàn) disabled 時,請到上述文件修改成為 enforcing 吧!

    所以,如果你要啟動 SELinux 的話,請將上述的 SELINUX=enforcing 配置妥當,并且指定 SELINUXTYPE=targeted 這一個配置,并且到 /boot/grub/menu.lst 這個文件去,看看核心有無關(guān)閉 SELinux 了呢?

    [root@www ~]# vi /boot/grub/menu.lst default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-92.el5)root (hd0,0)kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet selinux=0initrd /initrd-2.6.18-92.el5.img # 如果要啟動 SELinux ,則不可以出現(xiàn) selinux=0 的字樣在 kernel 后面!

    請注意到上面特殊字體的那一行,確認 kernel 后面不可以接『 selinux=0 』這個項目!因為 selinux=0 指定給核心時,則核心會自動的忽略 /etc/selinux/config 的配置值,而直接略過 SELinux 的加載,所以你的 SELinux 模式就會變成 disabled 啦!因為我們要啟動,所以這里得要確認不存在 selinux=0 才行!切記切記!如果一切配置妥當,接下來就是 reboot 重新啟動吧!

    不過你要注意的是,如果從 disable 轉(zhuǎn)到啟動 SELinux 的模式時,由於系統(tǒng)必須要針對文件寫入安全性本文的資訊,因此啟動過程會花費不少時間在等待重新寫入 SELinux 安全性本文 (有時也稱為 SELinux Label) ,而且在寫完之后還得要再次的重新啟動一次喔!你必須要等待粉長一段時間!等到下次啟動成功后,再使用getenforce 或 sestatus來觀察看看有否成功的啟動到 Enforcing 的模式羅!

    如果你已經(jīng)在 Enforcing 的模式,但是可能由於一些配置的問題導(dǎo)致 SELinux 讓某些服務(wù)無法正常的運行,此時你可以將 Enforcing 的模式改為寬容 (permissive) 的模式,讓 SELinux 只會警告無法順利連線的信息,而不是直接抵擋主體程序的讀取權(quán)限。讓 SELinux 模式在 enforcing 與 permissive 之間切換的方法為:

    [root@www ~]# setenforce [0|1] 選項與參數(shù): 0 :轉(zhuǎn)成 permissive 寬容模式; 1 :轉(zhuǎn)成 Enforcing 強制模式范例一:將 SELinux 在 Enforcing 與 permissive 之間切換與觀察 [root@www ~]# setenforce 0 [root@www ~]# getenforce Permissive [root@www ~]# setenforce 1 [root@www ~]# getenforce Enforcing

    不過請注意, setenforce 無法在 Disabled 的模式底下進行模式的切換喔!


    SELinux 網(wǎng)絡(luò)服務(wù)運行范例

    由於 CentOS 5.x 默認使用 targeted 這個政策,而這個政策主要是在管理網(wǎng)絡(luò)服務(wù),本機端的程序則比較不受 SELinux 的管制。既然上頭我們曾經(jīng)舉過 /usr/sbin/httpd 這個程序來當作范例,那么我們就使用 WWW 服務(wù)器來說明一下 SELinux 的運行方式吧。


    • 網(wǎng)絡(luò)服務(wù)的啟動與觀察

    首先,讓我們啟動 httpd 這支服務(wù)吧!要記得的是,一般服務(wù)啟動的腳本會在 /etc/init.d/ 底下,所以我們可以這樣啟動與觀察:

    # 1. 先啟動這個網(wǎng)絡(luò)服務(wù)吧! [root@www ~]# /etc/init.d/httpd start 正在啟動 httpd: [ 確定 ]# 2. 觀察有無此程序,并且觀察此程序的 SELinux 安全性本文數(shù)據(jù) [root@www ~]# pstree | grep httpd|-httpd---8*[httpd] <==httpd 會產(chǎn)生很多子程序來負責(zé)網(wǎng)絡(luò)服務(wù)喔![root@www ~]# ps aux -Z |grep http root:system_r:httpd_t root 24089 0.2 1.2 22896 9256 ? Ss 16:06 0:00 /usr/sbin/httpd root:system_r:httpd_t apache 24092 0.0 0.6 22896 4752 ? S 16:06 0:00 /usr/sbin/httpd root:system_r:httpd_t apache 24093 0.0 0.6 22896 4752 ? S 16:06 0:00 /usr/sbin/httpd ....(后面省略)....

    ps -Z 這個『 -Z 』的選項可以讓我們查閱程序的安全性本文!其他相關(guān)的程序說明請自行查閱本章上面各節(jié)的內(nèi)容。我們可以發(fā)現(xiàn)這整個程序的 domain 是 httpd_t 這個咚咚喔!再來我們來處理一下首頁的數(shù)據(jù)先。由於首頁是放置到 /var/www/html,且檔名應(yīng)該要是『 index.html 』,因此我們可以這樣簡單的制作首頁:

    [root@www ~]# echo "This is my first web page." > /var/www/html/index.html

    接下來,如果你在瀏覽器上面輸入『 http://127.0.0.1 』應(yīng)該會看到如下的畫面才對!


    圖 5.4.1、httpd 順利運行時,能夠看到的首頁畫面

    此時你的瀏覽器會透過 httpd 這個程序擁有的 httpd_t 這個 domain 去讀取 /var/www/html/index.html 這個文件的!先來看看這個文件的權(quán)限與 SELinux 的安全性本文數(shù)據(jù):

    [root@www ~]# ll -Z /var/www/html/index.html -rw-r--r-- root root root:object_r:httpd_sys_content_t /var/www/html/index.html

    權(quán)限是 apache 可以讀取的 r 標志,而 SELinux 則是 httpd_sys_content_t 的類型 (type),也是 httpd_t 能讀取的哩!那么為何 httpd_t 可以讀取呢?因為 targeted 政策里面有配置嘛!關(guān)於政策配置的查詢我們可以在后續(xù)跟大家作介紹,這里先了解一下即可。


    • 錯誤的 SELinux 安全性本文

    讓我們來了解一下什么是錯誤的安全性本文配置好了!現(xiàn)在,我們將重要的網(wǎng)頁數(shù)據(jù)在 root 的家目錄底下制作!配置如下:

    # 1. 先在 root 的家目錄建置所需的首頁: [root@www ~]# echo "My 2nd web page..." > index.html# 2. 將首頁 index.html 『搬移』到 /var/www/html 目錄去: [root@www ~]# rm /var/www/html/index.html [root@www ~]# mv index.html /var/www/html # 這個測試的重點在 mv 這個命令的處理上!務(wù)必使用 mv 喔!

    等到上述的動作都做完后,如果在瀏覽器輸入 http://127.0.0.1/index.html ,你應(yīng)該會想到畫面會出現(xiàn)我們想要的『 My 2nd web page...』才對,但是結(jié)果卻變成:


    圖 5.4.2、錯誤的安全性本文所造成的困擾

    記得要在網(wǎng)址列指定 index.html 否則出現(xiàn)的會變成歡迎首頁的畫面。而螢?zāi)簧铣霈F(xiàn)的錯誤信息是沒有權(quán)限(You don't have permission...)。看看這個 /var/www/html/index.html 的權(quán)限吧!

    [root@www ~]# ll -Z /var/www/html/index.html -rw-r--r-- root root root:object_r:user_home_t /var/www/html/index.html

    你會發(fā)現(xiàn),權(quán)限是對的 (apache 使用者依舊可以讀取),但是安全性本文內(nèi)容卻是使用者家目錄呢!真是要命!這個使用者家目錄默認可不能給 httpd_t 這個 domain 讀取的!所以就產(chǎn)生錯誤啦!那該如何處置呢?


    • 重設(shè) SELinux 安全性本文

    既然安全性本文是錯的,那么就將他改回來即可嘛!怎么修改呢?可以透過兩個命令喔!首先我們使用 chcon 來處理:

    [root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 文件 [root@www ~]# chcon [-R] --reference=范例檔 文件 選項與參數(shù): -R :連同該目錄下的次目錄也同時修改; -t :后面接安全性本文的類型欄位!例如 httpd_sys_content_t ; -u :后面接身份識別,例如 system_u; -r :后面街角色,例如 system_r; --reference=范例檔:拿某個文件當范例來修改后續(xù)接的文件的類型!范例一:將剛剛的 index.html 類型改為 httpd_sys_content_t 的類型 [root@www ~]# chcon -t httpd_sys_content_t /var/www/html/index.html [root@www ~]# ll -Z /var/www/html/index.html -rw-r--r-- root root root:object_r:httpd_sys_content_t /var/www/html/index.html # 瞧!這樣就改回來啦!范例二:以 /etc/passwd 為依據(jù),將 index.html 修改成該類型 [root@www ~]# ll -Z /etc/passwd -rw-r--r-- root root system_u:object_r:etc_t /etc/passwd[root@www ~]# chcon --reference=/etc/passwd /var/www/html/index.html [root@www ~]# ll -Z /var/www/html/index.html -rw-r--r-- root root root:object_r:etc_t /var/www/html/index.html # 看看!是否與上面的 /etc/passwd 相同了!不過,這又是錯誤的安全性本文! # 先不要急著修改!我們來進行底下的另外一個命令處置看看!

    chcon 是透過直接指定的方式來處理安全性本文的類型數(shù)據(jù)。那我們知道其實系統(tǒng)默認的目錄都有特殊的 SELinux 安全性本文,舉例來說, /var/www/html 原本就是 httpd 可以讀取的目錄嘛!既然如此,那有沒有可以使用默認的安全性本文來還原的方式?有的,那就是 restorecon 這玩意兒:

    [root@www ~]# restorecon [-Rv] 文件或目錄 選項與參數(shù): -R :連同次目錄一起修改; -v :將過程顯示到螢?zāi)簧?/span>范例一:將剛剛錯誤的 index.html 以默認的安全性本文改正過來 [root@www ~]# restorecon -Rv /var/www/html/index.html restorecon reset /var/www/html/index.html context system_u:object_r:etc_t:s0-> system_u:object_r:httpd_sys_content_t:s0 # 上面這兩行其實是同一行喔!表示將 index.html 由 etc_t 改為 httpd_sys_content_t

    然后回到剛剛圖 5.4.2 給他重讀一下,嘿嘿!又可以看到正確的內(nèi)容啦!這個過程完全沒有動到 rwx 權(quán)限,因為該權(quán)限本來就是對的!而錯的部分是在於 SELinux 的安全性本文當中那個類型 (type) 配置錯誤!而配置錯誤的原因很可能是因為該文件由其他位置復(fù)制或移動過來所導(dǎo)致的!因此,你得要善用 restorecon 以及 chcon 來處理這方面的問題喔!


    SELinux 所需的服務(wù)

    由於 SELinux 是整合到核心的一個核心功能,因此你幾乎不需要啟動什么額外的服務(wù)來開啟 SELinux 的。啟動完成后, SELinux 就啟動了。不過,你剛剛也發(fā)現(xiàn)到當我們復(fù)制或移動某些數(shù)據(jù)到特定的目錄時,可能由於沒有注意到修改 SELinux 的安全性本文內(nèi)容,結(jié)果導(dǎo)致網(wǎng)絡(luò)服務(wù)無法順利運行的問題!有沒有什么方法可以記錄當發(fā)生 SELinux 錯誤時,將那些有用的資訊記錄下來,并且提供解決的方案呢?此時就得要底下的幾個服務(wù)的輔助羅!


    • setroubleshoot --> 錯誤信息寫入 /var/log/messages

    幾乎所有 SELinux 相關(guān)的程序都會以 se 為開頭,這個服務(wù)也是以 se 為開頭!而 troubleshoot 大家都知道是錯誤克服,因此這個 setroubleshoot 自然就得要啟動他啦!這個服務(wù)會將關(guān)於 SELinux 的錯誤信息與克服方法記錄到 /var/log/messages 里頭,所以你一定得要啟動這個服務(wù)才好。那如何在啟動的時候就啟動 setroubleshoot 呢?這樣處理先:

    [root@www ~]# chkconfig --list setroubleshoot setroubleshoot 0:off 1:off 2:off 3:on 4:on 5:on 6:off # 我們的 Linux 運行模式是在 3 或 5 號,因此這兩個要 on 即可。[root@www ~]# chkconfig setroubleshoot on # 關(guān)於 chkconfig 我們會在后面章節(jié)介紹, --list 是列出目前的運行等級是否有啟動, # 如果加上 on ,則是在啟動時啟動,若為 off 則啟動時不啟動。

    這支服務(wù)默認幾乎都會啟動啦!除非你看到 3:off 或 5:off 時,才需要以『 chkconfig setroubleshoot on 』去配置一下。那么如果有發(fā)生錯誤時,信息像什么呢?我們剛剛不是以瀏覽器瀏覽 index.html 并導(dǎo)致錯誤嗎?那就將該錯誤捉來瞧瞧!

    [root@www ~]# cat /var/log/messages | grep setroubleshoot Mar 23 17:18:44 www setroubleshoot: SELinux is preventing the httpd from using potentially mislabeled files (/var/www/html/index.html). For complete SELinux messages. run sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4

    上面的錯誤信息可是同一行喔!大綱說的是『SElinux 被用來避免 httpd 讀取到錯誤的安全性本文,想要查閱完整的數(shù)據(jù),請運行 sealert -l 6c02...』沒錯!你注意到了!重點就是 sealert -l 啦!上面提供的資訊并不完整,想要更完整的說明得要靠 sealert 配合偵測到的錯誤代碼來處理。實際處理后會像這樣:

    [root@www ~]# sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4 Summary:SELinux is preventing the httpd from using potentially mislabeled files (/var/www/html/index.html). <==就是剛剛 /var/log/messages 的信息Detailed Description: <==底下是更完整的描述!要看!SELinux has denied httpd access to potentially mislabeled file(s) (/var/www/html/index.html). This means that SELinux will not allow httpd to use these files. It is common for users to edit files in their home directory or tmp directories and then move (mv) them to system directories. The problem is that the files end up with the wrong file context which confined applications are not allowed to access.Allowing Access: <==若要允許存取,你需要進行的動作!If you want httpd to access this files, you need to relabel them using restorecon -v '/var/www/html/index.html'. You might want to relabel the entire directory using restorecon -R -v '/var/www/html'. ....(底下省略)....

    重點就是上面特殊字體顯示的地方!你只要照著『Allowing Access』里面的提示去進行處理,就能夠完成你的 SELinux 類型配置了!比對剛剛我們上個小節(jié)提到的restorecon與 chcon 你就能夠知道, setroubleshoot 提供的信息有多有效了吧!


    • auditd --> 詳細數(shù)據(jù)寫入 /var/log/audit/audit.log

    audit 是稽核的意思,這個 auditd 會將 SELinux 發(fā)生的錯誤資訊寫入 /var/log/audit/audit.log 中!與上個服務(wù)相同的,你最好在啟動時就配置這服務(wù)為啟動的模式,因此可以照樣造句:

    [root@www ~]# chkconfig --list auditd auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off[root@www ~]# chkconfig auditd on # 若 3:off 及 5:off 時,才需要進行!

    與 setroubleshoot 不同的是, auditd 會將許多的 SELinux 資訊都記錄下來,不只是錯誤信息而已,因此登錄檔 /var/log/audit/audit.log 非常的龐大!要直接到這文件里面去搜尋數(shù)據(jù)是挺累人的~還好,SELinux 有提供一個 audit2why 的命令來讓我們查詢錯誤信息的回報呢!那么這個命令如何使用呢?可以這樣用的:

    [root@www ~]# audit2why < /var/log/audit/audit.log # 意思是,將登錄檔的內(nèi)容讀進來分析,并輸出分析的結(jié)果!結(jié)果有點像這樣: type=AVC msg=audit(1237799959.349:355): avc: denied { getattr } for pid=24094 comm="httpd" path="/var/www/html/index.html" dev=hda2 ino=654685 scontext=root:s ystem_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=fileWas caused by:Missing or disabled TE allow rule.Allow rules may exist but be disabled by boolean settings; check boolean settings.You can see the necessary allow rules by running audit2allow with this audit message as input.

    audit2why 的用法與輸出結(jié)果如上,比較有趣的是那個 AVC ,AVC 是 access vector cache 的縮寫,目的是記錄所有與 SELinux 有關(guān)的存取統(tǒng)計數(shù)據(jù)。輸出的資訊當中,會有談到產(chǎn)生錯誤的問題為何,如上表特殊字體部分,你會發(fā)現(xiàn)錯誤信息主要告知 type 不符,所以導(dǎo)致錯誤的發(fā)生啊!不過,就鳥哥來看,我個人覺得 setroubleshoot 比較好用呢!這兩個好東西都可以幫助你解決 SELinux 的錯誤,因此,請務(wù)必至少要學(xué)會其中一項錯誤分析的方法喔!


    SELinux 的政策與守則管理

    現(xiàn)在你應(yīng)該知道,一個主體程序能否讀取到目標文件資源的重點在於 SELinux 的政策以及政策內(nèi)的各項守則,然后再透過該守則的定義去處理各目標文件的安全性本文,尤其是『類型』的部分。現(xiàn)在我們也知道可以透過sestatus 與getenforce 去取得目前的 SELinux 狀態(tài)。但是,能不能知道更詳細的政策說明與守則項目呢?底下我們就來了解了解!


    • 政策查閱

    CentOS 5.x 默認使使用 targeted 政策,那么這個政策提供多少相關(guān)的守則呢?此時可以透過 seinfo 來查詢喔!

    [root@www ~]# seinfo [-Atrub] 選項與參數(shù): -A :列出 SELinux 的狀態(tài)、守則布林值、身份識別、角色、類別等所有資訊 -t :列出 SELinux 的所有類別 (type) 種類 -r :列出 SELinux 的所有角色 (role) 種類 -u :列出 SELinux 的所有身份識別 (user) 種類 -b :列出所有守則的種類 (布林值)范例一:列出 SELinux 在此政策下的統(tǒng)計狀態(tài) [root@www ~]# seinfo Statistics for policy file: /etc/selinux/targeted/policy/policy.21 Policy Version & Type: v.21 (binary, MLS) <==列出政策所在檔與版本Classes: 61 Permissions: 220Types: 1521 Attributes: 155Users: 3 Roles: 6Booleans: 213 Cond. Expr.: 190Sensitivities: 1 Categories: 1024Allow: 86561 Neverallow: 0Auditallow: 34 Dontaudit: 5460Role allow: 5 Role trans: 0 ....(底下省略).... # 從上面我們可以看到這個政策是 targeted ,此政策的安全性本文類別有 1521 個; # 而針對網(wǎng)絡(luò)服務(wù)的守則 (Booleans) 共制訂了 213 條守則!范例二:列出與 httpd 有關(guān)的守則 (booleans) 有哪些? [root@www ~]# seinfo -b | grep httpd Rule loading disabledallow_httpd_mod_auth_pamallow_httpd_bugzilla_script_anon_writehttpd_enable_ftp_server ....(底下省略).... # 你可以看到,有非常多的與 httpd 有關(guān)的守則訂定呢!

    從上面我們可以看到與 httpd 有關(guān)的布林值,同樣的,如果你想要找到有 httpd 字樣的安全性本文類別時,就可以使用『 seinfo -t | grep httpd 』來查詢了!如果查詢到相關(guān)的類別或者是布林值后,想要知道詳細的守則時,就得要使用 sesearch 這個命令了!

    [root@www ~]# sesearch [-a] [-s 主體類別] [-t 目標類別] [-b 布林值] 選項與參數(shù): -a :列出該類別或布林值的所有相關(guān)資訊 -t :后面還要接類別,例如 -t httpd_t -b :后面還要接布林值的守則,例如 -b httpd_enable_ftp_server范例一:找出目標文件資源類別為 httpd_sys_content_t 的有關(guān)資訊 [root@www ~]# sesearch -a -t httpd_sys_content_t Found 74 av rules:allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock };allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock search }; ....(底下省略).... # 『 allow 主體程序安全性本文類別 目標文件安全性本文類別 』 # 如上,說明這個類別可以被那個主題程序的類別所讀取,以及目標文件資源的格式。范例二:找出主體程序為 httpd_t 且目標文件類別為 httpd 相關(guān)的所有資訊 [root@www ~]# sesearch -s httpd_t -t httpd_* -a Found 163 av rules: ....(中間省略)....allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock };allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search };allow httpd_t httpd_sys_content_t : lnk_file { ioctl read getattr lock }; ....(后面省略).... # 從上面的數(shù)據(jù)就可以看出當程序為 httpd_t 這個類別,是可以讀取 # httpd_sys_content_t 的!

    你可以很輕易的查詢到某個主體程序 (subject) 可以讀取的目標文件資源 (Object) ,從我們上面的練習(xí),我們也可以很輕松的就知道,為何 httpd_t 可以讀取 httpd_sys_content_t 羅!那如果是布林值呢?里面又規(guī)范了什么?讓我們來看看先:

    范例三:我知道有個布林值為 httpd_enable_homedirs ,請問該布林值規(guī)范多少守則? [root@www ~]# sesearch -b httpd_enable_homedirs -a Found 21 av rules:allow httpd_t user_home_dir_t : dir { getattr search };allow httpd_t cifs_t : file { ioctl read getattr lock };allow httpd_t cifs_t : dir { ioctl read getattr lock search }; ....(后面省略)....

    從這個布林值的配置我們可以看到里面規(guī)范了非常多的主體程序與目標文件資源的放行與否!所以你知道了,實際規(guī)范這些守則的,就是布林值的項目啦!那也就是我們之前所說的一堆守則是也!你的主體程序能否對某些目標文件進行存取,與這個布林值非常有關(guān)系喔!因為布林值可以將守則配置為啟動 (1) 或者是關(guān)閉 (0) 啦!

    由 seinfo 與 sesearch 的輸出資訊,我們也會得到實際的政策數(shù)據(jù)都是放置到 /etc/selinux/targeted/policy/ 底下,事實上,所有與 targetd 相關(guān)的資訊都是放置到 /etc/selinux/targeted 里面的呢!包括安全性本文相關(guān)的資訊。這部分等一下談到安全性本文的默認值修改時,我們再來討論。


    • 布林值的查詢與修改

    上面我們透過 sesearch 知道了,其實 Subject 與 Object 能否有存取的權(quán)限,是與布林值有關(guān)的,那么系統(tǒng)有多少布林值可以透過 seinfo -b 來查詢,但,每個布林值是啟動的還是關(guān)閉的呢?這就來查詢看看吧:

    [root@www ~]# getsebool [-a] [布林值條款] 選項與參數(shù): -a :列出目前系統(tǒng)上面的所有布林值條款配置為開啟或關(guān)閉值范例一:查詢本系統(tǒng)內(nèi)所有的布林值配置狀況 [root@www ~]# getsebool -a NetworkManager_disable_trans --> off allow_console_login --> off allow_cvs_read_shadow --> off allow_daemons_dump_core --> on ....(底下省略).... # 您瞧!這就告訴你目前的布林值狀態(tài)羅!

    那么如果查詢到某個布林值,并且以 sesearch 知道該布林值的用途后,想要關(guān)閉或啟動他,又該如何處置?

    [root@www ~]# setsebool [-P] 布林值=[0|1] 選項與參數(shù): -P :直接將配置值寫入配置檔,該配置數(shù)據(jù)未來會生效的!范例一:查詢 httpd_enable_homedirs 是否為關(guān)閉,若不為關(guān)閉,請關(guān)閉他! [root@www ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> on <==結(jié)果是 on ,依題意給他關(guān)閉![root@www ~]# setsebool -P httpd_enable_homedirs=0 [root@www ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> off

    這個 setsebool 最好記得一定要加上 -P 的選項!因為這樣才能將此配置寫入配置檔!這是非常棒的工具組!你一定要知道如何使用 getsebool 與 setsebool 才行!


    • 默認目錄的安全性本文查詢與修改

    還記得我們在使用 restorecon 時談到每個目錄或文件都會有默認的安全性本文嗎?會制訂目錄的安全性本文,是因為系統(tǒng)的一些服務(wù)所放置文件的目錄已經(jīng)是確定的,當然有默認的安全性本文管理上較方便。那你如何查詢這些目錄的默認安全性本文呢?就得要使用 semanage 羅!

    [root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec 選項與參數(shù): fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思; -a :添加的意思,你可以添加一些目錄的默認安全性本文類型配置; -m :修改的意思; -d :刪除的意思。范例一:查詢一下 /var/www/html 的默認安全性本文配置為何! [root@www ~]# semanage fcontext -l SELinux fcontext type Context ....(前面省略).... /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ....(后面省略)....

    從上面的說明,我們知道其實 semanage 可以處理非常多的任務(wù),不過,在這個小節(jié)我們主要想了解的是每個目錄的默認安全性本文。如上面范例一所示,我們可以查詢的到每個目錄的安全性本文啦!而目錄的配置可以使用正規(guī)表示法去指定一個范圍。那么如果我們想要添加某些自訂的目錄的安全性本文呢?舉例來說,我想要制訂 /srv/samba 成為 public_content_t 的類型時,應(yīng)該如何指定呢?

    范例二:利用 semanage 配置 /srv/samba 目錄的默認安全性本文為 public_content_t [root@www ~]# mkdir /srv/samba [root@www ~]# ll -Zd /srv/samba drwxr-xr-x root root root:object_r:var_t /srv/samba # 如上所示,默認的情況應(yīng)該是 var_t 這個咚咚的![root@www ~]# semanage fcontext -l | grep '/srv' /srv/.* all files system_u:object_r:var_t:s0 /srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0 /srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /srv/([^/]*/)?rsync(/.*)? all files system_u:object_r:public_content_t:s0 /srv/gallery2(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /srv directory system_u:object_r:var_t:s0 <==看這里! # 上面則是默認的 /srv 底下的安全性本文數(shù)據(jù),不過,并沒有指定到 /srv/samba 啦[root@www ~]# semanage fcontext -a -t public_content_t "/srv/samba(/.*)?" [root@www ~]# semanage fcontext -l | grep '/srv/samba' /srv/samba(/.*)? all files system_u:object_r:public_content_t:s0[root@www ~]# cat /etc/selinux/targeted/contexts/files/file_contexts.local # This file is auto-generated by libsemanage # Please use the semanage command to make changes /srv/samba(/.*)? system_u:object_r:public_content_t:s0 # 其實就是寫入這個文件的羅! ^_^[root@www ~]# restorecon -Rv /srv/samba* <==嘗試恢復(fù)默認值 [root@www ~]# ll -Zd /srv/samba drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/ # 有默認值,以后用 restorecon 來修改比較簡單!

    semanage 的功能很多,不過鳥哥主要用到的僅有 fcontext 這個項目的動作而已。如上所示,你可以使用 semanage 來查詢所有的目錄默認值,也能夠使用他來添加默認值的配置!如果您學(xué)會這些基礎(chǔ)的工具,那么 SELinux 對你來說,也不是什么太難的咚咚羅!


    重點回顧
    • 程序 (program):通常為 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等),為實體文件的型態(tài)存在;
    • 程序 (process):程序被觸發(fā)后,運行者的權(quán)限與屬性、程序的程序碼與所需數(shù)據(jù)等都會被加載內(nèi)存中,操作系統(tǒng)并給予這個內(nèi)存內(nèi)的單元一個識別碼 (PID),可以說,程序就是一個正在運行中的程序。
    • 程序彼此之間是有相關(guān)性的,故有父程序與子程序之分。而 Linux 系統(tǒng)所有程序的父程序就是 init 這個 PID 為 1 號的程序。
    • 在 Linux 的程序呼叫通常稱為 fork-and-exec 的流程!程序都會藉由父程序以復(fù)制 (fork) 的方式產(chǎn)生一個一模一樣的子程序,然后被復(fù)制出來的子程序再以 exec 的方式來運行實際要進行的程序,最終就成為一個子程序的存在。
    • 常駐在內(nèi)存當中的程序通常都是負責(zé)一些系統(tǒng)所提供的功能以服務(wù)使用者各項任務(wù),因此這些常駐程序就會被我們稱為:服務(wù) (daemon)。
    • 在工作管理 (job control) 中,可以出現(xiàn)提示字節(jié)讓你操作的環(huán)境就稱為前景 (foreground),至於其他工作就可以讓你放入背景 (background) 去暫停或運行。
    • 與 job control 有關(guān)的按鍵與關(guān)鍵字有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
    • 程序管理的觀察命令有: ps, top, pstree 等等;
    • 程序之間是可以互相控制的,傳遞的信息 (signal) 主要透過 kill 這個命令在處理;
    • 程序是有優(yōu)先順序的,該項目為 Priority,但 PRI 是核心動態(tài)調(diào)整的,使用者只能使用 nice 值去微調(diào) PRI
    • nice 的給予可以有: nice, renice, top 等命令;
    • vmstat 為相當好用的系統(tǒng)資源使用情況觀察命令;
    • SELinux 當初的設(shè)計是為了避免使用者資源的誤用,而 SELinux 使用的是 MAC 委任式存取配置;
    • SELinux 的運行中,重點在於主體程序 (Subject) 能否存取目標文件資源 (Object) ,這中間牽涉到政策 (Policy) 內(nèi)的守則,以及實際的安全性本文類別 (type);
    • 安全性本文的一般配置為:『Identify:role:type』其中又以 type 最重要;
    • SELinux 的模式有: enforcing, permissive, disabled 三種,而啟動的政策 (Policy) 主要是 targeted
    • SELinux 啟動與關(guān)閉的配置檔在: /etc/selinux/config
    • SELinux 的啟動與觀察: getenforce, sestatus 等命令
    • 重設(shè) SELinux 的安全性本文可使用 restorecon 與 chcon
    • 在 SELinux 有啟動時,必備的服務(wù)至少要啟動 setroubleshoot 這個!
    • 若要管理默認的 SELinux 布林值,可使用 getsebool, setsebool 來管理!

    本章習(xí)題
    ( 要看答案請將鼠標移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
    • 情境模擬題一:透過一個網(wǎng)絡(luò)程序 vsftpd 的服務(wù),來了解到程序與 SELinux 的相關(guān)限制行為:

      • 目標:了解軟件、程序、程序、優(yōu)先運行緒、網(wǎng)絡(luò)程序與 SELinux 的相關(guān)性
      • 需求:已經(jīng)知道如何安裝軟件,否則就得要連上 Internet 才能進行 vsftpd 服務(wù)的安裝;

      底下的流程先看看即可,很多數(shù)據(jù)如果當初忘記安裝的話,可能會無法進行。沒關(guān)系!后續(xù)的文章看完后,第二次讀到這里后,你就會知道如何處理了。

    • 先察看有無安裝 vsftpd 這個軟件,如果有的話那就 OK ~沒有的話,可能需要線上安裝才行:
      [root@www ~]# rpm -q vsftpd vsftpd-2.0.5-12.el5 <==出現(xiàn)這個才是對的!若沒有出現(xiàn),就是沒安裝# 如果沒有安裝的話,你又已經(jīng)有 IP 可以上網(wǎng)了,那么就這樣安裝: [root@www ~]# yum install vsftpd

    • 啟動 vsftpd 這個服務(wù):
      [root@www ~]# /etc/init.d/vsftpd start

    • 假設(shè) vsftpd 這個服務(wù)并不是那么重要,因此我想要在這次啟動期間,讓 vsftpd 的優(yōu)先運行緒較不優(yōu)先 10 分,可以這么做:
      [root@www ~]# pstree -p | grep vsftpd|-vsftpd(2377) <==找到了 PID 為 2377 喔! [root@www ~]# renice 10 2377 [root@www ~]# top -p grep 2377 <==重點是在觀察!

    • vsftpd 是個網(wǎng)絡(luò)服務(wù),他到底是啟動哪個端口?可以這樣觀察:
      [root@www ~]# netstat -tlunp | grep vsftpd tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2377/vsftpd # 這樣的答案夠明顯了嗎?

    • vsftpd 提供網(wǎng)絡(luò)的 FTP 功能,有個使用者名為 vbird ,他卻無法登陸自己的帳號!這是什么原因呢?由於 CentOS 的默認 vsftpd 是能夠允許一般用戶登陸自己家目錄的,因此無法登陸的可能原因是權(quán)限還是 SELinux 呢?我們可以這樣測試看看:
      # 1. 先用 vbird 的身份登陸 vsftpd 看看: [root@www ~]# ftp localhost Connected to www.vbird.tsai. Name (localhost:root): vbird 331 Please specify the password. Password: <==這里輸入 vbird 的口令喔! 500 OOPS: cannot change directory:/home/vbird Login failed. <==見鬼了!竟然無法登陸自己的家目錄 /home/vbird 哩! ftp> bye[root@www ~]# ls -ld /home/vbird drwx------ 4 vbird vbird 4096 8月 18 18:22 /home/vbird # 權(quán)限明明是對的嘛!怎么會無法切換?# 2. 看看登錄檔有沒有什么重要信息的說明: [root@www ~]# tail /var/log/messages Sep 11 16:57:31 www setroubleshoot: SELinux is preventing the ftp daemon from reading users home directories (/). For complete SELinux messages. run sealert -l b8bdaf2d-b083-4e28-9465-91fae8df63b1# 3. 照著作一下: [root@www ~]# sealert -l b8bdaf2d-b083-4e28-9465-91fae8df63b1 Summary: SELinux is preventing the ftp daemon from reading users home directories (/). ....(中間省略)....The following command will allow this access: setsebool -P ftp_home_dir=1 ....(底下省略)....

    • 好了,現(xiàn)在讓我們處理一下上面的 vsftpd 相關(guān)的守則吧!因為是守則擋住了用戶的登陸了!:
      [root@www ~]# setsebool -P ftp_home_dir=1[root@www ~]# ftp localhost Connected to www.vbird.tsai. Name (localhost:root): vbird 331 Please specify the password. Password: 230 Login successful. <==看吧!順利登陸羅! Remote system type is UNIX. Using binary mode to transfer files. ftp> bye

    簡答題部分:
    • 簡單說明什么是程序 (program) 而什么是程序 (process)? 程序 (program) 是系統(tǒng)上面可以被運行的文件,由於 Linux 的完整檔名 (由 / 寫起) 僅能有一個,所以 program 的檔名具有單一性。當程序被運行后,就會啟動成程序 (process),一個 program 可以被不同的使用者或者相同的使用者重復(fù)的運行成為多個程序,且該程序所造成的程序還因為不同的使用者,而有不同的權(quán)限,且每個 process 幾乎都是獨立的。
    • 我今天想要查詢 /etc/crontab 與 crontab 這個程序的用法與寫法,請問我該如何線上查詢? 查詢 crontab 命令可以使用 man crontab 或 infocrontab ,至於查詢 /etc/crontab ,則可以使用 man 5 crontab 羅!
    • 我要如何查詢 crond 這個 daemon 的 PID 與他的 PRI 值呢? ps aux | grep crond 即可查到!
    • 我要如何修改 crond 這個 PID 的優(yōu)先運行序? 先以 ps aux 找到 crond 的 PID 后,再以:renice -n number PID 來調(diào)整!
    • 我是一般身份使用者,我是否可以調(diào)整不屬於我的程序的 nice 值?此外,如果我調(diào)整了我自己的程序的nice 值到 10 ,是否可以將他調(diào)回 5 呢? 不行!一般身份使用者僅能調(diào)整屬於自己的 PID 程序,并且,只能將nice 值一再地調(diào)高,并不能調(diào)低,所以調(diào)整為 10 之后,就不能降回 5 羅!
    • 我要怎么知道我的網(wǎng)絡(luò)卡在啟動的過程中有沒有被捉到? 可以使用 dmesg 來視察!

    參考數(shù)據(jù)與延伸閱讀
    • 注1:關(guān)於 fork-and-exec 的說明可以參考如下網(wǎng)頁與書籍:
      吳賢明老師維護的網(wǎng)站:http://nmc.nchu.edu.tw/linux/process.htm
      楊振和、操作系統(tǒng)導(dǎo)論、第三章、學(xué)貫出版社
    • 注2:對 Linux 核心有興趣的話,可以先看看底下的連結(jié):
      http://www.linux.org.tw/CLDP/OLD/INFO-SHEET-2.html
      http://oreilly.com/catalog/linuxkernel/chapter/ch10.html
    • 注3:來自 Linux Journal 的關(guān)於 /proc 的說明:http://www.linuxjournal.com/article/177
    • 注4:關(guān)於 SELinux 相關(guān)的網(wǎng)站與文件數(shù)據(jù):
      美國國家安全局的 SELinux 簡介:http://www.nsa.gov/research/selinux/
      小州老師在 SA 的簡報數(shù)據(jù):http://kenduest.sayya.org/blog/kenduest-data/2008/10/selinux_sa.pdf
      小州老師上課的講義:http://kenduest.sayya.org/blog/kenduest-data/2008/5/kenduest-UNIX-selinux-2008-05-15.pdf
      陳永升、『企業(yè)級Linux 系統(tǒng)管理寶典』、學(xué)貫行銷股份有限公司
      Fedora SELinux 說明:http://fedoraproject.org/wiki/SELinux/SecurityContext
      美國國家安全局對 SELinux 的白皮書:http://www.nsa.gov/research/_files/selinux/papers/module/t1.shtml
      徐秉義老師的 SELinux 配置范例:http://kate.babyface.com.tw/NetAdmin/24200801SELinux/

    2002/06/28:第一次完成
    2003/02/10:重新編排與加入 FAQ
    2005/09/07:將舊的文章移動到 此處 。
    2005/09/18:哈哈,終於將這篇寫完羅。新增了一些簡單的小命令啦。
    2009/03/15:將舊的基於 FC4 的文章移動到此處。
    2009/03/19:調(diào)整 sar 成為 vmstat ,因為 vmstat 是默認有安裝的分析工具!

    2009/09/11:加入了 nohup 的說明羅!并加入了情境模擬題

    出處:http://vbird.dic.ksu.edu.tw/linux_basic/0440processcontrol.php

    總結(jié)

    以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第十七章、程序管理与 SELinux 初探的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    亚洲区小说区激情区图片区 | 日本护士毛茸茸高潮 | 国色天香社区在线视频 | 亚洲色www成人永久网址 | 国精产品一品二品国精品69xx | 色婷婷香蕉在线一区二区 | 国产精品丝袜黑色高跟鞋 | 内射老妇bbwx0c0ck | 国产精品香蕉在线观看 | 狂野欧美性猛xxxx乱大交 | 麻豆精产国品 | 亚洲国产精品无码久久久久高潮 | 日韩精品无码免费一区二区三区 | 国产99久久精品一区二区 | 精品一区二区三区无码免费视频 | 国产精品久久福利网站 | 天堂久久天堂av色综合 | 清纯唯美经典一区二区 | 国产乱码精品一品二品 | 成人亚洲精品久久久久 | 久久精品国产大片免费观看 | 国产精华av午夜在线观看 | 成在人线av无码免费 | 内射爽无广熟女亚洲 | 亚洲乱亚洲乱妇50p | 国产日产欧产精品精品app | 一本大道伊人av久久综合 | 久久综合九色综合欧美狠狠 | 久久精品视频在线看15 | 一区二区三区乱码在线 | 欧洲 | 超碰97人人做人人爱少妇 | 国产成人无码av在线影院 | 国色天香社区在线视频 | 波多野结衣高清一区二区三区 | 内射爽无广熟女亚洲 | 少妇被黑人到高潮喷出白浆 | 无码精品国产va在线观看dvd | 熟女俱乐部五十路六十路av | 又色又爽又黄的美女裸体网站 | 久久精品视频在线看15 | 午夜男女很黄的视频 | 国产特级毛片aaaaaa高潮流水 | 爆乳一区二区三区无码 | www一区二区www免费 | 中文字幕无码人妻少妇免费 | 亚洲 日韩 欧美 成人 在线观看 | 免费观看又污又黄的网站 | 天天摸天天透天天添 | 亚洲人成网站在线播放942 | 欧美日韩色另类综合 | 成人女人看片免费视频放人 | 欧美国产日韩亚洲中文 | 在线亚洲高清揄拍自拍一品区 | 丰满人妻被黑人猛烈进入 | 波多野结衣av在线观看 | 永久免费精品精品永久-夜色 | 久久精品国产99久久6动漫 | 六月丁香婷婷色狠狠久久 | 人人爽人人澡人人人妻 | 亚洲综合色区中文字幕 | 欧美激情一区二区三区成人 | 亚洲色欲色欲天天天www | 亚洲人成影院在线无码按摩店 | 日本大乳高潮视频在线观看 | 国产成人无码av在线影院 | 亚洲色欲色欲天天天www | 久久久久久国产精品无码下载 | 国产人妻久久精品二区三区老狼 | 无码福利日韩神码福利片 | 无码国产色欲xxxxx视频 | 欧美变态另类xxxx | 亚洲s色大片在线观看 | 性生交大片免费看女人按摩摩 | 亚洲国产精品一区二区第一页 | 日韩亚洲欧美精品综合 | 黑森林福利视频导航 | 成人片黄网站色大片免费观看 | 国产香蕉97碰碰久久人人 | 久久久国产一区二区三区 | 欧美第一黄网免费网站 | 伊人色综合久久天天小片 | 亚洲国产日韩a在线播放 | 亚洲爆乳无码专区 | 无码一区二区三区在线 | 精品一区二区不卡无码av | 熟妇人妻无码xxx视频 | 少妇性荡欲午夜性开放视频剧场 | 国产精品亚洲lv粉色 | 麻花豆传媒剧国产免费mv在线 | 十八禁真人啪啪免费网站 | 无码精品国产va在线观看dvd | 欧美 日韩 人妻 高清 中文 | 国产乱人无码伦av在线a | 少妇性荡欲午夜性开放视频剧场 | 国精品人妻无码一区二区三区蜜柚 | 狠狠色欧美亚洲狠狠色www | 四十如虎的丰满熟妇啪啪 | 波多野42部无码喷潮在线 | 国产av剧情md精品麻豆 | 99er热精品视频 | 免费人成在线观看网站 | 国产在线精品一区二区高清不卡 | 欧美35页视频在线观看 | 国产精品办公室沙发 | 国产精品久久久久影院嫩草 | 丰满岳乱妇在线观看中字无码 | 欧美日韩一区二区综合 | 中文字幕久久久久人妻 | 俺去俺来也在线www色官网 | 亚洲啪av永久无码精品放毛片 | 国产九九九九九九九a片 | aⅴ在线视频男人的天堂 | 无码成人精品区在线观看 | 亚洲啪av永久无码精品放毛片 | 色综合久久久久综合一本到桃花网 | 天天爽夜夜爽夜夜爽 | 人人澡人人透人人爽 | 国产农村乱对白刺激视频 | 亚无码乱人伦一区二区 | 国产9 9在线 | 中文 | 风流少妇按摩来高潮 | 人人爽人人爽人人片av亚洲 | 国产精品久久国产三级国 | 少女韩国电视剧在线观看完整 | 亚洲va欧美va天堂v国产综合 | 成人av无码一区二区三区 | 国产激情精品一区二区三区 | 久久无码中文字幕免费影院蜜桃 | 鲁大师影院在线观看 | 女人被男人爽到呻吟的视频 | 野狼第一精品社区 | 成 人 免费观看网站 | 伊人久久大香线蕉午夜 | 丰满岳乱妇在线观看中字无码 | 在线播放免费人成毛片乱码 | 激情综合激情五月俺也去 | 人人妻人人澡人人爽人人精品浪潮 | 成人无码精品1区2区3区免费看 | 中文字幕人妻无码一夲道 | 亚洲国产午夜精品理论片 | 伊人久久婷婷五月综合97色 | 成人试看120秒体验区 | 国产精品久久久久9999小说 | 亚洲第一网站男人都懂 | 亚洲国产精品无码久久久久高潮 | 老头边吃奶边弄进去呻吟 | 色诱久久久久综合网ywww | 在线精品亚洲一区二区 | 午夜精品久久久久久久 | 中文字幕 人妻熟女 | 久久亚洲精品成人无码 | 亚洲午夜福利在线观看 | 久久精品无码一区二区三区 | 日韩精品无码免费一区二区三区 | 国产综合久久久久鬼色 | 国产av无码专区亚洲awww | 国产成人精品视频ⅴa片软件竹菊 | 男女作爱免费网站 | 成人aaa片一区国产精品 | 高清不卡一区二区三区 | 久久久无码中文字幕久... | 丰满肥臀大屁股熟妇激情视频 | 中文精品久久久久人妻不卡 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲国产成人a精品不卡在线 | 在线观看欧美一区二区三区 | 丰满少妇高潮惨叫视频 | 高清无码午夜福利视频 | 久久久久亚洲精品男人的天堂 | 国产精品美女久久久久av爽李琼 | 国产情侣作爱视频免费观看 | 国产69精品久久久久app下载 | 亚洲熟妇色xxxxx欧美老妇y | 丰满人妻被黑人猛烈进入 | 色综合久久中文娱乐网 | 日欧一片内射va在线影院 | 97夜夜澡人人爽人人喊中国片 | 日韩少妇内射免费播放 | 国产人妻人伦精品 | 亚洲另类伦春色综合小说 | av人摸人人人澡人人超碰下载 | 免费观看的无遮挡av | 激情国产av做激情国产爱 | 日韩欧美中文字幕在线三区 | www国产精品内射老师 | 亚洲国产精华液网站w | 又大又硬又爽免费视频 | 大胆欧美熟妇xx | 成年美女黄网站色大免费全看 | 中文字幕人妻无码一夲道 | 野狼第一精品社区 | 国产一区二区三区四区五区加勒比 | 日本熟妇人妻xxxxx人hd | 我要看www免费看插插视频 | 2019午夜福利不卡片在线 | 久久亚洲日韩精品一区二区三区 | 小sao货水好多真紧h无码视频 | 日本肉体xxxx裸交 | 精品久久久无码人妻字幂 | 亚洲第一无码av无码专区 | 国产成人亚洲综合无码 | 在线亚洲高清揄拍自拍一品区 | 午夜精品一区二区三区的区别 | 亚洲国产精品美女久久久久 | 欧美xxxxx精品 | 国产亲子乱弄免费视频 | 在线观看欧美一区二区三区 | 国产人妖乱国产精品人妖 | 澳门永久av免费网站 | 亚洲欧洲中文日韩av乱码 | 久久天天躁狠狠躁夜夜免费观看 | 麻豆国产人妻欲求不满 | 中文字幕无码av波多野吉衣 | 内射巨臀欧美在线视频 | 纯爱无遮挡h肉动漫在线播放 | 国产av无码专区亚洲a∨毛片 | 少妇人妻偷人精品无码视频 | 又紧又大又爽精品一区二区 | 无码国产激情在线观看 | 欧美性黑人极品hd | 久久久精品人妻久久影视 | 乱码午夜-极国产极内射 | 色诱久久久久综合网ywww | 色婷婷久久一区二区三区麻豆 | 国产情侣作爱视频免费观看 | 波多野结衣av在线观看 | 欧美freesex黑人又粗又大 | 无码毛片视频一区二区本码 | 欧洲精品码一区二区三区免费看 | 亚洲精品国产第一综合99久久 | 性色欲网站人妻丰满中文久久不卡 | 久久人人爽人人人人片 | 欧美丰满老熟妇xxxxx性 | 内射巨臀欧美在线视频 | 少妇人妻偷人精品无码视频 | 色一情一乱一伦 | 久久精品中文闷骚内射 | 久久人人97超碰a片精品 | 一个人免费观看的www视频 | 免费看少妇作爱视频 | 日韩精品久久久肉伦网站 | 免费观看的无遮挡av | 鲁鲁鲁爽爽爽在线视频观看 | 国产精品无套呻吟在线 | 日本乱人伦片中文三区 | 99精品无人区乱码1区2区3区 | 荫蒂被男人添的好舒服爽免费视频 | √8天堂资源地址中文在线 | 日本欧美一区二区三区乱码 | 亚拍精品一区二区三区探花 | 人人澡人摸人人添 | 天天摸天天透天天添 | 在线a亚洲视频播放在线观看 | 久久99热只有频精品8 | 成人精品视频一区二区三区尤物 | 影音先锋中文字幕无码 | 老熟妇乱子伦牲交视频 | 爽爽影院免费观看 | 精品无码一区二区三区爱欲 | 亚洲国产精品成人久久蜜臀 | 久久久中文久久久无码 | 亚洲熟悉妇女xxx妇女av | 亚洲色在线无码国产精品不卡 | 成人免费无码大片a毛片 | 精品国产精品久久一区免费式 | 色婷婷久久一区二区三区麻豆 | 欧美乱妇无乱码大黄a片 | 国模大胆一区二区三区 | 免费无码肉片在线观看 | 任你躁国产自任一区二区三区 | 国产精品久久久久久久9999 | 国产一精品一av一免费 | 精品乱子伦一区二区三区 | 亚洲国产精华液网站w | 正在播放老肥熟妇露脸 | 色婷婷av一区二区三区之红樱桃 | 国产免费久久精品国产传媒 | 一本色道婷婷久久欧美 | 亚洲精品久久久久久一区二区 | 日韩 欧美 动漫 国产 制服 | 精品成在人线av无码免费看 | 自拍偷自拍亚洲精品10p | 一本色道久久综合亚洲精品不卡 | 爱做久久久久久 | 亚洲自偷精品视频自拍 | 无套内射视频囯产 | 国产亚洲欧美日韩亚洲中文色 | 蜜桃无码一区二区三区 | 亚洲国产精品久久久久久 | 人人爽人人爽人人片av亚洲 | 精品人妻人人做人人爽 | 亚洲一区二区三区国产精华液 | 熟妇人妻激情偷爽文 | 久久精品中文字幕大胸 | 高清国产亚洲精品自在久久 | 国产精品美女久久久久av爽李琼 | 国产人妻精品午夜福利免费 | 免费无码的av片在线观看 | 4hu四虎永久在线观看 | 欧美阿v高清资源不卡在线播放 | 亚洲人成影院在线观看 | 中文字幕 亚洲精品 第1页 | 国产又爽又猛又粗的视频a片 | 国产成人综合在线女婷五月99播放 | 亚洲经典千人经典日产 | 国产成人一区二区三区别 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 奇米影视7777久久精品 | 国产肉丝袜在线观看 | 欧美乱妇无乱码大黄a片 | 99久久亚洲精品无码毛片 | 无码人妻精品一区二区三区不卡 | 成人精品天堂一区二区三区 | 强奷人妻日本中文字幕 | 欧美 亚洲 国产 另类 | 欧美 日韩 亚洲 在线 | 成人亚洲精品久久久久软件 | 亚洲欧美综合区丁香五月小说 | 亚洲无人区午夜福利码高清完整版 | 久久www免费人成人片 | 久久综合狠狠综合久久综合88 | 亚无码乱人伦一区二区 | 亚洲精品无码国产 | 亚洲国产精品成人久久蜜臀 | 成人无码精品1区2区3区免费看 | √天堂中文官网8在线 | 国产精品99久久精品爆乳 | 欧美日本免费一区二区三区 | 动漫av一区二区在线观看 | av在线亚洲欧洲日产一区二区 | 精品一区二区三区无码免费视频 | 偷窥日本少妇撒尿chinese | 成在人线av无码免费 | 亚洲 高清 成人 动漫 | 激情亚洲一区国产精品 | 亚洲理论电影在线观看 | 无码国模国产在线观看 | 精品国产麻豆免费人成网站 | 亚洲精品一区二区三区大桥未久 | 岛国片人妻三上悠亚 | 亚洲欧美日韩成人高清在线一区 | 激情内射日本一区二区三区 | 女人高潮内射99精品 | 国产精品va在线观看无码 | 欧美人与禽猛交狂配 | 少妇无码av无码专区在线观看 | 国产色xx群视频射精 | 婷婷丁香五月天综合东京热 | 我要看www免费看插插视频 | 国产三级久久久精品麻豆三级 | 久久人人爽人人爽人人片av高清 | 少妇性俱乐部纵欲狂欢电影 | 亚欧洲精品在线视频免费观看 | 国产成人一区二区三区在线观看 | 欧美 日韩 人妻 高清 中文 | 精品成在人线av无码免费看 | 亚洲国产精品无码一区二区三区 | 久久精品国产一区二区三区 | 乌克兰少妇性做爰 | 无码纯肉视频在线观看 | 无套内射视频囯产 | 色综合久久久久综合一本到桃花网 | 亚洲综合伊人久久大杳蕉 | 国产日产欧产精品精品app | 鲁大师影院在线观看 | 永久黄网站色视频免费直播 | 永久免费观看美女裸体的网站 | 色婷婷综合激情综在线播放 | 最新版天堂资源中文官网 | 国产精品久久久久久亚洲毛片 | 精品一二三区久久aaa片 | 免费无码一区二区三区蜜桃大 | 亚洲爆乳精品无码一区二区三区 | 漂亮人妻洗澡被公强 日日躁 | 午夜精品一区二区三区在线观看 | 亚洲小说春色综合另类 | 久久久中文久久久无码 | 国产人妻精品一区二区三区 | 国产乱子伦视频在线播放 | 亚洲天堂2017无码中文 | 国产人妻精品午夜福利免费 | 成人无码精品1区2区3区免费看 | 日本丰满护士爆乳xxxx | 无码成人精品区在线观看 | 日韩少妇内射免费播放 | 无码av免费一区二区三区试看 | 国产乱人伦偷精品视频 | 欧美阿v高清资源不卡在线播放 | 男人扒开女人内裤强吻桶进去 | 日韩人妻少妇一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 日日摸日日碰夜夜爽av | 久久久久亚洲精品中文字幕 | 麻豆成人精品国产免费 | 人妻无码久久精品人妻 | 亚洲熟妇色xxxxx亚洲 | 露脸叫床粗话东北少妇 | 未满成年国产在线观看 | av无码久久久久不卡免费网站 | 国产又粗又硬又大爽黄老大爷视 | 女人色极品影院 | 亚洲理论电影在线观看 | 精品人妻人人做人人爽夜夜爽 | 午夜精品久久久内射近拍高清 | 99精品国产综合久久久久五月天 | 亚洲成a人片在线观看日本 | 国产成人精品视频ⅴa片软件竹菊 | 国产欧美亚洲精品a | 亚洲小说图区综合在线 | 国产人妻久久精品二区三区老狼 | 国产精品.xx视频.xxtv | 日韩人妻无码中文字幕视频 | 亚洲第一无码av无码专区 | 麻豆国产人妻欲求不满 | 少妇高潮一区二区三区99 | 99久久人妻精品免费一区 | 精品久久久久久亚洲精品 | 国产精品亚洲lv粉色 | 无码一区二区三区在线 | 精品无码一区二区三区爱欲 | 亚洲七七久久桃花影院 | 国产精华av午夜在线观看 | 精品偷拍一区二区三区在线看 | 377p欧洲日本亚洲大胆 | 亚拍精品一区二区三区探花 | 精品国产国产综合精品 | 久久久精品456亚洲影院 | 婷婷综合久久中文字幕蜜桃三电影 | 国産精品久久久久久久 | 老司机亚洲精品影院 | 国产两女互慰高潮视频在线观看 | 久久精品国产一区二区三区肥胖 | 精品日本一区二区三区在线观看 | 成熟女人特级毛片www免费 | 欧美国产日韩久久mv | 最近的中文字幕在线看视频 | 蜜桃臀无码内射一区二区三区 | 欧美黑人性暴力猛交喷水 | 成人毛片一区二区 | 久久综合色之久久综合 | 国产高清不卡无码视频 | 一本无码人妻在中文字幕免费 | 天天躁日日躁狠狠躁免费麻豆 | 粉嫩少妇内射浓精videos | 亚洲中文字幕成人无码 | 无码人妻丰满熟妇区毛片18 | 日本一本二本三区免费 | 久久久久久a亚洲欧洲av冫 | 色欲av亚洲一区无码少妇 | 天堂无码人妻精品一区二区三区 | 国产精品美女久久久 | 久久国语露脸国产精品电影 | 中文字幕无码热在线视频 | 人妻体内射精一区二区三四 | 国产另类ts人妖一区二区 | 亚洲综合另类小说色区 | 水蜜桃亚洲一二三四在线 | 欧美丰满老熟妇xxxxx性 | 久久精品国产精品国产精品污 | 伊人久久大香线蕉亚洲 | 国产亚洲视频中文字幕97精品 | 在线看片无码永久免费视频 | 国产人妻精品一区二区三区不卡 | 无码一区二区三区在线 | 1000部啪啪未满十八勿入下载 | 国产乱人偷精品人妻a片 | 丁香花在线影院观看在线播放 | 国内精品九九久久久精品 | 国产亚洲欧美日韩亚洲中文色 | 亚洲成av人片天堂网无码】 | 老头边吃奶边弄进去呻吟 | 欧美成人午夜精品久久久 | 久久久久免费精品国产 | 在线亚洲高清揄拍自拍一品区 | 国色天香社区在线视频 | 性生交大片免费看女人按摩摩 | 亚洲欧洲日本无在线码 | 亚洲区欧美区综合区自拍区 | 日韩欧美中文字幕在线三区 | 欧美 日韩 人妻 高清 中文 | 天天做天天爱天天爽综合网 | 2020最新国产自产精品 | 人人妻人人澡人人爽欧美一区九九 | 亚洲国产精品美女久久久久 | 婷婷色婷婷开心五月四房播播 | 亚洲va中文字幕无码久久不卡 | 亚洲国产成人av在线观看 | 国产成人久久精品流白浆 | 国产小呦泬泬99精品 | 无码精品人妻一区二区三区av | 亚洲一区二区三区四区 | 我要看www免费看插插视频 | 精品厕所偷拍各类美女tp嘘嘘 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲爆乳大丰满无码专区 | 1000部夫妻午夜免费 | 国产一区二区三区日韩精品 | 国产偷国产偷精品高清尤物 | 日韩欧美成人免费观看 | 日韩欧美中文字幕在线三区 | 精品厕所偷拍各类美女tp嘘嘘 | 国产超级va在线观看视频 | 国产性生交xxxxx无码 | 色欲久久久天天天综合网精品 | 亚洲精品一区二区三区大桥未久 | 国产精品无码一区二区三区不卡 | 永久免费观看国产裸体美女 | 国产成人精品久久亚洲高清不卡 | 男人扒开女人内裤强吻桶进去 | 久久99国产综合精品 | 欧美成人家庭影院 | 国产特级毛片aaaaaa高潮流水 | 国产热a欧美热a在线视频 | 国产sm调教视频在线观看 | 午夜成人1000部免费视频 | 免费观看的无遮挡av | 国产精品福利视频导航 | 国产成人无码a区在线观看视频app | 沈阳熟女露脸对白视频 | 国产口爆吞精在线视频 | 欧美一区二区三区视频在线观看 | 大地资源网第二页免费观看 | 亚洲精品一区二区三区婷婷月 | 欧洲欧美人成视频在线 | 欧美丰满老熟妇xxxxx性 | 国产精品人妻一区二区三区四 | 妺妺窝人体色www在线小说 | 亚洲一区二区三区国产精华液 | 55夜色66夜色国产精品视频 | 少女韩国电视剧在线观看完整 | 婷婷六月久久综合丁香 | 婷婷综合久久中文字幕蜜桃三电影 | 在线亚洲高清揄拍自拍一品区 | 性开放的女人aaa片 | 一本久久a久久精品vr综合 | 久久久久人妻一区精品色欧美 | 亚洲啪av永久无码精品放毛片 | 久久婷婷五月综合色国产香蕉 | 性史性农村dvd毛片 | 在线 国产 欧美 亚洲 天堂 | 国内少妇偷人精品视频免费 | 97色伦图片97综合影院 | 久久婷婷五月综合色国产香蕉 | 久久精品成人欧美大片 | 熟妇人妻中文av无码 | 日日麻批免费40分钟无码 | 亚洲乱码日产精品bd | 国产成人精品久久亚洲高清不卡 | 99久久精品国产一区二区蜜芽 | 久久久久人妻一区精品色欧美 | 亚洲中文字幕无码中文字在线 | 狠狠噜狠狠狠狠丁香五月 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲成a人片在线观看无码3d | 丰满诱人的人妻3 | а√资源新版在线天堂 | 成人三级无码视频在线观看 | 最近的中文字幕在线看视频 | 亚洲色欲色欲天天天www | 99精品久久毛片a片 | 国产肉丝袜在线观看 | 亚洲欧美中文字幕5发布 | 国产 浪潮av性色四虎 | 一本色道久久综合狠狠躁 | 狠狠色欧美亚洲狠狠色www | 在线 国产 欧美 亚洲 天堂 | 亚洲人成无码网www | 丰满少妇熟乱xxxxx视频 | 狠狠色丁香久久婷婷综合五月 | 国产办公室秘书无码精品99 | 伊在人天堂亚洲香蕉精品区 | 精品偷自拍另类在线观看 | 亚洲成av人影院在线观看 | 最近免费中文字幕中文高清百度 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产乱子伦视频在线播放 | 亚洲日韩乱码中文无码蜜桃臀网站 | 成人精品天堂一区二区三区 | 国产福利视频一区二区 | 精品亚洲韩国一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 俺去俺来也在线www色官网 | 日韩欧美中文字幕在线三区 | 国产精品亚洲а∨无码播放麻豆 | av无码久久久久不卡免费网站 | 亚洲精品成人av在线 | 国产suv精品一区二区五 | 国产精品va在线观看无码 | 久久综合色之久久综合 | 国产精品无套呻吟在线 | 18禁黄网站男男禁片免费观看 | 天天摸天天透天天添 | 秋霞特色aa大片 | 久久久久av无码免费网 | 中文字幕无码乱人伦 | 天堂久久天堂av色综合 | 精品无码av一区二区三区 | 无码精品国产va在线观看dvd | 奇米影视888欧美在线观看 | 欧美激情综合亚洲一二区 | 精品国产av色一区二区深夜久久 | 国产人妻精品一区二区三区不卡 | 久久精品无码一区二区三区 | 日韩人妻无码中文字幕视频 | 无码精品人妻一区二区三区av | 又湿又紧又大又爽a视频国产 | 内射后入在线观看一区 | 亚洲第一网站男人都懂 | 欧美精品一区二区精品久久 | 亚洲成色在线综合网站 | 一区二区三区高清视频一 | 欧美日本免费一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 无码帝国www无码专区色综合 | 又大又紧又粉嫩18p少妇 | 日韩人妻系列无码专区 | 亚洲a无码综合a国产av中文 | 日日碰狠狠丁香久燥 | 国产激情精品一区二区三区 | 曰韩无码二三区中文字幕 | 久久精品国产日本波多野结衣 | 精品久久久无码中文字幕 | 亚洲精品成人福利网站 | 超碰97人人做人人爱少妇 | 自拍偷自拍亚洲精品被多人伦好爽 | 少女韩国电视剧在线观看完整 | 国产极品视觉盛宴 | 狂野欧美性猛交免费视频 | 久久亚洲精品中文字幕无男同 | 久久精品丝袜高跟鞋 | 无码人妻丰满熟妇区五十路百度 | 成人无码视频在线观看网站 | 国产成人无码区免费内射一片色欲 | 国产亚洲精品久久久闺蜜 | 人人妻人人澡人人爽欧美一区 | 亚洲精品久久久久久一区二区 | 久久久久免费看成人影片 | 国产黑色丝袜在线播放 | 国产成人一区二区三区在线观看 | 四虎国产精品一区二区 | 无码乱肉视频免费大全合集 | 国产成人无码一二三区视频 | 99久久久无码国产aaa精品 | 欧美性生交活xxxxxdddd | 狠狠亚洲超碰狼人久久 | 麻豆国产人妻欲求不满 | 国产精品人人爽人人做我的可爱 | 精品久久久无码人妻字幂 | 亚洲乱亚洲乱妇50p | 99国产欧美久久久精品 | 午夜福利试看120秒体验区 | 国产一精品一av一免费 | 亚洲毛片av日韩av无码 | 99麻豆久久久国产精品免费 | 亚洲中文字幕乱码av波多ji | 77777熟女视频在线观看 а天堂中文在线官网 | 夜夜躁日日躁狠狠久久av | 亚洲区欧美区综合区自拍区 | 少妇愉情理伦片bd | 亚洲精品久久久久avwww潮水 | 亚洲综合在线一区二区三区 | 澳门永久av免费网站 | 久久综合给合久久狠狠狠97色 | 福利一区二区三区视频在线观看 | 国产色视频一区二区三区 | 天堂无码人妻精品一区二区三区 | 中文字幕无码免费久久99 | 国产艳妇av在线观看果冻传媒 | 久久综合给合久久狠狠狠97色 | 成人无码视频免费播放 | 久久久中文字幕日本无吗 | 精品aⅴ一区二区三区 | 国产精品自产拍在线观看 | 国产熟女一区二区三区四区五区 | 久久国产精品二国产精品 | 丰满人妻一区二区三区免费视频 | 无码人妻黑人中文字幕 | 国产偷抇久久精品a片69 | 午夜男女很黄的视频 | 性生交片免费无码看人 | 好屌草这里只有精品 | 色五月丁香五月综合五月 | 亚洲午夜福利在线观看 | 亚洲人成人无码网www国产 | 久久久久99精品国产片 | 中文字幕亚洲情99在线 | 亚洲自偷精品视频自拍 | 久久精品国产亚洲精品 | 亚洲一区二区观看播放 | 伊人久久大香线蕉av一区二区 | 精品无码一区二区三区爱欲 | 日韩精品无码一本二本三本色 | 亚洲狠狠婷婷综合久久 | 少妇无码一区二区二三区 | 亚洲午夜久久久影院 | 久久精品女人天堂av免费观看 | 永久免费观看国产裸体美女 | 国产亚洲精品久久久久久国模美 | 久久精品国产日本波多野结衣 | 久久精品成人欧美大片 | 午夜嘿嘿嘿影院 | 午夜不卡av免费 一本久久a久久精品vr综合 | 男人和女人高潮免费网站 | 国产莉萝无码av在线播放 | 丰满少妇人妻久久久久久 | 国产精品久久久久久久影院 | 天堂а√在线中文在线 | 国产另类ts人妖一区二区 | 自拍偷自拍亚洲精品10p | 成人精品天堂一区二区三区 | 人人爽人人澡人人人妻 | 东京无码熟妇人妻av在线网址 | 狂野欧美性猛xxxx乱大交 | 国产手机在线αⅴ片无码观看 | 一本一道久久综合久久 | 精品一二三区久久aaa片 | 免费看少妇作爱视频 | 天天摸天天透天天添 | 亚洲精品欧美二区三区中文字幕 | 色老头在线一区二区三区 | 亚洲伊人久久精品影院 | 欧美日本精品一区二区三区 | 亚洲精品中文字幕 | 白嫩日本少妇做爰 | 午夜嘿嘿嘿影院 | 一本久久伊人热热精品中文字幕 | 精品国产精品久久一区免费式 | 一区二区三区高清视频一 | 日本丰满护士爆乳xxxx | 永久免费观看美女裸体的网站 | 国产日产欧产精品精品app | 美女张开腿让人桶 | 无码纯肉视频在线观看 | 国产偷抇久久精品a片69 | 精品国偷自产在线视频 | 久久久精品国产sm最大网站 | 成人精品天堂一区二区三区 | 国产情侣作爱视频免费观看 | 全黄性性激高免费视频 | 亚洲欧美国产精品久久 | 亚洲 另类 在线 欧美 制服 | 国产精品二区一区二区aⅴ污介绍 | 人人爽人人澡人人人妻 | 欧美黑人巨大xxxxx | 麻豆成人精品国产免费 | 妺妺窝人体色www婷婷 | 日本熟妇大屁股人妻 | 国内丰满熟女出轨videos | 乱码av麻豆丝袜熟女系列 | 激情综合激情五月俺也去 | 中文字幕+乱码+中文字幕一区 | 成人综合网亚洲伊人 | 国产疯狂伦交大片 | 亚洲中文字幕乱码av波多ji | 亚洲日韩乱码中文无码蜜桃臀网站 | √8天堂资源地址中文在线 | 欧美人与禽猛交狂配 | 国产三级精品三级男人的天堂 | 搡女人真爽免费视频大全 | 少妇无套内谢久久久久 | 无人区乱码一区二区三区 | 亚洲乱码国产乱码精品精 | 国产97色在线 | 免 | 亚洲自偷自拍另类第1页 | 波多野结衣aⅴ在线 | 国产精品久久久久久亚洲影视内衣 | 性生交片免费无码看人 | 九九热爱视频精品 | 日本精品人妻无码免费大全 | 免费无码肉片在线观看 | 最新国产乱人伦偷精品免费网站 | 国产精品鲁鲁鲁 | 人人爽人人爽人人片av亚洲 | 激情内射亚州一区二区三区爱妻 | 大屁股大乳丰满人妻 | 麻豆人妻少妇精品无码专区 | 最新版天堂资源中文官网 | 国产suv精品一区二区五 | 日本xxxx色视频在线观看免费 | 伦伦影院午夜理论片 | 久久精品国产99精品亚洲 | 精品乱子伦一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 国产av一区二区三区最新精品 | 好男人www社区 | 99精品无人区乱码1区2区3区 | 天堂亚洲2017在线观看 | 国产激情精品一区二区三区 | 两性色午夜免费视频 | 国产精品嫩草久久久久 | 亚洲爆乳精品无码一区二区三区 | 欧美日韩视频无码一区二区三 | 久久久精品国产sm最大网站 | 国产精品99久久精品爆乳 | 又色又爽又黄的美女裸体网站 | 夜夜影院未满十八勿进 | 国产亚洲精品久久久久久久久动漫 | 无套内射视频囯产 | 成熟女人特级毛片www免费 | 波多野42部无码喷潮在线 | 亚洲最大成人网站 | 人妻少妇被猛烈进入中文字幕 | 中文字幕日产无线码一区 | 亚拍精品一区二区三区探花 | 久久国产精品萌白酱免费 | 国产精品手机免费 | 国产精品久久久午夜夜伦鲁鲁 | 成人一区二区免费视频 | 国产综合色产在线精品 | 中文字幕 亚洲精品 第1页 | 四虎国产精品免费久久 | 久久午夜无码鲁丝片午夜精品 | 国产激情综合五月久久 | 在线播放免费人成毛片乱码 | 激情国产av做激情国产爱 | 国产农村乱对白刺激视频 | 日日碰狠狠丁香久燥 | 久久午夜无码鲁丝片秋霞 | 日韩精品无码一本二本三本色 | 国产精品高潮呻吟av久久4虎 | 蜜桃av抽搐高潮一区二区 | 精品熟女少妇av免费观看 | 中文字幕精品av一区二区五区 | 成人av无码一区二区三区 | 亚洲国产精品一区二区第一页 | 国产明星裸体无码xxxx视频 | 少妇性荡欲午夜性开放视频剧场 | 少妇人妻av毛片在线看 | 国产成人无码午夜视频在线观看 | 成人aaa片一区国产精品 | 亚洲 a v无 码免 费 成 人 a v | 久久久久久国产精品无码下载 | 久久久久se色偷偷亚洲精品av | 青青青爽视频在线观看 | 国产无套粉嫩白浆在线 | 国产激情一区二区三区 | 红桃av一区二区三区在线无码av | 国产偷抇久久精品a片69 | 三级4级全黄60分钟 | 东京一本一道一二三区 | 少妇被粗大的猛进出69影院 | 久久久中文字幕日本无吗 | 午夜精品久久久内射近拍高清 | 欧美日韩久久久精品a片 | 蜜桃臀无码内射一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 精品乱码久久久久久久 | 九九综合va免费看 | 日日摸夜夜摸狠狠摸婷婷 | 好男人www社区 | 欧美丰满老熟妇xxxxx性 | 亚洲综合伊人久久大杳蕉 | 少妇无码av无码专区在线观看 | 国产在线精品一区二区三区直播 | 99久久婷婷国产综合精品青草免费 | 国产精品美女久久久网av | 国产三级久久久精品麻豆三级 | 久久国产精品二国产精品 | 国产综合久久久久鬼色 | 亚洲国产精品美女久久久久 | 荫蒂添的好舒服视频囗交 | 少妇太爽了在线观看 | 全球成人中文在线 | 亚洲成av人综合在线观看 | 精品人妻人人做人人爽夜夜爽 | 西西人体www44rt大胆高清 | 丝袜美腿亚洲一区二区 | 精品国产成人一区二区三区 | 国产 浪潮av性色四虎 | 亚洲色大成网站www | 久久国产精品_国产精品 | 亚洲a无码综合a国产av中文 | √8天堂资源地址中文在线 | 狠狠色欧美亚洲狠狠色www | 日本乱偷人妻中文字幕 | 国产人妖乱国产精品人妖 | 给我免费的视频在线观看 | www国产亚洲精品久久久日本 | 又粗又大又硬毛片免费看 | 天堂亚洲2017在线观看 | 国产又粗又硬又大爽黄老大爷视 | 国产午夜精品一区二区三区嫩草 | 国产精品人妻一区二区三区四 | 欧美成人家庭影院 | 麻豆成人精品国产免费 | 精品一区二区三区波多野结衣 | 国产精品怡红院永久免费 | 国产精品对白交换视频 | 色综合天天综合狠狠爱 | 熟妇人妻无乱码中文字幕 | 久久天天躁夜夜躁狠狠 | 国产美女极度色诱视频www | 午夜无码人妻av大片色欲 | 国产一区二区三区精品视频 | 久久天天躁狠狠躁夜夜免费观看 | 女人色极品影院 | 无码一区二区三区在线观看 | 亚洲第一无码av无码专区 | 国产无套粉嫩白浆在线 | 久久久精品成人免费观看 | 99久久99久久免费精品蜜桃 | 亚洲精品久久久久久一区二区 | 18精品久久久无码午夜福利 | 麻花豆传媒剧国产免费mv在线 | 亚洲精品鲁一鲁一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 亚洲精品一区二区三区四区五区 | 成在人线av无码免观看麻豆 | 亚洲色在线无码国产精品不卡 | 久久天天躁狠狠躁夜夜免费观看 | 18禁止看的免费污网站 | 日韩精品无码一区二区中文字幕 | 国产精品va在线观看无码 | 天天摸天天碰天天添 | 18精品久久久无码午夜福利 | 成人欧美一区二区三区 | 在线观看国产一区二区三区 | 欧美精品国产综合久久 | 欧美激情综合亚洲一二区 | 欧美日韩色另类综合 | aa片在线观看视频在线播放 | 国产日产欧产精品精品app | 两性色午夜视频免费播放 | 成人一在线视频日韩国产 | 欧美大屁股xxxxhd黑色 | 午夜无码区在线观看 | 性啪啪chinese东北女人 | 久久久久久a亚洲欧洲av冫 | 大屁股大乳丰满人妻 | 国产精品无码久久av | 国产精品亚洲lv粉色 | 免费乱码人妻系列无码专区 | 亚洲男人av天堂午夜在 | 成人av无码一区二区三区 | 国产9 9在线 | 中文 | 亚洲国产高清在线观看视频 | 精品国产一区二区三区四区 | 亚洲色无码一区二区三区 | 日产精品高潮呻吟av久久 | 国产av无码专区亚洲awww | 欧美日本精品一区二区三区 | 强奷人妻日本中文字幕 | аⅴ资源天堂资源库在线 | 两性色午夜免费视频 | 国产另类ts人妖一区二区 | 图片小说视频一区二区 | 天堂а√在线地址中文在线 | 狠狠cao日日穞夜夜穞av | 高中生自慰www网站 | 在线看片无码永久免费视频 | 久青草影院在线观看国产 | 清纯唯美经典一区二区 | 少妇被黑人到高潮喷出白浆 | 国产小呦泬泬99精品 | 久久久婷婷五月亚洲97号色 | 男女作爱免费网站 | 全黄性性激高免费视频 | 午夜时刻免费入口 | 奇米影视7777久久精品 | 久久久久久国产精品无码下载 | 日本又色又爽又黄的a片18禁 | 亚洲成av人综合在线观看 | 老熟妇乱子伦牲交视频 | 2020最新国产自产精品 | 成熟妇人a片免费看网站 | av小次郎收藏 | 欧美日韩一区二区免费视频 | 亚拍精品一区二区三区探花 | 久久精品人人做人人综合 | 国产九九九九九九九a片 | 少妇一晚三次一区二区三区 | 国精产品一品二品国精品69xx | 乱人伦人妻中文字幕无码久久网 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 青青青手机频在线观看 | 欧美人与动性行为视频 | 国产精品久久久久7777 | 无套内谢老熟女 | 欧美精品在线观看 | 蜜桃臀无码内射一区二区三区 | 性做久久久久久久免费看 | 大地资源网第二页免费观看 | 日韩欧美中文字幕在线三区 | 精品欧洲av无码一区二区三区 | 亚洲精品中文字幕久久久久 | 97夜夜澡人人爽人人喊中国片 | 丝袜人妻一区二区三区 | 无码av免费一区二区三区试看 | 老头边吃奶边弄进去呻吟 | 亚洲狠狠色丁香婷婷综合 | 又大又硬又爽免费视频 | 少妇一晚三次一区二区三区 | 久久综合给久久狠狠97色 | 激情人妻另类人妻伦 | 日本丰满熟妇videos | 国产激情无码一区二区 | 奇米影视7777久久精品人人爽 | 日本va欧美va欧美va精品 | 国产成人精品三级麻豆 | 欧美兽交xxxx×视频 | 亚洲午夜久久久影院 | 国产精品a成v人在线播放 | 免费国产黄网站在线观看 | 宝宝好涨水快流出来免费视频 | 国产激情一区二区三区 | 中文字幕无码热在线视频 | 国产在线精品一区二区三区直播 | 欧洲精品码一区二区三区免费看 | 欧美激情内射喷水高潮 | 久久国语露脸国产精品电影 | ass日本丰满熟妇pics | 亚洲精品无码人妻无码 | 国产人妻大战黑人第1集 | 日韩精品无码免费一区二区三区 | 欧美性生交xxxxx久久久 | 国产热a欧美热a在线视频 | 狠狠色欧美亚洲狠狠色www | 亚洲熟妇色xxxxx欧美老妇 | 国产精品久久久午夜夜伦鲁鲁 | 成人无码精品1区2区3区免费看 | 日本高清一区免费中文视频 | 久久精品丝袜高跟鞋 | 大肉大捧一进一出好爽视频 | 欧美性生交活xxxxxdddd | 久久精品国产日本波多野结衣 | 熟妇人妻无乱码中文字幕 | 成人精品视频一区二区 | 中文字幕乱码中文乱码51精品 | 国产精品内射视频免费 | 粉嫩少妇内射浓精videos | 国产精品亚洲lv粉色 | 国产激情无码一区二区app | 国产午夜无码视频在线观看 | 欧美成人午夜精品久久久 | 初尝人妻少妇中文字幕 | 亚洲日韩av一区二区三区中文 | 精品久久综合1区2区3区激情 | 99久久精品国产一区二区蜜芽 | 麻豆精产国品 | 久久综合给合久久狠狠狠97色 | 无码人妻丰满熟妇区五十路百度 | 日韩无套无码精品 | 国内精品久久久久久中文字幕 | 国产香蕉97碰碰久久人人 | 亚洲欧美国产精品专区久久 | 国产99久久精品一区二区 | 欧美高清在线精品一区 | 国产乱人伦av在线无码 | 四十如虎的丰满熟妇啪啪 | 亚洲日韩中文字幕在线播放 | 强开小婷嫩苞又嫩又紧视频 | 国产精品久久久久无码av色戒 | 俄罗斯老熟妇色xxxx | 亚洲国产一区二区三区在线观看 | 99久久亚洲精品无码毛片 | 国产猛烈高潮尖叫视频免费 | 国产黑色丝袜在线播放 | 高中生自慰www网站 | 亚洲精品一区二区三区四区五区 | 老子影院午夜伦不卡 | 中文字幕乱码亚洲无线三区 | 少妇性l交大片欧洲热妇乱xxx | 鲁一鲁av2019在线 | 国产人妻精品一区二区三区不卡 | 荡女精品导航 | 免费人成网站视频在线观看 | 丝袜足控一区二区三区 | 免费观看的无遮挡av | 国产福利视频一区二区 | 老子影院午夜精品无码 | 欧美丰满少妇xxxx性 | 真人与拘做受免费视频 | 亚洲精品美女久久久久久久 | 久久久久久av无码免费看大片 | 大地资源中文第3页 | 兔费看少妇性l交大片免费 | 国产乱码精品一品二品 | 国产熟女一区二区三区四区五区 | 亚洲国产精品一区二区美利坚 | 国产精品无套呻吟在线 | 妺妺窝人体色www在线小说 | 色婷婷综合激情综在线播放 | 精品水蜜桃久久久久久久 | 在线亚洲高清揄拍自拍一品区 | 免费播放一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 国产精品久久久久久久9999 | 风流少妇按摩来高潮 | 日日夜夜撸啊撸 | 内射欧美老妇wbb | 狠狠躁日日躁夜夜躁2020 | 美女毛片一区二区三区四区 | 亚洲精品一区二区三区婷婷月 | 亚洲人亚洲人成电影网站色 | 男女超爽视频免费播放 | 国模大胆一区二区三区 | 激情爆乳一区二区三区 | 中文久久乱码一区二区 | 88国产精品欧美一区二区三区 | 日本xxxx色视频在线观看免费 | 久久精品国产一区二区三区 | 永久免费观看美女裸体的网站 | 亚洲综合无码久久精品综合 | 亚洲一区二区三区香蕉 | 一个人免费观看的www视频 | 999久久久国产精品消防器材 | 国产精品久久久av久久久 | 国产激情综合五月久久 | 97资源共享在线视频 | 亚洲一区av无码专区在线观看 | 精品欧美一区二区三区久久久 | 久久国产精品偷任你爽任你 | 欧美人与动性行为视频 | 亚洲国产精品无码久久久久高潮 | 免费无码一区二区三区蜜桃大 | 日产精品99久久久久久 | 又大又黄又粗又爽的免费视频 | 久久精品国产日本波多野结衣 | 老头边吃奶边弄进去呻吟 | 人人妻人人澡人人爽精品欧美 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 麻豆av传媒蜜桃天美传媒 | 欧美第一黄网免费网站 | 亚洲欧美精品aaaaaa片 | 中文字幕乱码人妻无码久久 | 久久亚洲中文字幕精品一区 | 桃花色综合影院 | 欧美人与牲动交xxxx | 精品国精品国产自在久国产87 | 玩弄少妇高潮ⅹxxxyw | 精品一区二区三区波多野结衣 | 好爽又高潮了毛片免费下载 | 精品人人妻人人澡人人爽人人 | 国内丰满熟女出轨videos | 亚洲精品中文字幕 | 久久精品丝袜高跟鞋 | 窝窝午夜理论片影院 | 亚洲娇小与黑人巨大交 | 亚洲男人av香蕉爽爽爽爽 | 亚洲va欧美va天堂v国产综合 | 特大黑人娇小亚洲女 | 久久久久亚洲精品中文字幕 | 久久综合给合久久狠狠狠97色 | 狠狠cao日日穞夜夜穞av | 久久国产精品二国产精品 | 久久久久久国产精品无码下载 | 日欧一片内射va在线影院 | 国产精品无码一区二区桃花视频 | 亚洲区欧美区综合区自拍区 | 亚洲国产精品无码一区二区三区 | 亚洲啪av永久无码精品放毛片 | 欧美 亚洲 国产 另类 | 妺妺窝人体色www婷婷 | 色一情一乱一伦一视频免费看 | 久久熟妇人妻午夜寂寞影院 | 成人欧美一区二区三区黑人免费 | 日本精品高清一区二区 | 天天做天天爱天天爽综合网 | 精品夜夜澡人妻无码av蜜桃 | 亚洲精品久久久久久一区二区 | 国内精品久久毛片一区二区 | 免费观看又污又黄的网站 | 国产色精品久久人妻 | 亚洲a无码综合a国产av中文 | 亚洲经典千人经典日产 | 欧美性生交xxxxx久久久 | 大地资源网第二页免费观看 | 特级做a爰片毛片免费69 | 51国偷自产一区二区三区 | 免费无码av一区二区 | 亚洲色欲色欲天天天www | 亚洲va欧美va天堂v国产综合 | 思思久久99热只有频精品66 | 精品久久久无码人妻字幂 | 亚洲精品一区二区三区婷婷月 | 亚洲精品无码国产 | 亚洲欧美日韩综合久久久 | 99精品无人区乱码1区2区3区 | 久久久久国色av免费观看性色 | 无码国产乱人伦偷精品视频 | 亚洲性无码av中文字幕 | 88国产精品欧美一区二区三区 | 日产精品高潮呻吟av久久 | 久久亚洲a片com人成 | 一区二区三区乱码在线 | 欧洲 | 蜜臀aⅴ国产精品久久久国产老师 | 久久人人爽人人爽人人片ⅴ | 99riav国产精品视频 | 国产成人久久精品流白浆 | 久久精品国产亚洲精品 | 亚洲aⅴ无码成人网站国产app | 国产成人一区二区三区在线观看 | 国产av一区二区精品久久凹凸 | 精品久久久久香蕉网 | 亚洲国产高清在线观看视频 | 老子影院午夜伦不卡 | 丰满岳乱妇在线观看中字无码 | 国产凸凹视频一区二区 | 久久久久亚洲精品男人的天堂 | 国内丰满熟女出轨videos | 精品人人妻人人澡人人爽人人 | 国产亚洲日韩欧美另类第八页 | 国产真实乱对白精彩久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产乱人偷精品人妻a片 | 天堂а√在线地址中文在线 | 亚洲а∨天堂久久精品2021 | 亚洲s码欧洲m码国产av | 日韩欧美中文字幕在线三区 | 人妻体内射精一区二区三四 | 国产精品无码久久av | 欧美日韩视频无码一区二区三 | 99国产欧美久久久精品 | 亚洲码国产精品高潮在线 | 人人爽人人澡人人人妻 | 日本一卡2卡3卡四卡精品网站 | 任你躁国产自任一区二区三区 | 亚洲一区二区三区 | 色欲av亚洲一区无码少妇 | 色噜噜亚洲男人的天堂 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 人妻夜夜爽天天爽三区 | 国精产品一品二品国精品69xx | 少妇愉情理伦片bd | 亚洲综合伊人久久大杳蕉 | 在线播放无码字幕亚洲 | 7777奇米四色成人眼影 | 亚洲中文字幕无码一久久区 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲中文字幕在线观看 | 亚洲精品鲁一鲁一区二区三区 | 欧美日韩视频无码一区二区三 | 欧美野外疯狂做受xxxx高潮 | 国产精品多人p群无码 | 久久综合网欧美色妞网 | 午夜无码人妻av大片色欲 | 中文字幕无码乱人伦 | 免费网站看v片在线18禁无码 | 中文字幕乱码人妻无码久久 | 欧美黑人乱大交 | 国产精品亚洲lv粉色 | 国产精品久久久久久亚洲影视内衣 | 精品久久久久久人妻无码中文字幕 | 亚洲精品一区二区三区大桥未久 | 精品亚洲韩国一区二区三区 | 亚洲热妇无码av在线播放 | 台湾无码一区二区 | 久久久久久久女国产乱让韩 | 伊人久久大香线蕉午夜 | 中文字幕无码乱人伦 | 97夜夜澡人人爽人人喊中国片 | 国产人妖乱国产精品人妖 | 亚洲综合精品香蕉久久网 | 免费无码的av片在线观看 | 1000部夫妻午夜免费 | 日本一卡二卡不卡视频查询 | 日本一区二区更新不卡 | 欧洲熟妇色 欧美 | 国产黄在线观看免费观看不卡 | 午夜无码人妻av大片色欲 | 高清国产亚洲精品自在久久 | 日本护士xxxxhd少妇 | www成人国产高清内射 | 在线欧美精品一区二区三区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 老熟女乱子伦 | 精品一区二区不卡无码av | 国内精品久久毛片一区二区 | 色爱情人网站 | 色狠狠av一区二区三区 | 综合网日日天干夜夜久久 | 曰本女人与公拘交酡免费视频 | 男女爱爱好爽视频免费看 | 色五月丁香五月综合五月 | 亚洲中文字幕无码中文字在线 | 狂野欧美激情性xxxx | 97精品国产97久久久久久免费 | 久久久久亚洲精品男人的天堂 | 国产精品香蕉在线观看 | 伊人久久婷婷五月综合97色 | 四虎国产精品一区二区 | 无码国内精品人妻少妇 | 天堂亚洲2017在线观看 | www国产精品内射老师 | 国精产品一品二品国精品69xx | 色婷婷香蕉在线一区二区 | 欧美性猛交内射兽交老熟妇 | 天堂久久天堂av色综合 | 欧美激情一区二区三区成人 | 国产尤物精品视频 | 男女下面进入的视频免费午夜 | 久久人妻内射无码一区三区 | 欧美xxxx黑人又粗又长 | 丰满少妇高潮惨叫视频 | 亚洲熟悉妇女xxx妇女av | 无码福利日韩神码福利片 | 色一情一乱一伦一视频免费看 | 无码免费一区二区三区 | 欧美日韩色另类综合 | 大肉大捧一进一出视频出来呀 | 日本又色又爽又黄的a片18禁 | 亚洲另类伦春色综合小说 | 精品水蜜桃久久久久久久 | 野外少妇愉情中文字幕 | 福利一区二区三区视频在线观看 | 日本精品人妻无码免费大全 | 男女下面进入的视频免费午夜 | 欧美性猛交内射兽交老熟妇 | 免费人成在线观看网站 | 狂野欧美激情性xxxx | 欧美性生交活xxxxxdddd | 久久久久久a亚洲欧洲av冫 | 国产色视频一区二区三区 | 少妇性l交大片欧洲热妇乱xxx | 久久99精品久久久久婷婷 | 亚洲精品午夜国产va久久成人 | 国产精品亚洲五月天高清 | 免费网站看v片在线18禁无码 | 国产真实乱对白精彩久久 | 精品国产精品久久一区免费式 | 中文无码成人免费视频在线观看 | 国产精品99久久精品爆乳 | 成人精品一区二区三区中文字幕 | 亚洲一区二区三区含羞草 | 国产亚洲欧美日韩亚洲中文色 | 捆绑白丝粉色jk震动捧喷白浆 | 日韩欧美群交p片內射中文 | 国产精品自产拍在线观看 | 欧美熟妇另类久久久久久不卡 | 一本久道久久综合狠狠爱 | 国产亚洲美女精品久久久2020 | 国产一区二区三区四区五区加勒比 | 亚洲乱码国产乱码精品精 | 久久zyz资源站无码中文动漫 | 成人性做爰aaa片免费看 | 国产9 9在线 | 中文 | 久久久av男人的天堂 | 国产人妻大战黑人第1集 | 婷婷五月综合激情中文字幕 | 黑人巨大精品欧美黑寡妇 | 国产在线一区二区三区四区五区 | 极品嫩模高潮叫床 | 成人片黄网站色大片免费观看 | 欧美成人高清在线播放 | 亚洲の无码国产の无码步美 | 巨爆乳无码视频在线观看 | 欧美 日韩 亚洲 在线 | 亚洲国产精品美女久久久久 | 欧美三级不卡在线观看 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品无套呻吟在线 | 欧美自拍另类欧美综合图片区 | 亚洲精品午夜无码电影网 | 午夜男女很黄的视频 | 国产亚洲精品久久久久久大师 | 久久精品国产一区二区三区 | 亚洲国产精品美女久久久久 | 国产肉丝袜在线观看 | 久久综合色之久久综合 | 丰满人妻被黑人猛烈进入 | 国产做国产爱免费视频 | 少妇太爽了在线观看 | 国产av一区二区精品久久凹凸 | 久久午夜无码鲁丝片午夜精品 | 国产亚洲精品精品国产亚洲综合 | 99久久精品日本一区二区免费 | 国产在线精品一区二区高清不卡 | 性生交大片免费看女人按摩摩 | 久久zyz资源站无码中文动漫 | 国产午夜手机精彩视频 | 在线a亚洲视频播放在线观看 | 久久久久av无码免费网 | 亚洲国产精华液网站w | 伊人久久婷婷五月综合97色 | 久热国产vs视频在线观看 | 天堂久久天堂av色综合 | 日本一区二区更新不卡 | 国产内射爽爽大片视频社区在线 | aⅴ在线视频男人的天堂 | 日韩人妻无码一区二区三区久久99 | 久久 国产 尿 小便 嘘嘘 | 亚洲欧美精品aaaaaa片 | 国产在线aaa片一区二区99 | 99久久99久久免费精品蜜桃 | 亚洲中文字幕乱码av波多ji | 国产在线无码精品电影网 | 亚洲成色www久久网站 | 99精品视频在线观看免费 | 久久午夜无码鲁丝片午夜精品 | 97夜夜澡人人爽人人喊中国片 | 亚洲精品午夜国产va久久成人 | 97精品人妻一区二区三区香蕉 | 无遮挡国产高潮视频免费观看 | 色偷偷人人澡人人爽人人模 | 亚洲日韩精品欧美一区二区 | 亚洲小说春色综合另类 | 久久zyz资源站无码中文动漫 | 六月丁香婷婷色狠狠久久 | 日韩少妇内射免费播放 | 精品 日韩 国产 欧美 视频 | www成人国产高清内射 | 国产亚洲人成a在线v网站 | 久久久久免费精品国产 | 亚洲另类伦春色综合小说 | 成人一在线视频日韩国产 | 2020久久香蕉国产线看观看 | 人人爽人人澡人人高潮 | 国产免费久久精品国产传媒 | 中文字幕无码日韩欧毛 | 国产色xx群视频射精 | 久久亚洲日韩精品一区二区三区 | 久青草影院在线观看国产 | 日韩成人一区二区三区在线观看 | 丰满肥臀大屁股熟妇激情视频 | 国产无套内射久久久国产 | 精品国产一区二区三区四区在线看 | 一区二区传媒有限公司 | 无码中文字幕色专区 | 国产深夜福利视频在线 | 亚洲国产精品美女久久久久 | 我要看www免费看插插视频 | 国产精品久久久久无码av色戒 | 色综合久久中文娱乐网 | 超碰97人人做人人爱少妇 | 欧美精品一区二区精品久久 | 成人无码视频在线观看网站 | 国产亚洲精品久久久久久国模美 | 欧美猛少妇色xxxxx | 亚洲成av人片在线观看无码不卡 | 嫩b人妻精品一区二区三区 | 麻豆国产人妻欲求不满 | 欧美人与牲动交xxxx | 图片小说视频一区二区 | 国产午夜亚洲精品不卡下载 | 亚洲国产av精品一区二区蜜芽 | 蜜桃视频韩日免费播放 | 99精品视频在线观看免费 | 午夜福利试看120秒体验区 | 中文无码精品a∨在线观看不卡 | 欧美日本精品一区二区三区 | 狠狠躁日日躁夜夜躁2020 | 丰满少妇熟乱xxxxx视频 | 激情综合激情五月俺也去 | 久久人人爽人人爽人人片ⅴ | 亚洲国产av精品一区二区蜜芽 | 国产特级毛片aaaaaa高潮流水 | 欧美熟妇另类久久久久久不卡 | 亚洲精品鲁一鲁一区二区三区 | 免费无码一区二区三区蜜桃大 | 无码乱肉视频免费大全合集 | 国产欧美亚洲精品a | 漂亮人妻洗澡被公强 日日躁 | 人人超人人超碰超国产 | 国产99久久精品一区二区 | 亚洲精品国产品国语在线观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 久久精品人人做人人综合试看 | 99精品无人区乱码1区2区3区 | 帮老师解开蕾丝奶罩吸乳网站 | www成人国产高清内射 | 国产亚洲日韩欧美另类第八页 | 荡女精品导航 | 国产亲子乱弄免费视频 | 激情内射亚州一区二区三区爱妻 | 澳门永久av免费网站 | 国产精品无码mv在线观看 | 天堂久久天堂av色综合 | 国产av久久久久精东av | 亚洲日韩乱码中文无码蜜桃臀网站 | 午夜性刺激在线视频免费 | 欧美日韩一区二区综合 | 男女性色大片免费网站 | 国产精品丝袜黑色高跟鞋 | 在线欧美精品一区二区三区 | 真人与拘做受免费视频一 | 中文字幕中文有码在线 | 玩弄少妇高潮ⅹxxxyw | 动漫av网站免费观看 | 亚洲日韩av一区二区三区四区 | 久久久成人毛片无码 | 天堂а√在线地址中文在线 | 成人无码精品一区二区三区 | 中文字幕无码日韩专区 | 亚洲区欧美区综合区自拍区 | 久久综合狠狠综合久久综合88 | 亚洲综合另类小说色区 | 精品一二三区久久aaa片 | 天海翼激烈高潮到腰振不止 | 久久精品国产精品国产精品污 | 色欲综合久久中文字幕网 | 熟女俱乐部五十路六十路av | 最近免费中文字幕中文高清百度 | 欧美兽交xxxx×视频 | 欧美一区二区三区视频在线观看 | v一区无码内射国产 | 国产亚洲美女精品久久久2020 | 无码av最新清无码专区吞精 | 国产精华av午夜在线观看 | 国产人妻久久精品二区三区老狼 | 麻豆精产国品 | 蜜桃臀无码内射一区二区三区 | 狠狠亚洲超碰狼人久久 | 久久久久免费看成人影片 | 成人一区二区免费视频 | 天天拍夜夜添久久精品 | 少妇人妻偷人精品无码视频 | 中文字幕久久久久人妻 | 荫蒂被男人添的好舒服爽免费视频 | 日韩精品无码一区二区中文字幕 | 一区二区三区乱码在线 | 欧洲 | 国产三级久久久精品麻豆三级 | 国产高清av在线播放 | 欧美一区二区三区视频在线观看 | 天下第一社区视频www日本 | 99久久人妻精品免费二区 | 国产精品亚洲专区无码不卡 | 精品乱码久久久久久久 | 国产无av码在线观看 | 国产国产精品人在线视 | 成在人线av无码免费 | 国产精品怡红院永久免费 | 中文精品久久久久人妻不卡 | 熟女俱乐部五十路六十路av | 激情综合激情五月俺也去 | 国产区女主播在线观看 | 无码精品人妻一区二区三区av | 妺妺窝人体色www在线小说 | 国产精品无码永久免费888 | 久久精品中文字幕一区 | 免费无码的av片在线观看 | 亚洲中文字幕va福利 | 欧美老妇交乱视频在线观看 | 欧美性猛交xxxx富婆 | 中文字幕av无码一区二区三区电影 | 大乳丰满人妻中文字幕日本 | 国产成人精品必看 | 曰韩无码二三区中文字幕 | 高潮毛片无遮挡高清免费视频 | 性生交大片免费看女人按摩摩 | 一本久久a久久精品vr综合 | 熟女少妇在线视频播放 | 乌克兰少妇xxxx做受 | 福利一区二区三区视频在线观看 | 好屌草这里只有精品 | 九九在线中文字幕无码 | 国产精品丝袜黑色高跟鞋 | 亚洲熟妇色xxxxx欧美老妇 | 免费国产黄网站在线观看 | 成人欧美一区二区三区黑人 | 精品国产一区二区三区四区 | 精品偷拍一区二区三区在线看 | 国产尤物精品视频 | 在线观看免费人成视频 | 天下第一社区视频www日本 | 老子影院午夜精品无码 | 国产成人精品视频ⅴa片软件竹菊 | 97夜夜澡人人爽人人喊中国片 | 中文字幕无码热在线视频 | 人妻少妇精品无码专区动漫 | 少妇的肉体aa片免费 | 亚洲日韩av一区二区三区中文 | 国产精品亚洲综合色区韩国 | 性啪啪chinese东北女人 | 日日摸天天摸爽爽狠狠97 | 男人的天堂2018无码 | 成人无码精品一区二区三区 | 亚洲成av人片在线观看无码不卡 | 国产亚洲精品久久久闺蜜 | 无套内射视频囯产 | 东京热一精品无码av | 国产绳艺sm调教室论坛 | www一区二区www免费 | 国产精品人人妻人人爽 | 亚洲精品一区国产 | 欧美人与动性行为视频 | www国产亚洲精品久久网站 | 欧美 丝袜 自拍 制服 另类 | 国产国产精品人在线视 | 久久亚洲中文字幕无码 | 久久99久久99精品中文字幕 | 伦伦影院午夜理论片 | а天堂中文在线官网 | 日韩精品无码一本二本三本色 | 熟女少妇人妻中文字幕 | 成人aaa片一区国产精品 | 久久久精品国产sm最大网站 | 久久99热只有频精品8 | 精品乱子伦一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕无码日韩专区 | 精品夜夜澡人妻无码av蜜桃 | 精品国产福利一区二区 | 国产口爆吞精在线视频 | 国产精品高潮呻吟av久久 | 中国女人内谢69xxxx | 一本精品99久久精品77 | 未满成年国产在线观看 | 国内少妇偷人精品视频 | 欧美第一黄网免费网站 | 小鲜肉自慰网站xnxx | 性色欲情网站iwww九文堂 | 欧美日本免费一区二区三区 | 樱花草在线播放免费中文 | 日本一卡2卡3卡四卡精品网站 | 无遮挡国产高潮视频免费观看 | 在线欧美精品一区二区三区 | 亚洲欧美综合区丁香五月小说 | 国产精品18久久久久久麻辣 | 免费中文字幕日韩欧美 | 欧美乱妇无乱码大黄a片 | 性做久久久久久久久 | 无码一区二区三区在线观看 | 桃花色综合影院 | 欧美人与善在线com | а√天堂www在线天堂小说 | 麻豆果冻传媒2021精品传媒一区下载 | 国产三级久久久精品麻豆三级 | 国产精品对白交换视频 | 无码播放一区二区三区 | 欧美丰满少妇xxxx性 | 国产成人无码午夜视频在线观看 | 成熟女人特级毛片www免费 | 88国产精品欧美一区二区三区 | 人妻aⅴ无码一区二区三区 | 成人精品一区二区三区中文字幕 | 久久这里只有精品视频9 | 亚洲欧美国产精品久久 | 永久黄网站色视频免费直播 | 男女爱爱好爽视频免费看 | 欧美日韩人成综合在线播放 | 久久国产精品_国产精品 | 色综合天天综合狠狠爱 | 中文字幕无码日韩专区 | 日日麻批免费40分钟无码 | 久久97精品久久久久久久不卡 | 熟女俱乐部五十路六十路av | 国产熟女一区二区三区四区五区 | 狠狠cao日日穞夜夜穞av | 国产性生交xxxxx无码 | 99re在线播放 | 免费播放一区二区三区 | 丰满人妻被黑人猛烈进入 | 狠狠亚洲超碰狼人久久 | 亚洲国产一区二区三区在线观看 | 欧美日韩视频无码一区二区三 | 强辱丰满人妻hd中文字幕 | 88国产精品欧美一区二区三区 | 熟妇人妻无乱码中文字幕 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产黄在线观看免费观看不卡 | 精品久久久久久亚洲精品 | 蜜桃视频插满18在线观看 | 荫蒂添的好舒服视频囗交 | 狠狠色色综合网站 | 少妇性俱乐部纵欲狂欢电影 | 国产成人无码专区 | 国产成人无码一二三区视频 | 鲁大师影院在线观看 | 国产一区二区不卡老阿姨 | 天干天干啦夜天干天2017 | 亚洲综合精品香蕉久久网 | 亚洲人成网站免费播放 | 欧美丰满老熟妇xxxxx性 | 午夜精品久久久久久久 | 国产成人无码区免费内射一片色欲 | 国产 精品 自在自线 | 综合激情五月综合激情五月激情1 | 欧美人与物videos另类 | 亚洲中文字幕在线无码一区二区 | 亚洲中文字幕在线观看 | 精品国产一区二区三区av 性色 | 国产一区二区三区日韩精品 | 久久无码人妻影院 | 久久99精品久久久久久动态图 | 亚洲中文字幕在线观看 | 熟妇人妻中文av无码 |