ChromeOS

ChromeOSを開発マシンにするために知っておく基本的な3つのこと

More than 3 years have passed since last update.

Chromebookは電源が長持ちするので、持ち歩いて隙間時間でコーディング、なんてことができる。
はじめのころは、croutonでubuntuをいれてやっていたが、やはりChromeOSのほうが断然軽く動くし、お手軽に使える。
とはいえ使うためのコツがあるので、それを共有したいと思う。
なお、Chromebookをdeveloper modeで起動していることを前提としているので、そのやり方はこちらを参照。

1. sshクライアント

ChromeOSで一般的なterminalプログラム起動は、Ctrl+Alt+tであり、これはブラウザ内でcroshを起動する。
developer modeでOSを起動していれば、croshのshellコマンドでbashを起動することができる。
しかし、如何せんブラウザ内で起動しているターミナルプログラムなので、Ctrl+wはブラウザのショートカットとして認識され、ブラウザタブを閉じようとしてしまう。
このショートカットは、bashのコマンドライン編集では直前の単語削除だし、vimではウィンドウ操作のコマンドであり、使えないことでのストレスはハンパない。
そのため、ブラウザ内起動ではないterminalプログラムを探すこととなる。
そこで、以下のChromeアプリを使うことがおすすめだ。
Secure Shell

これは、ブラウザとは独立したウィンドウで起動するterminalプログラムである。
残念ながら、Secure Shellのcroshウィンドウを複数実行する方法がわからない。実現できるのであれば方法を教えてほしい。

Secure Shellは一般的にはsshクライアントとして使うのだが、その場合1点だけコツがいる。
RSA鍵のインポートが難しかったのだ。
こちらのFAQを読むと、公開鍵のファイル名は以下のようにしておく必要がある。

  • 公開鍵ファイル:拡張子を.pubとする
  • 秘密鍵ファイル:拡張子を付けてはいけない

そうした上で、Identityの項のimport...ボタンを押して、ファイル選択するウィンドウで、上記2つの鍵ファイルを同時複数に選択して、オープンすると読み込むことができる。

2. ユーザランド

ChromeOS/Chromiumは、アーキテクチャとしてユーザが使うストレージ領域とシステム領域を明確に分けている。
そして、ユーザが使う領域では、独自のプログラムが実行できないようになっているのだ。

[chronos@localhost:~]$ df -m
Filesystem                                                   1M-blocks  Used Available Use% Mounted on
/dev/root                                                         1205  1055       151  88% /
devtmpfs                                                          1946     0      1946   0% /dev
tmp                                                               1947   106      1841   6% /tmp
run                                                               1947     1      1946   1% /run
shmfs                                                             1947    31      1916   2% /dev/shm
/dev/sda1                                                        10721  4008      6162  40% /home
/dev/sda8                                                           12     1        12   1% /usr/share/oem
/dev/mapper/encstateful                                           3162    58      3105   2% /var
media                                                             1947     0      1947   0% /media
none                                                              1947     0      1947   0% /sys/fs/cgroup
/home/.shadow/88d11efa6e80238bf0899c98bba8777c28961de0/vault     10721  4008      6162  40% /home/chronos/user
/dev/sdb1                                                        28962 13451     14034  49% /media/removable/USB_UNITY

この/home/.shadow配下がユーザランドだ。
この中では、自作したプログラムはおろかシェルスクリプトですら、直接的な実行が許されない。

[chronos@localhost:~]$ cat hoge.sh
#!/bin/sh
echo 'hello world, hoge'
exit 1
[chronos@localhost:~]$ chmod a+x hoge.sh 
[chronos@localhost:~]$ ./hoge.sh
bash: ./hoge.sh: Permission denied

以下のようにすれば実行できる。

[chronos@localhost:~]$ sh ./hoge.sh
hello world, hoge
[chronos@localhost:~]$ cat ./hoge.sh | sh
hello world, hoge

ところが、/usr/local/binに持ってくると直接実行できる。

[chronos@localhost:~]$ sudo cp hoge.sh /usr/local/bin
[chronos@localhost:~]$ /usr/local/bin/hoge.sh 
hello world, hoge

なんらかのソースをビルドするときは、シェルから起動することも多い。
1ファイルだけ実行するなら、shに引数で渡してやればいいのだが、シェルスクリプトの中で、さらにファイル名直接指定でサブスクリプトを呼び出している場合は、そこでエラーになってしまう。
なので、作業は/usr/local/homeといった作業ディレクトリを作り、その下で実行するほうがよい。

作業ディレクトリは、chronosユーザを所有者として、書き込み権限を与えておくと、いちいちルート権限で実行しなくても良くなる。
さらに、chronosユーザのホームディレクトリに/usr/local/homeへのシンボリックリンクを作っておくと便利である。
以下のように作業ディレクトリを作るとよい。

$ sudo mkdir /usr/local/home
$ sudo chown -R chronos:chronos /usr/local/home
$ ln -s /usr/local/home /home/chronos/user/sandbox

上記の通り作ったとすると、使い方は以下のようになる。

[chronos@localhost:~]$ cd ~
[chronos@localhost:~]$ cat ~/sandbox/hoge.sh 
#!/bin/sh
echo 'hello world, hoge'
exit 1

[chronos@localhost:~]$ ~/sandbox/hoge.sh 
hello world, hoge
[chronos@localhost:~]$ cd sandbox/
[chronos@localhost:sandbox]$ ./hoge.sh 
hello world, hoge
[chronos@localhost:sandbox]$ pwd
/home/chronos/user/sandbox

なお、USBなど他の領域に作業ディレクトリを作り、/usr/local/からシンボリックリンクを貼っても、実ファイルがシステム領域にないとプログラム実行はできなかった。なので、内蔵ディスクを消費するしかないようだ。

3. crew

あとは、crewを入れたらほぼなんでもできる。
pipなどの周辺ツールや、環境変数の設定を忘れずに。