lsattr 命令
lsattr 命令用於查看文件的第二擴展文件系統屬性。
語法:
lsattr(選項)(參數)
選項:
-E:可顯示設備屬性的當前值,但這個當前值是從用戶設備數據庫中獲得的,而不是從設備直接獲得的。 -D:顯示屬性的名稱,屬性的默認值,描述和用戶是否可以修改屬性值的標志。 -R:遞歸的操作方式; -V:顯示指令的版本信息; -a:列出目錄中的所有文件,包括隱藏文件。
lsattr 經常使用的幾個選項-D,-E,-R這三個選項不可以一起使用,它們是互斥的,經常使用的還有-l,-H,使用lsattr時,必須指出具體的設備名,用-l選項指出要顯示設備的邏輯名稱,否則要用-c,-s,-t等選項唯一的確定某個已存在的設備。
chattr 命令
chattr 命令用來改變文件屬性。這項指令可改變存放在ext2文件系統上的文件或目錄屬性,這些屬性共有以下8種模式:
a:讓文件或目錄僅供附加用途; b:不更新文件或目錄的最后存取時間; c:將文件或目錄壓縮后存放; d:將文件或目錄排除在傾倒操作之外; i:不得任意更動文件或目錄; s:保密性刪除文件或目錄; S:即時更新文件或目錄; u:預防意外刪除。
語法:
chattr (選項)
選項:
-R:遞歸處理,將指令目錄下的所有文件及子目錄一並處理; -v<版本編號>:設置文件或目錄版本; -V:顯示指令執行過程; +<屬性>:開啟文件或目錄的該項屬性; -<屬性>:關閉文件或目錄的該項屬性; =<屬性>:指定文件或目錄的該項屬性。
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 命令來顯示文件屬性:
# lsattr /etc/resolv.conf ##輸出結果: ----i-------- /etc/resolv.conf
2、讓某個文件只能往里面追加數據,但不能刪除,適用於各種日志文件:
# chattr +a /var/log/messages
詳解:
-e 的解釋是`The e attribute indicates that the file is using extents for mapping the blocks on disk.`
:e屬性表示該文件正在使用擴展區來映射磁盤上的塊
-I 的解釋是`The I attribute is used by the htree program code to indicate that a directory is being indexed using hashed trees.`
: I htree程序代碼使用I屬性來指示使用散列樹索引目錄
這個‘e’屬性表示,該文件在磁盤塊映射上使用了extents。 這里的extents我們可以理解成是一個連續的范圍。這個屬性是不能通過chattr去除的。
關於 chattr 和 lsattr 的解釋說明
lsattr:查看特殊權限
chattr:在EXT2文件系統上改變文件屬性
用法
chattr [+-=] [ASacdistu] [文件或目錄名稱]
chattr 改變EXT2文件系統上的一個文件的屬性
參數符號格式是 +-=[acdeijstuADST]
操作符 '+'
表示將選中的屬性增加到指定的文件上; ‘-'
則表示刪除該屬性;'='
表示文件僅僅設置指定的屬性
參數說明:
+-=:分別是”+”(增加)、”-“(減少)、”=”(設定)屬性
-
A:當設定了屬性A,這個文件(或目錄)的存取時間atime(access)將不可被修改,可避免諸如手提電腦容易產生磁盤I/* O錯誤的情況;
-
S:這個功能有點類似sync,是將數據同步寫入磁盤中,可以有效避免數據流失;
-
a:設定a后,這個文件將只能增加數據而不能刪除,只有root才能設定這個屬性;
-
c:設定這個屬性后,將會自動將此文件壓縮,在讀取時自動解壓縮。但是在存儲的時候,會現進行壓縮在存儲(對於大* 文件很有用);
-
d:當dump(備份)程序執行時,設定d屬性將可使該文件(或目錄)具有dump功效;+d 可以備份時跳過該文件
-
i:這個參數可以讓一個文件”不能被刪除、更名、設定鏈接,也無法寫入數據,對於系統安全有很大的助益
-
j:當使用ext3文件系統格式時,設定j屬性將使文件在寫入時先記錄在日志中,但是當filesystem設定參數為data=jour* nalled時,由於已經設定了日志,所以這個屬性無效
-
s:當文件設定了s參數時,它會被完全移出這個硬盤空間
-
u:與s相反,當使用u配置文件時,數據內容其實還可以存在於磁盤中,可以用來取消刪除
-
大文件(h),
-
壓縮錯誤(E),
-
索引目錄(I),
-
壓縮的原始訪問?(X),
-
和壓縮的零碎文件(Z).
介紹
除ext2外其它常見的文件系統,如ext3 ext4 NTFS 等都是日志型文件系統,所謂日志型文件系統即所有有行為會記錄在磁盤,系統默認會預留一些空間來記錄的操作行為,當系統不正常關機再開機時,不需要全盤掃描來恢復至系統正常狀態。
Linux kernel 自 2.6.28 開始正式支持新的文件系統 Ext4。 Ext4 是 Ext3 的改進版,修改了 Ext3 中部分重要的數據結構,而不僅僅像 Ext3 對 Ext2 那樣,只是增加了一個日志功能而已。Ext4 可以提供更佳的性能和可靠性,還有更為豐富的功能:
1. 與 Ext3 兼容。
執行若干條命令,就能從 Ext3 在線遷移到 Ext4,而無須重新格式化磁盤或重新安裝系統。原有 Ext3 數據結構照樣保留,Ext4 作用於新數據,當然,整個文件系統因此也就獲得了 Ext4 所支持的更大容量。
2. 更大的文件系統和更大的文件。
較之 Ext3 目前所支持的最大 16TB 文件系統和最大 2TB 文件,Ext4 分別支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系統,以及 16TB 的文件。
3. 無限數量的子目錄。
Ext3 目前只支持 32,000 個子目錄,而 Ext4 支持無限數量的子目錄。
4. Extents。
Ext3 采用間接塊映射,當操作大文件時,效率極其低下。比如一個 100MB 大小的文件,在 Ext3 中要建立 25,600 個數據塊(每個數據塊大小為 4KB)的映射表。而 Ext4 引入了現代文件系統中流行的 extents 概念,每個 extent 為一組連續的數據塊,上述文件則表示為“該文件數據保存在接下來的 25,600 個數據塊中”,提高了不少效率。
5. 多塊分配。
當寫入數據到 Ext3 文件系統中時,Ext3 的數據塊分配器每次只能分配一個 4KB 的塊,寫一個 100MB 文件就要調用 25,600 次數據塊分配器,而 Ext4 的多塊分配器“multiblock allocator”(mballoc) 支持一次調用分配多個數據塊。
6. 延遲分配。
Ext3 的數據塊分配策略是盡快分配,而 Ext4 和其它現代文件操作系統的策略是盡可能地延遲分配,直到文件在 cache 中寫完才開始分配數據塊並寫入磁盤,這樣就能優化整個文件的數據塊分配,與前兩種特性搭配起來可以顯著提升性能。
7. 快速 fsck。
以前執行 fsck 第一步就會很慢,因為它要檢查所有的 inode,現在 Ext4 給每個組的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系統就可以跳過它們而只去檢查那些在用的 inode 了。
8. 日志校驗。
日志是最常用的部分,也極易導致磁盤硬件故障,而從損壞的日志中恢復數據會導致更多的數據損壞。Ext4 的日志校驗功能可以很方便地判斷日志數據是否損壞,而且它將 Ext3 的兩階段日志機制合並成一個階段,在增加安全性的同時提高了性能。
9. “無日志”(No Journaling)模式。
日志總歸有一些開銷,Ext4 允許關閉日志,以便某些有特殊需求的用戶可以借此提升性能。
10. 在線碎片整理。
盡管延遲分配、多塊分配和 extents 能有效減少文件系統碎片,但碎片還是不可避免會產生。Ext4 支持在線碎片整理,並將提供 e4defrag 工具進行個別文件或整個文件系統的碎片整理。
11. inode 相關特性。
Ext4 支持更大的 inode,較之 Ext3 默認的 inode 大小 128 字節,Ext4 為了在 inode 中容納更多的擴展屬性(如納秒時間戳或 inode 版本),默認 inode 大小為 256 字節。Ext4 還支持快速擴展屬性(fast extended attributes)和 inode 保留(inodes reservation)。
12. 持久預分配(Persistent preallocation)。
P2P 軟件為了保證下載文件有足夠的空間存放,常常會預先創建一個與所下載文件大小相同的空文件,以免未來的數小時或數天之內磁盤空間不足導致下載失敗。Ext4 在文件系統層面實現了持久預分配並提供相應的 API(libc 中的 posix_fallocate()),比應用軟件自己實現更有效率。
13. 默認啟用 barrier。
磁盤上配有內部緩存,以便重新調整批量數據的寫操作順序,優化寫入性能,因此文件系統必須在日志數據寫入磁盤之后才能寫 commit 記錄,若 commit 記錄寫入在先,而日志有可能損壞,那么就會影響數據完整性。Ext4 默認啟用 barrier,只有當 barrier 之前的數據全部寫入磁盤,才能寫 barrier 之后的數據。(可通過 “mount -o barrier=0” 命令禁用該特性。)
.-o options 主要用來描述設備或檔案的掛接方式。常用的參數有:
loop:用來把一個文件當成硬盤分區掛接上系統
ro:采用只讀方式掛接設備
rw:采用讀寫方式掛接設備
iocharset:指定訪問文件系統所用字符集
在Microsoft Winsows的世界,硬盤可以格式化成NTFS、FAT32、FATl6等等不同的格式。同樣地,在GNU/Linux底下也是有很多不同的文件系統格 式可供選擇。當前在GNU/Linux底下,比較常用的有這幾種格式:Ext2/Ext3、ReiserFS、XFS和JFS等數種。
除了Ext2以外,其它幾種都是日誌型文件系統。那什麼是日誌型文件系統呢? 就是系統會多用一些額外的空間紀錄硬盤的數據狀態,因而在不正常開關機后,不需整個硬盤重新掃描來恢復正常的系統狀態。
問題1: the file is using extents …, 但為什么lsattr中目錄為什么也有`-e選項?
為什么目錄也會顯示-e -I
問題,這個問題我覺得是man文檔的准確性問題,眾所周知:Linux下一切皆文件。這里其想表述的是文件,即所有的文件都支持,但為什么鏈接文件不支持,這里我們有留意到圖中的軟鏈是鏈接的目錄,我們再來看下是軟鏈的文件是否能正常顯示
# lsattr /etc/system-release lsattr: Operation not supported While reading flags on /etc/system-release
發現軟鏈的文件也是不行的
問題2:什么是extents,擴展在這里是不好理解的?
lsattr
中-e
是指extents
,是指ext(2,3,4)系列文件系統中支持的Extents
屬性,經常大量的搜索查找后,發現該屬性有專門的介紹
Ext3等文件系統采用間接塊映射,主要針對大文件操作,現今科技的發展和技術的普及,硬件的容量規模提升的非常快,當操作大文件時,大數據時, 效率極其低下。比如一個 100MB 大小的文件,在 Ext文件系統中要建立 25,600 個數據塊(每個數據塊大小為 4KB)的映射表。
為解決該問題,Ext4 引入了現代文件系統中流行的 extents 概念,每個 extent為一組連續的數據塊,上述文件則表示為“ 該文件數據保存在接下來的 25,600 個數據塊中”,提高了不少效率。
所以-e
是指文件系統中的文件或目錄是否支持該特性,該特性在現代操作系統中起到非常重要的作用。
問題3:The I attribute is used by the htree program code, htree
是什么?
因為man文檔是介紹的是htree programe,所以起初的我理所應當的理解為系統命令,但經過驗證后發現不是一個系統命令。
yum whatprovides htree
問題到這里為止,我覺得該單詞不夠成我對該句的理解,所以當時對其也沒有放太多心思,不過后來發現這個想法是錯誤的!!
Btrfs: B-tree file system
其實是一個文件系統,大家可以在btrfs文件系統wiki,還有這里的這里還有介紹
問題4:indicate that a directory is being indexed using hashed trees。indexed using hashed trees
被引用?
最初的理解是被軟鏈索引過的目錄會有-I
的選項,我們來驗證下,從上面的這幅圖執行ll
命令返回結果的第二列數字看,所有目錄都有被鏈接,但lsattr
命令返回的結果卻並非所有的目錄均有屬性I
。所以該選項只能猜測並驗證了。進一步查看 chattr命令后發現,該屬性It may not be set or reset using chattr(1)
。該選項的概念也只能猜測:
系統對特有的常被引用或其它程序調用的目錄添加該屬性,以提升速度和提高效率。
做一個簡單的驗證。自己創建的目錄默認沒有I
屬性
自己創建的目錄默認沒有I
屬性
----------I--e- /lib64
----------I--e- /etc
-------------e- /home
-------------e- /lib
----------I--e- /lib64
----------I--e- /sbin
這些常見的lib庫及經常會被調用的系統文件會被添加I屬性。
舉列說明:
我們有這樣的需求:Linux系統下一個文件不允許別人修改、刪除或者只允許添加,我們就可以使用chattr命令。
[root@serv01 test]# cat note.txt
1.不許遲到
2.不許早退
3.不許抽煙
[root@serv01 test]# chattr +i note.txt
#root用戶都不能編輯
[root@serv01 test]# vim note.txt
[root@serv01 test]# cat note.txt
1.不許遲到
2.不許早退
3.不許抽煙
#root用戶不能刪除 修改
[root@serv01 test]# rm -f note.txt
rm: cannot remove `note.txt': Operation not permitted
[root@serv01 test]# echo "this is test" >> note.txt
-bash: note.txt: Permission denied
#ll查看文件屬性不能看到,需要使用lsattr查看
[root@serv01 test]# ll note.txt
-rw-r--r--. 1 root root 45 Sep 21 17:46 note.txt
[root@serv01 test]# lsattr note.txt
----i--------e- note.txt
#root用戶不能修改只是個相對概念,root用戶可以修改文件的屬性,就可以修改了
[root@serv01 test]# chattr -i note.txt
[root@serv01 test]# lsattr note.txt
-------------e- note.txt
[root@serv01 test]# vim note.txt
[root@serv01 test]# cat note.txt
1.不許遲到
2.不許早退
3.不許抽煙
4.可以不來上班
#留言板:自己說的話不能刪除
[root@serv01 test]# vim note.txt
[root@serv01 test]# cat note.txt
1.不許遲到
2.不許早退
3.不許抽煙
4.可以不來上班
hello
[root@serv01 test]# chattr +a note.txt
[root@serv01 test]# lsattr note.txt
-----a-------e- note.txt
[root@serv01 test]# vim note.txt
[root@serv01 test]# ls
note.txt note.txt~ note.txy~ note.txz~
#刪除,發現沒有權限
[root@serv01 test]# rm -rf *
rm: remove regular file `note.txt'? y
rm: cannot remove `note.txt': Operation not permitted
[root@serv01 test]# ls
note.txt upload
[root@serv01 test]# echo "hello world" > note.txt
-bash: note.txt: Operation not permitted
#只能使用追加的方式添加內容
[root@serv01 test]# echo "hello world" >> note.txt
[root@serv01 test]# cat note.txt
1.不許遲到
2.不許早退
3.不許抽煙
4.可以不來上班
hello
hello world
[root@serv01 test]# chattr -a note.txt
[root@serv01 test]# lsattr note.txt
-------------e- note.txt