Linux文件系统结构

  • 硬盘结构
  • 文件系统结构
  • 硬链接和软链接
  • 实战:解决磁盘有空间但创建不了文件

1、硬盘的结构

硬盘的内部是一个圆形的金属盘片,一个硬盘内部往往不止一张,常见的有两张。
将原因的盘片分成若干个扇形区域,我们叫做扇区;
以盘片中心为圆心,把盘片分成若干个同心圆,每一个划分圆的“线条”,我们叫做磁道;
硬盘的存储容量=磁头数磁道每磁道扇区数每磁道扇区字节数
磁道从外向内自0开始进行编号,各个磁道上的扇区数都是在硬盘格式化的时候确定的。
硬盘的最小存储单位,我们叫做“扇区”,每个扇区存储512字节(相当于0.5KB)

windows安装系统的C盘或Linux boot分区一般安装在磁盘的最外面还是最里面?
windows:C盘安装最外,速度也是最快
Linux:boot分区和swap分区,装在最外面
磁盘有以下特点:读外圈的数据快,读内圈的数据慢,所以测试硬盘经常
看到读取速度越来越慢的曲线图就很正常了

2、磁盘读写

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续的取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是 4KB,即连续八个 sector (扇区)组成一个 block
Windows系统中文件的最小单位是簇;Linux系统中文件的最小单位是block

例:在Windows平台,新建一个文档,输入aa两个字符

右击属性查看大小: 说明我的 NTFS 文件系统中默认的簇大小为 4KB
.
Linux平台中,我们通过stat命令,也可以查到block的大小

[root@xuegod140 ~]# stat mima File: ‘mima’ Size: 2429
Blocks: 8 IO Block: 4096 regular file Device:
802h/2050d Inode: 16797766 Links: 1 Access: (0644/-rw-r–r--) Uid:
( 0/ root) Gid: ( 0/ root) Access: 2019-04-12
20:37:55.318027969 +0800 Modify: 2019-04-12 20:33:47.514020700 +0800
Change: 2019-04-12 20:38:53.664029681 +0800

重点:簇和block调大:
优点:读取速度快,节约寻址时间
缺点:浪费空间
比如:2T的硬盘,前1.5T,block使用4K,后500MB使用64KB,这样综合利用,就是我们所说的用空间换时间

总结:分区的簇或者block越大,查询和读取数据的速度越快,但是浪费空间,因为簇或block是分区存放单个文件大小的数值;
block设置大:效率高,利用率低;
block设置小:效率低,利用率高
例如:簇或者block的大小是64kb,我们存储放一个650kb的数据,需要用到11个簇或block,就会造成浪费10kb的空间,但是因为我们存放的簇或block数量少,在硬盘读取数据的时,因为读取的簇或block少,速度就比较块;同样,如果簇或者block的大小是32kb,我们存放一个650kb的数据,需要用到21个簇或block,但是因为我们存放的簇或block多,硬盘读取的时候,需要寻址的簇或block多,所以读写的速度相对来说就慢。

3、inode的内容

文件的三种时间:
mtime : modify time 修改文件内容的时间
atime : access time 访问文件内容的时间
ctime 指 inode 上一次文件属性变动的时间,change time 。 比如: chmod +x a.sh
mtime 指文件内容上一次变动的时间,modify time 。如:echo aa >> a.sh 或vim a.sh 修改内容
atime 指文件上一次查看文件的时间,access time 。 如: cat a.sh

例1:atime时间变动

[root@xuegod140 ~]# stat mima Access: 2019-04-12 20:37:55.318027969
+0800 Modify: 2019-04-12 20:33:47.514020700 +0800 Change: 2019-04-12 20:38:53.664029681 +0800 [root@xuegod140 ~]# cat mima [root@xuegod140
~]# stat mima Access: 2019-04-13 09:07:50.518031307 +0800
#atime时间变动 Modify: 2019-04-12 20:33:47.514020700 +0800 Change: 2019-04-12 20:38:53.664029681 +0800

例2:mtime时间变动

[root@xuegod140 ~]# stat mima Access: 2019-04-13 09:07:50.518031307
+0800 Modify: 2019-04-12 20:33:47.514020700 +0800 Change: 2019-04-12 20:38:53.664029681 +0800 [root@xuegod140 ~]# echo aaa > mima
[root@xuegod140 ~]# stat mima #修改内容后,发现mtime和ctime都变动
Access: 2019-04-13 09:07:50.518031307 +0800 Modify: 2019-04-13
09:09:51.104032241 +0800 Change: 2019-04-13 09:09:51.104032241 +0800

例3:ctime时间

[root@xuegod140 ~]# stat mima Access: 2019-04-13 09:07:50.518031307
+0800 Modify: 2019-04-13 09:09:51.104032241 +0800 Change: 2019-04-13 09:09:51.104032241 +0800 [root@xuegod140 ~]# chmod +x mima
[root@xuegod140 ~]# stat mima #看到是ctime的时间发生变动 Access:
2019-04-13 09:07:50.518031307 +0800 Modify: 2019-04-13
09:09:51.104032241 +0800 Change: 2019-04-13 09:12:09.582033314 +0800

4、inode的大小

inode 也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区(inode table),存放 inode 所包含的信息。每个 inode 节点的大小,一般是 128 字节或 256 字节。inode 节点的总数,在格式化时就给定,假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到 128MB,占整块硬盘的 12.8%。

5、inode 号码

每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件。
Unix/Linux 系统内部不使用文件名,而使用 inode 号码来识别文件。对于系统来说,文件名只是inode 号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的 inode 号码;其次,通过 inode 号码,获取 inode 信息;最后,根据 inode 信息,找到文件数据所在的 block,读出数据。
例1:查看每个分区的inode信息

[root@xuegod140 ~]# df -Th Filesystem Type Size Used Avail
Use% Mounted on /dev/sda2 xfs 10G 4.7G 5.4G 47% /
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev tmpfs
tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs tmpfs 2.0G
21M 2.0G 2% /run tmpfs tmpfs 2.0G 0 2.0G 0%
/sys/fs/cgroup /dev/sr0 iso9660 4.2G 4.2G 0 100% /mnt
/dev/sda1 xfs 497M 148M 350M 30% /boot tmpfs
tmpfs 394M 8.0K 394M 1% /run/user/42 tmpfs tmpfs
394M 0 394M 0% /run/user/0

例2:查看目录文件的inode信息

[root@xuegod140 ~]# ls -id /etc 8388673 /etc [root@xuegod140 ~]# stat
/etc File: ‘/etc’ Size: 8192 Blocks: 24 IO Block:
4096 directory Device: 802h/2050d Inode: 8388673 Links: 136
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/
root) Access: 2019-04-13 22:50:07.893020097 +0800 Modify: 2019-04-13
22:48:34.164020980 +0800 Change: 2019-04-13 22:48:34.164020980 +0800
Birth: -

5、block块大小

blcok是真正存储数据的地方
blcok是文件系统中最小的存储单位
扇区是磁盘中最小的存储单位
两个扇区成为:簇或者block
在Linux中叫block(块);在Windows中叫簇;
操作系统在读取数据的不是一个个扇区的读取,这样效率太低,而是一次性读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块,我们叫做block,是文件存储的最小单位。块的大小通常是1kb,即是2个sector(扇区)组成一个blcok。
如果我们的磁盘没有block,我们在读取数据的时候效率和速度非常慢。比如看一个4G的高清电影,一次读一个扇区(512B),寻址的次数太多,太慢了,导致电影看成jpg。
例1:修改簇的大小
在windows系统中,修改簇大小,需将硬盘进行格式化,进行修改。

6、文件的硬链接和软连接

Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为软链接,即符号链接(Symbolic Link)。
默认情况下,ln 命令产生硬链接。
【硬链接】:硬链接指通过索引节点号来进行连接。inode 是可以对应多个文件名的,在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节
点号(Inode Index)。在 Linux 中,多个文件名可以指向同一索引节点。一般这种连接就是硬连接。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
【软连接】:另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息

硬链接:
命令:ln
语法:ln 源文件 目标文件

[root@xuegod140 ~]# echo aaa >> a.txt
[root@xuegod140 ~]# ln a.txt
b.txt [root@xuegod140 ~]# ll -i a.txt b.txt #两个文件的inode号相同
18684490 -rw-r–r-- 2 root root 4 Apr 13 23:03 a.txt 18684490
-rw-r–r-- 2 root root 4 Apr 13 23:03 b.txt

我们修改其中一个文件的内容,查看另外一个文件内容是否同步

[root@xuegod140 ~]# echo 123 >> a.txt
[root@xuegod140 ~]# cat b.txt #文件内容会同步
aaa
123

我们删除其中一个文件,查看是否对另外一个文件造成影响

[root@xuegod140 ~]# rm -rf a.txt
[root@xuegod140 ~]# cat b.txt
aaa
123
[root@xuegod140 ~]# echo 456 >> b.txt
[root@xuegod140 ~]# cat b.txt
aaa
123
456

注意:硬链接不能跨分区进行链接文件;因为每个分区都有自己的inode号,两个分区的inode会重复。
硬链接不能针对目录进行设置链接;
例2:测试是否可以针对目录和跨分区

[root@xuegod140 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 10G 0 part / └─sda3 8:3 0 4G 0 part
[SWAP] sdb 8:16 0 20G 0 disk ├─sdb1 8:17 0 300M 0
part /sdb1 [root@xuegod140 ~]# ln /etc/passwd /sdb1/mim #/sdb1和/不在同一个分区
ln: failed to create hard link ‘/sdb1/mim’ => ‘/etc/passwd’: Invalid cross-device link
[root@xuegod140 ~]# ln /boot/grub /opt/ #无法针对目录设置硬链接 ln:
‘/boot/grub’: hard link not allowed for directory

扩展:
为什么不能针对目录设置硬链接?

[root@xuegod140 ~]# ll -d /sdb1/
drwxr-xr-x 2 root root 6 Apr 13 23:11 /sdb1/

为什么我们新创建的目录,链接数是2?

[root@xuegod140 ~]# ll -id /sdb1/ /sdb1/.
64 drwxr-xr-x 2 root root 6 Apr 13 23:11 /sdb1/
64 drwxr-xr-x 2 root root 6 Apr 13 23:11 /sdb1/.

这里我们可以看出/sdb1和.是同一个文件,也就是链接的目录文件,inode号码一样。

软链接:
命令:ln -s
语法:ln -s 源文件 链接的名字
注意:
软链接可以对目录设置;
软链接可以跨分区设置;
软链接的路径必须是绝对路径;(跨分区)
源文件删除,链接文件失效

例1:对目录设置软链接

[root@xuegod140 ~]# ln -s /boot/grub grub-link
[root@xuegod140 ~]# ll grub-link -d
lrwxrwxrwx 1 root root 10 Apr 13 23:24 grub-link -> /boot/grub

例2:链接一个文件

[root@xuegod140 ~]# ln -s mima mima-link
[root@xuegod140 ~]# ll mima-link
lrwxrwxrwx 1 root root 4 Apr 13 23:26 mima-link -> mima

删除mima文件,查看对软链接有影响

[root@xuegod140 ~]# rm -rf mima
[root@xuegod140 ~]# ll mima-link
lrwxrwxrwx 1 root root 4 Apr 13 23:26 mima-link -> mima #这里发现源文件会闪烁,颜色变了
[root@xuegod140 ~]# cat mima-link
cat: mima-link: No such file or directory

注:源文件删除,链接文件失效

例3:跨分区设置

[root@xuegod140 ~]# cp /etc/passwd mima
[root@xuegod140 ~]# ln -s mima /sdb1/mima-link
[root@xuegod140 ~]# ll /sdb1/mima-link
lrwxrwxrwx 1 root root 4 Apr 13 23:30 /sdb1/mima-link -> mima

注:这里可以看到虽然没有报错,但是软链接的文件是无效的。说明跨分区设置软链接源文件必须要绝对路径
将源文件的路径写成绝对路径

7、inode的特殊作用

由于 inode 号码与文件名分离,这种机制导致了一些 Unix/Linux 系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除 inode 节点,就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响 inode 号码。
  3. 打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从 inode 号码得知文件名。
    互动:为什么每次修改完服务器配置文件后,都需要重新加载一下配置文件?
    因为 vim 每次修改完后,Inode 号都会变。
    例1:删除inode号,来实现删除文件
    方法一:

[root@xuegod140 ~]# ll -i mima
18684497 -rw-r–r-- 1 root root 2433 Apr 13 23:30 mima
[root@xuegod140 ~]# rm find . -inum 18684497

方法二:

[root@xuegod140 ~]# ll -i mima-link
18684499 lrwxrwxrwx 1 root root 4 Apr 13 23:26 mima-link -> mima
[root@xuegod140 ~]# find . -inum 18684499 -exec rm -rf {} ;
[root@xuegod140 ~]# ls mima-link
ls: cannot access mima-link: No such file or directory

例2:移动文件,查看是否改变inode号

[root@xuegod140 ~]# cp /etc/passwd mima
[root@xuegod140 ~]# ll -i mima
18684497 -rw-r–r-- 1 root root 2433 Apr 13 23:42 mima
[root@xuegod140 ~]# mv mima /opt/mima
mv: overwrite ‘/opt/mima’? y
[root@xuegod140 ~]# ll -i /opt/mima
18684497 -rw-r–r-- 1 root root 2433 Apr 13 23:42 /opt/mima

例3:查看vim后的文件inode号是否会改变

[root@xuegod140 ~]# ll -i /opt/mima
18684497 -rw-r–r-- 1 root root 2433 Apr 13 23:42 /opt/mima
[root@xuegod140 ~]# vim /opt/mima
[root@xuegod140 ~]# ll -i /opt/mima
8388686 -rw-r–r-- 1 root root 2443 Apr 13 23:44 /opt/mima

8、解决磁盘有空间,但是无法创建文件

环境准备:

[root@xuegod140 ~]# cd /sdc2
[root@xuegod140 sdc2]# df -i /sdc2/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc2 25600 3 25597 1% /sdc2
[root@xuegod140 sdc2]# touch {1…25700}.txt
touch: cannot touch ‘25662.txt’: No space left on device
touch: cannot touch ‘25663.txt’: No space left on device
touch: cannot touch ‘25664.txt’: No space left on device
touch: cannot touch ‘25665.txt’: No space left on device
[root@xuegod140 sdc2]# df -i /sdc2/ #inode号不足
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc2 25600 25600 0 100% /sdc2
[root@xuegod140 sdc2]# df -Th /sdc2/ #空间还有剩余
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdc2 xfs 47M 17M 31M 35% /sdc2
[root@xuegod140 sdc2]# touch a.txt
touch: cannot touch ‘a.txt’: No space left on device

解决方法:
1、删除/sdc2目录中其它一些文件,释放除/sdc2目录中的一些inode号
2、先备份/sdc2目录下的一些文件,然后在目录下创建一个目录,重启在这个目录下挂载一个别的分区,下次在需要写数据就向这个目录写数据
演示:

[root@xuegod140 sdc2]# rm -rf 25661.txt
[root@xuegod140 sdc2]# df -i /sdc2/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc2 25664 25663 1 100% /sdc2
[root@xuegod140 sdc2]# mkdir cache
[root@xuegod140 sdc2]# df -i /sdc2/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc2 25664 25664 0 100% /sdc2
[root@xuegod140 sdc2]# cd cache/
[root@xuegod140 cache]# touch a.txt b.txt
[root@xuegod140 cache]# echo aa > a.txt bb > b.txt
[root@xuegod140 cache]# cat a.txt b.txt
aa bb
[root@xuegod140 cache]# df -i /sdc2/cache/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb5 153600 5 153595 1% /sdc2/cache

3、创建一个软链接的方法

[root@xuegod140 sdc2]# df -i /sdc2/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdc2 25664 25663 1 100% /sdc2
[root@xuegod140 sdc2]# ln -s /sdb1/ sdb1-link
[root@xuegod140 sdc2]# cd sdb1-link/
[root@xuegod140 sdb1-link]# touch a.txt
[root@xuegod140 sdb1-link]# cd …
[root@xuegod140 sdc2]# df -i sdb1-link/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 153600 4 153596 1% /sdb1

4、inode分区完了之后,indoe号是否可以修改
ext4的分区,无法直接修改,必须通过格式化来修改inode号

[root@xuegod140 Packages]# mkfs.ext4 -N 500000 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
500464 inodes, 307200 blocks
15323 blocks (4.99%) reserved for the super user
First data block=1
Maximum filesystem blocks=20866560
62 block groups
5016 blocks per group, 5016 fragments per group
8072 inodes per group
Superblock backups stored on blocks:
5017, 15049, 25081, 35113, 45145, 125401, 135433, 245785
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
[root@xuegod140 Packages]# mount /dev/sdb1 /sdb1/
[root@xuegod140 Packages]# df -i /sdb1/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 500464 11 500453 1% /sdb1

xfs分区可以直接修改inode号的数量
在这里插入图片描述
通过查看分区的inode信息,可以计算出inode的数量
修改inode占用硬盘的百分比
在这里插入图片描述
修改百分比后,分区的inode数量自动变更
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值