Linux文件系统和磁盘管理
磁盘管理方案
目前主要有两种磁盘管理的方案
-
MBR管理方案:
主引导记录(Master Boot Record , MBR)是指一个存储设备的开头 512 字节。它包含操作系统的引导器和存储设备的分区表。在MBR解决方案中由于分区表的大小限制导致只能有四个主分区或者三个主分区加一个扩展分区 (以及在扩展分区中的任意数量的逻辑分区)。如果你有三个主分区加一个扩展分区以及除此之外的空闲空间,在空闲空间之上你无法创立分区,传统的linux磁盘管理方案里都是以MBR为主。
-
GPT管理方案:
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准,是新一代的分区表格式。它是统一可扩展固件接口标准的一部分,它使用全局唯一标识来标识设备。GPT为每个分区提供了一个唯一硬盘 GUID 和一个唯一分区 GUID - 一个好的不依赖文件系统的引用分区和硬盘的方式。他可以任意分区数,取决于给分区表分配的空间,不需要扩展和逻辑分区。GPT ,默认包含了定义128个分区的空间。当用户想要更多分区时,他可以给分区表分配更多空间 (目前只有 gdisk 支持这一特性)。
-
选择管理方式注意事项:
如果使用GRUB legacy作为bootloader,必须使用MBR。
如果使用 UEFI 而不是BIOS,并且双启动中包含 Windows 64位版,必须使用GPT。
非常老的机器需要使用 MBR,因为 BIOS 可能不支持 GPT。
磁盘管理的指令
-
fdisk:用于显示硬盘使用情况、执行分区操作等,适用于MBR管理方案
常用指令: a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition # 删除一个分区 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) 注意:创建逻辑分区前必须创建扩展分区,且扩展分区不能直接投入使用。
-
gdisk:适用于GPT管理方案
常用指令: b back up GPT data to a file c change a partition's name # 修改分区表名称 d delete a partition # 删除分区 i show detailed information on a partition l list known partition types n add a new partition # 添加分区 o create a new empty GUID partition table (GPT) p print the partition table # 显示当前分区情况 q quit without saving changes #不保存退出 r recovery and transformation options (experts only) s sort partitions t change a partition's type code v verify disk w write table to disk and exit # 保存退出 x extra functionality (experts only) ? print this menu
文件系统
操作系统中负责管理和存储文件信息的部分称为文件管理系统,简称文件系统。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。大部分UNIX文件系统种类具有类似的通用结构,即使细节有些变化。
核心概念:
- 超级块superblock:超级块包括文件系统的总体信息,比如大小(其准确信息依赖文件系统)
- inode:inode包括除了名字外的一个文件的所有信息,名字与inode数目一起存在目录块中,目录条目包括文件名和文件的inode数目。inode包括几个数据块的数目,用于存储文件的数据。inode中只有少量数据块数的空间,如果需要更多,会动态分配指向数据块的指针空间。这些动态分配的块是间接块;为了找到数据块,这名字指出它必须先找到间接块的号码。
- 数据块data block:实际存放数据的位置。
- 目录块directory block,和间接块indirection block
常用指令:du,df,mkfs,fsck,mount,umount,blkid
涉及文件:/etc/fstab 记录开机自动挂载信息
du和df用法:
[root@rhel6 ~]# df -h # 查看磁盘空间情况
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_rhel6-LogVol01 17G 3.0G 13G 19% /
tmpfs 499M 72K 499M 1% /dev/shm
/dev/vda1 477M 58M 390M 13% /boot
/dev/mapper/vg_rhel6-LogVol00 380M 2.3M 354M 1% /home
[root@servera ipython-0.13.1]# df -i # 查看inode使用情况
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 10484096 41152 10442944 1% /
devtmpfs 58324 293 58031 1% /dev
tmpfs 62628 1 62627 1% /dev/shm
tmpfs 62628 319 62309 1% /run
tmpfs 62628 13 62615 1% /sys/fs/cgroup
172.25.254.250:/content 117569536 149932 117419604 1% /mnt
[root@rhel6 ~]# du -sh /var/ # 统计文件或目录实际占用空间情况,-s 代表求和
138M
mkfs用法:
[root@rhel7 ~]# mkfs.xfs /dev/vdb1 # 用以对磁盘或分区创建文件系统(格式化)
meta-data=/dev/vdb1 isize=256 agcount=4, agsize=655296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=2621184, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
mount用法:
mount [-fnrsvw] [-t vfstype] [-o options] device dir # 提供给磁盘设备文件一个入口的目录
举例:
[root@rhel7 ~]# mount -t xfs /dev/vdb1 /test # 标准用法
[root@rhel7 ~]# mount -o ro,remount /dev/vdb1 /test # 以ro的方式重新挂载,默认rw
[root@rhel7 ~]# mount -o loop rhel-server-6.5-x86_64-dvd.iso /test # 以本地回环设备挂接特殊文件
[root@rhel7 ~]# mount # 用来查看当前挂接情况
/dev/mapper/vg_rhel7-LogVol01 on / type xfs (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/vda1 on /boot type ext4 (rw)
/dev/mapper/vg_rhel6-LogVol00 on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
umount用法:
umount [-dflnrv] {dir|device}... # 取消目录和设备文件的对应关系
[root@rhel7 ~]# umount /test
blkid用法:
blkid -p [-O offset] [-o format] [-S size] [-s tag] [-n list] [-u list] device ... # 用以显示文件系统信息
[root@servera ipython-0.13.1]# blkid /dev/vda1
/dev/vda1: UUID="e2a34bd8-5f19-4dae-ad8b-e98560bffbac" TYPE="xfs"
/etc/fstab文件管理方法:
写在该文件中的挂接信息会在服务器开启时自动完成。
[root@foundation0 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Jul 23 20:30:13 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=6039c222-d258-419f-b309-25b48a9b47c7 / xfs defaults 0 0
# 设备 挂载点 文件系统类型 选项 是否备份 是否检测
UUID=c6feca1f-487b-4740-be24-3d8414fa1483 swap swap defaults 0 0
/content/rhel7.2/x86_64/isos/rhel-server-7.2-x86_64-dvd.iso /content/rhel7.2/x86_64/dvd iso9660 loop,ro 0 0
/content/rhel7.1/x86_64/isos/rhel-server-7.1-x86_64-dvd.iso /content/rhel7.1/x86_64/dvd iso9660 loop,ro 0 0
/content/rhel6.5/x86_64/isos/rhel-server-6.5-x86_64-dvd.iso /content/rhel6.5/x86_64/dvd iso9660 loop,ro 0 0
/content/rhel7.0/x86_64/isos/rhel-server-7.0-x86_64-dvd.iso /content/rhel7.0/x86_64/dvd iso9660 loop,ro 0 0
lvm管理方案
逻辑卷管理器则是在磁盘分区与文件系统之间添加的逻辑层,提供一个抽象的卷组,使得管理者可以忽略底层磁盘布局,从而实现对分区的灵活动态调整,目前建议启用 LVM(Logical Volume Manager) 机制。
关键词:
- 物理卷(PV,Physical Volume ):整个硬盘设备或使用 fdisk 命令建立的硬盘分区。
- 卷组(VG,Volume Group ) :由一个或多个物理卷(PV)组成的整体
- 逻辑卷(LV,Logical Volume ):;从卷组(VG)出切割出的空间来用于创建文件系统,大小由 PE 的个数决定。
常用指令
指令 | 含义 |
---|---|
pvcreate | 创建物理卷 |
pvremove | 删除物理卷 |
vgcreate | 创建卷组 |
vgextend | 扩展卷组 |
vgreduce | 缩小卷组 |
vgremove | 删除卷组 |
lvcreate | 创建逻辑卷 |
lvextend | 扩展逻辑卷 |
lvreduce | 缩小逻辑卷 |
lvremove | 删除逻辑卷 |
pvmove | 迁移pv的数据 |
pvs | pvdisplay | 查看pv状态 |
vgs | vgdisplay | 查看vg状态 |
lvs | lvsdisplay | 查看lv状态 |
举例:
[root@iscsi1-f15 ~]# fdisk /dev/vdb --->vdb[123] 100M
[root@iscsi1-f15 ~]# pvcreate /dev/vdb[123]
[root@iscsi1-f15 ~]# vgcreate myvg /dev/vdb[123]
[root@iscsi1-f15 ~]# lvcreate -L 20M myvg -n lv1-linear
[root@iscsi1-f15 ~]# lvcreate -L 60M myvg -n lv2-linear
[root@iscsi1-f15 ~]# mkfs.ext4 /dev/myvg/lv1-linear
[root@iscsi1-f15 ~]# mkfs.ext4 /dev/myvg/lv2-linear
[root@iscsi1-f15 ~]# mount /dev/myvg/lv1-linear /opt/lv1
[root@iscsi1-f15 ~]# mount /dev/myvg/lv2-linear /opt/lv2
[root@iscsi1-f15 ~]# lvextend -L +60M /dev/myvg/lv1-linear
[root@iscsi1-f15 ~]# lvextend -L +30M /dev/myvg/lv2-linear
[root@iscsi1-f15 ~]# resize2fs /dev/myvg/lv1-linear
[root@iscsi1-f15 ~]# resize2fs /dev/myvg/lv2-linear
[root@iscsi1-f15 ~]# pvcreate /dev/vdb[45]
[root@iscsi1-f15 ~]# vgextend myvg /dev/vdb[45]
[root@iscsi1-f15 ~]# pvmove /dev/vdb1 /dev/vdb4
[root@iscsi1-f15 ~]# pvmove /dev/vdb2 /dev/vdb4
[root@iscsi1-f15 ~]# pvmove /dev/vdb4 /dev/vdb5
[root@iscsi1-f15 ~]# dmsetup table|grep myvg
lvm故障案例
故障描述:
在云上需要扩展磁盘,由于云系统支持原盘扩容,原来1T的磁盘直接扩展成2T。原环境中整盘做成pv,执行fdisk的时候识别到了2T,但是pv依旧为1T,如何扩容lvm。
解决方法
pvresize $PVNAME # 让pv重新识别磁盘
LVM实战案例:
使用LVM 的Snapshot功能实现备份:
构建步骤:
# 根据当前的LVM构建Snapshot
lvcreate -L 1G -n lv-data-backup -s /dev/mapper/vgtest-lvtest
# 将snapshot后的设备挂载起来
mount -o nouuid /dev/vgtest/lv-data-backup /lvbackup/
# 针对该目录进行压缩备份操作
tar -czf /tmp/test.tgz /lvbackup
Swap使用
作用:
Swap分区在系统的物理内存不足的时候,把硬盘中的一部分空间释放出来,以供当前运行的程序模拟成内存去使用,通常Swap空间的大小应是物理内存的2倍左右,但根据不同的应用,需采取不同的配置方案。
每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址。
虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址。
如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。
构建swap的方法:
# 将分区构建为swap:mkswap [options] device [size]
# 启用swap:swapon [-d] [-f] [-p priority] [-v] specialfile...
# 停用swap:swapoff [-v] specialfile...