Unable to boot - please use a kernel appropriate for your CPU.」意訳すると、「このカーネルはあんたのCPUには無い機能を必要としているよ。起動できまへん。あんたのCPUに合ったカーネルを使ってね。」とこんな感じ。
このような場合、PAE (Physical Address Extension)が無効なせいかもしれません。
Ubuntu ServerではPAEが有効である前提でインストールをしているようなのです。
Intel PentiumPro以降のCPUの多くがPAEを実装しているとのことで、問題が出るケースはそう多くはないのかもしれませんが、PAEを有効にできない仮想環境や運悪くPAEを実装していないCPUで起動した場合には対処が必要になります。というか、うちの自宅サーバーのCPUはIntel PentiumM (Banias)でがっつり引っかかってしまいました。PentiumMは省電力・高効率を目指したモバイル(ノート)PC向けのCPUなのでPAEには対応しなかったのかもしれませんね。
さて、肝心の対処方法ですが、インストーラーCD/DVDで起動して「壊れたシステムを修復(R)」を選択します。
ネットワークの設定くらいまでは通常のインストールと同じですが、その後下のような画面が出ます。
これは実験的にVirtualBOXにてPAE無効で仮想マシンを作成してインストールしてみたものです。ディスクは1つで全体を使用し、LVMを導入しています。
上の3つは物理(といっても仮想ですけど)パーティション。下の2つは論理ボリュームです。「te3」というのはホスト名です。
カーネルを入れ替えたいので/bootの存在するパーティションを選択します。自動でパーティションを作成した場合は一番上のパーティションで良いでしょう。
次にレスキュー操作を選択しますが、「インストーラー環境内でシェルを実行」を選択します。
レスキューモード説明の画面が出てきます。ファイル配置がレスキューする側の環境でスタートします。選択した修正したいパーティションは/target配下に配置された状態でスタートします。
シェルが実行できるようになりますので以下のコマンドを実行しましょう。
# chroot /target
# bash
# aptitude update
# aptitude install linux-generic
うまく行ったら、exitで抜ければ「レスキュー操作」の画面に戻りますから、CD/DVDをイジェクトまたはアンマウントして「システムの再起動」をします。
ちなみに、PentiumMの実機に上記操作をしたときは linux-generic の代わりに linux-686 としました。少しでも最適化されている方が良いかなと思って。
再起動しても状況が変わらないようであれば、標準で選択されるカーネルが以前と同じものである可能性がありますので、起動時に少しの時間だけ下のような画面が表示されているときに [Esc] キーを押下します。
するとカーネル選択(またはメモリテスト)画面になりますので、修正インストールしたカーネルを選択します。下の画面例ではlinux-generic出てないですけど修正インストールが成功していれば現れるはずです。
(うちの環境ではこの操作をしなくても起動するようになったのでDefaultのカーネルがちゃんと置き換わっているようです。)
カーネル選択を毎回するのも大変ですので一度起動したところでDefaultのカーネルを変更しておきましょう。
/etc/grub/menu.lst を開いてみてみましょう。viでもnanoでもいいです。あっ、root権限が必要ですのでsudoを先頭に付けます。
$ sudo nano /boot/grub/menu.lst
[sudo] password for xxxxxx:
14行目あたりに
default 0
とあります。この数字がDefaultで選択されるカーネルを指しています。この数字を変更するのが一つの方法です。
しかし、serverカーネルは起動しないことがハッキリしているのでぶっちゃけ要らないんですよね。このファイルの最後の方を見てみましょう。
title Ubuntu 8.04.2, kernel 2.6.24-24-generic
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-24-generic root=UUID=85423330-189f-4abe-8a6c-f271a862c9fc ro quiet splash
initrd /boot/initrd.img-2.6.24-24-generic
quiet
title Ubuntu 8.04.2, kernel 2.6.24-24-generic (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-24-generic root=UUID=85423330-189f-4abe-8a6c-f271a862c9fc ro single
initrd /boot/initrd.img-2.6.24-24-generic
title Ubuntu 8.04.2, kernel 2.6.24-23-server
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-23-server root=UUID=85423330-189f-4abe-8a6c-f271a862c9fc ro quiet splash
initrd /boot/initrd.img-2.6.24-23-server
quiet
title Ubuntu 8.04.2, kernel 2.6.24-23-server (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-23-server root=UUID=85423330-189f-4abe-8a6c-f271a862c9fc ro single
initrd /boot/initrd.img-2.6.24-23-server
title Ubuntu 8.04.2, memtest86+
root (hd0,0)
kernel /boot/memtest86+.bin
quiet
### END DEBIAN AUTOMAGIC KERNELS LIST
これがカーネル選択画面で表示される内容です。これのserverカーネルの固まりをゴッソリ削除してしまうのも一つの方法ですね。
(この例では3つめ、4つめのブロックを削除)
Install (3) PAEとLVM
しくみがキッチリ理解できていれば躓くことは無かったんでしょうけど、Install (2) PAE問題とLVMの複合問題でハマっていたのでメモ。
PAE問題の対処としてカーネルの入れ替えを行うわけですが、LVMを導入している場合はこのことに留意しておく必要があります。
詳しく調べた訳ではないですがLVMが動く前にアクセスが必要になるであろうブート関連のファイル群はLVMの配下に置くことは出来ないということなのでしょう。
カーネル入れ替え作業時には/bootを手動でマウントしたうえで行う必要があります。(未検証ですが)
これを分かってなくてエラーが出て、パッケージに不具合があるのかなと勝手に解釈して数日ほったらかして、よく見たら/bootが無いって怒られてて、mkdirしちゃって成功したかに見えたけど再起動したら何も変わっていないという状況に陥りました。
(mkdirした/bootはLVM配下にあって、起動時には/dev/sda1の/bootに隠蔽されてしまう。というか起動時にLVM配下は見えていないのでしょう。)
個人使用の単純なシステムに暗号化をするわけでもないのにLVMの導入が必要なのか?と考え直して、LVMの導入を辞めてしまったのでLVMを導入しつつレスキューでカーネル入れ替えは未検証ですが、しばらくハマっていたのでメモしておきます。
それにしても、UbuntuはScrollLock利かないんですね。エラーメッセージがすぐに画面外にスクロールアウトしてしまうのでエラーの根本原因を見つけるまで随分画面を凝視しました。この辺はScrollLockで流れたメッセージの確認ができるFreeBSDの方が便利だったなと思います。
Install (4) 設定見直し
Installを終えてから、Install時に設定できなかったもの、設定を間違えたもの、設定を見直したいものなど出てくる場合もあるかと思います。
ここではそれらの設定についてまとめておきます。
その前に。
設定ファイルを編集する際は「nano」コマンドを使用すると便利です。簡易テキストエディタです。まぁ、慣れている人は「vi」とかで全然良いんですけど。
IPアドレスの設定
/etc/network/interfaces ファイルを編集します。root権限が必要ですので、rootユーザになるか、sudoコマンドを使用しましょう。
$ sudo nano /etc/network/interfaces
するとこのような固まりがあるかと思います。
iface eth0 inet static
address 192.168.xxx.xxx
netmask 255.255.xxx.xxx
network 192.168.xxx.xxx
broadcast 192.168.xxx.xxx
gateway 192.168.xxx.xxx
staticのところはDHCPを使用するのであれば「dhcp」として、以下は不要になります。
DNSリファラーの設定
/etc/resolv.conf ファイルを編集します。root権限が必要です。
$ sudo nano /etc/resolv.conf
するとこのような固まりがあるかと思います。
search dodoit.info
nameserver 192.168.xxx.xxx
nameserver xxx.xxx.xxx.xxx
searchにはドメイン名(dodoit.infoはこのブログのドメイン名なので皆さんの名前にして下さいね)を、nameserverにはそのマシンがDNS参照したいIPアドレスを記入します。
ネットワーク設定反映
さて、ネットワークの設定を変更したら、それを反映させましょう。自動即時反映はされませんので。とはいえ、OSの再起動は不要です。
$ sudo /etc/init.d/networking restart
Installするサーバーの変更
tasksel コマンドを使用します。
Install時にネットワーク設定がうまく出来ていた場合やapt-get updateなどしていた場合は選択肢が増えているかもしれません。
GUI環境が欲しい場合は「Ubuntu desktop」など選択してみても良いかもしれませんね。
参考までにうちの環境で出た選択肢を挙げておきます。
DNS server
Edubuntu server
LAMP server
Mail server
OpenSSH server
PostgreSQL database
Print server
Samba File server
2D/3D creation and editing suite
Audio creation and editing suite
Edubuntu KDE desktop
Edubuntu desktop
Gobuntu desktop
Kubuntu KDE 4 desktop
Kubuntu desktop
LADSPA and DSSI audio plugins
Mythbuntu additional roles
Mythbuntu frontend
Mythbuntu master backend
Mythbuntu slave backend
Ubuntu Studio desktop
Ubuntu desktop
Video creation and editing suite
Xubuntu desktop
Edubuntu live CD
Gobuntu live CD
Kubuntu live CD
Kubuntu live CD
Mythbuntu live CD
Ubuntu live CD
Ubuntu live DVD
Xubuntu live CD
SSH, SFTPを使う
SSH (Secure SHell) は従来のTelnetやrloginに相当するリモート通信を暗号化してセキュリティを向上させたものです。
SFTP (Ssh File Transfer Protocol) はSSHを利用したFTPでファイル転送のセキュリティが向上します。
Ubuntu Server のIstall時、あるいは、taskselでOpenSSHを選択していれば、SSH / SFTP共に使用できる状態にあります。
ここではUTF-8とSSHに対応したターミナルエミュレータ Tera Term Professional と、ファイル転送には WinSCP を使用します。
鍵の作成
暗号化および復号を行う際の鍵を作成します。今回は Tera Term, WinSCP どちらにも使用できる PuTTYgen を使用します。リンク先からputtygen.exeをダウンロードして実行します。Installは不要です。
そのまま Generate ボタンをクリックします。
ステータスバーが100%になるまでマウスカーソルをグリグリ適当に動かします。すると、下のような画面に切り替わります。
パスフレーズ(接続するときに入力するパスワードになります)を入力します。 Key passphrase と Confirm passphrase の欄2ヶ所に同じものを入力します。
入力を終えたら、Save public key ボタンをクリックして、公開鍵を保存します。Save private key ボタンもクリックして、秘密鍵も保存しましょう(拡張子ppk)。
SSH の設定 (その1)
Tera Term で接続できるように設定します。
最初だけ、鍵が無くても通信ができるように、設定変更します。
$ sudo nano /etc/ssh/sshd_config
次のような固まりがあります。yesとすることでチャレンジレスポンス認証が可能となります。# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
編集し終えたら、設定を反映させましょう。
$ sudo /etc/init.d/ssh reload
一応、状況を確認してみます。
$ sudo lsof -aPi:22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 4155 root 3u IPv6 11143 TCP *:22 (LISTEN)
$
Tera Term で接続 (その1)
Tera Term Professional をダウンロードしてInstallし、実行します。
ホストにUbuntu ServerのIPアドレスを入力して、OK しましょう。
チャレンジレスポンス認証が選択されていることを確認して、OKします。
パスワードを入力するわけですが、ここでは上記鍵を作成した時のパスフレーズではなくて、Ubuntu Serverのユーザーパスワードになります。
入力したら、OKします。
SSH の設定 (その2)
チャレンジレスポンス認証ができる状態のままではセキュリティの面でマズいので、設定しなおします。
まず、上記鍵で接続ができるようにします。接続したいユーザーのホームディレクトリ配下に .ssh ディレクトリを作成します。次に、作成したディレクトリに authorized_keys ファイルを作成し、そこに上記鍵の作成で保存した公開鍵の内容をコピーします。手で入力するのは大変ですし間違え易いので Tera Term にある機能を使用しましょう。
$ mkdir .ssh
$ cat > .ssh/authorized_keys
ここで、Tera Term のメニュー「ファイル(F)」→「ファイル送信(S)...」を選択するとダイアログが出ます。
ここではたまたまid_rsa.pubというファイル名になっていますが、ここは皆さんが上記鍵の作成で保存した公開鍵 (Public Key) のファイルを選択してください。
するとファイルの内容が流し込まれます。そしたら [Ctrl+D] でcatコマンドを終了します。
一応、more .ssh/authorized_keys などと打って確認してみても良いでしょう。
ちなみに、この公開鍵はAsciiファイルで途中で改行とか入っても大丈夫なようです。
次に上記SSHの設定(その1)で編集した/etc/ssh/sshd_configファイルを再び編集します。
yesとしていたチャレンジレスポンス認証をnoに戻します。
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
その他、必要に応じて編集します。例えば、、、
DefaultのTCPポートをセキュリティ向上のために変更する。22以外の数値にします。
# What ports, IPs and protocols we listen for
Port 22
接続できる(Ubuntuの)ユーザーを制限する。以下の行を追記します。(xxxxxはユーザー名)
AllowUsers xxxxx
GUIの無効化(厳密には正しくない言い回しだと思いますが)。noにします。
X11Forwarding no
編集が終ったら、先ほどと同じ様に設定反映をしておきましょう。
$ sudo /etc/init.d/ssh reload
Tera Term で接続 (その2)
Tera Term をもう一度実行するか、既に開いている Tera Term メニューの「ファイル(F)」→「新しい接続(N)」を選択します。
ダイアログが出たら、IPアドレス・Port番号が合っているか確認してOKすると、認証画面が出ます。
鍵を使うようになっているかと思います。パスフレーズには鍵作成時に入力したパスフレーズを、RSA/DSA鍵を使うの欄には鍵作成時に保存した秘密鍵のファイルパスを入力します。
「秘密鍵(K)」ボタンをクリックするとファイル選択ダイアログが出ますのでそれで選択した方が確実かも知れませんね。
これで、接続ができたら完了です。接続するホスト(IPアドレス)やTCPポートなどはTera Term メニューの「設定(S)」→「TCP/IP」を選択して出るダイアログにて編集した後、「設定(S)」→「設定の保存(S)」で保存しておくと便利でしょう。(これをやらないとTera Termは設定を記憶してくれません。)
WinSCP で接続
WinSCP をダウンロードしてInstallし、実行します。既に鍵のセッティングは済んでいるのでもう簡単です。
「新規(N)」ボタンをクリックします。
ホスト名にはUbuntu ServerのIPアドレス(Hostsとか設定してあればホスト名でも可)を、
ポート番号には上記SSHの設定で設定したTCPポート番号を、
ユーザ名・パスワードにはUbuntu Serverのユーザ名・パスワードを、
秘密鍵には上記鍵作成時に保存した秘密鍵のファイルパスを(「...」クリックでファイル選択ダイアログが出ます。)
それぞれ入力すると「ログイン」ボタンがクリック可能になるのでクリックします。
上記鍵作成時に入力したパスフレーズを入力して、OKします。
Tera Termの接続に成功していれば、成功すると思います。上記の設定画面に戻って設定を保存すると便利でしょう。
Serial Consoleを使う
めっきり使用されることが少なくなった感があるシリアルコンソールですが、使ってみればなかなか便利、そして、まだまだ案外使えるもんです。
何がそんなに便利なの?
サーバーは通常、淡々とリクエストに答えてくれていれば良いわけで、そのようなハードにキーボードやディスプレイを繋いでおく必要はありません。SSH / SFTP で充分に事足ります。でも、非常時には?
SSH / SFTP で接続できないような事態に陥ったとき、そんな時でもシリアルコンソールなら接続できます。OSが起動してからでないと接続が出来ないSSH / SFTP に対して、OS起動中のメッセージすらシリアルコンソールなら確認することができるのです。遠隔操作というわけには行きませんが、無駄にキーボードやディスプレイを準備しなくても済む便利なものです。
実は自分、この便利さに気付いたのはつい最近なのですが。
意外に生きてるSerial Port
最近のマザーボードからすっかり消えた感のあるSerial Portですが、コンシューマー向けの機能が少ないシンプルな構成のマザーボードなどではまだまだ見かけますし、バックパネルからは消えていてもヘッダピンとして残っている場合があります。USB変換のシリアルポートを購入する前にあなたのマザーボードにシリアル(COM)ヘッダピンが無いか確認してみてください。
ヘッダピンがあれば、そこからブラケットでSerial Port端子を設置することが出来ます。
売っている店舗を探すのも大変になりつつありますが、自分はCOMON (カモン)のIDC-BBという製品を購入しました。また、ケーブルは同じくCOMON (カモン)の99FFC-18という製品を購入しました。
秋葉原の千石通商で購入したのですが、CompuAce (コンピュエース)でも売っているようです。
皆さんも探してみて下さい。
一つ、注意点があります。実はSerial Portのピン配列は2パターンあります。ケーブルもまるでLANケーブルかのようにストレートとクロスが存在します。
どちらを適用すべきかよく調査してから購入してください。例えばブラケットは上記の他にIDC-GBが、ケーブルも99FF18などがあります。
SerialConsoleの設定
/etc/event.d/ttyS0 ファイルを作成します。
$ sudo nano /etc/event.d/ttyS0
内容は下記のように。
# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.
start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
respawn
exec /sbin/getty 115200 ttyS0
GRUBの設定
/boot/grub/menu.lst ファイルを編集します。
$ sudo nano /boot/grub/menu.lst
まず、GRUBメッセージの出力をシリアルコンソールに出す設定です。
ファイル先頭に下記の内容を追加します。
# Enable console output via the serial port. unit 0 is /dev/ttyS0, unit 1 is /dev/ttyS1...
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=15 serial console
タイムアウトの15秒は好きな数値に変更して下さい。
次に起動メッセージをシリアルコンソールに出す設定です。
下記の固まりを見つけて、ro以下に「console=tty0 console=ttyS0,115200n8」を追記します。
理屈は分かりませんが、ここの行コメントの「#」は付けたままです。外すとうまくいきません。
## ## Start Default Options ##
## default kernel options
## default kernel options for automagic boot options
## If you want special options for specific kernels use kopt_x_y_z
## where x.y.z is kernel version. Minor versions can be omitted.
## e.g. kopt=root=/dev/hda1 ro
## kopt_2_6_8=root=/dev/hdc1 ro
## kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=/dev/mapper/ws2-root ro console=tty0 console=ttyS0,115200n8
編集し終えたら、設定反映します。update-grub を実行します。
$ sudo update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /vmlinuz-2.6.24-23-server
Found kernel: /memtest86+.bin
Replacing config file /var/run/grub/menu.lst with new version
Updating /boot/grub/menu.lst ... done
$
/boot/grub/menu.lst の最後部が下記のように変わります。
## ## End Default Options ##
title Ubuntu 8.04.2, kernel 2.6.24-23-server
root (hd0,0)
kernel /vmlinuz-2.6.24-23-server root=/dev/mapper/ws2-root ro console=tty0 console=ttyS0,115200n8 quiet splash
initrd /initrd.img-2.6.24-23-server
quiet
title Ubuntu 8.04.2, kernel 2.6.24-23-server (recovery mode)
root (hd0,0)
kernel /vmlinuz-2.6.24-23-server root=/dev/mapper/ws2-root ro console=tty0 console=ttyS0,115200n8 single
initrd /initrd.img-2.6.24-23-server
title Ubuntu 8.04.2, memtest86+
root (hd0,0)
kernel /memtest86+.bin
quiet
### END DEBIAN AUTOMAGIC KERNELS LIST
Tera Term の設定
Tera Term を起動し、メニュー「設定(S)」→「シリアルポート(E)」を選択します。
もし、選択できるようになっていなかったら、メニュー「ファイル(F)」→「新しい接続(N)」でシリアルを選択してOKして開いたウインドウ上でもう一度試してみて下さい。
パラメータが合っていることを確認してOKします。もし、修正していたら、設定の保存をしておくと良いでしょう。
さぁ、メニュー「ファイル(F)」→「新しい接続(N)」でシリアルを選択します。OKで接続します。
といっても、まだ、Ubuntu Server側の設定反映が済んでいないので繋がりません。
いよいよ接続確認
Ubuntu Serverを再起動してみましょう。
$ sudo shutdown -r now
設定がうまくいっていれば、再起動直後から下記のようにTera Term上にメッセージが現れます。
何かキーを押すと、通常のディスプレイに表示されるものと同じ「Press `ESC' to enter the menu...」というメッセージが表示されます。
[Esc] を押してみるとこの通り。
シリアルコンソール接続でも通常のディスプレイとキーボードを接続した状態と同じオペレーションが可能です。
起動中のメッセージも出ます。
ボーレートも115,200と高速ですのでなかなか快適です。
GlassFish v3 Prelude の導入(1) Install
アプリケーションサーバーである、GlassFish を導入してみます。今回はまだ導入されている方も少ないかもしれない GlassFish v3 Prelude をインストールします。
GlassFish v3 PreludeはGlassFishとしての機能がフルに実装されたものではありません。ですが、使用したい機能が満たされているならば動作結構が軽くなるのでオススメです。Preludeという語感が正規のリリースでないような気もさせますが、正規のRelease版です。
さて、Ubuntuならaptということで、パッケージを探してみます。
$ sudo aptitude search glassfish
p glassfish-activation - Open source Java EE 5 Application Server
p glassfish-appserv - Open source Java EE 5 Application Server
p glassfish-javaee - Open source Java EE 5 Application Server
p glassfish-jmac-api - Open source Java EE 5 Application Server
p glassfish-mail - Open source Java EE 5 Application Server
p glassfish-toplink-essentials - Open source Java EE 5 Application Server
p glassfishv2 - Sun's open source GlassFish(TM) v2 Update 1 Application Server
p glassfishv2-bin - Sun's open source GlassFish(TM) v2 Update 1 Application Server
p glassfishv2-doc - GlassFish(TM) v2 Update 1 Documentation
$
おや、まだ入っていないですね。今回は独自にインストールします。GUI環境も無いので「プラットフォームに依存しないダウンロードファイル」を選択してダウンロードします。
$ wget http://download.java.net/glassfish/v3-prelude/release/glassfish-v3-prelude-ml.zip
--14:47:40-- http://download.java.net/glassfish/v3-prelude/release/glassfish-v3-prelude-ml.zip
=> `glassfish-v3-prelude-ml.zip'
Resolving download.java.net... 72.5.124.114
Connecting to download.java.net|72.5.124.114|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 33,366,749 (32M) [application/zip]
100%[============================================================================>] 33,366,749 1.66M/s ETA 00:00
14:48:02 (1.41 MB/s) - `glassfish-v3-prelude-ml.zip' saved [33366749/33366749]
$
解凍しましょう。ってUnZipも入っていませんでした。UnZipをインストールします。
$ sudo apt-get install unzip
[sudo] password for ty:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
提案パッケージ:
zip
以下のパッケージが新たにインストールされます:
unzip
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 36 個。
154kB のアーカイブを取得する必要があります。
この操作後に追加で 348kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com hardy/main unzip 5.52-10ubuntu2 [154kB]
154kB を 0s で取得しました (566kB/s)
未選択パッケージ unzip を選択しています。
(データベースを読み込んでいます ... 現在 21330 個のファイルとディレクトリがインストールされています。)
(.../unzip_5.52-10ubuntu2_i386.deb から) unzip を展開しています...
unzip (5.52-10ubuntu2) を設定しています ...
$
気を取り直してUnZipします。
$ unzip glassfish-v3-prelude-ml.zip
Archive: glassfish-v3-prelude-ml.zip
creating: glassfishv3-prelude/
:
inflating: glassfishv3-prelude/javadb/LICENSE
$
この状態でもコマンドを打てば起動します。
$ glassfishv3-prelude/bin/asadmin start-domain
開始されたドメインの名前: [domain1] と
その位置: [/home/xxxxx/glassfishv3-prelude/glassfish/domains/domain1]
ドメインの管理ポート: [4848]。
$
終るときはブラウザからInstallしたサーバーのポート4848に接続して管理コンソールを開いて、「アプリケーションサーバ」を選択して「インスタンスの停止」ボタンをクリックするか、
$ glassfishv3-prelude/bin/asadmin stop-domain
で停止できます。
GlassFish v3 Prelude の導入(2) Service化
独自にインストールしたGlassFishはOSの起動・終了に連携してくれませんので自分で連携するように設定する必要があります。
(いや、無いですけど、OSと別に起動・終了を行うのも大変だし、忘れますよね。)
というわけで、サービス化と呼んで良いのか分かりませんが、GlassFishの起動・終了をOSの起動・終了に連携させてみます。
まずは、スクリプトを作成します。/etc/init.d/glassfishとでもしましょうか。あまり詳しくないのでこれが全く正しくてふさわしいのか分かりませんが、とりあえず自分が作成したのはこんな感じ。GlassFishの実行ディレクトリは皆さんの環境に合わせて修正して下さいね。
#!/bin/sh
### BEGIN INIT INFO
# Provides: glassfish
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: StartUP and Shutdown for GlassFish v3 Prelude.
# Description: Written by Doitaroh
### END INIT INFO
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting application server" "glassfishv3prelude"
/xxxxx/glassfishv3-prelude/bin/asadmin start-domain
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported. Use stop and wait and start." >&2
exit 3
;;
stop)
/xxxxx/glassfishv3-prelude/bin/asadmin stop-domain
log_daemon_msg "Stopping application server" "glassfishv3prelude"
;;
*)
;;
esac
Restart, Reloadには対応していませんので対応させたい方は自力で頑張って下さい。流れとしてはasadmin stop-domainで停止コマンドを発行した後、asadmin list-domainsで動いているdomainが無くなったことを確認してからasadmin start-domainで起動という流れです。
ちなみにWindowsで作成してアップロードする場合は改行コードにCRが付かないように気を付けましょう。
ファイル作成後は権限をルートのものにしておくことと、実行権限を与えておきましょう。
$ sudo chown root glassfish
$ sudo chgrp root glassfish
$ sudo chmod 755 glassfish
$ sudo mv glassfish /etc/init.d/
update-rc.dというコマンドで自動起動/終了の登録ができます。今回は既にインストールされているApacheよりも後に起動し、Apacheよりも先に終了させようと思います。Apacheのシーケンスコードが起動=91、終了=09となっていましたので、GlassFishはそれぞれ92, 08としてみました。
$ sudo update-rc.d glassfish defaults 92 08
Adding system startup for /etc/init.d/glassfish ...
/etc/rc0.d/K08glassfish -> ../init.d/glassfish
/etc/rc1.d/K08glassfish -> ../init.d/glassfish
/etc/rc6.d/K08glassfish -> ../init.d/glassfish
/etc/rc2.d/S92glassfish -> ../init.d/glassfish
/etc/rc3.d/S92glassfish -> ../init.d/glassfish
/etc/rc4.d/S92glassfish -> ../init.d/glassfish
/etc/rc5.d/S92glassfish -> ../init.d/glassfish
$
さぁ、起動・終了の確認をしてみましょう。
GlassFish v3 Prelude の導入(3) Apache連携
通常のWebリクエストはApacheで受けて特定のURIはGlassFishに流して結果を返すという、いわゆるApacheとGlassFishの連携を設定します。ここでのやり方はかなりシンプルです。
どこかのサイトでGlassFish v2のApache連携はTomcat5.5をベースにほにゃららという記述があって、ならばGlassFish v3はTomcat6だと勝手に思い込んで作業したのですが正解だった模様です。Tomcatのファイルなど必要ありません!
Apache モジュールの有効化
連携に必要となるモジュールproxy_ajpを有効化します。
$ sudo a2enmod proxy_ajp
Enabling proxy as a dependency
Module proxy installed; run /etc/init.d/apache2 force-reload to enable.
Module proxy_ajp installed; run /etc/init.d/apache2 force-reload to enable.
$
Apache の設定
/etc/apache2/mods-enabled/proxy.conf という設定ファイルができていると思います。デフォルトでは全拒否状態ですので使用状況に応じて修正します。今回はいわゆるReverseProxyという形になります。<proxy>タグの中にDeny from allとなっているところをAllow from allに書き換えます。
ちなみに冒頭にコメントされているのですが、ProxyRequestsはフォワードプロキシ用の設定であり、今回はリバースプロキシとして設定するため絶対にOnにしてはいけません。スパマーの踏み台されます。
<IfModule mod_proxy.c>
#turning ProxyRequests on and allowing proxying from all may allow
#spammers to use your proxy to send email.
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
#Allow from .example.com
</Proxy>
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
ProxyVia On
</IfModule>
次に、/etc/apache2/mods-enabled/proxy_ajp.conf ファイルを作成します。この中にGlassFishに渡したいURIパターンと渡す先を記述します。
例えば、このサイトでは/pcと/music配下はGlassFishにデプロイしたServlet + JSPで動いていますのでこんな感じになっています。
<IfModule mod_proxy_ajp.c>
<Location /pc/>
ProxyPass ajp://localhost:8009/pc/
</Location>
<Location /music/>
ProxyPass ajp://localhost:8009/music/
</Location>
</IfModule>
ちなみに、既にApacheまでリクエストが到達してからの話ですので、連携先のGlassFishが同じマシン内にあるのであればProxyPassはlocalhostで良いのです。
設定ができたら反映しておきましょう。
$ sudo /etc/init.d/apache2 force-reload
* Reloading web server config apache2 [ OK ]
$
GlassFish の設定
次にGlassFishの設定ですが、上で設定した8009ポートでajpプロトコルを受け渡しするよという設定をするだけです。
管理コンソールからなら、アプリケーションサーバー を選択して、JVM設定 → JVMオプションで
-Dcom.sun.enterprise.web.connector.enableJK=8009
を追加して再起動するだけです。
コマンドでやるなら、
$ glassfishv3-prelude/bin/asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009
created 1 option(s)
コマンド create-jvm-options は正常に実行されました。
$
これでOK。簡単になったものです。(^^)
!この文字が見える場合、コピペされています(ブラウザ非対応でも見えます)! from Gradual Improvement (dodoit.info)