阅读 219

了解Linux存储结构与文件系统

前言

Linux 系统中一切都是文件。 不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。

根(/)

Linux 系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,以及定义了常见目录的用途。另外,Linux系统中的文件和目录名称是严格区分大小写的。

根目录文件结构

PC:/$ tree -L 1
.
├── bin //存放单用户模式下还可以操作的命令
├── boot //开机所需文件—内核、开机菜单以及所需配置文件等
├── cdrom //光驱挂载
├── dev //以文件形式存放任何设备与接口
├── etc //配置文件
├── home //用户主目录
├── lib //开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数
├── lost+found //当文件系统发生错误时,将一些丢失的文件片段存放在这里
├── media //用于挂载设备文件的目录
├── root //系统管理员的主目录
├── srv //一些网络服务的数据文件目录
├── tmp //任何人均可使用的“共享”临时目录
├── usr/local //用户自行安装的软件
├── usr/sbin //Linux 系统开机时不会使用到的软件/命令/脚本
├── usr/share //帮助与说明文件,也可放置共享文件
├── var //主要存放经常变化的文件,如日志
...
复制代码

物理设备命名

在 Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件。

常见硬件设备及其文件名称

image.png

设备文件名举例:/dev/sda5

  • dev:代表硬件设备文件所在的目录
  • sd:代表SCSI存储设备
  • a:代表硬盘的顺序号
  • 5:代表扩展分区的顺序号

文件系统

文件系统种类

用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统。常见的文件系统如下:

Ext3

能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。

Ext4

Android操作系统依托于Linux,所以主要的文件系统也是从Linux中发展而来,包括exFAT、ext3、ext4等,目前大多数手机仍使用Ext4,但相对于手机上使用的闪存设备来说,Ext4这一基于Linux的文件系统还有很大的优化空间。

F2FS

F2FS “Flash Friendly File System”,一种专门为闪存而生的文件系统,其优势就是小文件的传输速率更快。近年来不断的有旗舰机采用这一文件系统,华为、OnePlus、三星等,也使得这一文件系统在高端机上得到普及,促进了它的不断优化和兼容性。

inode和block

文件系统通常会将 文件权限(rwx)与文件属性(拥有者、群组、时间参数等)这部份的数据放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。 每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下:

  • superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
  • block:实际记录文件的内容,若文件太大时,会占用多个 block 。

如下图所示,文件系统先格式化出 inode 与 block 的区块,假设某一个文件的属性与权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的读取顺序。 那么数据的读取就如同下图中的箭头所指定的模样了。 这种数据存取的方法我们称为索引式文件系统(indexed allocation)。

image.png

虚拟文件系统

文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)。

VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。

挂载设备

什么是挂载? 当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,这个关联动作就是“挂载”。将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点。

mount命令没有建立挂载点的功能,因此你应该确保执行mount命令时,挂载点已经存在。(就是说要把文件系统挂载到哪,首先要保证目录存在)

mount命令

mount /dev/sdb2 /backup 将设备 /dev/sdb2 挂载到 /backup 目录

系统重启后挂载就会失效,linux提供了/etc/fstab配置文件可以在重启后自动挂载。 如果想让这个某个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中。 他的格式是:

设备文件 挂载目录 格式类型 权限选项 自检 优先级

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/nvme0n1p3 during installation
UUID=a181a5a3-34b0-452a-8aa6-afd60efef515 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=2497-B2DC  /boot/efi       vfat    umask=0077      0       1
# /home was on /dev/sdb1 during installation
UUID=22e1e864-578a-460e-94ea-e03a6b890178 /home           ext4    defaults        0       2
# /home/data was on /dev/sda1 during installation
UUID=e1eafdad-5310-4dc5-a3ae-44c2aadd1949 /home/data      ext4    auto,nouser,rw        0       2
# swap was on /dev/nvme0n1p2 during installation
UUID=f7ce45d5-ba45-4932-a48d-b08dba88cb26 none            swap    sw              0       0
复制代码

unmount命令

unmount /dev/sdb2 撤销挂载的设备文件

du命令

du [选项] [文件] du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小

例如:du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小。

PC:/$ sudo du -sh /*
13M	/bin
122M	/boot
4.0K	/cdrom
0	/dev
15M	/etc
复制代码

软链接和硬链接

在 Linux 系统中存在硬链接和软连接两种文件。

  • 硬链接(hard link):可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
  • 软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与 Windows 系统中的“快捷方式”具有一样的性质。

ln命令

ln 命令用于创建链接文件,格式为“ln [选项] 目标”

image.png

创建软链接:

PC:~/DEBUG$ echo "HelloWorld!" > readme.txt
PC:~/DEBUG$ ln -s readme.txt link.txt
PC:~/DEBUG$ cat readme.txt 
HelloWorld!
PC:~/DEBUG$ cat link.txt 
HelloWorld!
PC:~/DEBUG$ rm -rf readme.txt 
PC:~/DEBUG$ cat link.txt 
cat: link.txt: 没有那个文件或目录
复制代码

软链接的原始文件删除后,链接也失效了

创建硬链接:

PC:~/DEBUG$ echo "HelloWorld!" > readme.txt
PC:~/DEBUG$ ln readme.txt hardlink.txt
PC:~/DEBUG$ cat readme.txt 
HelloWorld!
PC:~/DEBUG$ rm -rf readme.txt 
PC:~/DEBUG$ cat hardlink.txt 
HelloWorld!
复制代码

硬链接的原始文件删除后,仍然可以通过硬链接文件来访问

文章分类
Android
文章标签