對於文件系統來說,windows上最長用的就是FAT32和NTFS。在Linux上時候用的是Ext2。在linux中,文件權限與文件屬性這兩部分會被存儲在不同的塊,權限與權限放置到inode中,實際數據放置到data block當中。另外還有一個超級塊(superblock)會記錄整個文件系統的整體信息。包括inode與block的總量,使用量,剩余量以及文件系統的格式與相關信息等。
Super block: 記錄此文件系統的整體信息,包括inode/block的總量,使用量,剩余量以及文件系統的格式與相關信息
inode: 記錄文件的屬性,一個文件占用一個inode, 同時記錄此文件的數據所在的block號碼
block: 實際記錄文件的內容,如果文件太大,會占用多個block
三者之間的關系可以參考下圖:
由於很多時候系統的文件太大,因此將所有的indoe和block放在一起就不容易管理。Ext2文件系統在格式化的時候是會划分多個塊組。每個塊組都有獨立的indoe/block/super block系統,就好比我們在上學的時候,一個年級會被分成不同的班級。每個班都有各自的班主任。
結構如下圖;
文件系統的最前面是一個啟動扇區(boot sector) 這個啟動扇區可以安裝引導裝載程序。這樣在安裝多系統的情況下,比如linux和windows雙系統的時候就能夠將不同的引導裝載程序安裝到個別的文件系統最前端。這樣才能夠制作出多重引導的環境。
Data blocks: 這是用來放置數據的地方。支持的block大小有1KB,2KB,4KB三種。block大小和文件系統的對應關系如下:
block大小:單一文件限制:最大文件系統總容量
1KB: 16GB:2TB
2KB:256GB:8TB
4KB:2TB:16TB
block的大小與數量在格式化萬就不能再修改了。除非重新格式。每個block內最大只能放置一個文件的數據。如果文件大小大於block大小,則會占據多個block. 反之,如果文件大小小於block大小,則該block的剩余空間就不能再被使用了。
比如,文件系統設置的block大小為4kb, 文件系統有10000個小文件。每個文件的大小都小於50字節。那么算算磁盤會浪費多少容量:
每個block會浪費4096-50=4046字節。所有文件容量為50×10000=488KB。但此時浪費的容量為4046×10000=38M。不到1M的文件系統導致將近40M的空間浪費。因此在讀文件系統格式的時候需要考慮實際的使用情況來設置block大小,否則會導致大量的浪費。
inodetable(inode表格)
每個indoe記錄如下信息:
1 文件的訪問模式
2 文件的所有者與組
3 文件大小,創建或者改變的時間,最近一次的讀取時間,最近修改的時間
4 定義文件特性的標志(flag),如SetUID
5 文件的真正指向
每個inode的大小都固定為128bytes。 每個文件占用一個indoe。系統在讀取文件時需要先找到inode,並分析inode所記錄的權限與用戶是否符合。若符合才能開始實際讀取block的內容
superblock(超級塊)
每個超級塊記錄如下信息:
1 block與inode的總量
2 已使用和未使用的inode/block數量
3 block與inode的大小
4 文件系統的掛載時間,最近一次寫入數據的時間,最近一次校驗磁盤時間等文件信息
前面介紹了文件系統的概念,下面來看下如何查詢這些文件信息
1 首先查找根目錄的磁盤信息,使用df命令查到根路徑/ 存在與/dev/sda1
root@zhf-linux:/home/zhf# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 1010832 0 1010832 0% /dev
tmpfs 205944 6816 199128 4% /run
/dev/sda1 238171776 11450900 214599328 6% /
tmpfs 1029712 15864 1013848 2% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 1029712 0 1029712 0% /sys/fs/cgroup
cgmfs 100 0 100 0% /run/cgmanager/fs
tmpfs 205944 64 205880 1% /run/user/1000
2 通過dumpe2fs -h /dev/sda1查看超級塊的信息。結果如下,可以看到blocksize, inode和block的數量以及各種時間記錄。
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: 32bb6dca-412b-4853-95fe-8f3c4ea6a303
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 15138816
Block count: 60525824
Reserved block count: 3026291
Free blocks: 56683445
Free inodes: 14741489
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 1009
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Thu Nov 26 04:59:07 2015
Last mount time: Sat Nov 18 14:36:46 2017
Last write time: Sat Nov 18 14:36:35 2017
Mount count: 134
Maximum mount count: -1
Last checked: Thu Nov 26 04:59:07 2015
Check interval: 0 (<none>)
Lifetime writes: 62 GB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First orphan inode: 12195349
Default directory hash: half_md4
Directory Hash Seed: 970db111-3cce-4073-baa7-d65162c82032
Journal backup: inode blocks
Journal features: journal_incompat_revoke
Journal size: 128M
Journal length: 32768
Journal sequence: 0x00030c62
Journal start: 16937
那么實際文件的inode數又該如何查詢呢。這就需要用到ls -li命令。位於最左端的就是文件的inode號碼。
root@zhf-linux:/home/zhf# ls -li /home/zhf/zhf
total 280704
6038783 -rw-r--r--+ 1 root root 10 Sep 18 21:55 acl_test1
7866278 drwxr-xr-x 3 root root 4096 Nov 8 10:35 c_prj
6037303 -rw-r--r-- 1 root zhf 37 May 24 2016 crontest.cron
6031954 -rw-r--r-- 1 zhf zhf 7733727 Nov 7 2016 Django-1.10.3.tar.gz
linux文件系統的操作:
磁盤的整體數據都在superblock中,但是每個各別文件的容量則在inode當中記載的。那么在命令行上如何查看呢。這就需要用到df和du的命令。
df: 列出文件系統的整體磁盤使用量
du:評估文件系統的磁盤使用量
df -h可以很直觀的看到每個分區的容量的大小
Filesystem Size Used Avail Use% Mounted on
udev 988M 0 988M 0% /dev
tmpfs 202M 6.7M 195M 4% /run
/dev/sda1 228G 11G 205G 5% /
tmpfs 1006M 176K 1006M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1006M 0 1006M 0% /sys/fs/cgroup
cgmfs 100K 0 100K 0% /run/cgmanager/fs
tmpfs 202M 56K 202M 1% /run/user/1000
將目前各個分區當中可用的inode數量列出
root@zhf-linux:/home/zhf# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 206K 511 205K 1% /dev
tmpfs 215K 811 214K 1% /run
/dev/sda1 15M 388K 15M 3% /
tmpfs 215K 6 215K 1% /dev/shm
tmpfs 215K 6 215K 1% /run/lock
tmpfs 215K 18 215K 1% /sys/fs/cgroup
cgmfs 215K 14 215K 1% /run/cgmanager/fs
tmpfs 215K 32 215K 1% /run/user/1000
如果要看單獨的文件目錄的大小,則可以用du命令:
-a: 列出所有的文件與目錄容量,
-h: 以人們較易讀的容量格式(G/M)顯示
-s: 列出總量而已
-k:以KB列出容量顯示
-m:以MB列出容量顯示
root@zhf-linux:/home/zhf# du -ah /home/zhf/zhf/python_prj
4.0K /home/zhf/zhf/python_prj/auto_manintance/chapter7.py
4.0K /home/zhf/zhf/python_prj/auto_manintance/test.yml
4.0K /home/zhf/zhf/python_prj/auto_manintance/test2.yml
4.0K /home/zhf/zhf/python_prj/auto_manintance/chapter5.py
4.0K /home/zhf/zhf/python_prj/auto_manintance/test.js
4.0K /home/zhf/zhf/python_prj/auto_manintance/test1.yml
8.0K /home/zhf/zhf/python_prj/auto_manintance/test.svg
2.6M /home/zhf/zhf/python_prj/auto_manintance/log.log
連接文件:
在windows下,我們一般會在桌面放置很多軟件的快捷方式來避免在硬盤中去查找。在linux中,也有類似的功能那就是連接文件。連接方式有兩種硬連接和軟連接
硬連接:通過文件系統的inode連接來產生新文件名,而不是新文件。前面介紹了每個文件都有一個inode,要讀取該文件,必須要找到正確的inode號碼才能讀取。也就是說文件名只與目錄有關,但是文件內容則和innode有關。所以硬連接就是將多個文件名對應到同一個inode號碼。
將一個python的文件鏈接到桌面上
root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ln chapter1.py /home/zhf/Desktop/chapter1_ln.py
在桌面上能看到連接的文件
通過ll -i命令可以看到兩個文件的inode號碼是一樣的。而且權限也是一模一樣的。 但是第二個字段從1變成了2,表明有2個文件連接到這個inode號碼。
root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ll -i chapter1.py /home/zhf/Desktop/chapter1_ln.py
6161412 -rw-r--r-- 2 root root 1154 Jul 30 14:22 chapter1.py
6161412 -rw-r--r-- 2 root root 1154 Jul 30 14:22 /home/zhf/Desktop/chapter1_ln.py
那么硬連接的好處是什么呢:最大的好處就是安全。如果你將任何一個文件名刪除,其實inode和block都是存在的。你還可以通過另外一個文件名來讀取正確的文件數據,此外,不論使用哪個文件進行編輯。最終的結果都會寫入到相同的inode和block當中去。因此都可以進行數據的修改。而且使用硬連接設置連接文件的時候,磁盤的空間與inode的數目不會改變。
符號連接:
符號連接就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向它連接的那個文件的文件名。由於只是利用文件來作為指向的操作,所以當源文件被刪除之后,符號連接的文件也會打開不了。
還是采用ln命令,添加-s就代表是符號連接
root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ln -s chapter3.py chapter3_ln.py
可以看到inode號碼不一樣。
root@zhf-linux:/home/zhf/zhf/python_prj/auto_manintance# ll -i chapter3.py chapter3_ln.py
6166844 lrwxrwxrwx 1 root root 11 Nov 19 14:02 chapter3_ln.py -> chapter3.py
6163034 -rw-r--r-- 1 root root 256 Aug 20 21:55 chapter3.py
磁盤的分區:
磁盤分區需要用到fdisk命令。前面我們通過df 查出了我們的磁盤名稱為/dev/sda. 那么我們就用fdisk /dev/sda進入去看下如何操作
進入后系統界面如下:在這個界面下都是通過命令行來操作。
root@zhf-linux:/home/zhf/zhf# fdisk /dev/sda
Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): m
輸入m后可以得到所有的命令界面。所以不用去刻意的去記命令。
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
輸入p打印,可以看到下面的所有分區。分別是/dev/sda1,/dev/sda2, /dev/sda5 3個分區
Command (m for help): p
Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0008f9b1
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 484208639 484206592 230.9G 83 Linux
/dev/sda2 484210686 488396799 4186114 2G 5 Extended
/dev/sda5 484210688 488396799 4186112 2G 82 Linux swap / Solaris
那么下面來看下如何新增分區。輸入n添加分區。但是出現no free sectors avaiable. 原因在於/dev/sda5被分配做了swap分區,刪除掉sda5就可以新添加
Command (m for help): n
All space for primary partitions is in use.
Adding logical partition 6
No free sectors available.
刪除掉sda5后再輸入n就可以添加成功了。
Command (m for help): d
Partition number (1,2,5, default 5): 5
Partition 5 has been deleted.
Command (m for help): p
Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0008f9b1
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 484208639 484206592 230.9G 83 Linux
/dev/sda2 484210686 488396799 4186114 2G 5 Extended
添加分區后通過mkfs就可以對分區進行格式化並且設置掛載點了