はじめに (対象読者・この記事でわかること)

この記事は、WSL2(Windows Subsystem for Linux 2)を使用して開発環境を構築している方、特にLinuxのコマンドやスクリプトを利用している方を対象にしています。Windows環境でLinux開発を行っているエンジニアや学生に役立つ内容です。

この記事を読むことで、WSL2環境でshスクリプトを実行した際にmkdirコマンドがパーミッション不足で失敗する問題の原因を理解し、適切な解決策を適用できるようになります。また、WSL2のファイルシステムの特性とパーミッションの仕組みについても理解を深めることができます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Linuxの基本的なコマンド操作(特にmkdir、chmod、chownなど) - WSL2の基本的な概念と仕組み - シェルスクリプトの基本的な知識

WSL2におけるファイルシステムとパーミッションの特性

WSL2は、WindowsとLinuxの間に特有のファイルシステムの仕組みを持っています。特に、Windowsのファイルシステム(Cドライブなど)にアクセスする際には、LinuxのパーミッションモデルとWindowsのアクセス制御の間で非互換性が生じることがあります。

WSL2では、Windowsのファイルシステムは「/mnt/」ディレクトリ以下にマウントされます。例えば、Cドライブは「/mnt/c/」としてアクセスできます。この領域では、LinuxのパーミッションがWindowsのアクセス権限に変換されるため、通常のLinux環境とは異なる挙動を示すことがあります。

特に、mkdirコマンドがパーミッション不足で失敗する問題は、この変換プロセスに起因することが多いです。Windows側でのファイルアクセス権限がLinuxのパーミッションに正しく反映されていない場合、Linuxのコマンドが意図通りに動作しないことがあります。

mkdirがパーミッション不足で失敗する問題の解決方法

問題の再現

まず、問題を再現する方法を確認しましょう。以下のようなシェルスクリプトを作成し実行することで、問題を簡単に再現できます。

Bash
#!/bin/sh mkdir /mnt/c/temp/test_dir

このスクリプトをWSL2内で実行すると、「mkdir: cannot create directory '/mnt/c/temp/test_dir': Permission denied」というエラーが発生することがあります。

解決策1: Windows側での権限設定

最も直接的な解決策は、Windows側で適切な権限を設定することです。

  1. Windowsエクスプローラーで「C:\temp」ディレクトリを開きます
  2. 右クリックして「プロパティ」を選択します
  3. 「セキュリティ」タブを開きます
  4. 「編集」ボタンをクリックして、現在のユーザーまたは「Everyone」に「書き込み」権限を付与します
  5. 「適用」および「OK」をクリックして変更を保存します

これにより、Windows側でのアクセス権限が適切に設定され、WSL2からもディレクトリを作成できるようになります。

解決策2: Linux側でのユーザー設定

Windows側での権限設定が難しい場合、Linux側でのユーザー設定で解決することも可能です。

  1. WSL2内で以下のコマンドを実行して、現在のユーザーとWindowsのユーザーを紐付けます
Bash
sudo usermod -aG $(grep $(whoami) /etc/group | grep vboxsf | cut -d: -f1) $(whoami)
  1. その後、WSL2を再起動します

  2. 再度mkdirコマンドを実行して、問題が解決するか確認します

解決策3: 別のディレクトリを使用する

可能であれば、Windowsのファイルシステムではなく、Linuxのファイルシステム内で作業を行うことで、この問題を回避できます。

Bash
# Linuxのファイルシステム内にディレクトリを作成 mkdir ~/test_dir

または、WSL2のホームディレクトリ内で作業を行うことを推奨します。

解決策4: sudoを使用する

一時的な解決策として、sudoを使用してroot権限でディレクトリを作成することも可能です。

Bash
sudo mkdir /mnt/c/temp/test_dir

ただし、この方法はセキュリティ上のリスクがあるため、注意が必要です。

ハマった点やエラー解決

この問題を解決する際に、多くのユーザーが以下のような点でつまずきます:

  1. WindowsのUAC(ユーザーアカウント制御)の影響: UACが有効になっている場合、管理者権限が必要な操作がブロックされることがあります。Windowsの設定でUACを一時的に無効にして試すことがありますが、セキュリティ上のリスクがあるため推奨されません。

  2. WSL2のバージョンによる違い: WSL2のバージョンによっては、ファイルシステムの実装が異なる場合があります。WSL2を最新版にアップデートすることで、問題が解決することがあります。

  3. 所有権の問題: Windows側でのファイル所有者が、WSL2からアクセスしているユーザーと一致していない場合も問題が発生します。chownコマンドを使用して所有権を変更することで解決できる場合があります。

Bash
sudo chown -R $(whoami):$(whoami) /mnt/c/temp

まとめ

本記事では、WSL2でshスクリプト内でmkdirコマンドがパーミッション不足で失敗する問題について、その原因と解決策を解説しました。

  • WSL2のファイルシステムはWindowsとLinuxの間で特有の挙動を示す
  • 解決策としてWindows側での権限設定、Linux側でのユーザー設定、別のディレクトリの使用、sudoの利用がある
  • 問題解決には、UACの影響、WSL2のバージョン、所有権の問題に注意が必要

この記事を通して、WSL2環境での開発がよりスムーズになることを願っています。今後は、WSL2のその他のトラブルシューティングや最適化についても記事にする予定です。

参考資料