- npmのグローバルインストール時にEACCESエラーが発生するのは、OS標準のNode.jsをそのまま使っていてシステム領域への書き込みができないためです。
- 通常は、sudoでインストールするのではなく、まずNVMをインストールします。
NVMを一度インストールしておけば、Node.jsがユーザーのホームディレクトリ以下にインストールでき、npmはsudoなしでグローバルパッケージを扱えるようになります。 - インストールはcurlでスクリプトを実行するだけで、LTS版のNodeもワンコマンドで導入できます。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
source ~/.bashrc
nvm install --lts
nvm alias default lts/*Code language: PHP (php)
1. npmでEACCESエラーが発生する理由
Linux環境で npm install -g を実行したとき、以下のようなアクセスエラーが発生するのは、システム標準のNodeをそのまま使っているからです。
npm error code EACCES
npm error Error: EACCCES: permission denied
Code language: JavaScript (javascript)

開発用途ではNVMをインストールして使うのが定番の構成で、そうすればこのエラーは起きません。npmの公式ドキュメントも、EACCESの解決策としてNVMの使用を第一に推奨しています1。
EACCESは「アクセス権限がない」ことを示すエラーです。Node.jsとnpmがOSのパッケージ管理システム(aptなど)によって /usr/bin にインストールされていると、npm install -g はグローバルモジュールディレクトリに書き込もうとします。このパスはディストリビューションによって /usr/lib/node_modules または /usr/local/lib/node_modules になりますが2、いずれも /usr 配下はroot専用領域なので、一般ユーザーには書き込み権限がありません。
sudoを使えばインストールは通りますが、root所有ファイルが混在して権限の不整合が発生します。
1.1. NVMとは何か
そのため、開発用途ではNVMを利用します。
NVMはNode Version Managerの略で、Node.jsのバージョン管理ツールです。
NVMを使うと、Node.jsが /usr ではなく ~/.nvm にインストールされます。npmのグローバルインストール先もユーザー領域になり、sudoが不要になります。Nodeのバージョンをプロジェクトごとに切り替えることもできます。グローバルCLIツールをインストールしても、システム領域に影響しません。NVMはbash・zsh・kshなどPOSIX準拠のシェルであれば動作し、Linux・macOS・Windows(WSL)をサポートしています3。
2. NVMのインストール方法
以下はbash環境での手順です。
2.1. NVMのインストール
記事執筆時点の最新バージョンはv0.40.4です。
インストールスクリプトのURLに含まれるバージョン番号は、公式リポジトリのリリースページで最新版を確認してから実行してください4。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
Code language: JavaScript (javascript)

設定を反映します。
source ~/.bashrc
zshを使っている場合は ~/.bashrc ではなく ~/.zshrc を読み込んでください5。
正しくインストールされたか確認します。
command -v nvm
nvm と表示されれば成功です。
2.2. Node.jsをインストール(LTS版)
LTSはLong Term Supportの略で、長期サポートが保証された安定版です。
Node.jsは偶数のメジャーバージョンのみLTS対象となり、リリースから約30ヶ月間サポートが継続されます6。
nvm install --lts
デフォルト設定をします。
nvm alias default lts/*
Code language: JavaScript (javascript)
このエイリアスを設定すると、新しいターミナルを開くたびに自動でLTS版が有効になります7。
動作を確認します。
which node
npm config get prefix
Code language: JavaScript (javascript)
~/.nvm 配下を指していれば、ユーザー管理のNode環境になっています。
3. パッケージを再インストールするには
NVMをインストールすると、すでにシステム(/usr/lib)にグローバルインストールされていたパッケージが検出されます。
残しておいても動作上の問題はありませんが、NVM管理のNodeからは見えない状態になるので、必要なパッケージはNVM環境に改めてインストールし直すのが整理しやすいです。

たとえば、画面には @openai/codex・corepack・lighthouse の3つが表示されています。
NVMはこれらを自動で削除せず、消したいなら自分でコマンドを実行する必要があります。
nvm use system # システムのNodeに切り替える
sudo npm uninstall -g パッケージ名
Code language: PHP (php)

nvm use system でいったんシステム側のNodeに戻してから、npm uninstall -g で削除する流れです(このときは管理者権限が必要です)。
終わったら、またnvmを戻して、インストールし直せばよいわけです。
nvm use lts/*
npm install -g パッケージ名Code language: PHP (php)- npmの公式ドキュメント「Resolving EACCES permissions errors when installing packages globally」では、バージョンマネージャを使う方法をベストプラクティスとして挙げています。 – Resolving EACCES permissions errors when installing packages globally
- Ubuntuなどのaptベースの環境では
/usr/lib/node_modules、macOSやHomebrewベースの環境では/usr/local/lib/node_modulesになることが多いです。実際のパスはnpm config get prefixで確認できます。 – Error: EACCES: permission denied, access ‘/usr/local/lib/node_modules’ - NVMの公式READMEには「nvm works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), on these platforms: unix, macOS, and windows WSL」と記載されています。 – nvm-sh/nvm
- NVMの最新リリースはGitHubのリリースページで確認できます。記事中のv0.39.7より新しいバージョンが公開されている場合は、URLの番号を置き換えてください。 – Releases · nvm-sh/nvm
- NVMのインストールスクリプトは、使用しているシェルに応じて
~/.bashrc・~/.bash_profile・~/.zshrc・~/.profileのいずれかを自動で更新します。どのファイルが更新されたかはインストール時の出力メッセージで確認できます。 – nvm-sh/nvm - Node.jsのリリーススケジュールでは、偶数バージョン(20、22、24など)がLTSに昇格し、アクティブサポートが12ヶ月、その後メンテナンスフェーズが18ヶ月続きます。奇数バージョンはLTSにはなりません。現時点の最新LTSはNode.js 24(コードネーム「Krypton」)です。 – Node.js Releases
nvm alias default lts/*を設定しない場合、新規シェルではNVMが読み込まれてもNode.jsのバージョンが自動選択されないことがあります。エイリアスを設定しておくと、毎回nvm useを実行する手間がなくなります。 – Install Node.js Locally with Node Version Manager (nvm)