热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux创建文件软连接和硬链接详解

前言
  1. 前言

linux系统中链接文件仔细区分可以分为软连接(符号链接)硬链接。软链接比硬链接应用更广泛,所以也可以认为linux链接文件就是指软链接文件。

本文将会在第2部分介绍创建软链接和硬链接的基本命令,在第3部分从linux文件系统的角度出发,深入分析软连接和硬链接的区别。如果只是想简单了解一下如何创建链接文件,看第2部分内容即可。

  1. 创建链接文件的基本命令

2.1 创建连接的基本命令

都是通过命令ln创建,通过参数选项-s来区分软链接和硬链接。命令如下:

ln [选项] 源文件 目标文件 # ln 是link缩写

选项参数:

  • -s 表示创建软链接,没有选项“-s”则是创建硬链接。

  • -f 强制。如果链接文件已经存在,则会删除原来的文件重新创建

下面以linux系统中编译器的gcc文件举例,展示如何如何创建软链接和硬链接。

首先,通过which命令查看gcc所在的位置:

显示结果如下:

在/opt2/test目录下面分别创建一个gcc的软链接gcc-soft和硬链接gcc-hard:

ln -s /usr/bin/gcc /opt2/test/gcc-soft # 软链接
ln /usr/bin/gcc /opt2/test/gcc-hard # 硬链接

需要注意的是,创建软链接时,源文件必须写绝对路径

cd到test目录下面,通过ls -l查看创建的软链接文件:

从上面的图可以看到:

  • 软链接文件的属性显示为l(link file),硬链接为-。文件属性详细内容可参考文章:文件属性查看。

  • 软链接文件会显示指向/usr/bin/目录下的源文件gcc,硬链接则不会显示。

最后可以简单测试一下创建的链接文件:

可以看到软链接和硬链接文件都可以执行成功,与源文件命令gcc --version效果一样,说明链接文件创建成功。

2.2 链接文件的删除

无论时软链接还是硬链接,删除都很简单,和普通文件一样,都是使用rm命令删除。例如:

rm -f gcc-soft # 删除软链接文件

这里需要注意的时:

  • 删除软链接或硬链接都不会影响到原来的文件

  • 如果删除原来的文件,软链接就会找不到源文件出错,硬链接依然可以。

  1. 软链接和硬链接的区别

3.1 linux文件系统

简单来讲linux ext4文件系统下,每个文件(包含目录)由inode、block两个部分组成。每个inode和block都有编号,根据编号都可以找到相关的inode或者block,也就可以获取文件的内容了。

  • inode,一般占内存较小,默认为128byte,用来记录文件的属性(rwx)、拥有者以及对应的block号。

  • block,占内存较大,默认为4kb。用来保存文件的真正内容

需要对block中保留的真正内容做一个说明,对于非目录文件来说,真正内容就是具体的数据、文本等;对于目录文件来说,真正内容就是目录下面子目录、文件的名称和inode号。

下面以test目录为例,test目录下面有个hello.txt文本文件,里面内容是hello world!,还有一个子目录subdir,子目录里面包含一个文件data.dat,里面有保存了一些数据。test目录结构如下:

那么test目录下面的文件的inode和block关系示意图如下:

说明:

  • 黑色数字代表inode号,红色数字代表block号。号码是随意取的,这里注意其中的对应关系即可

  • block黄色背景的是目录的block,白色背景的文件的block

如果要查找data.dat文件,查找顺序如下:

首先根据test目录的inode节点中的block号1000找到block1000 -- > 根据block1000中得知subdir的inode号2 -- > inode2中保存subdir block号为1002 --> block1002中data.dat inode号为3 --> inode3中保存的data.dat的block号1003 --> block1003中存储data.data的具体内容。

最后得到inode3就得到了data.dat的权限属性拥有者,而block1003中保存了实际内容。

3.2 软链接与硬链接

考虑给在tmp1目录下面给hello.txt增加一个软链接文件hello-soft.txt, 在tmp2目录下面给hello.txt增加一个硬链接文件hello-hard.txt.

从下的示意图可以看到:

  • 增加软链接,会增加一个inode号2和对应的block1002,block1002中记录了源文件hello.txt的inode号1,故最终可以链接到源文件

  • 增加硬链接,实际上并没有增加inode和block。只是在原来天tmp2目录的block中增加了一个inode号记录,好像hello.txt也是tmp2目录下的文件一样。

参考:

http://c.biancheng.net/view/740.html


推荐阅读
  • 在DELL Inspiron 14R上部署CentOS X64 6.4的详细步骤
    本文详细记录了在DELL Inspiron 14R笔记本电脑上安装CentOS X64 6.4操作系统的过程,包括遇到的问题及解决方法。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 深入理解动态链接库及其应用
    本文将探讨动态链接库的基本概念,包括Windows下的动态链接库(DLL)和Linux下的共享库(Shared Library),并详细介绍如何在Linux环境中创建和使用这些库。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中安装MySQL 5.5.37时遇到的启动失败和PID文件问题,并提供了详细的解决方案,包括日志分析、权限检查等步骤。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有