暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

号外——Liunx增加磁盘不重启服务器的2种方法

IT敢客 2018-10-26
1109

       在昨晚给线上服务器进行磁盘扩容的时候遇到了一个大坑,新增磁盘后发现服务器并没有识别/dev/sdb 出来,折腾了好一会!那么接下来我就结合之前写的文章内容在这里做一个磁盘扩容的总结。

       首先我们介绍一下磁盘扩容的两种方法:

1、在原有硬盘 1 的基础上直接增加空间。

如下图所示,原先的硬盘 1 空间只有 30G 大小,

接下来,我们直接在硬盘 1 上面增加空间,增加到 50G。如下图所示

这时候我们在服务器上执行 fdisk dev/sda 和 df -h 看,发现还是和之前一样,大小没有任何变化还是 30G。这里就不贴图片了,和上面一样。这时候往往之前的操作就是重启服务器 reboot 一下,然后 fdisk -l dev/sda 看会有 50G 空间,但是这里我们往往因为业务需要不能停止服务,更不能停止服务器了。所以这里我们需要按照下面的方法进行操作,不需要重启服务器也不需要重启服务!

方法 1:echo 1 > sys/class/$scsi_device/device/rescan

我们按照如下的方法操作一遍

  1. [root@docker ~]# cd sys/class/scsi_disk/

  2. [root@docker scsi_disk]# ls

  3. 0:0:0:0

  4. [root@docker scsi_disk]# cd 0\:0\:0\:0/

  5. [root@docker 0:0:0:0]# cd device/

  6. [root@docker device]# ls

  7. block           eh_timeout                          generic        power                 scsi_disk     uevent

  8. bsg             evt_capacity_change_reported        iocounterbits  queue_depth           scsi_generic  unpriv_sgio

  9. delete          evt_inquiry_change_reported         iodone_cnt     queue_ramp_up_period  scsi_level    vendor

  10. device_blocked  evt_lun_change_reported             ioerr_cnt      queue_type            state         vpd_pg80

  11. device_busy     evt_media_change                    iorequest_cnt  rescan                subsystem     vpd_pg83

  12. dh_state        evt_mode_parameter_change_reported  modalias       rev                   timeout

  13. driver          evt_soft_threshold_reached          model          scsi_device           type

  14. [root@docker device]# echo '1' > rescan

  15. [root@docker device]# fdisk -l dev/sda

  16.  

  17. 磁盘 /dev/sda53.7 GB, 53687091200 字节,104857600 个扇区

  18. Units = 扇区 of 1 * 512 = 512 bytes

  19. 扇区大小(逻辑/物理):512 字节 / 512 字节

  20. I/O 大小(最小/最佳):512 字节 / 512 字节

  21. 磁盘标签类型:dos

  22. 磁盘标识符:0x000a8551

  23.  

  24.   设备 Boot      Start         End      Blocks   Id  System

  25. /dev/sda1   *        2048      821247      409600   83  Linux

  26. /dev/sda2          821248    62914559    31046656   8e  Linux LVM

这时候我们发现,sda 已经增加到 50G 了。那么接下里需要重新增加一个分区 sda3 出来,将增加的 20G 空间分为 sda3 出来。

  1. [root@docker device]# fdisk /dev/sda

  2. 欢迎使用 fdisk (util-linux 2.23.2)。

  3.  

  4. 更改将停留在内存中,直到您决定将更改写入磁盘。

  5. 使用写入命令前请三思。

  6.  

  7.  

  8. 命令(输入 m 获取帮助):n

  9. Partition type:

  10.   p   primary (2 primary, 0 extended, 2 free)

  11.   e   extended

  12. Select (default p): p

  13. 分区号 (3,4,默认 3):3

  14. 起始 扇区 (62914560-104857599,默认为 62914560):

  15. 将使用默认值 62914560

  16. Last 扇区, +扇区 or +size{K,M,G} (62914560-104857599,默认为 104857599):

  17. 将使用默认值 104857599

  18. 分区 3 已设置为 Linux 类型,大小设为 20 GiB

  19.  

  20. 命令(输入 m 获取帮助):t

  21. 分区号 (1-3,默认 3):3

  22. Hex 代码(输入 L 列出所有代码):8e

  23. 已将分区“Linux”的类型更改为“Linux LVM

  24.  

  25. 命令(输入 m 获取帮助):p

  26.  

  27. 磁盘 /dev/sda53.7 GB, 53687091200 字节,104857600 个扇区

  28. Units = 扇区 of 1 * 512 = 512 bytes

  29. 扇区大小(逻辑/物理):512 字节 / 512 字节

  30. I/O 大小(最小/最佳):512 字节 / 512 字节

  31. 磁盘标签类型:dos

  32. 磁盘标识符:0x000a8551

  33.  

  34.   设备 Boot      Start         End      Blocks   Id  System

  35. /dev/sda1   *        2048      821247      409600   83  Linux

  36. /dev/sda2          821248    62914559    31046656   8e  Linux LVM

  37. /dev/sda3        62914560   104857599    20971520   8e  Linux LVM

  38.  

  39. 命令(输入 m 获取帮助):w

  40. The partition table has been altered!

  41.  

  42. Calling ioctl() to re-read partition table.

  43.  

  44. WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.

  45. The kernel still uses the old table. The new table will be used at

  46. the next reboot or after you run partprobe(8) or kpartx(8)

  47. 正在同步磁盘。

  48. [root@docker device]#

  49.  

方法 2:重新扫描特定的 SCSI Device

echo 1 > /sys/block/$DEVICE/device/rescan 用 sda, sdb, sdc 等替换$DEVICE

  1. [root@docker device]# echo 1 > /sys/block/sda/device/rescan

 

经过上面的操作,我们将 sda3 分成 lvm 格式的分区了。但是这时候还没有挂载上 sda3,我们发现/dev/下面没有 sda3 出现。这时候如果我们 pvcreate 是不会成功的。

  1. [root@docker device]# ls /dev/sda

  2. sda   sda1  sda2  

  3. [root@docker device]# ls /dev/sda

  4. [root@docker device]# pvcreate /dev/sda3

  5.  Device /dev/sda3 not found (or ignored by filtering).

这时候不要慌,我看看之前的提示信息

所以这时候要么 reboot 重启,要么运行 partprobe 要么运行 kpartx 命令。所以这里我在运行一下 partprobe 命令后,发现/dev/sda3 出来了。

  1. [root@docker device]# partprobe

  2. [root@docker device]# ll /dev/sda

  3. sda   sda1  sda2  sda3  

那么接下来操作将 20G 扩到跟/目录下。也就是进行 lvm 的扩展操作了。

  1. [root@docker device]# pvcreate /dev/sda3

  2.  Physical volume "/dev/sda3" successfully created

  3. [root@docker device]# vgextend centos_docker /dev/sda3

  4.  Volume group "centos_docker" successfully extended

  5. [root@docker device]# lvextend -l +100%FREE /dev/mapper/centos_docker-root

  6.  Size of logical volume centos_docker/root changed from 25.61 GiB (6555 extents) to 45.60 GiB (11674 extents).

  7.  Logical volume root successfully resized.

  8. [root@docker device]# xfs_growfs /dev/mapper/centos_docker-root

  9. meta-data=/dev/mapper/centos_docker-root isize=256    agcount=4, agsize=1678080 blks

  10.         =                       sectsz=512   attr=2, projid32bit=1

  11.         =                       crc=0        finobt=0

  12. data     =                       bsize=4096   blocks=6712320, imaxpct=25

  13.         =                       sunit=0      swidth=0 blks

  14. naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

  15. log      =internal               bsize=4096   blocks=3277, version=2

  16.         =                       sectsz=512   sunit=0 blks, lazy-count=1

  17. realtime =none                   extsz=4096   blocks=0, rtextents=0

  18. data blocks changed from 6712320 to 11954176

  19.  

  20. ##(如果是 ext4 文件系统,则使用命令 resize2fs /dev/mapper/centos_docker-root)##

  21. [root@docker device]# df -h

  22. 文件系统                        容量  已用  可用 已用% 挂载点

  23. /dev/mapper/centos_docker-root   46G  1.6G   45G    4% /

  24. devtmpfs                        1.9G     0  1.9G    0% /dev

  25. tmpfs                           1.9G     0  1.9G    0% /dev/shm

  26. tmpfs                           1.9G  8.5M  1.9G    1% /run

  27. tmpfs                           1.9G     0  1.9G    0% /sys/fs/cgroup

  28. /dev/sda1                       397M  120M  278M   31% /boot

  29. tmpfs                           380M     0  380M    0% /run/user/0

  30. [root@docker device]#

  31.  

这里成功将根/目录扩张到 50G 了。

2、增加一块新的硬盘

这里实验我就不继续做了,我复制之前的文章内容

————————–以下内容来源实战给 Linux 系统动态扩容,不停机处理!———————————–

上图中,我们原先只有 56G 的根目录空间,现在想增加 50G 进去!那么添加一块 50G 的硬盘进去。我们在不停机的情况下,点击虚拟机,点击编辑设置,选择添加,选择硬盘,创建新的虚拟磁盘磁盘,容量 50G,一直下一步知道完成。如下图所示,增加一块新的硬盘!


        记录 lvm 的相关信息

我们使用 df -h 和 lvdisplay 命令记录下 LV 的相关信息,VG Name,LV Path 等信息

  1. [root@do1 ~]# df -h

  2. 文件系统                 容量  已用  可用 已用% 挂载点

  3. /dev/mapper/centos-root   56G  1.5G   55G    3% /

  4. devtmpfs                 911M     0  911M    0% /dev

  5. tmpfs                    921M     0  921M    0% /dev/shm

  6. tmpfs                    921M  8.5M  912M    1% /run

  7. tmpfs                    921M     0  921M    0% /sys/fs/cgroup

  8. /dev/sda1                397M  120M  278M   31% /boot

  9. tmpfs                    185M     0  185M    0% /run/user/0

  10. [root@do1 ~]# lvdisplay

  11.  --- Logical volume ---

  12.  LV Path                /dev/centos/swap

  13.  LV Name                swap

  14.  VG Name                centos

  15.  LV UUID                k3TPNs-vUuJ-vmcy-SPzS-xxMA-jWhq-JFP95Z

  16.  LV Write Access        read/write

  17.  LV Creation host, time do1, 2018-10-19 18:59:22 +0800

  18.  LV Status              available

  19.  # open                 2

  20.  LV Size                4.00 GiB

  21.  Current LE             1024

  22.  Segments               1

  23.  Allocation             inherit

  24.  Read ahead sectors     auto

  25.  - currently set to     8192

  26.  Block device           253:1

  27.  

  28.  --- Logical volume ---

  29.  LV Path                /dev/centos/root

  30.  LV Name                root

  31.  VG Name                centos

  32.  LV UUID                BqhdTf-yzgq-HaJi-fU6o-HbIn-WoAU-8tleaE

  33.  LV Write Access        read/write

  34.  LV Creation host, time do1, 2018-10-19 18:59:22 +0800

  35.  LV Status              available

  36.  # open                 1

  37.  LV Size                55.61 GiB

  38.  Current LE             14235

  39.  Segments               1

  40.  Allocation             inherit

  41.  Read ahead sectors     auto

  42.  - currently set to     8192

  43.  Block device           253:0

LV Path /dev/centos/root    #也就是根目录/挂载点
LV Name root
VG Name centos

上面三个信息记录下来,后面要用。

       格式化新挂载的磁盘

先用 fdisk -l 查看新的磁盘是否挂载

注意:这里如果没有发现新添加的磁盘,那么请 root 用户执行以下脚本。scsisum.sh 

  1. #!/usr/bin/bash

  2. scsisum=`ls /sys/class/scsi_host/ |wc -l`

  3. for ((i=0;i<${scsisum};i++))

  4. do

  5.    echo "- - -" > /sys/class/scsi_host/host${i}/scan

  6. done

接下来格式化分区操作‘fdisk /dev/sdb

       新分区增加到 LV

将新加的分区 /dev/sdb1 创建为物理卷

  1. [root@do1 ~]# pvcreate /dev/sdb1

  2.  Physical volume "/dev/sdb1" successfully created

给卷组‘centos’扩容,将物理卷 /dev/sdb1 扩展至‘centos’卷组

  1. [root@do1 ~]# vgextend centos /dev/sdb1

  2.  Volume group "centos" successfully extended

此时卷组‘centos’有50G空余空间即 /dev/sdb1,将其全部扩展至 /

  1. [root@do1 ~]# lvextend -l +100%FREE /dev/mapper/centos-root

  2.  Size of logical volume centos/root changed from 55.61 GiB (14235 extents) to 105.60 GiB (27034 extents).

  3.  Logical volume root successfully resized. 

此时50G磁盘虽已扩展至 /,但并没写入文件系统;进入 /etc/fstab 确认 / 文件系统—>xfs

写入文件系统,使扩容生效(如果是 ext4 文件系统,则使用命令 resize2fs /dev/mapper/centos-root)

  1. [root@do1 ~]# xfs_growfs /dev/mapper/centos-root

  2. meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=3644160 blks

  3.         =                       sectsz=512   attr=2, projid32bit=1

  4.         =                       crc=0        finobt=0

  5. data     =                       bsize=4096   blocks=14576640, imaxpct=25

  6.         =                       sunit=0      swidth=0 blks

  7. naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

  8. log      =internal               bsize=4096   blocks=7117, version=2

  9.         =                       sectsz=512   sunit=0 blks, lazy-count=1

  10. realtime =none                   extsz=4096   blocks=0, rtextents=0

  11. data blocks changed from 14576640 to 27682816

查看/根目录大小是否变化,扩容前是 56G,扩容后是 106G,此时大功告成!

总结:以上是没有停机的情况下完成扩容磁盘,当然一切前提还是要做好安全备份!做好相应的备份快照,这样就实现了上述两点要求!

本次扩容指令汇总:

1.创建分区                                                 #fdisk /dev/sdb

2.创建物理卷                                             #pvcreate /dev/sdb1

3.查看卷组名称及使用情况                         #vgdisplay

4.将物理卷扩展到卷组                                #vgextend cl /dev/sdb1   (此处‘cl’是卷组名称)

5.将卷组中空闲空间扩展到 /home             #lvextend -l +100%FREE /dev/mapper/centos-root

6.刷新文件系统是扩容生效                         #resize2fs /dev/mapper/centos-root

使用 reiserfs 文件系统代替 ext2/ext3        #resize_reiserfs /dev/mapper/centos-root

Centos7 默认文件系统是 ‘xfs’,其他系统注意是否是‘ext4’等


文章转载自IT敢客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论