一、存储管理
计算机结构里,在CPU中,只有指令,没有数据,那么向内存取数据需要bus即常说的总线,所有总线汇总于North Bridge,连接了高速设备(显卡,cpu)等等;South Bridge连接了低速设备(键盘,硬盘),且连接于 North;
BUS总线分三种,地址总线,控制总线,数据总线;连接cpu与北桥的总线充当三种总线,但是同一时刻只能有一个功能
直接通过主板插槽插在主板上的叫适配器(Adapter),向键鼠,硬盘,只能通过线缆连接至主办的接口,接口在控制芯片(即controller)上.主板连接各个硬件设备,并起到'翻译'的作用;
那么,存储数据的设备-磁盘就显得尤为重要
存储设备的性能评价标准:
性能之一 每秒传输速率 bps
IDE:并口,来源于ATA,133Mbps
SCSI:并口
UltraSCSI320:320Mbps
UltraSCSI640:640Mbps
SATA:Serial ATA 串口 一根线直接一个设备
SAS:串口 用于服务器领域,向下兼容SAT
性能之二---IOPS:每秒IO次数
IDE:机械硬盘,50IPOS
SCSI:机械 100-200
固态 400左右
SATA:机械 100左右
固态 400
SAS: 机械 200左右
固态 800左右
PS:据说华为所使用的 PCI-E固态硬盘的IPOS可达100000+,也是6到不行。不过这种东西,在个人PC是万万用不得滴。。。
接下来说说机械硬盘,也就是计算机内部的那个圆形的金属片:
首先,我们了解几个机械硬盘的术语:
track:磁道 非可视,由于表面磁性材料密度极高、
sector:扇区 每一个扇区的大小 512Bytes;现在所说的扇区,实际上是平均值 最小的物理存储单元
cylinder:柱面。从磁道向所有盘片做投影;
在柱面里 做partition即分区,就是基于柱面来划分的存储空间
head:磁头 每个磁盘表面都有一个磁头;磁头的数量=盘面的数量
好,了解了这些术语,我们回到linux系统中来,linux哲学思想之一,一切皆文件,存储设备也不例外
设备文件:/dev
它是关联到 硬件设备的驱动程序 和 设备的访问入口;
其中,用命令查看到设备文件都有一段设备号:
major:主设备号,区分设备的类型用于标明设备所需的驱动程序
minor:从设备号,区分同种类型下的不同设备,是特定设备的访问入口
主设备号相同,都是同一个设备。不同的此设备号表示,不同访问入口访问设备的不同位置;
设备文件名:
linux的设备命名遵循了icann颁布的命名规则
即在/dev目录下,IDE硬盘一般命名为:hd[a-d];SCSI、SATA、SAS、USB:sd[a-z]\+ 例如sda,sdb等等,而从RHEL6、CentOS6开始:所有的接口类型的硬盘设备统一命名为sd[a-z]
设备的引用方式:卷标引用Volume Lable 和 UUID引用:Universal unique identifi 128bit
注意:设备文件名随时有可能会发生变化
那么该如何使用一个新的硬盘设备呢?有以下三个步骤
1.分区
2.创建文件系统(也就是格式化)
3.挂载分区 使用分区
1.1为何分区?有下列几个原因
1.优化I/O性能;
2.实现磁盘空间的配额限制
3.可以进行高速修复
4.隔离系统文件和其他程序文件
5.安装多个操作系统
1.2如何分区?分区的方式有两种,MBR和GPT方式
MBR:一般使用于硬盘空间小于2TB的硬盘上
全名叫Master(或main)Boot Record,主引导记录,起源1982年
其中硬盘的0磁道0扇区(512B)里:
446Bytes:boot loader,引导加载程序
64Bytes:Partition table,分区表每16Bytes表明一个分区的内容,一个保留4个分区,主分区
假设1tb的硬盘:分区成100+100+100+100,则剩下的600G是不能被识别的空间;要想充分使用硬盘空间除非100+100+100+700或者最后一个分区使用扩展分区;
在扩展分区里的分区表,称为逻辑分区
注意:1.主分区+扩展分区,最多可以有4个,其分区表位依次是:1 2 3 4
2.逻辑分区的标号从5开始:不管前面的4个数字编号是否被占用
2Bytes:结束标记,55AA
GPT:硬盘空间大于2TB
GUID Partition Table:GUID 分区表,支持128个分区;
UEFI(统一扩展固件接口)的硬件可以支持GPT 、Boot Legacy
1.3通常使用的分区工具:
fdisk:
用于创建和管理MBR分区,对于一块硬盘,最多只能管理15个分区
gdisk
专用于创建和管理GPT分区,这里的g是GNU
parted:GNU
高级分区工具,实时生效;一般仅限于熟手
fdisk,gdisk非实时生效,安全性高;
但是可能存在这个问题,如果使用了这两个命令对已经有分区并且挂载的磁盘的剩余空间进行再次分区,分区的信息即便是保存了,也不会被内核重新读取;
那么该如何让内核识别此类分区:
1.重启计算机(不提倡),因为在一线运维里不可能做到随时开关机呀;
2.partprobe命令或者partx命令,强制内核重读分区表;
partprobe [device]:CentOS 5/7 如果省略了设备名,表示重读所有磁盘的分区表
partx -af [device]:CentOS 6/7
kpartx -af [device]:centos 6/7
fdisk 分区实例:
fdisk -l [device...]:
查看指定磁盘的分区表,如果省略[device]参数,默认全部
fdisk device
对于制定设备进行分区管理;进入分区操作后会发现有很多子目录,输入m查看这些子命令
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
建立好分区,下一步就是创建Filesystom了:
2.1为什么要创建文件系统
先举一个例子
图书馆有一百万册图书,两种管理方式
1.平面分类管理
遍历搜索
2.空间分类管理
分出门类,按拼音首字母,按年代,按出版社等等;
几次有限单杀有效的查找
显然第二种管理方式更加快捷优化,所以,创建文件系统,实际上就是给分区进行存储空间的逻辑编址;
格式化:
低级格式化
主要在物理层面上完成格式化。即磁盘设备出厂时,通过低级格式化创建磁道;
主要作用:划分磁道
高级格式化
分区之后进行,
主要作用:用来创建文件系统,为分区构建逻辑编址单元,簇,块
无论是簇还是块,都是将一个或者多个扇区组织在一起,共同完成数据存储
簇:512B 1024 2048 ....65536
块:1024 2048 4096
注意:
1.一个簇/块只能放置一个文件的内容,但是一个文件可以占用多个簇/块;
2.如果在某个分区中,将创建大量的小文件,这时就要把块划分的小一些;反之,要把块划分的大一些;
3.如果分区空间比较大,那么块也应该大一些
在一个分区中创建了文件系统:
首先,会将分区划分成大小相等的若干块;
元数据块:
存储文件的属性 元数据——inode(index node)
文件的属性包括:
大小,权限,所有者,时间戳, **数据块指针(fat32 inode里的指针4096块;间接指针1024个块;)
存放元数据的固定存储空间,称为inode;每个inode都有其对应的inode编号
数据块
存放文件所包含的流式数据
特殊文件:
设备文件:block special 或 character special
符号链接文件:symbolic link
仅仅是将元数据中数据块指针换成了另一个文件的访问路径
这类文件只占据元数据块,没有占据数据块;
block bitmap
随着磁盘空间越来越大,划分的块的数量也越来越多,因此,管理起来就很不方便,于是 划分块组来解决该问题
块组:
每个块组有独立的元数据块和数据块 存放数据的时候以块组内的数据块优先选择,如果块组的数据块不够,可以通过存储策略来请多个块组
协同存储
超级块:
主要定义了有多少个块组,以及每个块组的边界
为了防止超级块发生故障导致整个文件系统崩溃,对超级块进行冗余备份;
日志块:对于数据写入操作做记录的块
防止数据不一致;数据的不一致通常是由于非正常关机 断电导致;
所以,一个完整的文件系统包括:
超级块,inode,inode bitmap,block bitmap,data block,journal block
比如:
找/var/log/message文件的内容的过程
/目录inode编号,从元数据区域中找到对应inode,再读取inode里的数据块指针,找到存放/目录内容的数据块;
然后没在数据块中查找名称为var的文件名,如果有,就定位其inode编号,再到元数据区域中查找对应编号的inode,再根据数据块指针找到
保存var目录内容的数据块;
此步骤重复下去直到找到message的数据块部分读取
2.2 linux支持的文件系统
位于内核空间中的文件系统驱动
1.内核的一部分
2.内核模块
位于用户空间中的文件系统管理应用程序
管理命令
linux自己的文件系统:
ext存在了一年 ext2(91-2005) ext3引入日志系统 ext4
ext4:最大分区50TB,可以做/分区,也可以做启动分区
xfs:企业级64位文件系统,最大分区500TB,可以做根和启动分区
reiserfs 良好的反删除功能
btrfs(技术预览版) Blance Tree
光盘文件系统:在linux只支持iso9660;
网络文件系统:NFS、CIFS
集群文件系统:gfs2、ocfs2
内核级的分布式文件系统:ceph
伪文件系统:proc sysfs tmpfs hugepagefs
linux也支持 windows的文件系统:fat32/16———vfat,ntfs
unix的文件系统:ufs,FFS,JFS,zfs
交换分区文件系统:swap
用户空间中的分布式文件系统:mogilefs,moosefs,glusterfs;
众多文件系统,linux都可以支持;
对与不同 的发行版的linux,都有其默认的文件系统选择:
RHEL、CentOS:
5:ext3
6: ext4
7: xfs
2.3 文件系统的管理工具
创建文件系统:
mkfs
mkfs.ext2, mkfs.ext3,mkfs.xfs....
文件系统监测和修复工具
fsck
fsck.ext2....
文件系统属性查看工具
dumpe2fs
文件系统属性调整工具
tune2fs
mkfs:
mkfs - build a Linux Filesystem
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
比如 mkfs -t ext2 /dev/sdb1 -t选项指定要创建的fs类型
注意:
1.不要使用磁盘设备名称和扩展分区设备名称作为mkfs的参数
如果使用了磁盘设备作为参数,那么所有的分区都将被删除
如果使用了扩展分区设备作为参数,所有的逻辑分区都将被删除
2.能够作为mkfs命令参数的设备,是主分区设备和逻辑分区设备
如果只是计划创建ext文件系统的话,可以使用mke2fs的命令
mke2fs:
mke2fs - create an ext2/ext3/ext4 filesystem
【选项】
-b block—size:
-i bytes-per-inode:指明inode与字节的比率,即:多少个字节可以创建一个inode,默认16384;
-j:创建带有日志功能的文件系统,即ext3
-N number-of-inodes:直接指明要给此文件系统创建inode的数量
-m reserved-blocks-percentage:指定为超级用户预留的磁盘空间百分比,默认5
-t fstype 指定文件系统的类型,ext2 ext3 ext4 默认ext2
-O [^]feature[,...]:关闭/开启文件系统的特性
~]# mke2fs -t ext3 -O ^has_journal 看似是ext3的文件系统,但由于加了-O ^has_journal,关闭了这个特性,实则是ext2
-L volume-label 指定卷标
如果只是计划修改ext系列文件系统的卷标,可以使用e2label
e2label - Change the label on an ext2/ext3/ext4 filesystem
e2label device [ new-label ]
注意:不加卷标表示查看device的卷标
加卷标表示修改device的卷标;
如果要修改ext系列文件系统的属性,使用tune2fs
tune2fs - adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems
调整那些在ext2,3,4文件系统上可修改的参数;
【选项】
-j:将ext2修改为ext3
-m reserved-blocks-percentage:
-o [^]mount-options[,...] 修改 默认挂载选项
-r reserved-blocks-count
-L volume-name
-O [^]feature[,...]
-l:显示超级块的内容 相当于 dumpe2fs -h
文件系统的检测修复工具
fsck
ext系列文件系统专用的检测修复工具
e2fsck
blkid
-L label
-U uuid
findfs
创建swap文件系统
前提:分区必须是swap类型
修改的方法:在fdisk交互模式中,用t命令将指定的分区类型修改为82即可
3.1 使用文件系统--挂载
跟文件系统之外的其他文件系统如果想要被访问;都必须通过某种方式关联到根文件系统上,具体做法。即:把其他文件系统装载到根文件系统中的某个目录中,这个过程称为“挂载”,用于关联其他文件系统的那个目录,称为挂载点;
挂载点:mount point,也就是其他文件系统的访问入口 ,例如/boot
要求:
1.作为挂载点的目录必须事先存在;
2.作为挂载点的目录应该是没有被使用或不能被其他进程使用的目录
3.作为挂载点目录,一旦挂载文件系统,其内原有的文件将被隐藏!
mount命令:
mount - mount a filesystem
mount [-fnrsvw] [-t vfstype] [-o options] device dir
【选项】
-r:只读方式挂载目标文件系统 readonly!一般光盘就是这样
-w:以读写的方式挂载目标文件系统
-n:默认情况下,设备挂载或卸载的操作会同步更新到/etc/mtab中,如果挂在时使用了此选项,表示我们要禁用此特性,即
挂在成功也不会更新到/etc/mtab中;
-t vfstype:指明要挂载的设备上创建的文件系统类型;如果省略该选项,mount命令会通过blkid来判断要挂载的目标设备的文件系统类型
-L LABEL:挂载文件系统时,使用卷标代替设备名称
-U UUID :挂载文件系统时,使用UUID代替设备名称
-a:按照/etc/fstab文件中填写的设备自动挂载
-o option:
sync/nosync:同步/异步操作
atime/noatime:文件或目录被读取访问时是否更新时间戳;
diratime/nodiratime:
ro/rw:是以只读还是读写方式
dev/nodev:是否允许创建设备文件
exec/noexec:是否允许运行程序文件
auto/noauto:是否允许使用mount -a方式挂载/etc/fstab中的文件系统
user/nouser:是否允许普通用户挂载文件系统
suid/nosuid:是否允许程序文件上的SUID和SGID特殊权限生效
relatime/norelatime:是否参考inode访问时间来修改其修改时间和改变时间
remount:不经卸载实现重新挂载,可以应用心的挂载选项
acl:可以让文件系统支持facl功能
defaults:默认选项,包含了很多选项 Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.
loop:使用环回设备:将镜像文件挂载到挂载点
-B,--bind:将某个目录绑定至另一个目录
卸载文件系统:
很简单,命令+挂载点 或者是 命令+设备
umount mount_point|device
总结一下,查看挂载文件系统的信息的命令或者文件
1.df -hTP
2.mount
3./proc/mounts文件
4./etc/mtab文件
挂载光盘:
1.保证光盘镜像文件放入虚拟机光驱
2.保证光驱处于已连接状态
3.创建光盘挂载点, mount -r | -o ro /dev/sr0 mount_point
挂载u盘
1.事先系统要可以识别U盘
2.根据设备名(/dev/sdc1),直接进行挂载;
挂载交换分区:
特殊的命令:
swapon, swapoff
- enable/disable devices and files for paging and swapping
-a:自动挂载存储于文件/etc/fstab中的交互分区设备
/etc/fstab文件的格式:
六个字段:空白字符分隔
1.要挂载的设备
设备文件名、label、uuid、伪文件系统
2.挂载点:
swap设备无需挂载点,指定swap即可
3.文件系统类型
4.挂载选项:defaults
5.转储频率:
使用dump命令备份分区的频率
0 不备份
1 每天备份一次
2 每隔一天备份一次
6.自检次序:
0 不自检
1. 优先自检,通常只设置在根文件系统上
2:次级自检
...
9