无法在 linux 中以原始大小复制共享库的软链接

Unable to copy the shared library's soft links with their original size in linux

我创建了一个1.2M的共享对象,并为那个SO创建了4个软链接。 所有链接的大小为 20B,主链接的大小为 1.2M

20         May 23 10:56 libAbc.so -> libAbc.so.2.0.11.0
20         May 23 10:56 libAbc.so.1 -> libAbc.so.2.0.11.0
20         May 23 10:56 libAbc.so.1.0 -> libAbc.so.2.0.11.0
1.2M        May 23 10:56 libAbc.so.2.0.11.0

虽然我尝试使用 cp 将所有这些文件复制到另一个文件夹,但链接的大小等于主文件。

1.2M May 24 08:07 libABC.so
1.2M May 24 08:07 libABC.so.1
1.2M May 24 08:07 libABC.so.1.0
1.2M May 24 08:07 libABC.so.2.0.11.0

我也用过

cp -s libAgent.so* src/ 

这也因错误而失败

cp: `src/libAgent.so': can make relative symbolic links only in current directory

为什么无法复制原始大小 (20B) 的软链接

复制软件 link 通常复制软件 link 引用的文件,而不复制软件 link.

如果您希望使用 cp 将软件 link 复制为新的软件 link,请指定 -a 选项以cp.

cp -a libAbc.so* /path/to/another/folder

cp信息 页面说:

`-a'
`--archive'
     Preserve as much as possible of the structure and attributes of the
     original files in the copy (but do not attempt to preserve internal
     directory structure; i.e., `ls -U' may list the entries in a copied
     directory in a different order).  Equivalent to `-dpR'.

关键是select命令的"archive"选项用来复制link。 rsync 是一个有效的替代方案,正如 Maxim Egorushkin 指出的那样,如果命令包含适当的命令行参数,rsync 具有复制扩展属性和 ACL 的能力。

rsync -aAX libAbc.so* /path/to/another/folder

rsync 手册页说:

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    --no-OPTION             turn off an implied OPTION (e.g. --no-D)
-A, --acls                  preserve ACLs (implies -p)
-X, --xattrs                preserve extended attributes

在 OP 的用例中,不需要 -A-X

需要注意的是,如果软 link 是相对路径 link,将其复制到新位置可能会使 link 失效,因为它没有指向绝对路径.

例如:

$ ls -al /usr/lib/rpmpopt
lrwxrwxrwx 1 root root 19 2012-05-02 12:40 /usr/lib/rpmpopt -> rpm/rpmpopt-4.4.2.3

cp -a /usr/lib/rpmpopt ${HOME}/tmprsync -av /usr/lib/rpmpopt ${HOME}/tmp 在我的机器上都创建了一个损坏的 link rpmpopt -> rpm/rpmpopt-4.4.2.3 因为我的本地副本没有 rpm子文件夹。在决定复制什么时需要考虑这一事实。

此 link 已损坏,因为 ${HOME}/tmp/rpm 不存在:

$ ls -nl ${HOME}/tmp/rpmpopt
lrwxrwxrwx 1 505 700 19 2016-05-24 10:04 /home/kbulgrien/tmp/rpmpopt -> rpm/rpmpopt-4.4.2.3

rsynccp:

更不容易出错
rsync -av libAgent.so* src/