一起来学linux:磁盘与文件系统:

时间:2023-03-09 17:49:31
一起来学linux:磁盘与文件系统:

对于文件系统来说,windows上最长用的就是FAT32和NTFS。在Linux上时候用的是Ext2。在linux中,文件权限与文件属性这两部分会被存储在不同的块,权限与权限放置到inode中,实际数据放置到data block当中。另外还有一个超级块(superblock)会记录整个文件系统的整体信息。包括inode与block的总量,使用量,剩余量以及文件系统的格式与相关信息等。
Super block: 记录此文件系统的整体信息,包括inode/block的总量,使用量,剩余量以及文件系统的格式与相关信息
inode: 记录文件的属性,一个文件占用一个inode, 同时记录此文件的数据所在的block号码
block: 实际记录文件的内容,如果文件太大,会占用多个block
三者之间的关系可以参考下图:

一起来学linux:磁盘与文件系统:

由于很多时候系统的文件太大,因此将所有的indoe和block放在一起就不容易管理。Ext2文件系统在格式化的时候是会划分多个块组。每个块组都有独立的indoe/block/super block系统,就好比我们在上学的时候,一个年级会被分成不同的班级。每个班都有各自的班主任。

结构如下图;

文件系统的最前面是一个启动扇区(boot sector) 这个启动扇区可以安装引导装载程序。这样在安装多系统的情况下,比如linux和windows双系统的时候就能够将不同的引导装载程序安装到个别的文件系统最前端。这样才能够制作出多重引导的环境。

一起来学linux:磁盘与文件系统:

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

在桌面上能看到连接的文件

一起来学linux:磁盘与文件系统:

通过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就可以对分区进行格式化并且设置挂载点了