关于 hard link 的一个疑问

2017-01-01 20:21:11 +08:00
 davinci
我有文件 a.txt 内容为 hello ,命令行输入 ln a.txt b.txt 。然后把 b 的内容改为 hello world 。但是 a.txt 的内容并没有改为 hello world ,仍然为 hello 。这是为什么?
既然 hard link 并没有复制文件内容, a.txt 和 b.txt 的 innode id 指向同一 inode 结构体,因此它们共享同一块磁盘空间,那为什么 b.txt 改变了, a.txt 却没有变?总不可能是 copy on write 吧?
3042 次点击
所在节点    Linux
15 条回复
q397064399
2017-01-01 20:32:19 +08:00
不清楚,从来都是软链接
BSD
2017-01-01 20:47:56 +08:00
那是你用的发行版有问题吧,我试了,没你说的现象,改任何一个文件,硬链文件内容也会同时改变。
jimzhong
2017-01-01 21:18:15 +08:00
inode 是共用的,是不是你没有保存?
sylecn
2017-01-01 21:28:39 +08:00
不会出现这种情况,你是怎么修改 b 的?
davinci
2017-01-01 23:33:09 +08:00
@sylecn 打开文本编辑器修改,保存后退出
@jimzhong 有保存
@BSD 会不会是 macOS 的问题,这种基本 Unix 命令, Linux 和 macOS 应当都是一样的吧?对命令行了解不多
davinci
2017-01-01 23:35:01 +08:00
@jimzhong
@sylecn
@davinci
吊诡的是当我 ln 一个 8GB 的电影文件时,磁盘占用空间压根没变,说明空间应该是共享的。难道真是 copy on write ?
orzfly
2017-01-01 23:36:07 +08:00
你需要注意一下你用的文本编辑器究竟是怎样存文件的……

有些编辑器保存文件,不是直接写入,而是写一个新的(临时)文件,然后把他重命名成之前的……
clavichord93
2017-01-02 00:15:22 +08:00
@davinci
macOS 和 Linux 的 ln 实现是相同的,你要注意 @orzfly 说的问题,这种情况下 ln 会被覆盖掉。之前玩了一下 fuse , ln 会有这个情况,与编辑器保存文件的方式有关。你可以试一下 nano ,或者直接命令行里 echo ,你就会发现两个文件相同了。
QAPTEAWH
2017-01-02 01:03:32 +08:00
一般就是 @orzfly 说的情况。 lz 可以用 ls -i 看看操作之前、之吼的 inode 号。
meta
2017-01-02 10:12:19 +08:00
改完 sync 一下呢
davinci
2017-01-02 11:14:30 +08:00
@orzfly 试了一下 的确 macOS 自带的 TextEdit 不是直接写入,而是分配新的磁盘空间初始化新的 innode 结构体,写入修改后的内容,令文件 innode id 指向新的 innode 结构体。如果旧的 innode 结构体引用计数变为 0 ,删除之,并回收旧磁盘空间。
davinci
2017-01-02 11:15:38 +08:00
@clavichord93 试了一下,用 nano 就会同步变化了。
msg7086
2017-01-02 15:36:15 +08:00
很神奇的竟然被你猜对了。就是 Copy on Write 呢。
alexnone
2017-01-03 13:31:16 +08:00
学习了.所以楼主一开始保存的 b.txt 的 innode id 和 a.txt 的并不一样了咯?
davinci
2017-01-03 13:42:37 +08:00
@alexnone 在修改 b.txt 之前是一样的,二者指向同一存储空间。用 macOS 自带的 textedit 修改 b.txt 后,b.txt inonde id 发生变化,有了属于自己独立于 a.txt 的磁盘空间

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/331605

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX