我目前被限制分区方案所困扰,这使我的分区被填满。它看起来像这样:
/dev/sda7 870G 315G 511G 39% /
/dev/sda6 2.0G 271M 1.6G 15% /tmp
/dev/sda3 15G 13G 1.5G 90% /usr
/dev/sda2 15G 8.6G 5.0G 64% /var
/dev/sda1 99M 36M 58M 39% /boot
tmpfs 7.9G 0 7.9G 0% /dev/shm
我想将数据移入/usr
(也/var
可能移入)根分区。我并不真正关心分区本身,因此不需要合并。
最好的方法是什么?目前,我的计划是这样的:
cp -R /usr /newusr
umount /usr
mv /newusr /usr
真的就这么简单吗,还是我忽略了什么?
答案1
你的方法是正确的。在根分区上创建一个目录,将数据复制到那里,卸载该usr
分区并将新目录移动到。之后usr
别忘了编辑你的。/etc/fstab
答案2
首先,您应该始终检查是否有足够的可用空间。这次,您有。
关于副本:
没那么简单。有些特殊文件的特殊属性并不总是能被正确复制。而不是cp -R
使用
cp -vfa /usr /newusr
如果您想查看当前正在执行的操作,可以使用“-v”标志。
- 不要忘记编辑
/etc/fstab
更改。 - 警告:重新分区后,内核不一定能重新读取新的分区表,因此它可能会继续使用旧的分区表!这非常危险!有关当前分区表的内核版本可以在 中找到
/proc/partitions
,磁盘上的分区表可以用 读取fdisk -l /dev/sda
。如果您当前要更改的分区不匹配,最好的办法是重新启动。
答案3
为了实现这一点,必须在单用户模式下或使用 LiveCD 来执行此操作,这就是您可以在互联网上找到的。
此外,可以在运行时执行此操作(当然有点冒险),但我认为这种方式只适用于 /var,而不适用于/usr,一些运行时库依赖于此文件夹。你可以先在测试机上试一下是否可行。
首先你必须检查是否有任何进程/服务正在使用/写入您要移动的目录。
lsof | grep -E '/usr|/var'
通常 /var 仍用于存放 pid 和 sock 文件,/usr任何库都需要它。
因此,停止/终止出现的服务和进程。
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cupsd 723 root 5u REG 8,1 0 8651393 /var/log/cups/error_log
cupsd 723 root 6u REG 8,1 0 8651908 /var/log/cups/page_log
cupsd 723 root 12u unix 0xffff88020d97d780 0t0 9958 /var/run/cups/cups.sock
在这个简短的例子中,cups 守护进程正在运行并使用这些目录。如果停止它们,它们将不会出现在 lsof 输出中。
之后,您需要当前数据的副本,我建议使用 rsync 而不是 cp(为了保留所有内容、权限、符号链接等)
mkdir /mnt/var
mkdir /mnt/usr
做好备份
rsync -avz /var/* /mnt/var
rsync -avz /usr/* /mnt/usr
卸载文件夹
umount /var
umount /usr
恢复数据
rsync -avz /mnt/var/* /var
rsync -avz /mnt/usr/* /usr
编辑您的/etc/fstab文件并注释/删除条目/var和/usr应该安装在哪里。
然后,您可以启动所有停止的服务或重新启动计算机。如果/usr不起作用,您无法停止守护进程(也许您无法杀死它,因为取决于 init pid),唯一的方法是使用 LiveCD。
虽然您没有提到机器的类型(您的电脑、办公机器、服务器等),但它将取决于此以尽可能正式的方式执行。