V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
davinci
V2EX  ›  Linux

关于 hard link 的一个疑问

  •  
  •   davinci · 2017-01-01 20:21:11 +08:00 · 3018 次点击
    这是一个创建于 2643 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有文件 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 吧?
    15 条回复    2017-01-03 13:42:37 +08:00
    q397064399
        1
    q397064399  
       2017-01-01 20:32:19 +08:00
    不清楚,从来都是软链接
    BSD
        2
    BSD  
       2017-01-01 20:47:56 +08:00
    那是你用的发行版有问题吧,我试了,没你说的现象,改任何一个文件,硬链文件内容也会同时改变。
    jimzhong
        3
    jimzhong  
       2017-01-01 21:18:15 +08:00
    inode 是共用的,是不是你没有保存?
    sylecn
        4
    sylecn  
       2017-01-01 21:28:39 +08:00 via Android
    不会出现这种情况,你是怎么修改 b 的?
    davinci
        5
    davinci  
    OP
       2017-01-01 23:33:09 +08:00
    @sylecn 打开文本编辑器修改,保存后退出
    @jimzhong 有保存
    @BSD 会不会是 macOS 的问题,这种基本 Unix 命令, Linux 和 macOS 应当都是一样的吧?对命令行了解不多
    davinci
        6
    davinci  
    OP
       2017-01-01 23:35:01 +08:00
    @jimzhong
    @sylecn
    @davinci
    吊诡的是当我 ln 一个 8GB 的电影文件时,磁盘占用空间压根没变,说明空间应该是共享的。难道真是 copy on write ?
    orzfly
        7
    orzfly  
       2017-01-01 23:36:07 +08:00   ❤️ 1
    你需要注意一下你用的文本编辑器究竟是怎样存文件的……

    有些编辑器保存文件,不是直接写入,而是写一个新的(临时)文件,然后把他重命名成之前的……
    clavichord93
        8
    clavichord93  
       2017-01-02 00:15:22 +08:00
    @davinci
    macOS 和 Linux 的 ln 实现是相同的,你要注意 @orzfly 说的问题,这种情况下 ln 会被覆盖掉。之前玩了一下 fuse , ln 会有这个情况,与编辑器保存文件的方式有关。你可以试一下 nano ,或者直接命令行里 echo ,你就会发现两个文件相同了。
    QAPTEAWH
        9
    QAPTEAWH  
       2017-01-02 01:03:32 +08:00
    一般就是 @orzfly 说的情况。 lz 可以用 ls -i 看看操作之前、之吼的 inode 号。
    meta
        10
    meta  
       2017-01-02 10:12:19 +08:00 via iPhone
    改完 sync 一下呢
    davinci
        11
    davinci  
    OP
       2017-01-02 11:14:30 +08:00
    @orzfly 试了一下 的确 macOS 自带的 TextEdit 不是直接写入,而是分配新的磁盘空间初始化新的 innode 结构体,写入修改后的内容,令文件 innode id 指向新的 innode 结构体。如果旧的 innode 结构体引用计数变为 0 ,删除之,并回收旧磁盘空间。
    davinci
        12
    davinci  
    OP
       2017-01-02 11:15:38 +08:00
    @clavichord93 试了一下,用 nano 就会同步变化了。
    msg7086
        13
    msg7086  
       2017-01-02 15:36:15 +08:00
    很神奇的竟然被你猜对了。就是 Copy on Write 呢。
    alexnone
        14
    alexnone  
       2017-01-03 13:31:16 +08:00
    学习了.所以楼主一开始保存的 b.txt 的 innode id 和 a.txt 的并不一样了咯?
    davinci
        15
    davinci  
    OP
       2017-01-03 13:42:37 +08:00
    @alexnone 在修改 b.txt 之前是一样的,二者指向同一存储空间。用 macOS 自带的 textedit 修改 b.txt 后,b.txt inonde id 发生变化,有了属于自己独立于 a.txt 的磁盘空间
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3094 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:52 · PVG 20:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.