什么是符号链接?
简单来说,符号链接在Linux中就像Windows的“快捷方式”。它是一个特殊的文件,其内容是指向另一个文件或目录的路径。在ls -l命令下,它们通常会以 l 开头,并显示一个箭头指向目标,例如:link_name -> /path/to/original_directory。

Buildroot和Linux内核中的符号链接
在复杂的编译项目(如Buildroot和Linux内核)中,符号链接被广泛使用。例如,在Buildroot的output目录中,经常会有这样的结构:

output/build/linux-custom/source 可能是一个指向项目根目录下实际内核源代码的符号链接,比如 ../../linux-5.15.4。

或者存在一些指向父目录的链接,如 parent -> ..。

scp 的问题行为
当您使用 scp -r (递归复制) 来拉取整个目录时,scp 的默认行为是“跟随”符号链接。它不会把链接本身复制过来,而是会把链接指向的实际内容复制过来。

这就是导致无限循环的根源:

假设scp正在复制 /path/to/project/output/ 目录。

它遇到了一个符号链接 source,这个链接指向了上层目录 /path/to/project/。

scp 会跟随这个链接,开始复制 /path/to/project/ 的所有内容,并把它们放到本地的 .../project/output/source/ 目录下。

在这个新复制的目录里,它又会遇到 output/ 目录和里面的 source 链接,于是再次重复这个过程。 最终形成这样的无限嵌套结构,直到您的磁盘空间被占满或达到文件系统的其他限制。


使用 rsync (最推荐的专业方案)
rsync 是一个比 scp 更强大、更智能的文件同步工具,它能完美地处理符号链接。

rsync 默认不会跟随符号链接,而是将它们作为链接本身复制过来,这正是您所需要的。

-a: 归档模式,包含了 -l (保留链接) 等一系列常用参数
-v: 显示详细过程
-z: 压缩传输,提高效率
--progress: 显示传输进度
rsync -avz --progress <用户名>@<远程服务器IP>:/path/to/remote/project /path/to/your/local/directory

rsync -avz --progress ronz@192.168.6.23:/ws ./

标签: none

评论已关闭