一、文件屬性結構

備注:b可以是內存,c可以是鼠標鍵盤
二、文件類型與權限
在Linux中第一個字符代表這個文件是目錄、文件或鏈接文件等等。
- 當為[ d ]則是目錄
- 當為[ - ]則是文件;
- 若是[ l ]則表示為鏈接文檔(link file);
- 若是[ b ]則表示為裝置文件里面的可供儲存的接口設備(可隨機存取裝置);
- 若是[ c ]則表示為裝置文件里面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)。
接下來的字符中,以三個為一組,且均為『rwx』 的三個參數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]而已。
每個文件的屬性由左邊第一部分的10個字符來確定(如下圖)。

從左至右用0-9這些數字來表示。
第0位確定文件類型,第1-3位確定屬主(該文件的所有者)擁有該文件的權限。
第4-6位確定屬組(所有者的同組用戶)擁有該文件的權限,第7-9位確定其他用戶擁有該文件的權限。
其中,第1、4、7位表示讀權限,如果用"r"字符表示,則有讀權限,如果用"-"字符表示,則沒有讀權限;
第2、5、8位表示寫權限,如果用"w"字符表示,則有寫權限,如果用"-"字符表示沒有寫權限;第3、6、9位表示可執行權限,如果用"x"字符表示,則有執行權限,如果用"-"字符表示,則沒有執行權限。
三、Linux文件屬主和屬組
[root@www /]# ls -l total 64 drwxr-xr-x 2 root root 4096 Feb 15 14:46 cron drwxr-xr-x 3 mysql mysql 4096 Apr 21 2014 mysql
對於文件來說,它都有一個特定的所有者,也就是對該文件具有所有權的用戶。
同時,在Linux系統中,用戶是按組分類的,一個用戶屬於一個或多個組。
文件所有者以外的用戶又可以分為文件所有者的同組用戶和其他用戶。
因此,Linux系統按文件所有者、文件所有者同組用戶和其他用戶來規定了不同的文件訪問權限。
在以上實例中,mysql 文件是一個目錄文件,屬主和屬組都為 mysql,屬主有可讀、可寫、可執行的權限;與屬主同組的其他用戶有可讀和可執行的權限;其他用戶也有可讀和可執行的權限。
對於 root 用戶來說,一般情況下,文件的權限對其不起作用。
更改文件屬性
1、chgrp:更改文件屬組
語法:
chgrp [-R] 屬組名 文件名
參數選項
- -R:遞歸(recurrence)更改文件屬組,就是在更改某個目錄文件的屬組時,如果加上-R的參數,那么該目錄下的所有文件的屬組都會更改。
2、chown:更改文件屬主,也可以同時更改文件屬組
語法:
chown [–R] 屬主名 文件名 chown [-R] 屬主名:屬組名 文件名
進入 /root 目錄(~)將install.log的擁有者改為bin這個賬號:
[root@www ~] cd ~ [root@www ~]# chown bin install.log [root@www ~]# ls -l -rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log
將install.log的擁有者與群組改回為root:
[root@www ~]# chown root:root install.log [root@www ~]# ls -l -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
3、chmod:更改文件9個屬性
Linux文件屬性有兩種設置方法,一種是數字,一種是符號。
Linux文件的基本權限就有九個,分別是owner/group/others三種身份各有自己的read/write/execute權限。
先復習一下剛剛上面提到的數據:文件的權限字符為:『-rwxrwxrwx』, 這九個權限是三個三個一組的!其中,我們可以使用數字來代表各個權限,各權限的分數對照表如下:
- r:4
- w:2
- x:1
每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,例如當權限為: [-rwxrwx---] 分數則是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= --- = 0+0+0 = 0
所以等一下我們設定權限的變更時,該文件的權限數字就是770啦!變更權限的指令chmod的語法是這樣的:
chmod [-R] xyz 文件或目錄
選項與參數:
- xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
- -R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件都會變更
舉例來說,如果要將.bashrc這個文件所有的權限都設定啟用,那么命令如下:
[root@www ~]# ls -al .bashrc -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc [root@www ~]# chmod 777 .bashrc [root@www ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
那如果要將權限變成 -rwxr-xr-- 呢?那么權限的分數就成為 [4+2+1][4+0+1][4+0+0]=754。
符號類型改變文件權限
還有一個改變權限的方法,從之前的介紹中我們可以發現,基本上就九個權限分別是:
- (1)user
- (2)group
- (3)others
那么我們就可以使用 u, g, o 來代表三種身份的權限!
此外, a 則代表 all,即全部的身份。讀寫的權限可以寫成 r, w, x,也就是可以使用下表的方式來看:
| chmod | u g o a |
+(加入) -(除去) =(設定) |
r w x |
文件或目錄 |
如果我們需要將文件權限設置為 -rwxr-xr-- ,可以使用 chmod u=rwx,g=rx,o=r 文件名 來設定:
# touch test1 // 創建 test1 文件 # ls -al test1 // 查看 test1 默認權限 -rw-r--r-- 1 root root 0 Nov 15 10:32 test1 # chmod u=rwx,g=rx,o=r test1 // 修改 test1 權限 # ls -al test1 -rwxr-xr-- 1 root root 0 Nov 15 10:32 test1
而如果是要將權限去掉而不改變其他已存在的權限呢?例如要拿掉全部人的可執行權限,則:
# chmod a-x test1 # ls -al test1 -rw-r--r-- 1 root root 0 Nov 15 10:32 test1
四、文件類型
-:代表普通文件
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安裝包
五、inode
什么是inode
文件存儲在硬盤上,硬盤的最小存儲單位叫做"扇區"(sector)。每個"扇區"的大小為512字節(byte),
,操作系統讀取硬盤的時候,不會一個個扇區的讀取,這樣效率太慢。他是一次性讀取多個扇區,即一次性讀取一個"Block塊"。一個Block有8個連續的扇區(sector)組成。
數據都存在Block塊里面,但是我們怎么知道一個數據存放在哪些Block塊里面呢?這個時候就必須需要一個索引,引導我們去找到哪些存放在BLOCK塊里面的額數據。這存放索引的地方我們稱為索引節點(Inode),索引節點里面包括了:文件的類型,屬主,屬組,權限,和時間戳一些信息,但是不包括文件名,
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
inode的大小
想一下,既然他要存放內容,所以他肯定也是需要占用磁盤空間大小的。所硬盤分區在創建文件系統(格式化)的時候自動把硬盤分區分成兩個區域:
1)Block塊,數據區:存放實際的數據
2)Inode塊,索引區:存放inode所包含的信息(文件屬性信息)
inode節點的大小和總數,是創建文件系統的時候就給定的,后期沒辦法更改,一般是128字節(byte)或者256字節(byte)。
如何查看inode的數量和大小:
查看數量
df -i [root@oldboy_50 ~]# dumpe2fs /dev/sda3 | grep -i "inode count" dumpe2fs 1.41.12 (17-May-2010) Inode count:
查看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
inode號碼
每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。Linux不考文件名來區分文件,就像Linux不靠用戶名來區分用戶。文件名只是inode號碼便於識別的綽號。
打開或編輯文件的過程:

目錄文件
Linux下面一切皆文件,所以列出目錄下的內容也相當於列出目錄文件里面的內容,進入目錄,就相當於進入目錄文件里面。
目錄文件的結構非常簡單,就是一系列目錄項(dirent)的列表,每個目錄項都有兩部分組成:
1)所包含的文件名
2)所包含的文件名和inode(索引節點號)的對應關系
修改目錄下面的文件名,實際上就是在修改目錄文件本身的block塊里面的對應信息。所以能不能改目錄下面的文件的名稱是根據目錄的權限來的。而是不根據文件本省的的權限來的。
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大小
block總結
1)用來實際存放數據的地方,如果是目錄,里面存放下級文件的文件名稱
2)磁盤讀取數據是按照block為單位讀取的
3)一個文件至少占用一個block,未用完的浪費,可以占用多個block
4)要提升磁盤I/O性能,那就要一次性讀取數據盡量的多
5)block並非越大越好。block太大會對小文件存放浪費太多磁盤空間,太小對於大文件來說,會更大的消耗I/O。一般默認為4K(4096字節)
六、鏈接
6.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
6.2 總結
1) inode號相同的,可以認為互為硬鏈接
2) 硬鏈接的創建不能跨越文件系統(跨越分區),目錄不能創建硬鏈接
3) 刪除源文件或鏈接文件,文件實例未被改變,只有刪除所有的硬鏈接文件和源文件,文件的實體才會被改變。
4) 當所有的硬鏈接和源文件被刪除,沒有進程調用后,在存放新的數據會占用這個文件的空間或者磁盤fsck檢查的時候,刪除的數據才會被回收,
5) 可以通過文件設置硬鏈接文件,來防止重要文件被誤刪除
6) 每在目錄下創建一個子目錄,他的上級目錄的硬連接數加1
7) 目錄硬鏈接的個數減去2代表他下面有多少個目錄(減去他本身的1,和“.”)
6.3軟鏈接
作用
當一個軟件的編譯路徑變了,我們還希望使用以前的路徑,這時候就需要用到軟連接,軟連接相當於一個傳送門,刪除軟連接對源文件沒影響,但刪除源文件,軟連接就失效了。
總結
1) 軟鏈接類似於windows的快捷方式(可以用readlink查看指向) 2) 軟連接類似於一個文本文件,里面存放的是源文件的路徑,指向源文件實體 3) 刪除源文件,軟鏈接失效,一般顯示白字紅底閃爍提示 4) 軟鏈接具備不同的inode號 5) 軟鏈接和源文件屬於不同類型的文件
七、常見問題 no space left on device
inode被占滿
inode被沾滿的原因,小文件過多,一個文件就要占用一個inode,inode的數量是有限的,所以小文件過多,很少消耗block,所以inode就被占滿了。
模擬環境
[root@oldboy_50 mnt]# touch file_inode{1..100000}.txt
touch: cannot touch `file_inode27266.txt': No space left on device
touch: cannot touch `file_inode27267.txt': No space left on device
解決辦法:
小文件多,說明他的所在的目錄大小肯定大,因為文件名是存放在上級目錄的block里面的,小文件多,就說明文件名多,文件名多,就說明占用上級目錄的block多。解決思路就是用find查找目錄大小大大的文件。
[root@oldboy_50 /]# find / -type d -size +1M /mnt [root@oldboy_50 /]# ls /mnt/ |xargs rm -rf
被進程占用,找到調用這個文件的進程,刪除然后重啟一下服務就行
