如何在 Ubuntu 中复制特殊文件(steam.pipe)?

如何在 Ubuntu 中复制特殊文件(steam.pipe)?

我使用 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 文件?

我曾尝试过:

  1. 以超级用户模式运行nautilus,但仍然失败。
  2. 尝试在目标文件夹中压缩并解压缩此文件,但解压缩steam.pipe文件时出错。
  3. 也可以阅读此链接如何复制或(快速轻松地)备份“特殊文件”?,但却没有取得任何成果。

在此先感谢您的帮助。 :)

答案1

作为穆鲁说,您不必备份steam.pipe。如果丢失,Steam 应该能够重新创建它。但是,在备份~/.steam文件夹时,您应该检查是否还有一个~/.local/share/Steam文件夹。如果有,您可能也想备份它。它通常包含与 Steam 安装相关的大多数文件,包括您安装的 Steam 游戏。

我写了这个答案的其余部分,以防万一:

  • 您想知道为什么使用 Nautilus 复制它时会遇到困难cp
  • 您想知道如何复制类似的文件steam.pipe,以防您确实需要这样做。

执行摘要是你应该用于rsync备份。请参阅下文了解详细信息、解释和替代方案。


为什么steam.pipe特别

steam.pipeFIFO,又称命名管道

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 600mkfifo

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.pidsteam.pipe文件是 Steam 按要求创建的。这两个文件应该从备份中排除。

相关内容