加入收藏 | 设为首页 | 会员中心 | 我要投稿 92站长网 (https://www.92zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux文件系统概述

发布时间:2022-10-13 15:00:25 所属栏目:Linux 来源:转载
导读: 题外话
这是这个专栏的第一篇文章。创建这个专栏就是想记录一些平时的技术点滴,并不想博得很多人的眼球,只是单纯的想让自己能坚持这样一件事情。既然很多文章可能都代表自己的主观看法,

题外话

这是这个专栏的第一篇文章。创建这个专栏就是想记录一些平时的技术点滴,并不想博得很多人的眼球,只是单纯的想让自己能坚持这样一件事情。既然很多文章可能都代表自己的主观看法,我也不是什么圣人,所以难免有片面甚至错误的地方,欢迎看出的人指正。

我想了想这第一篇文章该写些什么,有很多可选项,但是最后还是觉得以一篇宽泛些的介绍性文章来开头吧,后面再开始逐渐设计细节。欢迎感兴趣的朋友关注和投稿。我自己也不是全能,以后可能也会找一些朋友来投一些文章,来尽量弥补内容面过于专一的问题。

正篇

既然这篇叫文件系统概述,那我们就来说一下什么是文件系统。我没有查阅有没有教科书的定义,从操作系统概念上讲,文件系统可以说与进程调度、内存管理等子系统并驾齐驱的一大子系统,主要负责数据的组织、存储与检索。它不是指一个实体的存储设备,而是指管理存储数据的格式与方法。

我记得知乎上曾有人问分区表和文件系统有什么关系,我当时就简单的回答了一句“没有任何关系”。分区表代表的对存储设备分区域管理的概念,分区之后的每一块区域对于文件系统来说都是独立的存储设备,本地文件系统(如ExtN, XFS, NTFS等)都是架设在一块或几块(如果有子卷管理)存储设备上的,对分区表没有任何要求。比如你有一块磁盘或U盘显示为/dev/sdb,你可以在/dev/sdb上直接做文件系统然后挂载/dev/sdb:

# mkfs.xfs -f /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=57600000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=230400000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=112500, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# mount /dev/sdb /mnt/scratch
# cat /proc/mounts |grep /dev/sdb
/dev/sdb /mnt/scratch xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
# umount /dev/sdb

也可以先对其分区,如分出/dev/sdb1和/dev/sdb2,然后在sdb1和sdb2上分别做文件系统并挂载:

# fdisk -l /dev/sdb
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    41945087    10485760   83  Linux
# mkfs.xfs -f /dev/sdb1
# mkfs.ext4 -F /dev/sdb2
# mount /dev/sdb1 /mnt/test && mount /dev/sdb2 /mnt/scratch
# cat /proc/mounts |grep /dev/sdb
/dev/sdb1 /mnt/test xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt/scratch ext4 rw,seclabel,relatime,data=ordered 0 0
# umount /dev/sdb1 && umount /dev/sdb2

你甚至还可以将sdb1和sdb2先做成LVM,然后在这个dm设备上做文件系统并挂载:

# pvcreate /dev/sdb1 /dev/sdb2
# vgcreate testvg /dev/sdb1 /dev/sdb2
# lvcreate -L 10G -n testdev testvg
# mkfs.xfs -f /dev/testvg/testdev
# mount /dev/testvg/testdev /mnt/test
# cat /proc/mounts |grep testdev
/dev/mapper/testvg-testdev /mnt/test xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0

更甚者,如果你愿意你可以给这个由两个分区做出来的一个LVM设备再分区,再在LVM的分区上再做文件系统并挂载(不展示那么多了,只展示分区部分):

# fdisk /dev/testvg/testdev 
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-20971519, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +5G
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): p
Disk /dev/testvg/testdev: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5d025e0f
              Device Boot      Start         End      Blocks   Id  System
/dev/testvg/testdev1            2048    10487807     5242880   83  Linux

当然你还可以有更“变态”的操作,而这一切说明的就是文件系统和其底层的存储设备是什么样子的,理论上是没有关系的(当然如果存储有问题那文件系统可能也不能工作)。

使用一个文件系统最重要的两个步骤一个是创建一个是挂载,创建文件系统(windows下好像俗称格式化),意思就是将文件系统的基本组织格式写道存储设备上。这些基本组织格式包括数据块大小,超级块信息,Free space组织结构等等,这里不做展开讨论,以后说到具体某个文件系统的on-disk结构时再说。总之创建文件系统是第一步。

有了一个文件系统后我们并不能直接访问它,你可以访问文件系统所在的磁盘,比如你对磁盘进行读写操作都没问题。但是文件系统不能在未挂载的情况下使用,我后面可能也会用几个篇幅讲挂载,这里就先简单说一下。同样,这里我也没有查挂载是否有教科书定义,从我的理解来说,挂载就是将存储设备上的文件和目录和已有目录树关联,让你可以通过文件系统的逻辑来访问存储设备。有人可能会问windows下他从没见过挂载一个设备这种事,我不想对windows的逻辑做过多解释,只能说实际上windows也是挂载的,只是它把根目录隐藏了起来,把挂载点以盘符的形式展示给你。这也是用贯windows的人转用Linux后很难理解的其中一个问题“盘符在哪里”。

这个真是一个很难说清楚的数字,从历史的长河来看,出现过的文件系统非常多。现在大家比较熟知的是NTFS, Ext2/3/4,ZFS,XFS,Btrfs,NFS等。这些是目前比较主流的文件系统,其中NFS不是本地文件系统,它是通过网络虚拟出文件系统的概念来访问Server端数据,其数据端往往架设在一个现有的本地文件系统之上(如ext4),然后export出一个挂载点,供Client端挂载使用。类似这样概念的文件系统还有很多。

NTFS:

Windows当前的默认文件系统,由于版权和组织格式(对inode不友好)等原因没有被Linux内核直接支持,但可以通过ntfs-3g用户态软件包配合Linux的FUSE机制来使用windows的NTFS文件系统。当你在Linux上插一块带有NTFS文件系统的U盘或硬盘时,挂载的时候Linux就会这样做。

ExtN:

Ext系列是Linux的老牌文件系统了,一直是Linux的主打,从Ext3开始支持日志,Ext4更加完善了很多功能。目前看好像没有Ext5这种打算,没看见Ted提过。由于其组织形式的限制,很难将很多现代文件系统的功能加进去,所以Linux才会出Btrfs项目企图重头开发一个功能强劲的文件系统。

Btrfs:

Btrfs的目标很远大,从创立之初就被冠以Linux下一代主打文件系统的称号。但是由于各种原因其一直不能足够稳定(这里说的是面对企业级应用级别,普通用户足够用)。RedHat一直没有将其纳入自己的系统主流,可见其确实bug不断。虽然SUSE选择的是Btrfs,但是也是在一定范围内支持,很多功能是不提供稳定保证的。希望Btrfs能越来越好。

ZFS:

这个可厉害了,它可以说是“目前最好”的文件系统(个人认为,抬杠就免了),功能强大且稳定。Btrfs也是很大程度上想超越至少看齐ZFS的。可惜ZFS只在Solaris上提供最新最全的功能,BSD上还是略逊,Linux上则没有这个直接支持。虽然有ZFSonLinux这个项目,但是那是另一个概念,不讨论了。

XFS:

RedHat当前的主流文件系统,以支持大存储大数据量为目标,目前上游开发活跃发展迅速,也是我主要为之服务的文件系统。后面我会有更多文章涉及XFS具体细节,这里就不多说了。

*VFS:

这里我列一下VFS是为了强调一下,这个不是文件系统linux压缩,这是一个文件系统上层的抽象,不是具体的某个文件系统。你跟人说文件系统包括VFS,就好像你说你编程语言学的VC++一样。

嗯……乱七八糟的也说了这么多了,果然概述这种东西还是很容易收不住也很容易说乱了。这第一篇文章就在这收尾吧。没什么实质性的内容,知道的人就别浪费时间看我这瞎掰了,不知道而感兴趣的就好得看看就行。尽信书不如无书,我这里说的已经不知道是第几手的知识传递了,如遇与你所知不符还是以一手材料为准。

更多内容请参阅:

醉卧沙场:README - 专栏文章总索引

(编辑:92站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!