Skip to content

Latest commit

 

History

History
406 lines (243 loc) · 17.7 KB

2.7_20170219_硬盘和文件系统.md

File metadata and controls

406 lines (243 loc) · 17.7 KB

硬盘和文件系统基础

本节主要讲述了硬盘的工作原理,文件系统,和分区建立文件系统和挂载等,另外区分了硬链接和符号链接,也说明了压缩归档工具

机械式硬盘

一块硬盘由一个马达带动的同轴多盘片结构,盘片双面可读写,为了能够实现读写,每一个面都被划分成了磁道(track),由厂商完成,磁道再一次划分为扇区,一般扇区大小为512字节

磁盘的角速度是固定不变的,每一个盘面上都有一个磁头,所有的磁头都由机械臂连接到一起,所有的磁头都会同步移动,读取文件的一般过程是移动磁头,等待存储数据的扇区转到磁头位置

在一块硬盘的不同盘面的相同磁道都划分成同一个分区,这些位于不同盘面上的相同编号的磁道,叫做柱面

硬盘的文件表现在/dev/中

硬盘接口

  • IDE(ATA):并口,每个控制器可接两个硬盘,分为master/slave,理论速率为133MB/s

    ​ Linux表现为/dev/hd[a-z],分区的设备访问入口/dev/hda[1-4],逻辑分区从5开始

  • SCSI:并口设备,翻译为小型计算机接口,与IDE同时期,理论速率320MB/s, 硬盘寿命更长

    ​ 直接接管硬盘和内存之间的的IO,让cpu可以不用做低效的等待

  • SATA:串口,SATA3理论速率为6Gbps

  • SAS:串口,一个接口接一块硬盘,理论速率6Gbps

  • USB

在centos6中无论什么硬盘类型都统一识别为/dev/sd[a-z]

磁盘分区管理和文件系统

按名称存取是文件系统的主要目的,文件系统是一个软件,对磁盘上存在的二进制数据进行层次化管理

早期为了能够在一块硬盘上安装多个系统,把磁盘分成了多个分区,每一个分区当做独立的设备使用

划分分区是根据柱面进行的,外侧的磁道在相同时间内比内侧磁道划过的数据多,性能也就更好

MBR

分区信息存储在硬盘的第0个扇区,第0个扇区不能用来划分区,这个扇区被称为MBR(master boot record)也称为主引导记录

主引导记录里面存储着分区信息和BootLoader还有5A

为了引导不同的操作系统,系统就要知道去哪个分区找相应的操作系统,所以有一段程序在加电后执行,来选定要启动的操作系统,这一段程序叫做BootLoader,占用446字节

剩下的64个字节,用于存储分区信息,16个字节引导一个分区

剩下的2字节用于填充两个16进制的数据5A,是MBA有效性标记

一个硬盘只能有4个主分区,但从4个分区中拿出一个,存放其他的分区信息,这个分区是扩展分区,扩展分区是引用额外的分区表,不是一个真正的分区,扩展分区继续划分分区才能使用,划分的分区叫做逻辑分区

分区表除了有MBR,还有GPT等

根的位置

系统的根在内核中,内核在磁盘只中

当系统加电,首先运行BootLoader,BootLoader识别各分区,然后访问分区的元数据区,识别文件,装载分区中的内核,内核启动后,内核将内存中的根所关联的分区作为文件访问入口将根分区的文件载入内存

只有系统所必须的所有功能都加载完毕,才可访问其他分区,所以/bin、/sbin等这些系统必须的文件必须放在根分区,否则系统无法启动

设备分区管理

创建调整删除分区

fdisk是常见的磁盘分区管理工具,可以查看磁盘分区情况和磁盘分区管理,用于mbr

另外gdisk也是分区管理工具,用于GPT

使用fdisk /dev/sda会进入交互式命令行界面

d:删除分区
n:新建分区
p:列出现有分区
t:调整分区ID
l:列出内核支持的分区ID
w:保存退出
q:不保存退出
m:帮助

通知内核重新识别设备并创建设备文件,在centos5中执行partprobe;在centos6中执行partx -l或kpartx -af /dev/sda

一般来说,先使用kpartx -l /dev/sda,然后使用kpartx -af /dev/sda,再使用partx -a /dev/sda

当分区已经划分好后,就可以给分区建立文件系统了

文件系统分类

不同的文件系统内部文件组织和存放的方式不同,所以为了能够在不同的文件系统都能正确的读取写入文件,Linux内核中有一个翻译官叫做vfs虚拟文件系统,这样上层的应用程序就无需考虑文件系统是什么,由vfs进行转换。

内核为了识别不同的文件系统,给不同文件系统大类分配了ID号

Linux基于vfs可以识别的文件系统:

基本文件系统:Ext2、Ext3、Ext4、Reiserfs(海量小文件)、xfs(支持单个巨大文件)、Jfs、vflat、NTFS

交换分区:swap

集群文件系统:GFS2、OCFS2

网络文件系统:NFS、smbfs(CIFS)

分布式文件系统:通常需要第三方应用程序支持,内核独立无法识别

光盘:ISO9660

了解ext文件系统

ext文件系统对文件管理的格式

格式化就是为了创建文件系统,创建文件系统就是把磁盘划分成元数据区和数据区,元数据区用来存放文件的元数据,每一个元数据在在元数据区有一个inode number,元数据区有很多条目节点,每一个节点叫做inode,inode保存了文件的很多属性,如文件时间戳、属主属组、权限、文件放在了数据区的什么位置(磁盘块,必须是扇区的2的n次方倍 ),一个磁盘块只能属于一个文件,不能个文件共享一个磁盘块block,文件硬链接除外,不同的文件一定不能使用相同的磁盘块

磁盘块的大小是可以根据自己的需求定义的,当存储大文件时,磁盘块大一些,可以减少元数据的索引,加快文件的访问速度,而当要存储大量小文件时,磁盘块的大小应该小一些,因为如果磁盘块大了,会造成空间浪费

另外,inode并非和文件块一一对用,一个inode可以对应多个文件块,也就意味着一个inode要指向多个 块,所以在格式化时需要指定空间来存储inode,假如一个inode是256个字节,那么该为分区指定多少个inode?在格式化时可以直接指定inode数,有两种情况,第一是如果指定的inode数已经用完了,磁盘块还有剩余,那么磁盘块就浪费了;第二是如果磁盘块已经存满了,而inode节点还有剩余,那么剩余的inode也是浪费闲置的。

所以inode和磁盘块有一种关系比例,他们的匹配度越接近越好,可以根据自己的需求来设定比例,多少块一个inode,系统也会默认设定一种比例,这叫做inode比例。

文件系统碎片是一个文件没有被连续的存储在磁盘块中,而是分散的存储在许多个磁盘块上,这样巡道一圈才能读到一块,然后再转一圈再读一个块,这样很慢。

ext会尽可能避免碎片,把大文件和小文件的磁盘块分开存储

当存储一个文件时,首先写入了inode,然后写入磁盘块时因为其他原因部分没有被写入,因此此文件无法被访问,因为inode比例也已经确定,所以文件系统在检查时发现inode对应磁盘块并没有存满,会把磁盘块和inode删除,这是文件系统检测和修复,文件系统检测在文件系统非法关闭时是非常必要的

磁盘是很慢的,文件保存是将文件缓存在内存中然后向磁盘写入,在写入过程中如果断电,那么文件就会损坏,一旦丢失就只能删除,文件系统检测和修复就会对每个文件进行扫描,这速度会很慢,所以在磁盘分区上划分出一段空间作为日志空间, 如果是写请求,元数据会改变,将元数据放在日志区域,数据存储结束后,将日志区的元数据转移到元数据区。当发生断电等情况时,文件系统检测和恢复只需要检查日志区的inode所对应的磁盘块。实际上日志区还可以存储数据等。

给inode建立一个索引,叫做inode位图可以查看inode有没有被使用,当要存储文件不用一个一个inode区查找,而是查找位图中为0的inode,磁盘块叫做块位图

创建文件系统

创建文件系统可以使用mkfs、mke2fs命令

使用mkfs创建文件系统,使用-t指定文件系统类型,一般使用格式是mkfs -t fstype /dev/somedevice

实际上当使用了mkfs命令指定了文件系统,真正执行命令的是mkfs.fstype命令,如mkfs.ext2命令

mke2fs可以直接创建ext系列的文件系统,使用-t选择要创建的文件系统

mkfs -t ext4 /dev/somedevice=mkfs.ext4 /dev/somedevice=mke2fs -t ext4 /dev/somedevice

多数情况下使用mke2fs来创建文件文件系统,配置文件在/etc/mke2fs.conf

-t {ext2|ext3|ext4}:指定文件系统类型
-j:相当于-t ext3
-L Lable:指定卷标
-b{1024|2048|4096}:指定块大小
-i 数字:多少个字节预留一个inode
-I 数字:指定预留inode的size
-N 数字:指定预留inode的个数
-m 数字:预留给管理员的磁盘空间百分比,默认为5%
-O:指定分区特性

查看设备属性的命令

使用e2label /dev/somedevice可以查看设备卷标,也可以指定卷标,使用e2lable /dev/somedevice Lable

使用blkid /dev/somedevice可以查看设备属性UUID和type,使用磁盘的UUID来进行磁盘的挂载,可以尽可能的避免设备的重复

使用dumpe2fs可以查看相关设备超级块和磁盘碎片,-h选项仅显示超级块的信息

使用tune2fs可以调整mke2fs的文件系统相关信息,块大小是不可更改的

-l:查看设备的超级块信息
-L:设定卷标
-m:调整预留空间的百分比
-j:如果原来的文件系统为ext2,-j能够将其提升为ext3
-o [^}mount-options[,...]:设定其默认挂载选项,使用^取消默认选项
-O [^]feature[,...]:调整其分区特性

使用fsck是对文件系统检测的命令,-t 指定文件系统类型

-f:强行检测
-a:自动修复错误
-r:交互式修复错误

e2fsck也是文件系统检测的命令,-y自动回答为yes,-f强行检测

交换分区

交换分区和windows中的虚拟内存很相近,当物理内存不够使用时,会将内存中的一部分最近很少使用的页面数据转置换到硬盘上,内存中的数据格式和硬盘的文件的格式是不一样的,所以格式化为和内存兼容的格式,单位是页面page

交换分区的id表示是82

首先将要调整分区的id,然后使用mkswap将设备格式化为交换分区

-L label:指定卷标

然后,使用swapon /dev/somedevice来启动虚拟内存

-a:启动所有的虚拟分区
-p:指定优先级

使用swapoff关闭虚拟内存

linux使用内存的机制,默认情况下物理内存够用就不会使用交换分区,但可以在/proc/sys/vm/swapiness进行定义交换分区使用倾向性

交换分区的大小

物理内存在2-4G时,交换分区设置在4G即可;当小于2G时,使用物理内存的2倍的交换分区大小;当大于8G时,交换分区4G即可

查看内存空间使用状态

可以直接查看文件/proc/meminfo的内容,也可是使用free命令,同样也支持-h选项

获取sata、IDE接口类型的硬盘的硬件属性信息

使用hdparm获取硬盘硬件属性信息

-i:从操作系统读取
-I:直接从硬盘读取
-g:显示磁盘的布局信息
-t:测试硬盘的性能
-T:测试硬盘的性能

和文件系统相关的三个为文件目录:/proc/partions、/proc/meminfo、/proc/filesystems

挂载

创建完文件系统后,要想使用就要和当前根文件系统上的某一个空闲目录关联起来作为其访问的入口 ,根分区之外的任何一个分区都要挂载才能被访问

挂载分为手动挂载和自动挂载

手动挂载也叫做按需挂载,其中按需挂载还有一种叫做按需自动挂载

mount和umount用来对分区进行挂载和卸载

一般使用格式为:mount [命令options] [-t fstype] [ -o 挂载时启动的分区特性option] 设备 挂载点

命令options

-t fstype
-r:只读挂载
-w:读写挂载
-L label:以卷标指定,LABLE="label"
-U UUID:以UUID指定挂载设备
-a:自动挂载所有(/etc/fstab文件中)支持自动挂载尚未被的设备
-n:不更新/etc/mtab
--bind dir1 dir2:将目录绑定到另一个目录上

挂载时启动的分区特性option

async:启用异步IO,默认的
sync:启用同步IO
noatime、atime:是否更新文件访问时间戳,不是特别重要的文件,建议noatime
auto:是否能够被mount -a选项自动挂载
diratime、nodiratime:是否更新目录的访问时间戳
exec、noexec:是否允许执行其中的二进制程序,默认exec
_netdev:网络设备,防止网络不可用是时一直尝试挂载
remount:重新挂载
ro:只读
rw:读写
acl:启用facl文件访问控制列表

挂载的默认选项是rw,suid,dev,exec,auto,nouser,async,and realtime

umount 设备|挂载点

单独使用mount可以显示当前系统所有已挂载的设备,实际上是读取了/proc/mounts文件,/etc/mtab文件是根据/proc/mounts自动生成并修改的,当/etc/mtab不存在或不可写,会报错,使用-n选项不更新/etc/mtab文件

挂载点应该是一个空闲并且已存在的目录,挂载点被挂载后,原始数据会被暂时隐藏,卸载后恢复显示,卸载时可被卸载

光盘设备的挂载

光盘的设备文件在/dev/cdrom、/dev/dvd、/dev/sr0

查看占用挂载设备的进程

fuser -v 挂载点可以显示相关的进程正在访问挂载点

fuser -km 挂载点可以强制清除占用挂载点用户的shell

其他磁盘空间查看的命令

df [挂载点]可以查看挂载点磁盘空间使用状态报告,-h选项可以以人类易读友好显示

-i:显示inode的使用情况
-P:以POSIX格式显示

du评估文件占用磁盘空间的情况

-s:显示目录大小,summary
-h:人类易读显示

开机自动挂载

/etc/rc.d/rc.sysinit是系统初始化脚本,其中一个功能就是挂载/etc/fstab文件中定义的文件系统挂载表中的分区,

fstab中各字段是:欲挂载的设备(设备文件|label|UUID)、挂载点(有的文件系统没有挂载点如swap)、文件系统类型、挂载选项(多选项用逗号隔开)、转储频率(备份频率0从不备份,1表示每天备份,2表示每两天备份)、自检次序(只有根的自检为1,表示首先自检)

环回设备

linux内核允许把文件组织成设备的形式当做模拟设备,叫做本地回环设备,实现虚拟磁盘

使用dd命令完成文件复制,对磁盘做性能测试,还可以创建本地回环设备等

bs=数字[b|k|m|g]
count=
if=inputfile
of=outfile

使用dd命令只做镜像文件dd if=/dev/cdrom of=/tmp/linux.iso,或者使用cat命令cat /dev/cdrom > /tmp/linux.iso

使用dd命令备份mbr:dd if=/dev/sda of=/tmp/myfile bs=512 count=1

/dev/zero可以生成无数个0

使用dd命令删除硬盘分区:dd if /dev/zero/ of=/dev/sdb bs=512 count=1,bs要大于446,因为446是BootLoader,分区表没有没破坏

生成本地环回设备:dd if=/dev/zero of=/swapfile bs=1M count=100,这样就生成了一个100M大小的swapfile文件,可以用来分区格式化

稀疏磁盘格式,实际上并没有真实占用的了很多磁盘空间,只是将这些空间占据了,大部分没有写入数据,只写了一小部分的数据,日后根据使用,磁盘没有写入的部分会写入文件

dd和copy的区别

copy是对文件进行操作的,dd是对磁盘操作;

如果将一块硬盘上的所有数据复制到另外一块硬盘上,就要使用dd

http://pic.027cgb.cn/20170203/20172217351522242063.gif

文件链接

链接文件分为硬链接和符号链接

创建链接的一般使用格式是:ln [options] 源文件 链接文件

硬链接不可以跨分区,因为inode指向是不能跨分区的;不能对目录创建硬链接,因为会导致文件遍历死循环

硬链接是同一个分区上指向同一个inode的不同路径,两个文件会同步变化,删除一个文件不会影响硬链接文件的存在

硬链接会改变文件被链接的次数

跨分区可以使用符号链接,符号链接和windows中的快捷方式很像,符号链接的inode实际上保存的是指向文件的路径

使用-s选项创建符号链接文件,符号链接没有磁盘块空间,看到的文件大小是inode中保存指向文件的路径的大小

符号链接和源文件不是同一个inode,可以对目录创建符号链接,符号链接不会改变源文件被链接的次数

总结一下就是硬链接不能跨分区,不能对目录创建硬链接,会改变文件链接次数,链接文件和源文件指向同一个inode,符号链接相反

dev目录下使用ls -l查看到的链接文件中,两个数字代表主设备号和次设备号,用逗号隔开

压缩和归档

压缩工具

常用的压缩工具有zip、gzip、bzip、xz,使用-[0-9]来指定压缩比,默认为6,9是最大压缩比,压缩文件的后缀是gz或bz2或xz

压缩和解压缩后源文件被删除,bzip可以使用 -k选项保留源文件

-d选项可以解压,也可以使用unzip、gunzip和bunzip、unxz

gzip和bzip都不能压缩目录

zcat、bzcat、xzcat可以临时查看压缩文件中的内容

zip既可以压缩又可以归档,zip要指定压缩后文件的名字和压缩的文件,不会删除源文件

归档工具

将多个文件归档为一个文件

tar [options] -f file.tar file1......

tar的选项可以不使用-

-c:创建归档
-x:展开归档
-t:不展开而直接查看被归档的文件
-z:使用gzip压缩
-i:使用bz2压缩
-J:使用xz压缩

解压缩时tar命令会自动根据文件的后缀选择合适的解压缩工具,也就是不需要使用ziJ

f一定要放在其他选项后