cp复制软链接失效的原因

在学习cp命令时我们会知道复制软链接时,如果要保留链接文件使用-d,但当我们实际操作时却常常出现如下
情况

[root@localhost ~]# ls -l /etc/redhat-release     #此文件为链接文件 lrwxrwxrwx. 1 root root 14 Oct 17 08:48 /etc/redhat-release -> centos-release  
[root@localhost ~]# cp -d /etc/redhat-release /root/redhat.s   #使用-d 保存链接文件属性 
[root@localhost ~]# ls -l /root/redhat.s            #查看可知centos-release是闪烁的,也就是不存在 
lrwxrwxrwx 1 root root 14 Oct 22 09:06 /root/redhat.s -> centos-release  
[root@localhost ~]# cat /root/redhat.s    #看不了/root/redhat.s链接文件 cat: /root/redhat.s: No such file or directory

为什么我们使用cp -d 复制链接文件会失败?那就要看cp -d 是如何复制软链接的。在上例中,我们打算将
/etc/redhat-release软链接复制到/root/redhat.s。在使用cp -d实际上是将原软链接中指针区代表原文件
路径的字符串拷贝到新创建的/root/redhat.s中
下面命令可以看出其文件大小都为14,即centos-release
字符串大小

[root@localhost ~]# ls -l /etc/redhat-release /root/redhat.s  
lrwxrwxrwx. 1 root root 14 Oct 17 08:48 /etc/redhat-release -> centos-release lrwxrwxrwx  
1 root root 14 Oct 22 09:06 /root/redhat.s -> centos-release

当我们查看新建软链接/root/redhat.s时看到原文件路径是centos-release,就会到当前路径(/root/)
上查看centos-release文件,而实际上原文件在/etc/目录下,所以查看/root/redhat.s才会出现
/root/redhat.s: No such file or directory的错误。
根据这个原理我们可以推断,如果原链接文件存的是原文件的绝对路径的话,新建的链接文件就能找到原文件而不是报错,接下来我们实验一下。

#1. 先创建一个软链接/etc/redhat-release2,可知数据区存的是原文件的绝对路径/etc/centos-release 
[root@localhost ~]# ln -s /etc/centos-release /etc/redhat-release2 
[root@localhost ~]# ls -l /etc/redhat-release2 lrwxrwxrwx 1 root root 19 Oct 22 09:37 /etc/redhat-release2 -> /etc/centos-release  
#2. 复制刚创建的软链接/etc/redhat-release2到/root/radhat2.s 
[root@localhost ~]# cp -d /etc/redhat-release2 /root/radhat2.s 
[root@localhost ~]# ls -l /root/radhat2.s lrwxrwxrwx 1 root root 19 Oct 22 09:41 /root/radhat2.s -> /etc/centos-release  
#3. 查看新软链接内容 
[root@localhost ~]# cat /root/radhat2.s CentOS release 6.7 (Final)

cp -d 复制软链接时总结

1. 当原链接文件中存的是原文件的绝对路径:创建的新链接文件可在任何路径下。
2. 当原链接文件中存的是原文件的相对路径:
    例1:
        新链接文件在/root/link2
        相对路径是 centos (来自原链接文件的指针数据区)
        那么/root/centos就是原文件路径
    例2:
        新链接文件为/root/test/link2
        相对路径为../centos
        那么/root/centos为原文件路径
    原文件路径找得到就ok,找不到就报错。

原创文章,作者:lirou,如若转载,请注明出处:http://www.178linux.com/53450

赞 (3)
liroulirou
上一篇 2016-10-25 09:46
下一篇 2016-10-25 09:46

相关推荐

  • CentOS 7 部署LAMP架构(独立服务模式)

    细节要求:(1) 三者分离于三台主机,Httpd与PHP以FastCGI模式通讯; (2) 一个虚拟主机用于提供phpMyAdmin;另一个虚拟主机用于提供wordpress; (3) 部署PHP加速器:xcache; 一、准备CentOS 7主机环境以及Repo仓库提供基于rpm安装包方式的程序包安装源 安装主机程序包规划: 主机1:web-server(…

    Linux干货 2017-02-17
  • Linux磁盘及文件系统

    Linux磁盘及文件系统 一、硬盘 硬盘接口 PATA(Paralled Advanced Technology Attachment,并行的先进技术规范),也叫IDE(Integrated Drive Eelectronics,集成电路驱动设备),是作为一种简单而廉价的接口而开发的。速度中等,容量大而且非常便宜。 串行ATA接口SATA(Serial AT…

    Linux干货 2016-09-19
  • 实现基于MYSQL验证的vsftpd虚拟用户

    马哥教育面授21期 运维 vsftpd MySQL 说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器 一、安装所需要包和包组: 在数据库服务器上安装包: yum –y install mariadb-server mariadb-devel systemctl start mariad…

    Linux干货 2016-12-21
  • 实战keepalived高可用集群解决方案

    Keepalived定义      Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给…

    2017-05-16
  • Http协议三次握手过程

    Http协议三次握手过程   TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧…

    Linux干货 2016-06-22
  • 例图分析软、硬链接

    在linux系统中存在两种链接方式硬链接和软连接,两种链接方式在系统中是完全不同的模式,本文主要详述两种的区别并给与图示; 创建guo ,lin两个文件,两个文件分别用于演示软连接和硬链接     图一:创建文件   创建软连接guo.ruan1     图二:创建软连…

    Linux干货 2016-10-29