USBで持ち歩けるポータブルな開発環境 作ってみた

# 始めに
ちょっとしたコネで高校でプログラミングを教えることになったボク。
しかし、生徒用に使えるのはWindowsで、しかも管理者権限は使えないとの事。
仕方がないのでいろいろ考えて、最終的にUSBで持ち歩けてWindowsマシンがあればどこでも同じように使える開発環境を作っちゃいました。
この記事はその備忘録になります。

# 手法
WindowsのゲストアカウントでC系の言語でプログラミングしたいと思いました！
インストールが許されるのであれば、MicrosoftのVisual Studioの無料の奴とか、cygwinを入れろとか、msys2の方がとか、MinGWを忘れるなとか色々あると思います。
しかし、インストールすら出来ないとなると見事に全滅します[^mingw]。

[^mingw]: 例外として、MinGWはPATHの設定が出来ない事を除けば持ち運んで使う事も出来なくはない。すごく不便だけど。

解決方法は至って単純。管理者権限不要な*仮想化ウェア*を使う。終わり。

ではちょっと味気ないので具体的な導入手順を追ってみます。
仮想化ウェアとは何か、各種仮想化ウェア(VMWare, VirtualBox, Virtual PC, QEMU, bochs等)の詳細等については適宜ググって下さい。
この記事では、各種ツールが揃ってて便利で、USBで持ち運べて、動かすのに管理者権限が要らない**QEMU**を使っていきます。

## QEMUの入手・展開
QEMUは
http://www.qemu-project.org/
のダウンロードページから入手できます。
インストール自体には管理者権限を要求されますが、インストール後にインストール先のディレクトリをまるごとコピーしてしまえばアンインストール後も正常に動きます。
なので、ディレクトリ毎コピーして何処かに保存しておけば、それがどこでも使える仮想化環境になります。
サイズの目安は、MIPSやPowerPC等の全てのアーキテクチャ用のエミュレータを含めて約370MB、今回必要となるqemu-system-x86_64.exe以外のqemu-system-なんとか.exeを削除した場合に約110MBとなります。

2017年3月25日追記：Windows向けのQEMUは2種類ありますが、32-bit版のダウンロードをおすすめします。32-bit版は32 bitのWindowsマシンでも64 bitのWindowsマシンでも動きますが、64-bit版は32 bitのWindowsマシンでは動かないので。

## 仮想ディスクファイルの作成
まず、作業用ディレクトリとして`D:\programming-on-qemu`を用意し、その中に`qemu`というディレクトリを作り、中にQEMUのファイル群を置いた状態にします。
此処から先は管理者権限要りません。

Windowsのディレクトリを表示するアレ(正式名:エクスプローラー)で、何も選択せずに何もない所でShiftキーを押しながら右クリックすると、メニューに「コマンド ウィンドウをここで開く(W)」というのが出るのでそれを選びます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/171771/6cfb3f5c-3090-41b0-1125-91e69f13b25d.png)
すると黒地に白文字のこんな画面が開きます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/171771/96852097-796e-035e-eccc-04137a08f072.png)

`dir`と打つことでそのディレクトリの内容物が一覧になって出てきます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/171771/b91b936f-4163-2398-eb14-f900f1d27fa6.png)

次に、仮想ディスクファイルを作ります。QEMUから見たディスクのサイズが256GBになるようにQCOW2形式で作るには、次のように打ちます。
`qemu\qemu-img create -f qcow2 hdd1.qcow2 256G`

![4.png](https://qiita-image-store.s3.amazonaws.com/0/171771/6fc3916f-3f2d-1619-a864-d85598db07b5.png)
仮想的なサイズは256GBとここでは指定していますが、実際のファイルは200KB弱となり、仮想ディスクに実際に書き込みを行ったタイミングでどんどん伸びていく感じになります。

## インストールするべきOSの入手
入れるOSはなんでも良いのですが、Unixライクで無料な物ならプログラミングに適していると思います。
この記事ではLinuxディストリビューションの一つ、**Debian**を入れていきます。
https://www.debian.org/
今回はプログラミングを行うにあたって必要十分な程度の構成で組んでいくので、ネットワークインストール用の、「Debianを入手する」→「インストールイメージのダウンロード」→「小さなCDまたはUSBメモリ」節の「amd64」を選ぶ事によって、`debian-8.7.1-amd64-netinst.iso`をダウンロードします[^debian-url]。
[^debian-url]: この記事を書いている2017年3月24日現在の辿り方とファイル名なのでもしかしたら変わるかも知れません。

ダウンロードが終わったら作業ディレクトリに`debian-netinst.iso`というファイル名でコピーします。
この時点で、`dir`コマンドを打つとこんな感じになると思われます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/171771/f10fb28c-3cde-c064-1072-e31eab3f2d3a.png)

## 仮想環境へのインストール
それでは起動して仮想環境にインストールしていきましょう。
仮想マシンのメモリサイズを512MBとした場合、次のようなコマンドになります[^memory]。
`qemu\qemu-system-x86_64 -m 512 -hda hdd1.qcow2 -cdrom debian-netinst.iso`
[^memory]: 実際に使われるメモリのサイズにはQEMU自体が使う分も含まれるので、300MBくらいの追加の余裕がホスト側(QEMU自体を動かす側)に必要となります。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/171771/8524993b-b841-20d1-b012-aba7dde8c840.png)
無事立ち上がったので、リターンキーを押してInstallを選びます。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/171771/166d57b2-083e-3391-1fb7-dfa24c9cc514.png)
言語は英語推奨です。インストール後、起動した時に文字化けすることが多いので[^locale]。
[^locale]: 厳密にはインストール時の言語の設定の問題ではなくロケールの設定の問題なのでインストール後に弄れば直る。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/171771/efe35b48-fe62-48a9-ac0a-d879997cb3a6.png)
タイムゾーンの設定は`other`→`Asia`→`Japan`を選んでおきましょう。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/171771/853b54d5-2364-447d-6cd0-4f6539d04a8e.png)
ロケールはデフォルトの`en_US.UTF-8`で問題ありません。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/171771/67311e22-d441-5455-c70a-d542d87b7814.png)
キーマップは日本語配列(`[`と`]`が上下に並んでてリターンキーが大きくてスペースバーが狭い、日本では一般的な奴)であれば`Japanese`を選ぶべきです。US配列の場合は多分`American English`が良いと思いますが未検証です。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/171771/bb412924-14b0-f1d2-691d-6f64175ae53a.png)
少し待つと、ホスト名を選ぶ画面になります。これが他のマシンと被ると技術的な意味でちょっと面倒な事が起こる事がありえます、が、普通は問題ない上にあとで変えられるのでデフォルトの`debian`で良いと思います。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/171771/af9a8599-683a-8133-c960-da931bd43b1a.png)
ドメイン名はポータブルな環境に割り当てる類の物では無いので、今回は空欄のまま次へ。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/171771/a3d0befb-f233-7c8a-d1a9-4a45e2cbadd6.png)
rootのパスワードを設定します。rootは最大の権限を持つので普通は強力なパスワードを使うべきですが、今回は適当に設定します。但し空欄にだけはしないで下さい。あと絶対忘れないで下さい。**死にます**。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/171771/24dfe550-1e8c-b4be-70f5-d6b483a6c336.png)
パスワードをもう一度入力するアレです。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/171771/7d103660-26cf-2f6a-ea05-f5e7635322b7.png)
普段使いのアカウントのユーザ名を、長くなってもいいので入れます。ログイン時に使う短いユーザ名は後で入れます。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/171771/9079cb24-3af0-fe77-33d8-adedbca0fa57.png)
ログイン時に使う短いユーザ名を入れます。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/171771/f85ccd44-ee77-efd3-4c1b-10e9de35213a.png)
普段使いのアカウント用のパスワードを入れます。この後でこのアカウントの権限をsudoerに昇格する予定なので、これも強力なパスワードを使うべきです。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/171771/bde2be82-cba3-d6f1-c233-ce0875c364bf.png)
はいもう一度打って下さい。
![19.png](https://qiita-image-store.s3.amazonaws.com/0/171771/281a5c5a-3025-136f-657b-c6452f9e8ec5.png)
暫く待つと、次はディスクの割り当て方を決めます。今回は一番上の`Guided - use entire disk`を使いましょう。
![20.png](https://qiita-image-store.s3.amazonaws.com/0/171771/9ec7266b-02c7-dd34-c992-0863c10ded11.png)
使えるディスクの一覧が出てくるので、そのままリターンキーで`sda`を選びます。
![21.png](https://qiita-image-store.s3.amazonaws.com/0/171771/24f93101-2ce0-50bf-90f7-753d4b14f3f8.png)
パーティションの割り当て方は一番上で良いと思います。
![22.png](https://qiita-image-store.s3.amazonaws.com/0/171771/7755aed3-97c0-3582-8691-4c72ec61b8f9.png)
こんな風に作るよ！っていう表示が出るので、`Finish partitioning and write changes to disk`で確定します。
![23.png](https://qiita-image-store.s3.amazonaws.com/0/171771/1fd2947c-99cd-e465-b52f-c86daef353f5.png)
最終確認的なアレ。Yesを選びます。選ぶとhdd1.qcow2ファイルが膨らみ始めます。
![24.png](https://qiita-image-store.s3.amazonaws.com/0/171771/b959321c-e3fa-c541-2ae2-86ef2c4993d3.png)
暫く待つと核となるシステムがインストールされて、追加パッケージをインストールする段階になります。追加パッケージをどこからダウンロードするかを選択する画面になるので、日本在住であればJapanを選びましょう。
![25.png](https://qiita-image-store.s3.amazonaws.com/0/171771/cd7e92a3-8173-a662-a9f3-d90a3d50a134.png)
日本のどのサーバからダウンロードするか、の選択肢ですが、どれでも大きな違いは無いはずなので今回は一番上を選んでみます。
![26.png](https://qiita-image-store.s3.amazonaws.com/0/171771/b7fbb893-153c-7596-d3dc-f102cdc6a0db.png)
プロキシを刺す必要がある人はここで適切な値を入力します。私は必要ないので空欄でリターンキーを押します。
時間帯等のアレで繋がらない場合は、時間を空けるか、何度かリトライして下さい。
![27.png](https://qiita-image-store.s3.amazonaws.com/0/171771/9d3cdfe3-a97c-b6e1-04f5-c04eb1420dd5.png)
暫く待つと、どのパッケージをインストールしたかに関する統計情報を定期的に送信するか(意訳)という選択肢が出てくるので、嫌な人は`No`を選んでおきます。
![28.png](https://qiita-image-store.s3.amazonaws.com/0/171771/a538670c-1520-a868-5254-650f58435ebe.png)
少し待つと、大雑把にどの種類のパッケージをインストールするかを選択する画面になります。どちらにせよ後で追加できるので、今回は図のように一番下の`standard system utilities`以外は空欄にして進めます。**選択と非選択の切り替えにはスペースキーを使います**。
![29.png](https://qiita-image-store.s3.amazonaws.com/0/171771/c7e505a5-a8d6-c648-ce81-73ece6a79677.png)
暫く待つと、次はGRUBをインストールする段階になります。詳しい事は省きますが、これが入ってないと起動しないのでYesを選択してインストールします。
![30.png](https://qiita-image-store.s3.amazonaws.com/0/171771/c17a51b5-06b9-8898-df49-d67c59e43acf.png)
インストール先は`/dev/sda`にします。
![31.png](https://qiita-image-store.s3.amazonaws.com/0/171771/72d2c839-306d-9402-b967-be90c2df70b2.png)
お疲れ様でした！仮想環境へのDebianのインストールが完了しました！Continueを選んで、仮想環境の再起動をしましょう。

## 仮想環境の初期設定
![32.png](https://qiita-image-store.s3.amazonaws.com/0/171771/1b0265cd-3df8-e828-39cf-7bd3cdc1ee0c.png)
再起動後暫く待つと、ログイン画面になります。色々とやることがあるので、まずはrootとしてログインします。この時、パスワードを打つ時に画面上の反応はありませんが、正常です。
![34.png](https://qiita-image-store.s3.amazonaws.com/0/171771/bc1b440d-b806-c59a-6f5b-9d42f6a70c15.png)
まずは`apt`で`sudo`を入れます。
コマンドは`apt install sudo`です。
また、この後sudoersを編集するので好みのテキストエディタがあればそれを入れます。例えばemacsユーザであれば、`apt install emacs-nox`で入ります。何も入れない場合、`vim.tiny`と`nano`がこの時点で使えるようでした。
次にsudoersを編集するのに使うエディタを選択します。
コマンドは`update-alternatives --config editor`です。
![35.png](https://qiita-image-store.s3.amazonaws.com/0/171771/2fbabd52-a942-ceae-35e3-ea06f87a1fda.png)
最後に、`visudo`コマンドでsudoersファイルに下図のような感じの行を追加します。
今回私は普段使いのユーザアカウント名を`user`として作ったので、21行目の反転させている部分の最初の単語は`user`となります。
![36.png](https://qiita-image-store.s3.amazonaws.com/0/171771/cad405e9-3889-164c-99a2-aeb1c9ef0c2f.png)
最後に保存してエディタを終了させた後、`Ctrl+D`を押すか、または`logout`コマンドによってログアウトします。

## 仮想環境の追加設定
![37.png](https://qiita-image-store.s3.amazonaws.com/0/171771/2842e81c-ff74-0655-9c2a-0fa729fe570a.png)
まずは通常ユーザとしてログインし、プログラミング環境を整えます。今回はC言語の環境を整えたいので、`build-essential`を`apt`で入れておきましょう。
コマンドは`sudo apt install build-essential`となります。
![38.png](https://qiita-image-store.s3.amazonaws.com/0/171771/90e14e29-f3cc-8670-0f56-13a15d53d8af.png)
`apt`コマンドの実行に権限が必要なので、`sudo`コマンドで一時的に昇格します。最初に昇格する時に「よく考えて使ってね」とも言われますが、スルーして**現在ログイン中のアカウント**のパスワードを入力します。
`build-essential`に関連付けられた多くのプログラムとライブラリがインストールの予定の一覧に上がります。「続けますか？」の質問に対し`Y`または無記名でリターンキーを押して応える事によって(多肢選択式の場合で、一つだけ大文字になっていれば、普通はそれがデフォルトで選ばれます)、インストールが始まります。

やる事が一通り終わったら、一旦終了しましょう。
Debianを終了するには`sudo poweroff`で行けます。

## 仮想ディスクファイルの小型化
QCOW2形式の仮想ディスクファイルは、使っているうちにどんどん大きくなります。
但し、次のような内容のコマンドを(Windows側で)実行する事によって、圧縮できる場合があります[^compress]。
```
move hdd1.qcow2 hdd1.qcow2.backup
qemu\qemu-img convert -O qcow2 hdd1.qcow2.backup hdd1.qcow2
```

[^compress]: 厳密には圧縮ではなく、既に使われなくなった領域を詰めてるだけ。

## 起動の簡略化
最後に、メモ帳か何かに`qemu\qemu-system-x86_64 -m 512 -hda hdd1.qcow2`と書いて、`virtual-machine-startup.bat`というファイル名で作業ディレクトリに保存すると、そこから起動できるようになるので非常に便利です。
![39.png](https://qiita-image-store.s3.amazonaws.com/0/171771/4cbbe1ae-fc4a-dd49-3b29-b9d7cb52dc4d.png)

# 結果
WindowsのゲストアカウントでC系の言語でプログラミングできるようになった！
![40.png](https://qiita-image-store.s3.amazonaws.com/0/171771/3033155d-a21d-7201-89a8-7db0b4df1f71.png)
今時のUSBメモリになら余裕で全部入る大きさとなりました(debian-netinst.isoを含まず、仮想ディスクファイルは圧縮済み)。

# 最後に
ひとまずここで備忘録を終わりにします。
最後まで読んでくださった方、ありがとうございました。