2016年4月12日火曜日

Bash on Ubuntu on Windowsメモ

単なるメモ
間違いがあっても知らね



そもそも何❓


windows10次期アップデートでは開発者モードに windows subsystem for linux(WSL)と呼ばれる機能が追加される.このWSLは ubuntu on windows というubuntuの派生ディストリビューションの動作環境で,具体的な機能としては bash on ubuntu on windows が挙げられる.これまでコマンド実行環境として標準的だったcmd.exe及びpowershell(ないしはwsh)に加え,新たにbashが使えるようになる.

windowsから見えるbash.exe(system32にある.名称:bashランチャー)はubuntu on windows環境に対するコンソールを定義しており、ここから透過的にubuntuのbashシェルを操作することができる.その際ubuntu on windowsとwindows10とでファイルシステムを共有しているため,bashによるファイルの操作はダイレクトにwindows側に反映される.

これだけならcygwinとあまり変わらない気もするが.実際はもっと凄いことをしている.WSLはlinuxシステムコールをカーネルレベルでwindowsのものに変換するのでlinux用のアプリケーションをそのままwindows環境で実行できるのだ.つまり「linux環境におけるwine」の役割をそのまま逆にしたものと考えてよい.

加えてcanonicalに頼み込んでubuntuそのものを乗せちまった事がまさに画期的で,ubuntuで動くものはubuntu on windowsでもそのまま動く公算が高い.よってubuntuにおける豊富なソフトウェア資産や知識をそのままwindowsに移行できる.実際ubuntu on windows内で動作しているbashはubuntuにおけるbashそのものだし,grepとかawkとかも違和感なく使える.perlやrubyやpythonだっていい.何でもありだ.足りない機能をapt-getで一発インストールできるのも良い.

このように非常に魅力的な機能だが,そうは言っても効果的な使い途については未知数.また, 視点を変えればセキュリティ的にubuntuの穴をもwindowsが抱えてしまった事にもなる.よって開発者モード限定の機能であることも致し方なく,使いこなせるかどうかはあなた次第という代物だ.

※でも「あらゆるubuntuアプリの動作を保証するわけではないよ」とのこと.特にGUI絡みのアプリは眼中にないらしい.印刷とかUSBデバイス,ネットワーク,各種サーバーも同様.従ってフルスペックのubuntu動作環境が必要なのであれば仮想マシンとか実マシンを用意すべし.

※unixになったOS Xみたいにwindowsがlinuxになったわけではない.WSLはlinuxカーネルのふりができるだけ.動作させるには別途ubuntu環境そのもの(ubuntu on windows)が必要となる.こうすることでGPLライセンスの問題を回避できるし,副次的に「将来的にはubuntu以外のディストリビューションも動くようになるんじゃね?」となる.

※使いこなすにはwindowsとubuntu(linux)の両方に熟達している必要がある.特に日本語環境での文字コード周りの悩ましさを単一のマシンで実感できるので,これを学習の機会とするか混乱のもとと捉えるかでガラリと印象が変わる.間違っても初学者にいじらせたらダメ.奈落にはまり続けて前に進めなくなる.

導入されるubuntuのバージョン


Ubuntu 14.04.4LTS相当(2016/4現在)
64bit環境のみ
今後16.04LTSにアップデートされるとの噂

安定性等


現状疑問.各種学習・開発作業を効率化する目的で利用すべき.
GUI環境も構築できなくはないが、windows固有の機能がubuntu側でエラーを発生させるため、大抵利用不可.
日本語の文字化けはコンソール出力時にのみ発生し、出力結果をファイルにリダイレクトした際は正常.よってファイルの読み書きを基本とするスクリプトであれば動作する公算が高い.

インストール(途中再起動あり)


windows subsystem for linuxの導入→ubuntu on windowsのインストールの順に行う.
  1. 設定→更新とセキュリティ→開発者向け→開発者向け機能を使うにて開発者モードにチェックを入れる
  2. (windows subsystem for linuxの導入)
    設定→システム→アプリと機能→プログラムと機能をクリック
    「windowsの機能の有効化または無効化」からWindows Subsystem for Linuxにチェックを入れる→再起動
  3. (ubuntu on windowsのインストール)
    コマンドプロンプトから「lxrun /install /y」を実行する
    ubuntu関連のファイル群がwindowsストアからダウンロードされる
    ubuntu環境としておよそ600MBを消費する.
  4. コマンドプロンプト等から「bash」を実行する
※bash.exeを実行した場合、ubuntu on windowsが未インストールの場合自動的に「lxrun /install」が走る
※lxrunがubuntu環境導入を管理するツールらしい.このほかに/updateスイッチもあるが、細かいことは不明

--以下lxrunのhelpメッセージ--
Performs administrative operations on the LX subsystem

Usage:
    /install - Installs the subsystem
        Optional arguments:
            /y - Do not prompt user to accept
    /uninstall - Uninstalls the subsystem
        Optional arguments:
            /full - Perform a full uninstall
            /y - Do not prompt user to accept
    /update - Updates the subsystem
        Optional arguments:
            /critical - Perform critical update. This option will close all running LX processes when the update completes.

アンインストール


現状のubuntu on windowsのみをアンインストールする場合
コマンドプロンプトから 「lxrun /uninstall /full」を実行する
(ubuntu環境を吹っ飛ばした場合に)

すると,次回bash起動時に真っ新なubuntu on windowsが再導入される.
※lxssフォルダは残るので、これ以上ubuntuを利用する必要がなければ削除してよい.

ubuntu on windowsのインストール先


(win_home)\AppData\Local\lxss
このフォルダがubuntu側から見える「/」に対応する.

※システムで保護されているため、そのままではエクスプローラ上に表示されない.設定の変更が必要.
※ubuntu on windowsはwindowsユーザーごとに管理される.
※bashはroot(管理者)として実行されるので,/rootがカレントディレクトリになる.
※windows側とubuntu側とで見えるディレクトリ構造が異なる.

windowsディレクトリのマップ先


ハードディスクについては/mnt以下が対応する.
c:\ ⇔ /mnt/c等

つまり、ubuntu側からwindows環境をふっとばすことも出来る.
`rm -rf /` on Bash on Ubuntu on Windows

なお、リムーバブルメディアについては認識されていなかった.
※自分でeフォルダを作ってeドライブをマップしようとしても無理っぽい
※ドライブレターが小文字である点に注意.linuxではディレクトリエントリ名における大文字小文字を厳密に区別する

ubuntuアプリの導入


apt-get installで任意のパッケージが導入可能.多分add-apt-repositoryもできる
※一部未実装なものもあるらしい
現状windowsアプリとの連携は不可
ファイルシステムをwindowsとubuntuとが共有しているだけと割り切る
(windows側にsshとかtelnetとかを用意してubuntu側からキックするとかすればなんとかなるかもしれんけれど…)

xwindow環境


ubuntu on windows環境はxサーバーを持っていないので,windows側にインストールしたxサーバーを利用する.
※必ずしも動作する訳ではないし動くようにするつもりもないらしい.また,日本語入力が可能というわけでもない.→使えるらしい.
http://verifiedby.me/adiary/0101
  1. xming6.9.0.31をインストールする
    入手先
    https://osdn.jp/projects/sfnet_xming/releases/
     
  2. ubuntu側に環境変数を設定する
    see https://channel9.msdn.com/Blogs/WinCoder/XMING--Bash-on-Ubuntu-on-Windows--X11-Window-System-Running-from-Windows10-Subsystem-for-Linux
    root@localhost:/# export DISPLAY=localhost:0.0
     
  3. ubuntu側でguiアプリの起動コマンドを実行する
    例えばgeditとか.
     
  4. 日本語表示のためのフォント(例えば梅フォント)をインストール
    apt-get install fonts-horai-ume
※リモート接続時のibus/fcitx-mozcのインストール設定が上手くいけば日本語入力も何とかなるのかも(未検証)
日本語入力と音声出力が必要ないならepiphany-webのインストールがおすすめ. Webkit2エンジンを搭載しているので, (多少CSS動作に差異があるっぽいが)擬似Safari環境として利用できる. つーか割と動くので誰か音を出すのにチャレンジして下さい.

bash.exeの実行


以下bash(.exe)をコマンドプロンプト(or PowerShell)から実行した際の動作
  • 引数無しでbashを起動する
    …対話式のbashプロンプトを起動(カレントディレクトリ「/mnt/c/…」)
     
  • 引数「~」でbashを起動する
    …カレントディレクトリ「/root」から対話式のbashプロンプトを起動
    →アプリ一覧に登録された「bash on ubuntu on windows」既定の動作
     
  • コマンドプロンプトから引数付きでbashを起動する
    …引数の内容を実行する
    ※bash.exeの引数全体が直接ubuntu側のbashに引き渡される.そのため,後述のパス文字列の問題が発生する.
     
  • ショートカットからbashを起動する(アイコンダブルクリック時を含む)
    …作業フォルダー(windowsパスで指定)をカレントディレクトリとしてbashを起動する
    パス文字列は自動的にubuntuパスに変換される
bash on ubuntu on windowsではコマンドが常にrootで実行される.従ってubuntuでのsudoやsuといった権限昇格コマンドは必要ない.従って誤った操作で環境を破壊する危険性が高い.もっとも再インストールが簡単に行えるため,それほどナーバスになる必要はないが,windowsドライブもmnt配下にマウントされているため,コマンドによってはwindows環境に影響を及ぼすこともあり得る.(失敗したら嫌なので,未検証)

note:資料を作成するうえで「bash.exeをコマンドプロンプトから叩いた」ケースと「(起動済みの)bashプロンプトからbashコマンドを叩く」ケースがごちゃ混ぜとなると訳が分からなくなるので、今どこで何をしているのかを明確にすべき.

コマンドの連携


詳しくは未検証.アイディアだけ.
  • windows→ubuntu
    bashスクリプトの実行結果はwindows側からは単にbash.exeの実行結果に見えるだけだから、コマンドスクリプトからubuntuアプリの呼び出しについてはできる.
     
  • ubuntu→windows
    現状ubuntuからはwindowsの存在が判らないのでbashからwindowsアプリの直接呼び出しはできない.どうしても必要なら,windows10側にwin32-opensshを導入しsshを介して呼び出す方法がある.(expectで処理結果を取得する)
    (ある意味,windowsのフォルダをsambaでマウントしつつsshで接続しているような環境になるのかも…)
windows側から必要なものをubuntuにくれてやる感じで

スクリプトの実行

  • bash.exeの引数にはubuntu式のパスを指定する

    • 従ってwindows側でshファイルをbash.exeに関連付けしても正しく動作しない!
      なので、別途パスをubuntu形式に変換するコマンドスクリプトを作り、それに関連付けするとよい.
      例)簡易パス変換スクリプト
      @echo off
      set p=%1
      set p=%p:c:\=/mnt/c/%
      set p=%p:\=/%
      bash ""%p%""
      これをwinbash.cmdとして保存し,shファイルに関連付ける
      (ドライブレターの変換があやしすぎるので,もっとエレガントな解決法がほしいところ)

      ※別にそういった使い方しねーよとも思うが,bashがどうとか説明せずとも「xxx.shをダブルクリックしてね」で済ませられる.
      ※bashスクリプト側でubuntuパスに読み替える方法もあるが,こうしてしまうと今度はubuntu on windows専用のスクリプトになってしまい再利用をしにくくなる.
       
    • 同様にファイルドロップによるパスのペーストもうまくいかない.
      ここは改善の余地があると思う.(別に必須じゃないが)


  • メモ帳で作成したスクリプトファイルは実行できない.文字コードをutf-8に,改行コードをlfに変換してから実行せねばならない(というか,こうすると動く).対策としては次のいずれか.

    • エディタ側で文字コードを揃えておく(そもそもメモ帳を使わない)
    • ubuntuで作る(ubuntu on windows or 生のubuntu)
      ubuntu on windowsの場合,もっぱらCUIでの編集となるが,日本語の入出力に難がある.
    • nkf -Wdを噛ませてからbashで実行する(nkfはapt-getでインストールしておく)
      例)
      bash -c "nkf -Wd test.sh|bash"
      ※複数のスクリプトを連携させる場合に破たんするのでお勧めしない. 

      エラー対処等

      • xlssフォルダに異常がある
        →ubuntu on windowsをアンインストール+インストールする.
      • コマンドプロンプトの設定に問題がある
        →オプションの「従来のコンソールを使う」のチェックを外す
      • posershellileからbashを実行した
        →使わない

      雑観

      • あくまでwindowsが主でubuntuは従.従ってwindowsで出来ることはubuntuにさせる必要はない.すべての作業をubuntu on windows内で完結させたいのであれば,もはやwindows10を使う意味がないし,そういう人は既にubuntuとかをメインに使っている.windowsしか使ったことのない人が興味本位でbash等を憶えるのはどう見てもきつい.
         
      • ubuntuで動作済のスクリプトをどうしてもwindowsで再利用したい(それだけの価値がある)のであればbash on ubuntu on windowsは有効な選択肢の一つ.知人にbashの達人がいて,その恩恵をwindowsでも享受したい場合や,実現したい機能がどうしてもubuntuアプリにしか無い(CUIによるバッチ処理など)ケース等.
         
      • ubuntuとしてできることの範囲が不明瞭であり,linuxの学習目的には適さない.ubuntu on windowsはかなりニッチなプロダクトと言え,どのように動いているのかについて興味は尽きないが,かと言ってその仕組みがわかったところで(OS屋さんを除いて)役に立つケースは稀.
         
      • ubuntu on windows上にサーバーをこしらえるのは得策ではない.動いたとしても想定されたものではないので,サポートされる可能性は低い.あくまで開発ツールの補完が目的.
         
      • 無理に使う必要はない.また無理に使わせるのは却って話をややこしくする.
         
      • 依存しちゃっていいの? 将来microsoftとcanonicalの仲が悪くなるってことはないの?

        リンクなど

        0 件のコメント:

        コメントを投稿