開発環境の見直し。

「Byte range lock とは何ぞや???」

結論から言うと、その方面に詳しくないので全然わからない。検索結果を拾い読みしていくと、ファイル全体をロックするのではなく、バイト単位で範囲を指定してロックする、というものらしい。

事の始まりは、開発環境を一新したことがきっかけだった。

長年 Windowsユーザーである私は、Win32版のApache/MySQL/Perl,PHP(俗にいうWAMP環境)をセットアップして使ってきた。しかし、これらサーバー類のWindows版とLinuxなどのUNIX互換OS上のそれらとの挙動の違いなどが最近非常に気になり出しはじめ、その違いを吸収するようなコードをアプリケーションに組み込む量が多くなってきた。本来なら必要のないコード。

で、ApacheやMySQLなどのWindows版を使うのをやめ、Hyper-Vの仮想マシン(内部仮想スイッチ+WinNATで外に出るよう構築)にサーバー類を移すことにした。幸いここ数年 CentOSをいじるようになってきたのでLinuxサーバーの構築は慣れているので開発環境の移行は結構すんなりできた。

仮想化ソフトは色々あるんですが・・・まぁある程度のスペックのPCとWindows8.1以降なら迷わずWindowsに標準でついてくるHyper-V がベストだと思います。

仮想マシンを立ち上げるには、 Powershell(要権限昇格) を使うとスマート。GUIなHyperVマネージャは仮想マシン作るときだけでいいかなと。

仮想マシンの列挙
>> Get-VM

起動とシャットダウンは・・・
>> Start-VM -Name CentOS7
>> Stop-VM -Name CentOS7

コンソールにアクセスしたければ、vmconnectを実行
>> vmconnect localhost CentOS7 

もし仮想マシンがWindowsなら、リモートデスクトップで立ち上げとか。
>> mstsc /v:仮想マシンのIPアドレス

しかし、ファイルの編集などは使い慣れた Windows上のエディタ環境を使いたいしソース管理もTortoiseSVNで引き続き行いたいので、仮想マシン上に cifs-utilsをyumでインストール。Windows上のDドライブをまるごと共有し、Linux側から マウントさせ、そのディレクトリをhttpd.confで適切なURLにマッピングしてやれることでWindows上でファイルを編集しつつ、そのコードは仮想マシン上のLAMPで動くという、理想的な環境のできあがり。
図にすると、下記のような感じ。

実際に、構築して使ってみると、これが快適すぎて、もっと早くにしとけばよかった。仮想マシンをエクスポートしてバックアップしとけばPC買い替えたときもラク。

はじめ仮想スイッチを内部専用にしたせいで仮想マシン側からホスト外にアクセスできず困ってたんですが・・・PowerShellの下記コマンドでNATを設置?することで解決。

PS>> New-NetNat -Name VMNatNetwork -InternalIPInterfaceAddressPrefix 10.0.0.0/24

確認には、
PS >> Get-NetNat | fl *
Store                            : Local
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpInboundRefresh                : False
Active                           : True
Caption                          :
Description                      :
ElementName                      :
InstanceID                       : VMNatNetwork;0
ExternalIPInterfaceAddressPrefix :
IcmpQueryTimeout                 : 30
InternalIPInterfaceAddressPrefix : 10.0.0.0/24
InternalRoutingDomainId          : {00000000-0000-0000-0000-000000000000}
Name                             : VMNatNetwork
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
UdpIdleSessionTimeout            : 120
PSComputerName                   :
CimClass                         : root/StandardCimv2:MSFT_NetNat
CimInstanceProperties            : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties              : Microsoft.Management.Infrastructure.CimSystemProperties

しかし、問題が一つ。Windows側に置いておいた SQLiteのデータベースファイルに読むことはできても、変更(書き込み)することが一切できなくなっていた。どうやら仮想マシン上のPHP等から CIFS経由で変更しようとすると、ロックされてタイムアウトしてしまう事象が発生。

いろいろ調べた結果、どうやら 仮想マシンのCentOSからCIFS でホスト上の共有フォルダをマウントする際に、Byte range lock を無効しないとロックされてアクセスできないよー的な記事(ほとんど英語だらけの外国の方の記事ばっかりヒットする)を見つけ、下記のように /etc/fstab に記述すると解決できた。

/etc/fstab  -----

//10.0.0.1/Devel  /mnt/devel cifs user=nakagawa,password=xxxxxx,uid=nakagawa,gid=admin,nobrl,defaults  0 0

ポイントは、nobrl というオプション。これをつけるとバイト範囲のロックを無効にする・・・らしい。が、意味は分からんが、とりあえず、SQLiteファイルの変更中(書込み処理)ロックされることはなくなった。

めでたし、めでたし。

※追記)
Windows API の LockFile/LockFileEx とか、Linuxとかだとfcntl とか? で CIFSマウントされたディレクトリ内のファイルの「byte range lock」に対応していないってことなのかな・・・う~む?