Yearly Archives: 2015

mapmywalk を使ったウォーキングが楽しい

最近、体がぶくぶくと太ってきたので何とかしなければと思ってました。以前はジムにも通っていたのですが、しだいに漫然とやるようになり、効果も薄れてきたのでやめました。そこで始めたのが「パワーウォーキング」です。金曜日の夕方に会社から自宅に帰るときに、電車に乗らないで歩いて帰ります。実は「パワーウォーキング」の正確な定義は知らないのですが、自分のは「ロングウォーキング」といったほうが正しいかもしれません。

mapmywalk というスマートフォンのアプリを使うと、地図、距離、経過時間、カロリーなどを表示してくれて、とても便利です。使い方も簡単で、使う前に名前、メールアドレス、生年月日、体重、身長などを入力してアカウント登録しておきます。基本機能を使うだけなら無料です。

ウォーキングを開始するときは mapmywalk アプリを起動して「Start Workout (ワークアウトを開始)」ボタンを押します。ウォーキングを終了するときは「Pause Workout (ワークアウトを一時停止)」ボタンを押します。すると「Slide to Finish (スライドして終了)」ボタンと「Resume Workout (ワークアウトを再開)」ボタンが表示されるので、「Slide to Finish (スライドして終了)」ボタンをスライドした後、「Save Workout (ワークアウトを保存)」ボタンをクリックすると、その記録が mapmywalk のサイトに登録され、その内容をブラウザなどで表示することができます。

iPhone 版の mapmywalk アプリの場合、アプリ起動時の初期画面に戻るには、画面下のプラス(+)アイコンを押して、「Track Workout (ワークアウトのトラッキング)」を選択します。メニュー画面が新しくなったせいか、このあたりが分かりにくいです。

以下は、豊洲の東京湾岸のオフィスから埼玉県和光市の自宅まで歩いて帰った例です。池袋から和光市までは国道254号線沿いに歩くコースです。27.8kmを5時間45分で歩き、1600キロカロリーの消費でした。

http://www.mapmywalk.com/workout/1268889509
http://www.mapmywalk.com/workout/1268889509

目白通りをメインに練馬を経由して帰る経路もあります。最近はもっぱらこちらのコースを愛用しています。

http://www.mapmywalk.com/workout/1654708631

mapmywalk を長時間使うときに注意が必要なのは、使っている間は電池の消耗が早くなるので、使う前によく充電しておくことです。自分の例では、開始前に100%充電しておいたのが、約6時間歩き終わったあとは、電池残量が20%程度になっていました。

以下は、パワーウォーキングを始めるにあたっての注意事項です。

• なるべく帰りの電車の路線の近くを沿って歩きます。いざというときに電車を利用するためです。
• 地下鉄駅や公園などの公衆トイレの場所を把握しておきます。トイレは地下鉄駅の改札内であっても駅員に声をかければ快く貸してもらえます。パチンコ店、ゲームセンターにはかならずトイレがあります。コンビニのトイレも店員さんに声を掛ければ貸してもらえます。地図マピオンやスマホアプリを使って検索できます。参考: http://review.itmedia.co.jp/review/articles/1409/04/news041.html
• 長時間歩きやすいスニーカーと靴下を用意してください。
• 同じ距離を移動するのに、徒歩の場合、電車の5〜6倍程度の時間がかかります。例えば電車で1時間の距離なら、徒歩で5〜6時間かかります。
• 最初はヒザが痛くならない距離にしてください。ヒザが少しでも痛くなったら、我慢しないで直ぐに中断します。ヒザをいったん壊すと治るのに時間がかかります。何度か短距離のウォーキングを繰り返しているうちに長距離も歩けるようになります。
• 1時間に1回程度、5〜10分の休憩を入れて脚を休めてください。
• 足の裏のマメができやすい個所にはバンドエイドなどを貼っておくと予防できます。

最後に、皇居の内堀を歩きながらから撮った丸の内のオフィス街の写真です。ニューヨークの摩天楼のように見えてびっくりです。
tokyo-marunouchi-night-20151204-88

それではウォーキングを楽しんでください!

レインボーブリッジを歩いて渡る

仕事でお台場に行きましたが、早く終わったので帰りはレインボーブリッジの遊歩道「レインボープロムナード」を歩いて帰りました。

tokyo-raibow-bridge-waik-20150723-174837
「ゆりかもめ・お台場海浜公園駅」からお台場海浜公園沿いを歩いてレインボーブリッジの方向を目指して歩きます。遊歩道入り口は簡単に分かります。

tokyo-raibow-bridge-waik-20150723-175333
レインボーブリッジの遊歩道入り口を入ると、すぐに北ルート(North Route)か南ルート(South Route)の分岐点に来ます。今回は北ルートを選択しました。

tokyo-raibow-bridge-waik-20150723-175433
北ルート(North Route)を進むとすぐに、豊洲新市場の建設風景が見えます。晴海埠頭に大きな船が停泊しているのも見えます。船の胴体には大きく「NYK」と書かれており、日本郵船の自動車輸送船のようです。

tokyo-raibow-bridge-waik-20150723-175543
進行方向は、上り坂のスロープになっています。壮大な光景が広がります。高所恐怖症の方はお気をつけください。足元を見るとちょっと怖いです。

tokyo-raibow-bridge-waik-20150723-175544
都会のオフィスの中でばかり働いているとあまりこういう景色を見る機会が無いので見とれてしまいました。

tokyo-raibow-bridge-waik-20150723-175943
最初のアンカーブロックが見えてきました。

tokyo-raibow-bridge-waik-20150723-180345
海を見渡すと、高速ジェット船(Boeing 929 Jetfoil)が水しぶきを上げて通過しているのが見えます。東海汽船の「セブンアイランド愛」でしょうか。
http://www.tokaikisen.co.jp/shipinfo/jetship/

tokyo-raibow-bridge-waik-20150723-180619
最初のアンカーブロックを過ぎて主橋の部分を見ているところです。対岸が思ったより近くに感じます。

tokyo-raibow-bridge-waik-20150723-180938
橋の上からは、真下を通り過ぎる遊覧船をたくさん見ることができます。この遊覧船は「ヴァンテアン(vingt et un)」と書いているのが見えます。
http://www.vantean.co.jp/

tokyo-raibow-bridge-waik-20150723-181127
別の遊覧船が見えます。これは「シンフォニー モデルナ(Symphony Moderna)」でしょうか。
http://www.symphony-cruise.co.jp/

tokyo-raibow-bridge-waik-20150723-181224
汐留・勝ちどき・晴海の景色が広がります。夕日の反射がきれいです。

tokyo-raibow-bridge-waik-20150723-181243
もう一台の高速ジェット船が通過している見えます。

tokyo-raibow-bridge-waik-20150723-181627
向かいの岸まであと少しです。途中、写真を取りながらでも、30分ぐらい歩けば対岸に到達します。すぐ先のガラス張りの支柱のところに地上への出口に通じるエレベーターがあるので、それで降ります。

tokyo-raibow-bridge-waik-20150723-181652
最後に180度のパノラマ写真をどうぞ。写真の右が出発地点のお台場、左が芝浦ふ頭です。レインボーブリッジを渡った後は、まっすぐJR田町まで歩いて帰りました。

Fedora 22 を Kernel 4.2.3-200 にアップデートすると VMware Workstation 11 が起動できない

Fedora 22 のカーネルを 4.2.3-200 にアップデートすると、VMware Workstation 11 が起動しなくなります。これに対処するには、VMware にパッチをあてるか、Kernel をダウングレードするかの2つの方法があります。

VMware にパッチをあてる方法

https://communities.vmware.com/thread/516196
に書かれている内容を参考にパッチ作業をしたところ、うまく起動するようになりました。以下にその手順を紹介します。

(1) VMware モジュールのソースディレクトリに移動

# cd /usr/lib/vmware/modules/source

(2) vmnet.tar のバックアップの取得

# cp -npv vmnet.tar{,-ORG}
# ls -1 vmnet.tar*
vmnet.tar
vmnet.tar-ORG

(3) vmnet.tar の展開。
これにより「vmnet-only」ディレクトリが作成されます。

# tar -xf vmnet.tar

(4) vmnet-only/vmnetInt.h のバックアップの取得

# cp -npv vmnet-only/vmnetInt.h{,-ORG}
# ls -1 vmnet-only/vmnetInt.h*
vmnet-only/vmnetInt.h
vmnet-only/vmnetInt.h-ORG

(5) vmnet-only/vmnetInt.h の修正
vi エディタなどを使用して vmnet-only/vmnetInt.h を修正します。

# vi vmnet-only/vmnetInt.h

変更内容は 82 行目に示すように関数 sk_alloc の引数の最後に「,1」を追加しただけです。

変更前:

#ifdef VMW_NETDEV_HAS_NET
#   define compat_sk_alloc(_bri, _pri) sk_alloc(&init_net, \
                                                PF_NETLINK, _pri, &vmnet_proto)
#else
#   define compat_sk_alloc(_bri, _pri) sk_alloc(PF_NETLINK, _pri, &vmnet_proto, 1)
#endif

変更後:

#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
#   define compat_sk_alloc(_bri, _pri) sk_alloc(&init_net, \
                                                PF_NETLINK, _pri, &vmnet_proto, 1)
#else
#   define compat_sk_alloc(_bri, _pri) sk_alloc(PF_NETLINK, _pri, &vmnet_proto, 1)
#endif

変更できたことを確認します。

# diff vmnet-only/vmnetInt.h{-ORG,}
82c82
<                                                 PF_NETLINK, _pri, &vmnet_proto)
---
>                                                 PF_NETLINK, _pri, &vmnet_proto, 1)

(6) vmnet-only ディレクトリを tar で固め直す

# tar -cf vmnet.tar vmnet-only
# rm -rf vmnet-only

(7) VMware のモジュールのコンパイルとインストール

# vmware-modconfig --console --install-all

(8) VMware の動作確認
もし、動作しなかった場合は、以下の手順で元の状態にもどせます。

# mv vmnet.tar-ORG vmnet.tar

その場合、カーネルをダウングレードする方法を試してください。

Kernel をダウングレードする方法

(1) インストールされているカーネルを確認
この例では、Installed Packages の部分より3つの版のカーネルがインストールされていることがわかります。

# dnf list --showduplicates kernel
Installed Packages
kernel.x86_64              4.1.8-200.fc22             @updates
kernel.x86_64              4.1.10-200.fc22            @updates
kernel.x86_64              4.2.3-200.fc22             @updates
Available Packages
kernel.x86_64              4.0.4-301.fc22             fedora
kernel.x86_64              4.1.8-200.fc22             @updates
kernel.x86_64              4.1.10-200.fc22            @updates
kernel.x86_64              4.2.3-200.fc22             @updates
kernel.x86_64              4.2.3-200.fc22             updates

(2) GRUB メニューにエントリーされているカーネルを確認

# grep "submenu\|^\menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
Fedora (4.2.3-200.fc22.x86_64) 22 (Twenty Two) ◀ 現在のカーネル
Fedora (4.2.3-200.fc22.x86_64+debug) 22 (Twenty Two)
Fedora (4.1.10-200.fc22.x86_64+debug) 22 (Twenty Two)
Fedora (4.1.10-200.fc22.x86_64) 22 (Twenty Two) ◀ このカーネルで起動したい
Fedora (4.1.8-200.fc22.x86_64+debug) 22 (Twenty Two)
Fedora (4.1.8-200.fc22.x86_64) 22 (Twenty Two)
Fedora (0-rescue-b23d8567a69543dd97597198bda98d95) 22 (Twenty Two)

(3) 現在の GRUB 設定ファイルの内容を確認

# cat /etc/default/grub
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora_f22ud1/swap rd.lvm.lv=fedora_f22ud1/root"
GRUB_DISABLE_RECOVERY="true"

(4) GRUB 設定ファイルを変更
GRUB 設定ファイルのバックアップを取得します。

# cp -npv /etc/default/grub{,-ORG}

/etc/default/grub ファイルを開き、GRUB_DEFAULT の行を変更します。デフォルトでは「saved」に設定されていますが、これに起動させたいカーネルのタイトルを指定します。4.2.3-200 よりも前のカーネル、たとえば、4.1.10-200 や 4.1.8-200 のメニュータイトルを指定してください。

変更前:
GRUB_DEFAULT=saved
→
変更後:
GRUB_DEFAULT='Fedora (4.1.10-200.fc22.x86_64) 22 (Twenty Two)'

sed で変更するにはつぎのようにコマンドを入力します。

# sed -i -e "s/GRUB_DEFAULT=.*/GRUB_DEFAULT='Fedora (4.1.10-200.fc22.x86_64) 22 (Twenty Two)'/g" /etc/default/grub

変更内容を確認する。

# diff /etc/default/grub{-ORG,}

GRUB に反映させます。

# grub2-mkconfig -o /boot/grub2/grub.cfg

(5) 再起動した後、カーネルのバージョンを確認
再起動します。

# reboot

再起動後のカーネルのバージョンを確認します。

# uname -r
4.1.10-200.fc22.x86_64

ジャーナルログからもカーネルのバージョンを確認します。

# journalctl -b | grep -i 'Linux version'
Oct 24 11:02:17 localhost.localdomain kernel: Linux version 4.1.10-200.fc22.x86_64 (mockbuild@bkernel01.phx2.fedoraproject.org) (gcc version 5.1.1 20150618 (Red Hat 5.1.1-4) (GCC) ) #1 SMP Mon Oct 5 14:22:49 UTC 2015

(6) VMware の動作確認
VMware を起動して、仮想マシンが正常起動できることを確認します。

(7) kernel の自動更新の禁止
kernel が自動更新されないよう設定しておきます。

# cat <<"EOF">> /etc/dnf/dnf.conf
exclude=kernel*
EOF

# cat /etc/dnf/dnf.conf

(2015.11.23 追記)
Fedora 23 に VMware Workstation 12 Pro をインストールした場合にも、VMware Workstation を正常に起動できない問題が発生するようです。これについては、以下のサイトに回避策が紹介されています。
http://vcojot.blogspot.jp/2015/11/vmware-worksation-12-on-fedora-core-23.html

いろいろと書いてありますが、VMware Workstation 12 Pro をインストール後に以下の操作を実行することで正常に起動できるようになります。

# wget https://raw.githubusercontent.com/ElCoyote27/krynn-tools/master/Update_VMW.sh
# sh ./Update_VMW.sh

岡山・東京間を飛行機を利用してみた

岡山・東京の区間はほとんどの人が新幹線を使うと思いますが、今回は初めて飛行機を使ってみました。シーズンにもよりますが、航空運賃は早めに予約するほど割引になります。搭乗日の4日ほど前に予約を入れ、片道16790円でした。空港までのリムジンバスの料金を除けば、新幹線とあまり変わらない金額です。

岡山空港発、羽田行きの便の時刻表です。思っていたよりたくさんの便があります。
http://www.okayama-airport.org/timetable/tokyo/

岡山空港へアクセスするリムジンバスの時刻表です。(岡山駅方面と倉敷駅方面)
http://www.okayama-airport.org/access/bus

岡山空港の第2〜第4駐車場は何日間駐車しても無料とのことです。岡山から東京に出張する人は便利かも。
http://www.okayama-airport.org/facility/parking.html

今回利用したのは岡山空港11:55発、羽田13:15着の ANA656 便です。予約を入れたときは機種が A320 になっていましたが、Boeing 777-200 に変更されたようです。座席は「9K」(前から9番目の右側の窓際)でした。窓から写真を撮るにはとても良い席でした。
http://www.ana.co.jp/domestic/departure/inflight/seatmap/detail.html?c=772

(1) ANA656 11:30 Map
ANA656-B772-20150913-113018
岡山空港の搭乗ラウンジから撮影。これから乗る飛行機です。翼や機体後尾には、その飛行機の機体番号が書かれており、また前輪格納扉にその一部の数字が書かれているそうです。写真をよく見ると、前輪格納扉に「741」の数字が見えます。このことから機体番号「JA741A」の「Boeing 777-281ER」と思われます。
http://www.airfleets.net/ficheapp/plane-b777-40900.htm
https://www.planespotters.net/airframe/Boeing/777/40900/
https://planefinder.net/data/aircraft/JA741A

(2) ANA656 12:05 Map
ANA656-B772-20150913-120505
離陸してすぐに児島湖児島湾児島半島が一望できました。金甲山も見えるはずですが曇っていてよくわかりません。岡山で生まれ育った自分はこの景色にいちばん感動しました。金甲山からは大阪の「あべのハルカス」が見えるそうです。
http://blogs.yahoo.co.jp/jitennsyaotoko_diet/62456900.html

(3) ANA656 12:08 Map
ANA656-B772-20150913-120800
日生(ひなせ)、ブルーライン、小豆島(しょうどしま)が見えます。

(4) ANA656 12:11 Map
ANA656-B772-20150913-121157
加古川の上空です。

(5) ANA656 12:13 Map
ANA656-B772-20150913-121309
淡路島、明石大橋が見えます。

(6) ANA656 12:14 Map
ANA656-B772-20150913-121356
大阪湾、神戸、六甲山、関空(関西国際空港)が見えます。

(7) ANA656 12:15 Map
ANA656-B772-20150913-121534
伊丹空港(大阪国際空港)の上空を通過。ピンボケですみません。

(8) ANA656 12:33 Map
ANA656-B772-20150913-123312
御前崎の上空です。一面、雲だらけ。

(9) ANA656 12:59 Map
ANA656-B772-20150913-125954
千葉市上空を通過。

(10) ANA656 13:03 Map
ANA656-B772-20150913-130336
東京ディズニーランドです。前日の豪雨のせいで東京湾が茶色に濁ってます。

(11) ANA656 13:04 Map
ANA656-B772-20150913-130441
東京ゲートブリッジが見えます。

(12) ANA656 13:05 Map
ANA656-B772-20150913-130509
お台場が見えます。

(13) ANA656 13:06 Map
ANA656-B772-20150913-130605
城南島海浜公園です。飛行機の離着陸の写真を撮るにはよい場所かも。

(14) ANA656 13:07 Map
ANA656-B772-20150913-130655
羽田空港B滑走路に着陸してジェットエンジンの逆噴射をしているところです。

(15) ANA656 13:12
ANA656-B772-20150913-131253
羽田空港のゲートに到着です。

FlightAware のサイトの「航空便追跡ログ」を利用すると、飛行ルートの緯度・経度とその日時がわかります。今回の ANA656 便の飛行ログとステータスはそれぞれ以下に公開されています。

https://ja.flightaware.com/live/flight/ANA656/history/20150913/0255Z/RJOB/RJTT/tracklog
https://ja.flightaware.com/live/flight/ANA656/history/20150913/0255ZZ/RJOB/RJTT

ステータスのページの「+ Google EARTH」ボタンをクリックすると、飛行ログの KML ファイルをエクスポートすることができます。この KML ファイルを使って Google Earth や Google My Maps に飛行ルートを描画をするこもできます。以下は着陸時のルートを Google My Maps で表示したものですが、羽田空港のB滑走路へ進入していく様子がよくわかります。

ana656-20150913-google-map-kml-01
ana656-20150913-google-map-kml-02

この FlightAware のデータは ADS-B 受信機を利用して、全国から集められているそうです。

飛行機の機内から写真を撮影したとき、その写真にGPS情報が記録されてなくても、撮影日時が分かれば航空便追跡ログと付き合わせておおよその緯度・経度がわかります。緯度・経度が分かれば Google Map、OpenStreetMap、地理院地図を使ってその場所の地図を表示できます。例えば、上の(8)「一面雲だらけ」の写真の場合、12:33:12 に撮影した写真ですので、航空便追跡ログの 12:33:10 の「緯度:34.7159、経度:138.0337」に近いことがわかります。これより、「https://www.google.com/maps/@<緯度>,<経度>,<ズームレベル>z」 の形式の URL、すなわち「https://www.google.com/maps/@34.7159,138.0337,11z」をブラウザに入力すると、その場所の Google Map が表示されます。OpenStreetMap の場合は、「http://www.openstreetmap.org/#map=<ズームレベル>/<緯度>/<経度>」の形式の URL、すなわち「http://www.openstreetmap.org/#map=11/34.7159/138.0337」をブラウザに入力します。地理院地図の場合は、「http://maps.gsi.go.jp/#<ズームレベル>/<緯度>/<経度>/」の形式の URL、すなわち「http://maps.gsi.go.jp/#11/34.7159/138.0337/」をブラウザに入力します。この結果、雲だらけの写真でも御前崎の上空であることが分かります。

余談ですが、日本列島はおおよそ緯度は35±11度、経度は135±12度の範囲に収まっているそうです。つまり、位置的には北緯35度、東経135度が日本の中心と考えることができます。この場所を表示するには、次のURLをブラウザに入力すると表示できます。
https://www.google.com/maps/@35,135,15z または
http://www.openstreetmap.org/#map=15/35/135 または
http://maps.gsi.go.jp/#15/35/135/
さらに日本の北端は、次のURLをブラウザに入力すると表示できます。
https://www.google.com/maps/@46,147,7z または
http://www.openstreetmap.org/#map=7/46/147 または
http://maps.gsi.go.jp/#7/46/147/
また南端は、次のURLをブラウザに入力すると表示できます。
https://www.google.com/maps/@24,123,7z または
http://www.openstreetmap.org/#map=7/24/123 または
http://maps.gsi.go.jp/#7/24/123/

初めての経験でしたがいろいろと勉強になりました。

virt-install による仮想マシンの自動インストール

KVM を利用するとスクリプトを使って仮想マシンを全自動でインストールすることができます。KVM のインストール手順は前回に説明しました。今回は virt-install、guestfish というコマンドを利用して CentOS 7.1 の仮想マシンを全自動でインストールしてみます。Fedora 22 で動作確認をしました。

guestfish のインストール

guestfish は KVM ホストに事前にインストールしておく必要があります。Fedora 22 ではつぎのコマンドで guestfish をインストールできます。

# dnf install '*guestf*' -y

virt-install コマンド

virt-install コマンドを使用して、仮想マシンのインストールをコマンドラインから実行することができます。kickstart ファイルを組み合わせることで、手作業による操作が不要になり、全自動で仮想マシンのインストールが可能になります。

virt-install コマンドの使い方に関しては、つぎに示すオプションが重要なポイントです。

(1)「--initrd-inject=<file>」
インストーラが仮想マシンを起動する前に、指定したローカルのファイルをインストーラの initrd.img の中に埋め込みます。今回の例では kickstart ファイルを指定しています。ここで「ローカル」とは KVM ホスト上のファイルのことを意味します。

(2)「--extra-args=”ks=file:/<kickstart file>”」
仮想マシンの起動時に、initrd 内の kickstart ファイルを使用して Anaconda による自動インストールを開始させます。

(3)「--noautoconsole」
仮想マシンのインストール時にコンソールを表示しないオプションです。OSのインストールが完了した後に、仮想マシンをシャットダウンするには、このオプションが必要です。

guestfish コマンド

guestfish を使用すると、仮想マシンを起動することなく仮想マシン内のファイル編集やコマンド実行が可能になります。guestfish を使用して仮想マシン上の任意のコマンドを実行するには、「command」コマンドを使用します。ただし、筆者が確認したところ、「firewall-cmd」など一部のコマンドがうまく実行できませんでした。このため、Firewall の設定は firewalld の設定ファイルを直接書き換えています。

今回の例は、guestfish を使用しなくても、kickstart の「%post」セクションを使用して実現できます。しかし、guestfish には copy-in、copy-out、upload、download といったコマンドが用意されており、これを使ってローカルとゲスト間のファイル転送が簡単に実現できます。これと同じことを kickstart で実現するのは面倒です。

仮想マシンの自動インストールスクリプト

以下に示すスクリプトは CentOS 7.1 の仮想マシンを指定した IP アドレスでインストールし、Web サーバーを起動して、Firewall の設定をする例です。シェルの実行が完了した後は、ブラウザで http://192.168.122.111 にアクセスして Apache のテスト画面を見ることができます。また仮想マシンのコンソールにアクセスするには、root ユーザーから「virsh console centos7-web」コマンドを実行します。CTRL + ] をタイプすると仮想マシンのコンソールから抜け出ることができます。

スクリプトを実行する前に、事前に CentOS 7.1 のインストールメディア「CentOS-7-x86_64-DVD-1503-01.iso」を「/var/lib/libvirt/images」ディレクトリ以下にコピーしておいてください。

以下のサンプルはここからダウンロードできます。

#!/bin/sh

echo "*** installation job starting ***"

# ----------------------------------------------------------
# Parameters
# ----------------------------------------------------------

# Guest Name (Domain Name)
DOM=centos7-web
# Guest Image File
IMG=/var/lib/libvirt/images/${DOM}.qcow2
# Guest Memory Size (MB)
RAM=1024
# Guest Image File Size (GB)
SIZE=10
# Install Media (ISO)
DVD=/var/lib/libvirt/images/CentOS-7-x86_64-DVD-1503-01.iso
# Kickstart file
KSF=${DOM}-ks.cfg

# root password
PASSWORD=password
# Hostname
HOSTNAME=centos7-web.example.com
# IP Address
IP=192.168.122.111
# Netmask
NETMASK=255.255.255.0
# Gateway
GATEWAY=192.168.122.1
# DNS server
NAMESERVER=8.8.8.8,8.8.4.4
# NTP server
NTPSERVERS=0.centos.pool.ntp.org,1.centos.pool.ntp.org,2.centos.pool.ntp.org,3.centos.pool.ntp.org

# ----------------------------------------------------------
# Initial Check
# ----------------------------------------------------------

# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

# ----------------------------------------------------------
# remove & clear old vm if existing
# ----------------------------------------------------------

# stop domain forcefully
virsh destroy ${DOM} >/dev/null 2>&1
# undefine domain
virsh undefine ${DOM} --remove-all-storage >/dev/null 2>&1
# remove domain image file
rm -f ${IMG} >/dev/null 2>&1

# ----------------------------------------------------------
# create kickstart file
# ----------------------------------------------------------

echo "*** kickstart file creating ***"

cat << _EOF_ > ${KSF}
# Install OS instead of upgrade
install
# shutdown after installation
shutdown
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# graphical or text install
text
# Run the Setup Agent on first boot
firstboot --disable
# use /dev/vda for install destination
ignoredisk --only-use=vda
# SELinux configuration
selinux --enforcing
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network \
--device=eth0 \
--bootproto=static \
--ip=${IP} \
--netmask=${NETMASK} \
--gateway=${GATEWAY} \
--nameserver=${NAMESERVER} \
--noipv6 \
--activate
network --hostname=${HOSTNAME}
# Firewall configuration
firewall --enabled --ssh --http
# Root password
rootpw --plaintext ${PASSWORD}
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=${NTPSERVERS}
# System bootloader configuration
bootloader --location=mbr --boot-drive=vda --append=" crashkernel=auto" 
# Partition clearing information
clearpart --none --initlabel 
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=vda --size=500
part pv.20 --fstype="lvmpv" --ondisk=vda --size=8192 --grow
volgroup centos --pesize=4096 pv.20
logvol swap --fstype="swap" --size=921 --name=swap --vgname=centos
logvol / --fstype="xfs" --grow --maxsize=51200 --size=1024 --name=root --vgname=centos

%packages
@core
@base
@web-server
kexec-tools

bind-utils
binutils
chrony
lsof
ltrace
man-pages
net-tools
pciutils
psmisc
sos
strace
sysstat
tcpdump
telnet
usbutils
wget

%end
_EOF_

echo "*** kickstart file created ***"

# ----------------------------------------------------------
# guest install using virt-install command
# ----------------------------------------------------------

echo "*** virt-install starting ***"

virt-install \
--name=${DOM} \
--ram=${RAM} \
--vcpus=1 \
--os-type=linux \
--os-variant=rhel7.0 \
--file=${IMG} \
--file-size=${SIZE} \
--location=${DVD} \
--network=bridge:virbr0 \
--nographics \
--initrd-inject=${KSF} \
--extra-args="ks=file:/${KSF} console=tty0 console=ttyS0,115200n8" \
--noautoconsole

# wait until guest installation is completed
finished="0";
while [ "${finished}" = "0" ]; do
  sleep 5
  domstate=`virsh domstate ${DOM}`
  if [ "${domstate}" = "shut off" ]; then
    finished=1;
  fi
done
sleep 5

echo "*** virt-install finished ***"

# ----------------------------------------------------------
# customize guest using guestfish
# ----------------------------------------------------------

echo "*** guestfish starting ***"

# swapiness settings
F1=/etc/sysctl.d/swappiness.conf
# ipv6 settings
F2=/etc/sysctl.d/disable_ipv6.conf
# firewall settings file (original)
F3=/etc/firewalld/zones/public.xml
# firewall settings (new) ... ssh, http, https enabled
F3_NEW=$(mktemp)
cat << _EOF_ > ${F3_NEW}
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="http"/>
  <service name="https"/>
</zone>
_EOF_

# run guestfish
guestfish -d ${DOM} -i << _EOF_
  # change grub timeout setting
  command "sed -i -e 's/GRUB_TIMEOUT=5/GRUB_TIMEOUT=0/g' /etc/default/grub"
  command "grub2-mkconfig -o /boot/grub2/grub.cfg"

  # suppress swapping
  write        ${F1} "vm.swappiness = 0\n"

  # disable ipv6
  write        ${F2} "net.ipv6.conf.all.disable_ipv6 = 1\n"
  write-append ${F2} "net.ipv6.conf.default.disable_ipv6 = 1\n"

  # enable httpd
  command "systemctl enable httpd"

  # backup oroginal firewall setting
  cp-a ${F3} ${F3}.old
  # upload new firewall settings
  upload ${F3_NEW} ${F3}
  # enable firewalld
  command "systemctl enable firewalld"
_EOF_

echo "*** guestfish finished ***"

# ----------------------------------------------------------
# Start guest
# ----------------------------------------------------------

virsh start ${DOM}

echo "*** all job finished ***"

# ----------------------------------------------------------
# EOJ
# ----------------------------------------------------------

2016.10.2 追記

最新のスクリプトは github に公開しています

最新のスクリプトは以下の github に公開しています

https://github.com/uvirt/kvm-sample

XRDP Remote Desktop のインストール

XRDP をインストールすると、Windows のリモートデスクトップ機能を使用して Fedora に接続できるのでとても便利です。以下は Fedora 22 で動作確認しました。ログインユーザは wheel グループに属するユーザ(admin user)を用いて確認しました。

xrdp パッケージをインストール

# dnf install xrdp -y

SELinux をいったん Permissive に変更

xrdp を起動する前にいったん SELinux を Permissive に変更します。これをしないと xrdp サービスの起動に失敗する場合があります。最終的には SELinux 関連の設定をおこない、その後に Enforcing に戻すことにします。

# setenforce 0

xrdp サービス起動・有効化

xrdp サービス起動・有効化します。

# systemctl enable xrdp.service
# systemctl start xrdp.service

# systemctl enable xrdp-sesman.service
# systemctl start xrdp-sesman.service

正常起動されていることを確認します。以下のように「active (running)」と表示されていれば OK です。

# systemctl status xrdp
  ...
  Active: active (running) ...
  ...

Firewall の xrdp ポートを開く

現在の Firewall ゾーンを取得します。Fedora Live CD を使ってインストールした環境では、デフォルトでは「FedoraWorkstation」になっています。

# ZONE=`firewall-cmd --get-active-zone|head -1`
# echo $ZONE
FedoraWorkstation

サービスの一覧を取得し、「ms-wbt」が存在することを確認します。「ms-wbt」とは Microsoft Windows Based Terminal の略で Windows Remote Desktop を意味します。「ms-wbt」は 3389/tcp ポートを使用します。

# firewall-cmd --get-services
... ms-wbt ...

現在のゾーンに「ms-wbt」サービスを追加します。

# firewall-cmd --zone=$ZONE --add-service=ms-wbt

ただし、これは Runtime に設定されただけなので、次回起動時には設定が無くなります。再起動後も有効になるよう Permanent にも設定します。

# firewall-cmd --permanent --zone=$ZONE --add-service=ms-wbt

現在のゾーンに「ms-wbt」サービスが追加されたことを確認します。

# firewall-cmd --list-services --zone=$ZONE
# firewall-cmd --permanent --list-services --zone=$ZONE

SELinux 設定のバグ対応

SELinux 設定のバグがあるようですのでこれに対応します。「/usr/sbin/xrdp」および「/usr/sbin/xrdp-sesman」の 2 つのファイルに関して SELinux コンテキストを変更します。

# chcon -t bin_t /usr/sbin/xrdp /usr/sbin/xrdp-sesman

参考)
https://bugzilla.redhat.com/show_bug.cgi?id=1177202

SELinux Polkit Rule の設定

wheel グループのユーザーでリモートデスクトップに接続した際、いくつか root パスワードを求められるので、これにスキップできるようにします。

# ls /etc/polkit-1/rules.d/
# cat << "EOF" > /etc/polkit-1/rules.d/99-xrdp-remote-desktop.rules
//
// wheel users can network proxy configure
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.packagekit.system-network-proxy-configure" && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute xrandr (create a color managed device)
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.color-manager.create-device" && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute system-sources-refresh
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.packagekit.system-sources-refresh" && subject.active && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute 'systemctl restart xrdp'
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.systemd1.manage-units" && subject.active && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});

//
// wheel users can execute NetworkManager.settings.modify.system
//
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.NetworkManager.settings.modify.system" && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});
EOF

SELinux Policy の設定

ログイン時に毎回、ABRT によるエラーが報告されるのですが、つぎの SELinux の対応をすることで回避できます。semodule コマンドの実行には時間がかかる場合があります。

# dnf -y install selinux-policy-devel
# mkdir temp
# cd temp
# cat << "EOF" > mypol.te

module mypol 1.0;

require {
        type unconfined_service_t;
        type colord_t;
        class dir search;
        class file { read getattr open };
}

#============= colord_t ==============
allow colord_t unconfined_service_t:dir search;
allow colord_t unconfined_service_t:file { read getattr open };
EOF

# make -f /usr/share/selinux/devel/Makefile mypol.pp
# semodule -i mypol.pp
# cd ..
# rm -rf temp

この問題は以下に報告されているのですが、まだ解決されていないようです。
https://bugzilla.redhat.com/show_bug.cgi?id=1205022

リブートして接続確認

リブートした後、Windows PC から Remote Desktop を使って接続できることを確認してください。Linux から接続する場合は rdesktop、xfreerdp コマンドなどがあります。SELinux はリブートした後は有効になっているはずです。SELinux 関連の処理によりリブートには時間がかかる場合があります。

画面解像度の変更

XRDP によるリモートデスクトップ接続をおこなったとき、デフォルトでは画面の解像度がローカルPCの画面と同じになります。画面の解像度を変更したい場合は、つぎの手順でおこないます。

まずは、ログインしたユーザーアカウントでターミナルを開き、xrandr コマンドを使って接続されているモニターの名前(VNC-0)とサポートされている解像度を確認します。つぎに xrandr コマンドでそのモニター名と解像度を指定して変更します。

$ xrandr
Screen 0: minimum 32 x 32, current 1280 x 1024, maximum 32768 x 32768
VNC-0 connected primary 1280x1024+0+0 0mm x 0mm
   1920x1200     60.00  
   1920x1080     60.00  
   1600x1200     60.00  
   1680x1050     60.00  
   1400x1050     60.00  
   1360x768      60.00  
   1280x1024     60.00* 
   1280x960      60.00  
   1280x800      60.00  
   1280x720      60.00  
   1024x768      60.00  
   800x600       60.00  
   640x480       60.00  

$ xrandr --output VNC-0 --mode 1024x768

デフォルトの解像度の設定

Gnome の設定画面から画面の解像度を変更しても、その内容が保存されないようです。次回のログイン時に元の解像度に戻ってしまいます。ログインのたびに毎回、xrandr コマンドを入力して設定しなおすのは面倒です。これを回避するには、ログイン時に自動的に xrandr コマンドを実行することで可能です。

ユーザーの HOME ディレクトリ下の「.config/autostart/」ディレクトリに「*.desktop」ファイルを作成します。ここでは、「$HOME/.config/autostart/xrandr-setup.desktop」という名前で作成します。この例は解像度を 1024×768 に指定しています。利用状況に合わせて適切に変更してください。

$ mkdir -p $HOME/.config/autostart/

$ cat << "EOF" > $HOME/.config/autostart/xrandr-setup.desktop
[Desktop Entry]
Name=xrandr-setup
GenericName=xrandr-setup
Comment=Screen Resolution for Remote Desktop
Exec=/usr/bin/xrandr --output VNC-0 --mode 1024x768
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
EOF

ログインできない時の対応

リモートデスクトップにログインできなくなったという場合は、ssh でログインして GDM の再起動を試してみてください。

# systemctl restart gdm

以上です。Fedora のリモートデスクトップをお楽しみください。

VMware Workstation 11 Linux 版のインストール

Linux 上に仮想化環境を構築するためには、無料で利用可能な Linux KVM の他に、有償で VMware Workstation を利用することもできます。スナップショットの使い勝手やパフォーマンスの良さ、各種ハイパーバイザーをゲストとしてインストールしたときの安定性などを考えると十分に元が取れる製品です。複数ホストが連携する Cloud 製品のインストール手順確認なども VMware Workstation 上で十分にできます。自分の環境では Linux KVM と VMware Workstation の両方をインストールしています。以下は Fedora 22 にて動作確認しました。

VMware Workstation 11 のインストール準備

VMware Workstation のインストールに必要な依存パッケージを事前にインストールします。

# dnf -y group install "Development Tools"
# dnf -y install kernel-devel kernel-headers

VMware Workstation のダウンロード

以下より VMware Workstation 11 Linux 評価版をダウンロードします。
http://www.vmware.com/products/workstation/workstation-evaluation

VMware Workstation 11 のインストール開始

# chmod a+x ./VMware-Workstation-Full-11.1.2-2780323.x86_64.bundle
# ./VMware-Workstation-Full-11.1.2-2780323.x86_64.bundle

下記のようなエラーメッセージが表示されますが無視して進めます。

Extracting VMware Installer...done.

(vmware-installer.py:28144): Gtk-WARNING **: Unable to locate theme engine in module_path: "adwaita",

(vmware-installer.py:28144): Gtk-WARNING **: Unable to locate theme engine in module_path: "adwaita",
/usr/share/themes/Adwaita/gtk-2.0/gtkrc:1163: error: unexpected identifier `direction', expected character `}'
Gtk-Message: Failed to load module "pk-gtk-module": libpk-gtk-module.so: cannot open shared object file: No such file or directory
Gtk-Message: Failed to load module "canberra-gtk-module": libcanberra-gtk-module.so: cannot open shared object file: No such file or directory

(1)「VMware Workstation – End User License Agreement」の画面が表示されるので、「I accept …」を選択して [Next] ボタンをクリックします。

vmware-01

(2)「VMware OVF Tool component for Linux – End User License Agreement」の画面が表示されるので、「I accept …」を選択して [Next] ボタンをクリックします。

vmware-02

(3)「Would you like to check for product updates on startup?」の画面が表示されるので、「No」を選択して [Next] ボタンをクリックします。

vmware-03

(4)「Would you like to help make VMware software …」の画面が表示されるので、「No」を選択して [Next] ボタンをクリックします。

vmware-04

(5)「Please enter the user that will initially connect to Workstation Server …」の画面が表示されるので、「root」を変更して通常ログインして使用するユーザー名を入力します。[Next] ボタンをクリックしてつぎに進みます。

vmware-05

(6)「Please choose a directory for your shared virtual machines.」の画面が表示されるので、特に変更しないで、[/var/lib/vmware/Shared VMs]のまま[Next] ボタンをクリックしてつぎに進みます。

vmware-06

(7)「Please enter the port to use for https access to Workstation Server.」の画面が表示されるので、HTTPS port: [443] を適切に変更して [Next] ボタンをクリックしてつぎに進みます。

vmware-07

(8)「Enter license key.」の画面が表示されるので、空白のまま [Next] ボタンをクリックしてつぎに進みます。

vmware-08

(9)「The product is ready to installed.」の画面が表示されるので、[Install] ボタンをクリックしてつぎに進みます。

vmware-09

(10)「Installing …」の画面が表示されるので、完了するまで待ちます。

vmware-10

(11)「Installation was successful.」の画面が表示されるので、[Close] ボタンをクリックします。

vmware-11

インストールが完了した後、VMware Workstation を起動すると、初回に license key を入力するか、入力しないまま30日の評価期間として利用を続けるかを聞かれますので、いずれかを選択します。license key の入力は後からいつでも入力可能です。また license key を入力しなくても評価期間内であればフル機能が利用できます。

VMware Workstation には仮想マシンを接続するネットワークとしてデフォルトで3種類が用意されています。vmnet0 (Bridged)、vmnet1 (host-only)、vmnet8 (NAT)です。

仮想マシンを vmnet0 (Bridged) に接続すると、その仮想マシンを VMware ホストの外部のネットワークに接続することができます。vmnet1 (host-only) は VMware ホストとのみ接続されているプライベートなネットワークです。主に外部との接続を遮断したセキュアな環境で作業したいときに利用します。vmnet8 (NAT) は VMware が自動で用意してくれる仮想的な NAT ルータを通して外部と接続できるプライベートなネットワークです。NAT ルータの Gateway のアドレスは末尾が「.2」で固定されています。その他、vmnet2〜7、vmnet9〜 を自分でカスタムに定義することで自由なネットワークの構築が可能です。

VMware Workstation を最初に起動したら、メニューから「Edit > Virtual Network Editor」を選択して、「vmnet1 (host-only)」および「vmnet8 (NAT)」のネットワークアドレスを自分が使いやすい値に変更したほうが良いでしょう。

例えば、vmnet1 (host-only) ネットワークのネットワークアドレスを 192.168.10.0/24 に設定した場合、末尾が「.1」の IP アドレスすなわち 192.168.10.1 が VMware ホスト側に割り当てられ、それ以外の IP アドレスはゲストに割り当てることができます。

また、vmnet8 (NAT) ネットワークのネットワークアドレスを 192.168.20.0/24 に設定した場合、末尾が「.1」の IP アドレスすなわち 192.168.20.1 がホスト側に割り当てられ、末尾が「.2」の IP アドレスすなわち 192.168.20.2 が NAT ルータの Gateway に割り当てられ、それ以外の IP アドレスはゲストに割り当てることができます。ゲストは NAT ルータの Gateway と通して外部との通信が可能です。

VMware Workstation 11 のドキュメントは以下の URL に公開されています。
http://pubs.vmware.com/workstation-11/index.jsp

Linux KVM のインストール

Linux 標準の仮想化機能 KVM のインストール手順を説明します。Fedora 22 で動作確認しました。

KVM とは

KVM とは Kernel-based Virtual Machine の略で Linux に標準で用意されている仮想化機能です。KVM をインストールするとことにより、Linux ホスト内に仮想マシンを簡単に作成することができます。KVM をインストールするとデフォルトで NAT 構成の仮想ネットワーク(192.168.122.0/24) が Linux 内に作成されます。仮想マシンを作成すると、この仮想ネットワークに接続され、DHCP 機能によって、ゲスト OS に対して IPアドレスが自動的に付与されます。例えば 192.168.122.111 といった IP アドレスになります。仮想マシンが外部とネットワーク通信をする際には、仮想ゲートウェイ 192.168.122.1 を介して通信します。このゲートウェイの IP アドレスは Linux ホスト自身に割り当てられた IP アドレスでもあるため、ゲスト OS から Linux ホストに ssh 接続したいときは、宛先 IP アドレスに 192.168.122.1 を指定することにより接続できます。

NAT 構成の仮想ネットワークでは Linux ホストはルータとして機能するので、仮想マシンから受け取ったパケットを仮想ゲートウェイ 192.168.122.1 から受け取り、Linux ホストの物理 NIC を通して外部に転送します。また外部から戻ってきたレスポンスは物理 NIC で受け取った後は、仮想ゲートウェイを通して仮想マシンにルーティングします。このようにゲスト PC は外部から隠蔽されています。そのため、ゲスト PC に Web サーバーをインストールしても、そのままでは外部のネットワークに公開することはできません。これをするには、別途 Bridge ネットワークを作成する必要がありますが、今回の説明では省略します。

仮想ネットワーク(192.168.122.0/24) は、環境によっては異るネットワークアドレスに設定されます。例えば、筆者の環境では VMware Workstation もインストールしているためか、ネットワークアドレスは 192.168.124.0/24 に設定されています。

なお、KVM を利用するには、Linux の 64-bit OS が必要です。また、CPU は仮想化支援機能が必要となります。

Linux KVM のインストール

KVM をインストールするにはパッケージグループ virtualization をインストールします。パッケージグループ virtualization が存在するかどうかは、つぎのコマンドで確認できます。

# dnf grouplist hidden -v

パッケージグループ virtualization の内容を確認するには、つぎのコマンドで確認できます。

# dnf groupinfo virtualization

Group: Virtualization
 Description: These packages provide a virtualization environment.
 Mandatory Packages:
   virt-install
 Default Packages:
   libvirt-daemon-config-network
   libvirt-daemon-kvm
   qemu-kvm
   virt-manager
   virt-viewer
 Optional Packages:
   guestfs-browser
   libguestfs-tools
   python-libguestfs
   virt-top

必須(Mandatory)、デフォルト(Default)、オプション(Optional)でインストールされるパッケージの一覧が表示されます。特に問題なさそうなのでオプションも含めてすべてをインストールします。

# dnf -y group install virtualization --setopt=group_package_types=mandatory,default,optional

インストールしたら、いったんリブートします。

# reboot

以上で Linux KVM のインストールは完了です。

仮想マシンの作成

仮想マシンの作成や仮想ネットワークの作成などは、Virtual Machine Manager (virt-manager) という GUI アプリケーションを操作して作成できます。仮想マシンを作成すると、仮想マシンの定義ファイルと仮想マシンのイメージファイルが作成されます。仮想マシンの定義ファイルは「/etc/libvirt/qemu/」ディレクトリ以下に配置されます。仮想マシンのイメージファイルは「/var/lib/libvirt/images/」ディレクトリ以下に配置されます。

仮想マシンの OS インストール時に使用するインストールメディアは、ISO イメージファイルの形で「/var/lib/libvirt/images/」ディレクトリ以下にコピーしておくと便利です。

仮想マシンの作成には virt-manager を利用する他に、virt-install コマンドを使うこともできます。たとえば、CentOS 7.1 の仮想マシンを作成するには、以下のように入力します。メモリーは MB 単位で指定し、ディスクは GB 単位で指定します。

# cp CentOS-7-x86_64-DVD-1503-01.iso /var/lib/libvirt/images/

# virt-install \
--name c71 \
--memory 1024 \
--disk path=/var/lib/libvirt/images/c71.img,size=10 \
--network network:default \
--vnc \
--cdrom /var/lib/libvirt/images/CentOS-7-x86_64-DVD-1503-01.iso

virt-install コマンドが開始されると、すぐにインストーラの GUI 画面が表示されるので、通常の OS インストール手順と同様に操作を進めてインストールを完了させます。

virt-manager 起動時の root パスワード入力の省略

virt-manager を一般ユーザーから起動しようとすると、そのままでは SELinux の機能により root ユーザーのパスワード入力が求められます。wheel グループに所属しているユーザーの場合、root ユーザーのパスワード入力を省略するには、「/etc/polkit-1/rules.d/」ディレクトリ以下にルールを作成します。

# cat << "EOF" > /etc/polkit-1/rules.d/80-libvirt-manage.rules
//
// wheel user can execute virt-manager
//

polkit.addRule(function(action, subject) {
  if (action.id == "org.libvirt.unix.manage" && subject.local && subject.active && subject.isInGroup("wheel")) {
      return polkit.Result.YES;
  }
});
EOF

上記のルール設定は、action.id が “org.libvirt.unix.manage” のときは、それを許可するといった意味になります。この action.id を調べるには、つぎのコマンドで確認できます。

# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0 --no-page | grep action

仮想マシンの画面解像度の設定

Fedora 22 の KVM 仮想マシンを作成した場合、仮想マシンの画面の解像度がホスト PC の画面と同じになるようです。これを変更するには、つぎの手順でおこないます。仮想マシンにて xrandr コマンドで仮想マシンに接続されているモニターの名前(Virtual-0)とサポートされている解像度を確認します。

$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1200, maximum 8192 x 8192
Virtual-0 connected primary 1920x1200+0+0 0mm x 0mm
   1920x1200     59.88* 
   1920x1080     59.96  
   1600x1200     59.87  
   1680x1050     59.95  
   1400x1050     59.98  
   1280x1024     59.89  
   1440x900      59.89  
   1280x960      59.94  
   1280x854      59.89  
   1280x800      59.81  
   1280x720      59.86  
   1152x768      59.78  
   1024x768      59.92  
   800x600       59.86  
   848x480       59.66  
   720x480       59.71  
   640x480       59.38  
Virtual-1 disconnected
Virtual-2 disconnected
Virtual-3 disconnected

xrandr コマンドで仮想マシンの解像度を変更します。

$ xrandr --output Virtual-0 --mode 1024x768

仮想マシンの解像度をリブート後も設定を有効にするには、以下の設定を追加します。

# cat << "EOF" > /etc/X11/xorg.conf.d/40-monitor.conf
Section "Monitor"
  Identifier  "Virtual-0"
  Option      "PreferredMode" "1024x768"
EndSection
EOF

Boxes の利用

一度仮想マシンを作成したら、仮想マシンの操作は virt-manager の他に Boxes というアプリを利用して操作することもできます。Boxes を利用するには、最初に起動したときに、

1) [New] ボタンをクリックします。
2) Source Selection 画面が表示されます。
3) Enter URL を選択し、「qemu:///system」を入力します。
4) [Continue] ボタンをクリックします。
5) [Create] ボタンをクリックします。

以上で既存のゲスト VM の一覧が表示されるので、アイコンをクリックすると起動されます。

Asciidoctor による PDF 生成

Python asciidoc と Apache FOP を使って PDF を生成する手順はここで説明しました。今回は asciidoctor と asciidoctor-fopub を使って PDF を生成してみます。動作確認は Fedora 21 でおこないました。

asciidoctor は AsciiDoc から DocBook を生成するツールです。Ruby で開発されており、RubyGem として提供されています。Python の asciidoc の代わりとなるツールです。

asciidoctor-fopub は DocBook から PDF を生成するツールです。Java で開発されており、Apache FOP の代わりとなるツールです。

(参考)
https://github.com/asciidoctor/asciidoctor
https://github.com/asciidoctor/asciidoctor-fopub

これらを、AsciiDoc > DocBook > PDF の順に処理することで AsciiDoc から PDF ドキュメントを生成することができます。

それでは、asciidoctor と asciidoctor-fopub のインストールをおこなってみましょう。

VLGothic フォント、IPA フォントのインストール

日本語フォントをインストールします。root ユーザーにて作業します。

# yum -y install vlgothic*-fonts
# yum -y install ipa-*-fonts

Asciidoctor のインストール

rubygem-asciidoctor という名前の RPM パッケージをインストールします。

# yum -y install rubygem-asciidoctor

これにより、以下がインストールされます。Ruby 本体もインストールされます。

1) ruby-irb-2.1.6-27.fc21.noarch.rpm
2) ruby-2.1.6-27.fc21.x86_64.rpm
3) rubygem-bigdecimal-1.2.4-27.fc21.x86_64.rpm
4) rubygem-json-1.8.1-27.fc21.x86_64.rpm
5) rubygem-io-console-0.4.3-27.fc21.x86_64.rpm
6) rubygem-asciidoctor-1.5.2-1.fc21.noarch.rpm
7) rubygem-psych-2.0.5-27.fc21.x86_64.rpm
8) rubypick-1.1.1-2.fc21.noarch.rpm
9) rubygems-2.2.2-101.fc21.noarch.rpm
10) rubygem-rdoc-4.1.1-2.fc21.noarch.rpm
11) ruby-libs-2.1.6-27.fc21.x86_64.rpm

OpenJDK 8 のインストール

asciidoctor-fopub のインストールには OpenJDK が必要になるので、これをインストールします。まずは、利用可能な OpenJDK を確認します。

# yum search all openjdk
...
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
...

OpenJDK 8 をインストールします。

# yum -y install java-1.8.0-openjdk-devel

asciidoctor-fopub のインストール

asciidoctor-fopub はまだ RPM として提供されていません。GitHub から asciidoctor-fopub をクローンしてインストールします。root 以外の一般ユーザーで作業します。

$ cd $HOME
$ git clone https://github.com/asciidoctor/asciidoctor-fopub

日本語の AsciiDoc ファイルを作成して動作確認

asciidoctor-fopub のディレクトリ下に移動して、最初の動作確認をおこないます。

$ cd asciidoctor-fopub

確認用の簡単な日本語の AsciiDoc ファイルを作成します。ファイル名は「samplej.adoc」としました。

$ cat << "EOF" > samplej.adoc
= 今日のご飯
犬猫 太郎 <doc@example.com>

参考サイト http://asciidoctor.org/[Asciidoctor]

== はじめに

今日のご飯のメニュー

* ドリンク: お酒
* メインディッシュ: 「猫まんま」/「犬まんま」からお選びください

Ruby のプログラムのサンプルです。

.A basic Ruby application
[source,ruby]
----
puts "寿司食べたい!"
----

EOF

asciidoctor コマンドを使って「samplej.adoc」ファイルから DocBook を作成します。DocBook は「samplej.xml」というファイル名で作成されます。

$ asciidoctor -b docbook -d article -a data-uri! samplej.adoc

つぎに fopub コマンドを使って DocBook ファイルから PDF ファイルを生成しますが、これは以下の手順でおこないます。

まずは、プロキシ配下の環境で作業している場合には、fopub コマンドを最初に実行する前に、「asciidoctor-fopub」ディレクトリの下に「gradle.properties」ファイルを作成して、プロキシの指定をおこいます。

(例)
$ cat << "EOF" > gradle.properties
systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
EOF

(参考)
http://gradle.org/docs/current/userguide/userguide_single.html
19.3. Accessing the web via a proxy

つぎに fopub コマンドを使って DocBook ファイルから PDF ファイルを生成します。このとき、日本語フォントを明示的に指定する必要があります。これを忘れると PDF 上で漢字が # に置き換えらて表示されます。

$ ./fopub samplej.xml \
  -param title.font.family VL-PGothic-Regular \
  -param body.font.family VL-PGothic-Regular \
  -param sans.font.family VL-PGothic-Regular \
  -param monospace.font.family VL-PGothic-Regular \
  -param symbol.font.family VL-PGothic-Regular

fopub コマンドが最初に実行されたときに、Gradle によって fopub に必要なライブラリが自動的にインターネットから取得され、これが終了すると PDF 生成が開始されます。fopub コマンドが完了したら、PDF ファイル「samplej.pdf」が生成されるので、日本語が正しく表示されていることを確認します。

fopub コマンドをシステムワイドに利用できるようにする

上記で作成した「asciidoctor-fopub」ディレクトリを「/usr/share/」以下にコピーします。

$ cd $HOME
$ sudo cp -ir ./asciidoctor-fopub /usr/share

fopub コマンドの wrapper シェル「/usr/local/bin/fopub」を作成し、実行権限を付加します。root ユーザーにて作業します。

# cat << "EOF" > /usr/local/bin/fopub
#!/bin/sh
DIRNAME=`dirname $0`
FOPUB_PATH=/usr/share/asciidoctor-fopub
PATH="${FOPUB_PATH}:${PATH}"
exec $FOPUB_PATH/fopub $@
EOF

# chmod +x /usr/local/bin/fopub

「JavaScript Promiseの本」の PDF 生成

動作確認として、fopub コマンドを使って、azu 氏が公開されている 「JavaScript Promiseの本」の PDF を生成してみます。

$ git clone https://github.com/azu/promises-book.git
$ cd promises-book/
$ asciidoctor -b docbook -d book -a data-uri! index.adoc
$ fopub index.xml \
  -param title.font.family VL-PGothic-Regular \
  -param body.font.family VL-PGothic-Regular \
  -param sans.font.family VL-PGothic-Regular \
  -param monospace.font.family VL-PGothic-Regular \
  -param symbol.font.family VL-PGothic-Regular

生成された PDF ファイル「index.pdf」 の内容を確認します。オリジナルサイトで配布されている PDF に近い内容になっており、とても綺麗な仕上がりの PDF ができました。

IPAPMincho フォントを指定して PDF を生成したい場合は、以下のように指定します。

$ fopub index.xml \
  -param title.font.family IPAPMincho \
  -param body.font.family IPAPMincho \
  -param sans.font.family IPAPMincho \
  -param monospace.font.family IPAPMincho \
  -param symbol.font.family IPAPMincho

簡単な Rails アプリケーションの作成

前回は Ruby の開発環境をインストールしたので、ここでは簡単な rails アプリケーション、いわゆる rails 版「Hello, World!」アプリを作成してみます。「RailsによるアジャイルWebアプリケーション開発 第4版」を参考にしました。

rails new の実行

「rails new」コマンドを使って rails アプリケーションを作成します。このとき、「--skip-bundle」オプションを指定し、これと同時に bundle install が実行されるのを防止します。つぎのコマンドを実行すると、アプリケーションと同名の「demo」という名前のサブディレクトリを作成し、そこに rails アプリケーションを配置します。

$ rails new demo --skip-bundle

bundle insall の実行

「rails new」コマンドが終了したことを確認したら、アプリケーションのディレクトリに移動し、「bundle install」コマンドを実行します。これにより、その rails アプリに必要なすべての gem パッケージが一括でインストールされます。root 以外のユーザーで「bundle install」を実行すると、それらの gem パッケージは「.gem」ディレクトリの下にインストールされます。インストール時にバージョンコンフリクトなどのエラーが発生する場合は、この「.gem」ディレクトリとアプリケーションのサブディレクトリ「demo」を削除してから最初からやり直してみてください。

$ cd demo
$ bundle install

「bundle install」を実行したときにインストールされる gem パッケージの一覧は Gemfile に記述されています。「bundle install --path vendor/bundle」というコマンドを使うことで、gem パッケージをアプリケーションのディレクトリ内にインストールすることも可能です。こうすることで、他のアプリとの gem パッケージのバージョンコンフリクトを防止することができます。redmine など、配布が必要なアプリは、アプリケーションのディレクトリ内に gem パッケージを配置する形でインストールします。

参考)
http://bundler.io/bundle_install.html
http://blog.redmine.jp/articles/3_0/installation_centos/

rails アプリケーションの起動

rails アプリには WEBrick と呼ばれる開発用の Web Server が付属しています。これを起動するには、つぎのコマンドを実行します。

$ rails server

これによって rails アプリにアクセスすることができます。ブラウザから「http://127.0.0.1:3000」にアクセスして空のアプリの画面が表示されることを確認してください。WEBrick を停止するには、CTRL+C を入力して停止します。

rails のバージョンの指定

特定のバージョンの rails を明示的に指定してインストールすることもできます。

例)
$ gem install rails -v 4.2.0
$ rails new demo
$ cd demo & rails s

すべての利用可能な rails のバージョンはつぎのコマンドで検索できます。

$ gem list --remote --all rails | grep '^rails '

ただし、ruby のバージョンと rails バージョンの互換性を確認したうえで rails のバージョンを選択する必要があります。以下の互換性が推奨されているようです。

Rails 4.0 – Ruby 2.0 以上を推奨
Rails 4.1/4.2 – Ruby 2.1 以上を推奨
Rails 4.2.1 – Ruby 2.2 以上を推奨

コントローラとアクションメソッドの作成

rails アプリケーションのカスタマイズの最初のステップは、コントローラとアクションメソッドの作成です。簡単に説明すると、アクションメソドはブラウザから送信された URL にもとづいてコールされる関数のことです。そして、コントローラはアクションメソドを集めたものです。文法的にはコントローラはクラスとして実装され、アクションメソドは、そのクラスのインスタンスメソドとして実装されます。つぎのコマンドはコントローラ「Say」を作成し、アクションメソッド「hello」および「goodbye」を作成します。

$ rails generate controller say hello goodbye

これにより SayController クラスが作成され、その中に hello メソド、goodbye メソド が定義されます。SayController クラスは rails フレームワークが提供する ApplicationController クラスを継承しています。

アクションメソッドにロジックを記述

作成されたアクションメソッドの中身は空っぽなので、この中にいわゆるビジネス・ロジックを記述していきます。これには「app/controllers/say_controller.rb」ファイルを開いての hello メソッドをつぎのように変更します。現在時刻を取得してその値をインスタンス変数 @time に格納しています。

class SayController < ApplicationController
  def hello
    @time = Time.now
  end

  def goodbye
  end
end

アクションメソドが実行された後は、自動的に同名のビューの処理に引き継がれ、HTML レンダリングがおこなわれます。このとき、アクションメソドの中で作成したインスタンス変数 @time はビューに引き渡されます。

ビュー(テンプレート)の内容を記述

「ビュー」はアクションメソッドで設定されたインスタンス変数の内容を受け取り HTML をレンダリングする機能を持ちます。「ビュー」のことを「テンプレート」とも呼びます。ファイル名の拡張子は「.html.erb」となっており、これは「Embedded Ruby」を意味します。Windows の ASP (Active Server Pages) や Java の JSP (Java Server Pages) と同等のものになります。

「app/views/say/hello.html.erb」ファイルを開いて以下のように変更します。ビューの中でアクションメソッドから渡されたインスタンス変数 @time を参照しています。

<h1>railsからこんにちは!</h1>
<p>現在の時刻は <%= @time %> です。</p>

「app/views/say/goodbye.html.erb」ファイルを開いて以下のように変更します。

<h1>さようなら!</h1>
<p>ご訪問ありがとうございました。</p>

各ビューのテンプレートの中には HTML ページの <body> 〜 </body> タグの内側の部分のみを記述します。ここで記述した内容はさらに外枠の共通テンプレート「app/views/layouts/application.html.erb」に取り込まれ、これによって <body> 〜 </body> タグの外側の部分がレンダリングされて出力されます。

アプリの画面を表示する

ブラウサで以下の URL を開いて内容を確認します。URL のクエリーの部分が「http://〜/コントローラ名/アクションメソド名」となっていることに注意してください。

http://127.0.0.1:3000/say/hello
および
http://127.0.0.1:3000/say/goodbye

ブラウサから送信された URL のパターンもとづいてコントローラの中のアクションメソッドが呼び出され、アクションメソッドで設定した内容が、ビューに反映されて HTML ページに表示されることがわかります。

ルーティングについて

上記で「ブラウサから送信された URL のパターンもとづいてコントローラの中のアクションメソッドを呼び出す」と述べましたが、こうした処理のことを「ルーティング」と呼び、このルーティングの設定は「config/routes.rb」ファイルに記述します。

Rails.application.routes.draw do
  get 'say/hello'

  get 'say/goodbye'

end

例えば「http://127.0.0.1:3000/」が呼び出されたときに、indexページ(rootページ)として、hello ページを表示したい場合は、つぎのように「root ‘say#hello’」の行を追加します。また、どの URL パターンにも当てはまらないときに goodbye ページを表示したい場合は「match ‘*path’, to: ‘say#goodbye’, via: :all」の行を追加します。

Rails.application.routes.draw do
  root 'say#hello'

  get 'say/hello'

  get 'say/goodbye'

  match '*path', to: 'say#goodbye', via: :all

end