ここのところ『スッキリわかるC言語』という本でC言語の勉強をしていました。 その本では、VirtualBoxとVagrantによる仮想マシン上の開発環境を用意しており、ガイドに従ってインストールをすすめるだけで環境構築が完了するのですが、その環境は私のPCには重すぎでした。それにWindows側とのファイルのやり取りもちょっと面倒なので、もうすこし気軽に勉強できる環境を作りたいなと思いました。

いろいろ調べてみるとWindows Subsystem for Linux(WSL)を使えばWindows上にLinux環境を作れるうえにWindows側とのファイルのやりとりも比較的シームレスでなおかつそんなに重くないらしい、とのこと。うずっときたので勉強そっちのけでWSLの環境づくりに走りました。

ご注意

2019年5月5日ごろの情報です。

初心者がわけわからないままネットで調べては試してみただけの記録です。 勘違いなどが含まれる可能性もありますので、万が一参考にする場合は気を付けてください。

変なところがあったら教えていただけるとうれしいです!

事前の環境

  • Windows10 Home 64bit Version 1809
  • Visual Studio Code インストール済み
  • Git for Windows インストール済み
  • カスペルスキー インターネット セキュリティ 2019

WSLとは

Windows Subsystem for Linux(WSL)は、Windows10上で仮想マシンを使用せずにLinuxの実行ファイルを利用できるようになる仕組みです。

仮想マシンではないのでリソース消費が少なくて済むようです。

カスペルスキーを使っている場合

セキュリティソフトにカスペルスキー2019を使っているんですが、その監視のせいで以下のセッティング中にたびたびエラーが生じました。 エラーの際一時的に次のようにポートの監視を外すとすんなり解決する場合が多かったので記しておきます。

左下の歯車アイコン>詳細>ネットワーク>ネットワークポートの「選択…」

と進み、ポート443や80を右クリックして「無効にする」ことで監視が外れます。

port監視を外す

このまま外しっぱなしでもいいというサイトもありましたが、私は一応用が済んだら元に戻しています。

また「ネットワークポート」の下の「暗号化された接続のスキャン」を外すとエラーを回避できるケースもありましたが、それはその時に説明します。

WSLのセッティング

  1. コントロールパネルを開く
  2. 「Windowsの機能の有効化または無効化」で検索
  3. 「Windows Subsystem for Linux」にチェックを入れる
  4. 指示に従い再起動

Ubuntuのインストール~初期設定

Ubuntuのインストール

  1. スタート > 「Microsoft Store」を開く
  2. 「Ubuntu」 で検索
  3. インストール
    Ubuntuインストール
  4. Ubuntu起動
  5. ユーザー名とパスワードを設定する。パスワードはキーを打ち込んでも何も表示されないが入力はされているので注意。
    ユーザー名とパスワードを設定

リポジトリの変更

デフォルトではapt(ソフトウェアのパッケージ管理システム)のリポジトリ(パッケージの保管場所)が海外サーバーになっていて通信速度が遅いです。 日本のサーバーに変更することで速くなります。

以下はJaistのサーバーに変更するコマンドの引用です。

$ sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list

出典:Qiita - Windows Subsystem for Linuxをインストールしてみよう!#初期設定

パッケージアップデート

$ sudo apt update
$ sudo apt upgrade

何か聞かれたらYキー押してEnter。

パーミッションを変更

WSLはデフォルトではumask0000になっていて、パーミッションがディレクトリで777、ファイルで666となっています。 これはだれでもファイルを書き換えられてよくないらしいので、所有者以外に対しては読み取り権限だけに制限するように変更します。

ubuntuのホームディレクトリにある隠しファイルの.profileを編集します。 今回はvimというエディタを使います。

$ vim ~/.profile

oキーで挿入モードにして、#umask 022というコメントの#を取り、escキーで挿入モードを終了、:wqと打ってエンターキーで保存して編集終了します。 ミスしたときは:q!で保存せずに編集終了することもできます。

また/etc/wsl.confも編集します。

$ sudo vim /etc/wsl.conf

で次のように入力して保存します。

[automount]
options = "metadata"

exitでコンソールを終了し、Shift + Ctrl +Escキーでタスクマネージャーを開き、[サービス]タブ内のLxssManagerを右クリックして「再起動」。 再びコンソールを開いて、

$ umask

0022と出たら成功です。

なお.profileを編集せずにwsl.confのほうでmetadataの後ろに,umask=22,fmask=11などと設定しているサイトが結構あったんですが、試してみたらumask0000から変わらなかったです。 上記の.profileを編集する方法ならうまくいきました。

また.profileを編集するやり方でもumaskの値が0000から変わらなかったり、0000に戻ってしまった場合は、.profileより優先的に読み込むファイルが出来ていたりして、そもそも読み込まれていない可能性を疑ってみるといいかもしれません。

  • 最初ホームディレクトリには.profileしかなかったので.profileを編集しましたが、 ~/.bash_profile、~/.bash_loginが存在する場合そちらが優先的に読み込まれるようです。
  • また後述のfishをデフォルトシェルにするとfishの設定ファイルを使うので、bashの設定ファイルは無視されるようです。

参考:bashの環境設定ファイルについて - ユーザーの環境変数を設定するbashの設定ファイルと、カスタムプロンプトについて - OXY NOTES

日本語化

次のページの通りにやりました。

WSLのUbuntu環境を日本語化する - Tech TIPS - @IT

fishの導入

特にここはカスペルスキーの妨害が激しかったので前述のやり方で監視を外したほうがスムーズにいくと思います。

sudo apt-add-repository ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get install fish

bash起動時にfishを自動で起動する

たいていの解説ページではfishをデフォルトシェルに変更しているんですが、 記法が異なったりしていてfishの設定ファイルにbashの設定を移植するのが大変そうなのでやめておきました。

とはいえいちいち手動でfishを起動するのも面倒なので、次のようにして.bashrc から fish を起動するように設定します。

.bashrcを編集し、

$ vim ~/.bashrc

以下の行を追加します。

exec fish

これでデフォルトシェルがbashのままfishを自動で起動できます。またbashを使いたい時はbash --norcコマンドで切り替えます。

参考:#fish をデフォルトシェルに設定しない - fish - ArchWiki - Arch Linux

ちなみに上のやり方だと次のページのように、今後インストールするものによってはエラーが出る場合もあるらしいです。 エラーが出たらそのときに、exec fishが最後に読み込まれるようにbashの設定ファイルを修正すればよさそうです。

参考:デフォルトシェルをfishに変えるな

このあとfisherというfish用のプラグインマネージャをインストールしてプラグインを導入しようとしたんですが、やたらとエラーになってコンソールが操作不能になる上検索してもよくわからなかったので諦めました。

fish使わないほうが平和な気がしてきた。とりあえずは生魚で行ってみようと思います。デフォルトのbashよりは十分便利だし。

VSCode

VSCodeのsettngs.jsonに次のようにパスを追加することで、WSLのターミナルをVSCode内に開けるようになります。

"terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe",

コンソールはCtrl+@で開くことができます。またVSCodeでターミナルを開くとカレントディレクトリがプロジェクトフォルダの場所になります。

ちなみにsettings.jsonの開き方は、

ファイル>基本設定>設定

と進むと次の画像のような画面になるので、右上の”{}“をクリックすると開きます(2019年5月5日現在)。

settings.jsonの開き方

Git

wslgitをインストール

WSLGit からwslgit.exeをダウンロードして適当なフォルダに入れ、VSCodeのsettings.jsonに

"git.path": "C:\\tools\\wslgit.exe",

たとえばこんな感じでパスを追加します(例はC:\tools\に入れた場合)。

なおVisual Studio 2017用の最新のMicrosoft Visual C ++再頒布可能パッケージをインストールする必要があるみたいです。

Gitの初期設定

$ git config --global user.name "<ユーザー名>"
$ git config --global user.email "<メールアドレス>"

これでいちいちGit bashを立ち上げずにすむぞー

とおもったらなんかpushがエラーで通りません。

fatal: unable to access 'https://github.com/yuhine/MyBlog01.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.

カスペルスキーで

設定(左下の歯車アイコン)>詳細>ネットワーク>「暗号化された接続のスキャン」の下の「除外リストの管理」>「追加」

ときて「ドメイン名」に”https://github.com”を入力し「ステータス」を「有効」にして「追加」

除外リストに追加1
除外リストに追加2

これで通りました。 除外設定を削除するとまたpushが通らなくなってしまうのでこのままで行こうと思います。

https接続で毎回ユーザー名とパスワードの入力を求められる問題

Git for Windowsをインストールすると”Git Credential Manager”という認証情報のマネージャがついてくるんですが、 今まで私はGitHubにhttps接続する際”Git Credential Manager”を使ってユーザー名とパスワードを省略していました。今回WSLのコンソールからhttps接続してみるとpush時などにユーザー名とパスの入力を毎回求められるので面倒です。

Git Credential Manager with Windows Subsystem for Linux - Edward Thomson

上記ページにGit Credential ManagerをWSLで使う方法がばっちし書いてありました。 引用させていただくと、次のようなコマンドです(パスの部分はGitのインストールフォルダによって変わります)。

$ git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"

ところがgit-credential-manager.exeがパーミッションエラーで弾かれてしまいました。

色々いじってみたところ、

エクスプローラで”git-credential-manager.exe”を右クリックし、

プロパティ>「セキュリティ」タブ>「編集」ボタン>「Users」をクリック>「書き込み」にチェック>「適用」>「OK」>「OK」

このようにしてみると入力なしでpush等できました。 その後「書き込み」のチェックを外してみましたが、そのままユーザー名などの入力なしでpushできました。 意味がよくわかりませんが、うまくいったのでよしとします。

なおGit for Windowsをインストールしたくない場合は、Git Credential Manager単体でインストールしてもいけるかもです(試してないですが)。

Cコンパイラなど

次のコマンドでC/C++コンパイラやMakeなどの標準開発ツール一式をインストールできます。

$ sudo apt install build-essential

Windows側のフォルダにある.cファイルをVSCodeのコンソールからコンパイルすることができました。とりあえず目標達成です。ついでにVSCodeの拡張機能から「C/C++」をインストールしておきました。

ついでにhugoもインストール

$ sudo apt install hugo

でやるとバージョンが古すぎるので、以下のようにします。

新しいバージョンをダウンロード。Releases - gohugoio/hugo から最新版の”hugo_<バージョン番号>_Linux-64bit.deb”を右クリックして「リンクのアドレスをコピー」し、wgetコマンドなどでダウンロードします。

$ wget https://github.com/gohugoio/hugo/releases/download/v0.55.5/hugo_0.55.5_Linux-64bit.deb

このときカスペルスキーでポート443の監視を外さないとエラーになりました。ダウンロードが終わったら監視を戻しました。

$ sudo apt install ./hugo_0.55.5_Linux-64bit.deb

そしてインストール

$ hugo version
Hugo Static Site Generator v0.55.5-A83256B9 linux/amd64 BuildDate: 2019-05-02T13:03:36Z

最新版になってます。

これでVSCodeだけでブログの更新ができるようになりました。

なにやらおかしくなった場合

わりと手軽にUbuntuの再インストールをしてやりなおすことができます。

コントロールパネル>アプリ>アプリと機能>Ubuntuをクリック>詳細オプション>リセットをクリック

感想

はじめてのLinux系

Linuxはほとんど接点なかったので調べるのが大変でした。 パーミッションエラーがやたら出てつらい。

カスペルスキー

あととにかくカスペルスキーでハマりました。 WSLと相性が悪いのかな? しっかり防いでるってことかもしれないけど、こう頻繁に通信エラーになるとさすがに面倒くさいです。 次は違うセキュリティソフトも検討するかも。

できた環境について

WSL内のubuntuにインストールしたアプリケーションでWindows側のファイルを普通に操作できるし私のPCでもそこまで重くもないです。 Windows用のアプリケーションをインストールして使ってるのとあまり変わらない感覚です。

とりあえずVSCodeだけで.cファイルのコンパイルとGitとHugoのブログ更新ができるようになったので今のところ満足です。