fuse
从 Ubuntu 服务器 16.04删除有什么副作用?
每次我想从这台机器上删除一部电影时,它就会被重命名为.fuse_hidden<some_long_number>
。
停止电影服务器 (Plex) 并不能解决问题,真正删除该文件的唯一方法是重新启动。我尝试使用lsof
该文件来定位服务,但没有成功。
如果我删除fuse
(sudo apt-get remove --auto-remove fuse
),会出现哪些缺陷?我的系统会变得不稳定吗?
通过删除fuse
,删除文件是否会产生预期的结果?即文件会消失吗?
答案1
简短回答
删除fuse
可能会导致无法挂载文件系统。
FUSE 是用户空间中的文件系统这意味着有一个用户空间程序处理在此特定文件系统上执行的所有操作(而非熔丝文件系统支持在内核空间中工作)。 在你的情况下可能如此ntfs-3g
;即使不是,情况也大致相同。
所有特定的 FUSE 实现都依赖于该fuse
包,并且ntfs-3g
是其中之一(好吧,正式地说它是预依赖,但是这里没什么区别)。这意味着您无法删除fuse
并让ntfs-3g
(或另一个 FUSE 程序)运行。
真正困扰你的是文件的存在.fuse_hidden
(比较:XY问题)我的回答的其余部分讨论了这个问题。
上下文
看起来您可以忽略.fuse_hidden
文件,如下所示:什么是.fuse_hidden
文件以及它们为什么存在?
答案如何删除.fuse_hidden
文件?将 FUSE 行为与 NFS 进行比较:
这与删除另一个系统在 NFS 挂载上打开的文件时发生的情况类似。
并解释了 NFS 行为这里. 来自其中:
如果客户端打开文件并将其删除,会发生什么情况?文件需要保留名称,以便打开它的客户端仍可访问它。但是,当文件被删除时,预计此后不会再存在同名文件。因此,NFS 服务器将打开文件的删除转换为重命名:文件重命名为
.nfs…
(.nfs
后跟一串字母和数字)。
都是因为Linux 中的文件可以被进程打开时删除。此机制在设计上适用于基于 inode 的本地文件系统(如 ext 系列),但如果对文件的访问仅取决于其名称,则需要以某种方式进行模拟。我认为 NTFS 的情况有些复杂。您可以在上面的链接下找到一些有趣的评论和链接。
好吧,ntfs-3g
可以模仿 Windows 的一般行为,并在文件正在使用时拒绝删除它。问题是许多 Linux 程序都希望它们能够删除该文件他们仍然使用。这很聪明。
假设您的程序需要一个临时文件。它会创建一个临时文件,打开它并立即删除 - Linux 确实允许这样做。从现在开始,实际释放磁盘空间(当不再需要该文件时)的任务是其他人的工作:内核或 FUSE。即使您的程序意外死亡或被强制终止,此任务也会得到妥善处理。
另一方面,如果您的程序无法事先删除该文件,则在完成后清理仍是它的工作;意外终止可能会留下“废弃”的临时文件。如果其他人打开了同一个文件怎么办?那么即使程序已完成并且一切正常,您的程序也无法将其删除。
保留这种 Linux 处理文件的方式是件好事。像.fuse_hidden
或 这样的文件.nfs
是这种理念的代价,它们最终会被删除。但假设出了问题,它们就不会被删除。在手动维护期间仍然相对容易发现它们,而在 Windows 中,您可能“遗弃”了文件而不知道。在我看来,Linux 方式更整洁。
一些测试
我的试验台:
# whoami
root
# cat /etc/issue
Ubuntu 16.04.2 LTS \n \l
# uname -a
Linux foobar 4.4.0-59-generic #80-Ubuntu SMP Fri Jan 6 17:47:47 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
# dpkg -l | grep ntfs-3g
ii ntfs-3g 1:2015.3.14AR.1-1ubuntu0.1 amd64 read/write NTFS driver for FUSE
准备挂载点:
# mkdir /mnt/ext4 /mnt/ntfs
准备文件系统:
# truncate -s 20M image-ext4
# truncate -s 20M image-ntfs
# mkfs.ext4 -Fq image-ext4
# mkfs.ntfs -FqQ image-ntfs
(省略了闲聊输出mkfs.ntfs
。)
安装:
# mount image-ext4 /mnt/ext4/
# mount image-ntfs /mnt/ntfs/
初始磁盘使用情况:
# df -h /mnt/ext4/ /mnt/ntfs/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 19M 172K 17M 1% /mnt/ext4
/dev/loop1 20M 2.5M 18M 13% /mnt/ntfs
创建文件:
# dd if=/dev/urandom bs=1M count=10 | tee /mnt/ext4/file > /mnt/ntfs/file
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.645865 s, 16.2 MB/s
磁盘使用情况:
# df -h /mnt/ext4/ /mnt/ntfs/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 19M 11M 6.8M 60% /mnt/ext4
/dev/loop1 20M 13M 7.6M 63% /mnt/ntfs
打开文件,然后删除:
# exec 3<> /mnt/ext4/file
# exec 4<> /mnt/ntfs/file
# rm /mnt/ext4/file /mnt/ntfs/file
磁盘使用情况:
# df -h /mnt/ext4/ /mnt/ntfs/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 19M 11M 6.8M 60% /mnt/ext4
/dev/loop1 20M 13M 7.6M 63% /mnt/ntfs
因此,尽管删除了文件,但磁盘空间仍在使用中。这是因为文件仍处于打开状态。
实际文件:
# ls -A /mnt/ext4/ /mnt/ntfs/
/mnt/ext4/:
lost+found
/mnt/ntfs/:
.fuse_hidden0000000200000001
此时,我复制了文件系统(用于以后比较)。我知道一般情况下,我不应该在它们挂载时执行此操作,但这个想法是在关闭文件之前模拟硬重置。我仍然希望复制的文件系统干净,因此命令sync
。此外,该--reflink=always
选项允许我在 Btrfs 文件系统上创建类似快照的副本,其中image-ext4
和image-ntfs
存储在此测试中;在此测试中,plaincp
应该也可以正常工作。
# sync
# cp --reflink=always image-ext4 copy-ext4
# cp --reflink=always image-ntfs copy-ntfs
我可以检查是否copy-ext4
干净:
# fsck.ext4 copy-ext4
e2fsck 1.42.13 (17-May-2015)
copy-ext4: clean, 11/5136 files, 1849/20480 blocks
不幸的是,这儿没有fsck.ntfs
。
让我们继续使用原始文件系统。关闭文件:
# exec 3>&-
# exec 4>&-
磁盘使用情况:
# df -h /mnt/ext4/ /mnt/ntfs/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 19M 172K 17M 1% /mnt/ext4
/dev/loop1 20M 2.5M 18M 13% /mnt/ntfs
内容:
# ls -A /mnt/ext4/ /mnt/ntfs/
/mnt/ext4/:
lost+found
/mnt/ntfs/:
该.fuse_hidden
文件不再存在并且磁盘空间再次变为可用。当不再需要该文件时,它就会消失。
让我们看看在模拟重置之后,当文件没有正确关闭时会发生什么。安装副本:
# umount /mnt/ext4 /mnt/ntfs
# mount copy-ext4 /mnt/ext4/
# mount copy-ntfs /mnt/ntfs/
磁盘使用情况:
# df -h /mnt/ext4/ /mnt/ntfs/
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 19M 172K 17M 1% /mnt/ext4
/dev/loop1 20M 13M 7.6M 63% /mnt/ntfs
实际文件:
# ls -A /mnt/ext4/ /mnt/ntfs/
/mnt/ext4/:
lost+found
/mnt/ntfs/:
.fuse_hidden0000000200000001
因此,在这种情况下您应该手动删除.fuse_hidden
文件。请注意,如果ntfs-3g
没有创建这样的文件并且首先拒绝删除,您现在就会有一个具有旧名称的剩余文件;即使没有重置,您也会拥有它,这意味着更多的维护。
我相信基于 inode 的文件系统根本不需要这样的维护。
打扫:
# umount /mnt/ext4 /mnt/ntfs
# rmdir /mnt/ext4/ /mnt/ntfs/
# rm image-ext4 copy-ext4 image-ntfs copy-ntfs