操作系统

Linux系统LVM逻辑卷创建过程以及自动化脚本

Jager · 9月3日 · 2016年 6904次已读

最近在上海新建机房的时候,给了我 2 台 M2 机型服务器,在做初始化的时候发现有一堆磁盘:

[root@Centos64:~]# fdisk -l | grep '300.1 GB' | sort
Disk /dev/sda: 300.1 GB, 300069052416 bytes
Disk /dev/sdb: 300.1 GB, 300069052416 bytes
Disk /dev/sdc: 300.1 GB, 300069052416 bytes
Disk /dev/sdd: 300.1 GB, 300069052416 bytes
Disk /dev/sde: 300.1 GB, 300069052416 bytes
Disk /dev/sdf: 300.1 GB, 300069052416 bytes
Disk /dev/sdg: 300.1 GB, 300069052416 bytes
Disk /dev/sdh: 300.1 GB, 300069052416 bytes
Disk /dev/sdi: 300.1 GB, 300069052416 bytes
Disk /dev/sdj: 300.1 GB, 300069052416 bytes
Disk /dev/sdk: 300.1 GB, 300069052416 bytes
Disk /dev/sdl: 300.1 GB, 300069052416 bytes

其中挂载的只有 /dev/sda,其他都在那闲着。运管那边告诉我这个机型不能做 raid。而根据我这边的业务需求,我并不能一次用到这么多分区,所以必须使用 LVM 合并使用。

关于 LVM 的创建,目前网络上一堆详细教程,用起来也非常简单,这里就只贴一下我的过程。

①、用 fdisk 给每一个磁盘创建一个 8e 分区:

[root@Centos64:~]# fdisk /dev/sdb

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n               #创建
Command action
   e   extended
   p   primary partition (1-4)
p                                     #选择主分区
Partition number (1-4): 1 
First cylinder (1-36481, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-36481, default 36481): #直接回车选择最大
Using default value 36481

Command (m for help): t              #输入 t 进入类型选择
Selected partition 1
Hex code (type L to list codes): 8e  #输入 8e 格式
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w              #w 保存

这样就完成了一块磁盘,接着我们依次将其他 sdc 到 sdl 的磁盘也操作一把。

②、全部完成后,使用 pvcreate 将所有分区转化成物理卷,即添加 LVM 属性信息并划分 PE 存储单元:

[root@Centos64:~]# pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1
  
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdd1" successfully created
  Physical volume "/dev/sde1" successfully created
  Physical volume "/dev/sdf1" successfully created
  Physical volume "/dev/sdg1" successfully created
  Physical volume "/dev/sdh1" successfully created
  Physical volume "/dev/sdi1" successfully created
  Physical volume "/dev/sdj1" successfully created
  Physical volume "/dev/sdk1" successfully created
  Physical volume "/dev/sdl1" successfully created

创建完 PV 之后,就可以使用 pvdisplay 或 pvs 查看详细信息了,篇幅有限,这里我就不贴了。

③、下面我们需要创建一个 VG,然后 PV 都加入到这个卷组当中,卷名可自定义,比如 vg:

[root@Centos64:~]# vgcreate vg /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1 /dev/sdl1
  
    Volume group "vg" successfully created

同样,在创建好 VG 以后,我们也可以使用 vgdisplay 或者 vgs 命来来查看 VG 的信息(略)

④、接着,使用 lvcreate 命令基于 VG 创建逻辑卷,vg 和 lvm 我们自定义的名称:

[root@Centos64:~]# lvcreate -l 100%VG -n lvm vg
  
   Logical volume "lvm" created

同样我们可以使用 lvdisplay 或者 lvs 命令来查看创建好的逻辑卷的信息(略)

⑤、格式化创建的逻辑卷:

[root@Centos64:~]# mkfs.ext4 /dev/vg/lvm 

⑥、挂载分区:

[root@Centos64:~]# mkdir /data
[root@Centos64:~]# echo '/dev/vg/lvm  /data  ext4 noatime,acl,user_xattr  1 2' >> /dev/fstab
[root@Centos64:~]# mount -a
[root@Centos64:~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  2.1G  7.4G  22% /
/dev/sda3              20G  370M   19G   2% /usr/local
tmpfs                  16G     0   16G   0% /dev/shm
/dev/sda4             244G  205M  232G   1% /data1
/dev/mapper/vg-lvm   3.1T  932M  3.0T   1% /data

这样,我们就完成了 LVM 的手工创建过程了,我还有一台 M2 要弄,而且听运管说以后会继续交付这类机型,我可不想这么苦逼的操作了,光那个创建 8e 格式分区就已经很坑了。

所以,就将上面的操作串成脚本,一键完成:

#!/bin/bash
partition=/data                # 定义最终挂载的名称
vgname=vg                      # 定义逻辑卷组的名称
lvname=lvm                     # 定义逻辑卷的名称
code='b c d e f g h i k j l'   # 根据分区的实际情况修改

disk=
for i in $code  
do
fdisk /dev/sd$i << EOF          # 这里自动化完成了所有分区 fdisk 苦逼的交互步骤
n
p
1
1

t
8e
w
EOF
disk="$disk /dev/sd${i}1" # 将所有分区拼起来
done

pvcreate $disk
vgcreate $vgname $disk
lvcreate -l 100%VG -n $lvmname $vgname
mkfs.ext4 /dev/$vgname/$lvmname

mkdir -p $partition
echo "/dev/$vgname/$lvmname  $partition  ext4 noatime,acl,user_xattr  1 2" >> /dev/fstab
mount -a
df -h

哦了,就写这么多,以备后用。

27 条回应
  1. 小萝博客 2016-9-3 · 13:33

    燕过留个爪子

  2. 一曲长歌辞烟雨 2016-9-3 · 18:05

    虽然不太看得懂,但感觉好厉害的样子

  3. 刘明野的博客 2016-9-3 · 19:46

    写的很好,感谢分享

  4. 杨永博客 2016-9-3 · 22:57

    哎呦,不错哦,这个文章底部的 赞赏分享 】一体是怎么弄的啊,有木有插件之类的,求分享,杨永博客欢迎大家回访交流。

  5. Koolight 2016-9-4 · 9:22

    Linux系统感觉和Windows系统的CMD时代好像。

  6. 亿贝娱乐注册 2016-9-4 · 13:12

    以后引用

  7. 购物街 2016-9-5 · 10:16

    谢谢分享

  8. qq群出租180一年 2016-9-5 · 16:13

    有点高大上,还要多学学。

  9. 标准源 2016-9-5 · 17:44

    好复杂,看不懂

  10. 心系与她 2016-9-5 · 17:50

    一般用不到,基本都是机房用,普通的服务器也就挂载以下磁盘就没事了 :evil:

  11. 松松软文代发 2016-9-6 · 8:17

    好深奥的感觉

  12. 被动收入一天600 2016-9-6 · 11:29

    技术大牛~

  13. 365免单网 2016-9-8 · 8:51

    感觉好复杂的样子

  14. 松松软文代发 2016-9-9 · 7:39

    蒙圈儿了

  15. 阳光幼教 2016-9-9 · 16:05

    学习了

  16. 洋得意自媒体 2016-9-9 · 16:56

    感谢分享 欢迎回访

  17. dearbaba 2016-9-10 · 8:20

    你的博客非常不错哦,我的个人网站 http://www.javaxxz.com 相互学习下。

  18. 跨境电商平台 2016-9-12 · 6:52

    非常不错!!!!

  19. 卢松松博客 2016-9-12 · 20:57

    从百度点进来的,支持一下,希望站长您多出一些好文章。

  20. 网盘资源社区 2016-9-18 · 14:58

    有点不大懂是真的,不过还是感谢分享

  21. 赛飞 2016-11-2 · 16:32

    你好,请问for循环上面的disk= 和<<EOF是什么意思?签到成功!签到时间:下午4:20:31 :?: ,每日签到,生活更精彩哦~

    • avatar
      Jager 2016-11-4 · 18:20

      disk= 变量初始化为空

      <<EOF
      这是 Here document 用法
      EOF本意是 End Of File,表明到了文件末尾。
       
      使用格式基本是这样的: 
      命令 << EOF
        内容段
      EOF
      将“内容段”整个作为命令的输入。
      你的代码里就是用cat命令读入整段字符串并赋值给list变量。
      其实,不一定要用EOF,只要是“内容段”中没有出现的字符串,都可以用来替代EOF,只是一个起始和结束的标志罢了。
  22. 户外媒体 2016-11-22 · 15:15

    可以留着以后备用。 :razz:

  23. 胡杨老师 2016-12-2 · 18:51

    留手

  24. 奇迹 2017-4-7 · 11:43

    前面的步骤明白了,但是最后脚本还是不太明白。

  25. 2020-3-18 · 22:28

    echo 写入的是 /etc/fstab 吧。 还有单双引号混用应该是不行的。

    • avatar
      Jager 2020-3-30 · 18:22

      笔误,已修正,多谢反馈。