Linux 文件系统

linux下"一切皆文件",不仅数据被组织成文件形式,连各种设备资源也被抽象成了文件形式,而对文件只有read、write、open、close 几种操作,这样便统一了用户对各种资源的访问方式,简化了操作。

文件都有文件名与数据,对应用户数据 (user data) 与元数据 (metadata)。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。系统或程序通过 inode 号寻找正确的文件数据块。


Socket 是一个文件,使用前 unlink 以确保建立起链接(没有实际的文件数据,所以没必要 rm)

为解决文件的共享使用,两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)(类似快捷方式),命令:
ln -h,ln -s( ln [参数] [源文件或目录] [目标文件或目录(新)]
若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
  • 软链接有自己的文件属性及权限等;
  • 可对不存在的文件或目录创建软链接;
  • 软链接可交叉文件系统;
  • 软链接可对文件或目录创建;
  • 创建软链接时,链接计数 i_nlink 不会增加;
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
// npm 可以使用符号链接文件夹,不能使用符号链接文件

多个文件使用同一个 inode,则称这些文件为硬链接。因此硬链接存在以下几点特性:
  • 文件有相同的 inode 及 data block;
  • 只能对已存在的文件进行创建;
  • 不能交叉文件系统进行硬链接的创建;
  • 不能对目录进行创建,只可对文件创建;(避免产生目录环,因为./ ../就是系统使用的目录硬链接)
  • 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
// 事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失

linux 文件权限:
比如:-rwxr-xr-x,用过Linux的人都知道r代表该文件可读,w代表可写,x代表可执行,-就代表没有该权限。第一个rwx代表文件所有者的权限,第二个rwx代表和所有者同组人的权限,第三个rwx代表其他用户对该文件的权限。但下面这个文件就比较特殊。
/usr/bin/passwd的 所有者权限是rws,它的执行权限标志位是一个s,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,而这文件的所有者是 root。
// 在 git 中,文件权限存在 git 对象数据库中

安卓的data分区在mount时就指定了不能给可执行程序加s位,在安卓的root用户下执行mount可以看到data分区:rw,nosuid
重新挂载:mount -o rw,remount -t ext4 /system


ls -l 时 权限列 开头字符表示文件类型,比如d开头的表示 目录。
普通文件(-,f)、目录文件(d)、符号链接文件(l)、设备文件( 字符设备c,块设备b)、命名管道(p)、套接字文件(s)
查看文件类型file /path/to/somefile...,可同时查看多个文件的类型,中间用空格相隔
第二列是文件硬链接数或目录子目录数,第三列是文件拥有者,第四列是拥有者所在组
以下当我们将文件和目录并称时,一般指狭义上的"文件"
文件系统(基础就是 Linux VFS(Virtual File System 又称 Virtual Filesystem Switch)),大体上可分如下几类:
  1. 网络文件系统,如 nfs、cifs 等;
  2. 磁盘文件系统,如 ext4、ext3 等;
  3. 特殊文件系统,如 proc、sysfs、ramfs、tmpfs 等。


/ 根目录
├── bin 存放用户二进制文件
├── boot 存放内核引导配置文件
├── dev 存放设备文件
├── etc 存放系统配置文件
├── home 用户主目录
├── lib 动态共享库
├── lost+found 文件系统恢复时的恢复文件
├── media 可卸载存储介质挂载点
├── mnt 文件系统临时挂载点
├── opt 附加的应用程序包
├── proc 系统内存的映射目录,提供内核与进程信息
├── root root 用户主目录
├── sbin 存放系统二进制文件
├── srv 存放服务相关数据
├── sys sys 虚拟文件系统挂载点
├── tmp 存放临时文件
├── usr 存放用户应用程序
└── var 存放邮件、系统日志等变化文件

系统日志:/var/log/message