---
date: 2026-05-08
type: error
tags: [nvm, npm, prefix, sudo, install, ops]
---

# nvm 的 npm 也会读到 system 级 `prefix=/usr`，导致 `npm install -g` 全部 EACCES

## 现象

AIxC UAT/PROD 升级 Node 22 时，刚装完 nvm + Node 22 后跑：

```bash
$HOME/.nvm/versions/node/v22.21.1/bin/npm install -g pm2
```

报：

```
npm error permissions of the file and its containing directories,
or try running the command again as root/Administrator.
```

但用户级目录 `~/.nvm/versions/node/v22.21.1/lib/node_modules/` 完全有写权限。

## 根因

nvm 的 npm 走 `npm config get prefix` 拿到的值 = **`/usr`**！

不是 `~/.nvm/versions/node/v22.21.1`（nvm 应该写入的路径）。

`~/.npmrc` 干净（只有 `registry=...`），`/etc/npmrc` 不存在 —— 但 npm 仍报 prefix=/usr。

可能来源：
- 历史上有人跑过 `sudo npm config set prefix /usr -g`，写到了 `${prefix}/etc/npmrc` 即 `/usr/etc/npmrc`
- 或环境变量 `npm_config_prefix=/usr` 在 shell rc 文件里
- AIxC 两台机器恰好都有这个污染（apt 装 Node 时的副作用）

不管来源，**结果一样**：nvm 的 npm 想往 `/usr/lib/node_modules/` 写，需要 root → EACCES。

## 解决

### 单次绕过

```bash
$NVM_BIN/npm install -g pm2 --prefix=$HOME/.nvm/versions/node/v22.21.1
```

### 永久修

```bash
$NVM_BIN/npm config set prefix $HOME/.nvm/versions/node/v22.21.1
```

这会写到 `~/.npmrc`（user 级，覆盖 system 级 npmrc），之后 `-g` 自动装到 nvm 目录。

## 不直观点

1. nvm 文档/教程默认假设"装 nvm 后 npm prefix 自动指向 nvm 目录"——**这只在干净系统上成立**。如果系统上历史装过 apt npm 并配过 `prefix=/usr`，就会污染所有后续 npm 实例（包括 nvm 的）
2. `~/.npmrc` 不显示 prefix，只能靠 `npm config get prefix` 才能发现
3. 错误信息 "permissions ... try running as root" 是误导性的——真正的问题是 prefix 配错，不是缺 sudo

## 标准排查流程

发现 nvm 的 `npm install -g` 报 EACCES 时：

```bash
# 第一步：确认 prefix
$NVM_BIN/npm config get prefix
# 期望值：~/.nvm/versions/node/<version>
# 异常值：/usr 或 /usr/local

# 第二步：如果异常，修
$NVM_BIN/npm config set prefix $HOME/.nvm/versions/node/<version>

# 第三步：重试
$NVM_BIN/npm install -g <pkg>
```

## 适用范围

任何"系统先装过 apt/system Node，后来切到 nvm"的环境。AIxC 两台都是这种情况（先 apt nodejs，后我们切 nvm）。FFAI 那边用户级 nvm 装机时直接装的，没污染。

下次有人在新环境装 nvm 后第一次 `npm install -g`，把 `npm config get prefix` 当作必查项目。

## 关联

- 工单 #242 / `ERR-20260508-001`（nvm Node 升级 4 连环坑）
- AIxC UAT/PROD 升级（2026-05-08）
