VMwareのホスト・ゲスト間ファイル共有機能は便利な機能であるわけだが、 CentOS 7.3 と VMware Tools 10.0.x の組合わせではコンパイルエラーが生じてToolsのインストールが失敗し、ファイル共有が使えない。

具体的にはこんなエラー。

/tmp/modconfig-CXZXGV/vmhgfs-only/page.c:1649:23: エラー: 関数 ‘wait_on_bit’ への引数が多すぎます
                       TASK_UNINTERRUPTIBLE);
                       ^
In file included from include/linux/mmzone.h:9:0,
                 from include/linux/gfp.h:5,
                 from include/linux/mm.h:9,
                 from include/linux/pagemap.h:7,
                 from /tmp/modconfig-CXZXGV/vmhgfs-only/page.c:28:
include/linux/wait.h:1044:1: 備考: ここで宣言されています
 wait_on_bit(void *word, int bit, unsigned mode)
 ^
make[2]: *** [/tmp/modconfig-CXZXGV/vmhgfs-only/page.o] エラー 1

現時点で最新の VMware Tools 10.1.0 build-4449150 を手動ダウンロードして導入し解決。

元情報
VMware Tools 10.1.0 build-4449150

ダウンロードした VMware-Tools-10.1.0-core-4449150.tar.gz に収録されている linux.iso をゲストOSでマウントし、あとはいつもの手動インストールを行う。

Apacheと比べて、軽い速いという定評のlighttpd(ライト・ティーピーディーとか、ライティーと呼ばれてます)。

自分の会社でも、PHPやらRoRやらCGI系を動かす関係上、FastCGIとの相性も良さげなlighttpdをメインWWWサーバーとして使っている。
で、やっぱり業務でSVNとかWebDAVとか使いたいのですが、WebDAVはともかく、SVNはApacheでいうところのmod_dav_svn相当の機能がなかったりするんだな。

そこで、lighttpdをプロキシにして、バックエンドにApacheを置いてSVNとかWebDAVをしようという試み。

CentOS 5.5にlighttpdを導入する方法はここをみてね。

■構成はだいたいこんな感じ

バックエンドとしてApacheを立てる。今回はlighttpdと同一サーバ上に立てるため、ポートを8080とかに変更。
mod_davとmod_dav_svnで、普通にSVNやWebDAVを動かしておく。

フロントは、lighttpdで、SSLサイトを作る。
で、Basic認証を行いつつ、プロキシ機能で、バックエンドのApacheに転送する。
SSLはlighttpdで終端。(フロント->バックエンドはhttp)

■まず、Apacheの設定

ポート番号変更ね。


[root@kvm1 ~]# vi /etc/httpd/conf/httpd.conf
・・・
Listen 8080
・・・

あとSVN&WebDAV設定だけど、CentOSのRPM版では、/etc/httpd/conf.d配下の*.confが全てhttpd.confにインクルードされるようになってるので、ここに個別に設定ファイルをつくります。

まずSVN。当然だけどサーバ上でまずSVNリポジトリを作っておく必要あり。ここでは/var/db/svnにリポジトリを置いて、それをhttp://(ホスト名)/svn/でアクセスさせる予定。


[root@kvm1 ~]# vi /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
<Location /svn>
  DAV svn
  SVNParentPath /var/db/svn
</Location>

次にWebDAV。mod_davはhttpd.conf側でロードされるだよ。
RequestHeaderうんたらの部分は何をしているかというと、WebDAVのCOPYとかMOVEはhttpリクエストヘッダにコピー/移動先となるURLを乗っけてくるため、プロキシが見逃して変換してくれない。よって、WebDAV側で外向けURL(FQDN。SSLつき)からWebDAVサーバ上で通用するURL(自分自身。SSLなし)に変換しないといけないんだな。


[root@kvm1 ~]# vi /etc/httpd/conf.d/dav.conf
RequestHeader edit Destination ^https://(ホスト名)/ http://localhost:8080/ early
<Location "/dav">
  Options -Indexes
  Dav on
</Location>

■lighttpdの設定


[root@kvm1 ~]# vi /etc/lighttpd/lighttpd.conf
・・・
(SSLサイトですよの設定)
$SERVER["socket"] == ":443" {
  ssl.engine = "enable"
  ssl.pemfile = "/etc/lighttpd/ssl/server.pem"
  server.document-root = "/var/www/lighttpd-ssl"

(認証。LDAP連携してます)
  auth.backend = "ldap"
  auth.backend.ldap.hostname = "localhost"
  auth.backend.ldap.base-dn = "ou=People,dc=foo,dc=bar"
  auth.backend.ldap.filter = "(uid=$)"
  auth.require = (
    "/svn" => (
      "method" => "basic",
      "realm" => "Subversion Auth Realm",
      "require" => "valid-user"
    ),
    "/dav" => (
      "method" => "basic",
      "realm" => "WebDAV Auth Realm",
      "require" => "valid-user"
    )
  )

(プロキシ。自分の8080へ転送する感じで)
  proxy.server = (
    "/svn" => (
      ( "host" => "127.0.0.1", "port" => 8080 )
    ),
    "/dav" => (
      ( "host" => "127.0.0.1", "port" => 8080 )
    )
  )
}

“host”値はIPアドレスな感じで。8080はダブルクォートで囲まない感じで。
あと公開パスとバックエンド側のパス(例えばここでは”/dav”とか)が相互に異なると、これまたDestinationヘッダ変換問題がややこしいことになるんで、合わせるがよい。頑張りたい人だけ頑張ってくれ。

■Expectヘッダ問題。

WebDAVクライアントによっては、たとえばPUT時なんかに「Expect: 100-continue」っていうヘッダをつけてリクエストしてくるんだけど、このヘッダの意味をlighttpdが理解できず、「417 Expectation failed」エラーが出たりします。
クライアント側でこのヘッダを送出しない設定などを行って回避してくれ。
なんかこのごろ、nginxとかに押され気味だよなあlighttpd。

■etc

Windows標準の「ネットワークプレース」はオレオレ証明書だとNGだったりする。(XPは大丈夫?だったかも。Vistaは駄目)
まあWindows標準のWebDAVクライアント機能はクズなんで、良い子のみんなはCarotDAVとかTeamfileとか使ってください。フリーウェア万歳。

Virtual Host + SSL を使いたいのと、仕事だとアンパイな Apache ばかりで飽きたので、lighttpd を入れる。

■Fedora EPEL リポジトリを設定
Apache 勢力の陰謀なのか、lighttpd パッケージは CentOS で初期設定されているリポジトリにはなくて、Fedora EPEL リポジトリというところにおいてある。以下でリポジトリ設定をインストールし使えるようにする。
ちなみに 32bit 版のひとは x86_64 が i386 に変わるよ


[root@kvm1 ~]# wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
[root@kvm1 ~]# rpm -Uvh epel-release-5-3.noarch.rpm

■lighttpd インストール
ってことで、素直に yum を使いインストール。


[root@kvm1 ~]# yum install lighttpd

■ファイアウォール設定
80と443を通すよう設定してiptables再起動。


[root@kvm1 ~]# vi /etc/sysconfig/iptables
[root@kvm1 ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@kvm1 ~]# service iptables restart
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]
iptables モジュールを読み込み中ip_conntrack_netbios_ns     [  OK  ]

■他のPCなどからアクセステスト
紙飛行機のロゴが出てきたらOK。

いや仮想化百花繚乱だよねー

■仮想化技術ってどんなのがあんのよ
VMware:いけてるんだけど、H/Wを選ぶしOSS臭ゼロだし。
VirtualBox:SunはすきだけどOracleになっちゃったんでちょっと。
Xen:準仮想化いい感じだけど親にも子にもXen用カーネルを要求したりするところがちょっと。
KVM:カーネルに標準でマージされてるんで今後のデファクトっぽいし。仕事でも使ってるし。
ってことで、KVMでいいや。

■KVMの前提条件だよ
使用にあたっては、CPUの仮想化支援機能が必要なんで、Intel の場合は BIOS SETUP で「Virtualization Technology 」をオンにする必要がある。 仮想化支援機能がないCPUでは動きまへん。

■で、まずはホスト(親)OSインストール
CentOS 5.5 (64bit) をフツーに。
固定IP。FirewallとSELinuxは切る。パッケージはGUIとかいらないんで「Base」と「エディタ」と「KVM」だけ。「仮想化」は競合の恐れがあるんで指定しない。(ry

■親)とりあえず全パッケージ最新化


[root@kvm0 ~]# yum -y update

■親)使わんサービスをとめる


[root@kvm0 ~]# chkconfig acpid off
[root@kvm0 ~]# chkconfig atd off
[root@kvm0 ~]# chkconfig auditd off
[root@kvm0 ~]# chkconfig avahi-daemon off
[root@kvm0 ~]# chkconfig bluetooth off
[root@kvm0 ~]# chkconfig cpuspeed off
[root@kvm0 ~]# chkconfig cups off
[root@kvm0 ~]# chkconfig gpm off
[root@kvm0 ~]# chkconfig hidd off
[root@kvm0 ~]# chkconfig ip6tables off
[root@kvm0 ~]# chkconfig irqbalance off
[root@kvm0 ~]# chkconfig mcstrans off
[root@kvm0 ~]# chkconfig microcode_ctl off
[root@kvm0 ~]# chkconfig mdmonitor off
[root@kvm0 ~]# chkconfig netfs off
[root@kvm0 ~]# chkconfig nfslock off
[root@kvm0 ~]# chkconfig pcscd off
[root@kvm0 ~]# chkconfig portmap off
[root@kvm0 ~]# chkconfig readahead_early off
[root@kvm0 ~]# chkconfig readahead_later off
[root@kvm0 ~]# chkconfig restorecond off
[root@kvm0 ~]# chkconfig rpcgssd off
[root@kvm0 ~]# chkconfig rpcidmapd off
[root@kvm0 ~]# chkconfig sendmail off
[root@kvm0 ~]# chkconfig smartd off
[root@kvm0 ~]# chkconfig xfs off
[root@kvm0 ~]# chkconfig yum-updatesd off

再起動。

■親)子供らを野ざらしにする準備
親NICにブリッジ設定。(これやらないと親子間はNAT設定になって子を外からアクセスさせるときメンドイ)
かつ、「virbr0」とかいうNAT用の仮想ブリッジが勝手に作られてるのでこれを消す。


[root@kvm0 ~]# yum -y install bridge-utils
[root@kvm0 ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0
[root@kvm0 ~]# vi /etc/sysconfig/network-scripts/ifcfg-br0
[root@kvm0 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
# Intel Corporation 82566MM Gigabit Network Connection
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.1.240
NETMASK=255.255.255.0
TYPE=Bridge
ONBOOT=yes
[root@kvm0 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
[root@kvm0 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Intel Corporation 82566MM Gigabit Network Connection
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:01:80:68:5D:23
ONBOOT=yes
BRIDGE=br0
[root@kvm0 ~]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 br0
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 br0
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 br0
[root@kvm0 ~]# ifconfig virbr0
virbr0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:468 (468.0 b)

[root@kvm0 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000180685d23       no              eth0
virbr0          8000.000000000000       yes
[root@kvm0 ~]# virsh net-autostart default --disable
ネットワーク default の自動起動設定が解除されました

[root@kvm0 ~]# virsh net-destroy default
ネットワーク default は停止されました

[root@kvm0 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000180685d23       no              eth0

■親)httpdインストール
理由はこのあと仮想マシン作成するときにkickstartで自動インストールをしたいため、ks.cfgファイル参照用に。
iptablesで「-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT」を追加。
ゲストOSへのパケット転送を許可する「-A FORWARD -i br0 -j ACCEPT」も追加。


[root@kvm0 ~]# yum -y install httpd
[root@kvm0 ~]# service httpd start
httpd を起動中:                                            [  OK  ]
[root@kvm0 ~]# chkconfig httpd on
[root@kvm0 ~]# vi /etc/sysconfig/iptables
[root@kvm0 ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -i br0 -j ACCEPT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@kvm0 ~]# service iptables restart
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]
iptables モジュールを読み込み中ip_conntrack_netbios_ns     [  OK  ]

■親)kickstart設定ファイルを作成
IPとホスト名と、ストレージ設定がコメントアウトされてるんでそこを有効に。あと仮想マシンのディスクデバイスは「vda」なので「sda」を「vda」に書き換える。さらに「clearpart」に「–initlabel」オプションを追加。


[root@kvm0 ~]# cp anaconda-ks.cfg /var/www/html/kvm1-ks.cfg
[root@kvm0 ~]# chmod 644 /var/www/html/kvm1-ks.cfg
[root@kvm0 ~]# vi /var/www/html/kvm1-ks.cfg
[root@kvm0 ~]# cat /var/www/html/kvm1-ks.cfg
# Kickstart file automatically generated by anaconda.

install
url --url http://ftp.riken.jp/Linux/centos/5.5/os/x86_64
lang ja_JP.UTF-8
keyboard jp106
network --device eth0 --bootproto static --ip 192.168.1.241 --netmask 255.255.255.0 --gateway 192.168.1.1 --nameserver 8.8.8.8,8.8.4.4 --hostname (ホスト名)
rootpw --iscrypted (ここはパスワード)
firewall --enabled --port=22:tcp
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone --utc Asia/Tokyo
bootloader --location=mbr --driveorder=sda
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
clearpart --all --drives=vda --initlabel
part /boot --fstype ext3 --size=100 --ondisk=vda
part pv.6 --size=0 --grow --ondisk=vda
volgroup VolGroup00 --pesize=32768 pv.6
logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=1000 --grow --maxsize=5248

%packages
@base
@core
@editors
@japanese-support
keyutils
iscsi-initiator-utils
trousers
bridge-utils
fipscheck
device-mapper-multipath

■親)仮想マシン作成!
ホストのIPは192.168.1.240。子は前述のkickstart設定ファイルの通り192.168.1.241ね。


[root@kvm0 ~]# virt-install \
 --connect qemu:///system \
 --name kvm1 \
 --ram 1024 \
 --vcpus=1 \
 --file /var/lib/libvirt/images/kvm1.img \
 --file-size=100 \
 --nographics \
 --os-type=linux \
 --os-variant=virtio26 \
 --accelerate \
 --location='http://ftp.riken.jp/Linux/centos/5.5/os/x86_64' \
 --extra-args='ks=http://192.168.1.240/kvm1-ks.cfg console=tty0 console=ttyS0,115200n8'

あとはコーヒーでもすすりながら自動インストールされるのを待つ。
最近の派手なGUIインストーラと違ってキャラクタベースのインストール進行の様子はなかなかレトロでほのぼのするね。

 Linuxバブルというか、確変時短モード終了。

 「まず最初にWindowsか?Linuxか?」という、ある意味メディアが歪曲したとも言える「無理矢理な対決図式の時代」がやっと終わり、各OSの強み弱みを理解したうえで、目的と制約に合わせたプラットフォーム選択が検討される「地に足ついたマトモな議論の時代」に入ったということなのだろうか。

 「Linuxサーバの成長はかなり鈍化しているようだ。確かにまだ活躍しているが、Windows Serverのように、ERPやCRMから、メッセージング、コラボレーション、さらにファイル/プリントサーバといったコアインフラに至る広範な用途向けとは見なされていない」

Windows Serverにシェアを奪われるLinux(2007年10月29日 ITmediaエンタープライズ)

 初めてWindowsNTを出したときもそうだったし、COMにしろExchangeにしろ、ActiveDirectoryにしろ、毎度ながらMSの考える構想自体はすごいものだったと思う。(UIとか、パクりも多かったが。でも秀逸なパクりは下手なオリジナルよりよほど良い)

 ただMSの難点は、そこから先、完成するまでにいろいろ時間がかかるうえに、お得意のフライング(要するにベータ版戦略みたいなもんだけど、MSの場合はがっつりお金をとっているから非難をあびる。当然だが)で、完成前に評判を落としちゃうから、なんかつまづいているように見えるけど、実は着実に品質をあげて、じわじわと市場に浸透しているのだろうと思われる。

 SQLServerにしてもWindowsの高信頼化にしても、やっと最近になって完成を見たとも感じられるし。

 直近の自分の経験上でも、銀行の勘定系をWindowsで構築したり、万人オーダーの大企業ユーザでActiveDirectory&Exchangeでオフィスインフラを構築したり、ここ1~2年はけっこうMS健闘も目立つ。(あ、全て元同僚がやりました。自分は状況を見聞しただけ)

 また、サーバ単体で言えば、実はLinuxもエンタープライズサポート版を買うと数十万円したり、パッチもけっこう出てるし充てるのもWindowsと同じように難儀だし、ミドルウェアだってOSメジャーバージョンが変わればサポートしません、となるし、本質的な違いはともかく先にあげたような観点では劇的な差は少なくなっている印象もある。
(データで説明できませんすみません)

 Windows&Exchangeのホスティングサービスがウケちゃう時代、格安でブロードバンド&VPNが実現できちゃう時代だから、企業ユースとしては圧倒的に有利なソリューションを揃えたMSに、Googleは「対企業ソリューションの競合相手として」まだまだ進化が必要なのではないかと思う。

 MSにしても、Googleの衝撃があまりに強かったのか、検索だとかポータルだとか、ネット系に無理矢理シフトしようとして過去数年間かなり紆余曲折したけど、あんまり儲かってなさそうなMSNとか、ついでにXboxもテキトーに切り上げて、オフィスインフラに専念したら良いと思う。で、価格が下がれば最高なんだけど。以上、わがまま言い放題ですまんです。