一起來學linux:磁盤與文件系統:


對於文件系統來說,windows上最長用的就是FAT32和NTFS。在Linux上時候用的是Ext2。在linux中,文件權限與文件屬性這兩部分會被存儲在不同的塊,權限與權限放置到inode中,實際數據放置到data block當中。另外還有一個超級塊(superblock)會記錄整個文件系統的整體信息。包括inode與block的總量,使用量,剩余量以及文件系統的格式與相關信息等。
Super block: 記錄此文件系統的整體信息,包括inode/block的總量,使用量,剩余量以及文件系統的格式與相關信息
inode: 記錄文件的屬性,一個文件占用一個inode, 同時記錄此文件的數據所在的block號碼
block: 實際記錄文件的內容,如果文件太大,會占用多個block
三者之間的關系可以參考下圖:

由於很多時候系統的文件太大,因此將所有的indoeblock放在一起就不容易管理。Ext2文件系統在格式化的時候是會划分多個塊組。每個塊組都有獨立的indoe/block/super block系統,就好比我們在上學的時候,一個年級會被分成不同的班級。每個班都有各自的班主任。

結構如下圖;

文件系統的最前面是一個啟動扇區(boot sector) 這個啟動扇區可以安裝引導裝載程序。這樣在安裝多系統的情況下,比如linuxwindows雙系統的時候就能夠將不同的引導裝載程序安裝到個別的文件系統最前端。這樣才能夠制作出多重引導的環境。

 

Data blocks: 這是用來放置數據的地方。支持的block大小有1KB,2KB,4KB三種。block大小和文件系統的對應關系如下:

block大小:單一文件限制:最大文件系統總容量

1KB16GB2TB

2KB256GB8TB

4KB2TB16TB

block的大小與數量在格式化萬就不能再修改了。除非重新格式。每個block內最大只能放置一個文件的數據。如果文件大小大於block大小,則會占據多個block. 反之,如果文件大小小於block大小,則該block的剩余空間就不能再被使用了。

比如,文件系統設置的block大小為4kb, 文件系統有10000個小文件。每個文件的大小都小於50字節。那么算算磁盤會浪費多少容量:

每個block會浪費4096-50=4046字節。所有文件容量為50×10000=488KB。但此時浪費的容量為4046×10000=38M。不到1M的文件系統導致將近40M的空間浪費。因此在讀文件系統格式的時候需要考慮實際的使用情況來設置block大小,否則會導致大量的浪費。


inodetableinode表格)

每個indoe記錄如下信息:

1 文件的訪問模式

2 文件的所有者與組

3 文件大小,創建或者改變的時間,最近一次的讀取時間,最近修改的時間

4 定義文件特性的標志(flag),如SetUID

5 文件的真正指向

每個inode的大小都固定為128bytes。 每個文件占用一個indoe。系統在讀取文件時需要先找到inode,並分析inode所記錄的權限與用戶是否符合。若符合才能開始實際讀取block的內容


superblock(超級塊)

每個超級塊記錄如下信息:

1 blockinode的總量

2 已使用和未使用的inode/block數量

3 blockinode的大小

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, inodeblock的數量以及各種時間記錄。

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當中記載的。那么在命令行上如何查看呢。這就需要用到dfdu的命令。

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


那么硬連接的好處是什么呢:最大的好處就是安全。如果你將任何一個文件名刪除,其實inodeblock都是存在的。你還可以通過另外一個文件名來讀取正確的文件數據,此外,不論使用哪個文件進行編輯。最終的結果都會寫入到相同的inodeblock當中去。因此都可以進行數據的修改。而且使用硬連接設置連接文件的時候,磁盤的空間與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就可以對分區進行格式化並且設置掛載點了

 

 


免責聲明!

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



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