将目录移动到另一个分区RHEL/CentOS 7/8的10个简单步骤

时间:2020-01-09 10:41:48  来源:igfitidea点击:

在本文中,将介绍将目录移动到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是否一切正常。