Linux下的硬链接和符号链接

本文详细阐述了硬链接和软链接的区别,包括它们的工作原理、如何创建以及删除原文件后的影响。通过实验对比,展示了两种链接方式下inode数量的变化情况。

硬链接和软链接的几点区别: 

 

 

1.硬链接文件和原文件指向同样的数据块,有相同的inode号和文件属性,当删除原文件时,硬链接文件仍然存在有效。但硬链接文件不同于文件的复制。应该说硬链接文件的产生只是原文件所在目录文件的内容发生改变,原文件的数据并没有得到复制,而复制文件,磁盘上有两份数据。简单说,硬链接就是一个类似于别名的概念。当原来的名字没有了,别名照样可以使用。

 

 

2.符号链接也称为软链接,它是包含在文件中的路径名。当系统遇到符号链接时,它沿着符号链接提供的路径名前行,然后继续沿着符号链接后面的任何其余路径前行。如果路径名以一个 / 开始,则系统返回到 /(“根”)目录,并从该目录开始沿着路径前行。如果路径名未以 / 开始,则系统返回到前一级目录,并从那个目录开始沿着符号链接中的路径名前行。符号链接和windows系统的快捷方式含义一样,是新文件,和原文件的inode不同,该文件的内容是指向原文件的路径信息。

 

3.软链接就好像是指针一样。而硬链接就是引用。

 

实验举例:

 

硬链接时,新增加一个 inode 链接到文件的数据块;而符号链接时,只是新创建了一个文件,它指向所链接的文件。

 

# 1. 使用文件 /oradata2/yct/rc.local 进行测试

 

[oracle@sbdatabase yct]$ pwd

/oradata2/yct

[oracle@sbdatabase yct]$ ll

total 4

-rwxr-xr-x 1 oracle dba 220 Dec 9 16:30 rc.local

[oracle@sbdatabase yct]$ more rc.local 

#!/bin/sh

#

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style init stuff. touch /var/lock/subsys/local

 

# 2. 进行硬链接,inode 数增加

 

[oracle@sbdatabase yct]$ ln rc.local rc.local_hard.ln

[oracle@sbdatabase yct]$ ll

total 8

-rwxr-xr-x 2 oracle dba 220 Dec 9 16:30 rc.local

-rwxr-xr-x 2 oracle dba 220 Dec 9 16:30 rc.local_hard.ln

 

# 3. 进行符号链接,inode数并没有增加

 

[oracle@sbdatabase yct]$ ln -s rc.local rc.local_soft.ln

[oracle@sbdatabase yct]$ ll

total 8

-rwxr-xr-x 2 oracle dba 220 Dec 9 16:30 rc.local

-rwxr-xr-x 2 oracle dba 220 Dec 9 16:30 rc.local_hard.ln

lrwxrwxrwx 1 oracle dba   8 Dec 9 17:03 rc.local_soft.ln -> rc.local

 

# 4. 删除原文件后,硬链接仍可用,而符号链接失效

 

[oracle@sbdatabase yct]$ rm rc.local

[oracle@sbdatabase yct]$ ll

total 4

-rwxr-xr-x 1 oracle dba 220 Dec 9 16:30 rc.local_hard.ln

lrwxrwxrwx 1 oracle dba   8 Dec 9 17:03 rc.local_soft.ln -> rc.local

[oracle@sbdatabase yct]$ more rc.local_hard.ln 

#!/bin/sh

#

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style init stuff. touch /var/lock/subsys/local

[oracle@sbdatabase yct]$ more rc.local_soft.ln 

rc.local_soft.ln: No such file or directory

 

# 5. 硬链接不能链接目录

 

[oracle@sbdatabase yct]$ rm -r *

[oracle@sbdatabase yct]$ ll

total 0

[oracle@sbdatabase yct]$ mkdir t1

[oracle@sbdatabase yct]$ ln t1 t1_hard.ln

ln: `t1': hard link not allowed for directory

[oracle@sbdatabase yct]$ ln -s t1 t1_soft.ln

[oracle@sbdatabase yct]$ ll

total 4

drwxr-xr-x 2 oracle dba 4096 Dec 9 17:09 t1

lrwxrwxrwx 1 oracle dba    2 Dec 9 17:09 t1_soft.ln -> t1

[oracle@sbdatabase yct]$

### Linux 中创建硬链接符号链接的命令 在 Linux 系统中,`ln` 命令用于创建文件或目录的链接。根据链接类型的不同,可以分为硬链接hard link符号链接(软链接,symbolic link)。以下是具体的命令示例及说明。 #### 创建硬链接 硬链接是对文件内容的直接指向,所有硬链接共享相同的 inode 文件数据。创建硬链接时,目标文件必须是一个普通文件,不能是目录。 命令格式: ```bash ln [源文件] [目标文件] ``` 示例: 假设有一个文件名为 `file1.txt`,要为它创建一个硬链接 `file1_hardlink.txt`,可以执行以下命令: ```bash ln file1.txt file1_hardlink.txt ``` 此时,`file1.txt` `file1_hardlink.txt` 共享同一个 inode 文件数据[^1]。 #### 创建符号链接 符号链接类似于 Windows 系统中的快捷方式,它存储的是指向目标文件或目录的路径。符号链接可以指向文件或目录,并且支持跨文件系统操作。 命令格式: ```bash ln -s [源文件或目录] [目标链接名] ``` 示例: 假设有一个文件名为 `file2.txt`,要为它创建一个符号链接 `file2_symlink.txt`,可以执行以下命令: ```bash ln -s file2.txt file2_symlink.txt ``` 此时,`file2_symlink.txt` 是一个符号链接,指向 `file2.txt` 的路径[^2]。 如果需要为一个目录创建符号链接,例如将 `/home/user/docs` 目录链接到 `/usr/local/docs`,可以执行以下命令: ```bash ln -s /home/user/docs /usr/local/docs ``` #### 注意事项 - 硬链接无法跨越不同的文件系统。 - 符号链接可以指向不存在的文件或目录,而硬链接必须基于已存在的文件。 - 删除原文件后,硬链接仍然有效,但符号链接会失效[^3]。 ### 示例代码 以下是完整的命令示例: ```bash # 创建硬链接 ln file1.txt file1_hardlink.txt # 创建符号链接 ln -s file2.txt file2_symlink.txt # 为目录创建符号链接 ln -s /home/user/docs /usr/local/docs ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值