文件數據包括元信息與實際數據,一個文件必須佔用一個inode,但至少佔用一個block。node
扇區:文件存儲在硬盤上,硬盤的最小存儲單位是扇區,每一個扇區存儲空間是512字節。
block(塊):連續的八個扇區組成一個block,block是文件存取的最小單位,用來存儲文件數據。
inode(索引節點):也叫i節點,用於存儲文件元信息。linux
(1)inode包含文件元信息:c++
- 文件的字節數
- 文件擁有者的User ID(UID)
- 文件的Group ID(GID)
- 文件具備的讀、寫、執行權限
- 文件的時間戳(atime、ctime、mtime)
當咱們想查看某個文件的inode信息時,使用的是「stat」命令,後面直接接文件的路徑和名稱便可。windows
[root@localhost opt]# stat test/ 文件:"test/" 大小:24 塊:0 IO 塊:4096 目錄 設備:802h/2050d Inode:33574981 硬連接:2 權限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root) 環境:unconfined_u:object_r:usr_t:s0 最近訪問:2019-08-28 11:39:33.953003238 +0800 最近更改:2019-08-28 11:39:20.023004045 +0800 最近改動:2019-08-28 11:39:20.023004045 +0800 建立時間:- [root@localhost opt]#
(2)文件的三個主要時間屬性:session
- atime(access time):最後一次訪問文件或目錄的時間
- ctime(change time):最後一次改變文件或目錄(屬性)的時間
- mtime(modify time):最後一次修改文件或目錄(內容)的時間
每一inode都有一個號碼,操做系統是經過inode號碼來識別不一樣文件的。Linux系統內部是不使用文件名來識別文件的,對系統而言inode號碼纔是文件的名字。而文件名只是便於用戶去記憶的名字,至關於inode號碼的別稱。其實這就至關於我們的手機通信錄,我們平時只要記住聯繫人的名字就能夠撥通他的手機,但真正用來鏈接通話的是你保存在通信錄中的手機號碼。移動或重命名文件時,只會改變文件名,inode號碼是不變的。ide
(1)用戶經過文件名打開文件時,系統內部過程以下:工具
- 系統首先會找到這個文件名對應的inode號碼
- 經過inode號碼獲取inode信息(查看元信息,看是否有訪問權限)
- 根據inode信息,找到文件數據所在的block,讀出數據
(2)查看inode號碼的方法:this
ls -i命令:查看文件名對應的inode號碼操作系統
[root@localhost opt]# ls -i test/ 34964204 test01.txt [root@localhost opt]#
stat命令:查看文件inode信息中的inode號碼3d
[root@localhost opt]# stat test/test01.txt 文件:"test/test01.txt" 大小:13 塊:8 IO 塊:4096 普通文件 設備:802h/2050d Inode:34964204 硬連接:1 權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 環境:unconfined_u:object_r:usr_t:s0 最近訪問:2019-08-28 11:39:34.875003185 +0800 最近更改:2019-08-28 11:39:20.023004045 +0800 最近改動:2019-08-28 11:39:20.023004045 +0800 建立時間:- [root@localhost opt]#
inode也會消耗硬盤空間,每一個inode的大小通常是128字節或256字節,在格式化文件系統時會肯定inode的總數。
df -i命令:查看每一個硬盤分區的inode總數和已使用數量
[root@localhost opt]# df -i 文件系統 Inode 已用(I) 可用(I) 已用(I)% 掛載點 /dev/sda2 10485760 121223 10364537 2% / devtmpfs 229705 368 229337 1% /dev tmpfs 233378 1 233377 1% /dev/shm tmpfs 233378 599 232779 1% /run tmpfs 233378 16 233362 1% /sys/fs/cgroup /dev/sda5 5241856 144 5241712 1% /home /dev/sda1 3145728 328 3145400 1% /boot tmpfs 233378 6 233372 1% /run/user/42 tmpfs 233378 20 233358 1% /run/user/0 [root@localhost opt]#
當咱們刪除文件的文件名中包含有沒法用鍵盤敲出的特殊字符,就致使咱們沒法刪除文件。此時咱們能夠直接經過inode來刪除文件。
在linux系統中有種文件是連接文件,能夠爲解決文件的共享使用。連接的方式能夠分爲兩種,一種是硬連接(Hard Link),另外一種是軟連接或者也稱爲符號連接(Symbolic Link)。
在Linux系統中,多個文件名指向同一個inode,通常這種連接就稱爲硬連接。硬連接的做用之一是容許一個文件擁有多個有效路徑名,這樣用戶就能夠創建硬連接到重要的文件,以防止誤刪重要文件,不過硬連接只能在同一文件系統中的文件之間進行連接,並且不能對目錄進行建立。文件名其實就至關於硬連接,當咱們給文件創建了硬連接後,再去刪除它的源文件,就至關於刪除了其中一個硬連接。但它的元信息和數據任然在inode與block中存儲着。當最後一個硬連接被刪除後,它的元信息和數據任然在,可是系統會將它的inode號碼釋放到號碼池,當有一個新文件獲取了這個inode號碼後,它的元信息和數據纔會被覆蓋。
軟連接,其實與windows系統中的快捷方式很類似,與硬連接不一樣,軟連接就是一個普通文件,只是數據塊內容有點特殊,文件用戶數據塊中存放的內容是另外一文件的路徑名的指向,經過這個方式能夠快速定位到軟鏈接所指向的源文件實體。軟連接可對文件或目錄建立,當源文件被刪除後,軟連接也就失效了。
ln命令:建立硬連接。
[root@localhost test]# ls test01.txt [root@localhost test]# ls -l 總用量 4 -rw-r--r--. 1 root root 13 8月 28 11:39 test01.txt [root@localhost test]# ln test01.txt t01.txt [root@localhost test]# ls -i 34964204 t01.txt 34964204 test01.txt [root@localhost test]# ls -l 總用量 8 -rw-r--r--. 2 root root 13 8月 28 11:39 t01.txt -rw-r--r--. 2 root root 13 8月 28 11:39 test01.txt [root@localhost test]#
咱們能夠看到,文件和它的硬連接的inode號碼是相同的,因此不管咱們用哪一個打開它的內容都是相同的。
ln -s命令:建立軟連接
[root@localhost test]# ls test01.txt [root@localhost test]# ln -s test01.txt t01.txt [root@localhost test]# ls t01.txt test01.txt [root@localhost test]#
file命令:查看文件類型
[root@localhost test]# file test01.txt test01.txt: ASCII text [root@localhost test]# cd ../ [root@localhost opt]# file test/ test/: directory [root@localhost opt]#
安裝extundelete軟件包,先安裝它的依賴包。
輸入:cd /mnt/Packages/ 輸入:rpm -ivh e2fsprogs-libs-1.41.12-18.el6.x86_64.rpm 輸入:rpm -ivh e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm 輸入:rpm -ivh libcom_err-devel-1.41.12-18.el6.x86_64.rpm 輸入:rpm -ivh e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
咱們先新建一個目錄,再將咱們本地的工具包掛載到目錄中。
輸入:mkdir /extundel 輸入:mount.cifs //192.168.100.50/share/ /extundel/ 輸入:df -h
將掛載過來的工具壓縮包解壓到「/opt/」目錄中
輸入:cd /extundel/ 輸入:tar jxvf extundelete-0.2.4.tar.bz2 -C /opt/
用「cd」命令進入「/opt/extundelete-0.2.4/」目錄,安裝編譯器,由於如今的源碼包是用C語言寫的,不能直接用。
輸入:cd /opt/extundelete-0.2.4/ 輸入:yum install gcc gcc-c++ -y
編譯安裝extundelete工具。
輸入:./configure 輸入:make 輸入:make install
添加一塊磁盤,對磁盤進行配置,配置完後,將磁盤分區格式化,文件格式爲ext4,再建立一個目錄「/data/」,並將磁盤分區掛載到目錄下。
進入到「/data/」目錄,建立三個文件a、b、c。而後再將三個文件刪除,模擬文件誤刪。
咱們先返回宿主目錄,而後將sdb1解掛載。而後用「extundelete /dev/sdb1 --restore-all」來恢復刪除的全部文件。注意:當你誤刪文件後,第一時間必定要將設備解掛載,由於若是有新的文件將刪除的文件inode號給佔用了就沒法恢復了。(工做環境中必定要注意備份)
咱們用「cd」命令進入到「RECOVERED_FILES/」目錄中就能看到恢復的文件了。
xfsdump命令:備份系統文件
格式:xfsdump -f 備份存放位置 要備份的路徑或設備文件
經常使用選項:
-f:-------------------指定備份文件位置 -L:------------------指定備份會話標籤(免交互) -M:-----------------指定設備標籤(免交互) -s:------------------備份指定的文件,使用相對路徑,相對於備份的文件系統路徑
xfsrestore命令:恢復備份的系統文件
格式:xfsrestore -f 恢復文件的位置 存放恢復後文件的位置
經常使用選項:
-f:-----------------------指定備份文件位置 -s:----------------------恢復指定文件恢復 -t:-----------------------查看文件的內容及詳細信息
首先添加一塊硬盤,而後對其進行配置分區,再格式化將文件類型格式化爲xfs格式,掛載到新建的目錄「/data/」下。
複製passwd文件到「/data/」目錄下,而後在「/data/」目錄裏新建一個「test」目錄,並在目錄裏建立一個空文件。
退出「/data/」目錄,而後將sdb1分區的文件備份到「/opt/」目錄下,命名爲「xfs_dump」
[root@localhost ~]# xfsdump -f /opt/xfs_dump /dev/sdb1 //備份命令 .................................. //省略部分 please enter label for this dump session (timeout in 300 sec) -> xfs_dump //輸入備份後文件名 session label entered: "xfs_dump" ..................................... //省略部分 please enter label for media in drive 0 (timeout in 300 sec) -> sdb1 //輸入備份分區 media label entered: "sdb1" ......................................... //省略部分 xfsdump: Dump Status: SUCCESS
刪除「/data/」目錄下的全部文件,模擬文件誤刪。
刪除完畢咱們經過xfsrestore命令將文件恢復到「/data/」目錄中去。
xfsdump使用限制:
- 只能備份已掛載的文件系統
- 必須使用root的權限才能操做
- 只能備份XFS文件系統
- 備份後的數據只能讓xfsrestore解析
- 不能備份兩個具備相同UUID的文件系統