JunJiang江骏 bio photo

JunJiang江骏

Staff Engineer @ Ant Group. Machine Learning GDE(Google Developer Expert). Focus on machine learning platform and training framework optimization.

Twitter Google+ LinkedIn Instagram Github Weibo

LVM 基础

tags: LVM Linux

Linux 磁盘操作的基本概念和命令

我极力推荐一个系列文章:

linux磁盘管理学习笔记(上) linux磁盘管理学习笔记(中):df命令、du命令 linux磁盘管理学习笔记(下):linux分区、挂载

第一篇文章介绍了磁盘的基本知识;第二篇介绍了两个最常用的命令,df(display free disk space),du(display disk usage statistics);第三篇主要就是介绍最简单的分区工具 fdisk。

我总结一下后两篇的精髓:

df -ha #关键是看懂输出的结果
# Filesystem 表示该文件系统在哪个分区,所以列出设备名称
# 1k-blocks 说明下面数字单位是1kb,可使用-h或-m来改变容量单位
# Used 已使用的硬盘空间
# Available 剩下的磁盘空间大小
# Use% 磁盘用了多少
# Mounted on 挂载点
du -sh [目录名] #查看目录大小
fdisk [-l] [设备名] #要学会不断按'm'看自己需要什么命令
# 另外,要知道光把盘分出来是不够的,还要用 mkfs 之类的命令把盘格式化后,并挂载,才能使用。

LVM 的名词概念

首先推荐一篇文章:点击这里

我其实也是通过这篇文章弄明白了 LVM 里 pv(Physical Volume)、vg(Volume Group) 和 lv(Logical Volumes) 的概念。

简单来说:

  • Physical Volume: 物理卷。就是磁盘上真的分区,磁盘是真的按那样分了区。(用 pvdisplay 查看)
  • Volumn Group: 卷组。就是把多个 PV 加到一个组里,以后把这整个卷当作一个“大硬盘”来使。(用 vgdisplay 查看)
  • Logical Volumn: 逻辑卷。是把上面组合出来的“大硬盘”重新分区,得到一个或多个逻辑卷。(用 lvdisplay 查看)

结合下面这张图,这三个名词的关系瞬间就清晰了:


接下来,我们用两个很实用的应用情景来介绍 LVM 的使用。

情景:将两块硬盘合并成一个大分区

有的时候,我们希望把两块甚至更多的硬盘组成一块大的硬盘来用。

假设从 /dev 里看到,你希望合并的两块硬盘叫 /dev/sdb/dev/sdc,把它们合并成一块叫 KVM 的大硬盘,格式化后,挂载在 /kvm 下使用。

查看硬盘详细信息:

hdparm -i <device>

步骤:

#####1) 创建 Volumn Group 把 /dev/ 里的 sdbsdc 这两块磁盘整合作为一个组,当作一个“大硬盘”,取名为 KVM。

vgcreate KVM /dev/sdb /dev/sdc

如果系统识别出 /dev/sdb 还没有分区,那么会自动帮你把这整块 disk 分为一个区,相当于帮你敲了命令 fdisk /dev/sdb
这时候,我们用 vgdisplay 就可以看到我们刚才创建的这个 Volumn Group 了。

(关于 fdisk 的详细用法,可参考这里

#####2) 创建 lv (logic volumn) 这一步其实是从上面合并出来的这一个组(相当于“大硬盘”)里,选用里面的空间创建出一个逻辑卷。相当于对这个组里的硬盘重新规划(对大硬盘重新分区)。我们这里是希望直接把两块盘当作一块盘,所以要使用整个 Volumn Group 可用空间里的100%。

# 如果是全新的,那么FREE=VG,随便我们用哪一个作为标准
lvcreate -l 100%FREE -n <lvname> <vgname>
# 或
lvcreate -l 100%VG -n <lvname> <vgname>
# 或
# 用vgdisplay查看free的PE数后
lvcreate -l <PE数> -n <lvname> <vgname>

(关于 lvcreate 命令的详细介绍,查阅这里。)

#####3) 创建文件系统 就是把刚才做出来的逻辑卷(logic volumn)(重新分出来的区)格式化成真正能用的文件系统。

mkfs -t ext4 /dev/KVM/<lvname>
  • -t 为格式化成的文件系统type。
  • ext4 优于 ext3,所以首选 ext4。
  • 默认会保留磁盘空间的5%给super-user使用,如果这个文件系统只是给应用使用,可以考虑取消这块特区。用命令:mkfs.ext4 -m 0 /dev/KVM/<lvname> 但这样今后会容易产生磁盘碎片。

#####4) 创建要挂载到的目标目录

mkdir /kvm

#####5) 挂载

mount /dev/KVM/<lvname> /kvm

挂载完后,/kvm 目录下默认是空的,或只有一个 lost+fount 这样的“奇怪”目录。这已经挂载成功了。因为 /dev/KVM/<lvname> 这个文件系统里本来就是空的嘛。 这样,在 /kvm 里的任何文件,实际上就已经是存储到 /dev/KVM/<lvname> 这个逻辑卷(LV)里了。

#####6) 设置开机自动挂载 修改 /etc/fstab 添加:

/dev/mapper/KVM-images /kvm ext4 defaults 0 0

说明:

/dev/device        mountpoint    type     rules     dump      order
文件系统            挂载点         分区类型  挂载选项    dump选项  fsck选项
  • 文件系统(第一列): 要用df命令查出来的名字

  • 挂载选项(第四列): rules 是指挂载时的规则。下面列举几个常用的:
    auto - 开机自动挂载
    default - 按照大多数永久文件系统的缺省值设置挂载定义
    noauto - 开机不自动挂载。(请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是 noauto。)
    nouser - 只有超级用户可以挂载
    ro - 按只读权限挂载
    rw - 按可读可写权限挂载
    user - 任何用户都可以挂载

  • dump选项(第五列): 这一项为0,就表示从不备份。如果上次用 dump 备份,将显示备份至今的天数。

  • fsck选项(最后一列): order 指 fsck(启动时fsck检查的顺序)。为0就表示不检查,/ 分区永远都是1,其它的分区只能从2开始,当数字相同就同时检查(但不能有两1)。

下面是一个 fstab 文件的例子:

#e.g.
/dev/hda2     /           ext3    defaults   0   1
/dev/hda3     swap        swap    defaults   0   0
/dev/hda5     /usr        ext3    defaults   0   0
/dev/fdo      /mnt/flopy  ext3    noauto     0   0
/dev/cdrom    /mnt/cdrom  iso9660 noauto,ro  0   0

情景2:在不影响现有文件系统的前提下给磁盘扩容

考虑到篇幅,把这个情景单独写在一篇文章里:LVM 实战:磁盘扩容


comments powered by Disqus