Bash on Ubuntu on Windows の初期設定~動作確認について

kick

2016年09月05日 22:30


こんにちは、パソコン&コンピュータのきくちはじめ工房です。

お断わり:
いつもと違い、この記事はパソコン初心者の方向けの記事ではありません。
パソコン、というより、コンピュータにある程度詳しい方向けの記事となります。
※具体的には Internetworking と Linux の基礎知識が必要です。


前回の予告通り、今回は

Windows 10 Anniversary Update で導入された

「Windows Subsystem for Linux (Bata)」こと

「Bash on Ubuntu on Windows」 の初期設定についてお届けします。



とは言ったものの、既に1ヶ月ほど出遅れてしまいましたので、

「Bash on Ubuntu on Windows」でググると山ほどヒットします。

その中でも、本日時点で1位表示されている

Aruneko 様の

Bash on Ubuntu on Windowsをインストールしてみよう! - Qiita
http://qiita.com/Aruneko/items/c79810b0b015bebf30bb

は特に分かりやすく かつ 最もスマートにまとめてあると思いましたので

新規インストール手順を探している方には心からオススメします。


この記事では、(上記の記事と一部かぶったりお借りした所はあるものの)

kick 独自のコメント等を記入した形でお届けします。


お詫び:
kick は Linux を使うのが数年ぶりになるため、その前提のセリフが多々あるはずです。
詳しい方は笑ってスルーしてください。



■嬉しい誤算

今回の「Windows 10 で bash が動く」について嬉しい誤算がありました。

「bash が動く」ということしか事前に確認していなかったので、

インストール中~インストール後に初めて気付いたのですが、

「Bash on Ubuntu on Windows」の名前の通り、

単なる bash だけではなく、

Ubuntu Linux の minimal set となっていました。

詳しいことは Microsoftのサイトの紹介で代えさせて頂きます。


Microsoft Developer Network > Bash on Ubuntu on Windows
https://msdn.microsoft.com/en-us/commandline/wsl/about
→ 英語がある程度分かる方は、ぜひ video を見てみてください。
  基本的な動作原理の解説+デモンストレーションが見られます。




今回、バイナリ互換になる仕組みが導入されているため、

ざっくりいうと「Ubuntu Linux そのもの」でした。

事前確認不足でしたが、これは嬉しい誤算でした。



■いざ起動

スタートメニューから



を起動します。



老眼が入り始めた目には小さすぎて読みづらい、というか文字が見えない。

ということで、いったん exit して、右クリックのプロパティから

フォントサイズ ⇒ 18
ウィンドウサイズ ⇒ 128 x 32

等に設定変更を行いました。(お好みに合わせてください)





設定変更後、起動し直すと



OK です。



■始める前に、代替ターミナルの紹介
(端末環境が cmd.exe では貧弱なので変更する)

今回の内容程度であれば、一文字一文字入力してもしれていますが、

今後本格的に利用するにあたっては、

せっかく Windows 上で走っていることを活かすためにも

別のテキストファイルからコマンドをコピペできると作業が効率化できます。

しかし現時点では、右クリック等が無効化された制限付き cmd.exe が

ターミナルとして利用されているため、代替ターミナルを使ってみます。


ググってみると複数の選択肢が見つかりますが

今回調べた範囲では、

MobaXterm
http://mobaxterm.mobatek.net/

が良さそうでした。

というのも、Ubuntu Bash (Windows Subsystem for Linux) が

接続先としてデフォルトで用意されていたからです。



ただし、フリーソフトではなく商用ソフトでした。

でも Personal Edition は自由に使えるようです。


もちろん、ある程度標準ターミナルで動かしてみてから

MobaXterm

を使ってみる方が、違いが分かりやすいと思います。


【9/6追記】
MobaXterm 上で vi コマンド(コロン何々)がうまく通らない場合が出ました。
現時点では、標準コンソールも併用するのが良さそうです。




■Ubuntu特有の文化

root 作業を行う時に、su - は使えないので sudo を使います。


■ホスト名の明記 /etc/hosts

sudo を使う度に、毎回

> sudo: ホスト ~~ の名前解決ができません

と警告を出してくるため、hosts ファイルを編集します。
(1行目のlocalhostの後ろにお使いのPCのホスト名を追記します)


sudo vi /etc/hosts

cat /etc/hosts
127.0.0.1 localhost b554k

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts



または Aruneko様のように


sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'


でももちろんOKですので、お好みで。



■おかしな(?)ループバックアドレス「127.0.1.1」

上記の IPアドレスを見ると気付く方もいらっしゃると思いますが、

127.0.0.1 ではなく 127.0.1.1 となっています。

あれ?と思ったので参考までにググってみると、次の記事が見つかりました。

憩いの場
Ubuntu の /etc/hosts に「127.0.1.1 ホスト名」という行があるのだが
http://linux.ikoinoba.net/index.php?UID=1344351350



Debian リファレンス
第5章 ネットワークの設定
https://www.debian.org/doc/manuals/debian-reference/ch05.ja.html

本例の2行目の IP アドレス 127.0.1.1 は他の Unix 系システムでは見かけないかもしれません。bug #719621 に記録されているように、Debian インストーラー は恒久的 IP アドレスのないシステムのために一部ソフトウエアー (GNOME等) のための回避策としてこの項目を作成します。


何と、どうやら debian の公式設定の1つのようです。(汗)

昔 debian を好んで使っていた時期もありましたが、全然記憶にありません。

# 憩いの場 様、記事公開ありがとうございます。


■パッケージ(環境)のアップデート

Windows には Windows Update が付いて回るように、

Linux にも同等のものが付いて回ります。

Ubuntu において、Windows Update に相当する作業は下記の2つです。


sudo apt update
sudo apt upgrade


コマンドを叩いた時点でアップデートが出ていたらインストールされます。

実行する前に、次の設定をしてからの方が良いでしょう。



■リポジトリの変更 /etc/apt/sources.list

例えると「Windows Updateをどこから取ってくるか?」です。

デフォルトでは海外のサーバーになっているため、

日本国内のサーバーに変更しておく方が、

通信負荷的にも、動作速度的にも、better です。

Arueko様が紹介されているコマンド


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

で一発で書き換えできるので、

これを使わせて頂くのが簡単です。(sed 久しぶりに見た...)


kick@B554K:~$ sudo cp -p /etc/apt/sources.list /etc/apt/sources.list.orig
kick@B554K:~$
kick@B554K:~$ sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
kick@B554K:~$
kick@B554K:~$ cat /etc/apt/sources.list.orig
deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
kick@B554K:~$
kick@B554K:~$ cat /etc/apt/sources.list
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-updates main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-security main restricted universe multiverse
kick@B554K:~$



■ロケールを英語にする /etc/default/locale

ロケールとは、簡単に言うと「言語設定」のことです。

コンソール(ターミナル)で日本語表示が正常になるまでの一時的な対処や

そもそも CLI (Command Line Interface) は英語で良いという人の場合、

ロケールを英語に変更すると表示崩れから解放されます。


sudo vi /etc/default/locale

cat /etc/default/locale
# File generated by update-locale
#LANG=ja_JP.UTF-8
LANG=en_US.UTF-8



以上で最低限のセットアップは完了です。

以下は参考です。



■ubuntuのバージョンを確認してみる


kick@B554K:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
kick@B554K:~$



■bashのバージョンも確認してみる


kick@B554K:~$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
kick@B554K:~$



■shellshock脆弱性の確認
(ディストリビューションによって細かいバージョンが違う場合があるので
 bashのバージョン確認だけでは不十分。以下のコマンドを確認するのが良い)


env x='() { :;}; echo NG' bash -c "echo OK"


NG
OK
と2行が表示されたら問題あり

OK
と1行だけ表示されたら問題なし


一応結果も貼り付けておきます。


kick@B554K:~$
kick@B554K:~$ env x='() { :;}; echo NG' bash -c "echo OK"
OK
kick@B554K:~$



■procも使える


cat /proc/cpuinfo


(長いので省略)


■gccが入っていないのでインストールする


which gcc


デフォルトでは入ってなかったので


sudo apt install gcc


または


sudo apt install build-essential


(長いので省略)


■gccの動作確認 hello.c


kick@B554K:~$ vi hello.c

お約束「hello.c」

#include <stdio.h>
main()
{
printf("hello,world!\n");
}

(intとreturnは省略しています、ツッコミなしでお願いします)

kick@B554K:~$ gcc hello.c -o hello
kick@B554K:~$ ./hello
hello,world!
kick@B554K:~$



■gccでコンパイルしたバイナリを調べてみると


kick@B554K:~$ readelf -h ./hello
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400440
Start of program headers: 64 (bytes into file)
Start of section headers: 4472 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 30
Section header string table index: 27
kick@B554K:~$



ちゃんと、ELF64バイナリとなっていました。


■今回 viとvimは同じバイナリでした

vim とは vi improved の略語とされています。(vi の改良版の意味)


kick@B554K:~$ which vi
/usr/bin/vi
kick@B554K:~$ which vim
/usr/bin/vim
kick@B554K:~$ ll /usr/bin/vi*
lrwxrwxrwx 1 root root 20 Mar 24 05:42 /usr/bin/vi -> /etc/alternatives/vi*
lrwxrwxrwx 1 root root 22 Mar 24 05:42 /usr/bin/view -> /etc/alternatives/view*
lrwxrwxrwx 1 root root 21 Mar 24 05:44 /usr/bin/vim -> /etc/alternatives/vim*
-rwxr-xr-x 1 root root 2191736 Jan 3 2014 /usr/bin/vim.basic*
lrwxrwxrwx 1 root root 25 Mar 24 05:44 /usr/bin/vimdiff -> /etc/alternatives/vimdiff*
-rwxr-xr-x 1 root root 884360 Jan 3 2014 /usr/bin/vim.tiny*
-rwxr-xr-x 1 root root 2084 Jan 3 2014 /usr/bin/vimtutor*
kick@B554K:~$
kick@B554K:~$ ll /etc/alternatives/vi
lrwxrwxrwx 1 root root 18 Mar 24 05:44 /etc/alternatives/vi -> /usr/bin/vim.basic*
kick@B554K:~$
kick@B554K:~$ ll /etc/alternatives/vim
lrwxrwxrwx 1 root root 18 Mar 24 05:44 /etc/alternatives/vim -> /usr/bin/vim.basic*
kick@B554K:~$


ということで、vi でも vim でも同じバイナリ(/usr/bin/vim.basic)を指していました。


■ssh ポートのオープンに注意

今回のインストール中に行った「開発者モード」を有効にすると、

sshのポート(TCPの22番ポート)がオープンされるようです。


※以下は Bash 上ではなくコマンドプロンプトで実行したものです


C:\WINDOWS\system32>netstat -nao | grep :22
TCP 0.0.0.0:22 0.0.0.0:0 LISTENING 9188
TCP [::]:22 [::]:0 LISTENING 9188


不要な場合 or セキュリティ上、塞いでおきたい場合は

「コントロールパネル」>「管理ツール」>「サービス」で

SSH Server Broker

SSH Server Proxy
を停止しておきましょう。




※以下は Bash 上ではなくコマンドプロンプトで実行したものです


C:\WINDOWS\system32>netstat -nao | grep :22

C:\WINDOWS\system32>



■アンインストール&再インストールの方法は?

驚くほど簡単で、それぞれコマンド1発です。
(bash上ではなく、管理者権限のコマンドプロンプトから実行)

アンインストールは

lxrun /uninstall /full

再インストールは

lxrun /install



最小版 (minimal set) とは言え、

Linux OS のアンインストールと再インストールが

それぞれコマンド一発(待ち時間数分)で完了することは

利用の敷居を下げることにも役立つと考えられますので嬉しいことです。

万一のミスで環境を壊してしまった場合でも、

お手軽に「初期化」できるのは GOOD です。

(個人的には、作成/編集したファイルを tar でバックアップした上で行います)


■UbuntuのファイルシステムはWindowsのどこにある?

隠しフォルダのため、通常の explorer.exe の設定では見えませんが、


%LocalAppData%\LxSS
つまり
C:¥Users¥[Username]¥AppData¥Local¥LxSS¥

に格納されています。(注:前者はアドレスバーに貼り付けて直接開けます)

意味が分かる場合は、個別ファイルのバックアップ等に使いましょう。




久しぶりに長い記事になりました。

ソースコードやコマンドラインをそのまま張り付けたので、

HTMLでは表示が崩れてしまってますね。(当たり前...)

このブログは、普段ソースコードやコマンドラインの貼り付け用に

使っていないので、今さらながら気付きました。

見やすく修正している時間がないため、今回はそのままでお許しください。


【9/6追記】 SyntaxHighlighter を導入して見栄えの改善を施しました。
一方で、メインブロックの横幅が狭くて見づらい部分がありますがご了承ください。
これを機会に、横幅の拡大とブログデザインの変更を検討したいと思います。


【9/7追記】本当に横幅の拡大とブログデザインの変更を行いました。


最後になりましたが、(個人的な感想として)

Bash on Ubuntu on Windows は久しぶりにヒットでした。

今後、コマンドラインでの作業の幅がぐっと広がったと同時に

必要に応じて、作業効率化が図れそうです。


関連記事