Hard link and soft link in Linux

在Linux系统中,内核为每个新建立的文件分配一个Inode(索引结点),每一个文件都有一个唯一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。 html

硬连接说白了是一个指针,指向文件索引节点系统并不为它从新分配inode。能够用:ln命令来创建硬连接。语法: node

ln [options] existingfile newfile
ln [options] existingfile-list directory
用法: 

第一种:为”existingfile”建立硬连接,文件名为”newfile”。 linux

第二种:在”directory”目录中,为 ”existingfile-list”中包含的全部文件建立一个同名的硬连接。经常使用可选[options] –f 不管”newfile”存在与否,都建立连接。-n 若是”newfile”已存在,就不建立连接。 ide

 因为硬连接是有着相同 inode 号仅文件名不一样的文件,所以硬连接存在如下几点特性: this

  • 文件有相同的 inode 及 data block;
  • 只能对已存在的文件进行建立;
  • 不能交叉文件系统进行硬连接的建立;
  • 不能对目录进行建立,只可对文件建立;
  • 删除一个硬连接文件并不影响其余有相同 inode 号的文件。

软连接与硬连接不一样,若文件用户数据块中存放的内容是另外一文件的路径名的指向,则该文件就是软链接。软连接就是一个普通文件,只是数据块内容有点特殊。软连接有着本身的 inode 号以及用户数据块(见 图 2.)。所以软连接的建立与使用没有相似硬连接的诸多限制: spa

  • 软连接有本身的文件属性及权限等;
  • 可对不存在的文件或目录建立软连接;
  • 软连接可交叉文件系统;
  • 软连接可对文件或目录建立;
  • 建立软连接时,连接计数 i_nlink 不会增长;
  • 删除软连接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死连接(即 dangling link,若被指向路径文件被从新建立,死连接可恢复为正常的软连接)。

(1)因为不一样的分区会有相同的inode及硬链接的特殊性和文件系统的可卸载性,致使硬链接不允许跨文件系统(分区)!而 soft link 具备完整的 pathname,因此他能够跨越不一样文件系统。 unix

(2) 硬链接不会建产新的inode,硬链接无论有多少个,都指向的是同一个inode节点,只是新建一个hard link会把结点链接数增长,只要结点的链接数不是0,文件就一直存在,无论你删除 的是源文件仍是链接的文件。只要有一个存在,文件就存在(其实也不分什么源文件链接文件的,由于他们指向都是同一个 inode节点)。当你修改源文件或者链接文件任何一个的时候,其余的文件都会作同步的修改 。 指针

      软连接不直接使用inode节点号做为文件指针,而是使用文件路径名做为指针。因此删除链接文件对源文件无影响,可是删除源文件,链接文件就会找不到要指向的文件。软连接有本身的inode,并在磁盘上有一小片空间存放路径名. code

(3)软链接能够对一个不存在的文件名进行链接。 orm

(4)软链接能够对目录进行链接。

    ln -s source dist        # 创建软链接 
    ln source dist           # 创建硬链接


Hard links and Soft links

Links

As was mentioned in the section on file system structure, every file has a data structure (record) known as an i-node that stores information about the file, and the filename is simply used as a reference to that data structure. A link is simply a way to refer to the contents of a file. There are two types of links:

  • Hard links: a hard link is a pointer to the file's i-node. For example, suppose that we have a file a-file.txt that contains the string "The file a-file.txt":
    % cat a-file.txt
    The file a-file.txt
    %

    Now we use the ln command to create a link to a-file.txt called b-file.txt:

    % ls
    ./  ../  a-file.txt
    % ln a-file.txt b-file.txt
    % ls
    ./  ../  a-file.txt  b-file.txt
    Hard Links

    The two names a-file.txt and b-file.txt now refer to the same data:

    % cat b-file.txt
    The file a-file.txt
    %

    If we modify the contents of file b-file.txt, then we also modify the contents of file a-file.txt:

    % vi b-file.txt
    ...
    % cat b-file.txt
    The file a-file.txt has been modified.
    % cat a-file.txt
    The file a-file.txt has been modified.
    %

    and vice versa:

    % vi a-file.txt
    ...
    % cat a-file.txt
    The file a-file.txt has been modified again!
    % cat b-file.txt
    The file a-file.txt has been modified again!
    %
  • Soft links (symbolic links): a soft link, also called symbolic link, is a file that contains the name of another file. We can then access the contents of the other file through that name. That is, a symbolic link is like a pointer to the pointer to the file's contents. For instance, supposed that in the previous example, we had used the -s option of the ln to create a soft link:
    % ln -s a-file.txt b-file.txt
    On disk, the file system would look like the following picture:Soft Links

But what are the differences between the two types of links, in practice? Let us look at an example that highlights these differences. The directory currently looks like this (let us assume that a-file.txt b-file.txt are both hard links to the same file):

% ls ./ ../ a-file.txt b-file.txt

Let us first add another symbolic link using the -s option:

% ln -s a-file.txt Symbolicb-file.txt % ls -F ./ ../ a-file.txt b-file.txt Symbolicb-file.txt@

A symbolic link, that ls -F displays with a @ symbol, has been added to the directory. Let us examine the contents of the file:

% cat Symbolicb-file.txt The file a-file.txt has been modified again!

If we change the file Symbolicb-file.txt, then the file a-file.txt is also modified.

% vi Symbolicb-file.txt ... % cat Symbolicb-file.txt The file a-file.txt has been modified a third time! % cat a-file.txt The file a-file.txt has been modified a third time! % cat b-file.txt The file a-file.txt has been modified a third time! %

If we remove the file a-file.txt, we can no longer access the data through the symbolic link Symbolicb-file.txt:

% ls -F ./ ../ a-file.txt b-file.txt Symbolicb-file.txt@ % rm a-file.txt rm: remove `a-file.txt'? y % ls -F ./ ../ b-file.txt Symbolicb-file.txt@ % cat Symbolicb-file.txt cat: Symbolicb-file.txt: No such file or directory

The link Symbolicb-file.txt contains the name a-file.txt, and there no longer is a file with that name. On the other hand, b-file.txt has its own pointer to the contents of the file we called a-file.txt, and hence we can still use it to access the data.

% cat b-file.txt The file a-file.txt has been modified a third time!

Although it may seem like symbolic links are not particularly useful, hard links have their drawbacks. The most significant drawback is that hard links cannot be created to link a file from one file system to another file on another file system. A Unix file structure hierarchy can consist of several different file systems (possibly on several physical disks). Each file system maintains its own information regarding the internal structure of the system and the individual files on the system. Hard links only know this system-specific information, which make hard links unable to span file systems. Soft links, on the other hand, know the name of the file, which is more general, and are able to span file systems.

For a concrete analogy, suppose that our friend Joel User is a student at both UBC and SFU. Both universities assign him a student number. If he tries to use his UBC student number at SFU, he will not meet with any success. He will also fail if he tries to use his SFU student number at UBC. But if he uses his legal name, Joel User, he will probably be successful. The student numbers are system-specific (like hard links), while his legal name spans both of the systems (like soft links).

Here is an example that demonstrates a situation where a hard link cannot be used and a symbolic link is needed. Suppose that we try to create a hard link from the current working directory to the C header stdio.h.

% ln /usr/include/stdio.h stdio.h ln: creating hard link `stdio.h' to `/usr/include/stdio.h': Invalid cross-device link %

The ln command fails because stdio.h is stored on a different file system. If we want to create a link to it, we will have to use a symbolic link:

% ln -s /usr/include/stdio.h stdio.h % ls -l lrwxrwxrwx 1 a1a1 guest 20 Apr 20 11:58 stdio.h -> /usr/include/stdio.h % ls ./ ../ stdio.h@ %

Now we can view the file stdio.h just as if it was located in the working directory. For example:

% cat stdio.h /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */ /* * User-visible pieces of the ANSI C standard I/O package. */ #ifndef _STDIO_H #define _STDIO_H ... %

The entire output of the cat command was not included to save space.

Note that the long listing (ls -l) of a soft link does not accurately reflect its associated permissions. To view the permissions of the file or directory that the symbolic link references, the -L options of the ls command can be used. For example:

% ln -s /usr/include/stdio.h stdio.h % ls -l stdio.h lrwxrwxrwx 1 a1a1 undergrad 20 May 10 15:13 stdio.h -> /usr/include/stdio.h % ls -l /usr/include/stdio.h -rw-r--r-- 1 root bin 11066 Jan 5 2000 /usr/include/stdio.h % ls -lL stdio.h -rw-r--r-- 1 root bin 11066 Jan 5 2000 stdio.h

Knowledge of links becomes doubly important when working as part of a software development team, and even more so when using a source code management tool such as RCS. The man page for the ln command contains more information on Unix links and the ln.

相关文章
相关标签/搜索