磁盘管理和Linux文件系统管理
1. 磁盘管理
基础知识
Linux系统“一切皆文件”
- 块设备:block,存取单位为块,硬盘
- 字符设备:char,存取单位为字符
设备文件:关联至一个设备驱动程序,进而能够与之对应的硬件设备进行通信。
设备号码
- 主设备号码:标识设备类型
- 次设备号码:识别同一设备类型下的不同设备
设备号例如sda、sdb等,其中d标识设备类型,a、b标识同一设备类型下的不同设备
磁盘设备命名规则
- 不同硬盘设备类型
- IDE:hd
- SCSI:SATA、SAS、USB:/dev/sd
- 虚拟设备:vd
- 硬盘接口类型
- 并行
- IDE:133M/S
- SCSI:64M/S
- 串行
- SATA:6G/S(6Gbps)
- SAS:6G/S(6Gbps)
- USB:480M/S(480Mbps)
- 并行
- 同一设备类型下的不同设备:a-z(sda、sdb、sdc等)
- 同一设备下的不同分区:1,2,3…(sda1、sda2等)
分区方式
- MBR:使用32位标识扇分区,分区不超过2T,按柱面进行分区,4个主分区(3个主分区+1个逻辑分区)+1个扩展分区(N个逻辑分区)
- GPT:支持128个分区,使用64位,使用128位UUID表示磁盘和分区,GPT分区表自动备份在头和尾两份
分区管理命令
fdisk命令:创建和维护分区表
对于一块硬盘来说最多管理15个分区
格式:fdisk 磁盘名(/dev/sd*)
命令(输入 m 获取帮助):m
命令操作:
- d 删除分区
- l 列出分区id
- m 帮助
- n 创建分区
- p 打印分区
- q 直接退出
- t 调整分区类型
- w 保存
parted命令
格式:parted 选项 设备名 命令
parted 设备 mklabel gpt…
parted 设备 print
parted 设备 mkpart primary 1 200M
parted 设备 rm 1
注意:parted操作都是实时生效的,小心使用
查看分区
cat /proc/partitions:查看内核是否已经识别新的分区
partx -a:通知内核重新读取硬盘分区表
partprobe:在不重启的情况下重读分区,当出现删除文件后,会出现仍然占用空间的现象。
2. Linux文件系统管理
文件系统基础知识
- Linux文件系统:ext2、ext3、ext、xfs、btrfs、reiserfs、jfs、swap(交换分区)、iso9660(光盘)
- Windows文件系统:fat、ntfs
- Unix文件系统:FFS、UFS、JFS2
- 网络文件系统:NFS、CIFS、ISCSI
- 集群文件系统:GFS2、OCFS2
- 分布式文件系统:ceph
根据是否支持日志分类
- 日志型文件系统:ext3,ext4,xfs
- 非日志型文件系统:ext2,vfat
根据文件系统的组成部分分类
- 内核中的模块:ext4,xfs,vfat
- 用户空间的管理工具:mkfs、ext4、xfs、mkfs、vfat
- linux的虚拟文件系统:VFS
文件系统管理命令
①mkfs命令:格式化磁盘分区(为分区指定文件系统)
用法:mkfs.FS_TYPE
FS_TYPE:文件类型
mkfs.btrfs mkfs.cramfs
mkfs.ext2 mkfs.ext3 mkfs.ext4
mkfs.minix mkfs.xfs
-t:设置卷标
②mke2fs命令:ext系列文件系统专用管理命令
- -t:ext2、ext3、ext4
- -b:1024、2048、4096
- -L:卷标
- -j:相当于-t ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
- -I:为数据空间中每多少个字节创建inode,此大小不应该小于block的大小
- -N:为数据空间创建多少个inod结点
- -m:为管理人员预留的空间占据百分比
- -o:启用指定特性
mkswap命令
swap分区:通常称为交换分区,是一块特殊的磁盘空间。当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。
案例1:创建swap分区
- 第一步:新建磁盘分区
fdisk /dev/sdb
partprobe
- 第二步:格式化swap分区
mkswap /dev/sdb3
- 第三步:启用swap分区(关闭是swapoff)
swapon /dev/sdb3
- 第四步:查看swap分区信息
free -h
文件系统挂载
挂载:将一个设备(通常是存储设备)挂载到一个已经存在的目录上。我们要访问存储设备的文件,必须将文件所在的分区挂载到一个已经存在的目录,然后通过那个目录来访问存储设备。
挂载点下面的所有原文件在挂载后都会完成临时隐藏
解除此关联关系的过程:卸载,umount
mount命令
使用方法:
mount 选项 设备(指明要挂载的设备) 挂载点(事先存在,建议使用空目录)
常用参数:
- -t:指定要挂载的设备上的文件系统
- -r:以只读的方式挂载
- -w:以读写的方式挂载
- -n:不更新/etc/mtab
- -L:以卷标指定挂载设备
- -U:以UUID指定挂载设备
- -B:捆绑目录到另一个目录上
- -a:自动挂载所有支持自动挂载的设备(定义在/etc/fstab文件)
blkid可查看UUID
修改/etc/fstab文件实现永久挂载
umount命令
使用方法:
umount 设备名(卸载不掉正在使用的磁盘)
umount -a:卸载所有挂载的设备(卸载不掉正在使用的磁盘)
案例2:永久挂载/dev/sdb1
- 第一步:使用blkid查看uuid
blkid (磁盘):不指定磁盘则显示所有
blkid /dev/sdb1
- 第二步:将挂载信息写到/etc/fstab上
vim /etc/fstab
UUID="e7e56e3a-d86f-46c9-9cf0-b29668105754" /mnt xfs defaults 0 0
UUID 挂载点 文件系统 参数 能否被dump备份命令作用 是否检验扇区
- 第三步:挂载
mount -a
- 第四步:查看挂载是否成功
df -Th
案例3:创建并使用一块分区地完整步骤
- 第一步:在虚拟机中添加一块硬盘
- 第二步:使用fdisk命令创建分区,改变分区的类型(默认Linux文件)
fdisk /dev/sdc
- 第三步:使用分区管理软件进行分区文件系统格式化(mkfs.等)
mkfs.xfs /dev/sdc
- 第四步:挂载到指定挂载点
mount -a
- 第五步:验证
df -Th
相关命令
free命令:查看内存的相关信息
- -m:以mb为单位
- -g:以gb为单位
- -h:以符合人类阅读习惯的方式显示单位
df命令:查看文件系统占用信息
- -h:以符合人类阅读习惯的方式显示单位
- -i:以inode代替block
- -T:打印文件系统类型
du命令:查看目录总体空间占用状态
- -h:以符合人类阅读习惯的方式显示单位
- -s:进行汇总
dd命令:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
使用方法:
dd if=/path/from/src of=/path/to/dest
- bs:复制单元大小
- count:复制多少个bs
磁盘拷贝
dd if=/dev/sdb1 of=/dev/sda1
备份MBR(Master Boot Record, 硬盘的主引导记录)
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
两个特殊设备
吐零机:可以不断向外输出0
/dev/zero
垃圾桶:可以吞噬一切数据
/dev/null
面试题
Buff(Buffer)和Cache的区别
-
Buffer:
- 缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据
- buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。
- buffer将数据缓冲下来,解决速度慢和快的交接问题;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。
- 例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。
-
Cache:
- 缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器。
因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能
- cache实现数据的重复使用,速度慢的设备需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。
- Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能
CPU ===> 内存 ===>磁盘 (buffer)
CPU <=== 内存 <===磁盘 (cache)
buffer和cache的特点
- 相同点:
- 都属于内存,数据都是临时的,关机数据都会丢失
- 不同点:
- buffer是要写入数据;cache是已读取数据
- buffer数据丢失会影响数据完整性,源数据不受影响;cache数据丢失不会影响数据完整性,但会影响性能。
- 一般来说cache越大,性能越好,超过一定程度,导致命中率太低之后才会越大性能越低;buffer来说,空间越大性能影响不大,够用就行
- cache过小,或者没有cache,不影响程序逻辑(高并发cache过小或者丢失导致系统忙死除外);buffer过小有时候会影响程序逻辑,如导致网络丢包。
- cache可以做到应用透明,编写应用的可以不用管是否有cache,可以在应用做好之后再上cache,当然开发者显式使用cache也行。buffer需要编写应用的人设计,是程序的一部分。