Skip to content

MR 本地分析环境 · 使用说明

2026-07-12 建。MR 重活主力已从腾讯云迁到本地台式机(i5-13490F / 32G / D盘6.7T), 因为数据在本地、消除跨墙搬大文件的卡顿。整套 R 环境装在 Windows 的 WSL2 Linux 子系统里。


一、怎么打开用

本机

浏览器开 http://localhost:8787 → 登录 research / 〈密码·见Vaultwarden〉

任意电脑(需台式机开机+已登录 Windows)

浏览器开 https://mr.stlog.cn → 过两道门:

  1. 网页弹框 basic auth:cong / 〈密码·见Vaultwarden〉
  2. RStudio 登录:research / 〈密码·见Vaultwarden〉

远程能访问的前提:台式机开着、你登录了 Windows(登录时 Startup 里的 wsl-mr-keepalive.vbs 会自动保活 WSL,RStudio+隧道随之自启)。关机/注销就断。


二、东西都在哪

代码:F 盘是唯一真源(四个项目,2026-07-26 起统一)

项目F 盘真源(git)WSL 执行机内容
mr-pipelineF:\project\mr-pipeline/home/research/mr-pipeline主 MR 筛查流水线
multiomics-mrF:\project\multiomics-mr/home/research/multiomics-mreQTL / 代谢物 / meQTL / 视网膜 / 整合
dr-amd-targetsF:\project\dr-amd-targets/home/research/dr-amd-targets单细胞 / 通讯 / 轨迹 / bulk / GSEA
decode-repF:\project\decode-rep/home/research/decode-repdeCODE 换平台复制

规则统一:F 盘改代码 → WSL git pull 执行。WSL 只读。

★ 2026-07-26 修复了两个真实的代码丢失风险

风险一:三个项目根本没有 F 盘副本、没有版本控制。multiomics-mr / dr-amd-targets / decode-rep 的代码此前只存在于 WSL (WSL 文件系统是 AppData 里的 ext4.vhdx,Windows 备份看不到、wsl --unregister 即全毁)。 已建仓迁入(25 / 29 / 5 个文件),并把 WSL 接成跟踪副本。

风险二:mr-pipeline 发生了反向漂移——产出当前结果的代码从未回到 F 盘。 本页 07-17 记的事故是「F 盘的改动没进 WSL」;这次是反方向: WSL 里有 17 个已修改 + 11 个未跟踪的代码文件从未回迁,其中包括

  • 2026-07-22「AMD 与并发症分家」的全部实现04_ldsc.RR13_dm/R13_amd 双家族等)
  • 分析阶段 17–21(外部复制、候选 shortlist、斑马鱼同源、细胞模型对应)
  • tools/verify_coloc_pqtl.Rverify_ldsc.R —— docs 已引用为「独立复算证据」却不在库里

后果:当时若换机只拷 F 盘,拿到的是分家之前的代码,复现不出当前任何结果。 已全部回迁并提交(70bc04a,跟踪文件 71→82)。

教训:「F 盘是唯一真源」是约定,不是机制。没有强制手段时它两个方向都会漂。 换机或长间隔之后,第一件事是 git status 两侧对照,见下方漂移自检

WSL 读 F 盘 git 仓需要 safe.directory

F 盘仓库由 Windows 用户创建,WSL 里 UID 不同,git 会拒绝(dubious ownership)。 四个项目都需要(换机后要重做):

bash
for p in mr-pipeline multiomics-mr dr-amd-targets decode-rep; do
  git config --global --add safe.directory "/mnt/f/project/${p}"
  git config --global --add safe.directory "/mnt/f/project/${p}/.git"
done

另外 F 盘的 git init 必须在 Windows 侧做——WSL 的 research 用户无法在 NTFS 挂载上 chmod,会报 could not set 'core.filemode' 而建出坏仓库。WSL 侧则要 git config core.filemode false

数据:主体在 D 盘,但两个新项目有例外

内容路径流水线软链体积
结局数据D:\mrdata\outcome\data/outcome/mnt/d/mrdata/outcome33G
暴露数据(UKB-PPP ST9)D:\mrdata\exposure\protein_info.csvdata/exposure/protein_info.csv → 它3.9M
UKB-PPP 区域数据D:\mrdata\ukbppp_regional\(HyPrColoc 用)34G
LDSC 参考D:\mrdata\ldsc\76M

mr-pipeline 的数据一律放 D:\mrdata\,F 盘不存数据。 D 盘 7.3T 只用了 12%(剩 6.5T);F 盘 908G 已用 89%(仅剩约 107G)。 2026-07-17 已把最后一个数据文件 protein_info.csv 迁到 D 盘, 并清理了 5.2G 与 D 盘重复的旧副本。F 盘只放代码(git 仓)与文档。

⚠️ 2026-07-26 实测订正:「数据全部在 D 盘」只对 mr-pipeline 成立

两个后来建的项目把数据放在 WSL 内部,没走 D 盘约定:

位置体积内容丢了能否自动拿回
dr-amd-targets/data/scrna5.2 GGEO 单细胞矩阵✅ 可重下
dr-amd-targets/data/ega_retina908 MEGA 视网膜(受控访问)❌ 需重新走审批
multiomics-mr/03_meqtl_smr/gwas4.9 G由 FinnGen 生成的 .ma✅ 可重跑
multiomics-mr/03_meqtl_smr/mqtl663 M血 mQTL✅ 可重下
multiomics-mr/05_retina/data1.3 GAdvani Zenodo✅ 可重下

ega_retina 908M 必须单独备份——它是 EGA 受控数据,换机不能靠"重下", 要重新申请授权。建议移到 D:\mrdata\ega_retina\ 并在 WSL 建软链。

为什么不把所有数据都挪到 D 盘(实测)

因为 WSL 访问 /mnt/d 走 9p 协议,有实测代价:

WSL 原生 ext4/mnt/d(9p)倍数
顺序读吞吐859 MB/s126 MB/s6.8×
300 个小文件 stat/read0.01 s0.23 s~23×

所以正确的分层判据不是「数据 vs 代码」,而是「丢了能不能自动拿回来」:

放哪理由
代码F 盘 + git,WSL 只 pull仅 ~1.6 MB,无性能影响;Windows 可见可备份、有版本history
不可再生的原始数据D 盘(含 EGA 受控数据)125 G 不该塞进 WSL 的 vhdx;顺序大读 126 MB/s 可接受
可再生的热数据 + 产物WSL 原生快 6.8–23×;丢了能重下/重跑,换机不用搬

💡 代码全部使用相对路径 data/outcomedata/exposure/protein_info.csv, 数据搬家只需重指软链(ln -sfn 新路径 data/exposure/protein_info.csv),不用改任何代码

结果与配置

内容路径
结果.../mr-pipeline/results/screen_R9/screen_R13/*_significant.csv=显著蛋白,SUMMARY_publication.csv=汇总,figures/=图)
下游结果results/phewas/results/ldsc/+ldsc_R13/results/hyprcoloc_R9/+hyprcoloc_R13/
配置.../mr-pipeline/config.yamloutcome_manifest.csv(结局清单)

看结果最简单:直接在 RStudio 右下 Files 面板点开;或资源管理器地址栏粘 \\wsl.localhost\Ubuntu-24.04\home\research\mr-pipeline\results


二点五、数据家底与 LD 面板(2026-07-20 核对)

D:\mrdata\ 已是唯一完整副本,Server1 上没有本地缺的东西:

目录占用内容
ukbppp_regional/34 GUKB-PPP 每蛋白 cis 区域 tar(共定位/locus 图用)
outcome/33 GFinnGen R9 全套 + R13 + IAMDGC(6.47 G 解压版)+ GCST + Mahajan
singlecell/2.4 GHRCA hrca_allcells.h5ad
eqtl_retina_strunz/2.2 GStrunz 视网膜 NSR eQTL(22 条染色体)
ldsc/76 Meur_w_ld_chr + w_hm3.snplist
ldpanel/1.5 G1000G EUR PLINK 面板EUR.bed/bim/fam,GRCh37),locus 图算 r² 用

LD 面板只取了 EUR

Server1 /root/ldpanel/1kg.v3.tgz 里有全 5 人群(AFR/AMR/EAS/SAS/EUR)。本地只取了 EUR—— 本课题的 pQTL 与 GWAS 都是欧洲人群,用 EUR 才是对的。将来若做东亚人群那条差异化线,再去取 EAS。

不要把数据硬链到 web 目录后忘记删

早期为绕过跨墙限速,做法是把大文件硬链到 /var/www/roundcube/ 再经 Cloudflare 拉取。 这等于把数据挂到公网上——2026-07-20 巡检发现 5 个 FinnGen R13 文件(约 4 G)一直公开可下载,已删除(原件在 /root/finngen_r13/,硬链接 links=2,删 webroot 那份不影响本体)。 以后用完当次就删,或改用 scp 走代理直连。

三、怎么跑一次分析

在 RStudio 里开 Terminal(菜单 Tools→Terminal,或左下 Terminal 标签),敲:

bash
cd ~/mr-pipeline
git pull                       # ← 先拉最新代码!真源在 F 盘

Rscript analysis/01_screen.R R9       # 全并发症筛查 R9(manifest 驱动,23 结局)
Rscript analysis/01_screen.R R13      # 同上 R13(14 结局)
Rscript analysis/02_visualize.R results/screen_R9   # 生成 UpSet/森林/网络图

结果写到 results/screen_R9/(或 _R13)。参考耗时:R9 约 17 分钟,R13 约 11 分钟。

  • analysis/01_screen.R 断点续跑:按结局缓存,删/加结局重跑只算变化的;加 force 参数强制重算。
  • 结局清单在 outcome_manifest.csv(含病例/对照数,取自官方 manifest)。
  • 老脚本 legacy/batch_screen.R 仍在,但主入口已是 analysis/01_screen.R

⚠️ 跑长任务别用 wsl -e bash -lc "... &":后台任务会随父 shell 退出被杀。 用 setsid nohup ~/脚本.sh &,或直接在 RStudio Terminal 里跑。

下游分析

bash
Rscript analysis/03_phewas.R                  # PheWAS 脱靶扫描
Rscript analysis/05_hyprcoloc.R R9         # HyPrColoc 共定位
Rscript analysis/04_ldsc.R R13                # LDSC 遗传相关
./run_pipeline.sh                   # 串行链:HyPrColoc R9 → R13 → LDSC R13(幂等,可断点续跑)

四、更新到新版 FinnGen(如 R13/R14)要准备数据

流水线 MR 只需工具SNP那几千行,但预过滤前要先有全量文件。推荐流程:

  1. 在 Windows 侧挂代理直接下载全量 .gzD:\mrdata\outcome\ (Windows 已配系统代理 127.0.0.1:10809,浏览器/下载器直连 FinnGen 的 Google 存储,快且稳)。
  2. 不用改任何路径——data/outcome 已经软链到 /mnt/d/mrdata/outcome,下到那儿就能读到。
  3. outcome_manifest.csv 里加一行(release / id / 文件名 / 病例数 / 对照数 / …)。
  4. Rscript analysis/01_screen.R R13(断点续跑,只算新加的结局)。

为什么不在 WSL 里下:WSL 是 NAT 网络,够不到 Windows 的 localhost 代理; 在 Windows 下、WSL 经 /mnt/d最省事。


四点五、代码同步

链路:F 盘(真源) →git→ WSL(执行机) →mrsync→ 腾讯云(随身入口)

铁律:代码只在 F 盘改,另外两处只拉不改

bash
# ① F 盘改完代码(Windows 任意终端)
cd F:/project/mr-pipeline
git add -A && git commit -m "fix: 说清楚改了什么"

# ② WSL 拉下来跑
cd ~/mr-pipeline && git pull
Rscript analysis/01_screen.R R9

# ③ 需要时推腾讯云(在 WSL 里)
~/mrsync.sh diff        # 先看差异
~/mrsync.sh push --go   # 真推(不加 --go 只预演)

检查某台机器有没有跑偏

四个项目一起查(2026-07-26 起)——只查 mr-pipeline 会漏掉另外三个:

bash
for p in mr-pipeline multiomics-mr dr-amd-targets decode-rep; do
  printf '%-16s ' "$p"
  git -C "/home/research/$p" fetch -q origin 2>/dev/null
  mod=$(git -C "/home/research/$p" status --porcelain --untracked-files=no | wc -l)
  unt=$(git -C "/home/research/$p" status --porcelain | grep '^??' \
        | grep -cE '\.(R|py|sh|yaml)$')
  beh=$(git -C "/home/research/$p" rev-list --count HEAD..origin/main 2>/dev/null)
  echo "已改 $mod | 未跟踪代码 $unt | 落后 $beh 个提交"
done

判读:

  • 0 → 与真源一致,放心跑
  • 落后 > 0 → F 盘有新改动,git pull
  • 已改 > 0 → 有人在执行机上直接改了代码,必须回迁 F 盘再提交
  • 未跟踪代码 > 0 → ⚠️ 最危险的一类:新写的脚本从未入库,只要 WSL 出问题就没了

这个自检不是理论演练

2026-07-26 第一次跑这个检查,mr-pipeline 就查出 17 个已改 + 11 个未跟踪代码文件—— 包含产出当前全部结果的「分家」实现、分析阶段 17–21、以及 docs 已引用为证据的两个独立复算脚本。 当时若换机只拷 F 盘,一个结果都复现不出来。 详见本页上方的红框

建议:每次跑批前、以及任何"很久没动"之后,先跑一次这个循环。

查历史

bash
git log --oneline           # 改动流水
git log -p R/01_config.R    # 某文件的完整变更史

为什么腾讯云不用 git

ssh 进腾讯云是 ubuntu 用户但流水线文件属 researchgit push 无法像 rsync 那样 sudo 提权;且腾讯云在网络上够不着 F 盘。故继续用 mrsync.sh(只同步代码, 自动跳过 data/results/reference/、大文件;只增改不删除)。

完整版(含翻车恢复、环境陷阱)见仓库内 docs/代码同步与版本管理.md

为什么要有这套东西

2026-07-17 查明的真实事故:三份副本自 07-12 起就是互不知情的独立拷贝, 而 mrsync.sh 只管「WSL ↔ 腾讯云」,F 盘和 WSL 之间从来没有任何同步机制。 后果是 07-14 在 F 盘给引擎加的 LD 面板祖先一致性校验(assert_ld_ancestry_match) 四天没进 WSL——而 WSL 正是跑批的地方,那个已写进本文档的校验闸门一次都没生效过。

根因:代码编辑天然发生在 F 盘(编辑器、文档发布都在那),改既有文件时只落 F 盘; 只有新建文件时才会想起两边都写。所以分叉形态是「新文件到处都有、老文件只有 F 盘新」, 极其隐蔽,只能逐个比 md5 才发现。git 解决的正是这个:git status 一秒钟告诉你有没有偏离。


五、维护要点

  • 停/起 RStudio:WSL 里 sudo systemctl restart rstudio-server
  • 隧道状态:systemctl status mr-tunnel(autossh 自动重连)
  • 改密码:sudo passwd research(RStudio 登录);basic auth 改 /etc/caddy/Caddyfile 里 mr.stlog.cn 段
  • 分子动力学(lovejj 用户 + conda gmxmd/cgenff/md)与本环境完全隔离,互不影响

个人科研与运维文档 · 内容持续修订