sta*_*dja 3 linux ssd command-line
有人可以向我解释以下答案: 如何使用 Linux Mint 18 将 SSD 克隆到更大的 SSD
怎么了:
pv < /dev/sdX > /dev/sdY
Run Code Online (Sandbox Code Playgroud)
PV => 用于计时其他命令的命令,但“<源磁盘>”是什么?
我真的很想了解为什么这个答案有效。
Linux 中的许多命令旨在在管道中工作。这意味着您可以像这样链接它们:
command1 | command2 | … | commandN
Run Code Online (Sandbox Code Playgroud)
在这种情况下,标准输出 (stdout)command1的标准输入 (stdin)command2等等。一个命令可能会也可能不会使用它的 stdin/stdout,这取决于它的设计和你提供的选项+操作数。您可以阅读手册以了解哪些命令可以这样工作。
管道符号 ( |) 属于shell 语法。shell 负责安排命令之间的连接(管道)。
在上面的例子command1中没有前任,commandN在管道中也没有后继。在这种情况下,stdin ofcommand1和 stdout of 分别commandN连接到 shell 认为其 stdin 和 stdout 的任何内容。通常是终端。
您可以根据需要更改它。例子:
command1 <input | command2 | … | commandN >output
Run Code Online (Sandbox Code Playgroud)
input和output是文件(注意这是一个广义的术语)。现在,如果command1从它的标准输入读取,那么它从input; 如果commandN写入其标准输出,则写入output. (更多:如果command1对其 stdin 执行任何操作,则它会执行其他操作input;例如,通常可以写入 stdin 或从 stdout 读取,因为这些只是文件描述符;这种情况很少见,不用担心)。
我更喜欢更清楚地显示数据流的语法(比较这个答案):
<input command1 | command2 | … | commandN >output
Run Code Online (Sandbox Code Playgroud)
如果每个命令都被设计(并配置了适当的选项+操作数)从它的标准输入读取并写入它的标准输出,那么数据将从input到output. 每个命令都会对数据流做一些事情(在这种情况下,“无变化”也是“某事”),并将其进一步传递到管道中。通过这种方式,您可以链接许多影响数据的“效果”。像这样工作的命令称为过滤器(尤其是在它们处理文本数据时)。
在 Unix 哲学中,一个工具应该做一件事并且把它做好。这个想法是使用许多简单的、定义明确的工具来实现你想要的。通常这意味着链接许多过滤器以获得复杂的过滤器。
在频谱的另一端,存在命令数量为一个的情况。您可以只用一个命令读取input、执行某些操作并写入output:
<input command1 >output
# or equivalently
command1 <input >output
# or (extra spaces allowed)
command1 < input > output
Run Code Online (Sandbox Code Playgroud)
同样,该命令需要设计为这样工作。许多是,有些不是。如果您没有指定任何输入文件的路径(作为命令行操作数)或指定的路径是字面上的-(约定),则某些命令会从其标准输入中读取。阅读相应的文档以了解特定命令的行为方式。
有问题的命令
Run Code Online (Sandbox Code Playgroud)pv < /dev/sdX > /dev/sdY
相当于
</dev/sdX pv >/dev/sdY
Run Code Online (Sandbox Code Playgroud)
并且pv旨在像这样工作。您可能认为< /dev/sdX >是将/dev/sdX操作数提供给 的某种形式(语法)pv。它不是。< /dev/sdX和> /dev/sdY是两个单独的重定向,实际的命令是唯一的,pv没有参数。
由于 how pvis 能够使用它的 stdin 和 stdout,整行的意思是“从 读取/dev/sdX,对数据流做一些事情(无论pv做什么)并写入/dev/sdY”。
pv 也会明白这一点:
pv /dev/sdX >/dev/sdY
Run Code Online (Sandbox Code Playgroud)
在这种情况下,/dev/sdX是 的命令行参数pv。该工具将从指定的文件中读取并忽略其标准输入(仅因为它被设计为以这种方式工作),因此效果基本相同。
你的目标是克隆,所以想要的“要做的事情”是“没有变化”;您想“从 读取/dev/sdX,不做任何更改并写入/dev/sdY”。最基本的“不改变”的程序(命令)是cat. 那为什么pv?
有很多命令可以做“不改变”。对于特定命令,执行“无更改”的能力可能是因为:
执行“无更改”的命令示例:
</dev/sdX cat >/dev/sdY
的主要目的cat是连接许多文件(数据流)。当没有指定文件时(如本例),使用标准输入。当只有一个输入流时,您会得到“无变化”。
</dev/sdX tee >/dev/sdY
的主要目的tee是分叉流。一份副本进入标准输出,每个指定的文件也获得一份副本。当没有指定文件时(就像在这种情况下),你只会得到一份到标准输出的副本,“没有变化”。
</dev/sdX dd >/dev/sdY
dd是克隆块设备的常用工具(比较这个答案),但有一些怪癖。传统上会使用if=/dev/sdXand of=/dev/sdY,没有它们分别使用 stdin 和 stdout 。并且您想bs=用于性能。某些选项或情况可能会使输出流与输入不同,但通常仍会“没有变化”(dd退出时还有一些统计信息到 stderr )。
</dev/sdX pv >/dev/sdY
这将显示您的进度和吞吐量。通过适当的选项,您可以限制吞吐量。数据流没有被破坏,所以你得到“没有变化”。
</dev/sdX mbuffer >/dev/sdY
有点类似于pv,另外您可以选择它使用的缓冲区的大小(在内存中或在文件中)。数据流没有被破坏,所以你得到“没有变化”。
请注意,还有另一种工具可以“从 读取input,不做任何更改并写入output。它是cp。通常您指定这样的文件:
cp input output
Run Code Online (Sandbox Code Playgroud)
这可能不明显,但cp可以克隆/dev/sdX到/dev/sdY:
cp /dev/sdX /dev/sdY
Run Code Online (Sandbox Code Playgroud)
该工具并非设计为使用其标准输入或标准输出,它需要路径。这将不起作用:
</dev/sdX cp >/dev/sdY
在现代 Linux 中,您可以cp像这样使用它的 stdin 和 stdout:
<input cp /dev/stdin /dev/stdout >output
# or
<input cp /proc/self/fd/0 /proc/self/fd/1 >output
Run Code Online (Sandbox Code Playgroud)
凡/dev/stdin与/dev/stdout链接/proc/self/fd/0和/proc/self/fd/1分别。这些是内核提供的特殊文件。如果任何进程尝试打开/proc/self/fd/0,它将获得自己的标准输入。与/proc/self/fd/1和标准输出类似。通过这种方式,您可以强制一些对管道不友好的进程使用重定向或在管道中工作。它几乎没有用处,并且可能存在一些问题(由于原因,通常命令对管道不友好),我不会详细说明。
| 归档时间: |
|
| 查看次数: |
1432 次 |
| 最近记录: |