文件系统与文件 — 从磁盘块到 statx
文件系统与文件 — 从磁盘块到 statx
这一章讲什么: 「文件」这个第 1 章就出现的词,这一章把它一直拆到 磁盘表面。拆完后你会明白:为什么文件有「逻辑大小」和「实际占用」 两个数(第 5 章的稀疏文件之谜)、为什么同一个 read() 能读 U 盘上的 FAT 分区和硬盘上的 ext4(VFS 的功劳)、以及
ls -l每个字段从哪个 数据结构里来(stat 家族)。项目:仿写stat和stat -f。 这是全书「计算机组成 ↔ 操作系统 ↔ 编程接口」三层贴得最近的一章。
1. 顶层全景:从磁粉到 stat 结构
磁盘(盘面→磁道→扇区,块 = 1/2/4KB,寻道时间是 I/O 的头号成本)
│ 设备驱动:每种磁盘一个驱动,但对内核接口统一(设备无关)
▼
分区(MBR/GPT 记录分区表;swap 分区、裸分区是别的用途)
│ 每个分区一个文件系统
▼
Ext2/3/4:引导块 + 若干块组
块组 = superblock 副本 + 组描述符 + 数据块位图 + inode 位图
+ inode 表 + 数据块区
│ inode:15 个块指针(12 直接 + 3 级间接)→ 最大 4TB
▼
VFS(虚拟文件系统):一张函数指针表,把 read/write 转发给具体文件系统
│ ← 这就是「万物皆文件」能在异构文件系统上成立的原因
▼
系统调用:stat/lstat/statx(文件元数据)、statfs/statvfs(文件系统元数据)图说:每层只依赖下一层的接口,这就是「设备无关 I/O」的完整含义1。
主线例子:spl_stat /var/log/lastlog 打印一个文件的全部元数据——
输出的每一行对应一个字段,字段的源头就在上面这张图的某一层。
2. 磁盘与驱动:慢在哪里
硬盘是一叠盘片(platter),每面一圈圈磁道(track),同一半径的所有 磁道构成一个柱面(cylinder),磁道切成扇区(sector),一个或多个扇区 组成块(block,常为 512/1024/4096 字节)——块是磁盘和内核之间 传输的最小单位2。读一次数据有三个时间分量:寻道时间(磁头移 到目标磁道,大头)、旋转延迟(等盘转到目标扇区)、传输时间。 前两者是「启动成本」,让磁盘比内存慢出数量级3。
设备驱动是对某类设备的内核函数集:磁盘驱动操纵控制器(动磁头、 读写),终端驱动、网络驱动同理。不同磁盘的驱动不同,但它们对内核 暴露的接口相同——内核与驱动之间有一层「设备无关接口」,上层从此 不用知道底下是什么盘4。这是后面一切抽象的第一块砖。
3. 分区与文件系统家族
一块盘可以切成多个分区(首扇区记录分区表,老式叫 MBR,新式叫 GPT),每个分区装一个独立的文件系统。分区的好处:按组隔离安全策略、 不同块大小适配不同文件尺寸、备份按区做、损坏范围可控;最大的坏处: 分区不能扩容5。swap 分区(内存换出区)和数据库的裸分区(不走 文件系统)是分区的非文件系统用途6。
Linux 认识的文件系统一长串:filesystems(5) man 页列出 ext2/3/4、
Minix、ISO9660(光盘)、NFS(网络)、tmpfs(全在内存)、proc(内核数据
结构的文件式接口)等7。家族简史:Minix fs → Ext(1992)→
Ext2(1994,Card/Ts'o/Tweedie)→ Ext3(只加日志)→ Ext4(2008,
性能升级)。日志(journaling)是把文件系统操作先记进日志文件,
崩溃后按日志恢复一致性,不用扫全盘——Ext2 与 Ext3 可以互转,
差别仅日志8。本章的解剖对象就是 Ext2/3/4。
4. Ext 文件系统解剖:块组里的五件套
分区布局:引导块(第一个块,装启动代码)+ 之后均分成块组 (block group;老式文献叫 cylinder group,那是按物理柱面分的, 现代磁盘对 OS 隐藏几何,改用逻辑块组)9。每个块组六件10:
| 组件 | 干什么 |
|---|---|
| superblock 副本 | 全局元数据:inode 总数、块总数、块大小、时间戳、挂载状态……100+ 成员。内核只用 0 号块组的,其余做故障备份 |
| 组描述符 | 本组各组件的起始块、已用/空闲块数 |
| 数据块位图 | 1 位对 1 块:1=占用 0=空闲。4096 字节的位图块 ⇒ 每组最多 2^15 个块 ⇒ 每组最多 128MB |
| inode 位图 | 同上,管 inode 表的空闲位 |
| inode 表 | 本组所有文件的 inode。Ext2/3 每个 inode 定长 128 字节 ⇒ 一块 4096 字节装 32 个;组里 256 个 inode 要 8 块表 |
| 数据块区 | 文件数据。尽力把文件的数据块和它自己的 inode 放同组 |
inode 的 15 个块指针:三级间接的算术
inode 里有一个(典型)15 个元素的块指针数组,块地址 4 字节。用法是 Unix 文件系统最经典的构造11:
| 指针 | 指向 | 覆盖范围(块=4KB) |
|---|---|---|
| 0–11(直接) | 12 个数据块 | 12×4KB = 48KB |
| 12(一级间接) | 一个存 1024 个块地址的块 | +1024×4KB = +4MB |
| 13(二级间接) | 1024 个一级间接块 | +1024²×4KB = +4GB |
| 14(三级间接) | 1024 个二级间接块 | +1024³×4KB = +4TB |
**图说:小文件零间接(读前 48KB 只要一次指针跳转);文件越大, 指针层数越深,定位一个数据块最多三次额外读盘。**代价是 CPU 要多次 解引用——被第 4 章的内核 I/O 缓冲抵消12。另两个性能知识点: 内部碎片——文件占整块,平均浪费最后一块的一半;块越大浪费越大 (100KB 均件浪费 2%,16KB 均件浪费 12.5%),1993 年一项 1200 万文件的 调查给出中位文件大小不到 2048 字节——这就是块大小不能乱定的依据13。
创建一个文件时,内核走五步
以 gcc -o myprog myprog.c 为例,open(O_CREAT) 背后是14:
1. 查文件名合法性、查目录里是否已有同名 → 有则停
2. 查进程对目录有没有写权限 → 没有则停
3. 从 inode 位图找一个空闲 inode(用内存副本;没有空闲 = "文件系统满")
4. 填写 inode:所有者、权限、时间……(先写内存表,内核定期回盘)
5. 在目录里写入一条新记录 (inode号 47, "myprog")随后的 write() 又做两件大事:按数据块位图分配空闲块(先直接块, 不够逐级升级到三级间接),把块地址记入 inode15。第 1 章「目录 = (inode 号, 文件名) 的表」那句定义,到这里有了全部机械细节。
5. VFS:一次 read() 通吃所有文件系统的秘密
把 FAT 格式的 U 盘挂上 Linux,spl_cp1 照样能拷它的文件——凭什么是 同一个 read()?FAT 的目录结构和 Unix 完全不同,read 的底层实现当然 也不能同16。答案是 VFS(virtual filesystem,虚拟文件系统): Ext2 作者在内核里造了一层抽象,定义「每个文件系统必须实现的一组 函数」(面向文件系统、inode、打开文件三类对象的操作表),运行时才 把调用绑定到具体实现——这正是 C++ 虚函数/延迟绑定的内核版17。
机制细节漂亮:打开文件的 OFD 结构里有个字段叫 f_op,是一张函数
地址表的指针;read() 实际执行的是 f_op->read(...)——文件在
FAT 上就调 FAT 的读函数,在 ext4 上就调 ext4 的18。挂载文件系统时,
内核按配置时生成的文件系统类型表填充这张表。VFS 由 Chris Provenzano
首创、Linus Torvalds 重写(BSD/Sun 那一支对应物叫 vnode)19。
判断(我们的,不是书里的): VFS 是「接口隔离」原则的顶级示范: 上层协议(系统调用语义)与下层实现(文件系统代码)通过一张函数表 解耦,新文件系统只要填好这张表就能挂载——ext4、btrfs、FAT 并列 存在三十多年,靠的就是这个。学内核之外的收获:你自己写库时, 「定义一张操作表、运行时再填」是解耦插件式扩展的标准手法—— 数据库的存储引擎接口、游戏引擎的渲染后端,都是 VFS 的孙子辈。 如果错,会错在: VFS 的成功依赖「上层语义足够稳定」这个前提; 如果系统调用语义本身频繁演进(比如 Linux 近年加 openat2),抽象层 也得跟着改——接口隔离不是免费的,它把变化关进了一层,但那一层 本身仍需维护。
6. 文件元数据:stat 家族与 st_mode 的位
三个 stat 与符号链接的岔路
stat(路径, &buf) 拿到目标的元数据;lstat 拿到链接本身的;
fstat 用已打开的 fd20。对照实验:一个指向 lastlog 的软链,
lstat 报「symbolic link、16 字节、0 块、自己的 inode」,
stat 报「regular file、292,292 字节、576 块」——软链有自己的
inode、不占数据块、权限位无意义(POSIX 说 0777 不代表什么)21。
struct stat 字段一览:st_dev(所在设备,用 major()/minor()
拆)、st_ino、st_mode(类型+权限)、st_nlink(硬链接数)、
st_uid/st_gid、st_size、st_blksize(I/O 最优块)、st_blocks
(512 字节块的分配数!不是 4KB)、st_atim/mtim/ctim(纳秒精度
的 timespec;老的 st_atime 等宏只取秒)22。系统数据类型
(uid_t、off_t……)的意义再强调一次:用类型而不是 int/long
声明变量,字节数才有跨平台保证23。
st_mode 的 16 位布局与三个特殊位
高 4 位:文件类型(S_IFMT 掩码:S_IFREG 普通 / S_IFDIR 目录 /
S_IFLNK 软链 / S_IFBLK 块设备 / S_IFCHR 字符设备 /
S_IFIFO 管道 / S_IFSOCK 套接字)
低 12 位:3 个特殊位 + 9 个权限位(rwx × user/group/others)
特殊位:u=setuid, g=setgid, t=sticky类型判断用宏函数:S_ISREG(m)、S_ISDIR(m)、S_ISLNK(m)……
权限判断用掩码:st_mode & S_IROTH24。
三个特殊位补完第 4 章的 setuid:setgid 对可执行文件 =
有效 GID 换主人;对目录 = 目录里新建的文件继承目录的组
(团队协作目录的标准做法)。活例:/usr/bin/write 是 root:tty +
setgid(-rwxr-sr-x),所以任何用户都能往 group-writable 的终端
写消息;mesg y/n 控制你自己终端的组写位25。sticky 位:
对目录(/var/tmp 就是),「任何人都能建文件,但只有文件主人、
目录主人、root 能删」(drwxrwxrwt 的 t);历史上对可执行文件是
「驻留交换区不换出」的老优化,现已无用26。
statx:为了出生时间
stat() 拿不到文件创建时间(birth time)——stat 命令却显示
Birth:。缺口在 Linux 4.11(2017)由 statx() 补上(Linux 特有,
glibc 2.28 起有包装,要 _GNU_SOURCE)27。要点:
- 文件指定方式四选一:绝对路径、相对路径(配合
AT_FDCWD)、 相对某目录 fd、AT_EMPTY_PATH直接用 fd28。 - mask 参数告诉内核你想要哪些字段(STATX_BASIC_STATS、
STATX_BTIME……);内核可以无视 mask——返回后必须查
stx_mask里对应的位才知道哪个字段真填了29。 AT_SYMLINK_NOFOLLOW标志 = lstat 语义(默认跟链接)。stx_btime就是出生时间;时间戳是statx_timestamp{秒, 纳秒}。__u32/__u64是内核定宽类型(grep -R '__u64' /usr/include找到asm-generic/int-ll64.h),打印时强转成 C 类型30。
7. 主线例子走查:spl_stat 与 spl_statfs
spl_stat:打印一个文件的 13 个字段
流程:解析 -L → 对每个参数 statx(AT_FDCWD, path, report_on_link, STATX_BASIC_STATS|STATX_BTIME, &buf) → 是软链且没带 -L 就用
readlink() 取目标名(readlink 不补结尾空字符,要自己加)31
→ print_statx() 按真 stat 的版式逐字段打印。格式化全是 printf
手艺:" Size: %-16llu"、"Access: (%04o / %s)"——每个字段宽多少
列是拿真命令的输出当尺子量出来的32。
预处理的四件小工具:mode2str()(16 位模式 → rwxrwxrwx 串)、
uid2name()/gid2name()(getpwuid/getgrgid 查名,查不到留空)、
ids2hexdecstr()(makedev 编码的 device ID 打两遍)、print_time()
(strftime 打秒 + 手动补 .纳秒 和时区)33。对照真命令:输出几乎
逐字符一致,只有 device ID 多了前导零34。
spl_statfs:一个函数不够就两个
目标:stat -f 的文件系统视图(块总数/空闲、inode 总数/空闲、
类型、ID、文件名上限)。两个候选:statfs(2)(Linux 专有;
LSB 已废弃它;__fsword_t 是内部类型;man 页原话「没人知道
f_fsid 该装什么」)和 statvfs(3)(POSIX 库函数,但没有
文件系统类型字段)35。混合解法:statvfs 拿大部分,statfs
只为 f_type——可移植性和完备性的折中36。
两个真正的坑:
- f_type 是 magic number:ext4 = 0xEF53、tmpfs = 0x1021994、
msdos = 0x4D44……要一张
switch (f_type)映射表。原书教了个 优雅招数:把 man 页的常量表复制进 vi,几条全局替换 (s/_SUPER_MAGIC//g、大小写转换、s/.../case ... return "..."/) 自动生成整段 C 代码37。 - fsid 字节序反了:
statvfs返回的 f_fsid 当成一个 64 位整数打 出来是7798a2a57e58ac74,而真命令显示7e58ac747798a2a5—— 高低两个 32 位要倒着打:先& 0xFFFFFFFF取低 4 字节, 再>>32取高 4 字节,按「低在前高在后」输出。写了个 fsidtest 小程序验证后才定的版式38。
三个真实文件系统的对照输出:本地 ext4、U 盘 msdos(FAT,inode 数全 0,
Namelen 1530)、光盘 isofs(块 2048,Free 全 0)——spl_statfs 全部
识别正确39。
8. 作者的判断与证据
有明证的:
- Ext 布局各组件的尺寸算术(位图 2^15 块/组、inode 表 32 个/块、 15 指针 48KB/4MB/4GB/4TB)都可从头文件和公开资料核验11。
- VFS 的 f_op 机制、Provenzano/Torvalds 的作者信息、vnode 对应物, 是内核史的公开事实1719。
- statx 的 mask 语义、内核可无视请求,直接引 man 页警告原文29。
- fsid 字节序反转是先写 fsidtest 验证、再定版式的实证流程38。
作者的判断:
- 「学文件系统先学数据结构」——引 Torvalds「围绕数据设计代码」 的主张作方法论背书20。这是立场鲜明的教学选择:方法(method) 基本略过。
- 「statfs 已弃、statvfs 无类型字段,所以混合用」——清晰的工程 折中陈述36。
- 块大小/内部碎片的权衡分析(2% vs 12.5% 均件)基于 1993 年的 文件尺寸调查——数据老了,结论的方向仍然成立(小文件多时 小块划算),但今天的「小文件」分布已变(容器镜像层、node_modules), 引用时注意年代13。
9. 边界与局限
- 块组结构是 Ext2/3/4 的。btrfs、XFS、ZFS 的布局完全不同 (动态 inode 分配、B-tree 目录……),本章解剖结论不能直接搬; VFS 层(§5)是通用结论,块组层(§4)不是。
- statx 是 Linux 4.11+ 特有——可移植代码要用条件编译回退到 stat()27。
- statfs/statvfs 这一片不在 POSIX 里(statvfs 在,statfs 不在), 文件系统元数据是全书「方言最重」的 API 区35。
- 没有讲日志(journal)的内部格式、没有讲崩溃恢复的实际过程—— 「日志=先记账后动手」的直觉层面之外,实现细节留给文件系统专著8。
- spl_stat 的增强版(-c 选字段)只给了设计骨架,实现是习题32。
10. 可带走的
主线例子,一行复述: statx(AT_FDCWD, path, AT_SYMLINK_NOFOLLOW, STATX_BASIC_STATS|STATX_BTIME, &buf) → 查 stx_mask 各位 →
S_ISLNK 判软链、readlink 补 \0、mode2str 转 rwx 串、getpwuid
查名、fsid 高低 32 位倒序打。
- 磁盘 I/O 的头号成本是寻道时间;块是传输最小单位(常 4KB)。
- Ext 块组五件套:superblock(0 号组为真,余为备份)、组描述符、 块位图(1 位 1 块)、inode 位图、inode 表 + 数据区。
- inode 15 指针:12 直接(48KB)+ 一级(4MB)+ 二级(4GB)+ 三级(4TB);层数 = 定位成本。
- 创建文件五步:查名→查权限→位图取 inode→填 inode→目录写记录。
- VFS = 函数指针表(OFD 里的 f_op),read() 的实现在运行时才 绑定到具体文件系统——C++ 虚函数的内核版。
- stat 跟链接、lstat 看链接本身、fstat 用 fd;st_blocks 是 512 字节块,st_blksize 是 I/O 建议块。
- st_mode 16 位:高 4 位类型(S_ISDIR 宏判)、低 12 位里 3 特殊 (setuid/setgid/sticky)+ 9 权限;目录的 setgid 让新文件继承组, 目录的 sticky 让外人删不动你的文件。
- 出生时间只有 statx 给(4.11+);mask 只是请求,真填了哪些要查 返回的 stx_mask。
- statfs 要废、statvfs 没类型字段——混着用;f_type 是 magic number,fsid 的高低位要倒序打。
- 系统数据类型(uid_t/off_t……)保证字节数;内核定宽类型 (__u64)在 asm-generic 头文件里,打印前强转 C 类型。
11. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 磁盘几何与寻道成本 | Chapter 6: Overview of Filesystems and Files | text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:49(搜「512, 1024, or 4096」) · :95(搜「seek time dominating」) |
| 驱动分层与设备无关 | 同上 | :112(搜「interface to the kernel is the same」) · :134(搜「layering of interfaces」) |
| 分区利弊 | 同上 | :160(搜「swap partition」) · :186(搜「cannot be increased in size」) |
| Linux 文件系统清单 | 同上 | :215(搜「filesystems (5)」) |
| ext 家族与日志 | 同上 | :250(搜「journaling」) |
| 块组布局 | 同上 | :291(搜「cylinder groups」) · :321(搜「block group contains」) |
| 位图容量算术 | 同上 | :351(搜「2 15 bits」) · :373(搜「32 inodes」) |
| 15 指针间接寻址 | 同上 | :392(搜「15 block pointers」) |
| 内部碎片与文件尺寸 | 同上 | :484(搜「internal fragmentation」) · :502(搜「2048 bytes」) |
| 创建文件五步 | 同上 | :524(搜「sequence of actions」) · :574(搜「Allocating data blocks」) |
| VFS 与 f_op | 同上 | :628(搜「spl_cp1」) · :653(搜「virtual filesystem」) · :671(搜「f_op」) · :686(搜「vnode」) |
| stat 三变体与软链实验 | 同上 | :858(搜「symbolic link」) · :1334(搜「link itself」) · :1338(搜「does not require」) |
| stat 结构与系统类型 | 同上 | :887(搜「struct stat」) · :924(搜「typedefs」) |
| st_mode 位与类型宏 | 同上 | :1018(搜「seven possible file types」) · :1058(搜「S_IFMT」) · :1080(搜「S_ISREG」) |
| setgid 与 write 命令 | 同上 | :1111(搜「inherit their group IDs」) · :1153(搜「-rwxr-sr-x」) |
| sticky 位 | 同上 | :1181(搜「protected from being deleted」) · :1190(搜「drwxrwxrwt」) |
| statx 与 mask 语义 | 同上 | :1388(搜「4.11」) · :1550(搜「absolute pathname」) · :1621(搜「may return fields」) |
| __u64 类型溯源 | 同上 | :1489(搜「grep -R」) |
| readlink 与 spl_stat | 同上 | :1686(搜「terminating null byte」) · :1862(搜「Table 6-1」) · :1927(搜「mode2str」) |
| spl_stat 对照输出 | 同上 | :2253(搜「leading zeros」) |
| statfs/statvfs 取舍 | 同上 | :2411(搜「nobody knows」) · :2471(搜「f_type field」) · :2485(搜「hybrid approach」) |
| magic number 映射表 | 同上 | :2587(搜「case」) |
| fsid 字节序反转 | 同上 | :2649(搜「reverse」) |
| spl_statfs 三系统对照 | 同上 | :2733(搜「tmpfs」) · :2750(搜「msdos」) · :2766(搜「isofs」) |
Footnotes
-
出处:「Chapter 6: Overview of Filesystems and Files」第 102–139 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:134,搜「layering of interfaces」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 36–53 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:49,搜「512, 1024, or 4096」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 86–100 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:95,搜「seek time dominating」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 102–139 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:112,搜「interface to the kernel is the same」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 141–188 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:186,搜「cannot be increased in size」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 159–163 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:160,搜「swap partition」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 205–237 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:215,搜「filesystems (5)」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 239–266 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:250,搜「journaling」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 284–300 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:291,搜「cylinder groups」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 320–327 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:321,搜「block group contains」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 389–443 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:392,搜「15 block pointers」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 450–479 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:477,搜「pointer dereferences」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 480–503 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:484,搜「internal fragmentation」) · :502(搜「2048 bytes」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 514–567 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:524,搜「sequence of actions」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 569–595 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:574,搜「Allocating data blocks」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 597–636 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:628,搜「spl_cp1」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 650–658 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:653,搜「virtual filesystem」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 667–674 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:671,搜「f_op」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 683–688 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:686,搜「vnode」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 822–868 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:858,搜「symbolic link」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 1316–1339 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1334,搜「link itself」) · :1338(搜「does not require」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 884–915 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:887,搜「struct stat」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 916–927 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:924,搜「typedefs」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1003–1097 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1018,搜「seven possible file types」) · :1058(搜「S_IFMT」) · :1080(搜「S_ISREG」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1099–1168 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1111,搜「inherit their group IDs」) · :1153(搜「-rwxr-sr-x」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1170–1199 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1181,搜「protected from being deleted」) · :1190(搜「drwxrwxrwt」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1383–1410 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1388,搜「4.11」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 1548–1586 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1550,搜「absolute pathname」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1593–1641 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1621,搜「may return fields」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 1482–1546 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1489,搜「grep -R」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1672–1694 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1686,搜「terminating null byte」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 1820–1922 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1862,搜「Table 6-1」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 1923–1959 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:1927,搜「mode2str」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 2220–2279 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:2253,搜「leading zeros」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 2360–2478 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:2411,搜「nobody knows」) · :2471(搜「f_type field」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 2484–2523 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:2485,搜「hybrid approach」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 2552–2615 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:2587,搜「case」)。 ↩ -
出处:「Chapter 6: Overview of Filesystems and Files」第 2616–2660 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:2649,搜「reverse」)。 ↩ ↩2 -
出处:「Chapter 6: Overview of Filesystems and Files」第 2727–2779 段(
text/12-ch06-chapter-6-overview-of-filesystems-and-files.txt:2733,搜「tmpfs」) · :2750(搜「msdos」) · :2766(搜「isofs」)。 ↩