1. 程式人生 > >Linux文件屬性詳解

Linux文件屬性詳解

實例 配置 err 特定 修改權限 director 滿了 rect 文本文

文件屬性(ls -lhi查看到的信息)

技術分享圖片

1.1 第一列:inode號

1.1.1 什麽是inode

文件存儲在硬盤上,硬盤的最小存儲單位叫做"扇區"(sector)。每個"扇區"的大小為512字節(byte),
,操作系統讀取硬盤的時候,不會一個個扇區的讀取,這樣效率太慢。他是一次性讀取多個扇區,即一次性讀取一個"Block塊"。一個Block有8個連續的扇區(sector)組成。
數據都存在Block塊裏面,但是我們怎麽知道一個數據存放在哪些Block塊裏面呢?這個時候就必須需要一個索引,引導我們去找到哪些存放在BLOCK塊裏面的額數據。這存放索引的地方我們稱為索引節點(Inode),索引節點裏面包括了:文件的類型,屬主,屬組,權限,和時間戳一些信息,但是不包括文件名,

1.1.2 inode包含的內容
技術分享圖片

1:文件的類型
2:文件的權限,屬主、屬組、其他人的權限(r:讀;w:寫;o:其他人)
3:文件的硬連接數
4:屬主
5:屬組
6:文件的大小,對於目錄而言:只是目錄本身的大小,而不是裏面內容的大小
7:默認是文件的修改時間
[root@oldboy_50 ~]# stat /
  File: `/‘                 #除了這個其他的都存放在inode裏面
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 803h/2051d  Inode: 2           Links: 29
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-13 08:11:33.331896121 -0500
Modify: 2018-07-27 00:10:10.415506122 -0400
Change: 2018-07-27 00:10:10.415506122 -0400

1.1.3 inode的大小

想一下,既然他要存放內容,所以他肯定也是需要占用磁盤空間大小的。所硬盤分區在創建文件系統(格式化)的時候自動把硬盤分區分成兩個區域:

    1)Block塊,數據區:存放實際的數據
    2)Inode塊,索引區:存放inode所包含的信息(文件屬性信息)
inode節點的大小和總數,是創建文件系統的時候就給定的,後期沒辦法更改,一般是128字節(byte)或者256字節(byte)。

1.1.4 如何查看inode的數量和大小:

1.1.4.1 查看數量

    df -i   
    [root@oldboy_50 ~]# dumpe2fs   /dev/sda3 | grep -i "inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              1250928

1.1.4.2 查看inode的大小:

[root@oldboy_50 ~]# dumpe2fs /dev/sda3 | grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:           256

如果inode被占用完全,那麽對這個文件裏面寫入數據的時候會提示磁盤已滿,no space left on device

1.1.5 inode號碼

每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。Linux不考文件名來區分文件,就像Linux不靠用戶名來區分用戶。文件名只是inode號碼便於識別的綽號。
打開或編輯文件的過程:
技術分享圖片

1.1.6 目錄文件

Linux下面一切皆文件,所以列出目錄下的內容也相當於列出目錄文件裏面的內容,進入目錄,就相當於進入目錄文件裏面。
目錄文件的結構非常簡單,就是一系列目錄項(dirent)的列表,每個目錄項都有兩部分組成:
1)所包含的文件名
2)所包含的文件名和inode(索引節點號)的對應關系
修改目錄下面的文件名,實際上就是在修改目錄文件本身的block塊裏面的對應信息。所以能不能改目錄下面的文件的名稱是根據目錄的權限來的。而是不根據文件本省的的權限來的。

1.1.7 inode總結

磁盤被分區格式化為ext4文件系統後會生成一定數量的inode和block
1)inode被稱為索引點,存放文件的屬性信息及作為文件的索引(類似於C語言指針)
2)ext3/ext4文件系統的block存放的是文件的實際內容
3)inode是磁盤上的一塊存儲空間,CentOS5是128字節,CentOS6是256字節
4)inode的表現形式是一串數字,不同文件對應inode不相同
5)inode號相同的互為硬鏈接
6)ext3和ext4文件系統下,一個文件至少占用一個inode和block
7)ext3和ext4文件系統下,一個文件只能占用一個inode
改變inode大小,mkfs.ext4 –b 2048 –i 256#-b指定block大小,-i指定inode大小

1.1.8 block總結

1)用來實際存放數據的地方,如果是目錄,裏面存放下級文件的文件名稱
2)磁盤讀取數據是按照block為單位讀取的
3)一個文件至少占用一個block,未用完的浪費,可以占用多個block
4)要提升磁盤I/O性能,那就要一次性讀取數據盡量的多
5)block並非越大越好。block太大會對小文件存放浪費太多磁盤空間,太小對於大文件來說,會更大的消耗I/O。一般默認為4K(4096字節)

1.2 文件類型

-:代表普通文件
d:代表目錄
l:代表軟連接(ln –s 源文件 鏈接文件)
b:塊設備和其他外圍設備,是特殊類型的文件
普通文件“—”又分為:(用file來查看)
1) 純文本文件(ascll):文件內容可以直接督導數據
2) 二進制文件(binary):Linux中的命令程序就是這種格式
3) 數據格式文件(data):有些程序在運行的過程中會讀取某些特定格式的文件,那些特定格式的文件被稱為數據文件。
雖然Linux不按照後綴名區分文件,但是我們還是最好寫上,以方便管理。
一般這樣設置後綴名:

*.txt    文本文件
*.tar    打包文件
*.tar.bz  bzip2格式壓縮打包文件(j)
*.tar.gz  gzip格式壓縮打包文件(z)
*.py    表示python語言文件
*.sh    shell編程腳本
*.pl    表示perl文件
*.html,*.php,*.htm,*.php,*.jsp,*.do   網頁語言文件
*.conf  配置文件
*.rpm  rpm安裝包

1.3 權限:

1.3.1 普通權限

1.3.1.1 對文件的權限:

讀:r(read):可讀權限,表示具有讀取,和閱讀文件的內容
寫:w(write):寫權限,表示具有增加,刪除,修改文件內容的權限(是對於文件內容來操作的)
    1)如果沒有r權限,用vim編輯的時候會提示無法編輯,但是可以使用cat,或echo重定向追加
執行:x(execute):文件可以被系統執行
    2)如果沒有r權限,就是由執行權限,它也會提示權限不足,(想一下,你連裏面的內容都不知道是啥,怎麽去執行他呢。)
    3)刪除文件,或修改文件名是跟他的父目錄有關的,因為文件名是存放在上級目錄的block塊裏面的。

1.3.1.2 對目錄的權限

讀:r:表示是否具有瀏覽目錄下面及子目錄的權限(ls或者tree)
寫:w:具有增加、刪除和修改目錄下的文件名或目錄名的權限,但需要x權限的配合(如果沒有x權限,更改完成之後卻不能執行(保存)那修改還有什麽意義呢?)
x:表示具有進入的權限,沒有r權限能進去,沒有w選線不能修改和創建和刪除。
    1)如果沒有x權限,就不能進去到目錄裏面
    2)如果有r權限,沒有x權限,ls是可以看到目錄下面的內容的,但是不能cd進入到這個目錄內。ls -l查看這個目錄裏面內容的屬性的時候全都是???
[zsf@oldboy_50 ~]$ ll -d /tmp/123
drwxr-xrw- 2 root root 4096 Jul 27 03:05 /tmp/123
[zsf@oldboy_50 ~]$ ls -l /tmp/123/
ls: cannot access /tmp/123/1.txt: Permission denied
total 0
-????????? ? ? ? ?            ? 1.txt

1.3.1.3 文件或目錄的權限有umask決定的

···
臨時設置umask值:umask 0022
目錄默認的總權限為0777,然後實際權限為0777-umask==實際權限
文件默認的總權限為0666,然後實際權限為0666-umask(當碰到奇數的時候在奇數位加上1)==實際權限
技術分享圖片
···

1.3.3 特殊權限

1.3.3.1 SUID

set uid數字代號“4”在一個程序或命令上添加SetUid以後(u+s),這樣屬主就有了s權限,意味著任何用戶在執行此程序時,都是使用屬主的身份來執行的,passwd這個命令是最具有代表的。
1)當這個文件或目錄本身就有x權限的時候,加上s權限,在x權限位就是s
2)當這個文件或目錄本身沒有x權限的時候,加上s權限,在x權限位就是S
[root@oldboy_50 ~]# which passwd
/usr/bin/passwd
[root@oldboy_50 ~]# ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Nov 23 2015 /usr/bin/passwd
[root@oldboy_50 ~]# ll -d /etc/shadow
---------- 1 root root 945 Jul 26 23:44 /etc/shadow 普通用戶並不對這個文件有修改權限,但是他能更改密碼,他更改密碼的時候是以root用戶的身份進行的,所以他才能修改密碼

1.3.3.2 GUID

set gid數字代號“2”,在一個程序或命令上添加set gid以後(g+s),這樣屬組就有了s權限,意味著任何用戶在執行此程序時,使用的是文件的屬組。給目錄設置set Gid權限,任何用戶在該目錄下創建的文件,文件的屬組都和目錄的屬組一致。
1)當這個文件或目錄本身就有x權限的時候,加上s權限,在x權限位就是s
2)當這個文件或目錄本身沒有x權限的時候,加上s權限,在x權限位就是S

1.3.3.3 t權限

sticky數字代表1,附加在other的權限上,當設置此權限之後,每個人的文件或目錄只能有用戶自己本身來刪除。

1.3.4 文件的訪問控制列表

1.3.4.1 setfacl指令來

設置文件的訪問控制列表,我們如果想一個文件對哪一個用戶有什麽特殊權限,我們就可以使用這個命令來實現。相當於路由的acl,優先級高於其他人權限的那個優先級

1.3.4.2 -m 新增一個acl列表

setfacl -m u:user_name:perms file_name 給文件設置一個關於單個用戶的權限列表
setfacl -m d:u:user_name:perms file_name 給目錄設置一個關於單個用戶的權限列表
setfacl -m g:group_name:perms file_name 給文件設置一個關於用戶組的權限列表
setfacl -m d:g:group_name:perms file_name 給目錄設置一個關於用戶組的權限列表

1.3.5 粘滯位權限(待補充)

1.4 鏈接

1.4.1 硬鏈接

一般情況下,文件名和inode號碼是“一一對應”的關系,在同一個分區內不可能同時出現兩個inode號相同的文件,但是Linux系統中存在一個inode 號對應多個文件名。這些文件互為硬鏈接。雖然他們的文件名不一樣,但他們實際上操作的還是一個文件。
ln 源文件 鏈接後的文件
ln test.txt test.txt_ln
[root@oldboy_50 tmp]# ll -i
total 0
130937 -rw-r--r-- 2 root root 0 Jul 27 05:34 test.txt
130937 -rw-r--r-- 2 root root 0 Jul 27 05:34 test.txt_ln

1.4.1.1 總結

1)  inode號相同的,可以認為互為硬鏈接
2)  硬鏈接的創建不能跨越文件系統(跨越分區),目錄不能創建硬鏈接
3)  刪除源文件或鏈接文件,文件實例未被改變,只有刪除所有的硬鏈接文件和源文件,文件的實體才會被改變。
4)  當所有的硬鏈接和源文件被刪除,沒有進程調用後,在存放新的數據會占用這個文件的空間或者磁盤fsck檢查的時候,刪除的數據才會被回收,
5)  可以通過文件設置硬鏈接文件,來防止重要文件被誤刪除
6)  每在目錄下創建一個子目錄,他的上級目錄的硬連接數加1 
7)  目錄硬鏈接的個數減去2代表他下面有多少個目錄(減去他本身的1,和“.”)

1.4.2 軟鏈接

1.4.2.1 作用

當一個軟件的編譯路徑變了,我們還希望使用以前的路徑,這時候就需要用到軟連接,軟連接相當於一個傳送門,刪除軟連接對源文件沒影響,但刪除源文件,軟連接就失效了。

1.4.2.2 總結

1)  軟鏈接類似於windows的快捷方式(可以用readlink查看指向)
2)  軟連接類似於一個文本文件,裏面存放的是源文件的路徑,指向源文件實體
3)  刪除源文件,軟鏈接失效,一般顯示白字紅底閃爍提示
4)  軟鏈接具備不同的inode號
5)  軟鏈接和源文件屬於不同類型的文件

1.4.3 軟連接和硬鏈接的圖解

技術分享圖片
1.5 屬主,屬組,和修改時間
.```
屬主:這個文件的屬於那一個人
屬組,這個文件屬於哪一個用戶組
可通過chown修改”chown 屬主:屬組” 文件名
最後修改時間:
[root@zsf tmp]# stat 1| grep ^Modify #可查看
Modify: 2018-04-08 09:55:03.976989445 -0400
可以通過touch -m來修改
[root@zsf tmp]# touch -m 1 -d "2011-11-11"
[root@zsf tmp]# stat 1| grep ^Modify
Modify: 2011-11-11 00:00:00.000000000 -0500

## 1.6 系統創建文件提示:no space left on device磁盤空間不足
Linux系統中提示這個可能三種原因:
1)block塊被占滿
2)inode塊被占滿
3)文件全部都刪除了,還是提示空間不足,因為這些文件在被進程占用
### 1.6.1 block被占滿:
#### 1.6.1.1    模擬環境:

#虛擬出來一個100M的磁盤。
[root@oldboy_50 ~]# dd if=/dev/zero of=/tmp/test_block bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 8.69812 s, 12.1 MB/s
[root@oldboy_50 ~]# du -h /tmp/test_block
100M /tmp/test_block
#給這個分區創建文件系統
[root@oldboy_50 ~]# mkfs.ext4 /tmp/test_block
mke2fs 1.41.12 (17-May-2010)
/tmp/test_block is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
#指定掛載分區格式,掛載這個虛擬磁盤
[root@oldboy_50 ~]# mount -o loop /tmp/test_block /mnt/
[root@oldboy_50 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.0G 16G 12% /
tmpfs tmpfs 2.5G 0 2.5G 0% /dev/shm
/dev/sda1 ext4 190M 66M 115M 37% /boot
/dev/test ext4 93M 2.1M 86M 3% /app/logs
/tmp/test_block ext4 93M 1.6M 87M 2% /mnt
[root@oldboy_50 ~]# cd /mnt
#生成一個大文件,來充滿這個100M的磁盤
[root@oldboy_50 mnt]# seq 100000000 >>1.txt
[root@oldboy_50 mnt]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.0G 16G 12% /
tmpfs tmpfs 2.5G 0 2.5G 0% /dev/shm
/dev/sda1 ext4 190M 66M 115M 37% /boot
/dev/test ext4 93M 2.1M 86M 3% /app/logs
/tmp/test_block ext4 93M 91M 0 100% /mnt

[root@oldboy_50 mnt]# seq 1000 >>1.txt
seq: write error: No space left on device
錯誤已經出現

#### 1.6.1.2    解決辦法:

通過du -sh指令查找出大文件,然後刪除它。
[root@oldboy_50 mnt]# du -sh /
#找到了一個比較大目錄“/mnt”,在統計查看這個目錄下的大目錄,按照這樣逐級查找,找到這個大文件,並分析是什麽內容,能不能刪除,能刪除直接刪除即可
[root@oldboy_50 mnt]# du -sh /mnt/

90M /mnt/1.txt
[root@oldboy_50 mnt]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 19G 2.0G 16G 12% /
tmpfs tmpfs 2.5G 0 2.5G 0% /dev/shm
/dev/sda1 ext4 190M 66M 115M 37% /boot
/dev/test ext4 93M 2.1M 86M 3% /app/logs
/tmp/test_block ext4 93M 1.6M 87M 2% /mnt
磁盤占用率下降,得以解決這個問題

### 1.6.2 inode被占滿
inode被沾滿的原因,小文件過多,一個文件就要占用一個inode,inode的數量是有限的,所以小文件過多,很少消耗block,所以inode就被占滿了。
#### 1.6.2.1    模擬環境

[root@oldboy_50 mnt]# touch file_inode{1..100000}.txt
touch: cannot touch file_inode27266.txt‘: No space left on device<br/>touch: cannot touchfile_inode27267.txt‘: No space left on device


#### 1.6.2.2    解決辦法:
小文件多,說明他的所在的目錄大小肯定大,因為文件名是存放在上級目錄的block裏面的,小文件多,就說明文件名多,文件名多,就說明占用上級目錄的block多。解決思路就是用find查找目錄大小大大的文件。
[root@oldboy_50 /]# find / -type d -size +1M
/mnt
[root@oldboy_50 /]# ls /mnt/ |xargs rm -rf
### 1.6.3 被進程占用,找到調用這個文件的進程,刪除然後重啟一下服務就行。
## 1.7 Linux下刪除文件的原理
![](http://i2.51cto.com/images/blog/201807/29/c746b84255b1496443901d37f83eba52.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
## 1.8 Linux刪除文件的詳解
![](http://i2.51cto.com/images/blog/201807/29/0fb60c5f02b746225aba4bd38b02c0e9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

Linux文件屬性詳解