linux中管道符“|”的作用
命令格式:命令A|命令B,即命令1的正確輸出作為命令B的操作對象(下圖應用別人的圖片)
1. 例如: ps aux | grep "test" 在 ps aux中的結果中查找test。
2. 例如: find . -name "*.txt" | xargs grep "good" -n --color=auto 把find的結果當成參數傳入到grep中,即在那些文件內部查找good關鍵字。
注:本例中xargs將find產生的長串文件列表拆散成多個子串,
如“”find /path -type f -print0 | xargs -0 rm
-0 :當sdtin含有特殊字元時候,將其當成一般字符,想/'空格等
2.1 Linux的文件系統
Linux將所有的事物都看成文件,這一點人盡皆知。我想說的是,除了傳統的ext文件系統,Linux在抽象不同的資源的時候其實有各種不同的文件系統,都是從需求和使用出發,怎么方便怎么來,比如proc文件系統就是針對進程的抽象,使得修改對應進程的值就可以直接改變進程的行為。再比如,對於遠程ssh登錄的pts設備,Linux有對應的devpts文件系統。
2.2 Linux的權限管理
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 進行內核的安裝