【BASH】回顧與知識點梳理 二十一
- 二十一. Linux 的文件權限與目錄配置
- 21.1 使用者與群組
- 屬主(文件擁有者)
- 屬組(群組概念)
- 其他人的概念
- root(萬能的天神)
- Linux 用戶身份與群組記錄的文件
- 21.2 Linux 文件權限概念
- Linux 文件屬性
- Linux 文件權限的重要性
- 21.3 如何改變文件屬性與權限
- 改變所屬群組, chgrp
- 改變文件擁有者, chown
- 改變權限, chmod
- 21.4 目錄與文件之權限意義
- 權限對文件的重要性
- 權限對目錄的重要性
- 用戶操作功能與權限
- 21.6 Linux 文件種類與擴展名
- 文件種類:
- Linux 文件擴展名
- Linux 文件長度限制
- Linux 文件名的限制
- 21.7 Linux 目錄配置
- Linux 目錄配置的依據--FHS
- 根目錄 (/) 的意義與內容
- /usr 的意義與內容
- /var 的意義與內容
- 針對 FHS,各家 distributions 的異同,與 CentOS7 的變化
- 目錄樹(directory tree)
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)
二十一. Linux 的文件權限與目錄配置
Linux 最優秀的地方之一就在于他的多人多任務環境。而為了讓各個使用者具有較保密的文件數據,因此文件的權限管理就變的很重要了。 Linux 一般將文件可存取的身份分為三個類別,分別是 owner/group/others,且三種身份各有read/write/execute 等權限。若管理不當,你的 Linux 主機將會變的很『不蘇湖!@_@』。另外,你如果首次接觸 Linux 的話,那么, 在 Linux 底下這么多的目錄/文件,到底每個目錄/文件代表什么意義呢?底下我們就來一一介紹呢!
21.1 使用者與群組
屬主(文件擁有者)
由于 Linux 是個多人多任務的系統,因此可能常常會有多人同時使用這部主機來進行工作的情況發生, 為了考慮每個人的隱私權以
及每個人喜好的工作環境,因此,這個『文件擁有者』的角色就顯的相當的重要了!
當文件設定成『只有文件擁有者,就是我,才能看與修改這個文件的內容
』, 那么即使其他人知道你有這個相當『有趣』的文件,不過由于你有設定適當的權限, 所以其他人自然也就無法知道該文件的內容啰!
屬組(群組概念)
在 Linux 底下這樣的限制是很簡單啦!我可以經由簡易的文件權限設定,就能限制非自己團隊(亦即是群組啰) 的其他人不能夠閱覽內容啰!而且亦可以讓自己的團隊成員可以修改我所建立的文件! 同時,如果我自己還有私人隱密的文件,仍然可以設定成讓自己的團隊成員也看不到我的文件數據。
每個賬號都可以有多個群組的支持呢!
舉例:假設有一家人,家里只有三兄弟,分別是王大毛、王二毛與王三毛三個人, 而這個家庭是登記在王大毛的名下的!所以,『
王大毛家有三個人,分別是王大毛、王二毛與王三毛
』, 而且這三個人都有自己的房間,并且共同擁有一個客廳喔!
- 使用者的意義:由于王家三人各自擁有自己的房間,所以, 王二毛雖然可以進入王三毛的房間,但是二毛不能翻三毛的抽屜喔!那樣會被三毛 K 的! 因為抽屜里面可能有三毛自己私人的東西,例如情書啦,日記啦等等的,這是『私人的空間』,所以當然不能讓二毛拿啰!
- 群組的概念:由于共同擁有客廳,所以王家三兄弟可以在客廳打開電視機啦、 翻閱報紙啦、坐在沙發上面發呆啦等等的! 反正,只要是在客廳的玩意兒,三兄弟都可以使用喔! 因為大家都是一家人嘛!
這樣說來應該有點曉得了喔!那個『
王大毛家
』就是所謂的『群組
』啰, 至于三兄弟
就是分別為三個『使用者
』,而這三個使用者是在同一個群組里面的喔! 而三個使用者雖然在同一群組內,但是我們可以設定『權限』, 好讓某些用戶個人的信息不被群組的擁有者查詢,以保有個人『私人的空間』啦! 而設定群組共享,則可讓大家共同分享喔!
其他人的概念
這個文檔和哪些用戶沒有任何的關系,此時那些用戶就是其他人的范疇
root(萬能的天神)
不過,這里有個特殊的人物要來介紹的,那就是『萬能的天神』!這個天神具有無限的神力, 所以他可以到達任何他想要去的地方,呵呵!那個人在 Linux 系統中的身份代號是『 root 』啦!所以要小心喔!那個root 可是『萬能的天神』喔!
Linux 用戶身份與群組記錄的文件
在我們 Linux 系統當中,默認的情況下,所有的系統上的賬號與一般身份使用者,還有那個 root 的相關信息,都是記錄在/etc/passwd
這個文件內的。至于個人的密碼則是記錄在/etc/shadow
這個文件下。此外,Linux 所有的組名都紀錄在/etc/group
內!這三個文件可以說是 Linux 系統里面賬號、密碼、群組信息的集中地啰! 不要隨便刪除這三個文件啊! ^_^
[root@node-135 bin]# head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@node-135 bin]# head -3 /etc/shadow
root:$6$CxTq1OkkZPBr3c.8$mQEBysixMLtVF2I7vwH/78y0Kl3wT0n7PRVINuFPRWLPiyZZObH8fpC8ZgSu9AaetwuEf/zqNkuN99cUVIrzu1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
[root@node-135 bin]# head -3 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
21.2 Linux 文件權限概念
文件的權限主要針對這些所謂的『使用者』與『群組』來設定
Linux 文件屬性
[root@study ~]# ls -al
total 48
...
drwxr-xr-x. 3 root root 17 May 6 00:14 .config <=范例說明處
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg <=范例說明處
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ]
[ 權限 ] [連結] [擁有者] [群組] [文件容量] [ 修改日期 ] [ 檔名 ]
-
第一欄代表這個文件的類型與權限(permission):
仔細看的話,你應該可以發現這一欄其實共有十個字符
第一個字符
代表這個文件是『目錄、文件或鏈接文件等等』:- 當為[ d ]則是目錄,例如上表檔名為『.config』的那一行;
- 當為[ - ]則是文件,例如上表檔名為『initial-setup-ks.cfg』那一行;
- 若是[ l ]則表示為連結檔(link file);
- 若是[ b ]則表示為裝置文件里面的可供儲存的接口設備(可隨機存取裝置);
- 若是[ c ]則表示為裝置文件里面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)。
接下來的字符中,以
三個為一組
,且均為『rwx
』 的三個參數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個權限的位置不會改變,如果沒有權限,就會出現減號[-
]而已。- 第一組為『文件擁有者可具備的權限』,以『initial-setup-ks.cfg』那個文件為例, 該文件的擁有者可以讀寫,但不可執行;
- 第二組為『加入此群組之賬號的權限』;
- 第三組為『非本人且沒有加入本群組之其他賬號的權限』
請你特別注意喔!不論是那一組權限,基本上,都是『
針對某些賬號來設計的權限
』喔!以群組來說,他規范的是『加入這個群組的賬號具有什么樣的權限
』之意, 以學校社團為例,假設學校有個童軍社的社團辦公室,『加入童軍社的同學就可以進出社辦』,主角是『學生(賬號)』而不是童軍社本身喔!這樣可以理解嗎?
細心的小伙伴一定還注意到了第一欄的
第十一個字符
:點(.
),這個.
是RedHat家族的linux系統(例如centos)所特有的,表示:該文件存在“SELinux的安全標簽”
。當關閉了selinux,這時候新建一個文件,發現文件權限后面的小點沒了,和我們平時看到的文件權限一樣,正常了。但當開啟時已存在或者新創建的文件,無論selinux是否開啟,.
都是存在的。SELinux全稱Security-Enhanced Linux,是一種訪問控制體系,可以“簡單的”理解為更安全的linux系統。“更安全”必然是有代價的,包括訪問限制,權限限制等等,所以大多數情況下,我們都選擇關閉,畢竟不需要那么“安全”,或者有其他殺軟保證相對安全就可以了。
-
第二欄表示有多少檔名連結到此節點(i-node):
每個文件都會將他的權限與屬性記錄到文件系統的 i-node 中,不過,我們使用的目錄樹卻是使用文件名來記錄, 因此每個檔名就會連結到一個 i-node 啰!這個屬性記錄的,就是有多少不同的檔名連結到相同的一個 i-node 號碼去就是了。 -
第三欄表示這個文件(或目錄)的『擁有者賬號』
-
第四欄表示這個文件的所屬群組
-
第五欄為這個文件的容量大小,默認單位為 bytes;
-
第六欄為這個文件的建檔日期或者是最近的修改日期:
這一欄的內容分別為日期(月/日)及時間。如果這個文件被修改的時間距離現在太久了,那么時間部分會僅顯示年份而已。[root@study ~]# ll /etc/services /root/initial-setup-ks.cfg -rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services -rw-r--r--. 1 root root 1864 May 4 18:01 /root/initial-setup-ks.cfg # 如上所示,/etc/services 為 2013 年所修改過的文件,離現在太遠之故,所以只顯示年份; # 至于 /root/initial-setup-ks.cfg 是今年 (2015) 所建立的,所以就顯示完整的時間了。[root@node-135 /]# ll --full-time ... drwxr-xr-x. 2 root root 6 2018-04-11 12:59:55.000000000 +0800 media drwxr-xr-x. 3 root root 36 2023-08-01 10:30:13.110995188 +0800 mnt
『
ls -l --full-time
』就能夠顯示出完整的時間格式了!包括年、月、日、時間喔。 另外,如果你當初是以繁體中文安裝你的 Linux 系統,那么日期字段將會以中文來顯示。 可惜的是,中文并沒有辦法在純文本的終端機模式中正確的顯示,所以此欄會變成亂碼。 那你就得要使用『export LC_ALL=en_US.utf8
』來修改語系喔! -
第七欄為這個文件的檔名
比較特殊的是:如果檔名之前多一個『 . 』,則代表這個文件為『隱藏檔』
Linux 文件權限的重要性
與 Windows 系統不一樣的是,在 Linux 系統當中,每一個文件都多加了很多的屬性進來,尤其是群組的概念,這樣有什么用途呢? 其實,最大的用途是在『數據安全性』上面的。
- 系統保護的功能
- 團隊開發軟件或數據共享的功能
- 未將權限設定妥當的危害
21.3 如何改變文件屬性與權限
我們先介紹幾個常用于群組、擁有者、各種身份的權限之修改的指令,如下所示:
- chgrp :改變文件所屬群組
- chown :改變文件擁有者
- chmod :改變文件的權限, SUID, SGID, SBIT 等等的特性
改變所屬群組, chgrp
這個指令就是 change group 的縮寫嘛!要被改變的組名必須要在/etc/group 文件內存在才行,否則就會顯示錯誤!
[root@study ~]# chgrp [-R] dirname/filename ...
選項與參數:
-R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件、目錄都更新成為這個群組之意。常常用在變更某一目錄內所有的文件之情況。
# 范例:
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing' <== 發生錯誤訊息啰~找不到這個群組名~
改變文件擁有者, chown
改變擁有者就是 change owner 啰!用戶必須是已經存在系統中的賬號,也就是在/etc/passwd 這個文件中有紀錄的用戶名稱才能改變。
[root@study ~]# chown [-R] 賬號名稱 文件或目錄
[root@study ~]# chown [-R] 賬號名稱:組名 文件或目錄
選項與參數:
-R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件都變更
# 范例:將 initial-setup-ks.cfg 的擁有者改為 bin 這個賬號:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg#范例:將 initial-setup-ks.cfg 的擁有者與群組改回為 root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg
事實上,chown 也可以使用『
chown user.group file
』,亦即在擁有者與群組間加上小數點『.
』也行! 不過很多朋友設定賬號時,喜歡在賬號當中加入小數點(例如 vbird.tsai 這樣的賬號格式),這就會造成系統的誤判了! 所以我們比較建議使用冒號『:』來隔開擁有者與群組啦!此外,chown 也能單純的修改所屬群組呢! 例如『chown .sshd initial-setup-ks.cfg』就是修改群組~看到了嗎?就是那個小數點的用途!
那么什么時候要使用 chown 或 chgrp 呢?
以cp指令為例,簡單說明:
[root@study ~]# cp 來源文件 目標文件
[root@study ~]# cp .bashrc .bashrc_test
[root@study ~]# ls -al .bashrc*
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
-rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test <==新文件的屬性沒變
由于復制行為(cp)會復制執行者的屬性與權限,所以!怎么辦?.bashrc_test 還是屬于 root 所擁有, 如此一來,即使你將文件拿給 bin 這個使用者了,那他仍然無法修改的(看屬性/權限就知道了吧), 所以你就必須要將這個文件的擁有者與群組修改一下啰!知道如何修改了吧?
改變權限, chmod
文件權限的改變使用的是 chmod 這個指令,但是,權限的設定方法有兩種, 分別可以使用數字或者是符號來進行權限的變更。我們就來談一談:
-
數字類型改變文件權限
文件的權限字符為:『-rwxrwxrwx
』, 這九個權限是三個三個一組的!其中,我們可以使用數字來代表各個權限,各權限的分數對照表如下:r:4w:2x:1
每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,例如當權限為: [
-rwxrwx---
] 分數則是:owner = rwx = 4+2+1 = 7group = rwx = 4+2+1 = 7others= --- = 0+0+0 = 0
[root@study ~]# chmod [-R] xyz 文件或目錄 選項與參數: xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。 -R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有文件都會變更
[root@study ~]# ls -al .bashrc -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 777 .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc
-
符號類型改變文件權限
從之前的介紹中我們可以發現,基本上就九個權限分別是(1)user (2)group (3)others 三種身份啦!那么我們就可以藉由u, g, o
來代表三種身份的權限!此外,a
則代表 all 亦即全部的身份!那么讀寫的權限就可以寫成r, w, x
啰!也就是可以使用底下的方式來看:
命令 | 選項 | 類型 | 權限 | 文件 |
---|---|---|---|---|
chmod | u g o a | +(加入) -(除去) =(設定) | r w x | 文件或目錄 |
來實作一下吧!假如我們要『設定』一個文件的權限成為『-rwxr-xr-x
』時,基本上就是:
- user (u):具有可讀、可寫、可執行的權限;
- group 與 others (g/o):具有可讀與執行的權限。
[root@study ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那個 u=rwx,go=rx 是連在一起的,中間并沒有任何空格符!
[root@study ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod a+w .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod a-x .bashrc
[root@study ~]# ls -al .bashrc
-rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 644 .bashrc # 測試完畢得要改回來喔!
那么假如是『-rwxr-xr--
』這樣的權限呢?可以使用『chmod u=rwx,g=rx,o=r filename
』來設定。
21.4 目錄與文件之權限意義
權限對文件的重要性
文件是實際含有數據的地方,包括一般文本文件、數據庫內容文件、二進制可執行文件(binary program)等等。 因此,權限對于文件來說,他的意義是這樣的:
- r (read):可讀取此一文件的實際內容,如讀取文本文件的文字內容等;
- w (write):可以編輯、新增或者是修改該文件的內容(但不含刪除該文件);
- x (eXecute):該文件具有可以被系統執行的權限。
可執行(x)這里你就必須要小心啦! 因為在Windows 底下一個文件是否具有執行的能力是藉由『 擴展名 』來判斷的, 例如:.exe, .bat, .com 等等,但是在 Linux 底下,我們的文件是否能被執行,則是藉由是否具有『x』這個權限來決定的!跟檔名是沒有絕對的關系的!
當你對一個文件具有 w 權限時,你可以具有寫入/編輯/新增/修改文件的內容的權限, 但并不具備有刪除該文件本身的權限!
對于文件的 rwx 來說, 主要都是針對『文件的內容
』而言,與文件檔名的存在與否沒有關系喔!因為文件記錄的是實際的數據嘛!
如果當前用戶要刪除他用戶的文件,需要具備至少什么權限呢?
對文件需要有全部權限:-rwxr-xrwx
對文件所在目錄有寫權限:-rwxr-x-wx
權限對目錄的重要性
文件是存放實際數據的所在,那么目錄主要是儲存啥玩意啊?目錄主要的內容在記錄文件名列表,文件名與目錄有強烈的關連啦!
所以如果是針對目錄時,那個 r, w, x 對目錄是什么意義呢?
-
r (read contents in directory):
表示具有讀取目錄結構列表的權限
,所以當你具有讀取(r
)一個目錄的權限時,表示你可以查詢該目錄下的文件名數據。 所以你就可以利用 ls 這個指令將該目錄的內容列表顯示出來! -
w (modify contents of directory):
這個可寫入的權限對目錄來說,是很了不起的! 因為他表示你具有異動該目錄結構列表的權限
,也就是底下這些權限:建立新的文件與目錄
;刪除已經存在的文件與目錄(不論該文件的權限為何!)
將已存在的文件或目錄進行更名
;搬移該目錄內的文件、目錄位置
。
-
x (access directory):
咦!目錄的執行權限有啥用途啊?目錄只是記錄文件名而已,總不能拿來執行吧?沒錯!目錄不可以被執行,目錄的 x 代表的是用戶能否進入該目錄成為工作目錄的用途!
所謂的工作目錄(work directory)就是你目前所在的目錄啦!舉例來說,當你登入 Linux 時, 你所在的家目錄就是你當下的工作目錄。而變換目錄的指令是『cd』(change directory)啰!
組件 | 內容 | 迭代物件 | r | w | x |
---|---|---|---|---|---|
文件 | 詳細資料 | data | 文件文件夾 | 讀到文件內容 | 修改文件內容 |
目錄 | 檔名 | 可分類抽屜 | 讀到檔名 | 修改檔名 | 進入該目錄的權限(key) |
你可以看到,對一般文件來說,rwx 主要是針對『文件的內容
』來設計權限,對目錄來說,rwx 則是針對『目錄內的文件名列表
』來設計權限。
其中最有趣的大概就屬目錄的 x 權限
了!『檔名怎么執行』?沒道理嘛!其實,這個 x 權限設計,就相當于『該目錄,也就是該抽屜的 "鑰匙"
』啦! 沒有鑰匙你怎么能夠打開抽屜呢?對吧!
能不能進入某一個目錄,只與該目錄的 x 權限有關啦!此外, 工作目錄對于指令的執行是非常重要的,如果你在某目錄下不具有 x 的權限, 那么你就無法切換到該目錄下,也就無法執行該目錄下的任何指令,即使你具有該目錄的 r 或 w 的權限。
要開放目錄給任何人瀏覽時,應該至少也要給予 r 及 x 的權限,但 w 權限不可隨便給!
為什么 w 不能隨便給,我們來看下一個例子:
假設有個賬號名稱為 dmtsai,他的家目錄在/home/dmtsai/,dmtsai 對此目錄具有[rwx]的權限。 若在此目錄下有個名為 the_root.data 的文件,該文件的權限如下:
-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data請問 dmtsai 對此文件的權限為何?可否刪除此文件?
答:
如上所示,由于 dmtsai 對此文件來說是『others』的身份,因此這個文件他無法讀、無法編輯也無法執行, 也就是說,他無法變動這個文件的內容就是了。
但是由于這個文件在他的家目錄下, 他在此目錄下具有 rwx 的完整權限,因此對于 the_root.data 這個『檔名』來說,他是能夠『刪除』的! 結論就是,dmtsai 這個用戶能夠刪除 the_root.data 這個文件!
上述的例子解釋是這樣的,假設有個莫名其妙的人,拿著一個完全密封的文件夾放到你的辦公室抽屜中,因為完全密封你也打不開、看不到這個文件夾
的內部數據(對文件來說,你沒有權限)。 但是因為這個文件夾是放在你的抽屜中,你當然可以拿出/放入任何數據在這個抽屜中(對目錄來說,你具有所有
權限)。 所以,情況就是:你打開抽屜、拿出這個沒辦法看到的文件夾、將他丟到走廊上的垃圾桶!搞定了 (順利刪除!)!
用戶操作功能與權限
假設兩個檔名,分別是底下這樣:
- /dir1/file1
- /dir2
分別需要『哪些最小的權限
』才能達成各項任務?
操作動作 | /dir1 | /dir1/file1 | /dir2 | 重點 |
---|---|---|---|---|
讀取file1內容 | x | r | - | 要能夠進入/dir1才能讀到里面的文件數據! |
修改file1內容 | x | rw | - | 能夠進入/dir1且修改file1才行! |
執行file1內容 | x | rx | - | 能夠進入/dir1且file1能運作才行! |
刪除file1文件 | wx | - | - | 能夠進入/dir1具有目錄修改的權限即可! |
將file1復制到/dir2 | x | r | wx | 要能夠讀file1且能夠修改/dir2內的數據 |
你可能會問,上面的表格當中,很多時候 /dir1 都不必有 r 耶!為啥?我們知道 /dir1 是個目錄,也是個抽屜!那個抽屜的 r 代表『這個抽屜里面有燈光』, 所以你能看到的抽屜內的所有文件夾名稱 (非內容)。但你已經知道里面的文件夾放在哪個地方,那,有沒有燈光有差嘛?你還是可以摸黑拿到該文件夾的!對吧! 因此,上面很多動作中,你只要具有 x 即可!r 是非必備的!只是,沒有r 的話,使用 [tab] 時,他就無法自動幫你補齊檔名了!這樣理解乎?
21.6 Linux 文件種類與擴展名
文件種類:
-
正規文件(regular file ),[
-
]
就是一般我們在進行存取的類型的文件,在由 ls -al 所顯示出來的屬性方面,第一個字符為 [-
],例如[-rwxrwxrwx ]。另外,依照文件的內容,又大略可以分為:- 純文本檔(ASCII)
- 二進制文件(binary)
- 數據格式文件(data)
有些程序在運作的過程當中會讀取某些特定格式的文件,那些特定格式的文件可以被稱為數據文件 (data file)。舉例來說,我們的 Linux 在使用者登入時,都會將登錄的數據記錄在 /var/log/wtmp 那個文件內,該文件是一個 data file,他能夠透過 last 這個指令讀出來! 但是使用 cat 時,會讀出亂碼~因為他是屬于一種特殊格式的文件。瞭乎?
-
目錄(directory),[
d
] -
連結檔(link), [
l
] -
設備與裝置文件(device),[
b
] [c
]- 區塊(block)設備檔:就是一些儲存數據, 以提供系統隨機存取的接口設備,舉例來說,硬盤與軟盤等就是啦!
- 字符(character)設備文件:亦即是一些串行端口的接口設備, 例如鍵盤、鼠標等等!這些設備的特色就是『一次性讀取』的,不能夠截斷輸出。
-
資料接口文件(sockets),[
s
] -
數據輸送文件(FIFO, pipe),[
p
]
FIFO 也是一種特殊的文件類型,他主要的目的在解決多個程序同時存取一個文件所造成的錯誤問題。
Linux 文件擴展名
基本上,Linux 的文件是沒有所謂的『擴展名』的,我們剛剛就談過,一個 Linux 文件能不能被執行,與他的第一欄的十個屬性有關, 與文件名根本一點關系也沒有
。這個觀念跟 Windows 的情況不相同喔!在 Windows 底下, 能被執行的文件擴展名通常是 .com .exe .bat 等等,而在 Linux 底下,只要你的權限當中具有 x 的話,例如[ -rwxr-xr-x ] 即代表這個文件具有可以被執行的能力喔!
具有『
可執行的權限
』以及『具有可執行的程序代碼
』是兩回事!在 Linux 底下,你可以讓一個文本文件,例如我們之前寫的 text.txt 具有『可執行的權限』 (加入 x 權限即可), 但是這個文件明顯的無法執行,因為他不具備可執行的程序代碼!而如果你將上面提到的 cat 這個可以執行的指令,將他的 x 拿掉,那么 cat 將無法被你執行!
我們仍然希望可以藉由擴展名來了解該文件是什么東西,所以, 通常我們還是會以適當的擴展名來表示該文件是什么種類的。底下有數種常用的擴展名:
*.sh
: 腳本或批處理文件 (scripts),因為批處理文件為使用 shell 寫成的,所以擴展名就編成 .sh 啰;*Z, *.tar, *.tar.gz, *.zip, *.tgz
: 經過打包的壓縮文件。這是因為壓縮軟件分別為 gunzip, tar 等等的,由于不同的壓縮軟件,而取其相關的擴展名啰!*.html, *.php
:網頁相關文件,分別代表 HTML 語法與 PHP 語法的網頁文件啰! .html 的文件可使用網頁瀏覽器來直接開啟,至于 .php 的文件, 則可以透過 client 端的瀏覽器來 server 端瀏覽,以得到運算后的網頁結果呢!
基本上,Linux 系統上的文件名真的只是讓你了解該文件可能的用途而已, 真正的執行與否仍然需要權限的規范才行!
例如雖然有一個文件為可執行文件, 如常見的/bin/ls 這個顯示文件屬性的指令,不過,如果這個文件的權限被修改成無法執行時, 那么 ls 就變成不能執行啰!
上述的這種問題最常發生在文件傳送的過程中。例如你在網絡上下載一個可執行文件,但是偏偏在你的 Linux 系統中就是無法執行!呵呵!那么就是可能文件的屬性被改變了!不要懷疑,從網絡上傳送到你的 Linux 系統中,文件的屬性與權限確實是會被改變的喔!
Linux 文件長度限制
在 Linux 底下,使用傳統的 Ext2/Ext3/Ext4 文件系統以及近來被 CentOS 7 當作預設文件系統的 xfs 而言,針對文件的檔名長度限制為:
- 單一文件或目錄的
最大容許文件名
為255bytes
,以一個 ASCII 英文占用一個 bytes 來說,則大約可達 255 個字符長度。若是以每個中文字占用 2bytes 來說, 最大檔名就是大約在 128 個中文字之譜!
Linux 文件名的限制
由于 Linux 在文字接口下的一些指令操作關系,一般來說,你在設定 Linux 底下的文件名時, 最好可以避免一些特殊字符比較好
!例如底下這些:
* ? > < ; & ! [ ] | \ ' " ` ( ) { }
因為這些符號在文字接口下,是有特殊意義的!另外,文件名的開頭為小數點『.』時
, 代表這個文件為『隱藏檔
』喔!同時,由于指令下達當中,常常會使用到 -option
之類的選項, 所以你最好也避免
將文件檔名的開頭以 -
或+
來命名啊!
21.7 Linux 目錄配置
Linux 目錄配置的依據–FHS
Filesystem Hierarchy Standard (FHS)標準,主要目的是希望讓使用者可以了解到已安裝軟件通常放置于那個目錄下, 所以他們希望獨立的軟件開發商、操作系統制作者、以及想要維護系統的用戶,都能夠遵循 FHS 的標準。 也就是說,FHS 的重點在于規范每個特定的目錄下應該要放置什么樣子的數據而已
。 這樣做好處非常多,因為 Linux 操作系統就能夠在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風格。
將目錄定義成為四種交互作用的形態
可分享的(shareable) | 不可分享的(unshareable) | |
---|---|---|
不變的(static) | /usr (軟件放置處) /etc (配置文件) | /opt (第三方協力軟件) /boot (開機與核心檔) |
可變動的(variable) | /var/mail (使用者郵件信箱) /var/run (程序相關) | /var/spool/news (新聞組) /var/lock (程序相關) |
- 可分享的:可以分享給其他系統掛載使用的目錄,所以包括執行文件與用戶的郵件等數據, 是能夠分享給網絡上其他主機掛載用的目錄;
- 不可分享的:自己機器上面運作的裝置文件或者是與程序有關的 socket 文件等, 由于僅與自身機器有關,所以當然就不適合分享給其他主機了。
- 不變的:有些數據是不會經常變動的,跟隨著 distribution 而不變動。 例如函式庫、文件說明文件、系統管理員所管理的主機服務配置文件等等;
- 可變動的:經常改變的數據,例如登錄文件、一般用戶可自行收受的新聞組等。
FHS 針對目錄樹架構僅定義出三層目錄底下應該放置什么數據而已,分別是底下這三個目錄的定義:
- / (root, 根目錄):與開機系統有關;
- /usr (unix software resource):與軟件安裝/執行有關;
- /var (variable):與系統運作過程有關。
這個
root
在 Linux 里面的意義真的很多很多~多到讓人搞不懂那是啥玩意兒。 如果以『賬號
』的角度來看,所謂的 root 指的是『系統管理員!
』的身份, 如果以『目錄
』的角度來看,所謂的 root 意即指的是根目錄
,就是/
啦~ 要特別留意喔!
根目錄 (/) 的意義與內容
根目錄是整個系統最重要的一個目錄
,因為不但所有的目錄都是由根目錄衍生出來的,同時根目錄也與開機/還原/系統修復等動作有關
。由于系統開機時需要特定的開機軟件、核心文件、開機所需程序、函式庫等等文件數據,若系統出現錯誤時,根目錄也必須要包含有能夠修復文件系統的程序才行。 因為根目錄是這么的重要,所以在 FHS 的要求方面,他希望根目錄不要放在非常大的分區槽內, 因為越大的分區槽妳會放入越多的數據,如此一來根目錄所在分區槽就可能會有較多發生錯誤的機會。
因此 FHS 標準建議:根目錄(/)所在分區槽應該越小越好, 且應用程序所安裝的軟件最好不要與根目錄放在同一個分區槽內,保持根目錄越小越好。 如此不但效能較佳,根目錄所在的文件系統也較不容易發生問題。
第一部份:FHS 要求必須要存在的目錄
目錄 | 應放置文件內容 |
---|---|
/bin | 系統有很多放置執行文件的目錄,但/bin 比較特殊。因為/bin 放置的是在單人維護模式下還能夠被操作的指令 。在/bin底下的指令可以被root與一般賬號所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash 等等常用的指令。 |
/boot | 這個目錄主要在放置開機會使用到的文件,包括 Linux 核心文件以及開機選單與開機所需配置文件等等。 Linux kernel 常用的檔名為:vmlinuz ,如果使用的是 grub2 這個開機管理程序, 則還會存在/boot/grub2/這個目錄喔! |
/dev | 在 Linux 系統上,任何裝置與接口設備都是以文件的型態存在于這個目錄當中的。 你只要透過存取這個目錄底下的某個文件,就等于存取某個裝置啰~ 比要重要的文件有/dev/null, /dev/zero, /dev/tty , /dev/loop*, /dev/sd*等等 |
/etc | 系統主要的配置文件幾乎都放置在這個目錄內,例如人員的賬號密碼文件、 各種服務的啟始檔等等。一般來說,這個目錄下的各文件屬性是可以讓一般使用者查閱的, 但是只有 root 有權力修改。FHS建議不要放置可執行文件(binary)在這個目錄中喔 。比較重要的文件有:/etc/modprobe.d/, /etc/passwd, /etc/fstab, /etc/issue 等等。另外 FHS 還規范幾個重要的目錄最好要存在 /etc/ 目錄下喔:- /etc/opt(必要) :這個目錄在放置第三方協力軟件 /opt 的相關配置文件- /etc/X11/(建議) :與 X Window 有關的各種配置文件都在這里,尤其是 xorg.conf 這個 X Server 的配置文件。- /etc/sgml/(建議) :與 SGML 格式有關的各項配置文件- /etc/xml/(建議) :與 XML 格式有關的各項配置文件 |
/lib | 系統的函式庫非常的多,而/lib 放置的則是在開機時會用到的函式庫, 以及在/bin 或/sbin 底下的指令會呼叫的函式庫而已 。 什么是函式庫呢?妳可以將他想成是『外掛』,某些指令必須要有這些『外掛』才能夠順利完成程序的執行之意。 另外 FSH 還要求底下的目錄必須要存在:- /lib/modules/ :這個目錄主要放置可抽換式的核心相關模塊(驅動程序)喔! |
/media | media 是『媒體』的英文,顧名思義,這個/media 底下放置的就是可移除的裝置啦! 包括軟盤、光盤、DVD 等等裝置都暫時掛載于此。常見的檔名有:/media/floppy, /media/cdrom 等等。/mnt 如果妳想要暫時掛載某些額外的裝置,一般建議妳可以放置到這個目錄中。 在古早時候,這個目錄的用途與/media 相同啦!只是有了/media 之后,這個目錄就用來暫時掛載用了。 |
/opt | 這個是給第三方協力軟件放置的目錄 。什么是第三方協力軟件啊? 舉例來說,KDE 這個桌面管理系統是一個獨立的計劃,不過他可以安裝到 Linux 系統中,因此 KDE 的軟件就建議放置到此目錄下了。 另外,如果妳想要自行安裝額外的軟件(非原本的 distribution 提供的),那么也能夠將你的軟件安裝到這里來。 不過,以前的 Linux 系統中,我們還是習慣放置在/usr/local 目錄下呢! |
/run | 早期的 FHS 規定系統開機后所產生的各項信息應該要放置到 /var/run 目錄下 ,新版的 FHS 則規范到/run 底下。 由于 /run 可以使用內存來仿真,因此效能上會好很多! |
/sbin | Linux 有非常多指令是用來設定系統環境的,這些指令只有 root 才能夠利用來『設定』系統,其他用戶最多只能用來『查詢』而已。放在/sbin 底下的為開機過程中所需要的,里面包括了開機、修復、還原系統所需要的指令 。 至于某些服務器軟件程序,一般則放置到/usr/sbin/當中。至于本機自行安裝的軟件所產生的系統執行文件(system binary),則放置到/usr/local/sbin/當中了。常見的指令包括:fdisk, fsck, ifconfig, mkfs 等等。 |
/srv | srv 可以視為『service』的縮寫,是一些網絡服務啟動之后,這些服務所需要取用的數據目錄 。 常見的服務例如 WWW, FTP 等等。舉例來說,WWW 服務器需要的網頁資料就可以放置在/srv/www/里面。不過,系統的服務數據如果尚未要提供給因特網任何人瀏覽的話,預設還是建議放置到 /var/lib 底下即可。 |
/tmp | 這是讓一般用戶或者是正在執行的程序暫時放置文件的地方 。 這個目錄是任何人都能夠存取的,所以你需要定期的清理一下。當然,重要數據不可放置在此目錄啊! 因為 FHS 甚至建議在開機時,應該要將/tmp 下的數據都刪除唷! |
/usr | 第二層 FHS 設定,后續介紹 |
/var | 第二曾 FHS 設定,主要為放置變動性的數據,后續介紹 |
第二部份:FHS 建議可以存在的目錄
目錄 | 應放置文件內容 |
---|---|
/home | 這是系統默認的用戶家目錄(home directory)。在你新增一個一般使用者賬號時, 默認的用戶家目錄都會規范到這里來。比較重要的是,家目錄有兩種代號喔: - ~ :代表目前這個用戶的家目錄- ~dmtsai :則代表 dmtsai 的家目錄! |
/lib | 用來存放與 /lib 不同的格式的二進制函式庫 ,例如支持 64 位的 /lib64 函式庫等 |
/root | 系統管理員(root)的家目錄 。之所以放在這里,是因為如果進入單人維護模式而僅掛載根目錄時, 該目錄就能夠擁有 root 的家目錄,所以我們會希望 root 的家目錄與根目錄放置在同一個分區槽中。 |
事實上 FHS 針對根目錄所定義的標準就僅有上面的咚咚,不過我們的 Linux 底下還有許多目錄你也需要了解一下的。 底下是幾個在 Linux 當中也是非常重要的目錄喔:
第三部份:非FHS 建議的重要目錄
目錄 | 應放置文件內容 |
---|---|
/lost+found | 這個目錄是使用標準的 ext2/ext3/ext4 文件系統格式 才會產生的一個目錄,目的在于當文件系統發生錯誤時, 將一些遺失的片段放置到這個目錄下 。不過如果使用的是 xfs 文件系統的話,就不會存在這個目錄了! |
/proc | 這個目錄本身是一個『虛擬文件系統(virtual filesystem) 』喔!他放置的數據都是在內存當中, 例如系統核心、行程信息(process)、周邊裝置的狀態及網絡狀態等等。因為這個目錄下的數據都是在內存當中, 所以本身不占任何硬盤空間啊!比較重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。 |
/sys | 這個目錄其實跟/proc 非常類似,也是一個虛擬的文件系統,主要也是記錄核心與系統硬件信息較相關的信息 。 包括目前已加載的核心模塊與核心偵測到的硬件裝置信息等等。這個目錄同樣不占硬盤容量喔! |
早期 Linux 在設計的時候,若發生問題時,救援模式通常僅掛載根目錄而已,因此有五個重要的目錄被要求一定要與根目錄放置在一起, 那就是 /etc, /bin, /dev, /lib, /sbin 這五個重要目錄。現在許多的 Linux distributions 由于已經將許多非必要的文件移出 /usr 之外了, 所以 /usr 也是越來越精簡,同時因為 /usr 被建議為『即使掛載成為只讀,系統還是可以正常運作』的模樣,所以救援模式也能同時掛載 /usr 喔! 例如我們的這個 CentOS 7.x 版本在救援模式的情況下就是這樣。因此那個五大目錄的限制已經被打破了呦!例如 CentOS 7.x 就已經將 /sbin, /bin, /lib 通通移動到 /usr 底下了哩!
/usr 的意義與內容
依據 FHS 的基本定義,/usr 里面放置的數據屬于可分享的與不可變動的(shareable, static)
, 如果你知道如何透過網絡進行分區槽的掛載(例如在服務器篇會談到的 NFS 服務器),那么/usr 確實可以分享給局域網絡內的其他主機來使用喔!
很多讀者都會誤會/usr 為 user 的縮寫,其實 usr 是 Unix Software Resource 的縮寫
, 也就是『Unix 操作系統軟件資源
』所放置的目錄,而不是用戶的數據啦!這點要注意。 FHS 建議所有軟件開發者,應該將他們的數據合理的分別放置到這個目錄下的次目錄,而不要自行建立該軟件自己獨立的目錄。
因為是所有系統默認的軟件(distribution 發布者提供的軟件)都會放置到/usr 底下
,因此這個目錄有點類似 Windows 系統的『C:\Windows\ (當中的一部份) + C:\Program files\
』這兩個目錄的綜合體,系統剛安裝完畢時,這個目錄會占用最多的硬盤容量。一般來說,/usr 的次目錄建議有底下這些:
第一部份:FHS 要求必須要存在的目錄
目錄 | 應放置文件內容 |
---|---|
/usr/bin/ | 所有一般用戶能夠使用的指令都放在這里! 目前新的 CentOS 7 已經將全部的用戶指令放置于此,而使用連結檔的方式將 /bin 連結至此! 也就是說, /usr/bin 與 /bin 是一模一樣了!另外,FHS 要求在此目錄下不應該有子目錄! |
/usr/lib/ | 基本上,與 /lib 功能相同,所以 /lib 就是鏈接到此目錄中的! |
/usr/local/ | 系統管理員在本機自行安裝自己下載的軟件(非 distribution 默認提供者) ,建議安裝到此目錄, 這樣會比較便于管理。舉例來說,你的 distribution 提供的軟件較舊,你想安裝較新的軟件但又不想移除舊版, 此時你可以將新版軟件安裝于/usr/local/目錄下,可與原先的舊版軟件有分別啦! 你可以自行到/usr/local 去看看,該目錄下也是具有 bin, etc, include, lib…的次目錄喔! |
/usr/sbin/ | 非系統正常運作所需要的系統指令 。最常見的就是某些網絡服務器軟件的服務指令(daemon)啰!不過基本功能與 /sbin 也差不多, 因此目前 /sbin 就是鏈接到此目錄中的。 |
/usr/share/ | 主要放置只讀架構的數據文件 ,當然也包括共享文件。在這個目錄下放置的數據幾乎是不分硬件架構均可讀取的數據, 因為幾乎都是文本文件嘛!在此目錄下常見的還有這些次目錄:- /usr/share/man:聯機幫助文件 - /usr/share/doc:軟件雜項的文件說明 - /usr/share/zoneinfo:與時區有關的時區文件 |
第二部份:FHS 建議可以存在的目錄
目錄 | 應放置文件內容 |
---|---|
/usr/games/ | 與游戲比較相關的數據放置處 |
/usr/include/ | c/c++等程序語言的檔頭(header)與包含檔(include)放置處,當我們以 tarball 方式 (*.tar.gz 的方式安裝軟件)安裝某些數據時,會使用到里頭的許多包含檔喔! |
/usr/libexec/ | 某些不被一般使用者慣用的執行檔或腳本(script)等等,都會放置在此目錄中。例如大部分的 X 窗口底下的操作指令, 很多都是放在此目錄下的。 |
/usr/lib/ | 與 /lib/功能相同,因此目前 /lib 就是鏈接到此目錄中 |
/usr/src/ | 一般原始碼建議放置到這里 ,src 有 source 的意思。至于核心原始碼則建議放置到/usr/src/linux/目錄下。 |
/var 的意義與內容
如果/usr 是安裝時會占用較大硬盤容量的目錄,那么/var 就是在系統運作后才會漸漸占用硬盤容量的目錄。 因為/var 目錄主要針對常態性變動的文件,包括快取(cache)、登錄檔(log file)以及某些軟件運作所產生的文件, 包括程序文件(lock file, run file),或者例如 MySQL 數據庫的文件等等。常見的次目錄有:
第一部份:FHS 要求必須要存在的目錄
目錄 | 應放置文件內容 |
---|---|
/var/cache/ | 應用程序本身運作過程中會產生的一些暫存檔 ; |
/var/lib/ | 程序本身執行的過程中,需要使用到的數據文件放置的目錄 。在此目錄下各自的軟件應該要有各自的目錄。 舉例來說,MySQL 的數據庫放置到/var/lib/mysql/而 rpm 的數據庫則放到/var/lib/rpm 去! |
/var/lock/ | 某些裝置或者是文件資源一次只能被一個應用程序所使用,如果同時有兩個程序使用該裝置時, 就可能產生一些錯誤的狀況,因此就得要將該裝置上鎖(lock),以確保該裝置只會給單一軟件所使用。舉例來說,刻錄機正在刻錄一塊光盤,你想一下,會不會有兩個人同時在使用一個刻錄機燒片? 如果兩個人同時刻錄,那片子寫入的是誰的資料?所以當第一個人在刻錄時該刻錄機就會被上鎖, 第二個人就得要該裝置被解除鎖定(就是前一個人用完了)才能夠繼續使用啰。目前此目錄也已經挪到/run/lock 中 ! |
/var/log/ | 重要到不行 !這是登錄文件放置的目錄!里面比較重要的文件如/var/log/messages, /var/log/wtmp(記錄登入者的信息)等。 |
/var/mail/ | 放置個人電子郵件信箱的目錄,不過這個目錄也被放置到/var/spool/mail/目錄中! 通常這兩個目錄是互為鏈接文件啦! |
/var/run/ | 某些程序或者是服務啟動后,會將他們的 PID 放置在這個目錄下喔!至于 PID 的意義我們會在后續章節提到的。 與 /run 相同,這個目錄鏈接到 /run 去了! |
/var/spool/ | 這個目錄通常放置一些隊列數據 ,所謂的『隊列』就是排隊等待其他程序使用的數據啦!這些數據被使用后通常都會被刪除。舉例來說,系統收到新信會放置到/var/spool/mail/中, 但使用者收下該信件后該封信原則上就會被刪除。信件如果暫時寄不出去會被放到/var/spool/mqueue/中, 等到被送出后就被刪除。如果是工作排程數據(crontab),就會被放置到/var/spool/cron/目錄中! |
建議在你讀完整個基礎篇之后,可以挑戰 FHS 官方英文文件,相信會讓你對于Linux 操作系統的目錄有更深入的了解喔!
針對 FHS,各家 distributions 的異同,與 CentOS7 的變化
由于 FHS 僅是定義出最上層(/)及次層(/usr, /var)的目錄內容應該要放置的文件或目錄數據, 因此,在其他次目錄層級內,就可以隨開發者自行來配置了。舉例來說,CentOS 的網絡設定數據放在/etc/sysconfig/network-scripts/ 目錄下,但是 SuSE 則是將網絡放置在 /etc/sysconfig/network/ 目錄下,目錄名稱可是不同的呢!不過只要記住大致的 FHS 標準,差異性其實有限啦
CentOS 7 在目錄的編排上與過去的版本不同喔!
- /bin --> /usr/bin
- /sbin --> /usr/sbin
- /lib --> /usr/lib
- /lib64 --> /usr/lib64
- /var/lock --> /run/lock
- /var/run --> /run
目錄樹(directory tree)
所有的文件與目錄都是由根目錄開始的!那是所有目錄與文件的源頭~ 然后再一個一個的分支下來,有點像是樹枝狀啊~因此,我們也稱這種目錄配置方式為:『目錄樹(directory tree)
』 這個目錄樹有什么特性呢?他主要的特性有:
- 目錄樹的啟始點為根目錄 (/, root);
- 每一個目錄不止能使用本地端的 partition 的文件系統,也可以使用網絡上的 filesystem 。舉例來說, 可以利用 Network File System (NFS) 服務器掛載某特定目錄等。
- 每一個文件在此目錄樹中的文件名(包含完整路徑)都是獨一無二的。
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)