再編集:ChromeOSをUbuntuでビルドしてUSBでブートする-(VAIOのVirtualBoxでChromeOSをビルドしたので時間がかかった)

まずはビルド環境としてUbuntuの64bit版を必要があるので、VirtualBoxにインストール
親機がVAIOのVPCZ1なのでIntelVTも使えて思った以上にさくさくに動く。

いろんなサイトを参考にしながらスタート。
あまり詳しくわからないが、去年くらいからビルドの方法がかわったっぽい。
tarボールを落としてる人もいれば、repoやgclientの人もいる。
公式サイトはrepoなので公式をもとにChromeOSのビルドをしてみる。

repo init -u http://git.chromium.org/chromiumos/manifest.git -m minilayout.xml

まずは、gitのインストール

sudo aptitude install git-core gitk git-gui

そもそもaptitudeが入っていなかったのでインストールする。
あと他のブログで画像をみてるとcurlを使ってそうなのでインストール

sudo apt-get install aptitude curl

ChromeOSのビルドに必要なもろもろが纏められているのでそれらを配置して実行

wget http://src.chromium.org/svn/trunk/src/build/install-build-deps.sh
sudo sh install-build-deps.sh
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
export PATH=$PATH:~/depot_tools

gclientではなくrepoを使うので、repoのインストール

sudo su -
curl http://android.git.kernel.org/repo > /usr/bin/repo
chmod a+x /usr/bin/repo

本家にならって、ディレクトリ作成し、ChromeOSのソースを取得します。
repo initが完了したら、repo syncで取得を行う。(30分くらいで完了)

mkdir -p ${HOME}/chromiumos
cd ${HOME}/chromiumos 
repo init -u http://git.chromium.org/chromiumos/manifest.git -m minilayout.xml
repo sync

repo init で何回か失敗しましたが、.repoディレクトリを消してやり直してたら上手くいきました。

Initializing project chromiumos/overlays/portage-stable ...
remote: Counting objects: 212, done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 212 (delta 32), reused 170 (delta 26)
Receiving objects: 100% (212/212), 123.14 KiB | 97 KiB/s, done.
Resolving deltas: 100% (32/32), done.
From http://git.chromium.org/chromiumos/overlays/portage-stable
 * [new branch]      0.12.362.B -> cros/0.12.362.B
 * [new branch]      0.12.369.B -> cros/0.12.369.B
 * [new branch]      0.12.392.B -> cros/0.12.392.B
 * [new branch]      0.12.433.B -> cros/0.12.433.B
 * [new branch]      0.13.434.B -> cros/0.13.434.B
 * [new branch]      0.13.509.B -> cros/0.13.509.B
 * [new branch]      0.13.558.B -> cros/0.13.558.B
 * [new branch]      master     -> cros/master
Fetching projects: 100% (10/10), done.  
Checking out files: 100% (1718/1718), done.
Checking out files: 100% (89225/89225), done.files:  12% (11414/89225)   
Syncing work tree: 100% (10/10), done.  
Your sources have been sync'd successfully.
yuta@yuta-VirtualBox:~/chromiumos$ 

途中で名前やメールアドレスを聞かれますが、適当に入力しました。
また、カラー表示の質問があるので基本「y」入力で答えます。

ソース取得も完了したので、ビルド用のchroot環境の作成に入ります。
これが結構ながくて、また30分くらい待ちました。

まえにUbuntuが手元になかったので、ServerManVPSをUbuntuに再セットアップして試しましたが
まさかのUbuntu32bit選択という落ちで、ここでamd_64じゃないって怒られました。

yuta@yuta-VirtualBox:~/chromiumos/src/scripts$ ./make_chroot
These are the packages that would be merged, in order:
These are the packages that would be merged, in order:
Calculating dependencies  
Fetching bininfo from http://commondatastorage.googleapis.com/chromeos-prebuilt/host/amd64/binary-26.05.11.082024/packages/ http://commondatastorage.googleapis.com/chromeos-prebuilt/host/amd64/full-26.05.11.094812/packages/
!!! Error connecting to 'http://commondatastorage.googleapis.com/chromeos-prebuilt/host/amd64/binary-26.05.11.082024/packages/ http://commondatastorage.googleapis.com/chromeos-prebuilt/host/amd64/full-26.05.11.094812/packages/'.
!!! Unable to get listing: 400 Server did not respond successfully (400: Bad Request)
Pending 5, Ready 1, Running 1, Retrying 0, Total 211 [Time 13m6.2s Load 0.92 0.85 0.63]
Started virtual/perl-File-Spec-3.30 (logged in /tmp/perl-File-Spec-3.30-cxOyXu)
Completed virtual/perl-ExtUtils-ParseXS-2.20.0401 (in 0m3.9s)
・・・・・

完了したら、ビルド用のchroot環境に入ります。

yuta@yuta-VirtualBox:~/chromiumos/src/scripts$ ./enter_chroot.sh
(cros-chroot) yuta@yuta-VirtualBox ~/trunk/src/scripts $ ./setup_board --board=x86-generic --default
Total: 1 package (1 new, 1 binary), Size of downloads: 0 kB
Portage tree and overlays:
 [0] /usr/portage
 [?] indicates that the source repository could not be determined
>>> Emerging binary (1 of 1) cross-i686-pc-linux-gnu/glibc-2.10.1-r2 from unknown repo

「Initialize the build for a board」ボードターゲットを設定します。
これはそんなにかかりませんでした。

(cros-chroot) yuta@yuta-VirtualBox ~/trunk/src/scripts $ ./setup_board --board=x86-generic --default

やっとここまでで、パッケージのビルド

(cros-chroot) yuta@yuta-VirtualBox ~/trunk/src/scripts $ ./build_packages
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Pending 2, Ready 0, Running 1, Retrying 0, Total 418 [Time 40m49.3s Load 0.54 1.12 0.94]
Pending 2, Ready 0, Running 1, Retrying 0, Total 418 [Time 40m54.3s Load 0.50 1.11 0.94]
Still building autotest-tests-ownershipapi-0.0.1-r194 (2m3.9s). Logs in /tmp/autotest-tests-ownershipapi-0.0.1-r194-WeKa5u
Pending 2, Ready 0, Running 1, Retrying 0, Total 418 [Time 41m4.3s Load 0.50 1.09 0.93]
Pending 2, Ready 0, Running 1, Retrying 0, Total 418 [Time 41m9.3s Load 0.54 1.08 0.93]
Pending 2, Ready 0, Running 1, Retrying 0, Total 418 [Time 41m14.3s Load 0.58 1.08 0.93]
Completed chromeos-base/autotest-tests-ownershipapi-0.0.1-r194 (in 2m22.1s)
Pending 1, Ready 1, Running 0, Retrying 0, Total 418 [Time 41m17.4s Load 0.53 1.06 0.93]
Started chromeos-base/autotest-all-0.0.1-r4 (logged in /tmp/autotest-all-0.0.1-r4-tJaoQX)
Completed chromeos-base/autotest-all-0.0.1-r4 (in 0m3.5s)
Pending 0, Ready 0, Running 0, Retrying 0, Total 418 [Time 41m21.0s Load 0.53 1.06 0.93]
Merge complete
Adding chromeos-base/chromeos to world
Adding chromeos-base/chromeos-dev to world
Adding chromeos-base/chromeos-factoryinstall to world
Adding chromeos-base/factorytest-init to world
Adding chromeos-base/chromeos-test to world
Adding chromeos-base/autotest-all to world
Done
Builds complete
Elapsed time: 41m40s
Done
(cros-chroot) yuta@yuta-VirtualBox ~/trunk/src/scripts $ 

イメージをビルドします。

cros-chroot) yuta@yuta-VirtualBox ~/trunk/src/scripts $ ./build_image
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
INFO    : Running /home/yuta/trunk/src/scripts/generate_au_zip.py -o /home/yuta/trunk/src/build/images/x86-generic/0.13.563.2011_06_02_0128-a1 for generating AU updater zip file
2011/06/02 01:46:51 - generate_au_zip.py - ERROR   : file = /home/yuta/trunk/src/platform/vboot_reference/scripts/image_signing/convert_recovery_to_ssd.sh does not exist
Failed generating AU zip file - ignoring Error...
Done.  Image created in /home/yuta/trunk/src/build/images/x86-generic/0.13.563.2011_06_02_0128-a1
Chromium OS image created as chromiumos_base_image.bin
Developer image created as chromiumos_image.bin
Elapsed time: 18m25s
To copy to USB keyfob, do something like:
  ./image_to_usb.sh --from=../build/images/x86-generic/0.13.563.2011_06_02_0128-a1 --to=/dev/sdX
To convert to VMWare image, INSIDE the chroot, do something like:
  ./image_to_vm.sh --from=../build/images/x86-generic/0.13.563.2011_06_02_0128-a1 --board=x86-generic
from the scripts directory where you entered the chroot.
(cros-chroot) yuta@yuta-VirtualBox ~/trunk/src/scripts $ 

完了しました、下記ディレクトリにイメージが出来上がったので次はUSBに書き込んで起動確認します。

~/chromiumos/src/build/images/x86-generic

CentOS 6.4でオンラインストレージ「Box」をWebDAV(davfs2)マウント:rpmforgeからfstab設定:LinuxでBoxをマウント編

boxにWebdavでアクセス失敗して困っている人へ

boxにWebdavでアクセス失敗する人はURLを確認してください。
「https://www.box.com/dav」と「https://app.box.com/dav」ではアクセスできませんでした。
「https://dav.box.com/dav」です。

Nexus 5でもBoxで50GBプレゼントキャンペーン

iPhoneで50GBの容量をGETできると話題のオンラインストレージBoxですが、とりあえずNexus 5でBoxのアプリを入れてみたらLGのデバイスでも50GBプレゼントキャンペーンが適応されました。

思わぬところで50GBのオンラインストレージが手に入ったので、VPSのファイルバックアップ先としてWebDAV利用してみます。

試した環境は「さくらのVPS 2G」と「ServersMan@VPS」です。

rpmforgeのインストールからfstab設定

まずはdavfs2が必要なのでrpmforgeからインストールします。

[root@vp52 ~]# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
[root@vp52 ~]# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm を取得中
準備中...                ########################################### [100%]
   1:rpmforge-release       ########################################### [100%]
[root@vp52 ~]#

davfs2をインストールします。

[root@vp52 ~]# yum install -y davfs2
Loaded plugins: fastestmirror
・・・・・・・・・・・・・
・・・・・・・・・・・・・省略・・・・・・・・・・・・・
・・・・・・・・・・・・・
Dependencies Resolved
===============================================================================================================
 Package                       Arch                 Version                       Repository              Size
===============================================================================================================
Installing:
 davfs2                        x86_64               1.4.6-1.el6.rf                rpmforge               218 k
Installing for dependencies:
 libproxy                      x86_64               0.3.0-4.el6_3                 base                    39 k
 libproxy-bin                  x86_64               0.3.0-4.el6_3                 base                   8.2 k
 libproxy-python               x86_64               0.3.0-4.el6_3                 base                   8.4 k
 neon                          x86_64               0.29.3-3.el6_4                base                   119 k
 pakchois                      x86_64               0.4-3.2.el6                   base                    21 k
Transaction Summary
===============================================================================================================
Install       6 Package(s)
・・・・・・・・・・・・・
・・・・・・・・・・・・・省略・・・・・・・・・・・・・
・・・・・・・・・・・・・
Installed:
  davfs2.x86_64 0:1.4.6-1.el6.rf                                                                         
Dependency Installed:
  libproxy.x86_64 0:0.3.0-4.el6_3  libproxy-bin.x86_64 0:0.3.0-4.el6_3  libproxy-python.x86_64 0:0.3.0-4.el6_3 
  neon.x86_64 0:0.29.3-3.el6_4     pakchois.x86_64 0:0.4-3.2.el6       
Complete!
[root@vp52 ~]#

Boxをマウントするディレクトリを作成します。


[root@vp52 ~]# mkdir /var/box

とりあえずBoxをマウントできるかテスト


[root@vp52 ~]# mount -t davfs https://www.box.com/dav /var/box/
Please enter the username to authenticate with server
https://www.box.com/dav or hit enter for none.
  Username: *******@gmail.com
Please enter the password to authenticate user *******@gmail.com with server
https://www.box.com/dav or hit enter for none.
  Password:  
/sbin/mount.davfs: Mounting failed.
302 Found
[root@vp52 ~]# 

Boxのwebdavのマウント失敗。。。
302 Foundリダイレクトされてる??
ブラウザで確認してみると、https://www.box.com/davからhttps://app.box.com/davへリダイレクトされていました。
https://www.box.com/davは古いのかな?

app.box.comでマウントの再チャレンジ


[root@vp52 ~]# mount -t davfs https://app.box.com/dav /var/box/
/sbin/mount.davfs: Mounting failed.
404 Not Found
[root@vp52 ~]# 

app.box.comでもwebdavのマウントできませんでした。。。
今度は404 Not Found
ここまで来て始めてBoxのオンラインヘルプページを見てアクセスURLが「https://dav.box.com/dav」だということを知る。

[root@vp52 ~]# mount -t davfs https://dav.box.com/dav /var/box/
Please enter the username to authenticate with server
https://dav.box.com/dav or hit enter for none.
  Username: *******@gmail.com
Please enter the password to authenticate user *******@gmail.com with server
https://dav.box.com/dav or hit enter for none.
  Password:  
[root@vp52 ~]# 

BoxをWebDAVマウントできた。

Boxのアカウント情報davfs2に設定する。


[root@vp52 ~]# vi /etc/davfs2/secrets

# /home/otto/.davfs2/certs/private/otto.crt  geheim
# otto_private.crt              "this is extraordinary secret"
# "otto private.crt"            this\ is\ secret,\ too.
https://dav.box.com/dav         メールアドレス    パスワード

ロックファイルを作らないようにdavfs2.confuse_locksを0に設定する。


[root@vp52 ~]# cat /etc/davfs2/davfs2.conf
# use_locks       1
use_locks         0
# lock_owner      <user-name>

Boxを自動でマウントしたいのでfstabへ記載する。


[root@vp52 ~]# cat /etc/fstab 
none    /dev/pts        devpts  rw,gid=5,mode=620       0       0
none    /dev/shm        tmpfs   defaults                0       0
https://dav.box.com/dav /var/box davfs rw,user,noauto 0 0
[root@vp52 ~]# 

※マウントに失敗した理由※
Box.comのWebDAVのURLはいろいろなブログで「https://www.box.com/dav」、「https://app.box.com/dav」など紹介されていましたが、自分がマウント成功したのは「https://dav.box.com/dav」でした。

Node.jsとは

Node.jsとはサーバサイドJavaScriptの一種

サーバサイドJavaScriptとはサーバサイドのアプリケーションの実装言語として、JavaScriptを使用する言語および環境のこと
ブラウザ(クライアント)サイドと同じ開発言語で、サーバサイドの開発が出来るので、開発効率が上がるといわれている。

サーバサイドJavaScriptにはこれらがある。

  • Node.js
    googleが開発したエンジン、V8で実行する環境
  • Rhino
    JavaVM上で実行するJavaScript言語処理系
  • Aptana Jaxer
    Aptana社がオープンソースとして配布している。

でもそれだけならそんなに自分は興味を持ちませんでした。
node.jsの何がすごいと感じたかというと

  • WebSocketが簡単そう。
  • サーバーの負荷分散に期待あり。

です。

WebSocketが簡単そうは「node.jsでTwitteのタイムライン取得」でも書きましたが
ほんとに簡単に実装が出来ました。
npmというパッケージマネージャーでフレームワークなどのライブラリを取り込めるのでいろいろ可能性があります。

負荷分散はC10k 問題で「apache vs nginx」=「スレッド対イベントループ」を取り上げています。
Apacheはスレッド、nginx はイベントループで、スレッドモデルは実行スタックをコピーするので
スレッド(アクセス)が増えるほどメモリ使用率が上昇するが、イベントループはプロセスは1個なので
メモリ使用量はあまり上がらないので、大量のアクセスに関してはイベントループが有利ということ。

そして、Node.jsは後者のイベントループ
これによって、特定の重い処理を待つことなく、次の入力を受け取れるので
トランザクションを重視するより、短縮URLのようなIOを優先されるような場合で活用できそう。

node.jsとnpmのトラブル

node.jsのパッケージマネージャーである、npmを使ってるが
いろんなマシンで試したけど、何かとトラブルがでる。

いろいろって言いながら、全部CentOSです。

・VMwere上のCentOS5.5
・VirtualBox上のCentOS5.5
・物理マシン上のCentOS5.4
・ServerMan上のCentOS5.5

仮想ソフトは関係ないと思うけど、いろいろトラブルからインストール時に
~develとかのパッケージを入れたり、試してみた。
今のところ一番うまく言ったのはVirtualBoxの仮想マシン。
本当はServerManでうまくいってほしかった。

絶対起こるのはhttp-basic-authのインストールでJSONのパースエラー
JSON書き直してローカルインストールすればOKそうだけど、とりあえず、http-basic-auth.jsを直でおいて呼び出して回避

[root@dti-vps-srv34 ~]# npm install http-basic-auth
npm info it worked if it ends with ok
npm info using npm@0.3.15
npm info using node@v0.4.2
npm info fetch http://registry.npmjs.org/http-basic-auth/-/http-basic-auth-0.1.0.tgz
npm ERR! couldn't read package.json in /tmp/npm-1300626776833/1300626776833-0.38027541153132915/contents/package
npm ERR! Error installing http-basic-auth@0.1.0
npm ERR! Error: Failed to parse json
npm ERR! Unexpected token ILLEGAL
npm ERR!     at jsonParseFail (/usr/local/lib/node/.npm/npm/0.3.15/package/lib/utils/read-json.js:89:11)
npm ERR!     at /usr/local/lib/node/.npm/npm/0.3.15/package/lib/utils/read-json.js:82:14
npm ERR!     at P (/usr/local/lib/node/.npm/npm/0.3.15/package/lib/utils/read-json.js:62:40)
npm ERR!     at cb (/usr/local/lib/node/.npm/npm/0.3.15/package/lib/utils/graceful-fs.js:31:9)
npm ERR!     at [object Object]. (fs.js:86:5)
npm ERR!     at [object Object].emit (events.js:39:17)
npm ERR!     at afterRead (fs.js:843:12)
npm ERR! JSON.parse 
npm ERR! JSON.parse Failed to parse package.json data.
npm ERR! JSON.parse Note that package.json must be actual JSON, not
npm ERR! JSON.parse just a JavaScript object.
npm ERR! JSON.parse 
npm ERR! JSON.parse This changed in npm 0.3.0, and is not a bug in npm.
npm ERR! JSON.parse Tell the package author to fix their package.json file.
npm ERR! JSON.parse
npm ERR! System Linux 2.6.18-194.3.1.el5.028stab069.6
npm ERR! argv { remain: [ 'http-basic-auth' ],
npm ERR! argv   cooked: [ 'install', 'http-basic-auth' ],
npm ERR! argv   original: [ 'install', 'http-basic-auth' ] }
npm not ok
[root@dti-vps-srv34 ~]# 

次にServerManで初めてでたbase64が無いよエラー
今までbase64をあえてインストールした記憶無いのに。

[root@dti-vps-srv34 node]# node StreamTwitter.js

node.js:116
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: Cannot find module 'base64'
    at Function._resolveFilename (module.js:299:11)
    at Function._load (module.js:245:25)
    at require (module.js:327:19)
    at Object. (/var/www/node/http-basic-auth.js:3:14)
    at Module._compile (module.js:383:26)
    at Object..js (module.js:389:10)
    at Module.load (module.js:315:31)
    at Function._load (module.js:276:12)
    at require (module.js:327:19)
    at Object. (/var/www/node/StreamTwitter.js:16:12)
[root@dti-vps-srv34 node]# 

インストールしたけど、なんかエラーがでてできなかった。
「cxx: base64.cc -> build/default/base64_1.o」
base64はID,PASSのencodeだけだから適当なツールで変換してソースにべた書きしました。

なんで失敗するのかと思って、npmのフォルダに無理やり上手くいったOSのファイル持ってきたり
いろいろしたけど、当然だめでした。
でも、ある20日に再チャレンジしたらなんか上手くいった。

[root@dti-vps-srv34 node]# npm install base64
npm info it worked if it ends with ok
npm info using npm@0.3.15
npm info using node@v0.4.2
npm info fetch http://registry.npmjs.org/base64/-/base64-2.0.3.tgz
npm info calculating sha1 /usr/local/lib/node/.npm/.cache/base64/2.0.3/package.tgz
npm info shasum d58b08f621b4be0c6b768258821d4d5f402c35b8
npm info preinstall base64@2.0.3
npm info install base64@2.0.3
Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for node path                   : not found 
Checking for node prefix                 : ok /usr/local 
'configure' finished successfully (0.391s)
Waf: Entering directory `/usr/local/lib/node/.npm/base64/2.0.3/package/build'
[1/2] cxx: base64.cc -> build/default/base64_1.o
[2/2] cxx_link: build/default/base64_1.o -> build/default/base64.node
Waf: Leaving directory `/usr/local/lib/node/.npm/base64/2.0.3/package/build'
'build' finished successfully (1.856s)
npm info postinstall base64@2.0.3
npm info preactivate base64@2.0.3
npm info activate base64@2.0.3
npm info postactivate base64@2.0.3
npm info build Success: base64@2.0.3
npm ok
[root@dti-vps-srv34 node]# 

最後にこれも調べ途中だけど、node.jsのWebsocketって何種類かあるっぽい

これをつかったけど、VMwere上のCentOS5.5はエラーは出ないけど
websocketのコネクションははれなかった。

[root@dti-vps-srv34 node]#npm install websocket-server

他の環境はこっちを試したら上手くいてる。

[root@dti-vps-srv34 node]#npm install http://github.com/miksago/node-websocket-server/tarball/master 

まだまだ、日本語の情報も少ない。

CentOS5.5でPHPの最新版(5.3)をインストール

脆弱性対策としてPHPの5.3をインストールする必要が出た。

CenstOSだから、最新はきついと思いながら調べたらレポジトリ追加でなんとかなった。

remiというレポジトリをどうやら追加しておこなう。
ココではないけど、MySQLの使ってるので、MySQLもいっしょにアップデートの必要があるらしい。

テストで違うサーバでやったら一回失敗して、mysqlが壊れて再インストールしましたw
大丈夫だと思うけど、mysqldumpでバックアップはしておきましょう。

yumに「epel」と「remi」を追加する。

#rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
#rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

常用しないように「epel」と「remi」の「enabled=0」を設定(なっているはず)

#vi /etc/yum.repos.d/epel.repo
#vi /etc/yum.repos.d/remi.repo

yumのオプションで「epel」と「remi」を有効にしてアップデート
phpだけだど、mysqlがらみでエラーがでるので、いっしょに。

#yum update --enablerepo=remi,epel php mysql mysql-server

完了。

# php -v
PHP 5.3.0 (cli) (built: Jul 19 2009 17:55:08)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies