Extx 文件系统原理

block group

每个分区(partition)的组成为 boot sector -> block group -> block group -> block group -> ...

而每个block group的组成为 super block -> 文件系统描述 -> 区块对应表(block bitmap) -> inode对应表(inode bitmap) -> inode Table -> Data Block

文件系统描述

描述每个block group开始和结束的block号码。以及每一个区段(superblock、bitmap、inodemap、datablock)分别介于哪一个block号码之间。

block bitmap

用于描述block的使用情况,哪些block为空,哪些block已经在使用。

inode bitmap

用于描述inode的使用情况,哪些inode没在用,哪些inode已经在使用。

通过dumpe2fs观察文件系统

dumpe2fs [-bh] 装置文件名
dumpe2fs -h 仅列出superblock的数据

superblock inode block

  1. superblock 记录文件系统的整体信息,如inode/block的总量、使用量、剩余量、以及文件系统的格式和相关信息。

    superblock记录着

    1. block和inode的总量。
    2. 未使用和已经使用的block和inode数量。
    3. block和inode的大小
    4. 文件系统的挂载时间,最近一个写入数据的时间,最近一个检查硬盘的时间。
    5. 文件系统是否被挂载的标志 valid bit。未挂载为0、挂载为1。
      一般,superblock的大小为1024bytes。
      除了第一个block goup具有superblock,其他不一定具有superblock。若其他blockgroup有,则只是**对superblock的备份。
  • block
  1. inode 记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block号

    inode 记录着

    1. 档案的权限 rwx
    2. 档案的拥有者和群组
    3. 档案的容量
    4. 档案的三个时间ctime,atime,mtime
    5. 档案的特殊权限 SUID、SGID、SBIT
    6. 档案真正的内容指向,指向block区
      inode的大小和数量在格式化后就不能变。
      每个inode的大小为128bytes。
      每个档案占用一个inode。
      文件系统能够建立的档案数量与inode的数量有关。
      inode记录block号码的区域定义为12个直接、一个间接、一个双间接和一个三间接记录区。
      block直接为 -> 数据block
      block间接为 -> 间接block -> 数据block
      block双间接为 -> 间接block -> 间接block -> 数据block
      block三间接为 -> 间接block -> 间接block -> 间接block -> 数据block
  2. block 实际记录档案的内容,若档案太大,会占用多个block

    每个block的大小可以为1kB2KB4kB
    原则上,block的大小和数量格式化后就不能改变。
    每个block只能放置一个档案的内容。
    档案大会占用多个block,档案小会占用一个block,并浪费block其余空间。

文件与目录

目录

每个目录的block记录着目录下的文件名和对应的inode号

日志文件系统

例如,文档创建开始记录日志,文档创建结束记录日志,这种方式有利于数据一致性检查

挂载相关

硬盘的文件系统目录树 结合的方式称为 挂载。文件系统必须挂载到目录树的某个目录后,才能被使用。

文件系统最顶层目录的inode号 一般为 2

通过ls -l /lib/modules/$(uname -r)/kernel/fs 可以查看linux支持的文件系统

通过cat /proc/filesystems 可以查看linux目前加载的文件系统。

VFS(virtual filesystem switch) 会帮助我们管理文件系统。

iso的挂载和制作

iso的挂载

通过命令 mount -o loop /tmp/xx.iso /mnt 进行挂载。

制作大档案进行挂载(制作iso映像)

dd if=/dev/zero of=/home/loopdev bs=1M connt=512 制作/home/loopdev大小为512M的档案,内容为空。
if 指定 input file
of 指定 output file
bs 指定每个block的大小
count 指定有多少个block

然后进行格式化
mkfs -t ext3 /home/loopdev

然后进行挂载
mount -o loop /home/loop/dev /media/cdrom

查看过载情况
df 或 mount

建立 swap partition

  1. 通过fdisk分割磁盘块,并需要修改system id

    通过 fdisk的 t 修改系统ID

  2. 通过mkswap进行格式化

    mkswap /dev/hdc7
    free

  3. 通过swapon将swap启动

    swapon /dev/hdc7
    free

  4. 通过free观察内存的用量
  5. 通过swapoff关掉swap file

知识点

数据更改后只会从clean变成dirty,数据从内存到硬盘是异步的。可通过sync命令同步写入到硬盘。

linux会将常用的档案或数据放在主存储器的缓冲区,以加快文件系统的读写,因此linux的物理内存最后都会别用光。

挂载注意:

单一文件系统不应该重复挂载到不同挂载点。
单一目录不应该重复挂载多个文件系统。
挂载点目录理论上应该为空目录。

挂载的一些限制:

根目录/必须挂载,而且必须先于其他挂载点挂载。
挂载点必须为已经建立的目录
挂载点同一时间只能挂载一次
partition同一时间只能挂载一次
不能再挂载点目录进行取消挂载

目录 /etc/fstab/etc/mtab 是开机挂载相关的目录

/etc/fstab 后面的两个数字的意义
第一个数字 是否进行dump备份

0 不做dump备份
1 每天进行dump备份
2 不定日期进行dump备份
第二个数字 是否以fsck检查扇区
0 不检查
1 最早被检验
2 检验,不是最早,一般根目录设定为1最早进行检验。

通过 mount -a/etc/fstab 进行测试,否则影响开机
通过 df 查看 挂载信息。

单人模式下根目录 是只读的。可通过 mount -n -o remount,rw / 重新挂载改成读写。

linux支持的文件系统在 /lib/modules/$(uname -r)/kernel/fs
/etc/filesystems 系统指定的测试挂载文件系统类型
/proc/filesystems 系统已经加载的文件系统类型 d

当通过ls /dev下面的装置时,group后面的是 major号minor号。可以称为主装置号和次装置号。例如

/dev/hda major为 3 minor为 0~63
/dev/hdb major为 3 minor为 64~127
/dev/sda major为 8 minor为 0~15
/dev/sdb major为 8 minor为 16~31

基本上,linux2.6之后,硬件文件名都能被系统实时产生。要手动处理装置档案,可通过 mknod命令

文件系统命令

  1. dumpe2fs (观察文件系统的各部分,superblock inode block等)
  2. df (查看目前挂载的装置,查看整体磁盘使用量)

    df -h 以GB、MB等方式显示
    df -h /etc 查看/etc的可用磁盘容量。
    df -ih 显示可用的inode数量。

  3. e2fsck (进行数据一致性检查,inode bitmap、block bitmap、superblock等元数据的一致性)
  4. sync (在内存中dirty的数据同步写入硬盘)
  5. du (查看文件系统磁盘使用量,默认以kB为单位)

    du -a 档案的容量也列举出来
    du -s /* 目录的容量

  6. ln (制作链接档)

    ln srcfile dst_linkfile 创建硬链接
    ln -s srcfile dst_linkfile 创建软链接
    硬链接不占用inode和block,软链接占用inode和block
    du -sd;df -i 查看当前目录的总大小和inode使用情况

  7. fdisk (进行磁盘分区,仅对装置起作用,只有root才能执行)

    df / 找出根目录所在磁盘
    fdisk /dev/sda 对/dev/sda进行操作
    fdisk -l 列出所有装置的分区情况

  8. partprobe (强制让核心重新捕捉partition table)

    在fdisk进行分区后使用

  9. mkfs (格式化分区 make file system)

    mkfs [-t 文件系统格式] 装置文件名

  10. mke2fs (自定义格式户分区)

    mke2fs -b [1024|2048|4096] 指定block大小
    mke2fs -j 创建ext3文件系统,默认为ext2
    mke2fs -L LABEL 设定文件系统的label
    mke2fs -i size 设定每多少字节分配一个inode

  11. fsck (进行文件系统检测修复)

    fsck -t type 指定文件系统类型
    fsck -A 依据/etc/fstab的内容,对需要的装置扫描一遍。
    fsck -a 自动修复,不需要老按y
    fsck -C 扫描过程中使用直方图显示进度
    fsck -f 强制检查clean的地方
    最好在卸载情况下扫描

  12. mount (挂载命令)

    mount -a 根据/etc/fstab对未挂载的文件系统进行挂载
    mount -l 显示目前的挂载信息,及label
    mount -t type 指定文件系统类型
    mount -n 默认会将挂载信息写入/etc/mtab,-n则不写入
    mount -L 通过label进行挂载
    mount -o 后接挂载参数
    mount 装置文件名 挂载点
    mount /dev/sda5 /mnt
    mount -t iso9660 /dev/cdrom /media 挂载光盘
    mount -t vfat /dev/fd0 /media 挂载软盘
    mount -p loop /root/xxx.iso /mnt 挂载iso映像文件。
    fdisk -l 找出U盘的装置文件名
    mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash 挂载U盘,不能是NTFS格式
    mount -o remount,rw,auto / 重新挂载根目录,并加入参数rw,auto
    mount --bind /home /mnt/home 将某个目录挂载到其他目录
    mount -L "LABEL" /mnt 通过Label进行挂载
    挂载参数 -o
    async/sync 设定磁盘是否以异步方式运作,默认为async异步
    auto/noauto 是否注定测试挂载
    rw/ro 设定读写还是只读
    exec/noexec 设定是否可执行
    user/nouser 是否允许用户通过mount挂载
    suid/nosuid 是否允许suid的存在
    usrquota 启动文件系统支持磁盘配额
    grpquota 启动文件系统支持群组磁盘配额
    defaults 默认参数

  13. umount (取消挂载)

    umount [-fn] 装置文件名或挂载点
    umount -f 强制取消挂载
    umount -n 不更新 /etc/mtab

  14. mknod (手动设置装置档案)

    mknod 装置文件名 [bcp] [major] [minor]
    参数 b 为设定装置名称成为一个周边存储设备档案,例如硬盘。
    参数 c 为设定装置名称成为一个周边输入设备档案,例如鼠标、键盘。
    参数 p 为设定装置名称成为一个FIFO档案。
    mknod /dev/hdc10 b 22 10
    mknod /tmp/testpipe p

  15. e2label (格式化之后修改文件系统的label)

    e2label 装置文件名 newLabelName
    e2label /dev/hdc10 "my_label" 修改/dev/hdc10的LABEL为my_label
    dumpe2fs -h /dev/hdc10 可以查看文献系统的label

  16. tune2fs ()

    tune2fs [-jlL] 装置号
    tune2fs -l 类似于 dumpe2fs -h
    tune2fs -j 将ext2升级为ext3
    tune2fs -L 修改文件系统的LABEL

  17. hdparm (侦测和修改IDE接口的硬盘参数)

    hdparm -Tt /dev/sda 可以测试SATA硬盘的读取效能

  18. mkswap (格式化swap分区)
  19. swapon (加载swap分区)
  20. swapoff (卸载swap分区)
  21. parted

    parted 装置 [指定[参数]]
    parted /dev/sda print 列出分割表信息
    parted /dev/sda mkpart logical ext3 19.2GB 19.7GB //创建逻辑分区
    parted /dev/sda rm 8 删除8号分区

其他知识点

硬链接

硬链接不能跨文件系统
硬链接不能对目录进行

参考

鸟哥的Linux私房菜 第三版

linux备忘录-文件系统管理的更多相关文章

  1. linux btrfs文件系统管理与应用

    btrfs文件系统管理与应用 1.btrfs文件系统 基本介绍 btrfs文件系统在CentOS7.x上属于技术预览版 btrfs文件系统英文名:B-tree  FileSystem或者Butter ...

  2. linux的文件系统管理(ext4-tune2fs-e2fsck-xfs文件系统)

    文件系统管理 文件系统是Linux系统存放文件的空间.文件系统的类型有很多种,CentOS支持多种文件系统,目前常用的是ext4和xfs文件系统.我们以ext4文件系统为例来说明对文件系统的管理. U ...

  3. Linux高级文件系统管理(8)

    如果您的 Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁碟配额 (Quota) 就是一项非常有用的工具,另外,如果你的用户常常抱怨磁盘容量不够用,那么更进阶的文 ...

  4. Linux学习 -- 文件系统管理

    1 分区和文件系统 分区类型 主分区:<= 4个 扩展分区:只能有一个,也算主分区的一种   不能存储数据和格式化,只能用来包含逻辑分区 逻辑分区:扩展分区中划分的   IDE--最多59个   ...

  5. Linux进阶文件系统管理之RAID

    RAID 1.引言 RAID全称Redundant Arrays of Inexpensive Disks / Redundant Arrays of Independent Disks,即独立冗余磁 ...

  6. linux备忘录-基本命令

    基本命令 将命令分类为获取信息类,文件管理类,目录管理类,文本处理类,系统类,工具类. 获取信息类 uname # 输出所有信息 # 一行输出,空格分割 uname -a # 输出内核名称 uname ...

  7. 『学了就忘』Linux文件系统管理 — 57、Linux文件系统介绍

    目录 1.了解硬盘结构(了解即可) (1)硬盘的逻辑结构 (2)硬盘接口 2.Linux文件系统介绍 (1)Linux文件系统的特性 (2)Linux常见文件系统 3.整理一下对文件系统的认识 在了解 ...

  8. Linux磁盘及文件系统管理

    在LINUX中我们知道一个很重要的概念,那就是"一切皆文件",这里的一切表示所有在LINUX系统的对象,自然也包括了LINUX中的硬盘设备.在LINUX中所有设备都被抽象成一个文件 ...

  9. linux下fdisk分区管理、文件系统管理、挂载文件系统等

    分区管理工具有:fdisk, parted, sfdisk fdisk:对于一块硬盘来讲,最多只能管理15分区: # fdisk -l [-u] [device...]  查看硬盘设备分区信息 # f ...

随机推荐

  1. removing vmware debugger from visual studio

    removing vmware debugger from visual studio by Ross on 十月 14, 2010 at 5:30 下午 under Visual Studio |  ...

  2. iclr2015

    http://www.iclr.cc/doku.php?id=iclr2015:main#accepted_papers iclr2015的accept papers,有些看过,有些没看明白,看来还是 ...

  3. CNN训练中的技巧

    转自: http://weibo.com/p/1001603816330729006673 说明:这个翻译应该是来自原文:http://yyue.blogspot.hk/2015/01/a-brief ...

  4. java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容

    8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character ...

  5. 统计寄存器AX中1 的个数

    ;==================================== ; 统计寄存器AX中1 的个数 DATAS segment DATAS ends CODES segment START: ...

  6. php-5.6.26源代码 - opcode处理器,“乘法opcode”处理器

    // opcode处理器 - 运算符怎么执行: “*” 乘法opcode处理器 static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(Z ...

  7. C# 禁止在textBox输入框输入非法字符

    首先添加下面代码 //禁止在textBox输入框输入非法字符 private void keypressed(Object o, KeyPressEventArgs e) { if (e.KeyCha ...

  8. 1、spring boot入门

    1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,martin fowler 微服务: ...

  9. 使用 jQuery Mobile 与 HTML5 开发 Web App 系列文章目录

    使用 jQuery Mobile 与 HTML5 开发 Web App 系列文章目录 时间:2012年9月20日 分类:JavaScript 标签:HTML5‚ jQuery Mobile‚ Web ...

  10. erlang节点互通查看

    在局域网内部,一般用短节点名来完成短节点的全联通.     全联通的前提之一是cookie要相同,cookie记录在一个文件中.     对于同一个物理机上的两个erlang节点,不用其他配置就可以全 ...