磁盘与文件系统管理

1 EXT2文件系统

1.1 硬盘组成与分区

  • 硬盘组成
    • 扇区sector:是最小的物理存储单位,每个扇区为512bytes
    • 磁道track:多个扇区组成一个圆,称为磁道
    • 柱面cylinder:不同盘片上的同位磁道组成一个圆柱面,称为柱面,柱面是磁盘分区的最小单位
    • 磁头数head:一块硬盘中的盘片数
    • 磁盘容量计算:512bytessectors/trackcylinders*head
    • 第一个扇区最重要,里面有硬盘主引导记录MBR(446bytes)和分区表(64bytes)
    • IDE接口的磁盘文件名为/dev/hd[a-d][1-63],其他接口的磁盘文件名为/dev/sd[a-p][1-15]
  • 磁盘分区
    • 第一扇区的分区表只有64bytes,只能记录四条分区记录,称为主分区或扩展分区,因此主分区和扩展分区最多可以有4个,其中扩展分区最多只能有1个
    • 逻辑分区是由扩展分区持续分出来的分区
    • 能够被格式化后作为数据访问的分区为主分区和逻辑分区,扩展分区无法格式化
    • IDE硬盘最多有59个逻辑分区(5-63),SATA硬盘最多有11个逻辑分区(5-15)

1.2 文件系统特性

  • 不同操作系统使用的文件系统也不相同,windows使用NTFS,Linux使用Ext2,U盘使用FAT
  • 由于新技术的应用(LVM,RAID),分区与文件系统已经不再是一对一的关系,因此通常我们称呼一个可被挂载的数据为一个文件系统,挂载点与文件系统是一对一的
  • 索引式文件系统的运行
    • super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息
    • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码
    • block:实际记录文件的内容,若文件太大将占用多个block
  • FAT格式文件系统
    • 没有inode,数据在block中的存储形式类似链表结构
    • 若文件写入的block太过离散,文件读取的性能会变得很差,此时便需要碎片整理

1.3 Ext2文件系统

Ext2是Linux的标准文件系统格式,它是一种索引式的文件系统。

  • 在整体规划中,文件系统的最前面有一个启动扇区,这个扇区可以安装引导装载程序,与MBR配合形成多重引导环境
  • 在格式化时,文件系统被划分为多个块组,每一个快组包含的内容如下:
    • data block:
      • 格式化时固定为1k/2k/4k,导致该文件系统能够支持的最大磁盘容量和最大单一文件容量不相同
      • 每个block内最多只能放置一个文件的数据,若文件大于单个block的容量则需多个block,若文件小于单个block的容量将造成空间浪费
    • inodetable:
      • inode记录信息:文件的访问权限、文件所有者和组、文件的大小、文件的三个时间、文件特殊权限、文件内容指向(指向的data block)
      • inode特性:每个inode固定大小为128bytes,每个文件只占用一个inode(文件系统能创建的文件数量与inode的数量有关)
      • 系统读取文件时,先找到inode,分析inode所记录的权限与用户是否符合,若符合才能开始实际读取block的内容
      • 记录一个block号码需要4byte,而一个inode的全部容量只有128bytes,因此将inode记录block号码的区域定义为12个直接、一个间接、一个双间接、一个三间接记录区(类似多级指针)。以data block=1k为例,计算一个inode可以对应的data block总量为:12+1k/4+(1k/4)2+(ik/4)3=16M,即能够记录的最大单个文件为16M*1k=16G
    • superblock:
      • 记录信息:block/inode的总量和已使用量,block与inode的大小(1k/2k/4k,128),文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息,validbit值(若已挂载值为0,未挂载值为1)
      • 一个文件系统应该只有一个superblock,除了第一个块组之外,其他块组中不一定有superblock,如果有也是作为第一块组的备份
    • file system description:描述每个block group的开始与结束block号码以及每个区段(superblock,bitmap,inodemap,data block)分别介于哪一个block号码之间
    • block bitmap:从这个区段可以知道哪些block是空的
    • inode bitmap:记录使用与未使用的inode号码
    • 文件系统只有一种存储结构(block),所有区段的内容均存储在block中
    • 每个块组inode数量计算:该块组inodetable占用的block数*单个block的容量/128
  • dumpe2fs [-bh] 设备文件名
    • -b:列出保留为坏道的部分
    • -h:仅列出superblock的数据,不列出其他区段内容

1.4 文件系统与目录树的关系

  • 目录:
    • inode记录目录文件的相关权限和属性
    • block记录该目录下的文件名与该文件名占用的inode号码,因此在该目录下新增/删除/重命名与该目录的w权限有关
  • 目录树的读取(以/etc/passwd为例):
    • 通过挂载点的信息找到/的inode号码,根据inode提供信息检查读取权限是否匹配
    • 若匹配读取/的inode对应的block
    • 从/的block中找到etc/的inode号码,检查读取权限
    • 若匹配读取对应etc/的inode对应的block
    • 从中找到passwd文件的inode号码,检查读取权限
    • 若匹配读取passwd的inode对应的block,读出的即为/etc/passwd的文件内容

1.5 日志文件系统功能

  • inode table和data block称为数据存放区域,super block、block bitmap、inode bitmap等区段被称为metadata(中间数据)
  • metadata是经常变动的,突发系统中断可能造成数据的不一致状态
  • 在系统中规划出一个块,专门记录写入或修订文件时的步骤,从而简化一致性检查称为日志文件系统,superblock中记录着日志文件系统的inode号码和文件大小

1.6 挂载点

将文件系统和目录树结合的操作我们称为挂载,挂载点一定是目录,该目录为进入该文件系统的入口。

1.7 VFS

Linux的标准文件系统是ext2,但也支持很多其他文件系统格式。若系统中不同挂载点的文件系统不同,系统在读取文件时用哪种文件系统格式来解析取决于VFS。

2 文件系统的简单操作

2.1 磁盘与目录的容量

  • df [-ahikHTm] filename
    • -a:列出所有文件系统,包括系统特有的/proc等文件系统
    • -k:以kb的容量显示各文件系统
    • -m:以Mb的容量显示各文件系统
    • -h:以较易阅读的格式自动选择容量单位显示
    • -H:以M=1000k显示
    • -T:连同该分区的文件系统名称(例如ext3)也列出
    • -i:不用硬盘容量,而以inode的数量来显示
  • du [-ahskm] filename
    • -a:列出所有的文件与目录容量
    • -h:自动选择容量单位
    • -s:列出总量,不列出每个目录占用容量
    • -k:kb为单位
    • -m:Mb为单位

2.2 连接文件

  • hard link
    • 执行ln filename filename_hlink可以设置硬链接
    • 在某目录下新建一条文件名连接到某inode号码的关联记录
    • 设置链接文件的过程中,磁盘容量和inode数量都不会改变
    • 设置连接文件后,连接文件和源文件是等位的,这两个文件的连接数都变成了2
    • 删除连接文件,源文件还在;删除源文件名,连接文件依旧可以打开
    • 通过连接文件编辑可以实现对源文件的更改
    • 不能跨文件系统
    • 不能连接到目录
  • symbolic link
    • 执行ln -s [-f] filename filename_slink,-f如果连接文件存在则删除后再创建
    • 类似快捷方式,创建一个文件,这个文件会让数据的读取指向它连接的那个文件的文件名
    • slink不会改变源文件的连接数
    • 源文件删除后,slink文件会开不了
    • 会占用新的inode和block
    • 通过连接文件编辑可以实现对源文件的更改
  • 目录的连接数量:新建目录时,新的目录连接数为2,上层目录的连接数加1

3 磁盘的分区、格式化、检验与挂载

3.1 磁盘分区

  • fdisk -l devname 显示该设备的所有分区信息,若没有接devname则显示系统的所有分区信息
  • fdisk devname 等待后续命令,常用的后续命令如下:
    • m:帮助,打印所有命令清单
    • d:删除一个分区
    • n:新增一个分区
    • p:在屏幕上显示分区表,与fdisk -l devname类似
    • q:离开不存储
    • w:离开并存储
  • 新增分区时,设置分区终止柱面时可以输入希望分得的容量(+512M),系统会自动计算对应的柱面号
  • 在进行分区时,如果该硬盘某个分区还在使用中,很可能系统内核无法重载分区表,解决的办法如下:
    • 将该使用中的分区卸载,然后重新进入该分区一遍,重新写入分区表
    • 若该硬盘含有根目录则无法卸载,只能重新启动
    • partprobe命令,可以不用重启

3.2 磁盘格式化

  • mkfs [-t 文件系统格式] devname 按默认值进行格式化,默认初始化为ext3格式,即有日志文件系统
  • mke2fs [-b blocksize] [-i 每多少个字节分配一个inode] [-L 卷标] [-j] [-c/-c -c] devname
    • -c:仅对磁盘进行快速读取测试
    • -c -c:对磁盘进行更细致的读写测试
    • -j:将磁盘初始化为ext3格式,默认为ext2格式
    • mkfs是一个综合命令,mke2fs是ext2/ext3格式化公用程序,mkfs [-t 文件系统格式]后也可以跟这些配置项

3.3 磁盘检验

  • fsck [-t 文件系统] [-ACay] devname
    • -t:指定文件系统格式,现今linux系统可以从superblock中读取,因此通常不需要配置此项参数
    • -A:根据/etc/fstab的内容,将需要的设备扫描一次,通常开机过程中就会执行此命令
    • -a:自动修复检查到的有问题扇区,系统将不会一直提示,用户无需一直按y
    • -y:同-a,有些文件系统格式只支持-y
    • -C:在检验过程中使用一个直方图显示目前进度
    • ext2/ext3的额外参数功能:
      • -f:强制检查,如果没有发现任何unclean标志,系统不会进入细化检查,加上此配置项将强制进入细化检查
      • -D:针对文件系统下的目录进行优化配置
    • 通常只有身为root且你的文件系统有问题时才使用这个命令,正常状况下使用此命令可能造成对系统的危害
    • 被检查的分区务必不可挂载在系统上,需要在卸载的状态下执行检验以免对部分文件系统造成损坏
    • 文件系统顶层有一个lost+found目录,fsck检查文件系统出现问题时,有问题的数据会放在此目录下,正常情况下该目录不该有数据
    • fsck也是一个综合命令,实际是调用e2fsck这个命令
  • badblocks [-svw] devname
    • -s:在屏幕上列出进度
    • -v:可以在屏幕上看到进度
    • -w:使用写入的方式测试,建议不使用
    • 这个命令用来检查磁盘或软盘扇区有没有坏轨,等同于mke2fs -c devname,因此目前大多不适用此命令

3.4 磁盘挂载与卸载

  • 磁盘挂载准则
    • 单一文件系统不应该被重复挂载在不同的挂载点上
    • 单一目录不应该重复挂载多个文件系统
    • 作为挂载点的目录理论上应该都是空目录,如果不是空目录,那么该目录下原本存在的数据将暂时消失直到挂载的文件系统被卸载
  • 磁盘挂载命令mount
    • mount -a 依照配置文件/etc/fstab的数据将所有未挂载的磁盘分区都挂载上来
    • mount [-l] 显示目前挂载的信息,加上-l可增列label名称
    • mount [-t 文件系统] [-L label名] [-o 额外选项] [-n] devname mountpoint
      • -L:使用label名挂载,mount -L “labelname” mountpoint,这样做的好处在于即使磁盘换了接口导致设备文件名变化,也不影响系统的正常读取写入
      • -n:默认情况下,磁盘的挂载信息会实时写入/etc/mtab中,使用此配置项可使信息不写入
      • -o:后面接挂载时额外加上的参数
        • ro/rw:挂载文件系统成为只读或读写,默认rw
        • suid/nosuid:是否允许分区含有suid/sgid文件,默认suid
        • dev/nodev:是否允许此分区上创建设备文件,默认dev
        • exec/noexec:是否允许此分区上拥有可执行binary文件,默认exec
        • auto/noauto:是否允许此分区被mount -a自动挂载,默认auto
        • user/nouser:是否允许此分区让任何用户执行mount,默认nouser,仅有root可以执行mount挂载
        • async/sync:此文件系统使用同步或异步的内存机制,默认async异步
        • defaults:将上述选项均设为默认值
        • remount:重新挂载,这在系统出错或重新更新参数时很有用
  • 挂载ext2/ext3文件系统
    • 无需链接-t参数,linux可以通过分析superblock搭配linux自己的驱动程序去测试挂载,如果测试成功就自动使用该类型的文件系统格式挂载起来
    • 系统指定的进行挂载测试的文件系统格式有哪些,参考/etc/filesystems和/proc/filesystems
    • 系统中有哪些文件系统格式的驱动程序参考/lib/module/$(uname -r)/kernel/fs/
  • 挂载CD或DVD mount [-t iso9660] /dev/cdrom /media/cdrom
    • 类型可以不指定,让系统进行挂载测试
    • /dev/cdrom是个连接文件,正确的磁盘文件名要看光驱的连接接口
  • 挂载U盘 mount -o iocharset=cp950 /dev/sda1 /mnt/flash
    • 如果带有中文文件名的数据,-o iocharset=cp950来指定中文语系
    • 无论光盘还是U盘都必须卸载之后才能退出,否则会造成系统的混乱
  • 重新挂载根目录 mount -o remount,rw,auto /
  • 将某目录(不是整个文件系统,可以是文件系统的一部分)挂载到另一个目录,两个目录连接到同一个inode,实现类似硬链接的效果mount --bind /home /mnt/home
  • 将设备文件卸载umount [-fn] devname or mountpoint
    • -f:强制卸载,可用在类似网络文件系统无法读取到的情况
    • -n:卸载但不更新/etc/mtab

3.5 磁盘参数修改

  • mknod devname [bcp] [Major] [Minor]
    • b:将设备名称设置为外部存储设备
    • c:将设备名称设置为外部输入设备
    • p:将设备名称设置为fifo文件
    • Major:主设备代码
    • Minor:从设备代码
    • 对操作系统而言,设备文件的设备代码是有意义的,跟设备接口有关,不要随意设置
  • e2label devname newlabelname
    • 用于格式化完成后修改文件系统卷标
    • 优点:无论设备文件名怎么变,系统都可通过卷标名找到此文件系统
  • tune2fs [-ljL] devname
    • -l:类似dumpe2fs -h的功能,将super block信息读出
    • -j:将ext2转为ext3
    • -L:类似e2label的功能,可以修改文件系统的label
  • hdparm [-icdmXTt] devname 对于SATA硬盘的话,这个命令唯一能做的就是-tT的测试
    • -i:将内核检测到的硬盘参数显示出来
    • -c:设置32bit访问模式,指硬盘和pci接口之间的传输模式,默认打开,建议直接使用-c1
    • -d:是否启用dma模式,-d1为启用,-d0为取消
    • -m:设置同步读取多个sector的模式,通过-i读取的maxmultsect值是可以设置的最大值,默认设为16
    • -X:设置UtraDMA模式,模式值加64为设定值,从-i可以读出udma的模式值
    • -T:测试暂存区cache的访问性能
    • -t:测试硬盘的实际访问性能

4 设置开机挂载

4.1 开机挂载

  • 系统挂载限制:
    • 根目录必须挂载,且先于其他挂载点挂载
    • 其他挂载点必须为已经新建的目录
    • 所有挂载点在同一时间内只能被挂载一次
    • 所有分区在同一时间内只能挂载一次
    • 通过LVM、RAID等技术,一个分区可以格式化为多个文件系统,多个分区也可以合成为一个文件系统
    • 若进行卸载,必须先将工作目录转移到挂载点及其子目录之外
  • /etc/fstab是开机时的配置文件,实际文件系统的挂载是记录到/etc/mtab和/proc/mounts这两个文件中,/etc/fstab数据如下:
    • device:文件系统的设备文件名,默认使用的是label名
    • mount point:挂载点
    • filesystem:文件系统格式,如ext3,vfat
    • parameters:文件系统参数,与mount -o后接的参数相同
    • dump:能否被dump备份命令作用,0代表不做dump备份,1代表每天dump备份,2代表其他不定日期dump备份操作
    • fsck:开机过程中,是否以fsck检验该文件系统是否clean,0不检验,1最早检验(根目录),2在1之后检验

4.2 特殊设备loop挂载(镜像文件不挂载就使用) mount -o loop filename.iso mountpoint

  • 创建大型文件
    • dd if=/dev/zero of=/home/loopdev bs=1M count=512
    • 格式化 mkfs -t ext3 /home/loopdev
  • 挂载 mount -o loop /home/loopdev /media/cdrom

5 内存交换空间构建

5.1 swap的作用及使用限制

  • 当内存空间不足时,为了后续程序可以顺利运行,内存中暂不使用的程序和数据就会被挪到swap中
  • 如果主机支持电源管理模式且进入休眠模式,运行中的程序状态会被记录到swap,作为唤醒主机的状态依据
  • 有些程序在运行时本来就会利用swap特性来存放一些数据段
  • swap最多能创建32个,没有单个大小,总容量大小为64G(64位系统最大内存寻址空间为64G)

5.2 构建swap

  • 使用物理空间构建swap
    • 分区:通过fdisk增加分区,输入t将hex code设为82从而将system id改为swap格式,执行partprobe命令让内核更新分区表
    • 格式化新增的swap分区:mkswap newpart
    • 将swap设备启动:swapon newpart
    • 查看:free查看swap空间的总容量是否变大,swapon -s
  • 使用文件构建swap:将使用物理空间构建的步骤一改为创建文件即可 dd if=/dev/zero of=swapfile bs=1M count=128

6 文件系统的特殊查看与操作

6.1 boot sector与super block的关系

  • 若block=1k,boot sector占据block0,block group1的superblock占据block1
  • 若block=2k,4k,boot sector和block group1的superblock都在block0中

6.2 磁盘空间浪费问题

  • du -sb pathname 文件系统中文件占据的字节数
  • du -sm pathname 文件系统中被消耗的block数*每个block的容量(1k,2k,4k)
  • 前两项之差就是pathname对应的文件系统浪费掉的磁盘空间大小

6.3 利用GNU的parted进行分区行为

  • parted /dev/hdc print 列出本机的分区表资料,包括number分区号码、start起始柱面位置、end结束柱面位置、size分区容量、type(primary,extended、logical),filesystem(ext3,vfat)
  • parted /dev/hdc mkpart logical ext3 19.2GB 19.7GB新增分区,最后两个参数是起始柱面位置和结束柱面位置
  • parted /dev/hdc rm 8删除分区
  • 除非用到大于2TB的磁盘,否则还是建议使用fdisk来分区

你可能感兴趣的:(磁盘与文件系统管理)