跳转至

文件系统相关技术

1 文件 rwx 权限和属性

  • https://wiki.archlinux.org/title/File_permissions_and_attributes
- 目录的r权限只能使用ls查看目录下的内容(文件名),不能读取文件内容,甚至不能查看到文件属性。
- 目录的w权限影响对目录下文件的修改,如touch、mkdir、rm、rename等操作,但同时需要**目录有x权限**,否则上面的操作也不能执行。注意上面的操作**不需要文件具有任何权限**。
- 目录的x权限可以使用cd命令,没有ls查看目录下内容的权限,却可以读取已知文件的内容或ls已知的文件。(目录路径上任一层没有x权限,都不能cd)
  • 示例:只有 r 权限
[shuhw@web138 tmp]$ ls -l
总用量 0
drwxrwxr--. 2 shuhw shuhw 15 6月  16 10:22 dir1
[shuhw2@web138 tmp]$ ls dir1/
ls: 无法访问dir1/1: 权限不够
1
[shuhw2@web138 tmp]$ ls -l dir1/
ls: 无法访问dir1/1: 权限不够
总用量 0
-????????? ? ? ? ?            ? 1
[shuhw2@web138 tmp]$ cat dir1/1
cat: dir1/1: 权限不够
  • 示例:只有 x 权限
[shuhw@web138 tmp]$ ls -l
总用量 0
drwxrwx--x. 2 shuhw shuhw 15 6月  16 10:22 dir1
[shuhw2@web138 tmp]$ ls dir1/
ls: 无法打开目录dir1/: 权限不够
[shuhw2@web138 tmp]$ cd dir1/
[shuhw2@web138 dir1]$ ls
ls: 无法打开目录.: 权限不够
[shuhw2@web138 tmp]$ ls dir1/1
dir1/1
[shuhw2@web138 tmp]$ ll dir1/1
-rw-rw-r--. 1 shuhw shuhw 10 6月  16 10:22 dir1/1
[shuhw2@web138 dir1]$ cat 1
111111111

1.1 chmod、chown

  • chmod 命令只能被文件所属的用户或者特权用户(root 或 sudo)执行,其它用户不能执行。
  • chown :
    • chown 的用户和文件拥有者相同时,即使普通用户也不报错。
    • chown 的用户组和文件拥有组相同时,即使普通用户也不报错。
    • chown 的用户和文件拥有者不相同时,命令只能被特权用户(root 或 sudo)执行,其它用户不能执行, 即使是文件拥有着都不能执行。

2 inode

1. inode 编号在分区级别是唯一的。每个分区都有自己的 inode 表。

3 链接

1. 不能在不同文件系统之间创建硬链接,因为可能inode号冲突。而软链接可以。

4 读放大、写放大

  • 写放大

    Write Amplification : 写放大,假设每秒写入 10MB 的数据,但观察到硬盘的写入是 30MB/s,那么写放大就是 3。写分为立即写和延迟写,比如 redo log 是立即写,传统基于 B-Tree 数据库刷脏页和 LSM Compaction 是延迟写。redo log 使用 direct IO 写时至少以 512 字节对齐,假如 log 记录为 100 字节,磁盘需要写入 512 字节,写放大为 5。

  • 读放大

    Read Amplification : 读放大,对应于一个简单 query 需要读取硬盘的次数。比如一个简单 query 读取了 5 个页面,发生了 5 次 IO,那么读放大就是 5。假如 B-Tree 非叶子节点都缓存在内存中,point read-amp 为 1,一次磁盘读取就可以获取到 Leaf Block;short range read-amp 为 1~2,1~2 次磁盘读取可以获取到所需的 Leaf Block。

  • 空间放大

    Space Amplification : 空间放大,假设我需要存储 10MB 数据,但实际硬盘占用了 30MB,那么空间放大就是 3。有比较多的因素会影响空间放大,比如在 Compaction 过程中需要临时存储空间,空间碎片,Block 中有效数据的比例小,旧版本数据未及时删除等等。

5 readddirplus

  • libfuse-readdirplus 据我所知,readdirplus 允许对 readdir() 的调用还包括将被缓存的 stat 信息。因此,一个 ls -l 命令将不再需要对每一个文件单独调用 getattr() 来获取 stat 信息。