JavaScriptからForce.com REST APIへアクセス
*このエントリーは「外部のphpからREST APIでForce.comにアクセスすためのOAuth Toolkit」の続きです。
JavaScriptからForce.com REST APIを使うにはForce.com JavaScript REST API Toolkitを使うのが近道です。今回は前回の外部php環境にこのToolkitを組み込んでみます。
本来はブラウザにダウンロードされたJavaScriptから直接リソースサーバ(Force.comでAPIを受けつけてデータアクセスを提供しているサーバ)にRESTアクセスできれば良いのですが、ブラウザのセキュリティ上そのままでは実行できません。ひとつの解はphp実行環境をプロキシとして利用することです。この形態であれば問題なくAPIにアクセスすることができます。
Force.com JavaScript REST API Toolkitではこの形態をサポートするためのproxy.phpを提供しています。これはphp実行環境に置いておけばそれだけでプロキシとして動作してくれるというなんとも便利なシロモノです。

まずはこのファイルをGithubからダウンロードしてドキュメントルート直下に配置します。
$ export DOCUMENT_ROOT='/srv/nginx/html/test'
[なんらかの方法でproxy.phpをダウンロード]
$ ls ${DOCUMENT_ROOT}/
proxy.php
次にToolkitの本体であるforcetk.jsをダウンロードして同じくドキュメントルート直下に配置します。
[なんらかの方法でforcetk.jsをダウンロード]
$ ls ${DOCUMENT_ROOT}/
forcetk.js
proxy.php
次にHTMLを生成してその中でforcetk.jsを読み込みます。また、forcetk.jsはjQueryを使用しているためjQueryも同様に読み込ませます。そして今回はAccountレコードを作成するJavaScriptを実装します。これらのHTML生成からJavaScriptライブラリの読み込み、Accountレコード作成処理までをindex.phpの中に記述していきます。(OAuthによる認証部分は実装されているものとします)
$ vi ${DOCUMENT_ROOT}/index.php
<?php
session_start();
if (!isset($_SESSION['access_token']) || !isset($_SESSION['instance_url'])) {
$_SESSION['oauth_return'] = $_SERVER['PHP_SELF'];
header( 'Location: oauth/oauth.php' );
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
</head>
<body>
<div id='account_form'>
<input type='text' name='account_name' />
<input type='button' value='create new account' />
</div>
<!--jQueryをロード-->
<script src="http://code.jquery.com/jquery-1.7.min.js"></script>
<!--forcetk.jsをロード-->
<script src="forcetk.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var $client_id = "[あなたのConsumer ID]";
var $proxy_url = "https://[あなたのWebサーバ]/proxy.php?mode=native";
// REST APIアクセスを抽象化するWrapperを初期化
var client = new forcetk.Client($client_id, null, $proxy_url);
// セッション情報をセット
client.setSessionToken('<?php echo $_SESSION["access_token"]; ?>', null, '<?php echo $_SESSION["instance_url"]; ?>');
$('#account_form :button').click(function(){
var $account_name = $('#account_form :text').attr('value');
// createメソッドでAccountレコードを作成。第一引数はオブジェクト名。第二引数はフィールド。第三引数は成功時のコールバック。第四引数はエラー時のコールバック。
client.create(
"Account",
{"Name":$account_name},
function(response){ alert('Success!'); },
function(jqXHR){ alert(jqXHR.responseText); }
);
});
});
</script>
</body>
</html>
ブラウザでWebサーバにアクセスし、フォームにAccountの名前を入力してボタンを押せばAjaxでAccount Recordの作成が実行されます。成功すればアラートウィンドが開き”Success!”と表示されるはずです。

Force.comの組織にログインして実際にAccountが作成されているか確認してみてください。
このToolkitの詳細なリファレンスに関してはドキュメントは見当たらなかったのですが、forcetk.jsを覗けば大体見当はつくと思います。
外部のphpからREST APIでForce.comにアクセスするためのOAuth Toolkit

Force.comの外部にホストしているWebサービスからForce.comに対してREST APIでアクセスするためには認証が必要です。
自分でOAuth認証クライアントのコードをスクラッチから書くのはホネの折れる作業なので、php実行環境でのToolkitを作成してGithubに公開しておきました。
Force.com OAuth Toolkit for PHP
使い方をざっくりと説明します。
必要なもの
- Force.comの外部で稼動しているphp実行環境
- cURLがphp実行環境で有効になっていること
- JSONがphp実行環境で有効になっていること
- SSLがphp実行環境で有効になっていること
- アクセスするForce.comの組織
- APIがForce.com組織およびプロファイルで有効になっていること
インストールとセットアップ
php実行環境のドキュメントルートにoauthディレクトリを作成。
$ export DOCUMENT_ROOT='/srv/nginx/html/test'
$ mkdir ${DOCUMENT_ROOT}/oauth
作成したoauthディレクトリ配下にGithubからoauth.phpとconfig.phpをダウンロードして保存。
[何らかの方法でoauth.phpとconfig.phpをダウンロード]
$ ls ${DOCUMENT_ROOT}/oauth
config.php
oauth.php
Force.com側でRemote Accessレコードを作成。
[あなたの名前]->Setup->Develop->Remote Accessから。重要なのはCallback URL。下記のフォーマットで。プロトコルはHTTPSである必要があります。
https://[あなたのサーバ]/oauth/oauth.php
php実行環境のconfig.phpを編集してCLIENT_IDとCLIENT_SECRETを設定。それぞれの値はRemote Accessレコードを参照。
$ vi ${DOCUMENT_ROOT}/oauth/config.php
<?php
define("CLIENT_ID", "[あなたのConsumer Key]");
define("CLIENT_SECRET", "[あなたのConsumer Secret]");
define("LOGIN_URI", "https://login.salesforce.com");
?>
認証が必要なphpファイルの最上部に下記を追記
# vi ${DOCUMENT_ROOT}/index.php
<?php
session_start();
if (!isset($_SESSION['access_token']) || !isset($_SESSION['instance_url'])) {
$_SESSION['oauth_return'] = $_SERVER['PHP_SELF'];
header( 'Location: oauth/oauth.php' );
}
[あなたのコードが続く]
?>
これで完了。
ブラウザで認証が必要なコンテンツにアクセスすれば、未認証の場合は一度Salesforceのログインサイトにリダイレクトされます。そこで認証または認可を行い、リダイレクト元に再度リダイレクトされます。
その後のアクセスでは$_SESSION['access_token']にアクセストークンが、$_SESSION['instance_url']にインスタンスのURLが保存されますので、この2つをもってForce.comのREST APIをつつくことで認可済みの状態を維持することができます。
このOAuthのアクセストークンを用いてREST APIにアクセスするサンプルコードを最後に紹介しておきます。下記はChatterからFeedとその発信者を取得して表示するコードです。
$url = $_SESSION['instance_url'] . "/services/data/v23.0/chatter/feeds/news/me/feed-items";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $_SESSION['access_token']));
$json_response = curl_exec($curl);
$response = json_decode($json_response, true);
echo "<!DOCTYPE html><html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head><body>\n";
foreach ((array) $response['items'] as $feed) {
echo $feed['actor']['name'] . " says \n";
echo $feed['body']['text'] . "<br/>\n";
}
echo "</body></html>\n";
参考情報
jQuery Mobileことはじめ – Force.comで試してみるjQuery Mobile
先日、9月29日にjQuery Mobile 1.0 RC1がリリースされました。
jQueryといえば今やFlashを凌ぐインストール数を誇ると言われているJavaScriptのライブラリ。そのjQueryをベースとしてjQueryモバイル端末向けに最適化されたライブラリがjQuery Mobileです。
Key FeaturesのページにjQuery Mobileの特徴がリストアップされていますが、一言で言えばjQuery Mobileのハートは「メジャーなモバイル端末をほぼ全てサポートし、異なる端末間の挙動の差異を吸収してくれる」というところでしょう。
Objective Cで書いたネイティブiPhoneアプリは当然ながらAndroid端末ではそのまま動かすことはできませんが、jQuery Mobileで書いたWebアプリケーションであればどのようなモバイル端末からも即座に利用でき、さらに通常のWebページではなくモバイル端末での操作に最適化されたネイティブアプリに近いインターフェースを提供してくれます。
- Objective Cとかを知らなくてもネイティブっぽいモバイルアプリが書ける
- 端末ごとのクセはjQueryにお任せ
素晴らしいじゃないですか。早速動かしてみましょう。
JavaScriptは純粋なWebサーバさえあれば走らせることができるのが良いところ。なのでWebサーバがある人はそこでindex.htmlでも作成してコーディングをスタートできます。
とはいえ手頃なWebサーバが手元にない、という人はこの機会にForce.comを利用してみましょう。
Force.comは一言でいえばアプリケーション開発、稼働、配信プラットフォームです。企業向けのアプリケーションに用いられることが多いですが、技術的には何にでも使えます。そして今回のようにjQueryベースのWebアプリケーションをホストさせることも簡単にできます。Developer Editionという無償で利用できるエディションがあるのでまずはこちらのページからサインアップしてアカウントを作成します。
UsernameはEmail形式である必要がありますが、有効なEmailである必要はありません。若干意味がわかりませんが、そこはかとなく「nkjm.kzk@jquerymobile.dev」とかそんな感じでOKです。(Email Addressは本当のEmailを入れてください)
サインナップするとすぐにWelcomeメールが届くのでそのメールにあるリンクから新しいパスワードを設定しつつログインします。
画面右上に自身の名前が表示されたプルダウンメニューがありますのでそこから「設定」を選択します。
左のサイドメニューから「開発」=>「ページ」をクリックし、「Visualforceページ」中の「新規」をクリックします。
表示ラベルと名前には「jquerymobile」等適当な名前を入力し、Visualforce Markupにこちらのコードをペタッと張り付けます。
このフォームに書いた内容がまさにHTMLで出力されることになります。HTML, CSS, JavaScriptといった一般的なマークアップでそのままコーディングできるのに加え、Apexというforce.com専用のマークアップを利用することができます。サンプルコードでは<apex:page>タグおよび<apex:ouputText>タグがありますが、それ以外は通常のHTMLであり、その中にごくシンプルなjQuery Mobileの要素を入れこんであります。すべて埋めたら「保存」をクリックしてページを保存します。
次に左のサイドメニューから「開発」=>「サイト」をクリックします。このページでWebサーバの設定を行うわけです。といってもごくシンプルな設定のみです。はじめにドメイン名を指定します。適当に取得可能なものを設定してください。
ドメイン名が登録できたら「新規」をクリックしてこのドメイン名にアクセスすると表示されるサイトを作成します。
ここでは適当なサイトの名前を設定し、「有効」にチェックをいれてこのサイトをアクセス可能な状態にし、「有効なサイトのホームページ」に先ほど作成したページを指定します。
これで完了です。
指定したURLにアクセスしてみましょう。こちらの環境ではhttp://nkjm-jquerymobile-developer-edition.na12.force.comですね。
こんなサイトが表示されればOKです。
PCのブラウザで確認できたらiPhone, iPad, Androidなどのモバイル端末で是非挙動を見てみてください。Webアプリなのにネイティブに近いインターフェースであることが実感できると思います。
iOSでは端末のオリエンテーション(縦横)を変えたときにうまく表示幅があわなくなるマイナーな不具合があるようですが、次期バージョンでFixされるとのことなので心配なさそうです。
そんなこんなで気になるjQuery Mobileですが、近々で正式版が出るようですので引き続き要チェックですね。
また、こんな感じでForce.comをWebアプリの開発環境として利用することもできます。今回はブラウザ上でコードを入力しましたが、Force.com IDEという統合開発環境も提供されており、Force.comのクラウドとローカル環境を同期しながらより効率的に開発作業を行うことも可能です。そちらも是非。
Started at Salesforce.com
9月15日付けでSalesforce.comに入社しました。
force.comをはじめとするプラットフォーム製品群の啓蒙活動とエンジニアリングを担当します。とりわけ、あらゆるISVの皆様にSalesforce.comが提供するプラットフォーム上で多くのアプリケーションを展開していただき、Salesforce.comのプラットフォームを真のプラットフォーム、つまりデファクトスタンダードにしていくことが私のミッションだと考えています。
Salesforce.comは言わずとしれたクリックだけで多くの開発作業を行えるアプリケーション開発/提供プラットフォームのforce.comをはじめ、Ruby, Java, Node.js, Clojureの開発/提供プラットフォームのHeroku、Public or Private等アクセス元を選ばず、どこからでも整合性をもったデータにアクセス可能な統合データベース:database.com、クラウドから必要な個人データをスムーズに手に入れることができるdata.com、企業のコミュニケーションをSocialに変えていくChatter、Social Mediaでの活動をモニターして傾向分析を行うRadian6といった多種多様な製品を提供しています。(一部日本では未提供の製品あり)
そしてこれらの製品群に共通しているのが、クラウド型の提供形態であり、プラットフォームというものを意識しており、さらについ先日開催された年次最大のイベントであるDreamforceでも色濃かったようにSocial、それもSocial Enterpriseという新しいコンセプトを踏襲しているところだと思います。
私はこれらのコンセプトとそれを広めていくこのポジションに強い魅力を感じ、Salesforce.comへ入社するはこびとなりました。
私は最近「プラットフォーム」というものがつくづく重要であると感じています。これは単にPaaSといったものを意味しているのではなく、より実質的な意味でのプラットフォームです。例えばEmailは非常にトラディショナルなプロトコルの上に成り立っており、ユーザーからすれば今も昔もEmailアプリーションという認識だと思いますが、Emailは実質的に情報交換の「プラットフォーム」になっています。単なるプロトコルであり、アプリケーションであるEmailをプラットフォームたらしめているのはその利用ユーザ数以外のなにものでもないでしょう。皆が使っている。このことがあるプロトコル、ソフトウェア、サービスをプラットフォームというように認知させます。Emailよりもモダンで勢いのあるプラットフォームがFacebookでしょう。はじまりはとあるWebサービスですが、今や情報交換、広告など、一般ユーザとエンタープライズ双方において様々なアクティビティのプラットフォームになっています。
私はSalesforce.comの製品群をこのようなプラットフォームにしたい、そう考えています。大それたゴールであり、入社したばかりの人間がこんなことを言うのはお恥ずかしい限りで社内のエキスパート達の目が痛い、という感じですが、これまで通り我が道を強引に走っていこうと思います。
これまで私はサーバ仮想化、ストレージ、データベースといったまさにド基盤な路線を歩んできました。なので今回の選択はちょっと意外、と思われた知人も少なくありませんでした。ただし私はDemo Developerとしての顔も持っており(何だそれは)、全く畑が違うところに行くわけではありません。それに基盤の知識も顧客視点でSalesforce.comのサービスをアセスする際にもちろん重要になってきます。なにより、面白いと思ったものがあったなら自分を広げてみる、という選択も決して悪くないなと思うのです。Steve Jobsの言葉を借りれば、
“You can only connect the dots looking backward. You have to trust in something, it will give you the confidence to follow your heart.” by Steve Jobs
*ちょっとアレンジしてます。
これから全力でこのチャレンジに向かっていきます。
My Last Day in Oracle.
本日、9月14日をもって日本オラクルを退職することになりました。
私は元々前職でXenに携わっていたということもありOracle VMの立ち上げメンバーとして日本オラクルに入社しました。その後次第にデータベース、ストレージといった社内でいうところのテクノロジー製品全般にカバレージを拡げて啓蒙活動をおこなってきました。
私が日本オラクル在籍中に最も時間を費やしたのは「いかにして顧客の利益と自社の利益を同時に最大化するか」というチャレンジでした。恐らく外資系ベンダーというのは自社の利益を最大化させることに極めてアグレッシブな会社だと思います。自社の利益を追求するのは企業としての基本的な営みであり、欠かせない視点だと思います。ただし私には提案活動で最も重要な視点は常に「顧客指向」だという理念があります。
以前Twitterにも同じ旨を発言しましたが、一般に営業は前者を考えるのが得意でエンジニアは後者を考えるのが得意だと思います。しかし前者だけでは押し売りになり、後者だけでは企業経営が成り立たない。なのでこの2つを同時に叶える提案が不可欠。顧客の利益を最大化する提案で、かつ、自社の利益を最大化する提案。それを考えることが自分のミッションであり、それがまさにセールスシナリオというものだと考えています。
私の考える磨かれたセールスシナリオというのは、顧客にとってベストなものを提案し、それが何故ベストなのかを全てにおいて説明できるものであり、同時に競合をできる限り排除して自社の利益を最大化するものです。ベストであることを証明するにはその分野のテクノロジーと競合情報に関して深いインサイトが必要になり、最終的にシナリオという一本の理論を形成するにはイマジネーションが必要になります。私はこのセールスシナリオ作成という作業に心血を注いできました。
ORACLEという会社は極めて多くの、そして先進の製品を開発し提供している会社であり、それが故に埋没している製品や、より良いメッセージ、用法が見いだせる製品が潜在しています。その中でセールスシナリオを作成する作業は会社にとって重要であり、そして私にとってエキサイティングでした。
しかしながら今回、今以上にこの活動を集中し、より大きな結果を作り出して行きたいと考えるにあたり、新しい環境に移ることを決意しました。タフな決断ではありましたが、熟慮の末、この選択が必要なことであり、ベストであると信じています。
日本オラクルで一番わがままな男、などという異名をとりながらも、そのわがままを受け入れ続けてくれたマネジメントの方々に御礼申し上げます。毎週毎週わがままや謎の提案を繰り返しおこなうこんなにも厄介な人間でしたが、懲りずに耳を傾けていただき感謝しています。本当に有難うございました。
最後に、一緒に働いたみんなにとても感謝しているということを言わせてください。
セールスシナリオを作成するという活動にあたって、私は多くのエキスパートに支えられてきました。Storage GRID構成における性能測定、障害試験。Recovery Manager、Flashback、Data Guardを使ったバックアップ/リカバリ検証。Real Application Clustersでのデータベースクラウド検証。いつもエキスパートが検証作業に手を差し伸べてくれました。私がセミナーでお話してきたプレゼンテーション、デモンストレーション、そしてその反響は彼らの力がなくては完成し得ないものでした。多くの仲間に恵まれて、私は本当に幸運でした。
また、退職するにあたり有志のメンバーが集まってくれたとき、自分には支えてくれていた人達、仲間がこんなにもいたんだ、とあらためて感じ、感動しました。
みんなが開いてくれたパーティ、集まってくれた人達、かけてくれた言葉、贈ってくれたプレゼント、決して忘れません。
みんな、本当にありがとう。いってきます。
Twitterについて今、ふと思うこと。
僕がTwitterのアカウントを作成したのは確か2007年の春頃。比較的早くからサービスに触れていた方だと思います。といっても当初は試しに「今、皿を洗った。」とかつぶやいてみて、一体何が面白いんだこのサービスは?と瞬時に放置した記憶があります。はてブ等のソーシャルブックマークとかも同じようなスタートを切ったように記憶しています。
しかし今ふとこの2年を思い返せばTwitterは僕の仕事や人生に大きな影響を与えたと感じます。
Twitterをはじめとするソーシャルネットワークによってこの2年間、情報を入手するプロセスがキュレーションという言葉に表されるように変化し、また自分の考えを#タグというStreamに乗せてあたかもTVコマーシャルのように彼方まで送り出すことができるようになり、さらにFollowerやRTによって情報は増幅され自分のTweetも再帰的に大きな発信力を持つようになりました。そしてその情報のInput/Outputを繰り返す中で多くの人と出会いました。
考えてみると今自分がここにいる過程にはTwitterで発信したあの発言、入手したあの情報、あの会話、出会ったあの人達がマイルストーンとして存在します。一見Twitterとは関係なさそうなあの人も、実はTwitterが契機となって出会ったあの人に紹介したもらった、とかいうのがポロポロ出てくる。今、自分の身の回りにいる人、ある物、状況、よくよく考えれば直接的、間接的にTwitterの影響がそこら中に確認されます。
Twitterがなければ随分違う今になっていただろうと思います。それはそれですが、Twitterの影響を受けた今の自分のシチュエーション、僕はとても幸せです。
Twitterサービスのスペックは驚くほど単純なもので、スペック的にはそこにブレークスルーはないように思えます。しかしサービスは単純であっても、それが生活やビジネスを大きく変える可能性がある。発明(テクノロジー、アプリケーション、サービス)は最終的な価値(何かを劇的に変え豊かさを生み出すこと)に紐づくまでいくつかのホップがあると思います。ものによってはそれなりのホップ数を数えることもあるでしょう。僕はこの発明 => ホップ => 価値をイメージできる人間がビジョナリーであり、人に伝えて心を動かすことができるのがエバンジェリストだと思います。
僕はこのエバンジェリストという仕事をとても気に入っています。:)
ルートファイルシステムをBtrfsにする方法(Oracle Linux 5.6)
Fedora 16でデフォルトファイルシステムとなることがアナウンスされ、Btrfsはいよいよ本格的に使われはじめることと思います。今回は最新のBtrfsソースコードを用いてLinuxのルートファイルシステムをBtrfsにしてしまう手順を紹介します。
OSは仮想マシンのOracle Linux 5.6 x86_64をベースにして進めていきます。
まずはBtrfsのソースコードを取ってくる必要があります。最新のソースコードはgitで管理されており、gitコマンドでダウンロードする必要がありますのでまずはgitを使えるようにします。
EPELレポジトリを利用可能にし、yumでgitをインストールします。
[root@~]# cd /var/opt [root@~]# wget http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm [root@~]# rpm -ivh epel-release-5-4.noarch.rpm [root@~]# yum install -y git
git cloneでBtrfsの最新ソースコードをダウンロードします。これによってLinux Kernelを含むコード全体がダウンロードされます。
[root@~]# cd /var/opt [root@~]# git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git
作成されたディレクトリに移動し、現在のKernel設定を継承するために/bootディレクトリからKernelビルド設定ファイルを.configとしてカレントディレクトリ配下にコピーします。
[root@~]# cd btrfs-unstable/ [root@~]# cp /boot/config-2.6.32-100.26.2.el5 ./.config
コピーした設定ファイルを元に新しい設定ファイルを作成します。
[root@~]# make oldconfig
このあと古い設定ファイルと新しいKernelとの機能差の部分について対話的に設定することを求められますが、今回はEnterキーを押し続けてデフォルトを受け入れます。ビルドがうまくいったらその後で自分なりのコンフィグを詰めて下さい。
対話的設定が終わるとコマンドプロンプトが戻ってきます。
一点だけ今作成したKernelビルド設定ファイルを修正します。BtrfsはデフォルトではKernel Moduleとしてビルドされますが、これをKernel本体に組み込むようにします。
[root@~]# vi .config
CONFIG_BTRFS_FS=y
ではここからコンパイルを行っていきます。ちなみに-jオプションに渡す数字はコンパイルの並列度を設定します。お手持ちのCPUコア数の倍の数くらいを目安に与えてください。
[root@~]# make -j8
Kernel Moduleのインストール。
[root@~]# make modules_install
Kernelのインストール。
[root@~]# make install
これでインストールはひとまず完了です。
一度リブートしますが、起動時にgrubのメニュー画面を見れない場合は次のようにgrub.confを編集してデフォルトのKernelを新しいKernelに変更しておきます。
[root@~]# vi /etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle Linux Server (2.6.38+)
root (hd0,0)
kernel /vmlinuz-2.6.38+ ro root=/dev/VolGroup00/root rhgb quiet
initrd /initrd-2.6.38+.img
title Oracle Linux Server (2.6.32-100.26.2.el5)
root (hd0,0)
kernel /vmlinuz-2.6.32-100.26.2.el5 ro root=/dev/VolGroup00/root rhgb quiet
initrd /initrd-2.6.32-100.26.2.el5.img
title Oracle Linux Server (2.6.18-238.1.1.0.1.el5xen)
root (hd0,0)
kernel /vmlinuz-2.6.18-238.1.1.0.1.el5xen ro root=/dev/VolGroup00/root rhgb quiet
initrd /initrd-2.6.18-238.1.1.0.1.el5xen.img
リブートします。
[root@~]# init 6
起動したら新しいKernelで起動しているか確認します。
[root@~]# uname -r 2.6.38+
次にbtrfsの操作に必要となるツール群と、そのツール群のビルドに必要なe2fsprogs-develをインストールします。
[root@~]# yum install -y e2fsprogs-devel [root@~]# cd /var/opt [root@~]# git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs-unstable.git [root@~]# cd btrfs-progs-unstable/ [root@~]# make [root@~]# make install
これでmkfs.btrfs等のツール群がインストールされました。リブートは必要ありません。
ここからBtrfsのファイルシステム作成と移行をおこなっていきます。
現在のボリュームとファイルシステムのレイアウトを確認します。
[root@~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-root 20G 9.5G 8.9G 52% / /dev/xvda1 99M 34M 60M 37% /boot tmpfs 952M 0 952M 0% /dev/shm
現在ルートファイルシステムは20GByte程のLogical Volumeで構成されています。
このファイルシステムを丸ごと同容量のBtrfsにコピーすることで移行を図ります。
さしあたってBtrfs用のボリュームを追加する必要があります。今回は仮想化環境なのでdom0側で20GByteのFile VBDを作成して仮想マシンに割り当てます。
[root@dom0]# cd /OVS/running_pool/btrfs [root@dom0]# dd if=/dev/zero of=btrfs_root.img bs=1M count=0 seek=20480 [root@dom0]# xm list Name ID Mem VCPUs State Time(s) Domain-0 0 564 8 r----- 2052.8 btrfs 1 256 4 -b---- 247.1 [root@dom0]# xm block-attach btrfs file:/OVS/running_pool/btrfs/btrfs_root.img /dev/xvdc w
仮想マシンに戻り、今割り当てられたボリュームをBtrfsでフォーマットして一時的に/mntにマウントします。
[root@~]# mkfs.btrfs /dev/xvc
WARNING! - Btrfs v0.19-35-g1b444cd IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label (null) on /dev/xvdc
nodesize 4096 leafsize 4096 sectorsize 4096 size 20.00GB
Btrfs v0.19-35-g1b444cd
[root@~]# mount -t btrfs /dev/xvdc /mnt
次にfstabを編集して/にマウントされるボリュームを現在のLogical Volumeから/dev/xvdcに変更します。
[root@~]# vi /etc/fstab
#/dev/VolGroup00/root / ext3 defaults 1 1
/dev/xvdc / btrfs defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/xvdb swap swap defaults 0 0
次に現在のルートファイルシステムからデータをコピーします。なお、別ボリュームの/boot、スペシャルファイルを含むディレクトリ等はコピーせず、後ほどディレクトリだけ作成します。
[root@~]# cd /
[root@~]# cp -a {bin,etc,home,lib,lib64,media,misc,opt,root,sbin,selinux,srv,tftpboot,u01,usr,var} /mnt
[root@~]# mkdir /mnt/{boot,dev,mnt,proc,sys,tmp}
次にKernelをビルドしたディレクトリに移り、今一度make installを行います。これは、変更したfstabに基づいてinitrdを再構築するためです。また、同時にgrub.confも適切に編集してくれます。
[root@~]# cd /var/opt/btrfs-unstable/ [root@~]# make install
これでリブートします。起動すると/に/dev/xvdcがマウントされ、Btrfsがルートファイルシステムとなります。
[root@~]# mount
/dev/xvdc on / type btrfs (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/xvda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
噂のLinux Kernel 3.0.0(インストール手順付き)
Linux Kernelがとうとう2.6.xから3.0.x台になります。
といっても構造的な変化があるわけではなく、20周年記念、とかそういう理由だそうで2.4から2.6になったときよりも変更点は少ないと見ていいでしょう。
今日現在ですでに3.0.0-rc3がリリースされています。抜本的な変化はないものの、新しいKernelはやっぱり魅力的です。僕が個人的に特に気にしているのは次の2点。
- Xen
- Btrfs
XenについてはXen HypervisorがKernelに組み込まれた、という話ではありません。Xen Hypervisor上でLinuxを準仮想化のdom0/domUとして稼働させるためのコードがすべてKernelに取り込まれたということです。一般ユーザにはそれほど直接的なインパクトはないのかなと思いますが、とりわけDeveloperにとっては大きな成果だと思いますし、ひいてはそれがこれからのXen関連開発の勢いにつながってくるはずです。Linuxはこれまでも、そしてこれからもXen上での準仮想化モードをサポートされることになるでしょう。準仮想化はドライバまわりだけでなく、古いマシンのサポートやTrancendent Memoryといった独自の拡張を可能にするモードとしてコアデベロッパーは引き続き注力していくという噂です。
BtrfsについてはすでにFedora 16がデフォルトファイルシステムとして採用することをアナウンスしており、つまりはRHELのデフォルトファイルシステムも将来的にBtrfsになる可能性が極めて高いということを示唆しています。Btrfsはコンセプト的にはZFSに似ており、ボリュームマネージャとファイルシステムが一体になった構造です。動的なボリュームの追加やスナップショット等が可能になっており、多くの環境では従来のmdやLVMが不要になるでしょう。
こういうものは我先に試してみたいですよね。ということでOracle Linux 5.6にKernel 3.0.0-rc3をインストールする方法を記載しておきます。
まずはKernel 3.0.0-rc3のソースをダウンロードしてきます。http://www.kernel.orgからFull Sourceを選択すればtar.bz2でダウンロードできます。ダウンロードしたら解凍/展開し、展開したディレクトリに移動します。
[root@~]# cd /var/opt [root@~]# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.0-rc3.tar.bz2 [root@~]# tar xvfj linux-3.0-rc3.tar.bz2 [root@~]# cd linux-3.0-rc3
現在のカーネルビルド設定を引き継ぐために/bootディレクトリから設定ファイルを.configとしてカレントディレクトリにコピーします。Oracle Linux 5.6の場合はUEKのKernel設定ファイルが存在しますのでそれを使用します。なるべくバージョンが近い方が差異が少ないので。といっても結構ありますが。
[root@~]# cp /boot/config-2.6.32-100.26.2.el5 ./.config
コピーした設定ファイルを用いて新しい設定ファイルを作成します。
[root@~]# make oldconfig
このあと古い設定ファイルと新しいKernelとの機能差の部分について対話的に設定することを求められます。一つずつ見ていると3日くらいかかりますのでひたすらEnterキーを押し続けてデフォルトをあるがままに受け入れます。ビルドがうまくいったらその後で自分なりのコンフィグを詰めていくのが良いでしょう。
対話的設定が終わるとコマンドプロンプトが戻ってきます。
ここからコンパイルを行っていきます。ちなみに-jオプションに渡す数字はコンパイルの並列度を設定します。お手持ちのCPUコア数の倍の数くらいを目安に与えてください。
[root@~]# make -j8
Kernel Moduleのインストール。
[root@~]# make modules_install
Kernelのインストール。
[root@~]# make install
これで完了です。
/bootディレクトリを見てみると新しいKernelがインストールされています。
/lib/modulesには新しいKernel Moduleがインストールされています。
そして/etc/grub.confを見ると新しいカーネル用のエントリーが自動的に追加されています。親切。
ブート時にgrubのメニュー画面を見れない人は今の内に/etc/grub.confのdefault=を今インストールしたカーネルのエントリに合わせておきます。
ちなみに下記エントリは上から、Linux 3.0.0-rc3 Kernel、Unbreakable Enterprise Kernel(UEK)、RHEL互換Oracle Linux PV Kernelです。Linux 3.0.0-rc3とUEKはPvopsなので準仮想化でも完全仮想化でも非仮想化でもこのカーネルで起動できます。
[root@~]# vi /etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle Linux Server (3.0.0-rc3)
root (hd0,0)
kernel /vmlinuz-3.0.0-rc3 ro root=/dev/VolGroup00/root rhgb quiet
initrd /initrd-3.0.0-rc3.img
title Oracle Linux Server (2.6.32-100.26.2.el5)
root (hd0,0)
kernel /vmlinuz-2.6.32-100.26.2.el5 ro root=/dev/VolGroup00/root rhgb quiet
initrd /initrd-2.6.32-100.26.2.el5.img
title Oracle Linux Server (2.6.18-238.el5xen)
root (hd0,0)
kernel /vmlinuz-2.6.18-238.el5xen ro root=/dev/VolGroup00/root rhgb quiet
initrd /initrd-2.6.18-238.el5xen.img
リブートすれば新しいKernelで起動してきます。
[root@~]# uname -r 3.0.0-rc3
Solarisへのsshログインが異様に遅いときの対処法
sshでログインしようとして異様に遅い場合は「あー、UseDNS変更してなかったわ。」なんてことがよくあります。Linuxでは。sshd_configで「UseDNS yes」となっているとクライアントのIPを名前解決しに行くので、クライアントのIPが解決できないIPだったり、DNSが止まってたりするとこういうハメになりますよね。
Solaris 11 Expressでもデフォルトでは名前解決を行うのでhostsファイルでもDNSでも名前解決できないと寝そうになるほど待たされます。
なのでsshd_configに「UseDNS no」と追記してsvcadm restart sshしようっと、と思ってしまうのですが、この設定はSolarisだと怒られます。少なくともSolaris 11 Expressでは。Solaris 11 ExpressのsshdではUseDNSはサポートされていないようで、変わりにVerifyReverseMappingという設定があります。なので、こいつかぁ、と思ってsshd_configに「VerifyReverseMapping no」と書いてあげるわけですが、いっこうに名前解決を止めてくれる気配はありません。
結論としては、こうです。
[root@~]# vi /etc/ssh/sshd_config LookupClientHostnames no [root@~]# svcadm restart ssh
ご注意を。
COMSTARのインストール
順番が前後しまくりですが、そういえば初期セットアップについて書いてなかったので。
まずは何はともあれSolaris 11 Expressをインストールします。ベアメタル(非仮想化)でもいいですし、Oracle VM Server環境がある場合はVM Templateを使ったVMでも構いません。Solaris 11 EpxressのVM Templateはこちらからダウンロードできます。
http://edelivery.oracle.com/linux
OSのインストールが完了したら先日アップしたこちらの記事「Solaris 11 Expressの基本的なネットワーク設定」をもとにネットワークの初期設定をキメてください。
では次に必要なパッケージをインストールします。
[root@~]# pkg install storage-server
パッケージのインストールが完了したら必要なサービスを有効化します。
[root@~]# svcadm enable stmf [root@~]# svcadm enable -r svc:/network/iscsi/target:default
これでもう完了です。
あとはこちらの記事「COMSTARの設定」をご参考いただきながらボリュームやターゲット等を設定していく、ということになります。







