设备文件
一切皆文件 open(), read(), write(), close()
磁盘结构
磁盘接口类型
并行
-
IDE:133MB/s
-
SCSI:640MB/s
串口
-
SATA:6Gbps
-
SAS:6Gbps
-
USB:480MB/s
rpm
-
rotationsper minute 硬盘每分钟转数
硬盘结构
图一 图二
下面我们来介绍几个磁盘存储的数据
-
head:磁头 即 盘面
-
track:磁道
-
cylinder: 柱面
-
secotr: 扇区,512bytes
每个扇区空间大小为512byte
从图上看扇区是越往内圈越小。的确,扇区面积是小了,但存储的数据量不变,只是数据存储密度增大了而已(存在浪费空间)。
机械硬盘使用8位二进制数表示磁头(head)数,所以最多可以有2^8个磁头即256个
采用10位二进制数表示磁道(track)数,所以最多可以有2^10个磁道即1024个
采用6位二进制数表示扇区(sector)数,所以每个磁道最多可以有2^6个扇区即64个
这里我们可以得到一个公式
单个磁盘最大空间=每个磁道扇区数×每个扇区大小×磁道数×磁头数=64×512(byte)×1024×256=8G
分区是按照柱面来划分的
所以同样的可以得到
一个分区的最小单位=一个磁道大小×磁头数=64×512(byte)×256=8M
所以我们的分区大小通常为8M的整倍数
但实际情况好像并不是这样?
这是因为我们的运算是按照CHS(cylinder、head、sector)的
即每个磁道的扇区数相同
现在一般采用CHS和LBA相结合的方式划分扇区即每个磁道上的扇区数可以不同、并且一个柱面可以属于多个分区
这样单个磁盘最大空间要大的多的多
磁盘分区
为什么是分区?
-
优化I/O性能
-
实现磁盘空间配额限制
-
提高修复速度
-
隔离系统和程序
-
安装多个OS
-
采用不同文件系统
分区
两种分区方式:MBR,GPT
首先介绍MBR
MBR:master boot record 使用32位(4byte)表示扇区数,所以单个分区不超过2T(2^32×512=2T)
如何分区:按柱面
0磁道0扇区:512bytes
446bytes: boot loader 64bytes:分区表 16bytes: 标识一个分区 4个主分区;3主分区+1扩展(N个逻辑分区) 2bytes: MBR区域的有效性标识;55AA为有效
下面我们使用命令来看下MBR的内容
[root@redhat7 ~]# hexdump -C -n 512 /dev/sda
一个简单实验:
1、使用dd命令备份磁盘的mbr
2、使用dd命令破坏磁盘的mbr
3、使用dd命令利用备份的mbr恢复到磁盘上
[root@redhat7 ~]# fdisk -l /dev/sdb // 首先查看/dev/sdb 是存在的 [root@redhat7 ~]# dd if=/dev/sdb of=/root/mbr.bak bs=512 count=1 // 备份/dev/sdb的MBR 到 /root/mbr.bak [root@redhat7 ~]# dd if=/dev/zero of=/dev/sdb bs=512 count=1 // 破坏/dev/sdb的MBR [root@redhat7 ~]# fdisk -l /dev/sdb // /dev/sdb的分区表 已经不复存在了 [root@redhat7 ~]# dd if=/root/mbr.bak of=/dev/sdb bs=512 count=1 // 恢复/dev/sdb 的MBR [root@redhat7 ~]# fdisk -l /dev/sdb // /dev/sdb的分区表又重新显示了
MBR分区结构
从图上我们也可以发现一个问题:
实验环境 /dev/sda为我们正常使用的硬盘 /dev/sdb为我们新添加的一块硬盘 dd if=/dev/sda of=/dev/sdb bs=512 count=1 dd if=/dev/sda of=/dev/sdb bs=1 count=66 skip=446 seek=446 dd if=/dev/zero of=/dev/sdb bs=1 count=2 skip=510 seek=510 dd if=/dev/sda of=/dev/sdb bs=1 count=2 skip=510 seek=510
从图中我们可以看到复制sda的MBR到sdb,但是它们两个显示的并不一样,sdb没有显示逻辑分区sdb5 所以可以说明MBR存储的只有主分区和扩展分区的分区表信息(最多只能复制4个分区表的信息,这点前面也介绍过); 逻辑分区的分区表信息并不存在于MBR(可以查看前面的图示,这点需要注意)
GPT分区
-
GPT:GUID patition table 支持128个分区,使用64位,支持8Z(512Byte/block )64Z (4096Byte/block)
-
使用128位UUID 表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位
-
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动
操作系统安装在GPT分区中时,要在主板BIOS设置中将电脑设置为支持UEFI启动
GPT分区结构
管理分区
-
列出块设备
[root@redhat7 ~]# blkid blkid -L <label> | -U <uuid>
-
添加一块新的硬盘作为实验环境
[root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host0/scan [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host1/scan [root@redhat7 ~]# echo "- - -" > /sys/class/scsi_host/host2/scan //在不需要重启的情况下识别新添加的硬盘
-
创建MBR分区
fdisk创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区 [root@redhat7 ~]# fdisk -hlep Usage: fdisk [options] <disk>change partition table fdisk [options] -l <disk> list partition table(s)
-
创建MBR分区
gdisk [ -l ] device
GNU parted高级分区操作(创建、复制、调整大小等等)
[root@redhat7 ~]# parted --help Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...] Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, run in interactive mode.
查看是MBR分区还是GPT分区的几个命令,及其混合 [root@redhat7 ~]# gdisk /dev/sdb [root@redhat7 ~]# gdisk /dev/sdc [root@redhat7 ~]# fdisk /dev/sdb [root@redhat7 ~]# fdisk /dev/sdc [root@redhat7 ~]# fdisk -l /dev/sdc Disk label type: gpt [root@redhat7 ~]# fdisk -l /dev/sdb Disk label type: dos [root@redhat7 ~]# gdisk -l /dev/sdc [root@redhat7 ~]# gdisk -l /dev/sdb // 注意区别
同步分区表
查看内核是否已经识别新的分区 [root@redhat7 ~]# cat /proc/partitions [root@redhat7 ~]# lsblk [root@redhat7 ~]# ls /dev/设备名 //以上3个命令为查看内核中的分区表 [root@redhat7 ~]# fdisk -l /dev/设备 //查看为磁盘上的分区表 如果上面和下面命令显示的设备文件不一样,则需要通知内核重新读取硬盘分区表 centos 6 新增分区用 [root@redhat7 ~]# partx -a -n M:N /dev/DEVICE 删除分区用 [root@redhat7 ~]# partx -d -nr M:N /dev/DEVICE centos 5、7 [root@redhat7 ~]# partprobe [/dev/DEVICE]
parted命令
parted的操作都是实时生效的,小心使用 parted - a partition manipulation program parted [options] [device [command [options...]...]] optionss: -l, --list lists partition layout on all block devices COMMANDS: help [COMMAND] print general help, or help on COMMAND mklabel,mktable LABEL-TYPE create a new disklabel (partition table) mkpart PART-TYPE [FS-TYPE] START END make a partition print [...] display the partition table, rm NUMBER delete partition NUMBER # parted /dev/sdb mklabel gpt|msdos # parted /dev/sdb print # parted /dev/sdb mkpart primary 1 200 (默认M) # parted /dev/sdb rm 1 # parted -l
文件进系统类型
-
Linux文件系统: ext2, ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
-
光盘:iso9660
-
Windows:fat32, ntfs
-
Unix: FFS(fast), UFS(unix), JFS2
-
网络文件系统:NFS, CIFS
-
集群文件系统:GFS2, OCFS2(oracle)
-
分布式文件系统:ceph, moosefs, mogilefs, glusterfs, Lustre
-
RAW:未经处理或者未经格式化产生的文件系统
文件系统分类
-
根据其是否支持"journal"功能:
-
日志型文件系统: ext3, ext4, xfs, …
-
非日志型文件系统: ext2, vfat
-
文件系统的组成部分:
-
内核中的模块:ext4, xfs, vfat
-
用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
-
Linux的虚拟文件系统:VFS
-
查前支持的文件系统:cat /proc/filesystems
VFS:Linux虚拟文件系统
创建文件系统
mkfs命令: (1) # mkfs.FS_TYPE/dev/DEVICE ext4 xfs btrfs vfat (2) # mkfs-t FS_TYPE /dev/DEVICE -L 'LABEL': 设定卷标 创建ext文件系统 mke2fs:ext系列文件系统专用管理工具 -t {ext2|ext3|ext4} -b {1024|2048|4096} -L 'LABEL' -j: 相当于-t ext3 mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3 -i#: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小 -N #:为数据空间创建个多少个inode -I 一个inode记录大小128---4096 -m #: 默认5%,为管理人员预留空间占总空间的百分比 -O FEATURE[,...]:启用指定特性 -O ^FEATURE:关闭指定特性
文件系统属性
文件系统标签
-
指向设备的另一种方法
-
与设备无关
blkid:块设备属性信息查看 blkid[OPTION]… [DEVICE] -U UUID: 根据指定的UUID来查找对应的设备 -L LABEL:根据指定的LABEL来查找对应的设备
e2label:管理ext系列文件系统的LABEL # e2label DEVICE [LABEL]
findfs:查找分区 findfs[options] LABEL=
tune2fs
tune2fs:重新设定ext系列文件系统可调整参数的值 -l:查看指定文件系统超级块信息;super block -L 'LABEL':修改卷标 -m #:修预留给管理员的空间百分比 -j: 将ext2升级为ext3 -O: 文件系统属性启用或禁用,–O ^has_journal -o: 调整文件系统的默认挂载选项,–o ^acl -U UUID: 修改UUID号 dumpe2fs: -h:查看超级块信息(分组信息),分区用分组管理
超级块和inode table
文件系统检测和修复
常发生于死机或者非正常关机之后
挂载为文件系统标记为“dirty”
fsck: File System Check fsck.FS_TYPE fsck-t FS_TYPE -a: 自动修复错误 -r: 交互式修复错误 注意: FS_TYPE一定要与分区上已经文件类型相同; e2fsck:ext系列文件专用的检测修复工具 -y:自动回答为yes -f:强制修复
挂载mount
挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为
卸载:为解除此关联关系的过程
把设备关联挂载点:mount Point # mount
卸载时:可使用设备,也可以使用挂载点 # umount
挂载点下原有文件在挂载完成后会被临时隐藏
挂载点目录一般为空
挂载方法:mount DEVICE MOUNT_POINT
mount:通过查看/etc/mtab文件显示当前已挂载的所有设备 mount [-fnrsvw] [-t vfstype] [-o options] device dir device:指明要挂载的设备; (1) 设备文件:例如/dev/sda5 (2) 卷标:-L 'LABEL', 例如-L 'MYDATA' (3) UUID, -U 'UUID':例如-U '0c50523c-43f1-45e7-85c0-a126711d406e' (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs dir:挂载点 事先存在;建议使用空目录 进程正在使用中的设备无法被卸载 [option] -t vsftype:指定要挂载的设备上的文件系统类型 -r: readonly,只读挂载 -w: read and write, 读写挂载 -n: 不更新/etc/mtab,相当于#mount -a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能) -L 'LABEL': 以卷标指定挂载设备 -U 'UUID': 以UUID指定要挂载的设备 -B, --bind: 绑定目录到另一个目录上 查看内核追踪到的已挂载的所有设备: cat /proc/mounts -o options:(挂载文件系统的选项),多个选项使用逗号分隔 async:异步模式 sync:同步模式,内存更改时,同时写磁盘 atime/noatime:包含目录和文件 diratime/nodiratime:目录的访问时间戳 auto/noauto:是否支持自动挂载,是否支持-a选项 exec/noexec:是否支持将文件系统上运行应用程序 dev/nodev:是否支持在此文件系统上使用设备文件 suid/nosuid:不否支持suid和sgid权限 remount:重新挂载 ro:只读 rw:读写 user/nouser:是否允许普通用户挂载此设备,默认管理员才能挂载 acl:启用此文件系统上的acl功能 Defaults:相当于rw, suid, dev, exec, auto, nouser, async
卸载命令
查看挂载情况: #findmntMOUNT_POINT 查看正在访问指定文件系统的进程: #lsofMOUNT_POINT #fuser -v MOUNT_POINT 终止所有在正访问指定的文件系统的进程: # fuser -km MOUNT_POINT 卸载: # umountDEVICE # umountMOUNT_POINT
挂载点和/etc/fstab
配置文件系统体系 被mount、fsck和其它程序使用 系统重启时保留文件系统体系 可以在设备栏使用文件系统卷标 使用mount -a 命令挂载/etc/fstab中的所有文件系统
原创文章,作者:sixijie,如若转载,请注明出处:http://www.178linux.com/41821
评论列表(1条)
图片看起来是很直观,建议加上文字描述,这样别人才看的东,总体来说总结的还不错,有自己独特的地方。