LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: seazon

硬连接和软连接的区别的讨论[附:ln中文文档]

[复制链接]
发表于 2003-9-1 09:42:44 | 显示全部楼层
在应用中的一点重要不同:
soft link 可以做跨分区的 link;而 hard link 由于 inode 的缘故,只能在本分区中做 link。因为这个,soft link 的使用频率要高的多。
 楼主| 发表于 2003-9-2 09:17:15 | 显示全部楼层
软连接可以跨分区建立。昨天,我突发奇想——从linux上建立一个软连接到windows分区上,于是我先挂栽windows分区,然后用ln -s file1 /mnt/windows/file1.但是系统报错,说不能建立,这是为什么啊?
我用cp命令可以从linux分区中复制1个文件到windows分区中。

谢谢!
seazon
 楼主| 发表于 2003-9-2 15:55:15 | 显示全部楼层
用ls -l查看了一下连接文件,发现硬连接的文件是一个普通文件,只有软连接才是连接文件。
 楼主| 发表于 2003-9-3 10:22:34 | 显示全部楼层
那硬连接又有那些好处呢?
发表于 2003-9-3 22:53:49 | 显示全部楼层
硬连接因为记录的是 inode,所以不怕改名,比如
ln /tmp/a /tmp/b
mv /tmp/a /tmp/othername
这时 /tmp/b 仍然可以访问,soft-link 就不行:sourc 的名字改变后,所有链接到这里的 soft-link 全部变为 broken。事实上,即使所有指向该 inode 的 hard-link 的文件名都变了,每一个仍然都可以访问。我想这是它最大的优点吧。
发表于 2003-9-4 00:59:00 | 显示全部楼层
linux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。
索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。
linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。
对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。
可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。
连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是:

硬连接:原文件名和连接文件名都指向相同的物理地址。
目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)
文件在磁盘中只有一个拷贝,节省硬盘空间;
由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除。

符号连接:用ln -s命令建立文件的符号连接
符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。
可以删除原有的文件而保存连接文件,没有防止误删除功能。
注:转自:cu的一个网友的解释
 楼主| 发表于 2003-9-10 09:12:00 | 显示全部楼层
最初由 seazon 发表
软连接可以跨分区建立。昨天,我突发奇想——从linux上建立一个软连接到windows分区上,于是我先挂栽windows分区,然后用ln -s file1 /mnt/windows/file1.但是系统报错,说不能建立,这是为什么啊?
我用cp命令可以从linux分区中复制1个文件到windows分区中。

谢谢!
seazon


有谁能回答我这个问题啊!

在linux上不能创建符号连接是不是因为windows系统识别不出linux的文件系统啊!



错!错!错!我终于明白了符号连接可以跨分区连接,但是,并不表示可以跨越不同的文件系统而建立连接。换句话说,如果从ext3的分区中建立一个符号连接到ext2的分区中,应该也是不成功的。(个人观点,未经过实践证实)

各位,如果有谁知道的话,希望能给我一个肯定的答复,谢谢!
发表于 2003-9-10 16:58:58 | 显示全部楼层
最初由 seazon 发表
有谁能回答我这个问题啊!

在linux上不能创建符号连接是不是因为windows系统识别不出linux的文件系统啊!



错!错!错!我终于明白了符号连接可以跨分区连接,但是,并不表示可以跨越不同的文件系统而建立连接。换句话说,如果从ext3的分区中建立一个符号连接到ext2的分区中,应该也是不成功的。(个人观点,未经过实践证实)

各位,如果有谁知道的话,希望能给我一个肯定的答复,谢谢!


FAINT... ARE YOU KIDDING?!
你只试了一次从 windows 的分区 link ext2 分区的文件就开始下结论呀,我倒
你不能 link 的原因不外乎两个:
1. windows 分区根本不支持 link。我不太清楚你用的分区是 fat 还是 ntfs 格式的,但这种可能性太小:从 soft link 的机制来说,应该只要能保存文件的 filesystem 就能支持 soft link (说出这种话的人是不是在发烧 我隐约记得几年前在 windows 下看过这种 link 文件,但我现在手头没有 fat 分区,没法试验。
2. 你的 windows 分区根本就是只读状态。这一个比较可能。因为大家现在用的一般都 win2k 以上版本的 windows 了,分区多为 ntfs 格式;这 ntfs driver 的写入功能现在还在测试阶段,linux 默认 mount ntfs 都是只读的。你要想在 read only 的分区上写文件那可就要碰壁了。

从我自己这里来讲,常年 link 着另一个 samba 文件服务器上的目录,而且不是 link 到 mount 点,而是他下面的某个目录。这节省了我大量逐层进入目录的时间。

> 如果从ext3的分区中建立一个符号连接到ext2的分区中,应该也是不成功的
这一个……呵呵,是补课的时候了,建议你好好查查资料,看看 ext2 和 ext3 有什么区别
发表于 2003-9-10 18:30:23 | 显示全部楼层
刚才的凭空猜测有错误,还得纠正一下。

seazon 凭一个例子完全否定,我则完全肯定,都没有经过仔细调查,都不是科学的态度呀。刚在 man、info 里查到确实有些分区不支持 link,但没有说是那些;在网上看到的这条应该比较可信:

> > ln -sf /usr/src/cvstree/test.c /home/chris/test.c
>
>   If /usr/src/cvstree is some directory on the windoze system that you've
>   mounted on that path in the Linux system, and /home/chris is a REAL
>   Linux directory on the linux system AND you have write access to that
>   directory and read access to the /usr/src/cvstree/test.c file, you
>   should have no problem creating the symlink.
>
>   If, on the other hand, /home/chris is a directory in a DOS/Windoze
>   filesystem, you can't create symlinks THERE, since the DOSdoze
>   filesystems don't support it.

http://www.geocrawler.com/archives/3/84/2001/4/50/5530982/

可惜不知道为什么有些分区不能 link,这可能得看 ln 和 fat、ntfs 驱动的源码了;不过刚才作了一个 tar 包看了看,link path 存放的位置和文件内容存放的位置不一样,不知道是文件系统中本来如此,还是 tar 自己的格式所致。
 楼主| 发表于 2003-9-11 10:13:53 | 显示全部楼层
大哥教训的是。

其实刚开始我也只是假设,我也说过,我没有做过实验,因为我的电脑里只有EXT3和FAT格式的文件系统,所以我很难用实践得出结论(我也希望知道的人能告诉我事实)

大哥说我的windows系统可能是只读的,但我认为不是这样,因为我用cp命令做拷贝完全可以。那看来只有一种可能,就是linux不能做软连接到windows的FAT上。(只是假设):p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表