Linux常見文件系統類型:ext3(CentOS5),ext4(CentOS6),xfs(CentOS7)
Windows常見文件系統類型:FAT32,NTFS
(1).inode的內容
1)inode包含文件的元信息,具體來說有以下內容:
文件的字節數
文件擁有者的User ID
文件的Group ID
文件的讀、寫、執行權限
文件的時間戳,共有三個:ctime指inode上次文件屬性變動的時間,例如:chmod +x a.sh;mtime指文件內容上次變動的時間,例如:echo aa >> a.sh或vim a.sh;atime值文件上次打開的時間,例如:cat a.sh。
鏈接數,即有多少文件名指向這個inode
文件數據block的位置
2)我們可以用stat命令,查看某個文件的inode信息:
[root@xuexi ~]# stat /etc/passwd 文件:"/etc/passwd" 大小:2257 塊:8 IO 塊:4096 普通文件 設備:803h/2051d Inode:17324457 硬鏈接:1 權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 環境:system_u:object_r:passwd_file_t:s0 最近訪問:2019-03-08 11:00:01.672759577 +0800 最近更改:2019-02-13 16:19:23.303395879 +0800 最近改動:2019-02-13 16:19:23.305395782 +0800 創建時間:- [root@xuexi ~]# echo $LANG //查看當前語言 zh_CN.UTF-8 [root@xuexi ~]# LANG="en_US.UTF-8" //語言臨時轉為英文 [root@xuexi ~]# stat /etc/passwd File: ‘/etc/passwd’ Size: 2257 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 17324457 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:passwd_file_t:s0 Access: 2019-03-08 11:00:01.672759577 +0800 Modify: 2019-02-13 16:19:23.303395879 +0800 Change: 2019-02-13 16:19:23.305395782 +0800 Birth: - [root@xuexi ~]# ll /etc/passwd //ll其實就是查看文件的inode信息 -rw-r--r--. 1 root root 2257 Feb 13 16:19 /etc/passwd //ll查看到的時間是ctime時間
3)測試ctime,mtime和atime
[root@xuexi ~]# touch a.txt [root@xuexi ~]# stat a.txt File: ‘a.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 803h/2051d Inode: 34042450 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2019-03-08 14:24:17.272886924 +0800 Modify: 2019-03-08 14:24:17.272886924 +0800 Change: 2019-03-08 14:24:17.272886924 +0800 Birth: - [root@xuexi ~]# date -s "2019-03-07 14:29:49" //修改系統時間 Thu Mar 7 14:29:49 CST 2019 [root@xuexi ~]# chmod +x a.txt [root@xuexi ~]# stat a.txt //可以看到’ chmod +x a.txt’修改了ctime File: ‘a.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 803h/2051d Inode: 34042450 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2019-03-08 14:24:17.272886924 +0800 Modify: 2019-03-08 14:24:17.272886924 +0800 Change: 2019-03-07 14:30:32.246910417 +0800 Birth: - [root@xuexi ~]# echo aa >> a.txt [root@xuexi ~]# stat a.txt //可以看到’ echo aa >> a.txt’修改了mtime和ctime File: ‘a.txt’ Size: 3 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 34042450 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2019-03-08 14:24:17.272886924 +0800 Modify: 2019-03-07 14:31:19.164728344 +0800 Change: 2019-03-07 14:31:19.164728344 +0800 Birth: - [root@xuexi ~]# vim a.txt //添加了一行bbb [root@xuexi ~]# stat a.txt //可以看到’ vim a.txt’修改了atime,ctime和mtime File: ‘a.txt’ Size: 7 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 34729170 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2019-03-07 14:32:42.604862498 +0800 Modify: 2019-03-07 14:32:42.604862498 +0800 Change: 2019-03-07 14:32:42.605945804 +0800 Birth: - [root@xuexi ~]# cat a.txt aa bbb [root@xuexi ~]# stat a.txt //可以看到’ cat a.txt’修改了atime File: ‘a.txt’ Size: 7 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 34729170 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2019-03-07 14:34:27.525217232 +0800 Modify: 2019-03-07 14:32:42.604862498 +0800 Change: 2019-03-07 14:32:42.605945804 +0800 Birth: -
由此可見,黑客是可以通過修改時間,再植入木馬,防止被find找到。
4)inode的大小
Inode也會消耗硬盤空間,所以硬盤格式化時,操作系統自動將文件分成兩個區域。一個是數據區,用於存放文件數據;另一個是inode區,用於存放inode所包含的信息。
每個inode節點的大小一般是128字節或256字節。Inode節點的總數在格式化時就給定,一般是1KB或2KB或4KB就設置一個inode。如果一塊1GB的硬盤,每個inode節點的大小為128字節,每1KB就設置一個inode,那么inode區的大小就會達到128MB,占整個硬盤的12.8%。(所以block可以設置的大一點)
5)inode號
每個inode都有一個號碼,操作系統用inode號來識別不同的文件。
Unix/Linux系統內部不是用文件名,而使用inode號來識別文件。對於系統來說,文件名只是iode號便於識別的別名。表面上用戶是通過文件名打開文件,實際上系統內部分成三個步驟:首先,系統找到這個文件名對應的inode號;其次通過inode號獲取inode信息;最后根據inode信息找到文件數據所在的block,讀出數據。
可以使用’ls -i [filename]’快速查看文件的inode號:
[root@xuexi ~]# ls -i a.txt 34729170 a.txt
在Unix/Liunx系統中,目錄也是一種文件。目錄文件的結構非常簡單,即使一系列目錄項的列表。每個目錄項由所包含文件的文件名以及該文件名對應的inode號組成。
可以使用’ls -id [directory]’快速查看目錄的inode號:
[root@xuexi ~]# ls -id /etc 16777281 /etc
另外可以使用’df -i’查看每個磁盤分區的inode總數和已經使用的數量
[root@xuexi ~]# df -i 文件系統 Inode 已用(I) 可用(I) 已用(I)% 掛載點 /dev/sda3 8912384 193509 8718875 3% / devtmpfs 249583 408 249175 1% /dev tmpfs 253514 1 253513 1% /dev/shm tmpfs 253514 966 252548 1% /run tmpfs 253514 16 253498 1% /sys/fs/cgroup /dev/sda1 524288 359 523929 1% /boot /dev/sr0 0 0 0 - /mnt tmpfs 253514 6 253508 1% /run/user/42 tmpfs 253514 17 253497 1% /run/user/1000 tmpfs 253514 1 253513 1% /run/user/0
注意:由於每個文件都必須有一個inode號,因此有可能發生inode已用光,但硬盤未存滿的情況。這時就無法在硬盤上創建新的文件。
6)inode的特殊作用
有時文件名有特殊字符或亂碼,無法正常修改或刪除,可以通過inode號來進行操作。實例:
[xf@xuexi ~]$ mkdir Dir [xf@xuexi ~]$ cd Dir/ [xf@xuexi Dir]$ touch 學習 \\創建一個中文的文件名 [xf@xuexi Dir]$ ls 學習 [xf@xuexi Dir]$ LANG="en_US.gbk" \\臨時調整一下編碼,使得文件名變為亂碼 [xf@xuexi Dir]$ ls ?????? [xf@xuexi Dir]$ ls -i \\看一下該文件的inode號 407062 ??????
\\刪除還可以使用"find . -inum 407062 -delete"(沒有提示)以及"find . -inum 407062 | xargs -i rm {}"
\\修改類似 [xf@xuexi Dir]$ find . -inum 407062 -exec rm -i {} \; rm: remove regular empty file './\345\255\246\344\271\240'? y [xf@xuexi Dir]$ ls
移動或重命名文件,只改變文件名,inode沒影響。
使用vim修改文件內容后,inode會發生改變。實例:
[xf@xuexi ~]$ touch File [xf@xuexi ~]$ ls -i File 52016344 File [xf@xuexi ~]$ vim File
//增加一行aaaaa [xf@xuexi ~]$ ls -i File //inode號改變了 52016202 File [xf@xuexi ~]$ echo bbbbb>>File //追加一行bbbbb [xf@xuexi ~]$ ls -i File //inode號沒變 52016202 File [xf@xuexi ~]$ cat File aaaaa bbbbb [xf@xuexi ~]$ ls -i File 52016202 File [xf@xuexi ~]$ cat > File <<EOF //重寫File > ccccc > ddddd > EOF [xf@xuexi ~]$ ls -i File //inode號還是沒變 52016202 File
我一開始還懷疑會不會是我字節沒有寫滿一個block,但我用cat寫了20416個字節,結果inode號還是沒變。我估計echo追加和cat重寫都不改變inode號。
(2).block的內容
block是真正存儲數據的地方。block是文件系統中的最小存儲單位,扇區是磁盤中的最小存儲單位。
注意:Linux下叫block,Windows下叫簇。
1) Windows如何修改簇的大小
可以右鍵一個分區,點擊格式化會出現如下窗口:
這里的分配單元大小就是設置簇的大小。
2) Block或簇的大小對系統的影響
簇或block調大時,節約了尋址時間,速度變快,但浪費空間;簇和block調小時,節約空間,但尋址時間變長,速度變慢。
說明:為什么簇或block調大會浪費空間?這是因為一個文件會占用多個簇或block來存放。當前一個簇或block放不下時,就會占用下一個簇或block,到最后如果產生不足以占用一個完整的簇或block時,仍然會占用一個完整的簇或block,就會浪費這個簇或block剩下的空間。
如果有一個2T的硬盤,可以前1.5T使用4K的簇或block,后0.5G使用64K的簇或block,這樣可以改善機械硬盤越到最后速度越慢的問題。
3) Linux下查看block的大小以及修改方式
查看block的大小
[root@xuexi ~]# file -s /dev/sdb1 //把block或設備當做普通文件看待 /dev/sdb1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs) [root@xuexi ~]# xfs_info /dev/sdb1 xfs_info: /dev/sdb1 is not a mounted XFS filesystem //居然需要先掛載 [root@xuexi ~]# ls / bin dev etc lib media opt root sbin srv tmp var boot dump home lib64 mnt proc run sdb1 sys usr [root@xuexi ~]# mkdir /sdb1 mkdir: 無法創建目錄"/sdb1": 文件已存在 [root@xuexi ~]# mount /sdb1 /dev/sdb1 mount: /sdb1 不是一個塊設備 [root@xuexi ~]# mount /dev/sdb1 /sdb1/ [root@xuexi ~]# xfs_info /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
注意:xfs_info只能用於xfs的文件系統,如果是ext4或ext3請使用tune2fs
修改block的大小,就需要用到mkfs.xfs格式化命令,需要格式化分區
[root@xuexi ~]# umount /sdb1 [root@xuexi ~]# mkfs -t xfs -b size=2048 /dev/sdb1 mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (xfs). mkfs.xfs: Use the -f option to force overwrite. [root@xuexi ~]# mkfs -t xfs -b size=2048 -f /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=131072 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=2048 blocks=524288, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=2048 blocks=5120, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
注意:mkfs.xfs就是mkfs –t xfs的簡寫。