我最近/home
使用 BTRFS 格式化了我的分区,但由于这是我第一次接触这个 FS,所以我不知道子卷。
昨天我重新安装了 Linux Mint 并选择将现有的主分区挂载为/home
.现在我很惊讶,我的文件首先似乎丢失了,但后来我注意到 Linux Mint@home
在我现有的用户主文件夹旁边创建了一个名为的子卷。
当前情况是以下磁盘布局: 250 GiB SSD -- 64 GiB / (BTRFS) -- 8 GiB 交换 -- ~170 GiB /home (BTRFS)
当我尝试移动我的主文件夹放入@home
子卷后,我收到错误,说剩余空间不足(?!),尽管此分区上还剩下约 50 GiB,我想移动而不是复制文件。我现在没有其他磁盘可以重新格式化为任何非 NTFS 格式,而这需要保留任何符号链接。
现在我有一个问题:如何正确地将文件从文件夹移动到子卷中?为什么移动文件不起作用?
答案1
您可以尝试使用cp -a --reflink=always /home/<whatever> /home/@home/
.就 Linux VFS(虚拟文件系统)而言,这是一个真实的副本,但在 BTRFS 中,文件将共享相同的块/扩展,因此在修改文件之前不需要额外的空间。
如果复制成功,请修改/etc/fstab
以挂载子卷而不是整个文件系统:
/dev/sdXn /home btrfs subvol=@home
然后,重新启动。如果一切顺利,您可以删除原始文件:
mount /dev/sdXn /mnt
pushd /mnt
rm -fR <whatever>
popd
umount /mnt
当然,在尝试执行任何操作之前您应该进行备份。
下一个
一旦一切都好起来请阅读BTRFS 维基,特别是下面的所有文章指南和使用信息。 BTRFS 非常简洁,但它不像传统的 Linux 文件系统(extN、ReiserFS 等)那样工作。这不是人们可以跳进去然后边走边弄清楚的事情之一。要很好地使用 BTRFS,您必须知道自己在做什么。阅读文档是做到这一点的最佳方法。
我碰巧喜欢 BTRFS,希望你也喜欢它。
答案2
如果其他人也尝试使用mv
在子卷之间移动数据,根据https://unix.stackexchange.com/a/152639/81744听起来它应该工作/速度快(reflinks应该是自mv
coreutils 8.24以来的默认模式):我在linux-4.14.15-arch上使用coreutils-8.29进行的实际测试表明正在创建副本而不是文件系统内部链接(df
显示文件系统大小增加,这对于 来说显得很奇怪mv
,尤其是对于引用链接)。
因此https://unix.stackexchange.com/a/377734/81744即使使用较新版本的 coreutils,它仍然是正确的答案,它应该默认为mv
.
(我会评论当前的最佳答案来添加此信息,但我需要 50 声望,而我还没有。)
答案3
我也被同样的问题所困扰。为了更轻松地进行快照管理而分成/home
几个部分变成了长达一周的噩梦。cp --reflink=always
由于某种原因不起作用(向我抛出了太多错误,我迷失在其中)。
我最后找到的答案既简单又明显,我很惭愧我以前没有想到这一点。
- 快照原始子卷。
- 在快照中,删除不需要的所有内容,然后移动您需要的数据到快照的根目录。大多数情况下它将是目录。它又快又便宜。
- 确保快照根上的 ACL 符合您的预期。
- 将新子卷安装到您想要的位置。
如果您以前尝试过跨卷移动,但作为一名优秀的系统管理员,在“以防万一”之前制作了快照,那么有一个简单的脚本可以清理错误的子卷:
# cd /your/erroneous/subvolume
# find . -type f -exec cmp --silent '{}' '/your/good/snapshot/{}' \; -delete
这将从错误的子卷中删除与保留快照上的文件相同的所有文件。不要尝试将“其余部分”重新同步到快照中。可能存在部分复制的文件,并且您将丢失数据。手动检查残留物并仅复制您实际需要的内容。
这是cp --reflink=always
“无效的跨设备链接”错误的答案:这并不意味着 FS 有问题,这只是内核从范围到文件名的映射的工作方式(如果您指定)已安装子卷作为目标。安装你的根FS,进入该目录并从那里使用相对路径进行工作。一切都会好起来的。