有一台机器:
[root@SERVER ~]# df -mP
Filesystem 1048576-blocks Used Available Capacity Mounted on
/dev/sda2 124685 7462 110897 7% /
tmpfs 12016 0 12016 0% /dev/shm
/dev/sda1 485 102 358 23% /boot
/dev/sdb1 32131 48 30444 1% /var/foobar1
/dev/sdb2 16009 420 14770 3% /var/foobar2
/dev/sdb3 988 6 930 1% /var/foobar3
/dev/sdb5 988 2 935 1% /var/foobar4
/dev/sdb6 988 17 919 2% /var/foobar5
/dev/mapper/datvg-FOO 125864 81801 37663 69% /var/FOOBAR6
1.2.3.4:/var/FOOBAR7 193524 128878 54816 71% /var/FOOBAR7
[root@SERVER ~]# vgs
VG #PV #LV #SN Attr VSize VFree
datvg 1 1 0 wz--n- 204.94g 79.94g
[root@SERVER ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
FOO datvg -wi-ao---- 125.00g
[root@SERVER ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 128G 0 disk
??sda1 8:1 0 500M 0 part /boot
??sda2 8:2 0 123.7G 0 part /
??sda3 8:3 0 3.8G 0 part [SWAP]
sdb 8:16 0 256G 0 disk
??sdb1 8:17 0 32G 0 part /var/foobar1
??sdb2 8:18 0 16G 0 part /var/foobar2
??sdb3 8:19 0 1G 0 part /var/foobar3
??sdb4 8:20 0 1K 0 part
??sdb5 8:21 0 1G 0 part /var/foobar4
??sdb6 8:22 0 1G 0 part /var/foobar5
??sdb7 8:23 0 205G 0 part
??datvg-FOO (dm-0) 253:0 0 125G 0 lvm /var/FOOBAR6
[root@SERVER ~]#
[root@SERVER ~]# grep ^Red /etc/issue
Red Hat Enterprise Linux Server release 6.8 (Santiago)
[root@SERVER ~]#
Run Code Online (Sandbox Code Playgroud)
问题:我们如何迁移它以将 LVM 用于 / 和 /var 等 FS?只是用LVM创建相同的“分区”,复制旧FS中的文件?机器将如何启动?/boot 可以留在 /dev/sda1 中。
您只在 / 上使用了大约 7.4GB 并且在 LVM 中有 79GB 可用空间,所以,是的,您可以为/(和另一个为/var)创建一个新的 LV ,并将文件从 / 和 /var 复制到它们。我建议使用rsync副本。
例如,将新的 / 和 /var 挂载为 /target 和 /target/var:
rsync --archive --sparse --one-file-system --delete-during --delete-excluded \
--force --numeric-ids --hard-links / /var /target/
Run Code Online (Sandbox Code Playgroud)
也可选择使用这些选项:
--human-readable --human-readable --verbose --stats --progress
Run Code Online (Sandbox Code Playgroud)
您可以根据需要多次重复此操作,直到您有足够的空闲时间重新启动到单用户模式并完成该过程,即:
/和/bootRW 如果它们还不是 RW/target和/target/var如上for i in proc dev sys dev/pts run boot; do mount -o bind /$i /target/$i; donechroot /target/etc/fstab和更改 / 和 /var 的设备/uuid/标签update-grubfor i in proc sys dev/pts dev boot var /; do umount /target/$i ; done如果重启后一切正常,您可以将/dev/sda2(旧的根分区)添加到 LVM VG datvg。
如果您愿意,您还可以为/boot(安装为/target/boot)创建一个 LV并将其同步等以及/和/var(除了从for循环中删除引导之外mount -o bind,您不希望原始/boot绑定安装在/target/boot)。
然后也为交换创建一个 LV,您可以将整个添加/dev/sda到 LVM VG(删除 sda 上的所有分区,创建/dev/sda1并添加)。
顺便说一句,另一种方法是使用Clonezilla CD 或 U 盘启动,创建 LVM 分区,然后使用 cz 将 / 和 /boot 克隆到 LVM。我上次这样做已经有一段时间了,所以我记不清了,但是您可能仍然需要挂载 /target(和 /target/var、/target/boot),执行绑定挂载并编辑 fstab 和update-grub.
事实上,for上面的循环是从自定义脚本为我的tftp-bootableclonezilla映像制作的别名中复制和稍微修改的......所以,这是一个很好的选择,它是必要的。
它启动时使用这样的别名供 root shell 使用:
alias prepare-chroot-target='for i in proc dev sys dev/pts ; do mount -o bind /$i /target/$i ; done'
Run Code Online (Sandbox Code Playgroud)
如果您不使用 LVM,因为您需要为 VM 创建分区(分区和大多数其他块设备比 .qcow2 或 VM 的原始文件更快),我建议使用btrfs 而不是 LVM。它比 LVM 更灵活(而且,IMO,更易于使用) - 例如,增加(或缩小)子卷的分配是微不足道的。
btrfs具有能够执行从 ext3 或 ext4 到 btrfs的就地转换的非常有用的功能。
不幸的是,该维基页面现在有一个警告:
警告:从 4.0 内核开始,此功能不再经常使用或经过良好测试,并且有一些报告称转换工作不可靠。随意尝试一下,但请确保您有备份。
您可以对 进行就地转换/,将您的/var/foobar*目录迁移到 btrfs,然后将 sdb 的一半添加到 btrfs /(作为 RAID-1 镜像),并将另一半用于额外存储(也是 btrfs)或用于 LVM。很遗憾您没有一对相同大小的磁盘。
如果您选择不就地转换(可能是明智的),该过程将类似于rsync的等方法上面,除外,而不是创建LVM分区/target/{,boot,var}创建一个BTRFS体积/target并分卷/target/boot和/target/var。您需要一个单独的交换分区(或者忘记磁盘交换并使用zram主线内核压缩 RAM 块设备。或者添加更多 RAM 以免交换。或两者兼而有之。)
但是,备份数据和配置文件、为发行版启动安装程序 CD 或 USB、从头开始重新安装(在仔细规划分区布局后)然后恢复备份的选定部分(/home、/ usr/local,/etc 中的一些配置文件)。
鉴于您的驱动器不匹配,btrfs 可能是您更好的选择,但我发现在不提及 ZFS 的情况下提及 btrfs 是不可能的:
如果您需要为虚拟机提供块设备,并且想要像 btrfs 这样的灵活性并且不介意安装非主线内核模块,请使用ZFS而不是 btrfs。
它几乎可以完成 btrfs 所做的所有事情(不幸的是,重新平衡除外。并且您只能将磁盘添加到池中,永远不要删除它们或更改布局)以及更多功能,并且您可以创建 ZVOL(使用来自您的存储的块设备)池)以及子卷。
如今,在 Debian 或 Ubuntu 以及其他几个发行版上安装 ZFS 很容易——发行版提供了软件包(包括spl-dkms和zfs-dkms为您的内核自动构建模块)。构建 dkms 模块需要很长的时间,但除此之外,它就像安装任何其他软件包一样简单直接。
不幸的是,转换为 ZFS 不会像上述过程那样容易。将 rootfs 转换为 ZFS 本身是一个中等难度的过程。与 一样btrfs,备份数据和配置文件等并从头开始重建机器会更容易,使用具有良好 ZFS 支持的发行版(Ubuntu 可能是目前Linux上ZFS的最佳选择)。
更糟糕的是,ZFS 要求 vdev 中的所有分区或磁盘的大小相同(否则 vdev 将只与其中最小的设备一样大),因此您只能将 sda 和大约一半的 sdb 添加到 zpool。sdb 的其余部分可能是 btrfs、ext4、xfs 甚至 LVM(这有点毫无意义,因为您可以使用 ZFS 制作 ZVOL)。
我在 Debian 上使用 ZFS(并且很高兴 ZFS 最终将其纳入发行版本身,因此我可以使用本机 debian 包)。我已经使用它好几年了(至少从 2011 年开始)。强烈推荐。我只是希望它具有 btrfs 的重新平衡功能,这本身就非常有用,并开辟了从池中删除 vdev 的可能性(目前 ZFS 不可能),甚至可能从 RAID-1 转换为 RAIDZ-1。
btrfs 能够进行从 RAID-1 到 RAID-5 或 RAID-6 或 RAID-10 的在线转换也很酷,但我可能不会使用。我几乎放弃了所有形式的 RAID-5/RAID-6,包括 ZFS 的 RAID-Z(性能成本和擦洗或重新同步时间不值得,IMO),我更喜欢RAID- 1 或 RAID-10 - 我可以随心所欲地将任意数量的 RAID-1 vdev 添加到池中(这可以有效地将 RAID-1 转换为 RAID-10,或者只是将更多镜像对添加到现有的 RAID-10) .
无论如何,我为 VM 广泛使用了 ZVOL,因此 btrfs 不是我的选择。