1 はじめに
WSL(Windows Subsystem for linux)のUbuntuをインストールしてから使いやすくするまでの設定を行い、awsサーバにSSH接続するまでに紆余曲折があったので備忘録を兼ねて投稿します。本当に書きたかった備忘録は最後の罠というマウントがうまくいかず、sudo chmod
やsudo chown
ができなかったことです。
2 環境
Windows 10 Home バージョン1803
Ubuntuアプリ(Ubuntu 16.04.5 LTS (Xenial Xerus))
あとで書くパーミッションの設定や所有者の変更がバージョン1803以降の対応とのことなので必須です。
3 前提
Ubuntuを導入し、アプリを初めて起動するまではいろんなところに書いてあるので割愛します。また、以下最初に登録するユーザー名をuser_nameと代表して書くことにします。
Windowsのファイルの扱い
アクセス方法
WSLでWindowsのCドライブやDドライブにアクセスするためのアドレスは、/mnt/c
や/mnt/d
です。ここにcd
などで移動すれば普段Windowsの環境で作成しているデータにアクセスすることができます。
WindowsとLinux、WSLのファイルやディレクトリの扱いの違い
Windows
Windowsの環境で、管理者のアカウントでログインしているときに生成したファイルやディレクトリのパーミッションはすべて777、つまりrwxrwxrwxです。さらに、所有者はroot、グループもrootになります。
Linux
Linuxの環境でのパーミッションは、ディレクトリを作成するときはふつう755、つまりdrwxr-xr-xであり、ファイルは644、つまり-rw-r--r--です。つまり、WindowsのデフォルトとLinuxの普通の環境で使うものでは大きな乖離があります。
WSLのデフォルト
さらに、WSLで特に設定しなかった場合、WSLのUbuntu上でもWindows環境と同じくすべて777になるということも覚えておく必要があると思います。また、WSL上でファイルやディレクトリを作成したときは所有者もグループもuser_nameになります。
また、デフォルトのホームディレクトリの場所は/home/user_name/
であり、これは/etc/passwd
の中の
/etc/passwd
user_name:x:1000:1000:,,,:/home/user_name:/bin/bash
とデフォルトでは規定されています。
4 パーミッションの設定を行う方法
Linuxのようにパーミッションや所有者の変更を行うsudo chmod
やsudo chown
を実行するためには/etc/wsl.conf
に以下のものを用意し、
[automount]
enabled = true
options = "metadata, umask=22, fmask=11"
mountFsTab = false
ホームディレクトリ直下にある.profile
に
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
# umask 022
と書いてあるので次のように最後に書いておき、
umask 022
以下のコードの実行が必要です。
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata
これでいったんCドライブのマウントを解除し、その後オプション付きでマウントしなおすことでパーミッションや所有者の変更ができるようになります。(1つめのアンマウントは/etc/wsl.conf
の1行目を削除すればいいかもしれませんね)
これを自動化することができなかったので自分は現在仕方なく、
sudo umount /mnt/c ; sudo mount -t drvfs C: /mnt/c -o metadata
という内容のファイルを作成しこれを実行するエイリアスを作成して実行しています。
5 SSHの接続
ここまでお膳立てしなくてもよいですが、次にSSHでサーバに接続したいと思います。このときに、鍵を指定してssh -i (鍵) (アドレス)
とするとアクセスしたいですが、この鍵がWindows環境で準備したときの場合、以下のようにエラーが出て接続できません。
Load key "鍵の名前": Permission denied
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
理由は単純で、パーミッションが開きすぎているからです。
したがって、SSHしたい鍵については、鍵のパーミッションを600に、その鍵が存在するディレクトリのパーミッションを755に変更します。
これで接続できました。
6 罠
Linux環境のホームディレクトリはデフォルトでは/home/user_name/
ですが、これを使いやすくするために最低限の安全性を確保するためにCドライブ直下の/mnt/c/linux_home_dir
などをホームディレクトリとして設定し、
user_name:x:1000:1000:,,,:/mnt/c/linux_home_dir:/bin/bash
とする方法があると思います。しかし、これが少しだけ罠で、当然ですがcd
などでカレントディレクトリをCドライブの中にしていたり、上記の設定をしていて起動直後にCドライブの中にいたりして、この状態でsudo chmod
などを使うようにするための設定を行おうとすると、以下のエラーが出ます。
$ sudo umount /mnt/c
umount: /mnt/c: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
mount: C: is already mounted or /mnt/c busy
C: is already mounted on /mnt/c
この理由を探ると以下になります。
$ fuser -muv /mnt/c
Cannot open /proc/net/unix: No such file or directory
USER PID ACCESS COMMAND
/mnt/c: root kernel mount (root)/mnt/c
user_name 19154 ..c.. (user_name)bash
rootユーザーとuser_nameが悪さをしているというわけです。ちなみにkill
を用いてuser_nameのほうを終了させるとUbuntuアプリが落ちます。当然ですね。
前振りから明らかだとは思いますが、理由はUbuntuアプリのカレントディレクトリがCドライブ内だからです。気を付けてください。