Linux內核架構與底層--讀書筆記

linux中管道符「|」的做用node

 

命令格式:命令A|命令B,即命令1的正確輸出做爲命令B的操做對象(下圖應用別人的圖片)linux

 

 

1. 例如: ps aux | grep "test"  在 ps aux中的結果中查找test。shell

2. 例如:   find . -name "*.txt" | xargs grep "good" -n --color=auto   把find的結果當成參數傳入到grep中,即在那些文件內部查找good關鍵字。編程

注:本例中xargs將find產生的長串文件列表拆散成多個子串,windows

        如「」find /path -type f -print0 | xargs -0 rm數組

             xargs將 find產生的長串文件列表 拆散成多個子串,而後對每一個子串調用 rm  
     xargs 可能就會誤判了,若是須要處理特殊字符,須要使用-0參數進行處理。
    選項解釋
    -0 :當sdtin含有特殊字元時候,將其當成通常字符,想/'空格等

2.1 Linux的文件系統緩存

Linux將全部的事物都當作文件,這一點人盡皆知。我想說的是,除了傳統的ext文件系統,Linux在抽象不一樣的資源的時候其實有各類不一樣的文件系統,都是從需求和使用出發,怎麼方便怎麼來,好比proc文件系統就是針對進程的抽象,使得修改對應進程的值就能夠直接改變進程的行爲。再好比,對於遠程ssh登陸的pts設備,Linux有對應的devpts文件系統。安全

2.2 Linux的權限管理bash

Linux的-rwxrwxrwx權限管理也可謂人盡皆知,其實Linux本身也意識到了這樣的權限管理所帶來的一些侷限性。首先rwx的權限管理是基於用戶和組的,而且只是大體的分爲owner|group|other這三類,沒法再做更加細粒度的劃分。有鑑於此,Linux目前默認是有ACL(Access Control List)管理的,所謂ACL就是可以提供更加細粒度的用戶和組管理,好比能夠明確哪一個user能夠有什麼樣的權限。以下示例網絡

?
1
2
3
4
5
6
7
8
9
getfacl abc
# file: abc
# owner: someone
# group: someone
user::rw-
user:johny:r-x
group::r--
mask::r-x
other::r--

而SELinux提供了不基於用戶與組的權限管理,SELinux是基於應用程序的,什麼樣的應用程序可使用什麼資源,對於這些資源這個應用程序能幹嗎,這個就是SELinux的管理方式。

2.3 Linux上的Service

Linux上的Service組織得很是清晰,固然也是傳統所致。/etc/init.d/裏面包含了全部的Service啓動腳本,對應的二進制文件在/usr/bin 、 /usr/sbin 、 /usr/local/bin等目錄下,通常而言配置文件在/etc/app_name下,還有一個chkconfig的工具來管理各個runlevel下須要啓動的Service。這樣的約定俗成使得管理員在配置和使用的時候很是方便。Linux標準的Service都會將log記錄到/var/log/messages中,使得系統管理員不須要翻閱各類log,直接在/var/log/messages中就能夠找到絕大部分的log來判斷當前系統是否正常。更甚的,syslogd被rsyslogd替換之後,能夠將/var/log/messages中的內容經過UDP發送到遠端用專業的log分析工具進行分析。咱們須要學習Linux上Service的這些優秀的編程習慣和技巧。

3 磁盤

根據$1中的需求,主要是建立Linux下的LVM,以及一些基本的磁盤操做。

  • df -lah 查看磁盤的使用狀況
  • fdisk -l 查看插入到磁盤驅動器中的硬盤; sd(a,b,c)(1,2,3),其中a是第一塊磁盤,b是第二塊磁盤,1,2,3表示磁盤上的主分區,最多4個。用fdisk從磁盤建立分區而且格式化。
  • LVM(logical volume manager),主要就是知足加硬盤就能直接寫數據的功能,而不會出現磁盤滿了,而後掛了。lvm有幾個概念,VG, PV, LVM,將磁盤lvm格式化,建立PV, 建立VG,將建立的PV加入VG,而後在VG中建立lvm,而後就能夠動態增長大小了。注意,將磁盤格式化爲lvm,可是lv的格式化須要用ext,而後才能mount上去。參考這篇文章CentOS 6 卷組掛載硬盤教程
  • mount -t type(ext4|nfs) /dev/sdxn /path/dir 來掛載。若是要重啓生效,必須將掛載信息寫入到/etc/fstab
  • 磁盤IO效率(IOPS)須要用vmstat, top等工具來查看。

4 網絡

網絡的坑不少,須要把網絡搞通沒個3,4年很難。下面從網絡的基本配置文件着手,簡單理一下網絡方面的內容。網絡最難的方面應該是如何搭建一個合理的高效的局域網或者城域網,這個須要有專業的網絡知識。

4.1 配置文件

/etc/hosts私有IP對應主機名
/etc/resolv.confnameserver DNS的IP
/etc/sysconfig/network其中NETWORKING=要不要有網絡,HOSTNAME=主機名,NETWORKING_IPV6=支持ipv6否
/etc/sysconfig/network-scripts/ifcfg-xxx其中DEVICE=網卡代號,BOOTPROTO=是否使用dhcp,HWADDR,IPADDR,NETMASK,ONBOOT,GATEWAY
4.2 網絡設計到的一些命令

router -n查看路由的命令,特別是要看帶G的,表示gateway,而帶U的表示up。
netstat -anp查看全部啓動的tcp,udp,unix stream的應用程序,以及他們的狀態,具體能夠參考TCP/IP,JavaSocket簡單分析一文。
5 安全

5.1 PAM

PAM整體來說只須要簡單瞭解就行,是一個可插拔的認證模塊。按照個人說法,是開發Linux的極客們搞出來的可複用的一個組件。舉個例子,如今有一個app,想要驗證當前的登陸用戶是否有權限操做某個目錄,那麼在PAM裏面有現成的模塊,app只須要include這個模塊,給出一個配置文件,就能夠了。有一個很是好的關於PAM的視頻教程,請看這裏

  • PAM是應用程序用來進行身份驗證的。早期的身份驗證和應用程序自己耦合,後來把身份驗證單獨抽出來,經過PAM來進行管理
  • /etc/pam.d/xxx 是能用pam來進行管理的應用程序PAM設置,在安裝應用程序的時候安裝。/etc/security/mmm, /lib/security/pam_mmm是一套。
  • 整體來講PAM是利用Linux系統自己提供的機制,來進行驗證

5.2 SELinux

關於SELinux也有一個很是好的視頻教程,請看這裏

  • getenforce來查看SELinux是否被啓用
  • /etc/sysconfig/selinux enforcing啓用SELinux
  • SELinux對「運行程序」配置和檢查其是否有權限操做「對象」(文件系統),而普通的ACL(rwx)就是根據文件所屬owner及其組來判斷。SELinux是看bin的type和目錄文件的type是否兼容,來決定bin是否能操做資源

5.3 防火牆

對於iptables也是隻知其一;不知其二,因此下面只是學習時候的一些摘錄。特別一點,要開啓內核參數net.ipv4.ip_forward=1,在/etc/sysctl.conf文件中,用sysctl -p來保存。所謂ip_forward指的是內核提供的從一個iface到另一個iface的IP包轉發,好比將IP包從192.168.1.10的eth0轉發到10.0.0.123的eth1上。專業的防火牆配置是須要專業技能的。

tcp_wrapper須要libwrap.so的支持,全部凡是ldd出來沒有的bin,都不能用tcp_wrapper
iptables是按照規則進行短路判斷的,即 知足條件1->執行action1->結束
iptables-save來更加清晰的查看
先刪掉所有規則,而後添加,比較簡單。添加的時候,先添加策略,再添加細部規則。通常來說,咱們須要關注的是filter這個表的INPUT與OUTPUT
iptables -A(I) INPUT(OUTPUT,FORWARD) -i(o) iface -p tcp(ump,imp,all) -s (!)source -d dest -j ACCEPT(REJECT,DROP), 還支持的參數 —dport —sport
6 工具

一個好的Linux命令參考網站

6.1 CPU

  • top 特別注意load
  • ps aux和ps -ef 特別注意進程狀態
  • vmstat 1表示每秒採集一次
  • sar -u 1 查看全部cpu相關的運行時間

6.2 Memory

  • free
  • vmstat 1 注意其中的swap ram block之間的關係
  • sar -r 1 內存使用率
  • sar -W 1 查看swap,查詢是否因爲內存不足產生大量內存交換

6.3 IO

  • lsof -i:port 查詢哪一個進程佔用了這個端口號
  • lsof -u username 用戶打開的文件
  • lsof -p pid 進程打開的文件
一、內核架構
常見架構範式:
  • Linux內核上下層通訊方式
  • 橫向系統和縱向系統
橫向系統如cgroup,proc,sys文件系統,系統調用的組織,調試系統,Core Dump,信號,內存管理等;
縱向系統是指具體的功能模塊,如USB功能,一個對USB文件的操做要走完內核中的不少個層次,即文件系統層、緩存層、通用塊層、SCSI層、USB層等。Linux通常將這些層次劃分爲3個大的層次,接口層、功能邏輯層和驅動層。
二、模塊支持
  • 模塊是Linux支持動態功能擴展的最主要機制。
  • 模塊能夠在編程時指定其能夠接受的參數,這個參數是給用戶用的。在模塊加載以後,用戶空間經過"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}"就能夠動態修改模塊參數。
  • 模塊機制存在的意義就是能夠動態的加載和卸載。
  • 模塊簽名,每一個模塊在編譯時都會從內核目錄中得到版本號寫入編譯的模塊,運行中的內核在插入新的模塊時會檢測簽名是否一致,若不一致就不會加載。可使用modinfo查看模塊簽名信息。模塊簽名的內容有兩部分:版本號、哈希簽名
  • 模塊編程可以使用的內核組件:workqueue,Linux下的工做隊列,能夠將工做推後執行,對其進行睡眠、調度,系統有默認的workqueue內核線程,但也支持用戶本身定義workqueue;中斷系統和tasklet,中斷親合度能夠用於應用運維工做中幫助鎖定應用性能。
三、特殊軟件機制
  • UIO,容許用戶端直接訪問設備細節,是一個在用戶端實現內核驅動的機制。
  • VFIO,是軟件對硬件設備內存暴露在用戶空間的支持,是對UIO的升級。用戶能夠經過直接操做硬件的內存空間來操做硬件。
  • SysRq,相似於windows的Ctrl+Alt+Del組合鍵的效果,只要系統不是徹底被鎖死的狀態,就會優先響應這個命令。
在Linux中能夠控制SysRq的關閉和打開,使用echo "1" > /proc/sys/kernel/sysrq打開該機制。
在Linux中調用該系列命令的方式是「SysRq+命令」,SysRq在大部分鍵盤上通常是Print Screen按鍵的副功能,須要使用Alt鍵調用。
SysRq+b:當即重啓系統
SysRq+c:產生一個系統級的crash dump
SysRq+d:顯示當前使用中的全部鎖
SysRq+e:發送SIGTERM給除init以外的所有進程
除以上以外還有十幾個相似命令
  • 其餘機制,PADATA,namespace
四、內核數據結構之鏈表與哈希表
  • 鏈表,具備彈性不動屬性,能夠把離散時間到達的數據結構串起來,使其能夠更容易地被索引,而且不須要移動以前的內容。
  • 內核哈希表,是由鏈表羣組成的,其每個哈希桶都是一個鏈表。
  • 雙向鏈表,其數據域通常包括prev、next與data,很容易作成一個環。
  • hlist,擁有隻有一個指針大小的頭部的雙向鏈表(只使用一個頭部,解決哈希桶的空間利用率問題)。
  • ScatterList,在DMA支持分離的多塊內存同時的傳輸下所產生的一種軟件結構,其表示的是多塊分離的塊內存。Linux容許對ScatterList進行拼接或合併。
  • llist,一種不須要加鎖的list,這是內核出於提升處理效率而採用的一種無鎖操做所使用的數據結構。
 
五、其它數據結構
  • B+樹,Linux內核中實現了一個通用的B+樹,主要用於文件系統中,固然也有一些文件系統是本身實現的相似的B+樹。
  • radix tree樹,內核中使用該數據結構將指針與long整數鍵值進行關聯,例如IDR機制,而且具備很高的搜索效率。
  • 位數組bitmap,是以位爲單位存儲值的方式,大部分文件系統都用到了這一技術。如ext中使用inode位圖和數據塊位圖,用來表示對應序號的inode或者數據塊有沒有被使用。在raid系統中,如raid1的數據一致性保障,會經過檢查這樣的一份位圖,以發現兩份數據的不一致問題。
  • FIFO,命名管道,是內核提供給用戶空間的一個很是好用的工具,至關於一個跨進程的隊列,提供了原生的陰塞和配合文件能力的工具。相似的能力也可使用消息隊列或UNIX domain socket來實現。FIFO文件還有一個特性,它是一個文件,即便沒人在讀取,也能夠往文件裏寫內容。
  • FIFO文件在交互式shell中是很是有效的一種調試工具,使用mkfifo命令創建fifo文件。在阻塞模式下,一方保持cat該文件,若是沒有數據就會一直阻塞在那裏;如有一方使用了echo等向其寫入了數據,cat就會當即執行讀取數據。
  • 在Linux中,FIFO管道並無專門的數據結構,而是經過將兩個file結構指向同一個臨時的VFS索引節點inode,而這個VFS索引節點又是指向一個物理頁面而實現的。在寫入FIFO文件的時候最好不要使用文件的緩存功能,要一次性地完整寫入。
  • FIFO的使用並不容易,對於一個嚴肅的FIFO應用場景來講,須要知足如下使用條件:
跨進程傳輸數據
數據的產生和數據的監聽不一樣步
數據只要被讀取了就會被刪除,第二次就不會被再次讀取
須要等待超時、永久阻塞、當即返回其中的某些或所有特性
須要運維繫統查看數據流
沒有任何辦法提早判斷要讀的阻塞式的FIFO內是否有數據

常見知識點總結

1.date -s 日期設置

[root@localhost ppp]# date -s 2015-7-5

2015年 07月 05日 星期日 00:00:00 CST

2.date -d 時間的設置

[root@localhost ppp]# date -d 3:45:45

2015年 07月 05日 星期日 03:45:45 CST

3.hwclcok -s 硬件時鐘同步系統時鐘

 

[root@localhost ppp]# date

2015年 07月 05日 星期日 00:03:28 CST

[root@localhost ppp]# hwclock -s

[root@localhost ppp]# date

2016年 03月 28日 星期一 03:07:49 CST

4.hwclock - w 系統時鐘同步硬件時鐘

 

[root@localhost ppp]# hwclock -w

[root@localhost ppp]# date

2015年 04月 05日 星期日 00:00:24 CST

5.bash中的引用:

'':強引用

"":弱引用

``:命令引用

6.通配符練習

 

(1) 顯示/etc目錄下,以非字母開頭,後面跟了一個字母及其它任意長度任意字符的文件或目錄; 

 [root@localhost /]# ls -d /etc/ [^[:alpha:]][a-z]*

ls: 沒法訪問[^[:alpha:]][a-z]*: 沒有那個文件或目錄

/etc/

(2)複製/etc目錄下,全部以n開頭,以非數字結尾的文件或目錄至/tmp/etc目錄下;

[root@localhost /]# mkdir /tmp/etc

[root@localhost /]# cp -r /etc/n*[^0-9] /tmp/etc

[root@localhost /]# ls -ld /tmp/etc

drwxr-xr-x. 3 root root 4096 4月   5 00:54 /tmp/etc

(3)顯示/usr/share/man目錄下,全部以man開頭,後跟一個數字結尾的文件或目錄

[root@localhost etc]# ls -ld /usr/share/man/man[0-9]

drwxr-xr-x. 2 root root  69632 3月  28 2016 /usr/share/man/man1

drwxr-xr-x. 2 root root  20480 3月  28 2016 /usr/share/man/man2

drwxr-xr-x. 2 root root 495616 3月  28 2016 /usr/share/man/man3

drwxr-xr-x. 2 root root   4096 3月  28 2016 /usr/share/man/man4

drwxr-xr-x. 2 root root  20480 3月  28 2016 /usr/share/man/man5

drwxr-xr-x. 2 root root   4096 3月  28 2016 /usr/share/man/man6

drwxr-xr-x. 2 root root  12288 3月  28 2016 /usr/share/man/man7

drwxr-xr-x. 2 root root  36864 3月  28 2016 /usr/share/man/man8

drwxr-xr-x. 2 root root   4096 9月  23 2011 /usr/share/man/man9

(4)複製/etc目錄下,全部以p,m,r開頭的,且以.conf結尾的文件或目錄至/tmp/conf.d目錄下;

[root@localhost etc]# mkdir /tmp/conf.d

[root@localhost etc]# cp -r /etc/[pmr]*.conf /tmp/conf.d

[root@localhost etc]# ls -ld /tmp/conf.d

drwxr-xr-x. 2 root root 4096 4月   5 01:02 /tmp/conf.d

7.程序的數據流有三個:

輸入數據流: <--,標準輸入(stdin),鍵盤;  stdin=0

輸出數據流:-->,標準輸出(stdout), 顯示器; stdin=1

錯誤數據流:-->,錯誤輸出(stderr),顯示器;  stdin=2

8.輸出重定向知識點:

 

COMMAND >  /PATH/TO/SOMEFILE

覆蓋重定向:覆蓋目標文件中的原有內容; 

例如:touch liwenming

      cat /etc/fstab > liwenming 

COMMAND >> /PATH/TO/SOMEFILE

追加劇定向:追加新產生的內容至目標文件尾部;

      cat /etc/fstab >> liwenming 

9.管道知識點總結練習:

(1)把/etc/passwd文件最後三行信息中全部小寫字符改成大寫後輸出;

 

[root@localhost /]# tail -n 3 /etc/passwd | tr "a-z" "A-Z"

SSHD:X:74:74:PRIVILEGE-SEPARATED SSH:/VAR/EMPTY/SSHD:/SBIN/NOLOGIN

TCPDUMP:X:72:72::/:/SBIN/NOLOGIN

LWM:X:500:500:LWM:/HOME/LWM:/BIN/BASH


(2)取出/etc/fstab的第6行;

 

[root@localhost /]# head /etc/fstab | tail -1

NI HOA MA 

(3)取出/etc目錄下全部以p開頭的文件或目錄,只顯示前5個;

 

[root@localhost /]# ls -d /etc/p* | head -n 5

/etc/pam.d

/etc/pango

/etc/passwd

/etc/passwd-

/etc/pbm2ppa.conf

(4)tee命令,指的是雙向輸出,輸出屏幕而後保存到文件中一份。

[root@localhost /]# echo lilili | tee li

lilili

(5)爲用戶提供默認配置的配置文件

/etc/login.defs, /etc/default/useradd


(6)把用戶添加到組中,把用戶移除組中

[root@localhost /]# useradd ming

[root@localhost /]# gpasswd -a ming li

Adding user ming to group li

[root@localhost /]# gpasswd -d ming li

Removing user ming from group li

(7)建立用戶gentoo,UID爲5000,基於組爲gentoo,附加組爲distro和peguin;

 

root@localhost /]# gpasswd -a gentoo distor 

gpasswd: group 'distor' does not exist in /etc/group

[root@localhost /]# gpasswd -a gentoo peguin

Adding user gentoo to group peguin

[root@localhost /]# gpasswd -a gentoo distor

gpasswd: group 'distor' does not exist in /etc/group

[root@localhost /]# gpasswd -a gentoo distro

Adding user gentoo to group distro

[root@localhost /]# 

 

(8)建立用戶fedora,基於註釋信息爲"Fedora Core",默認shell爲/bin/tcsh

 useradd -s /bin/tcsh fedora -c "Fedora Core"

 查看結果  cat /etc/passwd

[root@localhost etc]#useradd gentoo

 

[root@localhost etc]# useradd -g gentoo -G distro peguin

[root@localhost etc]# cat /etc/group

distro:x:1006:gentoo,peguin

(9)邏輯運算知識點總結

 

邏輯運算:

運算數:true, false

COMMAND:

0: TRUE

1-255: FALSE

 

與:

 

true && true = true

true && false = false

第一個操做數爲true,其結果將取決於第二個操做數;

false && true = false

false && false = false

第一個操做數爲False,其結果至此可判定,爲false;

 

或:

true || true = true

true || false = true

第一個操做數爲true,其結果至此可判定,爲true;

false || true = true

false || false = false

第一個操做數爲false,其結果將取決於第二個操做數;

 

非:

! true = false

! false = true 

(10)特殊變量:

$0:腳本文件路徑自己;

$#;腳本參數的個數;

$*:全部參數

$@:全部參數 

(10)

內核編譯過程:

步驟:

~]# tar  xf  linux-3.10.67.tar.xz  -C  /usr/src  將其內核源碼壓縮包進行解壓,而後指明解壓到的目錄。

~]# cd  /usr/src 而後進入這個目錄

~]# ln  -s  linux-3.10.67  linux   將其解壓的文件作一個連接,連接到linux

~]# cd  linux  進入linux目錄

~]# make menuconfig        進行配置內核選項

~]# make  [-j #] 編譯內核,可以使用-j指定編譯線程數量,例如:make -j 4

~]# make modules_install 安裝內核模塊

~]# make install                進行內核的安裝

相關文章
相關標籤/搜索