我使用 Ubuntu 有一段时间了,遇到过这个问题:
我现在使用的是 ubuntu 14.10,我的/home/user/.steam
文件夹中安装了 Steam。当我复制.steam
主目录中的文件夹并且进度条接近末尾时,它显示一条消息,指示“无法复制特殊文件 steam.pipe”,听起来或多或少就是这样。
自从使用 Ubuntu 14.04 以来,我就遇到了这个问题,但我知道这不是发行版/版本问题,而是文件复制问题。幸运的是,我可以通过在我的.steam
文件夹中使用命令来解决这个问题:
sudo cp -f ./steam.pipe /[destination]
最终,直到今天,我无法使用上面的命令复制此文件。终端停留在:
Idad@IdadComp:/home/Idad/.steam$sudo cp -f ./steam.pipe /[destination]
并没有回到
Idad@IdadComp:/home/Idad/.steam$
表示复制过程尚未完成。
我的问题是,我如何复制这个 steam.pipe 文件?
我曾尝试过:
- 以超级用户模式运行nautilus,但仍然失败。
- 尝试在目标文件夹中压缩并解压缩此文件,但解压缩
steam.pipe
文件时出错。 - 也可以阅读此链接如何复制或(快速轻松地)备份“特殊文件”?,但却没有取得任何成果。
在此先感谢您的帮助。 :)
答案1
作为穆鲁说,您不必备份steam.pipe
。如果丢失,Steam 应该能够重新创建它。但是,在备份~/.steam
文件夹时,您应该检查是否还有一个~/.local/share/Steam
文件夹。如果有,您可能也想备份它。它通常包含与 Steam 安装相关的大多数文件,包括您安装的 Steam 游戏。
我写了这个答案的其余部分,以防万一:
- 您想知道为什么使用 Nautilus 复制它时会遇到困难
cp
。 - 您想知道如何复制类似的文件
steam.pipe
,以防您确实需要这样做。
执行摘要是你应该用于rsync
备份。请参阅下文了解详细信息、解释和替代方案。
为什么steam.pipe
特别
steam.pipe
是FIFO,又称命名管道:
ek@Io:~/.steam$ ls -l steam.pipe
prw------- 1 ek ek 0 Mar 7 20:12 steam.pipe
ek@Io:~/.steam$ file steam.pipe
steam.pipe: fifo (named pipe)
FIFO 不是常规文件,而是特殊的文件系统条目,可以像文件一样进行交互写入 FIFO 会将数据存储在内存中,直到从 FIFO 读取数据为止,数据都会一直保留在内存中。从 FIFO 读取数据时,会按照写入的顺序获取数据(因此是先进先出)。
为什么你很难复制它
当尝试复制 FIFO 时,实际上可能有两种不同的行为。具体哪种行为取决于具体情况。
- 您可能想要复制 FIFO,即创建另一个 FIFO。(在这种情况下,这就是您想要的。)
- 您可能想要从 FIFO 读取数据,即复制其内容。(这似乎不像“复制”,但请记住,这类似于复制文件时发生的情况 - 打开文件,读取其数据,然后将相同的数据写入新文件。)
您尝试了两个程序:
- Nautilus 会自动检测特殊条目(例如 FIFO),拒绝从中复制,并在执行复制时发出警告。
cp
从 FIFO 读取数据,而不是复制 FIFO 本身。如果 FIFO 中没有数据,则cp
暂停,直到某个进程写入数据。
复制特殊文件(如 FIFO)
要复制 FIFO,您可以使用rsync
以下--specials
标志:
ek@Io:~$ cd steam-backup
ek@Io:~/steam-backup$ rsync --specials ~/.steam/steam.pipe .
ek@Io:~/steam-backup$ ls -l steam.pipe
prw------- 1 ek ek 0 Apr 22 11:43 steam.pipe
如果您想要单独复制它,则可以使用以下命令。要复制整个文件夹以用于存档目的(即,您希望其中的大多数内容保持原样,以便在恢复时正常工作),您可以使用rsync -a
:
rsync -a .steam/ steam-backup
有关更多信息rsync
,请参阅Ubuntu 帮助 wiki 中的“rsync”, 这上游 rsync 网站, 和man rsync
(具体解释了该-a
标志的作用)。
cp
非常适合简单的用例,但我建议rsync
进行备份。
特价商品也可以存档
备份文件夹的另一种方法是使用以下方法将其存档:tar
,并且还将自动保留 FIFO(即,它们将在提取时重新创建):
ek@Io:~$ tar cvJf steam-backup.tar .steam
.steam/
.steam/registry.vdf
.steam/sdk32
.steam/bin64
.steam/root
.steam/steam_install_agreement.txt
.steam/steam
.steam/steam.pipe
.steam/steam.pid
.steam/bin
.steam/sdk64
.steam/bin32
手动重建 FIFO
如果你丢失了 FIFO(无论是在备份中还是在一般情况下),并且需要恢复它,你可以创建一个新的mkfifo
。
您需要使用正确的权限来创建它。运行ls -l
显示steam.pipe
权限掩码prw-------
。p
这只意味着它是一个命名的页ipe(FIFO)。其余表示它可由其所有者读取和写入,并且没有其他权限(请参阅文件权限了解详情)。八进制权限掩码因此是 600(或 0600),所以您需要传递-m 600
给mkfifo
:
ek@Io:~/steam-backup$ mkfifo -m 600 steam.pipe
ek@Io:~/steam-backup$ ls -l steam.pipe
prw------- 1 ek ek 0 Apr 22 12:09 steam.pipe
复制 FIFO 不会复制其“内容”
这对于备份来说不是问题,但您应该知道复制 FIFO(例如,使用rsync
)只会生成一个类似的新 FIFO。如果 FIFO 中有可供读取的数据,则新 FIFO 中将不会提供这些数据。
这对备份来说不是问题,因为 FIFO 不适用于长期存储。它们实际上根本不适合存储。FIFO 中的数据不会写入磁盘,并且当进程写入 FIFO 时,在数据被读取之前,写入甚至不会向进程报告为成功。(类似地,如果进程从没有数据的 FIFO 读取数据,则读取将停止,直到数据被写入。)
您可以亲眼见证这一过程,还可以通过自己制作一个并试验它来更好地了解 FIFO 的工作原理。您可以使用 创建foo
具有默认权限的新 FIFO mkfifo foo
,并使用类似 的命令将文本重定向到它echo 'Hello, world!' > foo
。这会停滞,因为还没有任何东西读取文本。然后,在另一个终端(例如,另一个终端选项卡)中,使用 读取文本,cat foo
并查看每个终端中发生的情况。
答案2
您不应该复制它。steam.pid
和steam.pipe
文件是 Steam 按要求创建的。这两个文件应该从备份中排除。