磁盘管理与文件系统
Posted ckh2014
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了磁盘管理与文件系统相关的知识,希望对你有一定的参考价值。
计算机上主要部件有运算器、控制器、存储器、输入输出设备,也就是上图中cpu,内存和其他IO设备,内存作为易失性存储设备,所以需要通过IO设备磁盘来持久化的存储数据。而IO设备这些硬件设备怎么被计算机识别管理呢?不同厂商生产的硬件设备电器工作特性肯定是不一样的,所以生产硬件设备的厂商会提供驱动程序,操作系统装载完驱动程序后就会抽象硬件设备所提供的功能向上输出,提供给程序员进行系统调用,而系统调用还是非常底层,所以就有库调用。对硬件进行的设备管理,也就是操作系统对驱动程序的管理。那么操作系统怎么知道哪个硬件需要输入输出呢,早期是通过轮询来实现,就是每隔一段时间扫描检查使用的数据,也就是盲等待,但是这种方式性能比较差。还有一种就是当IO设备有IO事件发生时,通知cpu,然后cpu触发内核,由内核来处理。cpu和I/O设备进行交互,是通过I/O端口来实现的,这些端口也就是系统上的I/O设备地址。每个硬件设备在Linux上都被识别为一个文件,Linux上设备文件类型有两类:一类是块设备(存储单元为‘块’),比如磁盘,一类是字符设备(存储单元为‘字符’),比如键盘。
磁盘的基本概念:
磁盘的接口类型有:
并行:
IDE: 133MB/s
SCSI: 640MB/s
串口:
SATA: 6Gbps
SAS: 6Gbps
USB: 480MB/s
磁盘设备文件命名:
IDE:/dev/hd
SCSI,SATA,SAS,USB:/dev/sd
同一个设备:a-z;比如:/dev/sda,/dev/sdb...
同一个设备不同分区:1,2,... 比如:/dev/sda1,/dev/sda2...
机械式硬盘还有磁道(track),柱面(cylinder),扇区(sector)的概念。
第0磁道0扇区有512bytes:
446 bytes: 用来存放MBR(Master Boot Record)
64 bytes: partition table (分区表)
16个bytes标识一个分区,所以只能有四个主分区
2 bytes:校验码 55AA
注意:如果单盘容量大于2T,MBR分区格式就不适用了,需要采用另一种分区格式,也就是GPT(GUID partition table)
MBR: 早期的linux系统为了兼容windows的磁盘所使用的分区格式,
GPT: 磁盘空间大于2T所采用的分区格式,磁区大小可以达到4k(默认为512bytes),磁区也叫做逻辑区块位址(Logical Block Address, LBA),GPT使用34个
LBA区块记录分区信息,磁盘最后33个LBA作为分区信息的备份。LBA0(MBR相容区块)中446bytes用来存放开机管理程式(boot loader),原本用来存放分区表信息的地方只存放一个特殊标志,用来表示磁盘为GPT分区格式。LBA1(GPT表头记录)中记录了分区表的位置和大小,同时记录了备份用的GPT分区存放位置。LBA2-33(实际记录分区信息处),每个LBA默认有4个分区,每个LBA有512bytes,每个分区信息用到128bytes,这之中除了识别码和相关记录外,会有64bits来记录开始/结束的磁区号码。 GPT分区格式没有主分区、扩展分区、逻辑分区的概念,每条记录都是单独存在,都可以为主分区,每个都可以格式化使用。
开机管理程式: 系统载入硬件驱动的程序,主要有Bios和UEFI两种机制
CMOS: 记录各项硬件参数并且嵌入在主机板上的储存器
BIOS:写入到硬件上的软件程序(开机后计算机主动执行的第一个程序)
UEFI(Unified Extensible Firmware Interface):统一可扩展的软件体,C语言开发的
磁盘分区管理工具:(fdisk、partx、kpartx、sfdisk、gdisk、parted)
fdisk:对于一块硬盘来说只能管理15个分区
-l : 显示当前系统所有的磁盘分区情况
fdisk device: 显示某个设备的分区信息
自命令:管理功能
p: print,显示已有分区
n:new,创建一个分区
d: delete, 删除一个分区
t: 调整分区id
l: 列表显示分区id
w: write: 写入磁盘并退出
q:quit, 放弃更新并退出
通过上面的命令创建好分区后,需要重新读取硬盘分区表
partx -a /dev/device
-n M:N 读取哪几个分区
kpartx -a /dev/device
-f: force
partprobe [/dev/device]
查看内核是否已经识别新分区: cat /proc/partitions
有些时候重新读取新分区后,旧的已经删除的分区还在,这时可通过 partprobe重新读取分区信息,会删除旧的记录。
分区完,接下来就需要进行格式化操作了。为什么需要进行格式化呢,因为每个操作系统设置的文件属性都不相同,为了存放这些文件,就需要对分区进行格式化,成为操作系统能够使用的文件系统格式(filesystem)。
Linux文件系统有ext2、ext3、ext4,xfs, btrfs,reiserfs, jfs, swap
Windows文件系统: fat32、ntfs
Unix: FFS、UFS、JFS2
网络文件系统: NFS、CIFS
集群文件: GFS2、OCFS2
分布式文件系统:ceph、moosefs、mogilefs、GlusterFS、lustre
文件系统格式化后:
文件系统格式化会区分为多个块组,每个块组都有独立的inode/block/superblock系统。
其中:
data block(数据块):存放文件内容数据的地方,每个block大小有1k、2k、4k三种。格式化时block大小就固定了,每个block都有编号,方便inode记录。
inode tale(inode 表): 记录文件的属性和该文件实际数据存放在哪几号block上。每个inode大小为128bytes(ext4和xfs可设置到256bytes),记录一个block号码要4bytes,block数量很多,inode直接记录肯定是不够的,所以inode记录block号码的区域定义为12个直接,一个间接,一个双间接和一个三间接。
Superblock(超级块):记录整个文件系统相关信息的地方。一般只要第一个块组中有superblock,后续的块组不一定有,就算有也是第一个块组中的superbloc备份。
Filesystem Description(文件系统描述说明): 描述每个块组的开始与结束的block号码,以及每个每个区段(superblock,bitmap,inodemap,datablock)分别在哪个block号码之间。
block bitmap(区块对应表):标识block使用状态的,比如使用还是未使用
inode bitmap(inode 对应表): 标识inode使用状态,比如记录使用与未使用
文件系统格式化常用命令:
创建文件系统:
mkfs命令:
# mkfs.FS_TYPE /dev/DEVICE
ext2、ext3、ext4、xfs、btrfs、vfat
#mkfs -t FS_TYPE /dev/DEVICE
-l ‘LABEL‘: 设定卷标
mke2fs: ext系列文件系统专用管理工具
-t {ext2 | ext3 | ext4}
-b {1024 | 2048 | 4096}
-L ‘LABEL‘
-j: 相当于 -t ext3
-i #: 为数据空间中每多少个字节创建inode
-N # : 为数据空间创建多少个inode
-m # : 为管理人员预留的空间占用的百分比,默认为百分之5
-O FEATURE[...]: 启用指定特性
-O ^FEATURE: 关闭指定特性
mkswap: 创建交换分区
-L ‘LABEL‘
其他常用工具:
blkid: 块设备属性信息查看
-U UUID: 根据指定的UUID来查找对应的设备
-L LABEL: 根据指定的LABEL来查找对应的设备
e2label: 管理ext系列文件系统的LABEL
#e2label DEVICE [LABEL]
tune2fs: 重新设置ext系列文件系统可调整参数的值
-l: 查看指定文件系统超级块信息
-L ‘LABEL‘:修改LABEL
-m #: 修改预留给管理员的空间百分比
-j: ext2升级为ext3
-O: 文件系统属性启用或禁用
-o: 调整文件系统的默认挂载选项
-U UUID:修改UUID号
dumpe2fs:
-h: 查看超级块信息
文件系统检测:
fsck.FS_TYPE
fsck -t FS_TYPE
-a: 自动修复错误
-r: 交互式修复错误
e2fsck: ext系列文件专用的检测修复工具
-y: 自动回答yes
-f: 强制修复
文件系统格式化后,文件系统需要与根文件系统现存的目录建立关系,进而使此目录做为其他文件访问入口。也就是需要对文件系统进行挂载与卸载操作。
挂载方法: mount DEVICE MOUNT_POINT
mount: 通过查看/dev/mtab 文件显示当前系统已挂载的所有设备
挂载常用命令:
mount DEVICE DIR
-t VFS_TYPE: 指定要挂载的设备上的文件系统类型
-r: readonly,只读挂载
-w: 读写挂载
-n: 不更新/etc/mtab
-a:自动挂载所有支持自动挂载的设备: (定义在/etc/fstab文件中)
-U ‘UUID‘: 以UUID指定要挂载的设备
-B,--bind: 绑定目录到另一个目录
注意: 查看内核追踪到的已挂载的所有设备: cat /proc/mounts
-o options: (挂载文件系统的选项)
async: 异步模式
sync:同步模式
atime/noatime:
diratiome/nodiratime: 目录的访问时间戳
auto/noauto: 是否支持自动挂载
exec/noexec: 是否支持将文件系统上应用程序运行为进程
dev/nodev: 是否支持在此文件系统上使用设备文件
suid/nosuid:
remount:重新挂载
user/nouser:是否运行普通用户挂载此设备
acl:启用文件系统上的acl功能
注意:上述选项可多个同时使用,彼此都好分隔,默认挂载选项:defaults (rw,suid,dev,exec,auto,nouser,and async)
卸载命令:
#umount DEVICE
查看正在访问指定文件系统的进程:
# fuser -v MOUNT_POINT
# fuer -km MOUNT_POINT 终止所有正在访问指定文件系统的进程
挂载交换分区:
启用: swapon
swapon [OPTION]...[DEVICE]
-a: 激活所有的交换分区
-p: PRIORITY:指定优先级
禁用: swapoff [OPTION]...[DEVICE]
内存空闲使用状态:
free [OPTION]
-m: 以MB为单位
-g: 以GB为单位
文件系统空间占用等信息的查看工具:
df:
-h: human-readable
-l: inodes instead of blocks
-P: 以Posix兼容的格式输出
查看某目录总体空间占用状态:
du:
du [OPTIONS] DIR
-h: human-readable
-s: summary
要实现开机自动挂载,则要修改挂载的配置文件: /etc/fstab
每行定义一个要挂在的文件系统:
要挂载的设备或伪文件系统: 设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc、sysfs)
挂载点
文件系统类型
挂载选项: defaults
转储频率:
0:不做备份
1: 每天转储
2:每隔一天转储
自检次序:
0:不自检
1:首先自检,一般只有rootfs才用1
链接文件:
硬链接:指向同一个inode的不同路径:创建文件的硬链接即为为inode创建新的引用路径,因此会增加引用计数
不能对目录进行
不能跨分区进行
符号链接:指向的是另一个文件的路径:其大小为指向的路径字符串的长度,不会增加或减少目标文件的inode引用过计数
可以对目录进行
可以跨分区进行
创建符号链接的命令:
ln [-sv] SRC DEST
-s: symbolic link
-v: verbose
文件管理操作对文件的影响:
文件删除:文件的inode引用计数降低为0,inode bitmap中对应的inode号标记为空闲,block bitmap中对应的block号标记为空闲,分配的所有block也标记为空闲
文件复制:创建新的文件,复制原来的文件内容到新文件中
文件移动:跨分区移动同复制操作,再把原来的文件删除;如果是同分区:创建新路径指向原来路径指向的inode号
练习:1.创建一个20G的文件系统,块大小为2048,文件系统为ext4,卷标为TEST,要求此分区开机后自动挂载至/testing目录,且默认有acl挂载选项
a.创建20G的分区
b. mke2fs -t ext4 -b 2048 -L TEST /dev/DEVICE
c.编辑/etc/fstab: 增加一行:LABEL="TEST" /testing ext4 defaults,acl 0 0
2.创建一个5G的文件系统,卷标HUGE,要求此分区开机自动挂载至/mogdata目录,文件系统类型为ext3
a.创建5G分区
b. mkfs.ext3 -L HUGE /dev/DEVICE
c.修改配置文件/etc/fstab: 增加一行:LABEL=‘HUGE‘ /mogdata ext3 defaults 0 0
3.写一个脚本:
(1)列出当前系统识别到的所有磁盘设备
# fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]"
(2)如磁盘数量为1,则显示其空间使用信息,如果大于1则显示最后一条
#!/bin/bash
#
disknum=$(fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | wc -l)
if [ $disknum -eq 1 ]: then
fdisk -l `fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | cut -d‘ ‘ -f2`
else
fdisk -l `fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | tail -1 | cut -d‘ ‘ -f2 `
fi
以上是关于磁盘管理与文件系统的主要内容,如果未能解决你的问题,请参考以下文章