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

关于 hard link 的一个疑问

  •   davinci 2017-01-01 20:21:11 +08:00 3533 次点击
    这是一个创建于 3205 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有文件 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     Solana     2675 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 02:32 PVG 10:32 LAX 19:32 JFK 22:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86