Maxing周刊 EP12 2026w42: 硬链接的妙用

news / 新闻

AI 新闻

gems / 分享

好物分享: 带横滚轮的鼠标

我买的是飞利浦MX Prime4, 用了几个月了体验很不错. - 最大卖点就是带一个横向滚轮, 在大拇指位置, 用来看比较宽的表格/代码非常方便 - 另大拇指附近也有前进/后退的快捷键 浏览器里比较常用 - 其他的feature包括: 自带按钮可以调节鼠标灵敏度 / typeC充电口

antigravity - 使用chrome MCP, 更快的浏览器控制

之前用/browser控制浏览器, 虽然可以完成任务, 但痛点是: 1. 每次需要点同意远程debug 2. 直接在主浏览器里面 接管你来控制 3. 速度很慢, 每次点击操作都要截图发给模型 思考后进行下一步动作 比如点击页面的XY坐标 (当然这样做的好处是最后会给你一个操作录屏, 但大多数时候其实用不到)

==> 更优化的版本是使用Chrome DevTools MCP

  • 100% 隔离的专用chrome profile: 使用独立持久化目录的专用 Chrome 窗口, 零授权弹窗, 不碰主浏览器.
  • 而且也可以手动打开这个profile, 在这里登录各种网站账号一次 即可永久保存
  • 添加--autoConnect就可以切换成让MCP操作主浏览器
  • 直接秒读DOM树, 或者注入js直接批量操作, 速度远快于/browser

我的配置如下:

$ cat ~/.gemini/config/mcp_config.json
{
  "mcpServers": {
    // 通道 A(默认主力):独立专用 Chrome 窗口
    // 使用独立 Profile (~/.cache/chrome-devtools-mcp/chrome-profile),与主浏览器完全隔离,免弹窗
    "chrome-devtools-mcp": {
      // 建议使用 npx 的绝对路径,防止 macOS GUI 应用子进程找不到命令
      "command": "$HOME/.local/bin/npx",
      "args": [
        "-y",
        "chrome-devtools-mcp@latest",
        // 【关键避坑 1】移除 Puppeteer 默认的 --enable-automation 标志,消除顶部“正受到自动测试软件控制”横幅
        "--ignoreDefaultChromeArg=--enable-automation",
        // 【关键避坑 2】关闭 Blink 自动化受控特征(使 navigator.webdriver 变为 false)
        // 缺少这两项会导致在独立窗口登录 Google 账号时报错“无法登录:此浏览器或应用可能不安全”
        "--chromeArg=--disable-blink-features=AutomationControlled"
      ],
      "env": {
        // 【关键避坑 3】显式注入 node/npx 所在 PATH,解决 macOS Electron 宿主环境变量残缺问题
        "PATH": "$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
      }
    },

    // 通道 B(按需备用):连接日常正在运行的主 Chrome
    // 平时懒加载不启动;仅在自然语言明确要求“看主浏览器”或使用 @chrome-main 时触发
    "chrome-main": {
      "command": "$HOME/.local/bin/npx",
      "args": [
        "-y",
        "chrome-devtools-mcp@latest",
        // 开启自动连接主 Chrome(需在主浏览器 chrome://inspect/#remote-debugging 勾选允许远程调试)
        "--autoConnect"
      ],
      "env": {
        "PATH": "$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

misc / 杂记

运动

本周没有瑜伽课 只有两次力量 感觉身体有点僵硬... - 周三硬拉 8reps : 65kg-85kg-90kg-90kg - finisher test: 5个引体

周末带娃

苏黎世机场露天观景平台 - 位置就在登机口旁边五十米左右, 按照牌子找Zuschauerterrassen/Observation Deck就可以 - 可以观看飞机起降, 还有一些小孩玩的地方 - 凭登机牌可以免费进入 -- 以前都不知道有这回事 - 成人票5块, 另外每月15号都是免费进入 - 还在机场发现了有用于称行李的区域(也可以站上去称体重) -

硬链接的妙用

这周和antigravity讨论我现在手机照片备份, 有一个场景的痛点是: 手机的照片通过syncthing备份到NAS以后, 如果手机删除照片, syncthing也会把NAS里的文件也删掉, 之前要么先修改手机端的stignore再删照片, 要么NAS里设置忽略删除, 都不是很方便.

AI提供了一个很简洁的解决方案:

在NAS上设置"同步中转目录"与"永久归档目录", 用cron脚本把中转目录的内容硬链接到永久归档目录里

关键就是这个"硬链接", 它的效果是两个文件指向同一份数据块, 所以占用存储空间不变, 但是删除一个文件并不会连带删除另一个!

硬链接背景知识

我之前从来都是用软链接ln -s, 也就不知道硬链接是干啥的, 问了一下Gemini大概理解了, 这里总结一下其中的背景知识.

现代文件系统里的两种链接 - 硬链接("Hard" Link, ln): 两个路径直接指向同一个底层数据块(inode), 平起平坐, 只占一份空间; 删掉其中一个路径, 另一个路径的数据依然完好存在(只有所有硬链接路径全被删光, 空间才会释放). - 软链接 / 符号链接(Symlink, ln -s): 相当于快捷方式, 只记录原路径文本; 一旦原路径文件被删, 软链接就会失效变成死链.

inode是什么 在Linux文件系统中, 文件名/路径 和 文件内容 是解耦的: - 文件名: 只是存放在目录项(directory entry)里的普通字符串, 本质是一张映射表: 文件名 -> inode 编号. - 文件实体(inode): 全称 Index Node(索引节点), 它是文件的元数据载体(文件权限/所有者/大小/时间戳, 以及最重要的硬链接计数 Link Count). inode 本身不存储文件名, 也不存储文件路径 - 删除一个hard link, 只不过把硬链接计数减1, 只有当硬链接计数=0的时候, 空间才真正释放

硬链接的限制 1. 不能跨文件分区使用 2. 不能作用于目录 3. 很多编辑器(如vim)在修改保存文件时, 并不是直接在原文件上写入, 而是"先写临时文件 -> 删除原文件名 -> 把临时文件重命名覆盖" ==> 这种保存方式会给当前文件名分配一个全新的 inode, 从而导致硬链接被意外打断.

硬链接的其他应用场景 1. PT 保种与媒体库刮削分离: 下载目录保持原始种子文件名用于保种, 同时通过硬链接在 Jellyfin/Plex 媒体库目录中按规范重命名刮削, 一份体积双处使用. -- 这个我(交大葡萄资深老用户)也用得上! 2. rsync增量快照备份: 这个还蛮有意思的, 比如一个经常变动的目录, 用rsync --link-dest, 只需要用很小的空间, 就可以备份这个目录在不同时刻的全量内容, 方便回滚.

# Day 1 (全量备份)
rsync -a /data/ /backup/day-1/
# Day 2 (增量快照)
rsync -a --link-dest=/backup/day-1/ /data/ /backup/day-2/
# => 结构上: 每一天的目录(day-1, day-2, day-3)看起来都是一个完整独立的全量备份, 可以直接进去浏览/恢复, 无需复杂的回滚合成.
# => 存储上: 只有发生改动的文件才消耗新磁盘空间, 未改动的文件仅消耗一个目录项的元数据, 几乎零额外存储开销.
# => 删掉 day-1 目录, 仅仅是对应文件的 inode 引用计数减 1, 不会破坏 day-2 的可用性.
comments powered by Disqus