本篇讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬盘等辅助存储器中。硬盘一般容量较大,为了便于管理和使用,可以将硬盘分成一到多个逻辑磁盘,称为分区;为使分区中的文件组织成操作系统能够处理的形式,需要对分区进行格式化(创建文件系统);在linux中,对于格式化后的分区,还必须经过挂载(可简单理解为将分区关联至linux目录树中某个已知目录)之后才能使用。
df 显示文件系统磁盘空间使用量
1 | [root@centos7 temp]# df -h |
选项-h作用是转换数字的显示单位(默认为KB)。
显示信息文件系统列下面带tmpfs字样的是虚拟内存文件系统(此处不做展开)。
文件系统/dev/mapper/centos-root的挂载点是/(根目录),即通常所说的根分区(或根文件系统);/dev/sda1(boot分区)中保存了内核映像和一些启动时需要的辅助文件;另外,还对用户家目录单独做了分区(/dev/mapper/centos-home)。
在linux中还可以做一个特殊的分区:swap分区(交换分区)。作用是:当系统的物理内存不够用时,会将物理内存中一部分暂时不使用的数据交换至swap分区中,当需要使用这些数据时,再从swap空间交换回内存空间。swap在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间。但由于硬盘的速度远远低于内存,使swap只能作为物理内存的辅助。通常swap空间的大小是实际物理内存大小的1到2倍。使用命令free可以查看swap空间的大小。
选项-i显示inode信息
1 | [root@centos7 tmp]# df -i |
这里显示的数字是该文件系统中inode数量的使用情况。
fdisk 磁盘分区工具
1 | fdisk [options] [device...] |
选项-l表示列出分区表
1 | [root@centos7 tmp]# fdisk -l /dev/sda |
当前机械硬盘中包含一到多个固定在主轴(spindle)上的盘片(platter),盘片由硬质磁性合金材料构成。每张盘片有上下两个表面,每个表面都包含数量巨大的扇区(sector),扇区是大小为512 byte的区块,这些区块均匀的分布于盘片的同心圆上,这些同心圆被称为磁道(track)。上千个磁道的宽度相当于人类头发的直径。
硬盘中使用固定于磁臂(disk arm)顶端的磁头(disk head 上下两面均有)读写盘面中的数据。硬盘不工作时,磁头停留在启停区(盘片上靠近主轴的区域);启停区外是数据区,盘片最外围磁道称为0磁道;硬盘启动后,盘片会围绕主轴高速旋转,盘片旋转产生的气流相当强,足以使磁头托起,并与盘面保持一个微小的距离(大概相当于人类头发直径的千分之一)。磁臂摆动,可以将磁头移动至任意磁道上方。
当前硬盘转速大概在7200转/分钟到15000转/分钟左右。假设硬盘转速是10000转/分钟,则意味着,转一圈需要的时间是6ms。
所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),系统将数据存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最上方0磁头最外围0磁道第一个扇区开始写入,写满一个磁道之后,接着在同一柱面的下一个磁头继续写入。同一个柱面都写满之后才推进到内层的下一个柱面。
fdisk命令中device通常是/dev/hda、/dev/hdb….(IDE接口类型的硬盘设备名)或/dev/sda、/dev/sdb….(SCSI接口类型硬盘设备名),表示整个硬盘,如果硬盘被分区,则在设备名后追加一个数字表示此设备的第几个分区。如上例中的/dev/sda1和/dev/sda2
硬盘磁头存取数据是以扇区(512bytes)为单位的(上例中Start和End列),但操作系统存取数据是以块(Block)为单位的(注意:这里说的Block的大小不同于fdisk命令输出中的Blocks列,fdisk命令输出中Blocks列的大小为1024 bytes);扇区是硬件级别的,Block是文件系统级别的,也就是说在创建文件系统(格式化)的时候才决定一个block的大小、数量。一个块的大小是一个扇区大小2的n次方倍,本例文件系统Block的默认大小为4096 bytes(格式化时可以指定为其他值)。
我们在252这台机器上新添加三块硬盘(每块200GB)1
2
3
4
5
6
7
8
9[root@idc-v-71252 ~]# ls -l /dev/sd[a-d]*
brw-rw---- 1 root disk 8, 0 12月 13 09:49 /dev/sda
brw-rw---- 1 root disk 8, 1 12月 13 09:49 /dev/sda1
brw-rw---- 1 root disk 8, 2 12月 13 09:49 /dev/sda2
brw-rw---- 1 root disk 8, 16 12月 13 09:49 /dev/sdb
brw-rw---- 1 root disk 8, 32 12月 13 09:49 /dev/sdc
brw-rw---- 1 root disk 8, 48 12月 13 09:49 /dev/sdd
#这里看到除了原有被分过区的sda外,多出了设备sdb、sdc、sdd
#这里的第五列由逗号分隔的两个数字组成,它们是内核用来识别具体设备的标识号
下面使用fdisk命令对新磁盘进行分区
1 | [root@idc-v-71252 ~]# fdisk /dev/sdb |
在提示符后输入m获取帮助信息(列出了在提示符后可使用的命令及其解释)
1 | 命令(输入 m 获取帮助):m |
命令n表示创建一个新分区
1 | 命令(输入 m 获取帮助):n |
此处可选项有两个,p表示主分区(primary),e表示扩展分区(extended),默认为主分区。
每块硬盘分区后,位于0磁头0柱面1扇区的是一个特殊区域,称为MBR(Main Boot Record 主引导记录区),其中前446字节是Bootloader(引导加载程序),之后的64字节是DPT(Disk Partition Table 硬盘分区表),最后两个字节的Magic Number(硬盘有效标志)。
DPT中记录了此块硬盘有哪些分区,由于其大小的限制,使得分区表只能包含4条记录,可以是一到四个主分区或一个扩展分区和一到三个主分区。其中扩展分区可以再分区,称为逻辑分区。
我们选择默认的主分区:
1 | Select (default p): |
每一步骤都有相应提示,可以被使用的扇区从2048号开始(前面的扇区包括MBR用做其他用途),分区结束扇区的指定可以是扇区号,也可以是+size这样的格式。这里我们指定分区大小为100G
使用p命令打印分区信息:1
2
3
4
5
6
7
8
9
10
11
12
13命令(输入 m 获取帮助):p
磁盘 /dev/sdb:214.7 GB, 214748364800 字节,419430400 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc41dfd92
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 209717247 104857600 83 Linux
命令(输入 m 获取帮助):
注意这里的显示的不同,Boot列如果有*标志,表示此分区为boot分区。Id列表示分区类型,可以使用命令l列出所有支持的类型,其中82表示linux swap,83表示linux默认分区类型,8e表示linux lvm(后述)。
然后我们将信息保存:1
2
3
4
5
6命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@idc-v-71252 ~]#
mkfs 创建文件系统
选项-t可以指定文件系统类型(包括ext3 ext4 btrfs xfs reiserfs等)
1 | [root@idc-v-71252 ~]# mkfs -t ext4 /dev/sdb1 #或者直接执行 mkfs.ext4 /dev/sdb1 |
这样,我们就把刚刚分的区格式化成了ext4文件系统,输出信息中显示了inode和block数量等信息。
mount 挂载文件系统
将格式化好的文件系统挂载至/root/temp/tmp
1 | [root@idc-v-71252 tmp]# mount /dev/sdb1 /root/temp/tmp |
可以看到新分区已经可以使用了,在格式化时,系统会将磁盘上一定空间(此处是5%)保留做其他用途,可以使用命令dumpe2fs /dev/sdb1 2>/dev/null|grep ‘Reserved block count’查看保留块数量。
这样挂载的分区只是临时有效,当系统重启时,并不会自动挂载该分区。如需要永久生效,可以将分区信息写入分区配置文件/etc/fstab1
2
3
4
5
6
7
8
9
10
11
12
13[root@idc-v-71252 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jan 15 00:59:59 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=10205c20-bd44-4991-8c84-7b38db63a581 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
此文件中记录了原有分区及其挂载信息,#开头的行为注释行,其余行被分为6列:
第一列表示文件系统
第二列是挂载点
第三列为文件系统类型
第四列为选项
第五列表示是否对该文件系统使用dump工具备份,0表示不备份
第六列表示是否使用fsck工具对该文件系统做定时检查,0表示不检查
在文件中追加如下信息后,系统重启时新分区也会被自动挂载:
1 | /dev/sdb1 /root/temp/tmp ext4 defaults 0 0 |
在使用mount命令挂载时,可以使用选项-o options指定挂载选项(/etc/fstab中第四列)
如对已挂载的新分区重新以只读方式挂载:1
2
3
4
5[root@idc-v-71252 home]# mount -o remount,ro /dev/sdb1
[root@idc-v-71252 home]# cd /root/temp/tmp
[root@idc-v-71252 tmp]# touch 1
touch: 无法创建"1": 只读文件系统
[root@idc-v-71252 tmp]#
此时再在目录/root/temp/tmp中创建文件时显示报错:只读文件系统1
2
3
4
5[root@idc-v-71252 tmp]# mount -o remount,rw /dev/sdb1
[root@idc-v-71252 tmp]# touch 2
[root@idc-v-71252 tmp]# ls
2 lost+found
[root@idc-v-71252 tmp]# 重新以读写方式挂载后可以创建文件
配置文件中的defaults指的是选项:rw, suid, dev, exec, auto, nouser, 和 async. 它们的意思请查看mount的man手册
选项-a表示读取配置文件中所有记录并重新挂载
选项-B或–bind可以使一个目录挂载至另一个目录1
2
3
4
5
6
7
8
9[root@idc-v-71252 tmp]# ls -l /opt/
总用量 0
[root@idc-v-71252 tmp]#
[root@idc-v-71252 tmp]# mount --bind /root/temp/tmp /opt
[root@idc-v-71252 tmp]# ls /opt -l
总用量 16
-rw-r--r-- 1 root root 0 12月 13 14:44 2
drwx------ 2 root root 16384 12月 13 12:54 lost+found
[root@idc-v-71252 tmp]#
这样挂载的目录使用df命令并不能查看到,可以使用mount命令查看
1 | [root@idc-v-71252 tmp]# mount | grep /dev/sdb1 |
选项-t表示指定文件系统类型,如挂载光盘:
1 | [root@centos7 tmp]# mount -t iso9660 /dev/cdrom /mnt |
umount 卸载文件系统
卸载时既可以指定设备名也可以指定挂载点,当文件系统内有进程正在使用某文件时,卸载会报错:1
2
3
4
5[root@idc-v-71252 ~]# umount /root/temp/tmp
umount: /root/temp/tmp:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
[root@idc-v-71252 ~]#
此时可使用lsof或fuser找出进程(见这里),停止该进程之后再卸载即可。
如果是卸载光盘还可以用eject命令1
[root@centos7 tmp]# eject
fsck 检查并修复文件系统
可以使用fsck命令检查分区是否正常,需要在卸载的状态检查
1 | [root@idc-v-71252 temp]# umount /dev/sdb1 |
直接执行命令时,如果检测到受损,会有交互式提示询问是否进行修复坏块
选项-a表示不询问直接修复
选项-y表示总是对交互式询问输入yes
mkswap 创建swap分区
linux的swap分区可以用磁盘分区做,也可以用文件做,当前系统的swap使用的是分区。下面举一个使用文件创建swap分区的例子
首先使用命令dd生成一个大小为8G的文件1
2
3
4
5
6
7
8
9
10
11
12[root@idc-v-71252 tmp]# dd if=/dev/zero of=swapfile bs=1024K count=8192
记录了8192+0 的读入
记录了8192+0 的写出
8589934592字节(8.6 GB)已复制,35.1683 秒,244 MB/秒
[root@idc-v-71252 tmp]#
#命令会在当前目录下创建一个文件swapfile
#if表示指定读取的文件或设备
#of表示指定写入的文件或设备
#bs表示一次读出或写入的大小
#count表示读出或写入次数
[root@idc-v-71252 tmp]# du -sh swapfile
8.0G swapfile
创建swap分区
1 | [root@idc-v-71252 tmp]# mkswap swapfile |
swapon/swapoff 启用/停用swap文件或设备
1 | [root@idc-v-71252 tmp]# swapon swapfile |
parted 磁盘分区工具
前面所述的MBR中的分区表不支持大于2TB以上的分区,为了解决这一限制和MBR的其它不足,出现了GTP(全局唯一标识分区表 GUID Partition Table),是一种磁盘的分区表的结构布局的标准,属于UEFI(统一可扩展固件接口)标准的一部分。需要使用命令parted划分支持GTP的分区(可兼容MBR分区)。
直接使用命令parted时会进入交互界面
1 | [root@idc-v-71252 ~]# parted /dev/sdb |
可以在提示符后输入help显示可用命令列表(命令可简写)
命令print(简写p)表示打印分区表
1 | (parted) p |
命令quit表示退出交互界面
选项-s表示非交互模式,此时命令写在后面
1 | [root@idc-v-71252 ~]# parted -s /dev/sdb print |
Partition Table后的msdos表示为MBR分区,之所以两个命令中sdb1分区大小显示为107G而不是100G是因为在进行计算时使用1000 bytes作为1KB计数。
不能在已经做MBR分区的硬盘上做GTP分区,重做会导致原有分区被格式化。
这里在新磁盘/dev/sdc上做GTP分区:
1 | [root@idc-v-71252 ~]# parted /dev/sdc |
注意交互模式与fdisk命令不同,parted的命令一旦按回车确认,命令就马上执行,对磁盘的更改就立即生效。
命令mklabel指定分区格式(msdos或gtp),如果格式未知,使用print命令时会报错:错误: /dev/sdc: unrecognised disk label
1 | (parted) mklabel gpt |
命令mkpart表示创建新分区,后面接分区类型(主分区还是扩展分区)、文件系统类型(ext4等,可省略)、起始点、结束点。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16(parted) mkpart primary 0KB 100GB
警告: You requested a partition from 0.00B to 100GB (sectors 0..195312500).
The closest location we can manage is 17.4kB to 100GB (sectors 34..195312500).
Is this still acceptable to you?
是/Yes/否/No? yes
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? ignore
(parted) p
Model: VMware Virtual disk (scsi)
Disk /dev/sdc: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 17.4kB 100GB 100GB primary
命令rm表示删除分区,后面接分区号
1 | (parted) rm 1 |
下面使用非交互模式继续
1 | [root@idc-v-71252 ~]# parted -s /dev/sdc mkpart primary ext4 18KB 100GB |
这里使用1000 bytes作为1KB计数
格式化并挂载(部分输出略)1
2
3
4
5
6
7
8[root@idc-v-71252 temp]# mkfs.ext4 /dev/sdc1
[root@idc-v-71252 temp]# mount /dev/sdc1 /root/temp/tmp_1
[root@idc-v-71252 temp]# df -h|grep ^/dev
/dev/mapper/centos-root 49G 22G 27G 44% /
/dev/sda1 497M 170M 328M 35% /boot
/dev/mapper/centos-home 24G 16G 7.6G 68% /home
/dev/sdb1 99G 61M 94G 1% /root/temp/tmp
/dev/sdc1 92G 61M 87G 1% /root/temp/tmp_1
最后再用parted做一个MBR扩展分区,命令如下:
1 | parted -s /dev/sdd mklabel msdos |
结果显示为:
1 | [root@idc-v-71252 temp]# parted -s /dev/sdd print |
格式化及挂载(省略部分输出)
1 | [root@idc-v-71252 temp]# mkfs.ext4 /dev/sdd5 |
这些新分区都可以写入配置文件/etc/fstab中实现重启后自动挂载
LVM 逻辑卷管理
术语
物理存储介质(The physical media):指的是系统的存储设备,如上面制作的分区/dev/sdb1、/dev/sdc1、/dev/sdd5
物理卷(PV: Physical Volume):相当于物理存储介质,但添加了与LVM相关的管理参数。
卷组(VG: Volume Group):由一个或多个物理卷组成。
逻辑卷(LV: Logical Volume):在卷组的基础上划分的逻辑分区(文件系统)。
PE(physical extent):每一个物理卷被划分为称为PE的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
LE(logical extent):逻辑卷也被划分为被称为LE的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应
步骤
1、创建分区
可以使用fdisk或parted进行分区,和前面举例中的区别仅仅是分区类型要选8e。这里将三块新硬盘的剩余空间做成LVM分区,parted方式(仅举一例,其余略):1
2parted -s /dev/sdb mkpart primary 107GB 100%
parted -s /dev/sdb toggle 2 lvm #表示将第二个分区定义为lvm类型(8e)
2、 创建PV1
2
3
4
5
6
7
8
9
10
11
12[root@idc-v-71252 ~]# pvcreate /dev/sd[bcd]2
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdc2" successfully created
Physical volume "/dev/sdd2" successfully created
[root@idc-v-71252 ~]#
#查看
[root@idc-v-71252 ~]# pvscan
PV /dev/sda2 VG centos lvm2 [79.51 GiB / 64.00 MiB free]
PV /dev/sdb2 lvm2 [100.00 GiB]
PV /dev/sdc2 lvm2 [106.87 GiB]
PV /dev/sdd2 lvm2 [93.13 GiB]
Total: 4 [379.50 GiB] / in use: 1 [79.51 GiB] / in no VG: 3 [300.00 GiB]
3、 创建VG1
2
3
4
5
6
7
8[root@idc-v-71252 ~]# vgcreate -s 8M test_lvm /dev/sd[bcd]2
Volume group "test_lvm" successfully created
#这里使用选项-s指定PE大小为8M,卷组起名为test_lvm
#查看
[root@idc-v-71252 ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "centos" using metadata type lvm2
Found volume group "test_lvm" using metadata type lvm2
4、创建LV
1 | [root@idc-v-71252 ~]# lvcreate -n test_1 -L 50G test_lvm |
5、格式化及挂载
1 | #在这里进行格式化,第一步分区之后并不需要格式化。 |
这里文件系统之所以显示为/dev/mapper/….是因为内核利用Mapper Device机制将设备做了映射:1
2
3
4[root@idc-v-71252 ~]# ls -l /dev/mapper/test_lvm-test_1
lrwxrwxrwx 1 root root 7 12月 14 09:58 /dev/mapper/test_lvm-test_1 -> ../dm-3
[root@idc-v-71252 ~]# ls -l /dev/test_lvm/test_1
lrwxrwxrwx 1 root root 7 12月 14 09:58 /dev/test_lvm/test_1 -> ../dm-3
实际上/dev/test_lvm/test_1和/dev/mapper/test_lvm-test_1指向了同一个设备/dev/dm-3(在配置文件/etc/fstab中写任意一种都可以),这里就不对映射机制做详细展开了。
命令
前面举例中说到了几个创建和查看命令,除此之外,LVM还有一系列的命令,它们都以pv/vg/lv开头,所起的作用大多是增加、删除、扩充、缩减、查看、改变等等。
创建命令1
pvcreate vgcreate lvcreate
查看命令分三类,显示信息侧重或详细程度不同:1
2
3pvs pvscan pvdisplay
vgs vgscan vgdisplay
lvs lvscan lvdisplay
改变属性(分别改变本层次上对象的属性)1
pvchange vgchange lvchange
扩容1
vgextend lvextend
缩减(慎用)1
vgreduce lvreduce
改名1
vgrename lvrename