1 . Linux 中的文件
1.1 文件屬性概述
在linux裡面一切皆文件!!
Linux 系統中的文件或目錄的屬性主要包括:索引節點(inode)、文件類型、權限屬性、鏈接數、所歸屬的用戶和用戶組、最近修改時間等內容:
下面我們看一下執行ls- lhi的結果:
[root@oldboy oldboy]# ls -lhi (-h 以人可讀的檔案大小方式呈現) total 28K 394661 drwxr-xr-x. 3 root root 4.0K Jul 10 12:49 ext 394667 -rw-r--r--. 1 root root 0 Jul 10 12:50 jeacen 402495 -rw-r--r--. 1 root root 64 Jul 12 01:07 nginx,conf 402494 -rw-r--r--. 1 root root 64 Jul 12 01:07 nginx.conf 394669 -rw-r--r--. 1 root root 0 Jul 10 12:50 oldboy 390309 drwxr-xr-x. 2 root root 4.0K Jul 10 12:49 test
文字解釋:
第一列: 文件索引節點號 (就像我們的身分證)--->唯一
系統讀取文件時,首先透過文件名找到inode,然後才能讀取到文件的內容。
第二列: 文件類型及權限(共11個字符,第一個字符為類型,後面9個字符為文件權限(三個一組),.沒什麼意思(和selinux相關的東西))
第三列: 硬鏈接個數(詳細參看ln命令) ---->(比喻:同一個文件,有幾個不同的訪問入口,有個備份的作用)
第四列: 文件或目錄所屬的用戶(擁有者)
Linux裡面文件和程序的存在必須要有用戶和組 滿足相應的存在需求
第五列: 文件或目錄所屬的組(不是擁有者的組)
第六列: 文件大小
第七、第八、第九 列: 文件或目錄的修改時間(默認:月/日/時分)
第十列: 實際的文件名或目錄名 (文件名嚴格來說不算文件的屬性)
2. 索引節點inode
2.1 inode概述
硬盤要存儲數據(房子住人),首先硬盤要分區(隔斷)),然後格式化創建文件系統(裝修),最後存放數據(住人)
inode,中文意思是索引節點(index node)。每個Linux存儲設備或存儲設備的分區(存儲設備可以是硬盤、軟盤、U盤...)
被格式化為ext4(CentOS6.7)文件系統後,一般都會有兩個部分:第一部分是inode(很多個)、第二個是Block(很多個)
Block是用來存儲實際數據用的,例如:照片,視頻 等普通文件數據。
而inode就是用來存儲這些數據屬性信息的(也就是ls -l的結果),inode屬性信息包括不限於大小、屬主(用戶)、歸屬的用戶組、文件的權限、讀寫權限
、文件類型、修改時間,還包含指向文件實體的指針的功能(inode節點--block的對應關係) 等 ..但inode裡面唯獨不包含文件名(因為文件名嚴格來說不算屬性)。
inode除了紀錄文件屬性的信息外,還會為每個文件進行信息索引,所以就有了inode的數值。操作系統根據指令,即可通過inode的值
最快的找到相對應的文件實體。
打個比方,比如ㄧ本書,存儲設備或分區就相當於這本書,Block相當於書中的每一頁內容,而inode就相當於
這本書前面的目錄,ㄧ本書有很多內容,ㄧ個知識點可能有多頁,如果想查找某部分或某知識點的內容,我們ㄧ般先查找書的目錄,透過目錄能更快的找捯
我們想要看的知識點的內容。雖然不太洽當,但還是比較形象。
當我們用ls查看某個目錄或文件時,如果加上-i參數,就可以看到inode節點了;比如我們前面的例子:
[root@oldboy oldboy]# chmod 755 oldboy [root@oldboy oldboy]# ls -li oldboy (stat 加文件 也可以) 394669 -rwxr-xr-x. 1 root root 0 Jul 10 12:50 oldboy [root@oldboy oldboy]# stat oldboy (查看文件的詳細屬性) File: `oldboy‘ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 803h/2051dInode: 394669 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2017-07-10 12:50:50.761475726 +0800 Modify: 2017-07-10 12:50:50.761475726 +0800 Change: 2017-07-15 08:24:32.358902745 +0800
第一列inode值是394669 ; 查看ㄧ個文件或目錄的inode,透過ls命令的-i參數即可。
因為inode要存放文件的屬性信息,所以每個inode本身是有大小的,Centos5 inode 的默認大小是128字節,而Centos6 inode 的默認大小是256字節,
inode 的大小在分區被格式化創建文件之後定下來的,格式化以後就無法更改了,格式化以前可以透過參數指定inode大小,但是ㄧ般企業工作環境沒這個需求。
查看一下inode大小:
[root@oldboy oldboy]# dumpe2fs /dev/sda1 | grep -i "inode size" (-i不區分大小寫) dumpe2fs 1.41.12 (17-May-2010) Inode size: 128
查看文件系統inode總量以及剩餘量
[root@oldboy oldboy]# df -i (inode也會滿ㄛXD) Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 593344 55456 537888 10% / tmpfs 125514 1 125513 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot
查看磁盤的使用量
[root@oldboy oldboy]# df -h(如果說磁盤滿了,有兩種:inode滿了、block滿了) Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 7.0G 17% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 190M 35M 146M 19% /boot
磁盤空間是否滿了,是由兩項參數決定: (1)inode是否滿了(2)block是否滿了 ,任何ㄧ項滿了,都沒辦法放資料了 磁盤滿的特徵:(No space left on device)
有關inode的小節:(學會給階段性的知識做小結是學號Linux的好習慣)
1) 磁盤被分區並格式化為ext4文件系統後會生成ㄧ定數量的inode跟block。
2) inode稱為索引點,作用是存放文件的屬性信息以及作為文件的索引(指向文件的實體)。
3) ext3/ext4 文件系統的block存放的是文件的實際內容。
4) inode是磁盤上的一塊存儲空間,Centos 6非啟動分區inode默認大小256字節,Centos5是128字節。
5) inode的表現形式是一串數字,不同的文件對應的inode(ㄧ串數字)在文件系統裡是唯一的。
6) inode節點號相同的文件,互為硬鏈接文件,可以認為同一個文件的不同入口。
7) ext3/ext4文件系統下,ㄧ個文件被創建後至少要占用一個inode跟ㄧ個block。
8) ext3/ext4文件系統下,正常情況下ㄧ個文件占用且只能占用一個inode (例子:人跟身分證) ---->硬鏈接不算
9) block是用來存儲實際數據的,每個block的大小一般有1k,2k,4k幾種。其中引導分區等為1k,其他普通分區為4k(Centos 6)。
10) 如果ㄧ個文件很大(高清的大片4G),可能占多個block,如果文件很小(0.01k),至少占一個,並且這個block的剩餘空間浪費了,即無法在存儲其他數據了。
11) inode大小和總量查看
[root@oldboy oldboy]# dumpe2fs /dev/sda3|egrep -i "block size|inode size" dumpe2fs 1.41.12 (17-May-2010) Block size: 4096 Inode size: 256 [root@oldboy oldboy]# dumpe2fs /dev/sda1|egrep -i "block count|inode count" dumpe2fs 1.41.12 (17-May-2010) Inode count: 51200 --->inode數量 Block count: 204800--->block數量 Reserved block count: 10240 ai4bp4
默認block countㄧ般會大於 inode count
12)查看inode的總量看使用量命令
[root@oldboy oldboy]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 593344 55456 537888 10% / tmpfs 125514 1 125513 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot
13) 查看文件的inode
ls -li 或 stat 文件
14) 如何生成及指定inode大小
格式化命令:
mkfs.ext4 -b 2048 -i 256 /dev/sdb
有關Block的知識小結:
1) 磁盤讀取數據是按Block為單位讀取的。
2) ㄧ個文件可能占用多個block。但是每讀取一個block就會消耗ㄧ次磁盤I/O
3) 如果要提升磁盤I/O性能,那麼就要盡可能ㄧ次性讀取數據盡量的多
4) ㄧ個block只能存放一個文件的內容,無論內容有多小。如果block 4K大小,那存放1K的文件,剩餘3K不能存放別的文件,只能浪費了。
5) Block並非越大越好。Block太大對於小文件存放就會浪費磁盤空間,例如:1000k的文件,Block為4K,占用250的Block
如果Block為1k,則需要1000個Block。訪問效率誰更高?消耗I/O分別為250次和1000次 (所以要需要以存放的檔案來決定如何設置block)
6) 根據業務需求,確定默認的block的大小,如果是大文件(大於16k)ㄧ般設置Block大一點,小文件(小於1K)ㄧ般設置Block小一點
7) Block太大例如4K,文件都是0.1K的話,就大量浪費磁盤空間了,但是訪問性能高
8) Block太小例如1K,文件都是1000K,消耗磁盤I/O
9) Block的大小設置也是格式化分區確定的,命令:mkfs.ext4 -b 2048 -I 256 /dev/sdb
10)企業裡文件都會比較大時(ㄧ般會大於4K),block設置大ㄧ些會提升磁盤訪問效率。
11)ext3/ext4文件系統(Centos 5 和 6 )ㄧ般設置為4K
當前的生產環境ㄧ般設置為4K。特殊的業務,如視頻可以加大block大小。
總小結:
1) 磁盤分區格式化文件系統後,會分為inode跟block兩部分內容
2) inode存放文件的屬性以及指向文件實體的指針,文件名不在inode裡,ㄧ般上級目錄的block
3) 訪問文件,透過文件名-->inode-->block
4) inode ㄧ般情況默認大小256B,block大小 1, 2, 4 K ,默認4K,注意,引導分區等特殊分區除外
5) 透過df -i 查看inode的數量及使用情況,dumpe2fs /dev/sda3查看inode及block的大小及數量
6) ㄧ個文件至少要占用ㄧ個inode及ㄧ個block,多個文件可以占用同一個inode(硬鏈接),相同文件
7) ㄧ個block只能被ㄧ個文件使用,如果文件很小block很大,剩餘空間浪費,無法繼續被其他文件使用
8) block不是越大越好,要根據業務的文件大小進行選擇,ㄧ般Centos 6 就是默認4K
企業面試題:
ㄧ個100M(100000k)的磁盤分區,分別寫入1K的文件或寫入1M的文件,分別可以寫多少個?
錯誤解答:很容易計算1k的個數:100*1000=100000個,1M文件的個數:100/1=100個
假設Block 4K 寫入1K文件的數量 基本上就是block的數量
假設inode數量夠多的時候,就是BLOCK的數量,浪費3/4的容量。
假設inode數量小於block的數量,就是inode的數量,浪費3/4的容量。
假設Block 4K,寫入1M的文件
總block數量/250block =存放1M的數量
假設Block 4K 磁盤空間多大,基本上就可以寫入100/1M數量,ㄧ般情況inode和block都是足夠的。
下面知識點:(回答這個)
a. 上面的考試題考察的是文件系統的inode和block的知識
b. inode是存放文件屬性信息的(也包含指向文件實體的指針),默認大小128byte (C58),256byte(C64)
c. Block是存放文件實際內容的,默認大小1K(boot)或4K(非系統分區默認給4K),ㄧ般企業多用4K的block
d. ㄧ個文件至少要占用一個inode及ㄧ個block
e. 默認較大分區常規企業真實場景情況下,inode的數量足夠的。而block數量消耗的會更快。
企業案例:
如果向磁盤寫入數據提示如下的錯誤:No space left on device ,透過df -h 查看磁盤空間,
發現沒滿,請問可能原因是什麼? 企業場景什麼情況下會導致這個問題發生?
解答:可能是inode的數量被消耗盡了
企業工作中郵件臨時隊列/var/spool/clientmquene 這裡很容易被大量小文件占滿導致No space left on device 的錯誤。clientmquene目錄只有安裝了snedmail服務才會有,
是sendmail郵件的臨時隊列。Centos 5.8默認就會裝sendmail , centos 6.6默認沒有sendmail,但是有postfix
這個錯誤是inode和block兩者之ㄧ滿導致的
3. 文件類型
在linux系統中,可以說ㄧ切設備(包括目錄、普通文件、設備文件)皆為文件。文件類型包含有普通文件、目錄、字符設備文件
、塊設備文件、符號鏈接文件、管道文件等等...
當執行ls -l 或 ls -al 的時候:
[root@oldboy oldboy]# ls -la total 36 drwxr-xr-x. 7 root root 4096 Jul 12 01:14 . dr-xr-x---. 3 root root 4096 Jul 14 08:57 .. drwxr-xr-x. 3 root root 4096 Jul 10 12:49 ext -rw-r--r--. 1 root root 0 Jul 10 12:50 jeacen -rw-r--r--. 1 root root 64 Jul 12 01:07 nginx,conf -rw-r--r--. 1 root root 64 Jul 12 01:07 nginx.conf -rwxr-xr-x. 1 root root 0 Jul 10 12:50 oldboy
在ls -la 裡面的第一列中:(注意d,-,l,b,其中d - 特別重要)
d(directory) 表示這是一個目錄(目錄是一個特殊文件)
-(regular file) 表示這是一個普通文件
l(link) 表示這是ㄧ個符號鏈接文件,實際上它指向另一個文件
b(block) 表示這是塊設備和其他的外圍設備,是特殊類型的文件
c(character) 表示字符設備文件
s(socket) 表示socket文件
p(named pipe)表示管道文件
find 也可以查找文件類型:
File is of type c: b block (buffered) special d directory f regular file l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype.
3.1 普通文件 第一個屬性為"-",按照文件內容,又大約可以區分:
1) 純文本文件(ascll) :文件內容可以直接讀取到數據,例如:字母、數字、特殊符號等..可以用cat命令讀文件,比如配置文件幾乎都是這種類型的
2) 二進制文件(binary):linux中的命令程序就是屬於這種格式。例如cat 命令就是ㄧ個二進制文件
3) 數據格式文件(data):有些程序在運行的過程中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件。例如:linux在用戶登錄時,都會將登錄的數據紀錄
在/var/log/wtmp(last命令的數據文件)那個文件內,該文件是一個數據文件。透過last命令讀出來。cat命令會讀出亂碼。因為他屬於一種特殊格式的文件。lastlog(/var/log/lastlog)
3.2 目錄文件
下面是執行ls -F 的結果,在寫腳本的時候可以直接區別目錄和文件,注意,每一個目錄後面都會多 ㄧ個/斜線
[root@oldboy oldboy]# ls -F ext/ nginx,conf oldboy* wodi.gz xiaofan/ yingsui.gz jeacen nginx.conf test/ xiaodong/ xingfujie/
在生產場景中,我們ㄧ般會透過下列的方式來過濾出所有的目錄文件
ls -F | grep "/$" ----> $表示以....為結尾。
ls -l | grep "^d" ----> ^表示以....為開頭
3.3 字符設備或塊設備文件:(很少用,知道就好)
[root@oldboy oldboy]# ll -al /dev/tty crw-rw-rw-. 1 root tty 5, 0 Jul 16 22:59 /dev/tty (第一個字符是c,這表示字符設備文件。字符設備就是串行端口的接口設備)
[root@oldboy oldboy]# ll -al /dev/sda brw-rw----. 1 root disk 8, 0 Jul 16 22:59 /dev/sda (第一個字符是b,這表示塊設備,塊設備就是存儲數據供系統及程序訪問的接口設備。如硬盤、光驅 等 都屬於塊設備)
3.4 鏈接文件
[root@oldboy oldboy]# find /etc/ -type l -name "init.d" | xargs ls -ld lrwxrwxrwx. 1 root root 11 Jun 24 18:01 /etc/init.d -> rc.d/init.d [root@oldboy oldboy]# ls -l /etc/rc.d/init.d /etc/init.d -d lrwxrwxrwx. 1 root root 11 Jun 24 18:01 /etc/init.d -> rc.d/init.d drwxr-xr-x. 2 root root 4096 Jun 24 18:09 /etc/rc.d/init.d
3.5 文件檔案擴展名
.tar .tar.gz .tgz .zip .tar.bz 表示壓縮文件,創建命令ㄧ般為tar,gzip,unzip等
.sh 表示shell腳本文件,透過shell語言開發的程序
.pl 表示perl語言文件,透過perl語言開發的程序
.py 表示python語言文件,透過python語言開發的程序
.html .htm .php .jsp .do 表示網頁語言的文件
.conf 表示系統的配置文件
.rpm 表示rpm安裝包文件
4. 文件的權限
4.1 文件的權限概述
Linux中的文件或目錄的權限和用戶及用戶組關連很大,要理解這個部分內容,需要先了解一下Linux
系統中用戶管理方面的知識。在我們的課程中已經詳細講解過這個部分內容,具體用戶管理文檔細節請參考
<<老男孩linux實戰運維培訓中心-Linux帳號及帳號組管理>>ㄧ文。
Linux中每個文件或目錄都有ㄧ組共9個基礎權限位,每三位字符被分為ㄧ組,他們分別是屬主權限位(占三個字符),
用戶組權限位(占三個字符),其他用戶權限位(占三個字符)。比如rwxr-xr-x ,在Linux中正是這9個權限
(更多權限位後面會提到)位來控制文件屬主、用戶組以及其他用戶的權限。
r read 讀 4
w write 寫 2
x 執行 1
- 沒有權限 0
實例磁盤空間滿了,但inode沒滿:
[root@oldboy logs]# cp /bin/ls /app/logs/ --->複製一個大文件進去 cp: writing `/app/logs/ls‘: No space left on device ----->怎麼不能複製呢? [root@oldboy logs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 6.9G 18% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 190M 35M 146M 19% /boot /dev/sdc 73K 71K 0 100% /app/logs ---->磁盤滿了!! [root@oldboy logs]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 593344 55895 537449 10% / tmpfs 125514 1 125513 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot /dev/sdc 16 13 3 82% /app/logs ----->可是inode沒有滿
實例inode滿了,但磁盤空間沒滿:
那我們再把ls 刪除
[root@oldboy logs]# rm -f ls [root@oldboy logs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 6.9G 18% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 190M 35M 146M 19% /boot /dev/sdc 73K 15K 54K 22% /app/logs ----->沒滿了XD
可是..我們模擬ㄧ下創建多個小文件
[root@oldboy logs]# touch stu{1..10} touch: cannot touch `stu5‘: No space left on device touch: cannot touch `stu6‘: No space left on device touch: cannot touch `stu7‘: No space left on device touch: cannot touch `stu8‘: No space left on device touch: cannot touch `stu9‘: No space left on device touch: cannot touch `stu10‘: No space left on device----->已經報錯,不能創建...因為..
我們來查看ㄧ下:
[root@oldboy logs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 6.9G 18% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 190M 35M 146M 19% /boot /dev/sdc 73K 15K 54K 22% /app/logs ---->沒有滿 [root@oldboy logs]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 593344 55895 537449 10% / tmpfs 125514 1 125513 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot /dev/sdc 16 16 0 100% /app/logs ----->原來是inode滿拉
ls -lhi
7 8 9 三列式時間(默認是修改時間)
modify修改 -mtime(對應find的時間參數) ㄧ般是修改文件內容的時候改變
change 改變時間 -ctime(對應find的時間參數) 文件的屬性改變
access訪問時間 -atime(對應find的時間參數) 訪問文件內容的時候
格式化顯示時間屬性
--time-style=long-iso 可以設置年月日的時間
[root@oldboy ~]# ls -l --time-style=long-iso /oldboy/ total 12 -rw-r--r--. 1 root root 8 2017-07-11 23:14 122.log drwxr-xr-x. 3 root root 4096 2017-07-19 01:08 ett -rw-r--r--. 1 root root 0 2017-07-17 23:33 file drwxr-xr-x. 2 root root 4096 2017-07-01 16:19 test
查看文件的時間屬性:
[root@oldboy ~]# stat /oldboy/ File: `/oldboy/‘ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 803h/2051dInode: 390151 Links: 4 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2017-07-19 01:05:02.489031775 +0800 Modify: 2017-07-19 01:04:34.699381726 +0800 Change: 2017-07-19 01:04:34.699381726 +0800
第10列 文件名 不在文件的inode裡,而是在上級目錄的block裡。
本文出自 “我的Linux之夢” 博客,请务必保留此出处http://12098022.blog.51cto.com/12088022/1950057
原文地址:http://12098022.blog.51cto.com/12088022/1950057