如何将 /usr 移动到新分区?

Nat*_*man 28 partitioning

我的/usr文件夹需要移动到新分区。如何在不删除内容的情况下执行此操作?

这可以在 Ubuntu 运行时完成,还是我需要为此使用 LiveCD?

Ham*_*ner 30

使用 Live CD 是最安全的,但您可以这样做:

  • 将所有文件复制到新分区,确保/usr在执行此操作时不会更改内容。
  • 编辑/etc/fstab以便/usr在下次重新启动时安装
  • 重启
  • 删除旧文件

有关每个步骤的详细信息,请参见下文。

请注意,您无法/usr在运行时挂载新分区,因为其中将/usr打开大量文件。

复制文件

我会使用cp -a. -a是存档选项。从手册页

-a, --archive
          same as -dR --preserve=all
...
-d     same as --no-dereference --preserve=links
...
-P, --no-dereference
          never follow symbolic links in SOURCE
...
--preserve[=ATTR_LIST]
          preserve      the      specified      attributes       (default:
          mode,ownership,timestamps),  if  possible additional attributes:
          context, links, xattr, all
...
-R, -r, --recursive
          copy directories recursively
Run Code Online (Sandbox Code Playgroud)

编辑 /etc/fstab

您需要知道新分区的 UUID。您可以通过执行以下操作来查看映射:

$ ls -l /dev/disk/by-uuid/
Run Code Online (Sandbox Code Playgroud)

然后将此行添加到/etc/fstab

UUID=634c31a5-e27c-4e33-ac67-2e22491a30c2 /usr           ext4    defaults        0       2
Run Code Online (Sandbox Code Playgroud)

将 UUID 更改为您的 UUID,并更改ext4为您正在使用的文件系统类型 - 如果您已经设置了分区,您应该知道这一点。

删除旧文件

重新启动后,/usr根分区中的旧文件将被挂载在/usr. 但是我们可以使用一些挂载绑定技巧来获取旧文件,然后删除它们。

$ sudo mount --bind / /mnt
$ sudo rm -rf /mnt/usr/*
$ sudo umount /mnt
Run Code Online (Sandbox Code Playgroud)

但是一些轻微的输入错误(例如,在您只输入时按 Enter 键sudo rm -rf /mnt)可能会导致灾难,所以我只会在您对自己正在做的事情非常有信心,真的无法处理任何停机时间或没有对机器的物理访问,因此无法从 Live CD 或 Live USB 记忆棒启动。

  • 用 `rsync -avz` 替换 cp 命令。Rsync 允许您重新启动副本,通常应在分区、块设备或机器之间移动时使用。 (6认同)
  • `rsync` 比 `cp` 更适合于此 (5认同)
  • 不要使用`cp`。它不保留硬链接。这**将在未来破坏**包升级。例如`/usr/bin/s2p`和`/usr/bin/psed`是同一个文件。使用 `cp` 移动将创建该文件的 2 个独立版本。改为执行`rsync -aH`。 (4认同)

txw*_*ger 8

由于大多数使用的库都在 /usr 中,因此我不建议在运行 Ubuntu 时移动此目录。事实上,当您尝试执行此操作时,您可能会收到错误消息。因此,最好是使用 LiveCD。

您可以使用多种可能性来移动/复制文件 cp、rsync 等,以确保创建任何符号链接而不仅仅是复制。cp 和 rsync 都有这个选项。

将文件移动到另一个分区后,您需要在 /etc/fstab 中添加另一个挂载以将新分区挂载到 /usr。