# 对linux文件系统的一些认知
## 1. 扇区
![](https://img.kancloud.cn/b2/5c/b25c9f2b36bc5c76083710d906f7d824_484x396.png)
扇区(Sector)是磁盘最小的存储单元,一个扇区通常是512byte(0.5k)
## 2. Data Blocks
操作系统读取磁盘数据时,不会一次只读一个扇区,而是读取一个`Data Blocks`
一个block包含8个连续的扇区(0.5k*8=4k), 磁盘的每次IO操作都会针对一个完整的block
一个block不会同时保存多个文件的内容, 假设一个文件只有1kb, 那么存储这个文件的block就会有3kb空出来。
## 3. 如何选择block大小
磁盘的每次io就是扫描了一个block
block设置比较大,会提高io效率(每次io都能读取到更多内容), 但是小文件会浪费磁盘空间
block设置比较小, 磁盘利用率会得到很大提升,但是会降低IO效率(一个文件会分布在更多的block里面)
## 4. inode是什么
inode记得是文件的详细信息
``` linux
$ stat a.log
File: ‘a.log’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769dInode: 1310770 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ huiyu) Gid: ( 1000/ huiyu)
Access: 2019-08-12 10:28:24.614113790 +0800
Modify: 2019-08-12 10:28:24.614113790 +0800
Change: 2019-08-12 10:28:24.614113790 +0800
Birth: -
```
详细信息里面有个`Inode: 1310770`, 这个id指的就是该Inode的id
``` linux
$ ls -i a.log
1310770 a.log
```
可以通过文件名查找Inode id, 也可以根据Inode Id 删除文件
``` linux
find . -inum 1310770 -delete
```
(一些名称乱码的文件可以通过这个方法来删除)
但是无法通过Inode id反查文件名
linux底层文件系统是通过Inode来辨别文件的而不是通过文件名。
总结: 一个Inode记录了一个文件的基础信息(不包括详细数据)
## 5. inode会用完吗
每个文件都对应一个inode,如果小文件太多,是会导致inode达到上限,导致就不能再创建文件了(很有可能磁盘空间还有很多)
可以通过`df -i`命令来看inode使用情况
``` linux
$ df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/vda1 19660800 729199 18931601 4% /
devtmpfs 1963974 337 1963637 1% /dev
tmpfs 1966588 1 1966587 1% /dev/shm
```
## 6. 硬链接
``` linux
# 硬链接不允许指向目录
ln 源文件 目标文件
```
一般情况下一个文件名对应一个inode,但是linux也支持多个文件名对应同一个inode
``` linux
$ touch f1
$ ln f1 f2
$ echo '123' > f2
$ cat f1
123
```
实际上, f1和f2都是指向同一个文件
``` linux
$ ls -i
1704010 f1 1704010 f2
```
增加一个硬链接后, inode信息里面的硬链接数量会加1
``` linux
$ stat f1
文件:"f1"
大小:4 块:8 IO 块:4096 普通文件
设备:fd01h/64769dInode:1704010 硬链接:2
权限:(0664/-rw-rw-r--) Uid:( 1000/ huiyu) Gid:( 1000/ huiyu)
最近访问:2019-12-20 16:29:26.222751069 +0800
最近更改:2019-12-20 16:29:24.108666483 +0800
最近改动:2019-12-20 16:29:24.108666483 +0800
创建时间:-
```
无论单独删除f1或f2都不会导致inode被删除(依然还被其它文件名引用)
``` linux
$ ls -i
1704010 f1 1704010 f2
$ rm -rf f1
$ ls -i
1704010 f2
$ stat f2
文件:"f2"
大小:4 块:8 IO 块:4096 普通文件
设备:fd01h/64769dInode:1704010 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/ huiyu) Gid:( 1000/ huiyu)
最近访问:2019-12-20 16:29:26.222751069 +0800
最近更改:2019-12-20 16:29:24.108666483 +0800
最近改动:2019-12-20 16:38:28.407444298 +0800
创建时间:-
```
删除后,对应inode的硬连接数减1, 只有当硬链接数为0时, inode才会被删除
## 7. 软连接
``` linux
ln -s 源文件或文件夹 目标文件或文件夹
```
软连接和硬链接类似,但是不会增加inode的硬连接数,它是对源文件的文件名的引用
## 8. 文件夹和文件有什么区别
文件夹就是一个文件,只不过里面记录的是子文件的名称。
## 参考文章
[https://www.ruanyifeng.com/blog/2011/12/inode.html](https://www.ruanyifeng.com/blog/2011/12/inode.html)
[https://en.wikipedia.org/wiki/Inode](https://en.wikipedia.org/wiki/Inode)
[https://hqidi.com/50.html](https://hqidi.com/50.html)