Linux系统如何迁移至LVM磁盘

Stella981
• 阅读 629

今天遇到一个问题,算是比较严重的把。就是要把当前系统转移到 LVM 卷里面去,下面有一些发生过程介绍。

不感兴趣可以直接跳过,看实战部分《如何迁移系统至LVM卷》

朋友今天突然找我,说是要把系统的根分区磁盘扩大。接到这个问题,我马上开始查看下系统情况。是一台 CentOS 6.6 的系统,有俩块磁盘分别 vda1 是 15G 根,vda2 的 1G swap ,总大小是 21G 的一块 vda !现在要求去增大 vda1 分区。

后面我给朋友三个方案:

  • 第一个就是将 vda5 随意作为 home、var 之类的挂载;
  • 第二个就是做快捷方式 ln链接到vda1 ,5G 加上 15G 也勉强扩大了;
  • 最后一种也就是最麻烦的,加大 vda、做一个LVM,将数据迁移到LVM、将vda1加入到LVM,最后实现系统的扩容。

朋友选择了最后一种,我用了很多种办法。网上说推荐是dd再是tar最后尝试cpio、backup、dump,然后我没办法用了最后一种发现效果远远高于dd

本次教程也是从头再试验一遍,并且记录好便己便人。

警告:****本文思路仅供参考!应该根据你的实际情况予以调整。如果在生产服务器上进行,请务必做好整个系统的全盘备份。操作不慎,有可能导致整个系统数据的丢失!本文作者及本站不对任何可能出现的风险承担任何责任。

一、预备知识:

1、了解,什么是dd以及什么是dump?

dd命令用于复制文件并对原文件的内容进行转换和格式化处理。

  --对于dd命令,仅仅只是介绍。dd命令比 Windows 的下 ghost 更好,Linux下也是极棒的。

dump命令用于备份ext2或者ext3文件系统。可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。 

   --对于dump命令,备份用到。dump可以帮助我们将分区进行打包成一个文件。

2、尝试,备份的需要如何恢复?

restore 命令是 dump 命令的逆过程,用于还原 dump 命令生成的备份文件。

   --这也是很重要的恢复命令。可以将我们的 dump 文件进行恢复。

/etc/fstab 文件描述系统中各种文件系统的信息,一般而言,应用程序仅读取这个文件,而不对它进行写操作。

  --这个文件需要系统管理员进行更新,确保系统读取时正确执行。 

/boot/grub/grub.conf 文件是 grub 配置文件, grub 才能找到 kernel,系统才能正常启动。

  --这个文件也是需要我们更改的,制定grub读取新分区

首先要求有一个可以正常启动的分区,然后要有剩余空间!(必须注意/dev/sdb1 的容量大于 /dev/sda1,且/dev/sdb1应为LVM卷

我用虚拟机模拟了服务器的真实情况:/dev/sda1 是正常系统启动分区、/dev/sdb1 是新的磁盘分区。

步骤一、用dump备份整个根分区,使用restore恢复

步骤二、更改备份好的系统fstab文件以及更改boot下引导文件

Linux系统如何迁移至LVM磁盘

小窍门:Linux自带的光盘一般都会急救的功能,善于利用!

二、环境模拟:

虚拟机设置及分区情况:

Linux系统如何迁移至LVM磁盘

这里有两种情况:一个是某分区,一个是新磁盘。两者类似,为了方便本文使用的是新磁盘的方式。

Linux系统如何迁移至LVM磁盘

Linux系统如何迁移至LVM磁盘

三、实战部分:

Linux系统如何迁移至LVM磁盘  

Linux系统如何迁移至LVM磁盘

注意:我使用的是一个sdb1作为lvm磁盘,sdb2作为boot磁盘(为了方便后面的引导,因为grub不支持lvm磁盘引导boot)

I、创建LVM卷

1、首先要确保系统是安装lvm组件的,可以使用rpm -qa查询信息

Linux系统如何迁移至LVM磁盘

2、然后卸载 /dev/sdb1,然后在其上用 pvcreate 创建物理卷和 vgcreate 创建卷组 vgtest

pvcreate /dev/sdb1

vgcreate vgtest /dev/sdb1

Linux系统如何迁移至LVM磁盘

lvcreate -L 25G -n lvtest vgtest

mkfs.ext4 /dev/mapper/vgtest-lvtest

Linux系统如何迁移至LVM磁盘

II、备份MBR引导文件。

dd if=/dev/sda1 of=/mnt/grub/mbr.bin bs=512 count=1

Linux系统如何迁移至LVM磁盘  

III、备份 / 目录和 /boot 目录

1、备份 / 目录。在 dump 命令前后输入的 date 命令是为了查看备份使用的时长。

date && dump -0f /mnt/lvm/rootfs-20160824.bak / && date

Linux系统如何迁移至LVM磁盘

2、为了安全引导我们也备份一下 /boot 目录:

date && dump -0f /mnt/grub/boot-20160824.bak /boot && date

Linux系统如何迁移至LVM磁盘

IV、尝试恢复

1、还原 dump 的备份文件(/boot分区默认已包括在/分区)

date && restore -rf rootfs-20160824.bak && date

 Linux系统如何迁移至LVM磁盘

注意:这里boot文件需要更改成实际要启动的磁盘。

2、还原 MBR 的备份文件

dd if=/mnt/grub/mbr.bin of=/dev/sdb2

 Linux系统如何迁移至LVM磁盘

注意:这里使用dd命令恢复了之前备份的MBR文件。

VI、启动文件

Linux系统如何迁移至LVM磁盘

注意:这里为了体现是chroot的,将主机名改成了NEW。一定要chroot进入目录查看是否能启动!并且确定防火墙SELinux的设置,最最最重要的OPENSSH要打开的!

1、首先通过 blkid 查看分区的 UUID:

Linux系统如何迁移至LVM磁盘

2、然后同步修改 /etc/fstab 文件以及切换了跟分区之后将变成的 /etc/fstab 中的根分区指向:

Linux系统如何迁移至LVM磁盘

3、重启生效

注意:这里我重启了一下,同时可以看出我的fstab是ok的并且都生效了。 

VII、至此:

到这里为止,我们已经完成了数据的转移:在我们尝试chroot进入系统时就可以查看数据信息是否完整是否有丢失。

而下面更为重要的就是如何去恢复GRUB引导:让新磁盘可以脱离源磁盘的引导。

chroot进入新磁盘:

Linux系统如何迁移至LVM磁盘  

输入:root   (hd1,0)

输入:setup  (hd1)

再次输入:quit

Linux系统如何迁移至LVM磁盘

备注:如果通过上面的操作还是无法正常进入系统,可以尝试进入DVD急救模式尝试其他。

Linux系统如何迁移至LVM磁盘

tip:这里仅仅只是小建议,可以尝试使用CentOS自带的急救模式。也可以选择CLI完成操作!

Linux系统如何迁移至LVM磁盘

tip:同上。仅仅为了向大家说明最后最后还需要更改启动项选项!

注意:Virtualbox使用F12选择新磁盘就好、VMware需要按F2进入BIOS并使用“+-”完成启动项的调试。

如果引导还有问题推荐看这篇文章 http://os.51cto.com/art/201003/185574.htm

VIII、总结:

所以说装系统的时候就使用LVM就很好,不然又是一顿折腾。

何必呢?但是技多不压身,会些更装逼嘛~

VVI、其他:

当时我写这篇文章时候犯了几个错误,比较重要的记下来。

第一个:是当时没有先百度,查看GRUB对LVM的问题(虽然现在的我知道怎么GRUB启动LVM,但是当时是不知道)

第二个:  居然不知道boot要单独分区

第三个:改了这个文件,忘了那个文件

第四个:为了图方便使用了/dev/sdx这样形式,应该用UUID

第五个:疲劳写作,第二天我就突然写完这篇文章了...

最最后,系统移动至LVM磁盘一定是可以得。改日我用服务器现场移动,到时候再给新文章!

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这