第三部php
# ls -lhi (i: inode,每一個文件前的數字表明文件身份ID;h: human 人類可讀)html
顯示:25091 -rw-r--r-- 1 root root 81 4月 15 00:33 oldboy.txtjava
第1列:inode=>index node 索引節點編號。node
第2列:文件類型及權限(共10個字符,第一個字符爲類型,後9個字符爲文件權限)。python
第3列:硬連接個數( 詳細參看ln命令的講解)。硬連接是文件的又一個入口。mysql
第4列:文件或目錄所屬的用戶(屬主)。linux
第5列: 文件或目錄所屬的組。ios
第6列:文件或目錄的大小。nginx
第七、八、9列:文件或目錄的修改時間。面試
第10列:實際的文件名或目錄名。
第2列:2-10個字符 rw-r--r--. 文件權限(r: read ; w: write x: 執行; -: 無) 第11個字符是一個點符號,與SELinux相關。
第四列:文件對應的屬主或者用戶。
第五列:文件對應的屬組或用戶主。
inode概述:硬盤要分區,而後格式化,建立文件系統。
Innode,中文意思是索引節點(index node)。在每一個Linux存儲設備或存儲設備的分區(存儲設備能夠是硬盤、軟盤、U盤.......)被格式化爲EXT4文件系統後,通常都有兩部分:第一部分是Inode(不少個),第二部分是Block(不少個)。Block是用來存儲實際數據用的,例如:照片、視頻等普通文件數據。而inode就是用來存儲這些數據屬性信息的(也就是ls -l的結果),inode包含的屬性信息包括文件大小、屬主、歸屬的用戶主、讀寫權限、文件類型、修改時間,還包含指向文件實體的指針的功能(inode節點 --block的對應關係)等。可是,inode裏惟獨不包含文件名。
查看inode大小的命令:
# dumpe2fs /dev/sda3(1) | grep -i "inode size"
顯示:Inode size: 256字節
查看:inode各個分區總量(使用多少,空閒多少,使用百分比) # df -i
查看block總量(硬盤使用狀況) # df -h
有關inode的小結:
a. 磁盤分區格式化爲ext4文件系統後會生成必定數量的inode和block 。
b. inode是索引節點,做用是存放文件的屬性信息以及做爲文件的索引(指向文件的屍體block)
c. ext3/ext4文件系統的block存放的是文件的實際內容。
d. inode是一塊存儲空間,Centos6非啓動分區inode默認大小256字節,Centos5是128字節。
e. inode是一串數字,不一樣的文件對應的inode(一串數字)在文件系統裏是惟一的。
f. inode號相同的文件,互爲硬連接文件(文件的又一個入口)
g. 一個額外你見被建立後至少要佔用一個inode和一個 block.
h. block的大小通常有1k,2k,4k幾種。其中引導分區等爲1k,其餘普通分區爲4k(Centos6) (查看命令 # dumpe2fs /dev/sda/ | grep -i "block size" )
i. 若是一個文件很大,可能佔多個block(4k).
j. 若是文件很小,至少佔一個block,而且剩餘空間浪費了。
k. inode大小和總量查看
# dumpe2fs /dev/sda3 |egrep -i "block size | inode size" ; # dumpe2fs /dev/sda3 | egrep -i "block count | inode count "
l. 查看inode的總量和使用量命令 df -i
m. 如何生成及指定inode大小 # mkfs . ext4 -b 2048 -I 256 /dev/sdb
有關Block的知識總結:
a. 硬盤讀取數據是按Block爲單位讀取的。
b. 一個文件可能佔用多個block,每讀取一個block就會消耗一次硬盤I/O 。
c. 若是要提高磁盤I/O性能,那麼就要儘量一次性讀取數據儘可能的多。
d. 一個block只能存放一個文件的內容,不管內容有多少。若是block 4k,那存放1k的文件,剩餘3k 就浪費了。
e. Block並不是越大越好。Block太大對於小文件存放就會浪費磁盤空間。例如:1000K的文件,BLOCK爲4K,佔用250個BLOCK,BLOCK爲1k,佔1000個BLOCK。 訪問效率誰更高?消耗I/O分別爲250次和1000次。
f. 大文件(大於16k)通常設置Block大一點,小文件(小於1K)通常設置BLOCK 小一點。
g. BLOCK太大例如4K,文件都是0.1k,大量浪費磁盤空間。
h. Block太大例如1K,文件都是1000K,消耗磁盤I/O。
i. 恩健較大時,block 設置大一些會提高磁盤訪問效率。
j. ext3/ext4文件通常設置爲4K.
k. Block的設置也是格式化分區時候,mkfs ext4 -b 2048 -l 2048 -l 256 /dev/sdb
見視頻畫圖說明block佔用空間的理解
企業面試題1:一個100M(100000K)的磁盤分區,分別寫入1K的文件或寫入1M的文件,分別能夠寫多少個?
解答知識點:
a. 上面的考試題考察的是文件系統inode和block的知識。
b. inode是存放文件屬性信息的(也包含指向文件實體的指針),默認大小128 byte (C58),256 byte (C 64)
c. Block是存放文件實際內容的,默認大小1K(boot)或4K(非系統分區默認給4K),通常企業多用4K的block。
d. 一個文件至少要佔用一個inode及一個block。
e. 默認較大分區常規企業真是場景狀況下,inode數量是足夠的,而block數量消耗的會更快。
正確答案:
a. 默認分區常規狀況下,對大文件來說inode是足夠的。而block數量消耗的會更快,block爲4k的狀況,1M的文件不會有磁盤浪費狀況,因此 文件數量大概爲100/1=100個。
b. 對於小文件0.1K,inode會消耗的更快。默認分區的時候block數量是大於inode數量的。
每一個小文件都會佔用一個inode和一個block。因此最終文件的數量:inode會先消耗完,文件總量是inode的數量。
企業面試題2:若是想磁盤寫入數據提示以下錯誤:No space left on device,經過df -h 查看磁盤空間,發現沒滿,請問可能緣由是什麼?
解答:多是inode數量被消耗盡了。
a. df -i 查看是否耗盡了inode 數量。
b. 企業工做中郵件臨時隊列/var/spool/clientmquene這裏很容易被大量小文件沾滿致使No space left on device的錯誤。clientmquene目錄只有安裝了sendmail,纔會有。centos5.8默認就會裝
sendmail ,centos6.6 默認沒有sendmail。
a. windows裏是經過擴展名(.txt)來區分文件類型的。oldboy.txt
b. linux裏文件擴展名和文件類型沒有關係。
c. 爲了容易區分和兼容用戶使用windows的習慣,咱們也會用擴展名文件類型。oldboy.sh ,oldboy.tar.gz
在Linux系統中,能夠說一切皆文件。文件類型包含有普通文件,目錄文件,塊設備文件,符號連接文件等等。
Linux文件類型分爲如下幾種(帶*號的必需要掌握):
**b: block(buffered) special 設備文件
c: character (unbuffered) special 字符文件
*****d: directory 目錄文件
p: named pipe (FIFO) 管道文件
*****f : regular file (-) 普通文件
***l : symbolic link ; soft link 連接文件
s : socket 套接字文件
# mkmod oldboy c 5 1 建立oldboy爲字符設備文件
文件類型小結:
Linux系統裏常見的文件擴展名以下:
運維開發緣由呢:shell/python/php三者之一,至少會一個,最好會兩個。
在Linux系統中,連接可分爲兩種:一種爲硬連接(Hard Link),另外一種爲軟連接或符號連接(symbolic link or soft link)。咱們在前面講解過ln這個命令就是建立連接文件的,在默認不帶參數的狀況下,執行ln命令建立的連接是硬連接。
若是使用ln -s建立連接則爲軟連接。
實踐直觀演示理解。
硬連接:ln 源文件 目標文件
軟連接:ln -s 源文件 目標文件(目標文件不能事先存在) -s (soft)
硬連接是指經過索引節點(inode)來進行連接。在Linux(ext2,ext3,ext4)文件系統中,保存在磁盤分區中的文件無論是什麼類型都會給它分配一個編號,這個編號被稱爲硬連接。提示:硬連接文件就至關於文件的另一個入口。硬連接的做用之一是容許一個文件擁有多個有效路徑名(多個入口),這樣用戶就能夠創建硬連接到重要的文件,以防止"誤刪" 原數據。
在Linux系統中,刪除靜態文件(沒有進程調用)(目錄也是文件)的條件是與之相關的全部硬連接文件均被刪除。
硬連接的建立:
直接執行命令"ln 源文件 硬連接文件"便可完成建立硬連接。
硬連接知識小結:
建立硬連接命令:
文件刪除控制的變量。
i_link文件的硬連接數量。
i_count引用計數(有一個陳格許使用i_count+1)
文件刪除的條件:i_link=0 and i_count=0
企業案例:若是向磁盤寫入數據提示以下錯誤:No space left on device,經過df -h 查看磁盤空間,發現沒滿,請問可能緣由是什麼?
解答:多是 inode數量被消耗盡了。
Centos5.8默認就會裝sendmail,centos6.6默認沒有sendmail。
*保留視頻實踐知識。(多看)未了解 *****
# df -h 磁盤分區信息命令
# du -sh /(*) 查看根(/)分區目錄文件的大小
企業案例:文件刪除生產場景案例解決實戰
WEB服務器磁盤滿故障深刻解析 (http://oldboy.blog.51cto.com/2561410/612351) 多看本視頻,未了解 (*****)
23. linux系統目錄的硬連接知識介紹
以點(.)開頭的文件表明隱藏文件
# ls -a 顯示隱藏文件 ls -al 顯示全部隱藏文件
#每一個目錄與目錄下的點(當前目錄)互爲硬連接文件。因此目錄有2個入口
若是一個目錄含有8個硬連接數。說明該目錄下含有一個當前目錄(.)和7個目錄文件裏上一級目錄(..)。
軟連接(soft link)也稱爲符號連接(symbolic link),Linux裏的軟連接文件就相似於windows系統中的快捷方式。Linux裏的軟連接文件其實是一個特殊的文件,文件類型是I 。軟連接文件實際上能夠
理解爲一個文本文件,這個文件中包含有軟連接指向另外一源文件的位置信息內容。所以,經過訪問這個「快捷方式」就能夠迅速定位到軟連接所指向的源文件實體。
建立軟連接命令: # ln -s oldboyfile oldboyfile_soft_link
執行命令 "ln -s 源文件 軟連接文件「 ,便可完成建立軟連接。
誤區:建立軟連接源文件是須要存在的,要建立的軟連接文件是不能存在的,是要用ln命令建立的。
軟連接知識總結:
看視頻實踐
有關文件的連接小結:
經過以上的測試,咱們能夠獲得如下幾個結論:
有關目錄連接小結:
企業面試題:描述Linux下軟連接和硬連接的區別
解答:在Linux系統中,連接分兩種:一種被稱爲硬連接;另外一種被稱爲符號連接或軟連接。
a. 編譯軟件時指定版本號(/application/apache2.2.23),訪問時但願去掉版本號(/application/apache),能夠設置軟連接到編譯的路徑。全部程序都訪問軟連接文件(/application/apache),當軟件升級高版 本後,只需刪除連接文件重建到高版本路徑的軟連接便可(/application/apache)。
b. 企業代碼發佈時(php程序),須要把全部代碼傳到一個新發布的臨時目錄或者新的站點目錄。發佈時要麼一個mv,也能夠重建軟連接指向到這個新的臨時目錄揮着新的站點。
c. 不方便目錄移動,使用ln -s 。
解答1:硬連接數2個,查看方法爲:ls -ld /oldboy/etc
這是由於: a. 建立的目錄自己爲一個硬連接。
b. 新目錄ett下的隱藏目錄(點號)爲建立的新目錄的又一個硬連接 ,也算一個連接數。所以,硬連接數是2。
解答2:硬連接數3個。
經過上面的題,咱們發現ett目錄的inode節點數字編號,和ett目錄下的(.)點目錄。 inode編號是同樣的,而ett目錄下的(..) 兩個點和ett的上級目錄oldboy的inode數字編號是同樣的。
用戶的角色是經過UID和GID識別的。
UID: User Identify 用戶ID,至關於各位的身份證,在系統中是惟一 的。
GID: Group Identify 組ID,至關於各位的家庭或者大家的學校。
用戶分爲三類:
a. 超級用戶:root ( uid = 0 , gid = 0 , uid = 0 的用戶就是超級用戶) # vi /etc/passwd (修改passwd文件,可更改uid,gid)
b. 虛擬用戶: 它存在Linux中,知足文件或程序運行的須要而建立的。不能登錄,不能使用,是傀儡。 uid-->gid (1-->499)
c. 普通用戶:管理員root建立的用戶,uid-->gid (500-->65535)
虛擬用戶Linux安全優化:1. 安裝系統後能夠刪除用不到的虛擬用戶,但最好不刪而是註釋掉,萬一回覆過來。
2. 咱們本身部署服務的時候,也會建立虛擬用戶,知足服務的需求:例如:apache, nginx, mysql, nfs, rsync, nagios, zabbix, redis
用戶和用戶組的對應關係有:一對一,一對多,多對一和多對多。
一對一:即一個用戶能夠存在一個組中,也能夠是組中的惟一成員。如 root 。
一對多:即一個用戶能夠存在於多個用戶組中。
多對一:多個用戶能夠存在於一個組中,這些用戶具備和組相同的權限。
多對多: 多個用戶能夠存在多個組中。而且幾個用戶能夠歸屬相同的組。
Linux系統下的帳戶文件主要有/etc/passwd , /etc/shadow , /etc/group , /etc/gshadow文件
帳號名稱 帳號密碼 帳號UID 帳號組GID 用戶說明 用戶家目錄 shell解釋器
root :x :0 :0 :root :/root :/bin/bash
2. shadow文件中一行的各個字段詳細說明
字段名稱 註釋說明
帳號名稱 用戶的帳號名稱
帳號密碼 用戶密碼,這是加密的口令
最近更改密碼的時間 從1970年1月1日起,到用戶最近一次更改口令的天數
禁止修改密碼的天數 從1970年1月1日起,到用戶能夠更改密碼的天數
用戶必須更改口令的天數 從1970年月1日起,到用戶必須更改密碼的天數
警告更改密碼的天數 在用戶密碼過時前多少天提醒用戶更改密碼
不活動時間 在用戶密碼過時以後到禁用帳戶的天數
失效時間 從1970年1月1日起,到用戶被禁用的天數(useradd -f)
標誌 保留
3. group文件中一行的各個字段詳細說明
字段名稱 註釋說明
用戶組名 該組的名稱
用戶組密碼 一般不須要設置該密碼,因爲安全緣由,該密碼被記錄在/etc/gshadow中,所以,顯示爲"X"。這相似/etc/shadow
GID 就是用戶組的ID
用戶組成員 加入這個組的全部用戶帳號
4. gshadow文件中一行的各個字段詳細說明
用戶組名 註釋說明
用戶組密碼 用戶組密碼,這個段能夠是空的或!,若是是空的或有!。表示沒有密碼
用戶組管理源帳號 用戶組管理者,這個字段也可爲空,若是有多個用戶組管理者,用,號分割
用戶主成員 加入這個組的全部用戶帳號,對錶中多個用戶經過「,」 分割
# ls -l 顯示的時間是修改時間 (文件名在上一級目錄的block,刪文件是產出上一級目錄的block,block受上一級目錄的權限控制)
# ls -l --time -style = long - iso (顯示友好的長格式時間爲:2018-03-23)
# stat /etc/hosts (顯示文件的時間)(顯示文件或文件系統的狀態)
什麼是正則表達式?
簡單的說,正則表達式就是爲助理大量的字符串而定義的一套規則和方法。
例如:假設「@」表明oldboy,「!」表明oldgirl。 echo "@!"==" oldboyoldgirl "
經過定義的這些特殊符號的輔助,系統管理員就能夠快速過濾,替換或輸出須要的字符串。
Linux正則表達式通常以行爲爲單位處理的。
Linux正則表達式只針對命令三劍客 (grep , egrep , awk, sed)
在企業工做中,咱們天天作的Linux運維工做中,時刻都會面對大量帶有字符串的文本配置、程序。命令輸出及日誌文件等。而咱們常常會有迫切的須要,從大量的字符串內容中查找符合工做須要的
特定的字符串。這就要靠正則表達式。所以,能夠說正則表達式就是爲過濾這樣字符串的需求而生的!
例如:ifconfig的輸出取IP 。 例如:cat /var/log/message輸出等。
容易混淆的兩個注意事項:
a. 正則表達式應用很是普遍,存在於各類語言中。例如:php, python,java等。可是,咱們今天將的是Linux系統運維工做中的正則表達式。即Linux正則表達式,最常應用正則表達式的命令就是
grep (egrep),sed,awk換句話說Linux三劍客要想能工做的更高效,那必定離不開正則表達式配合的。
b. 正則表達式和咱們經常使用的通配符特殊字符是有本質區別的。
例子: ls *.log這裏的*就是通配符(表示全部),正則表達式的*表示。重複前面的一個字符的0次或屢次。
注意事項:
a. linux正則通常以行爲單位匹配處理。
b. alias grep = 'grep --color = auto',講課是以grep爲例(能夠看到匹配顏色)
c. 注意字符集: (export LC_ALL=C)
咱們要想玩好三劍客,首先就要掌握正則表達式 (找大量例子練習),Linux里正則表達式,主要是awk,sed,grep(egrep)三劍客的正則表達式。
實戰準備:
2. 注意字符集可能帶來的問題: # export LC_ALL = C
基礎正則表達式
a. ^word 搜索以word開頭的。 vi ^一行的開頭
b. word$ 搜索以word結尾的。 vi $一行的開頭
c. ^$ 表示空行,能理解麼?
例: # grep "^m" a.txt (過濾以m開頭的整行)
# grep "m$" a.txt (過濾以m結尾的整行)
# grep -v "^$" a.txt (過濾(去掉)空行所剩下的內容)
d. . 點表明且只能表明任意一個字符。
e. \ 例\.就表明點自己,轉義符號,讓有着特殊身份意義的字符脫掉馬甲,還原原型。
f. * 例0*重複0個或多個前面的一個字符。
g. .* 匹配全部字符。延伸^.*以任意多個字符開頭。*¥ 以任意多個字符結尾。
例: # grep "." a.txt (匹配全部內容,空行除外)
# grep ".*" a.txt (匹配全部內容,包括空行)
# grep "raymo.d" raymond.txt (匹配raymo.d,點號表明任一字符)
# grep "\.$" raymond.txt (匹配以點(.)結尾的行的內容)
# grep "0* " raymond.txt (匹配以0開頭的相同的字符串)
h. [abc] 匹配字符集合內的任意一個字符[a-z A-Z],[0-9]
i. [^abc] 匹配不包含^後的任意字符的內容,中括號例^爲取反,注意和...開頭區別。
j. a\{n,m\}重複n到m次,前一個重複的字符。若是用egrep/sed -r 能夠去掉斜線。
\{n,\}重複至少n次,前一個重複的字符。若是用egrep/sed -r 能夠去掉斜線。
注意:egrep或sed -r 過濾通常特殊字符能夠不轉義。
grep通常經常使用參數:
-a: 在二進制文件中,以文本文件的方式搜索數據。
-c: 計算找到 ‘搜索字符串’ 的次數。
-o: 反顯示出匹配regxp的內容(用於統計出如今文中的次數)
-i : 忽略大小寫的不一樣,因此大小寫視爲相同 *****
-n: 在行首顯示行號 *****
-v: 反向選擇,即顯示沒有‘搜索字符串’ 內容的那一行 *****
-E: 擴展的grep,即egrep *****
--color=auto : 以特定顏色高亮顯示匹配關鍵字 ***
提示: -i , -v爲經常使用參數
-A: After的意思,顯示匹配字符串及其後幾行的數據。
-B: Before的意思,顯示匹配字符串及其前幾行的數據。
-C: 顯示匹配字符串及其先後各num 行。
例:#ifconfig eth0 (取命令所打印出來的IP地址)
解答:1. #ifconfig eth0 | sed -n 'ip' | sed -r ' s# .*addr:##g ' | sed ' s#Bc.*$##g '
2. # ifconfig eth0 | sed -n 'ip' | sed ' s#^.*dr: ##g ' | sed ' s#B.*$##g '
以44節例題爲例 (取命令ifconfig eth0 打印內容中的IP字符串)
解答:a. # ifconfig eth0 | sed -n 'ip' | sed -r ' s#^.*dr:(.*) Bc.*$#\1#g '
b. # ifconfig eth0 | sed -nr ' 2s#^.*dr:(.*) Bc.*¥#、1#gP '