基于centos了解Linux文件結構
了解一下文件類型
Linux采用的一切皆文件的思想,將硬件設備、軟件等所有數據信息都以文件的形式呈現在用戶面前,這就使得我們對計算機的管理更加方便。所以本篇文章會對Linux操作系統的文件結構和文件權限進行講解。
首先我們鍵入到達~目錄
cd ~
然后鍵入ll
查看所有非隱藏文件,可以看到在每個文件最前方都有一個由10個字符構成的字符串,就以第一行為例-rw-------.
,可以看到第一行的10字符的第一個字符是-
,在Linux操作系統中,這個符號就代表著文件是一般文件,也就是我們日常配置、文本文件等這類文件。
除了一般文件以外,每個文件第一欄的第一個字符還可能出現以下幾種情況:
- d:代表當前文件為文件夾
- l:代表當前文件為超連接文件
- b:該文件提供為提供給系統存取的設備,例如你計算機的硬盤所存儲的數據內容,可能都會保存在這個類型文件中
- c:代表著連接到你計算機的一些硬件設備,例如鼠標、鍵盤等配置文件開頭都是以c開頭的
為了驗證這一點,我們隨意創建一個文件夾:
mkdir /tmp/dir
然后使用ll命令查看其文件屬性:
ll /tmp/
可以看到我們創建的文件夾是以d打頭的
上文還提到了一個b打頭的文件,這個文件是提供系統存儲的數據且可能硬盤也可能是其他存儲設備的,這類型文件一般都在設備目錄dev下,我們可以進入dev
目錄看到這些文件:
ll /dev/sda
而c打頭的文件則是硬件設備,我們不妨鍵入 ll /dev
查看一下,如下圖所示的BUS
總線,以及CPU
等這些都是硬件設備:
同樣的在上文中我們也有提到關于隱藏文件的概念,在Linux
中隱藏文件大多以.
開頭,這些文件使用常規的ll、ls等命令是看不到的,必須使用al選項查看所有文件才能看到(補充一句a的意思就是all):
ls -al查看
于是在當前目錄的所有文件列表下,我們看到了隱藏目錄:
文件名的限制
在現如今的Linux
,文件系統基本采取XFS
,所以文件名長度限制基本是255byte
以內,說通俗一點,你的文件要是以英文命名就可以起一個長度為255
的文件名,若為漢字則長度大約是127
。注意由于Linux
命令中常會用到-
以及一些特殊符號,所以文件命名應該盡量避免以下幾個特殊符號:
* ? > < ; & ! [ ] | \ ' " ` ( ) { } -
樹形目錄結構
Linux
的文件結構總的來說類似于一棵樹,用戶可以按照規范約定在相應的文件夾下存儲文件,就例如在var
目錄下可以存儲一些與系統的運作有關的文件例如程序日志文件、在tmp
目錄下存儲一些臨時文件等。
需要了解的是,無論是何種Linux
系統,他的目錄都會遵循一個標準,包括下圖中的文件結構,而這個標準名為Filesystem Hierarchy Standard (FHS)
。
FHS
規定文件的整體結構應該是這樣的:
1. /:根目錄,與開機系統有關
2. /usr(unix software resource):與軟件的安裝和執行有關
3. /var(variable):與系統的運作有關
首先介紹一個根目錄/
,它的子節點文件基本都是和系統開機相關、各種程序、庫函數的文件夾,所以在根目錄這一級是非常重要的,所以FHS
希望后續使用Linux
的時候盡量不要將用戶的文件夾或者文件存儲到這一層級以避免誤操作到重要文件導致系統崩潰。
根目錄下有個bin
文件夾,我們日常使用Linux
的時候都會用到ls
、cat
、touch
、mkdir
等基本操作命令都存放于bin目錄下:
接下來是/boot,
這個目錄存放的基本都是Linux
開機會用到配置文件,像Linux kerner
常用到的文件名 vmlinuz
就會存放在這個文件夾下
接下來是/dev
,這個文件夾基本存放的都是硬件設備,我們都知道Linux
主張一切皆文件,所以所有的鼠標、鍵盤、硬盤的設備信息都是存放在這個文件夾下:
/etc
目錄則是存放配置文件的地方,常見我們的用戶文件/etc/passwd
,以及密碼文件/etc/shadow
,還有系統文件/etc/rc
等都會存放在這個目錄下。
除此之根目錄下還有一些文件夾如下所示,這里就不一一介紹了:
mnt
存放掛載相關。lib
存放庫函數相關、sbin
存放開機、系統還原、修復等眾多指令。tmp
存儲臨時文件習慣。
我們再來聊聊FHS
規范中一個命名比較特殊導致用戶使用時常受到誤導的文件夾/usr
,很多人最初都會誤以為這是user
的縮寫,其實這個單詞是unix software resource
的縮寫,這個文件夾是FHS
規定存放軟件資源相關的文件夾,他們建議用戶軟件相關的資源盡可能都放到這個目錄。
首先來看看/usr/bin
目錄,這個目錄實質上就FHS
希望用戶能夠將一般用戶所能夠的使用的指令都放到這個目錄下,所以我們在日常軟件安裝時對應各種啟動指令腳本都建議存放到這個位置。此外usr
的bin
目錄下還存放了系統指令的軟連接,參見下圖:
除此之外usr下還有3個常見的目錄:
1./usr/lib
與根目錄的lib
功能相同,存放的基本是lib
目錄下的軟鏈接。
2. /usr/local/
則是FHS
希望用戶將下載的軟件都放到這個目錄下統一管理
3. /usr/sbin
同樣也是將根目錄的sbin
目錄下的指令軟鏈接到此。
最后我們再來介紹一些/var
,這個目錄FHS
認為應該存放那些經常發生變化的文件,例如日志,他們希望日志統一存放到/var/log
下。/var/lib
存放的則是會臨時改變的庫文件。而/var/lock
存放的則是被某個程序鎖定的文件,已確保其他程序不會同時使用到這個文件。
絕對路徑和相對路徑
絕對路徑則是以根節點作為其實節點的文件搜尋辦法,例如我們想到達tmp
文件夾,如果使用絕對路徑的方式則是
cd /tmp
假如我們在boot
目錄下,而tmp
和他一樣都屬root
的子節點,所以使用相對路徑的方式是先退到root
目錄,然后再進入tmp
文件夾,如下圖,所以在boot
目錄下,我們進入tmp
文件夾的命令為 cd ../tmp/
:
演示結果參見下圖:
注意:../
代表著退到上一級,那么就會有這么一個指令./
,代表當前目錄,這個指令是干什么用的是,很簡單,假如我們Linux
中某個sh
文件不在bin
、sbin
、/usr/bin
這樣的目錄下,Linux
規定我們執行可執行sh
文件文件時都必須標明./
,例如我在tmp
目錄下有個執行腳本test
,那么我在test
目錄下執行這個腳本的格式就必須是
sh ./test.sh
文件權限
權限對應角色
我們在隨意一個目錄下鍵入ll
查看文件信息,如下圖我們可以看到每個文件的第一欄除去第一個字符串代表著文件類型外,其余字符都會顯示rwx-
相關,其含義為:
- r代表讀權限。
- w代表寫權限。
- x代表執行權限。
我們以dir
的文件描述為例,第一個字符d代表它是個文件夾,2-4代表當前所有者權限為讀寫執行都有,而5-7代表所屬組權限,即這個文件所屬的組所擁有的權限為讀和執行,最后一行代表其他人的權限也是讀和執行。
d rwx r-x r-x.
針對dir文件夾,可以看到第3列為root
,說明這個文件屬于root
的,root
用戶擁有這個文件夾的讀寫執行權限。而第4列也為root
,說明屬于root
組的用戶擁有讀寫執行的權限。
假如此時有個名為xiaoming的用戶進來,它屬于xiaomingzu
,那么對于這個dir
文件夾而言,他就是other
用戶,那么它的權限只有讀和執行。
文件夾與文件對應權限的相似與區別
在Linux
系統下文件系統下,文件的可執行權限和文件夾的可執行權限是有所不同的。假如一個用戶對文件夾只有讀和寫權限,那么他就無法進入到這個目錄,如下所示,我們有root
創建一個testDir
,所以對于其他用戶來說只有讀和寫權限。
注意一下筆者賦權的命令,這里我們需要了解一下Linux
中讀權限用4表示,寫權限用2表示,執行用1表示,所以766
為(4+2+1)
+(4+2)
+(4+2)
代表著所屬者讀寫執行,所屬組和其他都是讀和執行:
# 進入tmp目錄cd /tmp/# 創建testDir文件夾
mkdir testDir# 設置這個文件夾 所屬者有所有權限 所屬組和其他用戶只有讀和寫權限
chmod 766 testDir/
當筆者以其他用戶登錄(這個用戶不是所屬者root也不屬于root組)
時,就會報出沒有權限的問題
這時候我們希望其他用戶可以有執行的權限,要怎么做呢?很簡單,我們也可以參考上面的數學公司對其他用戶增加執行權限:
chmod 777 /test/testDir
當然我們也可以單獨對其他用戶增加一個可執行權限,命令如下所示,可以看到其他為o,增加一個可執行權限為+x。同理可知若是所者為u,所屬組為g。增加權限用+,減去權限用-,賦值權限用=:
其他用戶對于testDir文件夾的操作增加執行權限
chmod o+x testDir/
所以我們若希望所屬者賦值為所有權限則是u=rwx
,所屬組和其他都希望是讀和執行,那就是g和o
合在一起寫,并=rx
,如下所示:
chmod u=rwx,go=rx testDir/
當然有時候你希望這個文件改變所屬組,你可以使用chgrp 指令,如下所示,這樣意義文件夾所屬組就改為otheruser
:
# 將文件夾testDir所屬組改為otheruser
chgrp otherusertestDir/
同理若你希望改變所有者則可以使用chown
:
chown otherusertestDir testDir/
當然,若你希望所有者和所屬組都能改變則可以:
# 將testDir所有者改為冒號左邊的root,將所屬組改為冒號右邊的root
chown root:root testDir/
回到問題,為了方便演示文件和文件夾可執行權限的區別,我們將文件夾所屬者和所屬者都改為root
,并且所有用戶都具備所有權限:
chmod 777 testDir/
chown root:root testDir/
然后進去該文件夾,創建一個file1
的文件,權限設置為700
,即所屬者才有權限,所屬組和其他沒有任何權限:
cd testDir/touch file1chmod 700 file1
使用ll -d
查看testDir
文件夾以及文件夾下對應的文件file1
的權限,可以發現對于其他用戶而言文件夾有所有的權限,而文件沒有任何權限:
ll -d /tmp/testDir/ /tmp/testDir/file1
所以我們使用別的賬戶可以進入路徑,但是無法讀寫該文件如下圖:
vim file1
但是以為其他用戶擁有file
文件的目錄testDir
的執行權限,所以它可以將這個文件刪除。所以得出結論,文件夾的可執行權限意為著可以刪除這個文件夾下所有的文件,但是并不意味著可以修改或者讀取文件夾下文件的內容。
這種情況我們完全可以將文件夾testDir
看作一個抽屜,任何人對其都有任何權限。此時root
往里面放了一個小保險盒,讀寫權限只有root有。所以其他用戶是無法打開或者修改盒子中的內容。但是他具有抽屜(testDir)
的所有權限,所以他可以將這個保險盒扔掉。
以下這張表格就說明了操作文件夾下某些文件所需的最低權限,可以看到像刪除、復制等這些無需讀取文件內容的操作,文件所對應的文件夾甚至不一定需要rw的權限。用上面抽屜和文件的例子來說,我們刪除完完全全可以看不到抽屜內部文件的具體的內容,復制文件不需要知道文件夾內有什么文件,我們完完全全可以瞎摸出來放到別的目錄。
umask設置默認權限
默認情況下,用戶創建的文件權限為:rw-rw-rw-
,對應的數字為666
,而文件夾則是:rwxrwxrwx
對應數字是777
。那是什么原因導致我們最后創建出來的文件權限變成rw-r--r--(644)
以及文件夾變成rwxr-xr-x(755)
呢?
答案就是umask
,umask
和默認權限進行取反和按位與運算,從而得出文件和文件夾創建的實際文件。
先來演算一下文件的權限運算,加入我們創建一個文件file
:
touch file
可以看到它的權限為0644
(因為權限位最前面是-,說明是一般文件,可直接視為0)
-rw-r--r-- 1 root root 0 Dec 6 14:39 file
以上文所說,默認是0666
,然后和0022
進行取反按位與運算,所以我們首先對0022
進行取反得到7755
:
然后和0666進行按位與運算,最終得出文件默認權限為rw-r--r--
,文件夾同理這里就不多做演示:
7755
& 06660644
上述運算屬于標準的推算步驟,對于取反按位與這種運算,讀者可直接視為減法,例如文件默認權限為0666,而umask為0022,兩者直接相減即可直接得到0644。
如果我們希望文件權限保持最原始的權限,那么我們可以將umask
改為0000
:
umask 0000
創建的文件權限就是 666
,創建的文件夾就是 777
。
參考文獻
鳥哥的Linux私房菜:https://book.douban.com/subject/4889838/
循序漸進Linux(第2版):https://book.douban.com/subject/26758194/