我将重新提出一周前在 stackoverflow 上发布的一个问题,如果有人发现这个垃圾信息,我很抱歉,但我仍然需要帮助来解决这个问题。我认为这对其他人也可能有用。首先,我有一台基于 Centos7 的服务器,根据公司政策,它在非合规硬件上运行,我只需要支持容错。
我正在与一个看似简单的东西发生碰撞。
我需要将我的服务器放在 RAID 控制器后面,这意味着我需要将我的 CentOS 7 安装移动到连接在其上的设备上(3ware 控制器 9650se-2lp,计算机是 HP 商务级,DC7600 可转换小型塔式机)。
我的麻烦始于所采用的文件系统,即无法从设计上缩小的 XFS。我需要缩小它,因为控制器看到的相同磁盘看起来更小,因为控制器将固件存储在其中。
我的系统是 CentOS 7 的默认安装,带有 LVM 卷。经过一周的文档记录,了解了设备映射器的工作原理后,我最终得到了一个名为“centos”的卷组和名为“root”、“home”和“swap”的逻辑卷。很简单。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 148,56g 64,00m
# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- 148,56g 64,00m
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 96,50g
root centos -wi-ao---- 50,00g
swap centos -wi-ao---- 2,00g
现在我需要缩小整个布局,我将通过从 sda2 中减少“主”lvm 来实现这一点。我计划将新安装到 130G,而现在是 148,56G,所以我想将“主”减少到 18,56G。
首先使用 fdisk 为新磁盘创建两个新卷,sdb1 和 sdb2,之后我开始处理逻辑卷。
# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
# vgextend centos /dev/sdb2
Volume group "centos" successfully extended
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 148,56g 64,00m
/dev/sdb2 centos lvm2 a-- 130,00g 130,00g
# lvcreate --size 77,50G --name home1 centos
Logical volume "home1" created.
# mkfs.xfs /dev/centos/home1
meta-data=/dev/centos/home1 isize=512 agcount=4, agsize=5079040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=20316160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=9920, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# lvcreate --size 50,00G --name root1 centos
# mkfs.xfs /dev/centos/root1
# lvcreate --size 2G --name swap1 centos
# mkswap /dev/centos/swap1
之后,我从 livecd Clonezilla 克隆了 sdb1 上的 sda1,而无需重写分区表,并从命令行安装了逻辑卷以复制数据。我不能使用我知道最好的简单 dd,因为 dd 也会复制空白空间,新家会缩小。
# mkdir /mnt/home
# mkdir /mnt/home1
# mount -o ro /dev/centos/home /mnt/home
# mount /dev/centos/home1 /mnt/home1
# cd /mnt/home
# find . -mount -print | cpio -pdm /mnt/home1
5885177 blocks
# cd /
# umount home
# umount home1
# mkdir /mnt/root
# mkdir /mnt/root1
# mount -o ro /dev/centos/root /mnt/root
# mount /dev/centos/root1 /mnt/root1
# cd /mnt/root
# find . -mount -print | cpio -pdm /home/root1
43415372 blocks
完成后,我关闭了电脑,拔掉了 sda 磁盘的线缆,并将 sdb 移到了主板上的第一个 sata 端口上。现在 sda 已经安全了,不再受到我的控制。最好的还在后头。
我已经从 Clonezilla 再次启动,没有复制任何内容,并且我已经清理并重命名了我的逻辑卷。
# vgreduce --removemissing --force centos
WARNING: Device for PV 0tJwU5-KA41-LEJa-hhFG-SIzx-RGq3-fJNzkm not found or rejected by a filter.
WARNING: Removing partial LV centos/swap.
Logical volume "swap" successfully removed
WARNING: Removing partial LV centos/home.
Logical volume "home" successfully removed
WARNING: Removing partial LV centos/root.
Logical volume "root" successfully removed
Wrote out consistent volume group centos.
# lvrename /dev/centos/root1 /dev/centos/root
Renamed "root1" to "root" in volume group "centos"
# lvrename /dev/centos/home1 /dev/centos/home
Renamed "home1" to "home" in volume group "centos"
# lvrename /dev/centos/swap1 /dev/centos/swap
Renamed "swap1" to "swap" in volume group "centos
最后我安装了 grub2:
# mount /dev/centos/root /mnt
# mount /dev/sda1 /mnt/boot
# mount --bind /dev /mnt/dev &&
mount --bind /dev/pts /mnt/dev/pts &&
mount --bind /proc /mnt/proc &&
mount --bind /sys /mnt/sys
# chroot /mnt
# grub2-install /dev/sda
# grub2-install --recheck /dev/sda
# grub2-mkconfig -o /boot/grub2/grub.cfg
我已修复 grub2-mkconfig 上的警告,该警告取代了 grub1 的 update-grub,启用了一项我从未使用过的新服务 lvm2-lvmetad
# grub2-mkconfig -o /boot/grub2/grub.cfg
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Found linux image: /boot/vmlinuz-3.10.0-514.21.2.el7.centos.plus.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.21.2.el7.centos.plus.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-6f6078afdaf94da59deb321bd428dfdf
Found initrd image: /boot/initramfs-0-rescue-6f6078afdaf94da59deb321bd428dfdf.img
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
done
# systemctl enable lvm2-lvmetad.service
# systemctl enable lvm2-lvmetad.socket
# systemctl start lvm2-lvmetad.service
# systemctl start lvm2-lvmetad.socket
当然,我知道服务启动无法从 livecd 进行。
重启系统后,我遇到了几个与 SELinux 相关的问题。登录完成后,它一直将我弹回,无论是从远程还是本地,也不管是否使用 ssh。当然,从 livecd 很容易将 SELinux 设置为宽容,但这是一台生产服务器,它托管了用于开发的服务,例如 mediawiki 和 git。我无法开始使用克隆的驱动器,将新数据放入几乎有漏洞的系统,我不明白我哪里做错了。我尝试重新安装与 SELinux 相关的软件包,但完全随机地没有弄清楚可能是什么问题。我遗漏了什么吗?
谢谢您的回答,问候。
答案1
以下所有步骤(引导加载程序安装除外)都将在运行系统上完成。
1.在sdb上创建分区
就像在 sdb 上创建分区一样。确保 sdb1 具有与 sda1 相同的起始值和结束值。像之前一样创建 sdb2(即不是整个剩余的路程)
2.将 sda1 克隆到 sdb1
以只读模式重新挂载 /dev/sda1mount -o remount,ro /boot
并克隆分区dd if=/dev/sda1 of=/dev/sdb1
。
3. 交换驱动器并确保 sdb 启动
交换 sda 和 sdb。在新的sda 并确保当新的 sdb(即原始驱动器)未连接时,引导加载程序仍会加载内核。由于没有根卷,启动将出现混乱,但现在您知道它可以启动。重新连接sdb
。
3.扩展你的卷组
将新的 sda2 添加到卷组,如下所示
pvcreate /dev/sda2
:vgextend centos /dev/sda2
4. 转移交换卷和根卷
以下命令将移动不是克隆将您的卷迁移到新驱动器。但它们仍将保留在同一个卷组中
pvmove -n swap /dev/sdb2 /dev/sda2
pvmove -n root /dev/sdb2 /dev/sda2
5. 克隆你的 /home
在 sda2 上为 /home 创建新卷,将其挂载到某处并使用 xfsdump 和 xfsrestore 克隆内容
lvcreate --size 77,50G --name new_home centos /dev/sda2
mount /dev/centos/new_home /mnt
xfsdump -J /home | xfsrestore -J /mnt
6. 确保 selinux 标签已转移
检查ls -Z /home
并ls -Z /mnt
匹配
7. 重命名主卷
卸载两个主卷并重命名
umount /home
umount /mnt
lvrename centos/home centos/old_home
lvrename centos/new_home centos/home
mount /home
现在您已挂载了克隆的较小 /home。centos/old_home 卷是 sdb2 上最后一个卷。此时您的系统应该可以顺利启动和运行,但您仍需要删除 sdb。
8. 清理
重新启动并确保一切仍按预期工作后,您可以使用 删除旧的主卷lvremove centos/old_home
。当您查看 的输出时,pvs
您应该注意到 sdb2 应该完全未被使用。
此时您可以vgreduce centos /dev/sdb2
,并且pvremove /dev/sdb2
“旧”驱动器不再是卷组的一部分。
您现在可以关闭盒子并移除旧驱动器。
答案2
问题在于您的克隆过程没有复制 selinux 文件标签。
以宽容模式启动,touch /.autorelabel
然后再次重启。系统将使用策略中的默认标签标记所有文件(这可能不是 100% 准确,但仍然比现在好得多)。
此后,您应该能够再次启动进入强制模式。
答案3
记录一下我所做的事情。记录一下:
1)fdisk /dev/sdb并执行:
- 创建新的空 DOS 分区表
- 添加一个新分区,1 用于启动,如 sda1,id 为 83,起始和结束相同
- 添加一个新分区,2 用于 LVM,id 为 8e,大小为 135G,小于 sda2,因为我需要减少
- 在分区 1 上切换可启动标志
2)挂载-o重新挂载,ro / boot
3)dd if=/dev/sda1 of=/dev/sdb1
4)重启
5)chroot我的根目录
- 挂载 /dev/centos/root /mnt/root/
- 挂载 /dev/sdb1 /mnt/root/boot/
- 挂载 --bind /dev/ /mnt/root/dev/ && 挂载 --bind /dev/pts && 挂载 --bind /proc/ && 挂载 --bind /sys /mnt/root/sys
- chroot /mnt/root/
6)安装引导程序
- grub2-安装 /dev/sdb
- grub2-install --recheck /dev/sdb
- grub2-mkconfig -o /boot/grub2/grub.cfg
7)关机
8)交换驱动器
9)验证一切运行正常
- 我目前正在使用 sda(新驱动器)启动,以及从 sdb(旧驱动器)进行 root
10)pvcreate /dev/sda2
11) vgextend centos /dev/sda2
12)pvmove -n 交换/ dev / sdb2 / dev / sda2
13)pvmove -n 根目录 /dev/sdb2 /dev/sda2
14)yum 安装 xfsdump
15)lvcreate --size 80G --name new_home centos /dev/sda2
16)mkfs.xfs /dev/centos/new_home
17)挂载/ dev / centos / new_home / mnt / root /
18)xfsdump -J - /home|xfsrestore -J - /mnt/root/
19)验证相同的 Selinux 标签
- ls -Z /主页/
- ls -Z /mnt/root/
20)卸载/mnt/root/
21)lv重命名/ dev / centos / home / dev / centos / old_home
22)lv重命名/ dev / centos / new_home / dev / centos / home
23)挂载/home/
- 卸载 home 时出错,但安装 home 时我猜新的运行正常
24)重启,一切正常
25)lvremove / dev / centos / old_home
26) vgreduce centos /dev/sdb2
27)删除/dev/sdb2
28) 关闭并断开 sdb
结束。