将目录移动到另一个分区RHEL/CentOS 7/8的10个简单步骤
在本文中,将介绍将目录移动到RHEL/CentOS 7/8 Linux中的另一个分区的步骤。
我将使用/usr目录,但是我们可以使用相同的步骤从Linux系统中移动任何其他目录,以创建另一个单独的分区,例如将opt opt移至另一个分区或者移至另一个分区。
现在将数据分区(例如home或者opt)移动到另一个分区的风险要比将系统目录(例如将usr从根目录移动到另一个分区)的风险更低
警告:
强烈建议"开始备份",然后再开始此活动并首先在测试环境中测试这些步骤。
。
我们必须了解将usr从根目录移动到另一个分区所涉及的风险。
该信息按原样提供,根据此解决方案中的信息进行的任何配置设置或者安装的应用程序都可能使操作系统无法使用。
实验环境
我已经使用安装在Linux服务器上的Oracle VirtualBox创建了虚拟机。
我已经在此虚拟机上安装了CentOS 8,但相同的步骤将在RHEL 7/8或者CentOS 7上运行。
在此VM上,我添加了一个虚拟磁盘,我们将使用该虚拟磁盘来创建新分区。
以下是当前已安装分区的列表。
如我们所见,当前usr安装在root [/]下。
因此,我们希望将/usr
做成一个单独的分区。
[root@centos-8 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 2.4G 0 2.4G 0% /dev tmpfs 2.4G 0 2.4G 0% /dev/shm tmpfs 2.4G 8.6M 2.4G 1% /run tmpfs 2.4G 0 2.4G 0% /sys/fs/cgroup /dev/mapper/rhel-root 14G 4.3G 8.4G 34% / /dev/sda1 488M 181M 272M 40% /boot tmpfs 479M 0 479M 0% /run/user/0
创建新分区
现在,由于我们希望将usr目录从根目录移到另一个分区,因此我们需要一个新分区,对我来说是/dev/sdb。
我不会其中解释步骤,我们可以按照注释提供的输入进行操作
[root@centos-8 ~]# fdisk /dev/sdb <--- My virtual disk where I will create a new partition Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n <--- To create a new partition Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p <--- To create a primary partition Partition number (1-4, default 1): <--- We will leave it to default by just pressing ENTER First sector (2048-41943039, default 2048): <--- We will leave it to default by just pressing ENTER Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G <-- We will create partition of 10G Created a new partition 1 of type 'Linux' and of size 10 GiB. Command (m for help): p <--- To print the existing partition table Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes/512 bytes I/O size (minimum/optimal): 512 bytes/512 bytes Disklabel type: dos Disk identifier: 0x48ed4091 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 20973567 20971520 10G 83 Linux Filesystem/RAID signature on partition 1 will be wiped. Command (m for help): t <--- To change the type of partition Selected partition 1 Hex code (type L to list all codes): 8e <--- 8e is for Linux LVM type Changed type of partition 'Linux' to 'Linux LVM'. Command (m for help): w <--- To save the partition table The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
刷新Linux节点的分区表
[root@centos-8 ~]# partprobe
要查看分区树,我们使用lsblk
。
[root@centos-8 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 15G 0 disk ├─sda1 8:1 0 512M 0 part /boot └─sda2 8:2 0 14.5G 0 part ├─rhel-root 253:0 0 13.6G 0 lvm / └─rhel-swap 253:1 0 956M 0 lvm [SWAP] sdb 8:16 0 20G 0 disk └─sdb1 8:17 0 10G 0 part sr0 11:0 1 6.7G 0 rom sr1 11:1 1 1024M 0 rom
创建新的逻辑卷(可选)
现在,此步骤是可选的。
我们可以选择跳过此步骤,然后将目录移动到另一个物理分区而不是逻辑分区。
但是我们想使用逻辑卷,以便将来有需要时可以选择扩展LVM。
我们目前只有一个卷组,因此我们将使用相同的VG来创建新的逻辑卷
[root@centos-8 ~]# vgs VG #PV #LV #SN Attr VSize VFree rhel 1 2 0 wz--n- <14.50g 0
以下是可用逻辑卷的列表
[root@centos-8 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root rhel -wi-ao---- 13.56g swap rhel -wi-ao---- 956.00m
第一步,我们将在分区/dev/sdb1
的顶部创建物理卷。
[root@centos-8 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created.
第二步是使用该物理卷/dev/sdb1
扩展我们的卷组。
[root@centos-8 ~]# vgextend rhel /dev/sdb1 Volume group "rhel" successfully extended
验证" VFree"部分,该部分现在显示10G已从我们的新物理卷中释放出来。
[root@centos-8 ~]# vgs VG #PV #LV #SN Attr VSize VFree rhel 2 2 0 wz--n- 24.49g <10.00g
我们将使用此额外的10G大小来创建新的逻辑卷。
由于我们希望将usr目录从根目录移到另一个分区,因此我们将此新逻辑卷命名为usr,大小为8G,并保持2G可用。
[root@centos-8 ~]# lvcreate -L 8G --name usr rhel Logical volume "usr" created.
建立档案系统
现在,如果我们跳过了,则可以在/dev/sdb1
上创建文件系统,如果已经执行了,则必须在逻辑卷上创建文件系统。
对于本文,我将创建ext4文件系统。
[root@centos-8 ~]# mkfs.ext4 /dev/mapper/rhel-usr mke2fs 1.44.3 (10-July-2016) Creating filesystem with 2097152 4k blocks and 524288 inodes Filesystem UUID: b6915614-671d-4dd6-8a0f-0807ef80eca1 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
将目录完全移动到另一个分区
现在我们有了分区/逻辑卷,我们将尝试将usr目录从根目录移到另一个分区。
在任何位置创建一个临时目录。
我们将在/tmp
下创建
[root@centos-8 ~]# mkdir /tmp/usr
接下来,将新的逻辑卷挂载到该临时挂载点上
[root@centos-8 ~]# mount /dev/mapper/rhel-usr /tmp/usr/
接下来,使用rsync
将/usr
的内容复制到我们在/tmp/usr
下的临时位置。
[root@centos-8 ~]# rsync -avz /usr//tmp/usr/
验证usr分区的备份
有多种命令和方法可以验证两个目录之间的差异。
我们可以使用基本的diff
命令
# diff /usr//tmp/usr/
观察输出以确保备份了/usr中的所有文件。
我们可能会观察到一些损坏的符号链接,但是一旦我们在/usr上安装了该逻辑卷,这些符号链接应该会得到修复。
我们还可以使用" du"命令检查单个文件的大小(以字节为单位)并与两个位置进行比较
# du /usr/ # du /tmp/usrtmp/
如果我们觉得两个位置相同并且包含所有文件,请转到下一步将目录移动到Linux或者Unix中的另一个分区。
使用/etc/fstab挂载逻辑卷
现在,由于我们已经在逻辑卷上备份了/usr,现在该使用/etc/fstab挂载该逻辑卷了。
由于我们无法挂载运行时,因为/usr是系统分区,并且它已挂载在根目录[/]上,因此我们无法将其卸载。
我们将使用blkid获取新逻辑卷/dev/mapper/rhel-usr
的UUID值
[root@centos-8 ~]# blkid /dev/mapper/rhel-usr /dev/mapper/rhel-usr: UUID="b6915614-671d-4dd6-8a0f-0807ef80eca1" TYPE="ext4"
在/etc/fstab
中添加以下内容
[root@centos-8 ~]# cat /etc/fstab UUID=b6915614-671d-4dd6-8a0f-0807ef80eca1 /usr ext4 defaults 0 0
说明:
确保通过blkid
输出通知UUID:
管理SELinux(可选)
如果SELinux处于Enforcecing/Permission状态
[root@centos-8 ~]# getenforce Enforcing
还原selinux上下文:
[root@centos-8 ~]# restorecon -vvFR /usr
如果SELinux处于"禁用"状态,则可以忽略此步骤。
更新GRUB2
接下来,我们必须在GRUB2配置文件/etc/sysconfig/grub
中添加新逻辑卷的位置。
以rd.lvm.lv = rhel/usr格式添加,其中rhel'是VG名称,而
usr`是逻辑卷名称,如下所示:
[root@centos-8 ~]# grep GRUB_CMDLINE_LINUX /etc/sysconfig/grub GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rd.lvm.lv=rhel/usr rhgb quiet"
.1:重建GRUB2配置文件
提示:
以下命令适用于基于UEFI的计算机上的旧式BIOS:~]#grub2-mkconfig -o/boot/efi/EFI/redhat/grub.cfg
[root@centos-8 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... done
备份initramfs文件,以防万一以后需要时使用。
[root@centos-8 ~]# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.$(date +%m-%d-%H%M%S).bak
重建initramfs镜像
[root@centos-8 ~]# dracut -f
步骤9:验证配置和步骤
现在我们已经完成了所有步骤。
下次重新启动节点,希望它能正确启动以检查我们是否能够将目录移动到另一个分区。
手指交叉。
幸运的是,节点正常启动,当我验证安装的分区时,我可以看到/usr
是一个新分区。
因此,将usr目录从根目录移动到另一个分区的步骤成功了。
[root@centos-8 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 2.4G 0 2.4G 0% /dev tmpfs 2.4G 0 2.4G 0% /dev/shm tmpfs 2.4G 8.6M 2.4G 1% /run tmpfs 2.4G 0 2.4G 0% /sys/fs/cgroup /dev/mapper/rhel-root 14G 4.3G 8.4G 34% / /dev/mapper/rhel-usr 7.9G 3.9G 3.6G 53% /usr /dev/sda1 488M 205M 249M 46% /boot tmpfs 479M 0 479M 0% /run/user/0
0:删除旧的/usr内容
现在,由于我们的节点已成功启动,因此我们无法在此阶段删除旧的/usr
内容。
好吧,除非我们处于救援模式,否则无法完成此操作。
因此,我们可以根据Linux环境使用RHEL/CentOS 7/8 ISO镜像启动进入救援模式。
0.1:启动进入救援模式
在救援模式下的以下屏幕中,按3获取shell。
重要的提示:
不要在此处选择1,因为我们将根据需求手动启动文件系统。
接下来,我们可以使用df命令检查现有的已挂载分区。
现在,由于我们将Live ISO镜像用于救援镜像,因此可以使用实时CD文件来挂载文件系统,
0.2:激活逻辑卷
使用vgchange -ay
激活卷组和逻辑卷
我们可以使用lvs
或者lvdisplay
检查逻辑卷列表。
0.3:在sysimage上挂载文件系统
由于未挂载dev,sys,proc文件系统,因此,我们将尝试如下图所示手动挂载它:
重要的提示:
首先安装根文件系统并安装下面提到的所有其他分区非常重要,否则我们将得到"无法读取已安装文件系统的表:无此类文件或者目录"。
# mount /dev/mapper/rhel-root /mnt/sysimage # mount -o bind /dev /mnt/sysimage/dev # mount -o bind /usr /mnt/sysimage/usr # mount -o bind /sys /mnt/sysimage/sys # mount -t proc /proc /mnt/sysimage/proc # mount -o bind /dev/shm /mnt/sysimage/dev/shm
0.4:更新/etc/fstab文件
在此阶段,由于我们的根[/]文件系统已安装在/mnt/sysimage
上,因此我们必须编辑/mnt/sysimage/etc/fstab
并取消注释/dev/mapper-rhel-usr
行。
0.5:清除旧的/usr内容
现在再一次,因为我们的根逻辑卷[/]挂载在/mnt/sysimage上,并且/dev/mapper/rhel-usr在此阶段没有处于挂载状态,因此我们可以手动删除旧的//mnt/sysimage/usr中的usr内容,并完成将目录移动到另一个分区的步骤。
# rm -rf /mnt/sysimage/usr/*
重要的提示:
确保再次检查/dev/mapper/rhel-usr是否未挂载在/mnt/sysimage/usr上,否则节点将变得不可用。
0.6:安装逻辑卷
我们还可以挂载我们用lvs命令观察到的其他逻辑卷,因为这些逻辑卷对于最终阶段的验证也将是必需的:
# mount /dev/sda1 /mnt/sysimage/boot # mount /dev/mapper/rhel-usr /mnt/sysimage/usr
因此,我们所有需要的分区都挂载在/mnt/sysimage
上。
将根目录" [/]"更改为已安装的根文件系统:
# chroot /mnt/sysimage
0.7:验证内容
接下来,使用以下命令列出已安装的分区,以确保所有逻辑卷均已正确安装:
# df -h
还要验证/usr
的内容,以确保内容就位。
这样看起来一切都很好,我们能够成功地将目录移动到另一个分区。
接下来,我们可以重新启动节点,并验证default.target
是否一切正常。