GNU/Linux操作系统学习 07.磁盘与文件系统管理

第七章 磁盘与文件系统管理

1. 磁盘分区与文件系统

分区与文件系统
  • 分区 : 是对磁盘大小进行划分的方法,有MBR,GPT 分区
  • 文件系统的格式化 : 是调整分区的格式和文件属性来符合某个文件系统,有 Windows : FAT,NTFS Linux : ext2 xfs 文件系统
  • 二者关系 : 传统一个分区只能被格式化成一个文件系统,现在一个分区可以格式化为多个文件系统或者多个分区格式化为一个文件系统
文件系统类型
  • ext2 文件系统是索引式文件系统,主要由inode存放文件属性和权限,数据区块存放实际数据
  • FAT 文件系统非索引式文件系统,链表式在文件系统容量越满或文件数据越离散情况下,存取效率会越低
虚拟文件系统
  • 虚拟文件系统 (Linux Virtual Filesystem Switch) 是 Linux系统用来管理文件的内核功能,其中所涉及的各个层次为 : 磁盘设备控制器–>( 设备驱动器–>高速缓存–>多种文件系统–>虚拟文件系统–>系统调用界面 )–>用户进程

2. ext2文件系统

格式化
  • 将分区大小分为一个启动扇区和多个区块群组
  • 启动扇区安装启动引导程序,每个群组拥有独立的inode表,数据区块,超级区块等
  • 格式化时已经将inode表和数据区块规划完毕,固定后不再变动
群组构成
  • 数据区块 : 固定大小为1K,2K,4K. 记录文件实际内容,一个或多个区块只能存放一个文件(存在浪费问题)
  • inode表 : 每个indode固定总大小为128B,记录一个数据区块号占4B,此外还记录文件rwx,ugo,time,size,flag,pointer(单个文件的大小受indoe大小限制)
  • 一般inode中有15个记录数据区块号的记录区(共占据60B),受到个数限制数据区块指针可以与数据区块一起构成二级三级四级扩大inode的数量 比如数据区块大小为1KB 分为12个直接(仅有12个直接),3个间接到三间接 有 : (12+256+256*256+256*256*256)KB=16GB
  • 超级区块 : 一般大小为1024B,每个群组可以有一个多余作为备份. 记录数据区块与inode使用,未使用,总计的数量与单个大小,挂载有效位,挂载时间和其他文件系统必要信息
  • 数据区块对照表和inode对照表 : 记录每个区块和inode的是否使用

对照表,indoe表和超级区块称为元数据

  • 文件系统描述说明 : 记录群组的区块划分及其中每个区段的划分
  • 日志记录区块(ext3后加入) : 写入文件前记录写入的有关信息,然后写入数据,更新元数据,最后完成该文件的日志记录.如果发生问题,对本记录信息进行检查
目录树
  • 目录的inode与数据区块 : 建立一个目录会分配inode和数据区块,inode存放目录的权限等必要信息,数据区块中存放目录下的文件名和对应的inode号
  • 读取路径时 : 系统首先根据挂载点信息找到"/“的inode号,读取”/"的数据区块中的文名找到根目录下的文件inode号,以此层层找到目标文件
  • 新建文件时 : 如上找到目录inode,检查权限,在inode和数据区块对照表找到空间,根据号码写入相关信息和文件内容,最后更新对照表和目录的数据区块 (一般由日志来解决数据不一致情况)
  • 挂载点 : 一个可被挂载的数据视为一个独立的文件系统而不仅仅只是一个分区,每个挂载点应该是不同的空目录,该目录作为各自文件系统的的根目录,默认根目录的inode号固定所以不同的挂载点的inode号相同
命令
  • $ dumpe2fs [-bh] device_directory 显示出ext2文件系统的信息

-h 仅列出超级区块的信息
-b 仅列出坏区块的信息

3. xfs文件系统:

优点
  • ext文件系统需要在格式化时提前规划号各个区域,格式时间缓慢,不适用于高容量磁盘的创建和恢复
  • xfs文件系统动态分配存储区域,格式化较,快用于高容量磁盘和高虚拟性能系统
构成
  • 数据区(data section) : 分为多个存储群组(allocation group),每个群组中包含inode,超级区块和动态分配与空间管理机制(可以调整inode大小和数据区块大小)
  • 活动登陆区(log section) : 记录所有文件系统的操作,负责检验与修复,类似ext的日志区
  • 实时运行区(realtime section) : 找到若干个extent区块存放新的文件,存放完成后再写入数据区中,extent大小为4K-1G默认64KB
命令
  • $ xfs_info device_directory/moutpoint 查看xfs文件系统的信息
  • 注意,逻辑扇区是存储的最小单位,块是一次性读取的最小单位 默认大小单位为B
  • isize : inode大小
  • agcount : 群组个数
  • agsize : 群组占数据区块个数
  • sectsz : 逻辑扇区大小
  • bsize bsize:数据block大小
  • blocks:数据区块个数
  • log : 指明登陆区位置是否为外部设备
  • extentsz : exent大小

4. 查看文件系统与目录容量

$ df
  • $ df [-akmhTi] [filename/directoryname] 显示所有挂载的文件系统(目录所在文件系统)磁盘占用信息
  • -m / -k / -h / -H / -i MB/KB/易读方式/M=1000k方式显示大小/用inode数量显示
  • -a 显示所有特殊的文件系统,如/dev/shm/内存虚拟出来的磁盘空间不占磁盘空间
  • -T 将文件所在或目录内容文件所在的文件系统类型显示
$ du
  • $ du [-akmhsS] filename/directoryname 显示当前目录下(目标目录)各文件的磁盘占用信息
  • -m / -k / -h 如上 默认 以1kB为单位,递归显示该目录下所有目录大小,"."为该目录的实际总大小 (会有重复)
  • -S 递归显示该目录下所有目录大小,每个目录不包括子目录大小只包括目录下的文件(没有重复)
  • -a 递归显示该目录下的所有目录和文件的大小
  • -s 仅列出该目录 “.” 的总大小

5. 链接

硬链接
  • 原理 : 在目录的数据block中增加新文件名和源文件相应的inode号
  • 不能链接目录和不同文件系统,不占用新的inode
  • 增加文件名链接到同一个inode的数量
  • 删除源文件即删除目录数据区块下的inode号和文件路径,inode仍然有文件名关联,硬链接不受影响
  • 新目录建立后 存在 directory , directory/. 和 directory/… 当前目录的链接数为 2 , 上层目录链接数量+1
软链接(符号链接)
  • 原理 : 建立一个inode并指向一个仅包含源文件路径的数据block
  • 可以链接目录,新增inode,不增加链接inode数量
  • 删除源文件符号链接会受影响
$ ln
  • $ ln [-sf] source targetfile 建立链接
  • -s 建立软链接 默认建立硬链接
  • -f 目标文件存在就覆盖

6. 磁盘查看,分区和格式化

$ lsblk
  • $ lsblk [dfimpt] device_directory 显示分区信息
  • -d 仅仅列出磁盘本身,不显示分区
  • -f/-m/-p/-t 显示额外信息 : 文件系统类型,label和UUID/用户与权限/完整路径名称/拓扑结构
  • -i 以 sacii码字符显示
  • 其中MAJ:MIN 为主要与次要设备代码 RM 为是否是可卸载设备 RO 为是否为只读设备
  • $ blkid [device_directory] 显示所有(某个)分区的UUID(全局唯一标识符)和类型
  • $ parted device_directory print 显示某个分区信息
$ gdisk/fdisk
  • $ gdisk device_directory 对整个设备进行GPT格式分区 ($ fdisk 用于MBR分区)
  • 最终写入 w 打印分区 p
  • 新增分区 n 步骤 : 1.设定分区minor值 2.设定第一个sector下标 3. 设定最后一个sector下标或者通过+SIZE设定大小 4.输入代码设定分区的预计文件系统
  • 删除分区 d 输入分区的minor号进行删除
  • 查看分区代码 L 其中8e00 8300 8200 为 linux文件系统代码 0700为windos
  • $ cat /proc/partitions 查看内核的分区记录
  • $ partprobe [-s (额外数据)] 更新linux内核的分区表信息
  • 注意删除分区前要卸载分区,删除分区启动配置,在使用中删除分区会产生问题且影响稳定性
$ mkfs
  • $ mkfs.xfs [-b size] [-d / -i / -l / -r parms] [-f -L] device_directory 格式化分区成xfs 或者mkfs -t type 指定目标格式
  • -f 强制格式化已经存在文件系统的分区
  • -L name 设置分区的LABEL
  • -b size=4k 设置单个block 的大小,默认Bytes
  • -d agcount=4 设置存储群组个数 (群组数量通常与cpu个数相同)
  • -i size=256 设置inode大小
    –r extsize=4k 设置extent大小
    –l internal=0/1 设置登陆区是否为外部设备
  • $ mkfs.ext4 [-b size] [-L lable] device_directory 将分区格式化成ext4

7. 文件系统校验和修复

  • 注意只能对于没挂载的文件系统进行校验与修复,且在文件系统的确出现问题的情况下通过root使用这些命令
$ xfs_repair
  • $ xfs_repair [-fnd] device_directory 修复检验xfs文件系统
  • -f 指定device_directory为文件进行校验
  • -n 单纯检查不进行修改
  • -d 对于根目录进行检查修复(根目录无法卸载需要在单人模式下用-d参数修复)
$ fsck.ext4
  • $ fsck.ext4 [-p] [-b superblock_id] device_directory 修复检验ext文件系统
  • -p 自动回复Y -f 忽略unclear标识强制检查
  • -b superblock_id 通过备份恢复superblock 其中 1K - 8193|2K - 16384|4k - 32768 通过dumpe2fs -h /dev/sda5 | grep ‘Block per group’ 来查看最后一个区块位置即备份的超级区块位置

8. 文件系统挂载与卸载

一般规则
  • 一个分区只能挂载一次
  • 一个目录只能挂载一个分区,挂载目录为挂载点
  • 挂载点最好是空目录否则挂载后所含的目录和文件会被隐藏,卸载后显示
  • USB 一般为 sdb[1-n] 光盘为 sr[1-n]
$ mount
  • $ mount [-l 额外显示LABEL] 显示挂载信息
  • $ mount [-a] 依照/etc/fstab 的数据将未挂载的磁盘挂载上来,一般用作检测
  • $ mount --bind dir1 dir2 将d1挂载到d2下,隐藏d2的文件,不增加inode类似软链接
  • $ mount [-o params] <LABEL= / UUID= / device_directory> mount_point 挂载分区
  • -t type 指定挂载文件系统类型 (一般可以省略,让Linux驱动程序测试挂载文件系统)
  • 可以通过LABEL , UUID 或者 device_directory 来选定挂载的文件系统
  • -o params 前者params 为 默认设置选项

  • async | sync : 是否异步写入
  • rw | ro : 是否为读写或只读
  • auto | noauto : 是否可以以 $ mount -a 挂载
  • exec | noexec : 是否可以存有二进制文件
  • nouser | user : 是否让任何人执行 mount
  • suid | nosuid : 是否可以存在 suid/sgid 权限文件
  • dev | nodev : 是否可以建立设备文件
  • atime | noatime : 是否修改文件的读取时间

  • codepage=950,iocharset=utf8 设置文档格式
  • remount 重新挂载 (单人维护模式下 根目录为只读,通过 $ mount -o remount,rw,auto / 将根目录重新挂载)
  • 一般情况linux会根据 如下信息自动测定文件系统类型并挂载

  • $ cat /etc/filesystems 查看测试挂载文件系统的优先级
  • $ cat /proc/filesystems 查看已经加载到内存中的文件系统
  • $ ls -l /lib/modules/$(uname -r)/kernel/fs 查看系统支持的文件系统驱动
$ unmount
  • $ umount [-nfl] device_directory/mountpoint 卸载文件系统
  • -f 强制卸载
  • -l 立即卸载
  • -n不更新/etc/mtab下卸载
  • 卸载时工作目录应该退出该分区

9. 文件系统参数定义

$ mknod
  • $ mknod device_directory/directory [bcp] [major] [minor] 手动设置设备类型
  • b / c / p : 设置为 外部存储(磁盘) / 外部输入(键盘) / FIFO 设备文件
  • major 主要设备代码 决定设备的类型 minor 次要设备代码 区分同类型的不同设备
  • 可以通过 $ ll /dev/* 来查看主要设备代码和次要设备代码 (在时间栏前)
$ xfs_admin
  • $ xfs_admin [-lu][-L lable -U uuid] device_directory 设置xfs分区的LABEL和UUID
  • -l 显示设备的LABEL -u 显示设备的UUID
  • -L label 设置设备的LABEL -U uuid 设置设备的UUID
  • 可以使用 $ uuidgen 产生UUID
$ tune2fs
  • $ tune2fs [-l][-L lable -U uuid] device_directory 设置ext4分区的LABEL和UUID
  • -l 类似 dumpe2fs -h 显示 superblock信息
  • -L label 设置设备的LABEL -U uuid 设置设备的UUID

10. 文件系统自动挂载与特殊设备挂载

一般规则
  • 根目录必须优先挂载
  • 挂载规则符合FHS要求
设置启动挂载
  • 对 /etc/fstab 对配置文件进行修改 格式如下 :
  • [device_directory / UUID] [mount_point] [type] [params] [dump] [fsck]
  • params 参照mount 的-o 参数 默认defaults
  • dump 能否被dump命令备份 一般为1
  • fsck 启动时是否通过fsck进行检验 一般为0
特殊设备loop挂载
  • $ mount iso_file /data/dvd -o loop 通过loop设备挂载镜像文件
  • 制作loop设备文件系统
  1. $ dd if=/dev/zero of=/srv/loopdev bs=1M count=512 在srv下建立空文件 bs为block大小 count为block数量
  2. $ mkfs.xfs -f /srv/loopdev 强制格式化设备文件
  3. $ mount /devname mount_point -o loop 通过mount挂载loop设备
  4. loop设备的自动挂载需要用device_directory不用UUID,参数栏中添加",loop"

11. swap分区创建,挂载和卸载

  • $ gdisk 创建swap分区 其中类型型号为8200 或者 $ dd 创建大小文件
  • $ mkswap device_directory 格式化
  • $ swapon device_directory 挂载
  • $ swapoff mount_point 关闭swap
  • $ swapon -s 查看swap信息
  • $ free 查看内存信息
  • 编辑 /etc/fstab 设置自动挂载 其中type和parameters均为swap,创建文件swap配置文件中用device_directory查找而不用UUID
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值