Nic*_*tes 742 unix symlink hardlink
最近我在求职面试时被问到这个问题.我是诚实的,并说我知道符号链接的行为以及如何创建一个,但不理解硬链接的使用以及它与符号链接的区别.
Mar*_*ork 754
在文件系统下面的文件由inode表示(或者它是多个inode不确定)
文件系统中的文件基本上是指向inode的链接.
然后,硬链接只创建另一个文件,其中包含指向同一底层inode的链接.
删除文件时,它会删除一个指向底层inode的链接.只有在删除了所有指向inode的链接后,才会删除(或删除/可写入)inode.
符号链接是指向文件系统中另一个名称的链接.
一旦建立了硬链接,链接就是inode.删除重命名或移动原始文件不会影响硬链接,因为它链接到底层的inode.对inode数据的任何更改都会反映在引用该inode的所有文件中.
注意:硬链接仅在同一文件系统中有效.符号链接可以跨越文件系统,因为它们只是另一个文件的名称.
Ada*_*tan 438
使用任何Linux(ish)控制台可能有所帮助的一些很好的直觉.
创建两个文件:
$ touch foo; touch bar
Run Code Online (Sandbox Code Playgroud)
在其中输入一些数据:
$ echo "Cat" > foo
$ echo "Dog" > bar
Run Code Online (Sandbox Code Playgroud)
(实际上,我可以首先使用echo,因为它创建了文件,如果它们不存在......但不要介意.)
正如所料:
$cat foo; cat bar
Cat
Dog
Run Code Online (Sandbox Code Playgroud)
让我们创建硬链接和软链接:
$ ln foo foo-hard
$ ln -s bar bar-soft
Run Code Online (Sandbox Code Playgroud)
让我们看看刚刚发生了什么:
$ ls -l
foo
foo-hard
bar
bar-soft -> bar
Run Code Online (Sandbox Code Playgroud)
更改blah1的名称无关紧要:
$ mv foo foo-new
$ cat foo-hard
Cat
Run Code Online (Sandbox Code Playgroud)
blah1-hard指向inode,文件的内容 - 没有改变.
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: No such file or directory
Run Code Online (Sandbox Code Playgroud)
无法找到文件的内容,因为软链接指向已更改的名称,而不是内容.同样,如果blah1被删除,blah1-hard仍然保留内容; 如果删除blah2,则blah2-soft只是指向不存在的文件的链接.
aki*_*don 415
俗话说,一张图片胜过千言万语.这是我如何想象它:
以下是我们如何获得该图片:
myfile.txt
在文件系统中创建一个指向新inode的名称(包含文件的元数据,并指向包含其内容的数据块,即文本"Hello,World!":
$ echo 'Hello, World!' > myfile.txt
Run Code Online (Sandbox Code Playgroud)创建一个指向my-hard-link
该文件的硬链接myfile.txt
,这意味着"创建一个应指向指向同一inode的文件myfile.txt
":
$ ln myfile.txt my-hard-link
Run Code Online (Sandbox Code Playgroud)创建指向my-soft-link
该文件的软链接myfile.txt
,这意味着"创建一个应指向该文件的文件myfile.txt
":
$ ln -s myfile.txt my-soft-link
Run Code Online (Sandbox Code Playgroud)看看如果myfile.txt
删除(或移动)将会发生什么:my-hard-link
仍然指向相同的内容,因此不受影响,而my-soft-link
现在指向什么都没有.其他答案讨论每个人的利弊.
Tan*_*lus 68
当原始文件被移动时,硬链接很有用.例如,将文件从/ bin移动到/ usr/bin或移动到/ usr/local/bin.这个文件在/ bin中的任何符号链接都会被破坏,但是硬链接(直接指向文件的inode的链接)并不关心.
硬链接可能占用较少的磁盘空间,因为它们只占用目录条目,而符号链接需要它自己的inode来存储它指向的名称.
硬链接也需要较少的时间来解决 - 符号链接可以指向符号链接目录中的其他符号链接.其中一些可能在NFS或其他高延迟文件系统上,因此可能导致网络流量得到解决.始终在同一文件系统上的硬链接总是在一次查找中解决,并且从不涉及网络延迟(如果它是NFS文件系统上的硬链接,NFS服务器将执行解析,并且它将不可见客户系统).有时这很重要.不适合我,但我可以想象这可能很重要的高性能系统.
我还认为像mmap(2)甚至open(2)这样的东西使用与硬链接相同的功能来保持文件的inode活动,这样即使文件被取消链接(2),inode仍然允许进程继续访问,只有在进程关闭后,文件才会真正消失.这允许更安全的临时文件(如果你可以原子地进行打开和取消链接,可能有一个我不记得的POSIX API,那么你真的有一个安全的临时文件)你可以读/写没有任何人能够访问您的数据.好吧,在/ proc让每个人都能够查看你的文件描述符之前,这是真的,但这是另一个故事.
说到这一点,恢复在进程A中打开但在文件系统上取消链接的文件围绕使用硬链接重新创建inode链接,这样当打开它的进程关闭或消失时,文件不会消失.
Bol*_*boa 34
查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例.指向文件的硬链接将指向存储文件的位置或该文件的inode.符号链接将指向实际文件本身.
因此,如果我们有一个名为"a"的文件并创建一个硬链接"b"和一个符号链接"c",它们都引用文件"a":
echo "111" > a
ln a b
ln -s a c
Run Code Online (Sandbox Code Playgroud)
"a","b"和"c"的输出将是:
cat a --> 111
cat b --> 111
cat c --> 111
Run Code Online (Sandbox Code Playgroud)
现在让我们删除文件"a",看看"a","b"和"c"的输出会发生什么:
rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Run Code Online (Sandbox Code Playgroud)
所以发生了什么事?
因为文件"c"指向文件"a"本身,如果删除文件"a",则文件"c"将没有任何指向,实际上它也被删除.
但是,文件"b"指向文件"a"的存储位置或inode.因此,如果文件"a"被删除,那么它将不再指向inode,但由于文件"b",因此inode将继续存储属于"a"的任何内容,直到不再有硬链接指向它为止.
Pra*_*ngh 33
软链接:
软或符号更像是对原始文件的快捷方式....如果删除原始文件,则快捷方式会失败,如果只删除快捷方式,则原始文件不会发生任何变化.
软链接语法:ln -s Pathof_Target_file link
输出: link -> ./Target_file
证明: readlink link
同样在ls -l link
输出中,您将看到lrwxrwxrwx
作为l的第一个字母,表示该文件是软链接.
删除链接: unlink link
注意:如果您愿意,即使将软链接从当前目录移动到其他位置,您的软链接也可以正常工作.确保在创建软链接时给出绝对路径而不是相对路径.ie(从/ root/user/Target_file开始而不是./Target_file)
硬链接:
硬链接更多是镜像副本或同一文件的多个路径.对file1执行某些操作并将其显示在文件2中.删除一个仍然保持另一个正常.
仅当删除了所有(硬)链接或(同一文件)inode的所有路径时,才会删除inode(或文件).
一旦建立了硬链接,该链接就具有原始文件的inode.删除重命名或移动原始文件不会影响硬链接,因为它链接到底层的inode.对inode数据的任何更改都会反映在引用该inode的所有文件中.
硬链接语法:ln Target_file link
输出:将使用与Targetfile相同的inode编号创建具有名称链接的文件.
证明:( ls -i link Target_file
检查他们的inode)
删除链接:( rm -f link
删除链接就像普通文件一样)
注意:符号链接可以跨越文件系统,因为它们只是另一个文件的名称.而硬链接仅在同一文件系统中有效.
符号链接有一些功能缺少硬链接:
你知道符号链接指向硬链接的位置,你需要浏览整个文件系统来查找共享相同inode的文件.
# find / -inum 517333
Run Code Online (Sandbox Code Playgroud)/home/bobbin/sync.sh /root/synchro
硬链接不能指向目录.
硬链接有两个限制:
And*_*ico 28
符号链接链接到路径名称.这可以是系统文件树中的任何位置,甚至在创建链接时也不必存在.目标路径可以是相对路径或绝对路径.
硬链接是指向inode的附加指针,这意味着它们只能存在于与目标相同的卷上.文件的其他硬链接与用于引用文件的"原始"名称无法区分.
Jau*_* Ho 20
我会指向维基百科:
几点:
\n\n\n符号链接是指向另一个文件系统对象的文件系统对象。所指向的对象称为目标。
\n\n符号链接对用户是透明的;这些链接显示为普通文件或目录,并且可以由用户或应用程序以完全相同的方式进行操作。
\n\n符号链接旨在帮助迁移和应用程序与 UNIX 操作系统的兼容性。Microsoft 已经实现了其符号链接,其功能就像 UNIX 链接一样。
\n\n符号链接可以是绝对链接,也可以是相对链接。绝对链接是指定路径名的每个部分的链接;相对\n 链接是相对于指定路径中相对\xe2\x80\x93 链接说明符的位置确定的
\n
绝对符号链接的示例
\n\nX: "C:\\alpha\\beta\\absLink\\gamma\\file"\nLink: "absLink" maps to "\\\\machineB\\share"\nModified Path: "\\\\machineB\\share\\gamma\\file"\n
Run Code Online (Sandbox Code Playgroud)\n\n相对符号链接的示例
\n\nX: C:\\alpha\\beta\\link\\gamma\\file\nLink: "link" maps to "..\\..\\theta"\nModified Path: "C:\\alpha\\beta\\..\\..\\theta\\gamma\\file"\nFinal Path: "C:\\theta\\gamma\\file"\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\n硬链接是文件的文件系统表示形式,通过它,多个路径引用同一卷中的单个文件。
\n
要在 Windows 中创建硬链接,请导航到要创建链接的位置并输入以下命令:
\n\nmklink /H Link_name target_path\n
Run Code Online (Sandbox Code Playgroud)\n\n请注意,您可以按任意顺序删除硬链接,无论它们的创建顺序如何。此外,在以下情况下无法创建硬链接:
\n\nNTFS 支持另一种称为联结的链接类型。MSDN对其定义如下:
\n\n\n\n\n联结(也称为软链接)与硬链接的不同之处在于,它引用的存储对象是单独的目录,并且联结可以链接位于同一计算机上不同本地卷上的目录。否则,连接的操作与硬链接相同。
\n
硬链接部分和连接部分中的粗体部分显示了两者之间的基本区别。
\n\n在 Windows 中创建连接的命令,导航到要创建链接的位置,然后输入:
\n\nmklink /J link_name target_path\n
Run Code Online (Sandbox Code Playgroud)\n
此答案适用于 Web 开发人员:
硬链接:就像将不同的域名指向同一个主机
* abc.com and def.com -> points to the IP 1.2.3.4
* abc.com and def.com -> files in linux
* IP -> inode in linux
* By deleting the domain abc.com users still access your website through def.com or vice versa
* Mutation through abc.com will affect def.com and vice verca
Run Code Online (Sandbox Code Playgroud)
符号链接:将一个域重定向到另一个域
* accessing abc.com will redirect to def.com as you've accessed def.com directly
* removing the def.com domain will break the link abc.com
Run Code Online (Sandbox Code Playgroud)
小智 5
简单来说,硬链接:只是给一个文件添加新的名称,也就是说,一个文件可以同时有多个名称,所有名称都相同,没有谁优先,硬链接并不意味着复制所有内容文件并创建新文件不是这样,它只是创建一个已知的替代名称..
符号链接(symlink):是指向另一个文件的文件指针,如果符号链接指向一个现有文件,而该文件后来被删除,则该符号链接继续指向相同的文件名,即使该名称不再命名任何文件。
归档时间: |
|
查看次数: |
348437 次 |
最近记录: |