Posted at

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などの周辺ツールや、環境変数の設定を忘れずに。