學習筆記:Linux 文件和目錄屬性及權限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了學習筆記:Linux 文件和目錄屬性及權限相关的知识,希望对你有一定的参考价值。

1 . Linux 中的文件


1.1 文件屬性概述

在linux裡面一切皆文件!!

Linux 系統中的文件或目錄的屬性主要包括:索引節點(inode)、文件類型、權限屬性、鏈接數、所歸屬的用戶和用戶組、最近修改時間等內容:

下面我們看一下執行ls- lhi的結果:

[[email protected] 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節點了;比如我們前面的例子:

[[email protected] oldboy]# chmod 755 oldboy 
[[email protected] oldboy]# ls -li oldboy (stat 加文件  也可以)
394669 -rwxr-xr-x. 1 root root 0 Jul 10 12:50 oldboy
[[email protected] 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大小:

[[email protected] oldboy]# dumpe2fs /dev/sda1 | grep -i "inode size"    (-i不區分大小寫)
dumpe2fs 1.41.12 (17-May-2010)
Inode size:          128

查看文件系統inode總量以及剩餘量

[[email protected] 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

查看磁盤的使用量

[[email protected] 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大小和總量查看

[[email protected] oldboy]# dumpe2fs /dev/sda3|egrep -i "block size|inode size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096
Inode size:          256
[[email protected] 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的總量看使用量命令

[[email protected] 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 的時候:

[[email protected] 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 的結果,在寫腳本的時候可以直接區別目錄和文件,注意,每一個目錄後面都會多 ㄧ個/斜線

[[email protected] 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 字符設備或塊設備文件:(很少用,知道就好)

[[email protected] oldboy]# ll -al /dev/tty
crw-rw-rw-. 1 root tty 5, 0 Jul 16 22:59 /dev/tty    (第一個字符是c,這表示字符設備文件。字符設備就是串行端口的接口設備)
[[email protected] oldboy]# ll -al /dev/sda
brw-rw----. 1 root disk 8, 0 Jul 16 22:59 /dev/sda  (第一個字符是b,這表示塊設備,塊設備就是存儲數據供系統及程序訪問的接口設備。如硬盤、光驅 等 都屬於塊設備)


3.4 鏈接文件

[[email protected] 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 
[[email protected] 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沒滿:

[[email protected] logs]# cp /bin/ls /app/logs/  --->複製一個大文件進去
cp: writing `/app/logs/ls‘: No space left on device ----->怎麼不能複製呢?
[[email protected] 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   ---->磁盤滿了!!
[[email protected] 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 刪除

[[email protected] logs]# rm -f ls
[[email protected] 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

可是..我們模擬ㄧ下創建多個小文件

[[email protected] 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----->已經報錯,不能創建...因為..

我們來查看ㄧ下:

[[email protected] 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   ---->沒有滿
[[email protected] 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    可以設置年月日的時間

[[email protected] ~]# 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

查看文件的時間屬性:

[[email protected] ~]# 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

以上是关于學習筆記:Linux 文件和目錄屬性及權限的主要内容,如果未能解决你的问题,请参考以下文章

老男孩老師課程學習筆記----第一階段Linux命令行總結

學習筆記:Linux軟硬鏈接

學習筆記:Linux常見題目解析分享

Java學習筆記(基本語法)

andorid 學習筆記

FPGA學習筆記(貳)--- 流水燈