目录
四、文件系统
分区与文件系统
对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统。
组成
最主要的几个组成部分如下:
-
inode : 一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 编号;
-
block : 记录文件的内容,文件太大会占用多个 block 。
-
superblock : 记录文件系统的整体信息,包括 inode 和 block 的总量、剩余量、使用量、以及文件系统的格式与相关信息等;
-
block bitmap : 记录 block 是否被使用的位域。
文件读取
对于 Ext2 文件系统,当要读取一个文件的内容时,先在 inode 中查找文件内容所在的所有 block ,然后把所有 block 的内容读出来。
而对于 FAT 文件系统,它没有 inode ,每个 block 中存储着下一个 block 的编号。
磁盘碎片
指一个文件内容所在的 block 过于分散。
block
在 Ext2 文件系统中所支持的 block 大小有 1K、2K 及 4K 三种,不同的大小限制了单个文件系统的最大大小。
大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大单一文件 | 16GB | 256GB | 2TB |
最大文件系统 | 2TB | 8TB | 16TB |
一个 block 只能被一个文件所使用的,未使用的部分直接浪费了。因此如果需要存储大量的小文件,最好选用较小的 block。
inode
inode 具体包含以下信息:
-
权限( read / write / excute );
-
拥有者与群主( owner / group );
-
容量;
-
建立或状态改变的时间( ctime );
-
最近一次的读取时间( atime );
-
最近修改的时间( mtime );
-
定义文件特性的旗标( flag ),如 SetUID... ;
-
该文件真正内容的指向( pointer )。
inode 具有以下特点:
-
每个 inode 大小均固定位 128 bytes(新的 ext4 与 xfs 可设定到 256 bytes);
-
每个文件都仅会占用一个 inode。
inode 中记录了文件内容所在的 block 编号,但是每个 block 非常小,一个大文件随便都要几十万的 block。而一个 inode 大小有限,无法直接引用这么多 block 编号,因此引入了间接、双间接、三间接引用。间接引用是指,让inode 记录的引用 block 块记录引用信息。
目录
建立一个目录时,会分配一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode 编号以及文件名。
文件的 inode 本身不记录文件名,记录在目录中,因此新增、删除、更改文件名操作与目录的 x 权限有关。
日志
如果突然断电,那么文件系统会发生错误,如断电前只修改了 block bitmap,而还没有将数据真正写入 block 中。
ext3/ext4 文件系统引入了日志功能,可以利用日志来修复文件系统。
挂载
挂载利用目录作为文件系统的进入点,即进入目录之后就可以读取文件系统的数据。
目录配置
为了使不同 linux 发行版本的目录结构保持一致性,Filesystem Hierarchy Standard(FHS)规定了 Linux 的目录结构。基础目录如下:
-
/ (root, 根目录)
-
/usr (unix software resource): 所有系统默认软件都会安装到这个目录
-
/var (variable): 存放系统或程序运行过程中的数据文件
五、文件
文件属性
用户分为三种:文件拥有者、群组以及其他人,不同的用户有不同的文件权限。
使用 ls
查看一个文件时,会显示一个文件的信息,例如:
drwxr-xr-x. 3 root root 17 May 6 00:14 .config
-
drwxr-xr-x : 文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段;
-
3 : 链接数;
-
root : 文件拥有者;
-
root : 所属群组;
-
17 : 文件大小;
-
May 6 00:14 : 文件最后被修改的时间;
-
.config : 文件名。
常见的文件类型及其含义有:
-
d : 目录;
-
-
: 文件; -
l : 链接文件。
9 位的文字权限字段中,每 3 个为一组,每一组分别代表对文件拥有者、所属群组以及其他人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。
文件时间有以下三种:
-
modification time(mtime): 文件的内容更新就会更新;
-
status time(ctime): 文件的状态(权限、属性)更新就会更新;
-
access time(atime): 读取文件时就会更新。
文件与目录的基本操作
1. ls
[列出当前工作文件或者目录的信息,目录的信息就是其中包含的文件](Linux ls命令:显示指定工作目录下的内容 - Linux命令 - C语言网)
## ls [-aAdfFhilnrRSt] file | dir
-a : 列出全部文件
-d : 仅列出目录本身
-l : 以长数据串行列出,包含文件的属性与权限等数据
2. cd
[更换当前目录](Linux cd命令:切换工作目录 - Linux命令 - C语言网)
cd [相对路径或绝对路径]
3. mkdir
[创建目录](Linux mkdir命令:创建目录 - Linux命令 - C语言网)
## mkdir [-mp] 目录名称
-m : 配置目录权限
-p : 递归创建目录
4. rmdir
删除目录,目录必须为空
## rkdir [-p] 目录名称
-p : 递归删除目录
5. touch
[更新文件时间或者建立新文件](Linux touch命令:修改文件的时间 - Linux命令 - C语言网)
## touch [-acmdt] filename
-a : 更新 actime
-c : 更新 ctime ,若文件不存在则不建立新文件
-m : 更新 mtime
-d : 后接当前日期或更新日期,可使用 --date="日期或时间"
-t : 后接更新日期而不使用当前日期,格式为 [YYYYMMDDhhmm]
6. cp
[复制文件,若源文件有两个以上,则目的文件一定要是目录才行](Linux cp命令:复制文件或目录 - Linux命令 - C语言网)
## cp [-adfilprsu] source destination
-a : 相当于 -dr --preserve=all
-d : 若来源文件为链接文件,则复制链接文件属性而非文件本身
-i : 若目标文件已存在,则覆盖前会先询问
-p : 连同文件的属性一起复制过去
-r : 递归持续复制
-u : desition 比 source 旧才更新 desition,或 desition 不存在的情况下才复制
--preserve=all : 除了 -p 的权限相关参数外,还加入 SELinux 的属性、links、xattr 等
7. rm
[删除某个目录及其下的所有文件及子目录,而对于链接文件,只是断开了链接,原文件内容保持不变](Linux rm命令:删除文件或目录 - Linux命令 - C语言网)
## rm [-fir] 文件或目录
-r : 递归删除
8. mv
[将文件或目录改名,或移动文件](Linux mv命令:移动或重命名文件或目录 - Linux命令 - C语言网)
## mv [-fiu] source destination
## mv [options] source1 source2 source3 .... directory
-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
修改权限
[chmod 管理文件或目录的权限](Linux chmod命令:权限管理 - Linux命令 - C语言网)
可以将一组权限用数字表示,此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的1权值为 4、2、1,即每个权限(读、写、执行)对应的数字权值为 r : 4、w : 2、x : 1。
## chmod [-R] xyz dirname/filename
示例:将 .bashrc 文件的权限修改为 -rwxr-xr--。
## chmod 745 .bashrc
## chmod u=rwx,g=rx,o=r .bashrc
也可以使用符号来限定权限
## chmod [ugoa] [+-=] [rwx] dirname/filename
- u : 拥有者
- g : 所属群组
- o : 其他人
- a : 所有人
- - : 移除权限
- + : 添加权限
- = : 设定权限
// 为 .bashrc 文件的所有用户添加写权限
## chmod a+w .bashrc
// 为 .bashrc 文件的所有用户移除可执行权限
## chmod a-x .bashrc
默认权限
-
文件默认权限:文件默认没有可执行权限,因此为 666,即 -rw-rw-rw;
-
目录默认权限:目录必须要能够进入,也就是必须有可执行权限,因此为 777,即 drwxrwxrwx。
可以通过 umask 设置或查看文件的默认权限,通常以掩码的形式来表示,例如 002 表示其他用户的权限去除了一个 2 的权限,也就是写权限,因此建立新文件时默认的权限是 -rw-rw-r--
目录权限
文件名不是存储在一个文件的内容中,而是存储在一个文件的所在目录中。因此拥有文件的 w 权限并不能对文件名进行修改。
目录存储文件列表,一个目录的权限也就是对其文件列表的权限。
因此,目录的 r 权限表示可以读取文件列表;w 权限可以修改(添加、删除、改文件名)文件列表;x 权限可以让该目录成为工作目录,x 权限是 r 和 w 权限的基础,如果不能使一个目录成为工作目录,也就没办法读取文件列表以及对文件列表进行修改了。
链接
## ln [-sf] source_filename dist_filename
-s : 默认是 hard link,加 -s 为 symbolic link
-f : 如果目标文件存在时,则先删除文件
1. 实体链接(硬连接)
-
通过索引节点号来进行连接;
-
允许一个文件拥有多个有效路径名(只有当最后一个连接失效,文件数据块及目录的连接才会被释放)。
在目录下创建一个条目,记录着文件名与 inode 编号,该编号就是源文件的 inode;
删除任意一个条目,文件还是存在,只要引用数量不为 0;
限制:不能跨越文件系统,不能对目录进行链接。
## ln /etc/a .
## li -i /etc/a a
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 a
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/a
2. 符号链接(软连接)
符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上(类似 Windows 的快捷方式);当源文件被删除了,链接文件就打不开了。
## ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
获取文件内容
1. cat
[取得文件内容并输出到标准输出,同时还可以用于合并文件](Linux cat命令:连接文件并打印到标准输出设备上 - Linux命令 - C语言网)
## cat [-AbEnTv] filename
-n : 打印出行号,连空白行也会有行号,但 -b 不会
2. tac
是 cat 的反向操作,从最后一行开始打印
3. more
[和 cat 不同的是,它可以一页一页的查看文件内容,适合大文档的查看](Linux more命令:显示文本文件内容 - Linux命令 - C语言网)
4. less
[和 more 类似,但是多了一个向前翻页的功能,用于分页显示文件或其他输出](Linux less命令:分页显示文件内容 - Linux命令 - C语言网)
5. head
[查看文件前几行](Linux head命令:查看文件前几行 - Linux命令 - C语言网)
## head [-n number] filename
-n : 后面接数字,代表显示几行
6. tail
[head 的反向操作,查看文件后几行](Linux tail命令:查看文件后几行 - Linux命令 - C语言网)
7. od
以字符或者十六进制的形式显示二进制文件