文件系统整理

文件系统

文件系统的定义

文件系统是磁盘上特有格式的一片区域,操作系统通过文件系统可以方便的查询和访问其中的磁盘块,是磁盘系统用来存储的管理文件的方法。从系统角度来看,文件系统对文件存储空间进行组织、分配,并对文件的存储进行保护和检查。从用户角度来看,文件系统可以帮助用户建立文件,并对文件的读,写和删除操作提供保护和控制。

常用文件系统的介绍

Linux:ext2, ext3, ext4, xfs, btrfs, reiserfs, jfs, swp Windows:FAT32,ntfs UNIX:FFS, UFS, JFS2 网络文件系统:NFS, CIFS 集群文件:GFS2,OCFS2 分布式文件系统:ceph,moosefs, mogilefs, GlusterFS, Lustre

日志型文件系统

日志型文件系统的特点是:在存储数据时,现在日志区存储元数据,然后在数据区存储数据,结束后检测是否有错误,若无错误,则将日志区中的数据移至元数据区。所以,日志型文件系统在发生故障,恢复文件时速度很快,但在存储数据时速率较慢,但总体上能忽略这点不足之处。

  • ext3

  • ext4

  • xfs

非日志型文件系统

非日志文件系统是将元数据直接存储至元数据区,所以速率较快,但安全性不及非日志型。

  • ext2

  • vfat

ext2 ext3 ext4之间的区别和联系

1.ext2–>ext3

  • 增加了日志功能

2.ext3–>ext4

  • 更大的文件系统和更大的文件

  • 无限数量的子目录

  • 采用Extents的映射方式,不再采用Ext3的间接块映射

  • 多块分配:一次调用分配多个数据块,而Ext3一次只能调用一个数据块

  • 延迟分配:知道文件在cache中写完才开始分配数据块写入磁盘,与多块分配结合优化整个文件的数据块分配。而Ext3采用的是尽快分配。

  • 加快fsck,无需检查所有的inode。检查时跳过了列出的未使用的inode列表中的inode号。

  • 日志校验

  • 允许关闭日志模式,即“无日志”模式

  • 在线碎片整理

  • 支持更大的inode大小,有Ext3默认的128字节,变为256字节。且能支持快速拓展属性。

  • 持久预分配,就预先分配好与所下载文件大小相同的空间,以防空间不足下载失败。

  • 默认启用barrier.不许再日志数据写入磁盘之后才能刺耳commit记录。

关于xfs文件系统的一些特性

查看详细内容点击此处

  • 日志型文件系统

  • 分配组

  • 条带化分配

  • 基于Extent的分配方式

  • 可变块尺寸

  • 延迟分配

  • 稀疏文件

  • 扩展属性

  • Derict I/O

  • 确定速率I/O

  • DMAPI(数据库管理应用程序接口)

  • 快照,不直接提供对文件系统快照的支持,结合LVM使用

  • 在线尺寸调整,在线调整XFS文件系统的大小

  • 原生备份、恢复工具,xfsdump,xfsretore,dump是无需卸载XFS, 且备份或恢复过程是可中断的,无需冻结数字流

  • 源自磁盘配额,磁盘配额在文件系统被初次挂载时启用。

  • 默认启用“写入屏障”

  • 默认使用内置日志,但可将日志放置在一个分离的物理设备上,提高系统的性能。

  • 文件系统无法被收缩

Btrfs文件系统的简要介绍和特点

trfs(B-tree 文件系统,通常念成 Butter FS,Better FS或B-tree FS),一种支持写入时复制(COW)的文件系统,运行在 Linux 操作系统上,采用 GPL 授权。Oracle 于 2007 年对外宣布这项计划,并发布源代码,2014 年 8 月发布稳定版。目标是取代 Linux 当时主流的 ext3 文件系统,摆脱 ext3 的一些限制,特別是单文件大小,文件系统总大小和文件校验,并加入 ext3 不支持的一些功能,比如可写快照(writable snapshots)、快照的快照(snapshots of snapshots)、内建磁盘阵列(RAID),以及子卷(subvolumes)。Btrfs 也宣称专注于「容错、修复及易于管理」。

  • 联机碎片整理

  • 联机卷生长和收缩

  • 联机块设备增加和删除

  • 联机负载均衡(块设备间的对象移动以达到平衡)

  • 文件系统级的镜像(类RAID-1)、条带(类RAID-0)

  • 子卷(一个或多个单独可挂载基于每个物流分区)

  • 透明压缩(目前支持zlib和LZO)

  • 快照(只读和可写,写复制,子卷复制)

  • 文件克隆

  • 数据和元数据的校验和(目前是CRC-32C)

  • 就地转换(带回滚)ext3/4

  • 文件系统种子

  • 用户定义的事务

  • 块丢弃支持

文件系统知识补充

文件名是元数据但不在inode中。 inode number: 访问文件时首先查找inode,根据inode中的指针查找block

Inode Note, 索引节点 地址指针:最大单个文件大小取决于地址指针的组织结构和地址指针所能占据的最大空间大小

  • 直接指针:引入的块的数量较少,因为块的编号占空间。

  • 间接指针

  • 三级指针

元数据区是实现分配好的,但是没被填充数据。 inode有标志位,区分是空的还是已填充数据的。 做全盘扫描,太慢,做索引。在索引上,做对位索引。

inode bitmap: 对位标识每个inode空闲与否的状态信息。 索引位图需要一个磁盘块保存。

先分块组,在块组上分数据区和元数据区。在元数据区有块位图,inode table,索引位图。块组自己的布局结构是保存在数据区的GDP(Group DescriPtion) 使用dumpe2fs查看。

文件访问时,先找到inode,通过目录查找inode号

要找/var/log/message时,先要找根的inode,这是必须事先知道的,然后通过inode号找到根的磁盘块,在块中找到var及var所在inode的编号,通过inode编号找到inode,在inode中找到var对应的磁盘块,在块中找到log及其inode编号,。。。最后找到message的的磁盘块。称为路径映射。 速度慢,所以将目录存储在buffer。

硬链接:

不能创建目录的硬链接。 inode编号引用不能跨分区,即不能跨分区创建硬链接。 有两个文件路径指向同一个inode编号。 删除文件时是将inode标志位减1,为0时,则表示为空,可将其覆盖。实际上数据未被真实删除。 指向相同inode的不同路径。创建文件的硬链接即为为inode创建新的引用路径,因此会增加其应用次数

软链接: 符号链接

可对目录进行 可跨分区 执行另一个文件的路径,其大小为执行路径字符串的长度,不增加或减少目标文件inode的引用计数。 在inode编号中应存放地址指针的位置存放了一串字符串即另一文件路径。 它的文件大小是指向的文件名的大小 软链接的文件权限是777 指向不同inode

ln [-sv] SRC DEST -s: symbolic link v;verbose

创建文件系统

在linux中我们可以创建许多种类型的文件系统,下面我们就以ext4为例。

1.我们先来了解fdisk命令。

[root@localhost ~]# fdisk -l

Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 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: 0x00099a93

 Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448    58728447    29056000   83  Linux
/dev/sda3        58728448    62924799     2098176   82  Linux swap / Solaris

这个命令是显示当前系统所磁盘的空间使用信息,这段信息显示当前只有一个磁盘/dev/sda,共有三个分区/dev/sda1,/dev/sda2,/dev/sda3

我们第一步要做的是创建新分区。

[root@localhost ~]# fdisk /dev/sda #对/dev/sda进行操作,如增加分区,删除分区,修改分区等
Command (m for help): n  #添加分区
Partition type:
 p   primary (3 primary, 0 extended, 1 free)  #主分区
 e   extended   #逻辑分区
Select (default e): e  #选择创建逻辑分区
Selected partition 4   #选择创建第4个分区
First sector (62924800-83886079, default 62924800):  #默认
Using default value 62924800
Last sector, +sectors or +size{K,M,G} (62924800-83886079, default 83886079): 
Using default value 83886079   #默认,但也可以使用+5G之类的用法
Partition 4 of type Extended and of size 10 GiB is set
Command (m for help): n   #添加分区
All primary partitions are in use
Adding logical partition 5   
First sector (62926848-83886079, default 62926848):   #默认分区其实地址
Using default value 62926848
Last sector, +sectors or +size{K,M,G} (62926848-83886079, default 83886079): +5G  #设置分区大小
Partition 5 of type Linux and of size 5 GiB is set
Command (m for help): w  #保存设置
The partition table has been altered!

现在,我们已经创建好分区了。 注意:此时的分区好没有保存到内核中。我们需要以下命令将其加载到内核中。

[root@localhost ~]# partx -a /dev/sda  #通知内核添加新增加的分区
partx: /dev/sda: error adding partitions 1-6  #不需要在意这些错误,已经添加成功了

2.创建好了分区,就要在分区上创建文件系统。此时我们创建ext4文件系统

[root@localhost ~]# mkfs.ext4 -L 'MYDATA' -b 1024 /dev/sda5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=MYDATA # 由 -L 指明的卷标
OS type: Linux
Block size=1024 (log=0)  # 由-b 设置的块大小,默认为4096
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 5242880 blocks
262144 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=38797312
640 block groups
8192 blocks per group, 8192 fragments per group
512 inodes per group
Superblock backups stored on blocks:  #超级块在以下块中备份
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553, 
    1024001, 1990657, 2809857, 5120001

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done #成功

关于ext系列的文件系统,我们还有一种专用的创建的命令:

mke2fs: ext系列文件系统专业管理工具
    -t {ext2|ext3|ext4}
    -b {1024|2046|4096}
    -L 'LABEL'
    -j: 相当于 -t ext3
    -i #: 数据空间每多少个字节创建一个inode: 此大小不应小于block的大小
    -N #:为数据空间创建多少个inode
    -m #:为管理人员预留的空间占据的百分比
    -O FEATURE[,...]
        -O ^FEATURE: 关闭指定特性

3.好啦,现在我们就创建好了。只要再将该分区挂载到一个目录就可以了。

[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/sda5 /test

此时我们就全部成功了。 注意此时挂载只在当前shell有效,若想是开机后自动挂载可在/etc/fstab文件中添加如下信息:

/dev/sda5  #挂载设备   /test   #挂载点   ext4  #设备文件类型  defaults #默认挂载选项   0 #转储频率 0 #自检次序

卸载方法: umount /dev/sda5 #或者是挂载点 /test

4.我们现在可以查看关于新增加的文件系统的信息

[root@localhost ~]# blkid #显示块设备属性 
/dev/block/8:2: UUID="50aa3cc7-ffb8-4d3b-98a4-ac5896810534" TYPE="xfs" 
/dev/block/8:1: UUID="f449ee2d-e77a-43f0-aab1-eadc353c19f9" TYPE="xfs" 
/dev/block/8:3: UUID="039dd390-88b5-424b-862c-3d68a88bf193" TYPE="swap" 
/dev/sda5: LABEL="MYDATA" UUID="ae0314bd-b6e8-4e9b-8bb5-507ee5f7770c" TYPE="ext4" 

[root@localhost ~]# blkid -L 'MYDATA' # 根据对应的LABEL来查看对应的设备
/dev/sda5
[root@localhost ~]# blkid -U 'ae0314bd-b6e8-4e9b-8bb5-507ee5f7770c' # 根据指定的UUID来查找对应的设备
/dev/sda5


[root@localhost ~]# dumpe2fs /dev/sda5 #显示指定块设备的超级块信息及块组信息
                        -h:只显示超级块信息

[root@localhost ~]# tune2fs -l /dev/sda5  #显示指定块设备的超级块信息
                        -l:查看指定文件系统超级块信息:
                        -L 'LABEL': 修改卷标
                            等同于:
                            e2label: 管理ext系列文件系统的LABEL
                            # e2label DEVICE [LABEL]
                        -m #;修改预留给管理员的空间百分比
                        -j:将ext2升级为ext3
                        -O:文件系统属性启用或禁用
                        -o:调整文件系统的默认挂载选项
                        -U UUID:修改UUID号

5.最后就是文件系统的检测和修复。

[root@localhost ~]# fsck /dev/sda5 #或挂载点,卷名
fsck from util-linux 2.23.2
e2fsck 1.42.9 (28-Dec-2013)
MYDATA: clean, 11/327680 files, 120141/5242880 blocks

可以指定文件系统类型:fsck -t ext4 /dev/sda5 
                   fsck.ext4 /dev/sda5
-a:自动修复错误
-r: 交互式修复错误

关于ext系列还有一个专用的命令:

[root@localhost ~]# e2fsck /dev/sda5
e2fsck 1.42.9 (28-Dec-2013)
MYDATA: clean, 11/327680 files, 120141/5242880 blocks

-y:自动回答yes
-f: 强制修复

注意:检查修复是必须先卸载块设备

6.下面我们来说一说swap的创建和使用

    mkswap: 创建交换分区
        前提:设置分区类型为82
    挂载交换分区:
        启用:swapon 
            swapon [OPTION]...[DEVICE]
                -a: 激活所有的交换分区
                -p PRIORITY: 指定优先级

        禁用:swapoff 

    内存空间使用状态:
        free [OPTION]
            -m:以MB为单位
            -g:以GB为单位

        Mem:物理内存
        -/+ buffers/cache: 加减缓冲或缓存的空间大小。
        swap:交换空间大小

    文件系统空间占用等信息的查看工具:
        df:
            -h: human-readable
            -i: inodes instead of blocks
            -P: 以Posix兼容的格式输出

7.最后补充一些命令的使用

mount: 显示当前系统以挂载的所有设备,通过查看/etc/mtab
    mount [-fnrsvw] [-t vfstype] [-o options] device dir
        device: 指明要挂载的设备
            (1) 设备文件:/dev/sda5
            (2) 卷标: -L 'LABEL' 
            (3) UUID: -U
            (4) 伪文件系统名称:pric, sysfs, devtmpfs, comfigfs
        dir: 挂载点
            事先存在:建议使用空目录
            处于工作中的设备无法挂载

            常用选项:
                -t vfstype: 指定要挂载的设备上的文件系统类型
                -r: readonly 只读挂载
                -w: read and write, 读写挂载
                -n: 不更新/etc/mtab
                -a: 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab,且挂载选项中有“自动挂载选项”)
                -L 'LABEL';以卷标指定挂载设备
                -U 'UUID': 以UUID指定挂载设备
                -B:绑定目录到另一个目录上

        注意: 查看内核追踪到的以挂载的所有设备:/proc/mounts

        -o options: (挂载文件系统的选项)
            async: 异步模式: 
            写时复制(copy on write)
            sync: 同步模式
            同步I/O:写完后,直接将内存中的数据存储到磁盘上。数据可靠性高,但性能差
            异步I/O:写完后,不立即将内存数据存储到磁盘上。可靠性差,但性能高。

            atime/noatime:(包含,目录和文件) 更新访问时间戳,若要更改时间戳需在磁盘中修改。所以建议不更新访问时间戳。
            diratime/nodiratime: 目录的访问时间戳
            auto/noauto: 是否支持自动挂载
            exec/noexec: 是否支持将文件系统上应用程序运行为进程,能起到一定范围上的安全防范功能。
            dev/nodev: 是否支持在此文件系统上使用设备文件。
            suid/nosuid: 
            remount:重新挂载
            ro: 只读挂载
            rw: 读写挂载
            user/nouser;是否允许普通用户挂载设备
            acl: 启用此文件系统上的acl功能

            注意: 上述选项可多个同时使用,彼此使用逗号分隔:
                默认挂载选项:defaults
                    rw,suid,dev.exec,auto,nouser,and async

文件系统空间占用等信息的查看工具:
    df:
        -h: human-readable
        -i: inodes instead of blocks
        -P: 以Posix兼容的格式输出

查看某目录总体总体空间占用状态
    du:
        du [OPTION] ...DIR
            -s: sumary
            -h: human-readable

原创文章,作者:21期-扬州-蓝,如若转载,请注明出处:http://www.178linux.com/24167

(0)
21期-扬州-蓝21期-扬州-蓝
上一篇 2016-07-16
下一篇 2016-07-16

相关推荐

  • 树 非线性结构,每个元素都可以有多个前驱和后继 树是n(n>=0)个元素 n = 0时,称为空树 树只有一个特殊的没有前驱的元素,称为树的根root 树中除了根结点,其余元素只能有一个前驱,可以有0个或者多个后继 递归定义 树T是n(n>=0)个元素的集合,n=0时,称为空树 有且只有一个特殊元素根,剩余元素都可以被划分为m个互不相交的集合T1,…

    2018-04-16
  • M20-1扩展正则表达式作业

    1、取本机ip地址 [root@centos6 ~]# ifconfig eth1      Link encap:Ethernet  HWaddr 00:0C:29:35:DD:AB     &nb…

    Linux干货 2016-08-10
  • 磁盘管理

    设备类型分为字符设备和块设备 主设备号用来标识设备类型,次设备号标识同一类型下的不同设备 硬盘设备命名: scsi,sata,sas,usb:/dev/sd 不同设备/dev/sda  /dev/sdb 同一设备不同分区:/dev/sda1,/dev/sdb2…… 硬盘: 一片磁盘的一面叫做盘面,一张盘片有两个盘面 每个盘面有一个磁头,最多有256…

    Linux干货 2016-08-30
  • Linux用户管理相关

    Q1列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@radio_freshman ~]# who root     tty1         201…

    Linux干货 2016-11-13
  • 关于大型网站技术演进的思考(四):存储的瓶颈(4)

    原文出处: 夏天的森林    如果数据库需要进行水平拆分,这其实是一件很开心的事情,因为它代表公司的业务正在迅猛的增长,对于开发人员而言那就是有不尽的项目可以做,虽然会感觉很忙,但是人过的充实,心里也踏实。 数据库水平拆分简单说来就是先将原数据库里的一张表在做垂直拆分出来放置在单独的数据库和单独的表里后更进一步的把本来是一个整体…

    2015-03-11
  • linux 3.26 第一课

    setup app

    2018-03-26

评论列表(1条)

  • 马哥教育
    马哥教育 2016-07-16 22:44

    写的很好,排版也很漂亮,加油