Human0722's blog Human0722's blog
首页
  • Spring

    • Spring Framework
    • Spring Boot
    • Spring Cloud
  • CCNA
  • Vue

    • Vue2
日本语
导航
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Human0722

Gravity always win
首页
  • Spring

    • Spring Framework
    • Spring Boot
    • Spring Cloud
  • CCNA
  • Vue

    • Vue2
日本语
导航
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 软链接 硬链接

Xueliang
2020-11-29
OS
目录

软链接 硬链接

基于 ext2 文件系统的理解

# 1. 一些结构体

在 Linux 系统下,一切皆文件,目录也不例外。 目录文件中存储的内容,就是一个个 dir_entry 结构体。 每个结构体对应该目录下的一个文件,存储着文件的相关信息。在 ext2 文件系统中,它的结构入下:

struct ext2_dir_entry_2 {
    __u32 inode;    /* Inode number */
    __u16 rec_len;  /* Directory entry length */
    __u8 name_len;  /* Name length */
    char name[255]; /* File name */
}
1
2
3
4
5
6

其中, 最重要的字段是 inode, 文件数据的存储位置等其他重要信息都存储在里面。inode 结构体内容复杂,对于理解链接来讲,下面的部分足够 :

struct ext2_inode {
    // ...
    __u16 i_links_count;    // 有多少个 dir_entry 结构体引用了它
    // ...
    __u32 i_block[EXT2_N_BLOCKS];   // 数据块指针数组,以此来找到文件的真正数据
}
1
2
3
4
5
6

# 2. 一个实验

在 Linux 下创建软链接和硬链接

> mkdir link
> cd link
> echo "hello" >> test.txt
> ln test.txt hardtest1
> ln test.txt hardtest2
> ln -s test.txt softtest
1
2
3
4
5
6

使用 ll -i 查看文件( -i 命令可以查看文件的 inode 编号)

[root@localhost link]# ll -i
总用量 12
18083458 -rw-r--r--. 3 root root 6 11月 29 02:20 hardtest1
18083458 -rw-r--r--. 3 root root 6 11月 29 02:20 hardtest2
18083459 lrwxrwxrwx. 1 root root 8 11月 29 02:20 softtest -> test.txt
18083458 -rw-r--r--. 3 root root 6 11月 29 02:20 test.txt
1
2
3
4
5
6

第一个字段是 inode 编号, 第三个字段是引用计数。
hardtest1、hardtest2、test.txt的 inode 编号都一样, 且引用计数刚好是3.说明硬链接和原文件共用了一个 inode。
软链接文件的内容是原文件的地址,可以通过 readlink 命令查看软链接的内容。

# 3. 一张图

link

# 4. 一些现象

在 Macos 上共享文件夹给虚拟机中的 CentOS, 即使 CentOS 在这个文件夹中有读写权限,也是无法创建硬链接的。反过来也一样,但是软链接是可以的。问题在于文件系统不一样。

上次更新: 2022/05/06, 18:09:58
最近更新
01
DefineSprintBootStarter
03-23
02
Spring MVC 启动流程分析
03-23
03
Redis
03-23
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Human0722 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式