Linux運維四:文件屬性及文件權限


一:文件屬性

我們使用ls -lhi命令來查看文件時,會列出一堆的文件屬性,如:

[root@Gin day7]# ll -hi
total 7.8M
260674     -rw-r--r--   1     root   root      608      Jan 27 09:44     group
260683     ----------   1     root   root      495      Jan 27 09:44     gshadow
260623     -rw-r--r--   1     root   root      1.2K     Jan 27 09:43     passwd
260693     -rw-r--r--   1     root   root      7.8M     Jan 27 09:46     policy.24
260625     ----------   1     root   root      964      Jan 27 09:43     shadow
#第一列     #第二列    #第三列  #第四列  #第五列    #第六列    #第七列       #第八列

上面的第x列是筆者手動標記的!那么這八列的文件屬性各代表什么意思呢?

第一列:inode(index node)索引節點編號:它是文件或目錄,在磁盤里的唯一標識,linux讀取文件首先要讀取到這個索引節點。相當於書的目錄。(詳細介紹在下面)

第二列:文件類型及文件權限

第一個字符表示文件類型(如上面代碼中第二列的第一個字符 - )

d:表示是一個目錄,事實上在ext2fs中,目錄是一個特殊的文件。

-:表示這是一個普通的文件。

l: 表示這是一個符號鏈接文件,實際上它指向另一個文件。

b、c:分別表示區塊設備和其他的外圍設備,是特殊類型的文件。

s、p:這些文件關系到系統的數據結構和管道,通常很少見到。

從第二個字符到最后共9(第2-10個字符)個字符,三個字符為一段:rw-r--r--

第11個字符:. 與selinux相關,有這個點表示selinux開啟,沒有這個點表示selinux關閉

第三列:1 表示文件的硬鏈接數。硬鏈接是文件的第二個入口!

第四列:root 文件對應的屬主或者用戶

第五列:root 文件對應的用戶組或屬組

第六列:文件大小,后面沒帶單位的都表示字節

第七列:表示文件最后修改的時間

下面詳細介紹這幾列:

索引節點 inode

1:inode簡介

理解inode,要從文件儲存說起。文件儲存在硬盤上,硬盤的最小存儲單位叫做"扇區"(Sector)。每個扇區儲存512字節(相當於0.5KB)。操作系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是文件存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個 block。文件數據都儲存在"塊"中,那么很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。

2:inode的內容

 inode包含文件的元信息,具體來說有以下內容:

    * 文件的字節數

    * 文件擁有者的User ID

    * 文件的Group ID

    * 文件的讀、寫、執行權限

    * 文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。

    * 硬鏈接數,即有多少文件名指向這個inode

    * 文件數據block的位置

可以用stat命令,查看某個文件的inode信息:

[root@Gin day7]# stat group 
  File: `group'
  Size: 608             Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 260674      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-01-27 09:44:02.846298095 +0800
Modify: 2017-01-27 09:44:02.846298095 +0800
Change: 2017-01-27 09:44:02.846298095 +0800

Access:訪問時間 (-atime)

Modify:修改時間,內容發生變化(-mtime)

Change:變化時間,包含Modify,權限,屬主,用戶組 (-ctime)

總之,除了文件名以外的所有文件信息,都存在inode之中。至於為什么沒有文件名,下文會有詳細解釋。

3:inode的大小

inode也會消耗硬盤空間,所以硬盤格式化的時候,操作系統自動將硬盤分成兩個區域。一個是數據區,存放文件數據;另一個是inode區(inode table),存放inode所包含的信息。

一個文件被創建后至少要占用一個inode和一個block。如果一個文件很大,可能占多個block(4k);如果文件很小,也要至少占一個block,並且剩余空間不可以使用!

 每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設置一個inode。假定在一塊1GB的硬盤中,每個inode節點的大小為128字節,每1KB就設置一個inode,那么inode table的大小就會達到128MB,占整塊硬盤的12.8%。

查看每個硬盤分區的inode總數和已經使用的數量,可以使用df命令。

[root@gin day1]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      479552 54034 425518   12% /
tmpfs          128584     1 128583    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot

查看每個inode節點的大小,可以用如下命令:

[root@gin day1]# dumpe2fs -h /dev/sda1 | grep "Inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               128

由於每個文件都必須有一個inode,因此有可能發生inode已經用光,但是硬盤還未存滿的情況。這時,就無法在硬盤上創建新文件。

4:inode號碼

每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。這里值得重復一遍,Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。對於系統來說,文件名只是inode號碼便於識別的別稱或者綽號。表面上,用戶通過文件名,打開文件。實際上,系統內部這個過程分成三步:首先,系統找到這個文件名對應的inode號碼;其次,通過inode號碼,獲取inode信息;最后,根據inode信息,找到文件數據所在的block,讀出數據。

使用ls -i命令,可以看到文件名對應的inode號碼:

[root@gin day1]# ls -i group
24826 group

5:目錄文件

Unix/Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件。目錄文件的結構非常簡單,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號碼。

ls命令只列出目錄文件中的所有文件名, ls -i命令列出整個目錄文件,即文件名和inode號碼!

理解了上面這些知識,就能理解目錄的權限。目錄文件的讀權限(r)和寫權限(w),都是針對目錄文件本身(即不同用戶能以什么權限訪問操作對該目錄文件,例如這里不同用戶對tmp目錄文件(d可以查出tmp是目錄文件,d表示directory,即目錄)分別為rwxr-xr-x,第一組的三個字符,即rwx,表示文件擁有者用戶的對該文件的讀寫權限,第二組的三個字符,即r-x,表示文件擁有者用戶所在的用戶組里的其他用戶對該文件的讀寫權限,第三組的三個字符,即r-x,表示文件擁有者用戶所在的用戶組以外的用戶對該文件的讀寫權限。一個某個用戶下運行的進程訪問操作該目錄文件只能以該用戶所具有的對該目錄文件的權限進行操作)。由於目錄文件內只有文件名和inode號碼,所以如果只有讀權限,只能獲取文件名,無法獲取其他信息,因為其他信息都儲存在inode節點中,而讀取inode節點內的信息需要目錄文件的執行權限(x)。

6:硬鏈接(hard link)

一般情況下,文件名和inode號碼是"一一對應"關系,每個inode號碼對應一個文件名。但是,Unix/Linux系統,允許多個文件名指向同一個inode號碼。這意味着,可以用不同的文件名訪問同樣的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問。這種情況就被稱為"硬鏈接"(hard link)

ln命令可以創建硬鏈接:

[root@localhost /]# ln 源文件 目標文件 

運行上面這條命令以后,源文件與目標文件的inode號碼相同,都指向同一個inode。如:

[root@Gin day7]# ln passwd mypasswd
260623 -rw-r--r-- 2 root root 1184 Jan 28 09:51 mypasswd
260623 -rw-r--r-- 2 root root 1184 Jan 28 09:51 passwd
## inode號碼都是260623

inode信息中有一項叫做"鏈接數",記錄指向該inode的文件名總數,這時就會增加1。反過來,刪除一個文件名,就會使得inode節點中的"鏈接數"減1。當這個值減到0,表明沒有文件名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。

     這里順便說一下目錄文件的"鏈接數"。創建目錄時,默認會生成兩個目錄項:"."和".."。前者的inode號碼就是當前目錄的inode號碼,等同於當前目錄的"硬鏈接";后者的inode號碼就是當前目錄的父目錄的inode號碼,等同於父目錄的"硬鏈接"。所以,任何一個目錄的"硬鏈接"總數,總是等於2加上它的子目錄總數(含隱藏目錄),這里的2是父目錄對應的“硬鏈接”和當前目錄下的".硬鏈接“。

7:軟鏈接(soft link)

除了硬鏈接以外,還有一種特殊情況。文件A和文件B的inode號碼雖然不一樣,但是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向文件B。因此,無論打開哪一個文件,最終讀取的都是文件B。這時,文件A就稱為文件B的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)。

    這意味着,文件A依賴於文件B而存在,如果刪除了文件B,打開文件A就會報錯:"No such file or directory"。這是軟鏈接與硬鏈接最大的不同:文件A指向文件B的文件名,而不是文件B的inode號碼,文件B的inode"鏈接數"不會因此發生變化。

ln -s命令可以創建軟鏈接:

[root@localhost /]# ln -s 源文文件或目錄 目標文件或目錄  

8:inode的特殊作用

由於inode號碼與文件名分離,這種機制導致了一些Unix/Linux系統特有的現象。

    1. 有時,文件名包含特殊字符,無法正常刪除。這時,直接刪除inode節點,就能起到刪除文件的作用。

    2. 移動文件或重命名文件,只是改變文件名,不影響inode號碼。

    3. 打開一個文件以后,系統就以inode號碼來識別這個文件,不再考慮文件名。因此,通常來說,系統無法從inode號碼得知文件名。

    3點使得軟件更新變得簡單,可以在不關閉軟件的情況下進行更新,不需要重啟。因為系統通過inode號碼,識別運行中的文件,不通過文件名。更新的時候,新版文件以同樣的文件名,生成一個新的inode,不會影響到運行中的文件。等到下一次運行這個軟件的時候,文件名就自動指向新版文件,舊版文件的inode則被回收。

通過inode號碼刪除文件舉例:

[root@Gin day7]# ll -i
total 4
260623 -rw-r--r-- 1 root root 1184 Jan 28 09:51 passwd
[root@Gin day7]# find ./ -inum 260623|xargs rm -f
[root@Gin day7]# ll
total 0

9:實際問題

在一台配置較低的Linux服務器(內存、硬盤比較小)的/data分區內創建文件時,系統提示磁盤空間不足,用df -h命令查看了一下磁盤使用情況,發現/data分區只使用了66%,還有12G的剩余空間,按理說不會出現這種問題。 后來用df -i查看了一下/data分區的索引節點(inode),發現已經用滿(IUsed=100%),導致系統無法創建新目錄和文件。

     查找原因:

1):可能是/data/cache目錄中存在數量非常多的小字節緩存文件,占用的Block不多,但是占用了大量的inode。

2):企業工作中郵件臨時隊列 /var/spool/clientmquene 這里很容易被大量小文件占滿導致 No space left on device錯誤。clientmquene目錄只有安裝了sendmail服務,才會有。CentOS5系列的系統會默認安裝sendmail服務,因此郵件臨時存放地點的路徑是:/var/spool/clientmqueue/。CentOS6默認情況下沒有安裝sendmail服務,而是改裝了postfix服務,因此郵件存放地點的路徑為 /var/spool/postfix/maildrop/。

3):以上目錄被空間垃圾文件占滿導致inode數量不夠用!

    解決方案:

  1.刪除/data/cache目錄中的部分文件,釋放出/data分區的一部分inode。

  2.用軟連接將空閑分區/opt中的newcache目錄連接到/data/cache,使用/opt分區的inode來緩解/data分區inode不足的問題:

[root@localhost /]# ln -s /opt/newcache /data/cache

手動清理方法如下:

[root@gin day1]# find /var/spool/clientmqueue/ -type f |xargs rm -f
[root@gin day1]# find /var/spool/postfix/maildrop/ -type f |xargs rm -f

block相關知識

1):磁盤讀取數據是按block為單位讀取的

2):一個文件可能占用多個block。每讀取一個block就會消耗一次磁盤I/O

3):如果要提升磁盤IO屬性,那么就要盡可能一次性讀取數據盡量的多。

4):一個block只能存放一個文件的內容,無論內容有多小。如果block 4k,存放1K的文件,剩余3K就浪費了。

5)Block並非越大越好。Block太大對於小文件存放就會浪費磁盤空間,例如:1000K的文件,BLOCK為4K,占用250個BLOCK,BLOCK為1K,占用1000個BLOCK。訪問效率誰更高?消耗IO分別為250次和1000次。

6):大文件(大於16K)一般設置BLOCK大一點,小文件(小於1K)一般設置BLOCK小一點。

7)BLOCK太大,如4K,文件都是0.1K,大量浪費磁盤空間

8)BLOCK太小,如1K,文件都1000K,消耗磁盤IO

9)BLOCK的設置也是格式化分區的時候,mfs.ext4 -b 2018 -I 256 /dev/sdb

10):文件較大時,block設置大一些會提升磁盤訪問效率

11)ext3/ext4文件一般設置為4K

當前的生產環境一般設置為4K。特殊業務,如視頻文件可加大block大小

在創建文件系統時,可以使用-b參數改變block大小;-I參數改變inode節點的大小:

[root@Gin day7]# mkfs.ext4 -b 2048 -I 256 /dev/sdb

但實際工作中,一般都不需要去修改,使用默認的即可!

企業面試題:

一個100M(100000K)的磁盤分區,分別寫入1K的文件與寫入1M的文件,分別可以寫多個個?

錯誤解答:很容易計算1K的個數:100*1000=10000個,1M文件的個數:100/1=100個

假設 B 4K 寫入1K文件的數量
假設 inode 數量夠多的時候,就是BLOCK的數量。浪費3/4的容量
假設 inode 數量小於block的數量,就是inode的數量。浪費3/4的容量
假設 B 4K 硬盤空間多大,基本上就可以寫入100/1M數量,一般情況inode和block都是做夠

解答時需要解答下面的知識點:
a:上面的面試題考查的是文件系統inode和block的知識
b:Inode是存放文件屬性信息的(也包含指向文件實體的指針),默認大小128byte(c58),256byte(c64)
c:Block是存放文件實際內容的,默認大小1K(boot)或4K(非系統分區默認給4K),一般企業多用4K的block
d:一個文件至少要占用一個inode及一個block
e:默認較大分區常規企業真實場景情況下,inode數量是足夠的而block數量會消耗的更快。

正確解答:

1:默認分區常規情況下,對大文件來講inode是足夠的,而block數量消耗的會更快;block為4K的情況,1M的文件不會有磁盤浪費情況,所以文件數量大概為100/1=100個

2:對於小文件0.1K,inode會消耗的更快。默認分區的時候block數量是大於inode數量的,每個小文件都會占用一個inode和一個block。所以最終文件的數量:inode會先消耗完,文件總量是inode的數量。

文件類型與擴展名

基本上,Linux的文件是沒有所謂的『擴展名』的,一個Linux文件能不能被執行,與x有關,與文件名根本一點關系也沒有。這個觀念跟Windows 的情況不相同!在Windows 底下,能被執行的檔案擴展名通常是 .com .exe .bat 等,而在Linux下,只要你的權限當中具有 x的話,例如[ -rwx-r-xr-x ] 即代表這個文件可以被執行!但是能執行與能執行成功是不同的。雖然擴展名不起作用但是我們還是希望可以由擴展名了解此文件是什么東西。如:

  • .sh : 腳本或者批處理文件(scripts)
  • .Z  .tar  .tar.gz  .zip  .tgz : 經過打包的壓縮文件
  • .html  .php :網頁相關文件

linux的文件類型分為:

b      block (buffered) special
c      character (unbuffered) special
d      directory
p      named pipe (FIFO)
f      regular file
l      symbolic link; this is never true if the -L  option  or  the  -follow
       option is in effect, unless the symbolic link is broken.  If you want
       to search for symbolic links when -L is in effect, use -xtype.
s      socket
D      door (Solaris)

1:普通文件(regular file

[root@localhost ~]# ls -lh install.log
-rw-r--r-- 1 root root 53K 03-16 08:54 install.log

普通文件包含純文本文件,二進制文件,數據格式文件;具體是什么類型的普通文件,可通過file命令查看:

[root@Gin day7]# file group 
group: ASCII text

2:目錄

[root@localhost ~]# ls -lh
總計 14M
-rw-r--r-- 1 root root     2 03-27 02:00 fonts.scale
-rw-r--r-- 1 root root   53K 03-16 08:54 install.log
-rw-r--r-- 1 root root   14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17
drwxr-xr-x 2 root root  4.0K 04-19 10:53 mydir
drwxr-xr-x 2 root root  4.0K 03-17 04:25 Public

我們在某個目錄下執行ll命令,看到有類似 drwxr-xr-x ,第一個字符以d開頭的的文件就是目錄,目錄在Linux是一個比較特殊的文件。注意它的第一個字符是d。創建目錄的命令可以用 mkdir 命令,或cp命令,cp可以把一個目錄復制為另一個目錄。刪除用rm 或rmdir命令。

3:字符設備或塊設備文件

如果您進入/dev目錄,列一下文件,會看到類似如下的:

[root@localhost ~]# ls -la /dev/tty
crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty
[root@localhost ~]# ls -la /dev/hda1
brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1

我們看到/dev/tty的屬性是 crw-rw-rw- ,注意前面第一個字符是 c ,這表示字符設備文件。比如貓等串口設備

我們看到 /dev/hda1 的屬性是 brw-r----- ,注意前面的第一個字符是b,這表示塊設備,比如硬盤,光驅等設備;

這個種類型的文件,是用mknode來創建,用rm來刪除。目前在最新的Linux發行版本中,我們一般不用自己來創建設備文件。因為這些文件是和內核相關聯的。

4:套接口文件

當我們啟動MySQL服務時,會產生一個mysql.sock的文件。

[root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock

注意這個文件的屬性的第一個字符是 s。我們了解一下就行了。

5:符號鏈接文件

[root@localhost ~]# ls -lh setup.log
lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install.log

當我們查看文件屬性時,會看到有類似 lrwxrwxrwx,注意第一個字符是l,這類文件是鏈接文件。是通過ln -s 源文件名 新文件名。上面是一個例子,表示setup.log是install.log的軟鏈接文件。怎么理解呢?這和Windows操作系統中的快捷方式有點相似。

符號鏈接文件的創建方法舉例;

[root@localhost ~]# ls -lh kernel-6.15-1.2025_FC5.i686.rpm
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
[root@localhost ~]# ln -s kernel-6.15-1.2025_FC5.i686.rpm  kernel.rpm
[root@localhost ~]# ls -lh kernel*
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
lrwxrwxrwx 1 root root  33 04-19 11:27 kernel.rpm -> kernel-6.15-1.2025_FC5.i686.rpm

硬鏈接與軟鏈接

硬鏈接知識小結

1:具有相同的inode節點的多個文件是互為硬鏈接文件

2:刪除硬鏈接文件或刪除源文件任意之一,文件實體並不受影響

3:只有刪除了源文件及所有對應的硬鏈接文件,文件實體才會被刪除

4:當所有的硬鏈接文件及源文件被刪除后,再存放新的數據會占用這個文件的空間或者磁盤fsck檢查的時候,刪除的數據也會被系統回收

5:硬鏈接文件就是文件的另一個入口(相當於超市的前門后門)

6:可以通過給文件設置硬鏈接文件,來防止重要文件被誤刪除

7:通過執行命令“ln 源文件 硬鏈接文件”,可完成創建硬鏈接

8:硬鏈接文件可以用rm命令刪除

9:對於靜態文件(沒有進程正在調用的文件)來講,當對應硬鏈接數為0(i_link),文件就被刪除。i_link的查看方法:ls -l

軟鏈接知識小結

軟鏈接原理圖:

1)軟件鏈接類似windows的快捷方式(可以通過readlink查看其指向)

2)軟鏈接類似一個文本文件,里面存放的是源文件的路徑,指向源文件實體

3)刪除源文件,軟鏈接依然存在,但是無法訪問指向的源文件路徑內容

4)失效的時候一般是白字紅底閃爍提示

 

5)執行命令“ln -s 源文件 軟鏈接文件”,即可完成創建軟鏈接

6)軟鏈接和源文件是不同類型的文件,也是不同的文件,inode號也不相同

7)刪除軟鏈接文件可以用rm命令。

目錄鏈接知識小結

1)對於目錄,不可以創建硬鏈接,但可以創建軟鏈接

2)對於目錄的軟鏈接是生產場景運維中常用技巧(看linux命令關中apache考試題)

3)目錄的硬鏈接不能跨越文件系統(從硬鏈接原理可以理解)

4)每個目錄下面都有一個硬鏈接“.”號,和對應上級目錄的硬鏈接“..”號

5)在父目錄里創建一個子目錄,父目錄的連接數增加1(因為子目錄里都有..來指向父目錄);但在父目錄里創建文件,父目錄的鏈接不會增加!

企業面試題:描述下linux下軟鏈接和硬鏈接的區別(記時2分鍾)

解答:

linux系統中,鏈接分兩種:一種為硬鏈接(Hard Link),另一種為符號鏈接或軟鏈接(Soft Link)

1)默認不帶參數情況下,ln命令創建的是硬鏈接,帶-s參數的創建的是軟鏈接

2)硬鏈接文件與源文件的inode節點號相同,而軟鏈接文件的inode節點號與源文件不同

3)ln命令不能對目錄創建硬鏈接,但可以創建軟鏈接,對目錄的軟鏈接會經常被用到

4)刪除軟鏈接文件,對源文件及硬鏈接文件無任何影響

5)刪除硬鏈接文件,對源文件及軟鏈接文件無任何影響

6)刪除鏈接文件的源文件,對硬鏈接文件無影響,但會導致其軟件失效(紅底白字閃爍狀)

7)同時刪除源文件及其硬鏈接文件,整個文件才會被真正的刪除

8)很多硬件設備中的快照功能,使用的就是類似硬鏈接的原理

9)軟鏈接可以跨文件系統,硬鏈接不可以跨文件系統

企業面試答題必勝思路:

1、介紹軟硬鏈接的概念

2、對於文件的軟硬鏈接區別

3、對於目錄的軟硬鏈接區別

用戶與用戶組

用戶是能夠獲取系統資源的權限的集合。用戶的角色是通過UID與GID來識別的!

linux用戶組的分類:

         a.管理員 root  :具有使用系統所有權限的用戶,其UID 為0.

         b.普通用戶  : 即一般用戶,其使用系統的權限受限,其UID為500-60000之間.

         c.虛擬用戶 : 保障系統運行的用戶,一般不提供密碼登錄系統,其UID為1-499之間.在/etc/passwd文件中都是以/sbin/nologin結尾的賬戶

與用戶有關的文件

/etc/passwd,/etc/shadow

/etc/passwd:(有關passwd文件中各個字段的詳細說明見:http://www.cnblogs.com/ginvip/p/6351740.html

其格式:account:password:UID:GID:GECOS:diretory:shell
        	account: 用戶名或帳號
        	password :用戶密碼占位符
        	UID:用戶的ID號
        	GID:用戶所在組的ID號
        	GECOS:用戶的詳細信息(如姓名,年齡,電話等)
        	diretory:用戶所的家目錄
        	shell:用戶所在的編程環境 

/etc/shadow:

其格式:account:password:最近更改密碼的日期:密碼不可更該的天數:密碼需要重新更改的天數:密碼更改前的警告期限:密碼過期的寬限時間:帳號失效日期:保留

用戶組

用戶組分類;

a.     普通用戶組:可以加入多個用戶

b.     系統組:一般加入一些系統用戶

c.     私有組(也稱基本組):當創建用戶時,如果沒有為其指明所屬組,則就為其定義一個私有的用戶組,起名稱與用戶名同名.

:私有組可以變成普通用戶組,當把其他用戶加入到該組中,則其就變成了普通組

組是權限的容器:如普通用戶 a,b,c 所屬組grp,則它們會繼承組grp的權限

與組有關的文件:/etc/group,/etc/gshadow

/etc/group文件: 其格式:group_name:passwoerd:GID:user_list
group_name:組名
passwoerd:組密碼
GID:組的ID號
user_list:以group_name為附加組的用戶列表

修改用戶及用戶組的命令:useradd,usermod, groupdd,userdel

         a.增加用戶 :useradd [options] username

options:
                   1.-u :UID
                   2.-g :GID
                   3.-d :指定用戶家目錄,默認是/home/username
                   4.-s :指定用戶所在的shell環境
                   5.-G:指定用戶的附加組

例如:增加一用戶wendy UID為1888 家目錄/home/oracle,shell為/bin/sh

#useradd –u 1888 –d /home/oracle –s /bin/sh wendy

        b.修改用戶:usermod  [options] username

options:
                   1.-u :UID
                   2.-g :GID
                   3.-d :指定用戶家目錄,默認是/home/username
                         -m 與-b 一起用表示把用戶家目錄的內容也移走
                   4.-s :指定用戶所在的shell環境
                   5.-G:指定用戶的附加組

例如:修改用戶wendy UID為1000 家目錄/oracle,shell為/bin/bash

#usermod –u 1000 –d  /oracle –s /bin/bash -m wendy 

       c.增加用戶組:groupadd   [options] groupname

options
                   1.-g :GID

例如:增加用戶組grp UID為1001

#groupadd –g 1001 grp 

       d.刪除用戶:userdel   [options]username

options
                   1.-r :連同家目錄一起刪除

例如:刪除用戶wendy及家目錄

#userdel –r wendy

文件各類時間戳

[root@Gin gin]# ll
total 8
drwxr-xr-x 2 root root 4096 Jan 28 12:25 scripts
drwxr-xr-x 5 root root 4096 Jan 25 18:01 tools
## 上面的時間格式是默認的時間格式,表示最近一次的修改時間

[root@Gin gin]# 
[root@Gin gin]# ll --time-style=long-iso
total 8
drwxr-xr-x 2 root root 4096 2017-01-28 12:25 scripts
drwxr-xr-x 5 root root 4096 2017-01-25 18:01 tools

[root@Gin gin]# ll --time-style=iso     
total 8
drwxr-xr-x 2 root root 4096 01-28 12:25 scripts
drwxr-xr-x 5 root root 4096 01-25 18:01 tools

[root@Gin gin]# ll --time-style=full-iso
total 8
drwxr-xr-x 2 root root 4096 2017-01-28 12:25:53.109249645 +0800 scripts
drwxr-xr-x 5 root root 4096 2017-01-25 18:01:22.824747428 +0800 tools

 

Linux文件權限

linux普通文件的讀,寫,執行權限說明:

可讀r:表示具有讀取/閱讀文件內容的權限

可寫w:表示具有新增,修改文件內容的權限

(如果沒有r,那vi無法編輯,強制編輯的話會覆蓋數據,echo可以追加)

(特別提示:刪除文件,包括修改文件名等,的權限受父目錄的權限控制,和文件本身權限的控制)

可執行x:表示具有可執行文件的權限

1:文件本身要能夠執行 2:普通用戶同時還需要具備r的權限才能 3:root都可執行)

Linux文件刪除原理:

    Linux是通過link的數量來控制文件刪除的,只有當一個文件不存在任何link的時候,這個文件才會被刪除。一般來說,每個文件都有2個link計數器:i_count 和 i_link。

    i_count的意義是當前文件使用者(或被調用)的數量,i_link 的意義是介質連接的數量(硬鏈接的數量);可以理解為i_count是內存引用計數器,i_link是磁盤的引用計數器。

當一個文件被某一個進程引用時,對應i_count數就會增加;當創建文件的硬鏈接的時候,對應i_link數就會增加。

    對於刪除命令rm而言,實際就是減少磁盤引用計數i_link。這里就會有一個問題,如果一個文件正在被某個進程調用,而用戶卻執行rm操作把文件刪除了,那么會出現什么結果呢?當用戶執行rm操作刪除文件后,再執行ls或者其他文件管理命令,無法再找到這個文件了,但是調用這個刪除的文件的進程卻在繼續正常執行,依然能夠從文件中正確的讀取及寫入內容。這又是為什么呢?

這是因為rm操作只是將文件的i_link減少了,如果沒其它的鏈接i_link就為0了;但由於該文件依然被進程引用,因此,此時文件對應的i_count並不為0,所以即使執行rm操作,但系統並沒有真正刪除這個文件,當只有i_link及i_count都為0的時候,這個文件才會真正被刪除。也就是說,還需要解除該進程的對該文件的調用才行。

以上講的i_link及i_count是文件刪除的真實條件,但是當文件沒有被調用時,執行了rm操作刪除文件后是否還可以找回被刪的文件呢?

前面說了,rm操作只是將文件的i_link減少了,或者說置0了,實際就是將文件名到inode的鏈接刪除了,此時,並沒有刪除文件的實體即(block數據塊),此時,如果及時停止機器工作,數據是可以找回的,如果此時繼續寫入數據,那么當新數據就可能會被分配到被刪除的數據的block數據塊,此時,文件就會被真正的回收了,那時就是神仙也沒有辦法了。

Linux讀文件的流程圖:

修改權限

1:chmode command

Format : chmod [數字組合] 文件名

對應的數值(八進制)→ r : 4 , w : 2, x : 1 , - 0

/以下面的test.sh文件為例:
[root@gin tmp]# ll
total 4
-rw-r--r-- 1 gin incahome 16 Oct  7 08:41 test.sh
[root@gin tmp]# chmod 531 test.sh
[root@gin tmp]# ll
total 4
-r-x-wx--x 1 gin incahome 16 Oct  7 08:49 test.sh

chmod [用戶類型] [+| - | =] [權限字符] 文件名

chmod

用戶類型

操作字符

權限字符

文件或目錄

u (user)

+ (加入權限)

r

g (group)

 

-

o (others)

- (減去權限)

w

a (all)

= (設置)

x

[root@gin tmp]# chmod u+x,g=x test.sh

chmod有個很重要的參數 -R ,表示遞歸修改權限(文件夾及文件夾下所有文件都修改權限)

[root@gin tmp]# chmod -R 777 poe
[root@gin tmp]# ll poe/
total 0
-rwxrwxrwx 1 root root 0 Oct  7 09:17 1.txt
-rwxrwxrwx 1 root root 0 Oct  7 09:17 2.txt
-rwxrwxrwx 1 root root 0 Oct  7 09:17 3.txt

生產案例:為防止木馬入侵,文件和目錄給什么權限,安全臨界點(文件夾及文件只讀)

目錄設為755 root root;文件設為644 root root

默認權限分配umask

文件權限計算小結論:

創建文件默認最大權限為666 (-rw-rw-rw-),默認創建的文件沒有可執行權限x位。

對於文件來說,umask的設置是在假定文件擁有八進制666的權限上進行的,文件的權限就是666減去umask(umask的各個位數字也不能大於6,如,077就不符合條件)的掩碼數值;重點在接下來的內容,如果umask的部分位或全部位為奇數,那么,在對應為奇數的文件權限位計算結果分別再加1就是最終文件權限值。

創建目錄默認最大權限777(-rwx-rwx-rwx),默認創建的目錄屬主是有x權限,允許用戶進入。對於目錄來說,umask的設置是在假定文件擁有八進制777權限上進行,目錄八進制權限777減去umask的掩碼數值。

文件權限的一般計算方法:

默認文件權限計算方法

1)假設umask值為:022(所有位為偶數)

6 6 6     ==>文件的起始權限值
0 2 2 -    ==>umask的值
---------
6 4 4

2)假設umask值為:045(其他用戶組位為奇數)

6 6 6     ==>文件的起始權限值
0 4 5 -    ==>umask的值
---------
6 2 1   ==>計算出來的權限。由於umask的最后一位數字是5,所以,在其他用戶組位再加1。
0 0 1 +
---------
622 ==>真實文件權限

默認目錄權限計算方法

 7 7 7     ==>目錄的起始權限值
 0 2 2 -    ==>umask的值
---------
 7 5 5

規范成圖表如下:

 

默認最大權限

umask值

用戶創建的權限

創建文件(umask所有位為偶數)時:

666

022 (全為偶數)

644

-rw-rw-rw-

-----w--w-

-rw-r--r--

偶數加減法:(默認最大權限) - (umask權限) = (用戶創建的權限)

創建文件(umask部分或全部位為奇數)時:

666

123(部分位為奇數)

--x--w--wx

644(因為umask的值123中有2個位都是奇數,因此在計算結果543的基礎上再加101,即奇數位對應的文件數字權限分別加1即可)

-rw-rw-rw-

 

-rw-r--r--

說明:(默認最大權限)-(umask權限)+(umask奇數對應權限位加1)=(用戶創建的權限)

創建目錄時:

777

022

755

-rwxrwxrwx

-----w--w-

-rwxr-xr-x

說明:(默認最大權限)-(umask權限)=(用戶創建的權限)

umask的作用就是控制目錄及文件的權限默認值!

控制文件:

[root@gin tmp]# sed -n '65,69p' /etc/bashrc
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
fi

企業面試:什么是umask,作用是什么,怎么計算文件和目錄的默認權限

setuid 與 setgid 位

[gin@gin ~]$ ll `which passwd`
-rwsr-xr-x. 1 root root 25980 Feb 22  2012 /usr/bin/passwd		
//這里的s就是setuid,s位如果原來有x權限,那么這位就是s,如果后來沒有x權限,那這位就是S

如果普通用戶本來沒有刪除文件的權限,但給rm 命令的權限加上s位后,即使普通用戶的權限再低,也可以刪除作任何文件

查找系統有s位權限的文件:

[root@gin test]# find / -type f -perm 4755|xargs ls -l
-rwsr-xr-x. 1 root root  77452 Oct 15  2014 /bin/mount
-rwsr-xr-x. 1 root root  36892 Sep 26  2013 /bin/ping
.............

suid知識小結:針對命令和二進制程序的

1)用戶或屬主對應的前三位權限的x位上如果有s就表示suid權限,當x位上沒有小寫x執行權限的時候,suid的權限顯示的就是大寫的S

2)suid作用就是讓普通用戶可以以root(或其他)的用戶角色運行只有root(或其他)賬號才能運行的程序或命令,或程序命令對應本來沒有權限操作的文件等!(注意和 su 及 sudo的區別),suid為某一個命令設置特殊權限(使用者為所有人)!通過對rm命令設置suid加深對suid的理解

3)問題:希望poe(普通用戶)能夠刪除本來沒有權限刪除的文件

a:sudo給poe授權rm b:給rm命令設置suid c:設置上級目錄權限

4)suid修改的是執行的命令passwd,而不是處理目標文件/etc/passwd

5)僅對二進制命令程序有效,不能用在shell等類似腳本文件上

6)二進制命令程序需要有可執行權限x配置

7)suid權限僅在程序命令執行過程中有效

8)執行suid命令的任意系統用戶都可以獲得該命令在執行期間對應的文件所有者權限

9)suid是把又刃劍,是一個比較危險的功能,對系統安全有一定的威脅。系統suid的無用功能取消suid權限(安全優化)

實例一:umask所有位全為偶數時,多數讀者對這個例子無疑問

[root@oldboy oldboy]# umask
0022 #→umask當前數值
[root@oldboy oldboy]# umask 044 #→更改為044
[root@oldboy oldboy]# umask
0044
[root@oldboy oldboy]# mkdir umask_test #→建目錄測試
[root@oldboy oldboy]# ls -ld umask_test
drwx-wx-wx 2 root root 4096 Nov 12 19:21 umask_test #→對應數字權限為733,是不是符合上面的計算方法?
[root@oldboy oldboy]# touch umask_test.txt
[root@oldboy oldboy]# ls -l umask_test.txt
-rw--w--w- 1 root root 0 Nov 12 19:21 umask_test.txt #→對應數字權限為622,是不是符合上面的計算方法?

實例二:umask值的部分或全部位為奇數時,這個是讀者疑問最大的

umask值的其他屬組位為奇數時:

[root@oldboy oldboy]# umask 0023
[root@oldboy oldboy]# mkdir dir
[root@oldboy oldboy]# touch file
[root@oldboy oldboy]# ls -l
總計 4
drwxr-xr-- 2 root root 4096 11-15 01:04 dir  #→對應數字權限為754
-rw-r--r-- 1 root root    0 11-15 01:04 file #→對應數字權限為644
提示:根據前面的計算方法,當umask為0023時,dir的權限應該是754,而file的權限應該為643,但是由於umask的其他組位為奇數,因此最終權限為其他組位加1,即643加001(對應實踐結果644)。注意:umask為偶數的位不要加1。

實例三:umask值的所有位為奇數時

[root@oldboy oldboy]# umask 0551
[root@oldboy oldboy]# umask
0551
umask 為0551 根據掩碼方法計算:目錄權限為226,文件權限115,而實際文件權限為226(umask的三個權限位都是奇數,所以,每個位分別加1就是正確的權限)
[root@oldboy oldboy]# mkdir dir5
[root@oldboy oldboy]# touch file5
[root@oldboy oldboy]# ls -l
總計 4
d-w--w-rw- 2 root root 4096 11-15 01:27 dir5  #→目錄對應數字權限為226
--w--w-rw- 1 root root    0 11-15 01:27 file5 #→目錄對應數字權限為226
再來一例驗證下:
[root@oldboy oldboy]# umask 0333
[root@oldboy oldboy]# umask
0333
umask 為0333 根據掩碼方法計算:目錄權限為444,文件權限333,而實際文件權限為444(umask的三個位都是奇數,所以,每個位分別加1就是正確的權限)
[root@oldboy oldboy]# mkdir dir3
[root@oldboy oldboy]# touch file3
[root@oldboy oldboy]# ls -l|grep 3
dr--r--r-- 2 root root 4096 11-15 01:30 dir3  #→目錄對應數字權限為444
-r--r--r-- 1 root root    0 11-15 01:30 file3 #→目錄對應數字權限為444

粘滯位 sticky bit (sbit)及設置方法

粘滯位的理解,我們先看一個例子:

[root@gin test]# ll -d /tmp/
drwxrwxrwt. 4 root root 4096 Oct  7 10:07 /tmp/

我們看到/tmp權限位最后的一個字母是t。這就是粘滯位。

粘滯位的設置,用八進制的1000位來表示。粘滯位的用途一般是把一個文件夾的權限都打開,然后來共享文件,讓多個用戶都具有寫權限,像/tmp目錄一樣,每個用戶只能刪自己創建的文件。方便帶來安全隱患,生產環境我們一般不這樣使用!

特殊權限對應的數字小結:

suid 4000權限字符 s or S,用戶位上的x位上設置。授權方法:chmod 4755 poe.txt

sgid 2000 權限字符s or S,用戶組位的x位上設置。授權方法:chmod 2755 poe.txt

粘滯位1000 權限字符t or T,其他用戶位的x位上設置。授權方法:chmod 1755 poe.txt

如果對應位有x權限,字符權限表現為小寫,否則表現為大寫!

設置方法:

chmod g+s test
chmod u+s test
chmod o+t test
chmod 7755 test

2:修改用戶組

[root@gin test]# chgrp poe /tmp/3.txt
[root@gin test]# chgrp -R poe /tmp/3.txt

此命令一般用的比較少,可使用chown命令替代此命令:

[root@gin tmp]# chown poe 2.txt
[root@gin tmp]# chown root.root 2.txt		//這里的點也可以使用 : 代替
[root@gin tmp]# chown :incahome 2.txt		//只修改組
[root@gin tmp]# chown -R poe.poe poe		//遞歸修改目錄的用戶和組

特別提示:要修改用戶和用戶組必須是系統中已經存在的!

當把一個文件的屬主與屬組刪除時,ll命令查看時會以uid and gid 顯示:

[root@gin tmp]# ll
total 8
-rw-r--r-- 1 poe  poe    0 Oct  7 09:17 2.txt
-rw-r--r-- 1 root poe    0 Oct  7 09:17 3.txt
-rw-r--r-- 1  804 805    0 Oct  7 14:53 gin.txt
drwxrwxrwx 2 poe  poe 4096 Oct  7 09:17 poe
-rwx--xr-x 1  804 805   16 Oct  7 08:49 test.sh

可使用useradd命令指定uid and gid創建用戶,再次查看時就會顯示名稱:

[root@gin tmp]# groupadd -g 805 incahome
[root@gin tmp]# useradd -u 804 -g incahome gin
[root@gin tmp]# ll
total 8
-rw-r--r-- 1 poe  poe         0 Oct  7 09:17 2.txt
-rw-r--r-- 1 root poe         0 Oct  7 09:17 3.txt
-rw-r--r-- 1 gin  incahome    0 Oct  7 14:53 gin.txt
drwxrwxrwx 2 poe  poe      4096 Oct  7 09:17 poe
-rwx--xr-x 1 gin  incahome   16 Oct  7 08:49 test.sh

chattr與lsattr命令詳解

有時候你發現用root權限都不能修改某個文件,大部分原因是曾經用chattr命令鎖定該文件了。chattr命令的作用很大,其中一些功能是由Linux內核版本來支持的,不過現在生產絕大部分跑的linux系統都是2.6以上內核了。通過chattr命令修改屬性能夠提高系統的安全性,但是它並不適合所有的目錄。chattr命令不能保護/、/dev、/tmp、/var目錄。lsattr命令是顯示chattr命令設置的文件屬性。

這兩個命令是用來查看和改變文件、目錄屬性的,與chmod這個命令相比,chmod只是改變文件的讀寫、執行權限,更底層的屬性控制是由chattr來改變的。

chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files…

最關鍵的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]這些字符組合的,這部分是用來控制文件的屬性。

+ :在原有參數設定基礎上,追加參數。
- :在原有參數設定基礎上,移除參數。
= :更新為指定參數設定。
A:文件或目錄的 atime (access time)不可被修改(modified), 可以有效預防例如手提電腦磁盤I/O錯誤的發生。
S:硬盤I/O同步選項,功能類似sync。
a:即append,設定該參數后,只能向文件中添加數據,而不能刪除,多用於服務器日志文件安全,只有root才能設定這個屬性。
c:即compresse,設定文件是否經壓縮后再存儲。讀取時需要經過自動解壓操作。
d:即no dump,設定文件不能成為dump程序的備份目標。
i:設定文件不能被刪除、改名、設定鏈接關系,同時不能寫入或新增內容。i參數對於文件 系統的安全設置有很大幫助。
j:即journal,設定此參數使得當通過mount參數:data=ordered 或者 data=writeback 掛 載的文件系統,文件在寫入時會先被記錄(在journal中)。如果filesystem被設定參數為 data=journal,則該參數自動失效。
s:保密性地刪除文件或目錄,即硬盤空間被全部收回。
u:與s相反,當設定為u時,數據內容其實還存在磁盤中,可以用於undeletion。

各參數選項中常用到的是a和i。a選項強制只可添加不可刪除,多用於日志系統的安全設定。而i是更為嚴格的安全設定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE處理能力(標識)的進程能夠施加該選項。

應用舉例:

1、用chattr命令防止系統中某個關鍵文件被修改:

# chattr +i /etc/resolv.conf

然后用mv /etc/resolv.conf等命令操作於該文件,都是得到Operation not permitted 的結果。vim編輯該文件時會提示W10: Warning: Changing a readonly file錯誤。要想修改此文件就要把i屬性去掉: chattr -i /etc/resolv.conf

# lsattr /etc/resolv.conf

會顯示如下屬性

----i-------- /etc/resolv.conf

2、讓某個文件只能往里面追加數據,但不能刪除,適用於各種日志文件:

# chattr +a /var/log/messages

 

企業案例:

如果向磁盤寫入數據提示如下錯誤:No space left on device,通過df -h查看磁盤空間,發現沒滿,請問可能原因是什么?

解答:可能是inode數量被消耗盡了!可使用df -i查看inode是否被消耗盡了!

企業工作中郵件臨時隊列/var/spool/clientmquene這里很容易被大量小文件占滿導致No space left on device的錯誤。clientmquene目錄只有安裝了sendmial服務才會有。

CentOS5.8默認就會安裝sendmial服務,因此郵件臨時存放地點的路徑為/var/spool/clientmquene;

CentOS6.6默認沒有sendmial,而是改裝了Postfix服務,因此郵件存放地點的路徑為/var/spool/postfix/maildrop!

以上兩個目錄很容易被垃圾文件填滿導致系統的inode數量不夠用,從而導致無法存儲新文件。

手動清理的方法:

[root@Gin day7]# find /var/spool/clientmquene/ -type f|xargs rm -f  ## CentOS5.xx
[root@Gin day7]# find /var/spool/postfix/maildrop/ -type f|xargs rm -f  ## CentOS6.x

定時清理的方法為:將上述命令寫成腳本,然后做定時任務,每天晚上0點執行一次清理任務!

 

本節word文件地址:http://wenku.baidu.com/view/f1aee7f57d1cfad6195f312b3169a4517723e51b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM