WSL(Windows Subsystem for Linux)は、Windows上でLinuxを手軽に動かせる便利な環境です。
でも「LinuxのシェルからWindowsのファイルにアクセスしたい」「USBメモリや別ドライブをマウントしたい」と思ったとき、どう操作すればよいか迷ってしまうことはありませんか?
この記事では、WSL上でWindowsのドライブや外部メディアをマウント・利用する方法をわかりやすく解説します。
WSLとマウントの基本概念
WSLにおけるファイルシステムの仕組み
WSLでは、WindowsとLinuxの2つの異なるファイルシステムが共存しています。これらを橋渡しするのが「マウント」機能です。
ファイルシステムの種類
ファイルシステム | 説明 | アクセス方法 |
---|---|---|
Windows NTFS | Windows標準のファイルシステム | /mnt/c , /mnt/d 等 |
WSL内部 | Linux用のファイルシステム | /home , /var , /etc 等 |
ネットワーク共有 | SMB、NFSなどの共有フォルダ | カスタムマウントポイント |
外部メディア | USB、SD カードなど | カスタムマウントポイント |
WSL1 vs WSL2 の違い
WSL1の特徴
- WindowsカーネルでLinuxシステムコールを翻訳
- ファイルI/Oが高速(Windows側)
- Linux固有機能に制限あり
WSL2の特徴
- 実際のLinuxカーネルを仮想化で実行
- 完全なLinux互換性
- ファイルシステムマウント機能が豊富
マウントポイントの概念
# マウントポイントの確認
mount | grep drvfs
# 結果例:
# C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000)
# D: on /mnt/d type drvfs (rw,noatime,uid=1000,gid=1000)
重要なポイント
- マウントポイント:Linuxからアクセスするためのパス
- drvfs:WindowsドライブをLinuxから扱うためのファイルシステムタイプ
- 権限設定:uid、gidでアクセス権限を制御
WSLでWindowsファイルシステムにアクセスする
自動マウントされている /mnt 領域
WSLを起動すると、WindowsのCドライブやDドライブは自動的に以下のようにマウントされます。
Windows側 | WSL上のパス | 用途 |
---|---|---|
C:\ | /mnt/c | システムドライブ |
D:\ | /mnt/d | データドライブ |
E:\ | /mnt/e | 外付けドライブ等 |
実用的なアクセス例
Windowsのデスクトップにアクセス
# Windowsデスクトップに移動
cd /mnt/c/Users/$(whoami)/Desktop
# または環境変数を使用
cd "/mnt/c/Users/$USER/Desktop"
# ファイル一覧表示
ls -la
Windowsのドキュメントフォルダ
cd "/mnt/c/Users/$USER/Documents"
# 日本語環境の場合
cd "/mnt/c/Users/$USER/ドキュメント"
プログラムファイルへのアクセス
# Program Files
cd "/mnt/c/Program Files"
# Program Files (x86)
cd "/mnt/c/Program Files (x86)"
Windowsファイルの操作例
ファイルの検索とコピー
# Windows側のPDFファイルを検索
find /mnt/c/Users/$USER -name "*.pdf" -type f 2>/dev/null
# Windowsのファイルを WSL内にコピー
cp "/mnt/c/Users/$USER/Documents/report.pdf" ~/
# WSL内のファイルをWindowsにコピー
cp ~/script.sh "/mnt/c/Users/$USER/Desktop/"
ファイル権限の扱い
# Windows側ファイルの権限確認
ls -la /mnt/c/Users/$USER/Documents/
# 実行権限を付与(WSL内で)
chmod +x /mnt/c/Users/$USER/scripts/myscript.sh
# Windows側で作成したファイルをWSL内で編集
nano /mnt/c/Users/$USER/Documents/config.txt
日本語ファイル名・パスの扱い
日本語環境での注意点
# 日本語パスはクォートで囲む
cd "/mnt/c/Users/$USER/デスクトップ"
# タブ補完を活用
cd "/mnt/c/Users/$USER/ド<Tab>"
# スペースを含むパスの扱い
cd "/mnt/c/Program Files/Microsoft Office"
文字エンコーディング対応
# 日本語ファイル名のファイル検索
find /mnt/c -name "*日本語*" -type f 2>/dev/null
# iconv でエンコーディング変換
iconv -f SHIFT_JIS -t UTF-8 /mnt/c/data/sjis_file.txt > utf8_file.txt
外部ドライブとUSBメモリのマウント
WSL2での手動マウント
基本的なマウントコマンド
# USBドライブ(Dドライブ)をマウント
sudo mount -t drvfs D: /mnt/usb
# オプション付きマウント
sudo mount -t drvfs D: /mnt/usb -o uid=1000,gid=1000,fmask=133,dmask=022
# マウント確認
mount | grep usb
マウントオプションの説明
オプション | 説明 | 例 |
---|---|---|
uid=1000 | ファイル所有者のユーザーID | 現在のユーザーに設定 |
gid=1000 | ファイル所有者のグループID | 現在のグループに設定 |
fmask=133 | ファイル権限マスク | 644 (rw-r–r–) |
dmask=022 | ディレクトリ権限マスク | 755 (rwxr-xr-x) |
metadata | Linuxメタデータを保存 | WSL2で推奨 |
実用的なマウント例
# USBメモリをマウント(読み書き可能)
sudo mkdir -p /mnt/usb
sudo mount -t drvfs E: /mnt/usb -o uid=$(id -u),gid=$(id -g),fmask=113,dmask=002
# ネットワークドライブをマウント
sudo mkdir -p /mnt/network
sudo mount -t drvfs '\\server\share' /mnt/network
# 外付けHDDをマウント
sudo mkdir -p /mnt/external
sudo mount -t drvfs F: /mnt/external -o metadata
WSL2でのLinuxネイティブファイルシステム
物理ディスクの直接マウント
ディスクの確認
# Windows PowerShell(管理者権限)で実行
GET-CimInstance -query "SELECT * from Win32_DiskDrive"
# またはdiskpartを使用
diskpart
list disk
WSLでのマウント
# ext4ファイルシステムをマウント
wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4
# 読み取り専用でマウント
wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4 --options "ro"
# マウント確認
ls -la /mnt/wsl/
サポートされているファイルシステム
ファイルシステム | 読み取り | 書き込み | 備考 |
---|---|---|---|
ext4 | ✅ | ✅ | 最も安定 |
ext3 | ✅ | ✅ | 互換性良好 |
ext2 | ✅ | ✅ | シンプル |
XFS | ✅ | ✅ | 高性能 |
Btrfs | ✅ | ⚠️ | 実験的 |
ReiserFS | ✅ | ⚠️ | 非推奨 |
実用的なLinuxファイルシステム操作
# ext4 USBドライブをマウント
wsl --mount \\.\PHYSICALDRIVE3 --partition 1 --type ext4
# マウントされたドライブにアクセス
cd /mnt/wsl/PHYSICALDRIVE3p1
# Linuxコマンドで操作
sudo chown -R $USER:$USER /mnt/wsl/PHYSICALDRIVE3p1/data
chmod 755 /mnt/wsl/PHYSICALDRIVE3p1/scripts/*.sh
# ファイルシステムの状態確認
df -h /mnt/wsl/PHYSICALDRIVE3p1
高度なマウント設定とカスタマイズ
/etc/wsl.confでの自動マウント設定
基本設定ファイル
# /etc/wsl.conf を編集
sudo nano /etc/wsl.conf
[automount]
# 自動マウントを有効化
enabled = true
# マウントポイントの設定
root = /mnt/
# マウントオプション
options = "metadata,uid=1000,gid=1000,umask=022,fmask=11,case=off"
# クロスディストリビューション共有
mountFsTab = true
[network]
# ホスト名解決 generateHosts = true generateResolvConf = true
[interop]
# Windows実行ファイルの実行許可 enabled = true appendWindowsPath = true
詳細オプション解説
automountセクション
enabled
: 自動マウントの有効/無効root
: マウントポイントのルートディレクトリoptions
: デフォルトマウントオプションmountFsTab
: /etc/fstabの処理
おすすめオプション組み合わせ
# 開発者向け設定
options = "metadata,uid=1000,gid=1000,umask=002,fmask=113,case=dir"
# 一般ユーザー向け設定
options = "uid=1000,gid=1000,umask=022,fmask=133,case=off"
カスタムマウントポイントの作成
スクリプトによる自動マウント
#!/bin/bash
# mount_drives.sh - カスタムマウントスクリプト
# 関数定義
mount_drive() {
local drive_letter=$1
local mount_point=$2
local options=${3:-"uid=$(id -u),gid=$(id -g),fmask=113,dmask=002"}
if [ ! -d "$mount_point" ]; then
sudo mkdir -p "$mount_point"
fi
if ! mountpoint -q "$mount_point"; then
sudo mount -t drvfs "${drive_letter}:" "$mount_point" -o "$options"
echo "Mounted ${drive_letter}: to $mount_point"
else
echo "$mount_point is already mounted"
fi
}
# USBドライブの自動マウント
mount_drive "E" "/mnt/usb"
mount_drive "F" "/mnt/backup"
# ネットワークドライブ
sudo mount -t drvfs '\\nas\documents' /mnt/nas-docs
echo "Mount script completed"
systemdサービス化(WSL2)
# サービスファイル作成
sudo nano /etc/systemd/system/custom-mount.service
[Unit]
Description=Custom Drive Mount Service
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mount_drives.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
# サービス有効化
sudo systemctl enable custom-mount.service
sudo systemctl start custom-mount.service
ネットワーク共有のマウント
SMB/CIFS共有の接続
# 認証情報ファイル作成
sudo nano /etc/samba/credentials
username=your_username
password=your_password
domain=your_domain
# 権限設定
sudo chmod 600 /etc/samba/credentials
# SMB共有をマウント
sudo mount -t cifs //server_ip/share_name /mnt/smb \
-o credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8
NFS共有の接続
# NFS必要パッケージインストール
sudo apt update
sudo apt install nfs-common
# NFSマウント
sudo mount -t nfs server_ip:/path/to/share /mnt/nfs \
-o vers=3,proto=tcp,rsize=32768,wsize=32768
永続的なネットワークマウント
# /etc/fstab に追加
sudo nano /etc/fstab
# SMB共有
//server/share /mnt/smb cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8 0 0
# NFS共有
server:/path/to/share /mnt/nfs nfs vers=3,proto=tcp,rsize=32768,wsize=32768 0 0
アンマウント(取り外し)の方法
基本的なアンマウント操作
通常のアンマウント
# マウントポイントを指定してアンマウント
sudo umount /mnt/usb
# デバイスを指定してアンマウント
sudo umount /dev/sdb1
# 強制アンマウント(注意して使用)
sudo umount -f /mnt/usb
# 遅延アンマウント(使用中でもアンマウント予約)
sudo umount -l /mnt/usb
WSL2専用のアンマウント
# 物理ドライブのアンマウント
wsl --unmount \\.\PHYSICALDRIVE2
# 特定パーティションのアンマウント
wsl --unmount \\.\PHYSICALDRIVE2 --partition 1
# 全体のアンマウント
wsl --unmount
アンマウント前の確認作業
使用中プロセスの確認
# マウントポイントを使用しているプロセス確認
sudo lsof /mnt/usb
# または
sudo fuser -v /mnt/usb
# プロセスを終了
sudo fuser -k /mnt/usb
安全なアンマウント手順
#!/bin/bash
# safe_unmount.sh - 安全なアンマウントスクリプト
MOUNT_POINT=$1
if [ -z "$MOUNT_POINT" ]; then
echo "Usage: $0 <mount_point>"
exit 1
fi
echo "Checking processes using $MOUNT_POINT..."
PROCESSES=$(sudo lsof "$MOUNT_POINT" 2>/dev/null | wc -l)
if [ "$PROCESSES" -gt 1 ]; then
echo "Warning: $((PROCESSES-1)) processes are using $MOUNT_POINT"
sudo lsof "$MOUNT_POINT"
read -p "Force unmount? (y/N): " response
if [[ "$response" =~ ^[Yy]$ ]]; then
sudo fuser -k "$MOUNT_POINT"
sleep 2
else
echo "Unmount cancelled"
exit 1
fi
fi
echo "Unmounting $MOUNT_POINT..."
sudo umount "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo "Successfully unmounted $MOUNT_POINT"
else
echo "Failed to unmount $MOUNT_POINT"
exit 1
fi
パフォーマンス最適化とベストプラクティス
マウントオプションによる最適化
読み取り専用マウント
# 読み取り専用で高速マウント
sudo mount -t drvfs D: /mnt/readonly -o ro,noatime
# バックアップドライブの読み取り専用マウント
sudo mount -t drvfs E: /mnt/backup -o ro,noatime,norelatime
書き込み最適化
# 書き込み性能を重視したマウント
sudo mount -t drvfs D: /mnt/workspace -o rw,relatime,metadata
# 大容量ファイル操作用
sudo mount -t drvfs D: /mnt/bigfiles -o rw,noatime,cache=loose
ファイルシステム別の最適化
NTFS最適化
# NTFS最適化マウント
sudo mount -t drvfs D: /mnt/ntfs \
-o uid=1000,gid=1000,fmask=113,dmask=002,case=dir
ext4最適化
# ext4最適化マウント
wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4 \
--options "defaults,noatime,data=writeback"
監視とトラブルシューティング
マウント状況の監視
#!/bin/bash
# mount_monitor.sh - マウント状況監視スクリプト
echo "=== WSL Mount Status ==="
echo
echo "1. Auto-mounted Windows drives:"
mount | grep drvfs | while read line; do
echo " $line"
done
echo
echo "2. Custom mount points:"
mount | grep -v drvfs | grep -E "(cifs|nfs|ext[234]|xfs)" | while read line; do
echo " $line"
done
echo
echo "3. Disk usage:"
df -h | grep -E "(mnt|wsl)"
echo
echo "4. Active processes on mount points:"
for mp in $(mount | grep -E "(mnt|wsl)" | awk '{print $3}'); do
if [ -d "$mp" ]; then
processes=$(sudo lsof "$mp" 2>/dev/null | tail -n +2 | wc -l)
if [ "$processes" -gt 0 ]; then
echo " $mp: $processes processes"
fi
fi
done
自動修復スクリプト
#!/bin/bash
# mount_repair.sh - マウントエラー自動修復
repair_mount() {
local mount_point=$1
local device=$2
local fs_type=$3
local options=$4
echo "Repairing mount: $mount_point"
# アンマウント試行
if mountpoint -q "$mount_point"; then
sudo umount "$mount_point" 2>/dev/null
fi
# プロセス強制終了
sudo fuser -k "$mount_point" 2>/dev/null
# 再マウント
sleep 2
sudo mount -t "$fs_type" "$device" "$mount_point" -o "$options"
if [ $? -eq 0 ]; then
echo "Successfully repaired $mount_point"
else
echo "Failed to repair $mount_point"
fi
}
# 使用例
repair_mount "/mnt/usb" "E:" "drvfs" "uid=1000,gid=1000,fmask=113"
セキュリティとアクセス制御
権限管理
ユーザー権限の設定
# 特定ユーザーのみアクセス可能
sudo mount -t drvfs D: /mnt/private -o uid=1000,gid=1000,fmask=177,dmask=077
# グループアクセス許可
sudo mount -t drvfs D: /mnt/shared -o uid=1000,gid=1000,fmask=113,dmask=002
セキュアマウントの実装
# 暗号化ディスクのマウント
sudo cryptsetup luksOpen /dev/sdb1 secure_drive
sudo mount /dev/mapper/secure_drive /mnt/secure
# セキュアアンマウント
sudo umount /mnt/secure
sudo cryptsetup luksClose secure_drive
監査とログ
マウント操作のログ記録
# rsyslog設定
sudo nano /etc/rsyslog.d/50-wsl-mount.conf
# WSL mount logging
local0.* /var/log/wsl-mount.log
# ログ出力関数
log_mount_operation() {
local operation=$1
local mount_point=$2
local device=$3
logger -p local0.info "WSL_MOUNT: $operation $device to $mount_point by $(whoami)"
}
# 使用例
log_mount_operation "MOUNT" "/mnt/usb" "E:"
まとめ
Windows Subsystem for Linux(WSL)でのマウント機能を使いこなすことで、WindowsとLinuxの境界を意識せずに作業できる環境が構築できます。
重要なポイント
基本機能
- 自動マウント:Windowsドライブは
/mnt/c
,/mnt/d
に自動マウント - 手動マウント:
mount -t drvfs
でカスタマイズ可能 - ネイティブ対応:WSL2では
wsl --mount
でLinuxファイルシステムも利用可能
実用的な活用
- 開発環境:WindowsとLinuxツールチェーンの併用
- データ移行:異なるファイルシステム間でのデータ交換
- バックアップ:Linuxツールを使ったWindowsファイルのバックアップ
最適化とセキュリティ
- パフォーマンス調整:適切なマウントオプションの選択
- 権限管理:uid、gid、umaskによる細かな制御
- 自動化:スクリプトとシステムサービスによる運用自動化
コメント