1. 程式人生 > >Linux 的檔案許可權與目錄配置

Linux 的檔案許可權與目錄配置

小引

It’s very easy to make the mistake of quickly dismissing a coworker’s idea so that you can present your own, but when you commit this grievous error in judgment, you’ll often find them deaf to your own ideas because you’ve made them feel unimportant. If you want people to accept your ideas and think them valuable, you have to extend the same courtesy first. You can never win a person’s heart if you do not leave their pride intact.此文源自

《Soft Skills The software developer’s life manual》

破船譯:我們經常犯的一個錯誤就是輕率的否決他人的意見,以便提出自己的想法。但是當你作出這樣錯誤的舉措時,會發現別人對你的想法充耳不聞,因為你讓他們覺得自己無足輕重,沒有受到尊重。如果希望人們接受並認可你的想法,你必須首先尊重別人,如果你做不到的話,那永遠得不到別人的認同。

最近在學習 Docker,Docker 緣起於 Linux,自然需要一些 Linux 的知識才好,所以學習 Docker 過程中,順道學習一下 Linux 的基礎知識,此文就是我學習《鳥哥的 Linux 私房菜》的讀書筆記

之一(後續還會有幾篇)。

檔案許可權

簡介

Linux最優秀的地方之一就在於他的多使用者多工環境。而為了讓各個使用者具有較保密的檔案資料,因此檔案的許可權管理就變的很重要了。 Linux一般將檔案可存取的身份分為三個類別,分別是 owner/group/others,且三種身份各有 read/write/execute 等許可權。

檔案許可權的檢視

在終端,輸入 ls -al 可以就可以看到檔案的許可權資訊

123
-rw-r--r--   1 BeyondVincent  staff      9  8 29 11:26 README.md-rw-r--r--   1 BeyondVincent  staff  21723
9 26 18:51 pom.xmldrwxr-xr-x 3 BeyondVincent staff 102 8 31 17:34 src

在上面的第一欄中-rw-r--r--,有十個字元,表示了檔案的型別和許可權資訊。

  • 第一個字元表示檔案的型別d:目錄 -:檔案
  • 接著以 3 字元個為一組,並且都是rwx的組合。其中,[ r ]代表可讀 (read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個 許可權的位置不會改變,如果沒有許可權,就會出現減號[ - ]。
    • 第一組為檔案擁有者所具備的許可權。README.md 檔案為 rw-,表示可讀寫,不可執行。
    • 第二組為加入該群組(staff)的賬號的許可權。
    • 第三組為沒有加入該群組(staff)的其他賬號的許可權。

ls 是 list 的意思,選項 “-al” 則表示列出所有的檔案詳細的許可權與屬性

檔案的許可權字元為:“- rwxrwxrwx”,共 3 種身份(owner/group/others),9 個許可權。

檔案許可權的修改

檔案許可權對於系統的安全性非常重要,下面是幾個常見的許可權修改命令:

  • chgrp(change group) : 改變檔案所屬群組。範例:chgrp groupname filename
  • chown(change owner) : 改變檔案擁有者。範例:chown username filename
  • chmod : 改變檔案的許可權, SUID, SGID, SBIT等的特性。可以通過數字或者符號進行許可權的改變。
    • 數字:九個許可權,3 個一組,每組的數值分別累加,即可算出對應的數字。許可權分數對照表為(r:4 w:2 x:1)。例如當檔案許可權為: [-rwxrwx—] 數字是owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others= --- = 0+0+0 = 0,所以檔案許可權就為 770。範例:chmod 777 filename
    • 符號:藉助u(user),g(group),o(others),a(all),代表身份,rwx代表權限,來對檔案許可權進行修改。範例:將檔案許可權設定為“-rwxr-xr-x”的命令chmod u=rwx,go=rx filename。也可以使用+或者-,例如對檔案增加每個人都能寫入的許可權:chmod a+w filename

chgrp 和 chown 常用於將檔案複製給其他人使用時,在複製過程中,會複製執行者的屬性和許可權,所以需要對檔案許可權進行修改,他人才能正常使用複製的檔案。

目錄配置

Linux 目錄配置的依據是 FHS(Filesystem Hierarchy Standard:檔案系統層次標準),FHS 的重點在於規範每個目錄下應該要放置什麼資料。FHS 依據檔案系統使用的頻繁與否與是否允許使用者隨意改動,將目錄定義為四種互動作用的形態:可分享的、不可分享的、不變的和可變的。

FHS針對目錄樹架構僅定義出三層目錄下面應該放置什麼資料,分別是下面這三個目錄的定義:

  • /:(root, 根目錄):與開機系統有關;

FHS 要求在根目錄/下面必須存在的目錄為:

  1. /bin:該目錄放置的是在單人維護模式下還能夠被操作的指令。 在 /bin 下面的指令可以被 root 和一般帳號所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等常 用的指令。
  2. /boot:這個目錄主要儲存開機時使用到的檔案,包括 Linux 核心檔案以及開機選單與開機所需配置檔案等。
  3. /dev:在 Linux 系統上,任何裝置與周邊裝置都是以檔案的型態存在於這個目錄中。
  4. /etc:系統主要的配置檔案幾乎都放置在這個目錄內,例如人員的帳號密碼、 各種服務的啟動等。FHS 不建議將可執行檔案放在這個目錄,比較重要的檔案有: /etc/modprobe.d/, /etc/passwd, /etc/fstab, /etc/issue 等。另外 FHS 也要求 opt 必須放在該目錄下 (/etc/opt)。
  5. /lib:該目錄主要存放在開機時會用到的函式庫, 以及在 /bin 或 /sbin 下面的指令會呼叫到的函式庫。另外,FHS 還要求該目錄下有用於存放驅動程式的目錄:/lib/modules/。
  6. /media:這個目錄下面放置可移除的裝置, 包括軟盤、光碟、DVD等等裝置都暫時掛載於此。
  7. /mnt:用於暫時掛載某些額外的裝置。
  8. /opt:用於儲存第三方軟體。
  9. /run:系統開機後所產生的各項資訊存放在此目錄。
  10. /sbin:存放開機過程中所需要的,裡面包括了開機、修復、還原系統所需要的指令。
  11. /srv:是一些網路服務啟動之後,這些服務所需要 讀取的資料目錄。
  12. /tmp:一般使用者或者是正在執行的程式暫時放置檔案的地方。 這個目錄任何人都能夠存取。FHS 建議在開機的時候將該目錄的資料刪除。
  13. /usr:用於存放作業系統的軟體資源。
  14. /var:用於儲存經常變動的檔案。

FHS 建議在根目錄/下可以存在的目錄有:

  1. /home:系統預設的使用者主資料夾。
  2. /lib<qual>:用來存放與 /lib 不同的格式的二進位制函式庫,例如支援 64 位的 /lib64 函式庫等。
  3. /root:系統管理員(root)的主資料夾。

在根目錄,除了 FHS 定義的以上目錄外,還有一些目錄,需要知道:

  1. /lost+found:使用標準的 ext2/ext3/ext4 檔案系統格式才會產生的一個目錄。目的在於當檔案系統發生錯誤時,將一些遺失的片段放置到這個目錄下。
  2. /proc:這個目錄是一個虛擬檔案系統,它儲存的資料位於記憶體中(不佔任何硬碟容量),例如系統核心、行程資訊(process)、周邊裝置的 狀態及網路狀態等。
  3. /sys:與 /proc 類似,也是一個虛擬檔案系統,主要也是記錄 核心與系統硬體資訊較相關的資訊。同樣不佔硬碟容量。
  • /usr:該目錄與軟體安裝/執行有關。/usr 裡面放置的資料屬於可分享的與不可變動的(shareable, static)。usr 並不是 user 的縮寫,而是 Unix Software Resource的縮寫,也就是 Unix 作業系統軟體資源存放的目錄。FHS 建議 所有軟體開發者,應該將軟體的資料合理的分別放置到這個目錄下的次目錄,而不要自行建立該軟體自己獨立的目錄。該目錄有點類似 Windows系統的 “C:\Windows\ (當中的一部份) + C:\Program files\” 這兩個目 錄的綜合體。

FHS 要求在目錄/usr下面必須存在的目錄有:

  1. /usr/bin/:所有一般使用者能夠使用的指令都放在這裡。FHS 要求在此目錄下不應該有子目錄。
  2. /usr/lib/:該目錄基本上,與 /lib 功能相同,/lib 就是連結到此目錄中的。
  3. /usr/local/:系統管理員在本機安裝自己下載的軟體(非distribution預設提供者)時,建議安裝到此目錄, 這樣便於管理。該目錄下也是具有 bin、etc、 include 和 lib等次目錄。
  4. /usr/sbin/:非系統正常執行所需要的系統指令。最常見的就是某些網路伺服器軟體的服務指令(daemon)。功能與 /sbin 差不多, 因此目前 /sbin 就是連結到此目錄中的。
  5. /usr/share/:主要放置只讀架構的資料檔案,也包括共享檔案。在這個目錄下放置的資料幾乎都是文字文 件,在此目錄下常見的還有這些次目錄:/usr/share/man(線上說明文件), /usr/share/doc(軟體雜項的檔案說明), /usr/share/zoneinfo(與時區有關的時區檔案)。

FHS 建議在目錄/usr下可以存在的目錄有:

  1. /usr/games/:與遊戲相關的資料。
  2. /usr/include/:C/C++等程式用到的標頭檔案存放於此。
  3. /usr/libexec/:存放不常用的一些指令碼或可執行檔案。
  4. /usr/lib<qual>/:與 /lib/ 功能相同,目前 /lib 就是連結到此目錄中。
  5. /usr/src/:一般原始碼存放於此。核心原始碼建議存放在 /usr/src/linux/ 目錄。
  • /var(variable):與系統執行過程有關。如果 /usr 是安裝時會佔用較大硬碟容量的目錄,那麼/var 就是在系統執行後才會漸漸佔用硬碟容量的目錄。

FHS 要求在目錄/usr下面必須存在的目錄有:

  1. /var/cache/:應用程式本身執行過程中會產生的一些臨時資料。
  2. /var/lib/:程式本身執行的過程中,需要使用到的資料檔案放置的目錄。在此目錄下各自的軟體應該要有各自的目錄。
  3. /var/lock/:需要獨佔的資源或者裝置。目前此目錄也已經挪到 /run/lock 中。
  4. /var/log/:登入檔案存放的位置。
  5. /var/mail/:放置個人電子郵件信箱的目錄。這個目錄也被放置到 /var/spool/mail/ 目錄中,通常這兩個目錄是互為連結檔案。
  6. /var/run/:某些程式或者是服務啟動後,會將他們的PID放置在這個目錄。
  7. /var/spool/:這個目錄通常放置一些佇列資料,所謂的“佇列”就是排隊等待其他程式使用的資料。

FHS 僅定義出最上層 / 及次層 /usr/var 的目錄內容應該要放置的檔案或目錄資料,在其他次目錄層級內,就可以隨開發者自行來配置。

在 Linux 中,所有的檔案和目錄都是從根目錄開始的,根目錄是所有檔案和目錄的源頭,然後一個一個的分支往下擴散,我們稱這種配置方式為:目錄樹 (directory tree)。這顆目錄樹的特點:

  1. 目錄樹的啟始點為根目錄 (/, root)。
  2. 每一個目錄不僅可以使用本地端的 partition 的檔案系統,也可以使用網路上的 filesystem。
  3. 每一個檔案在此目錄樹中的檔名(包含完整路徑)都是獨一無二的。

Linux 的目錄樹架構示意圖
image