間違いだらけの備忘録

このページの内容は無保証でありこのページの内容によって直接、または間接に損害を受けられたとしても私は責任を取りません。

VMware で Linux を動かした際の時刻のずれを解消する(X無し)

http://webos-goodies.jp/archives/50179807.html

対策として、主に以下の 3 つが提示されています。

カーネルの起動オプションとして "clock=pit" を指定する。(時刻が進む場合の対策)
カーネルの起動オプションとして "nosmp noapic nolapic" を指定する。(時刻が遅れる場合の対策)
タイマー割り込みの間隔が "/usr/src/linux-2.6/include/asm-i386/param.h" 内の "HZ" マクロで定義されているので、それを "100" に変更してコンパイルする。

基本的に仮想マシンの CPU がひとつのときは (1) と (2) を、CPU 数を 2 にしているときは (1) と (3) を適用するのがよいようです。

時刻同期目的であれば、vmware-guestdを動かしておけばOKなはずです。
Linuxゲストであれば、VMwareToolsをインストールすると起動スクリプト"/etc/init.d/vmware-tools"が導入されますので、chkconfigで有効にしてください。

Knowledge Base では、これに加えて VMwareTools の時刻同期を使用するように勧めています。しかし、X がないので設定ができない orz。

VMware Tools をインストールした後で、
.vmx ファイルに以下の設定を追加してみて下さい。

tools.syncTime = "TRUE"

X Window 上で設定しなくても、これで同じ効果があります。

ほほー
追記
knokさんからコメントがあったvmware-nisetoolsのvmware-timesyncdを使う方法を調査してみた。
http://www.morishima.net/~naoto/fragments/archives/2005/02/#a000061

以下の手順でとりあえず5秒置きにホストの時間に同期することを確認した。
knokさんありがとうございました。


環境:Debian Serge@VMware Workstation5.5.1 for Windows

手順

$ wget ftp://ftp.morishima.net/pub/morishima.net/naoto/VMware-NiseTools/vmware-nisetools-0.2.1.tar.gz
$ tar xvzf vmware-nisetools-0.2.1.tar.gz
$ cd vmware-nisetools-0.2.1/
$ ./configure
$ vmware-synctimed.cの修正(後述)
$ make vmware-synctimed
$ make install-sbinPROGRAMS
$ su
# ./vmware-synctimed -d

diff -ur vmware-nisetools-0.2.1.org/vmware-synctimed.c vmware-nisetools-0.2.1/vmware-synctimed.c
--- vmware-nisetools-0.2.1.org/vmware-synctimed.c       2004-08-27 02:49:09.000000000 +0900
+++ vmware-nisetools-0.2.1/vmware-synctimed.c   2006-12-05 14:07:51.000000000 +0900
@@ -42,6 +42,7 @@

 #include <sys/types.h>
 #include <sys/time.h>
+#include <time.h>

 #include <vmbackdoor.h>

適当に起動スクリプトを作って

$ cat /etc/init.d/vmware-synctime
#!/bin/sh

PATH=/usr/local/sbin:/sbin:/usr/bin/

test -f /usr/local/sbin/vmware-synctimed || exit 0
test -f /usr/bin/killall || exit 0

case "$1" in
start|force-reload|restart|reload)
  killall vmware-synctimed 2>/dev/null
  echo -n "Running vmware-synctimed to synchronize clock"
  vmware-synctimed -d
  echo "."
  exit 0
  ;;
stop)
  killall vmware-synctimed
  exit 0
  ;;
*)
  echo "Usage: /etc/init.d/ntpdate {start|stop|restart|reload|force-reload}"
  exit 1
esac

exit 0

rcconfして終了。

VMware WorkStation持ってるならVMwaretools使えば?というツッコミは却下。

さらに追記
vmware-guestdを起動したら一気に時間修正されたが、
微妙にホストから遅れているのが気になる。
vmware-nisetoolsの方が荒技だがいいのかもしれない。

追記:
x86_64だと下記エラーだったので、若干修正

# make vmware-synctimed
gcc -g -O2 -c vmbackdoor.s
vmbackdoor.s: Assembler messages:
vmbackdoor.s:38: Error: suffix or operands invalid for `push'
(中略)
vmbackdoor.s:62: Error: suffix or operands invalid for `pop'
make: *** [vmbackdoor.o] エラー 1

i386/x86_64 Linux:

# cat niseinst.sh
wget ftp://ftp.morishima.net/pub/morishima.net/naoto/VMware-NiseTools/vmware-nisetools-0.2.1.tar.gz
tar xvzf vmware-nisetools-0.2.1.tar.gz
cd vmware-nisetools-0.2.1/
CFLAGS="-g -O2 -m32" ./configure
patch -f << EOS
--- vmware-synctimed.c.org      2006-12-04 00:00:00.000000000 +0900
+++ vmware-synctimed.c  2006-12-04 00:00:00.000000000 +0900
@@ -39,6 +39,7 @@
 #include <string.h>
 #include <signal.h>
 #include <getopt.h>
+#include <time.h>

 #include <sys/types.h>
 #include <sys/time.h>
EOS
make vmware-synctimed
cp vmware-synctimed /usr/local/sbin/
grep vmware-synctimed /etc/rc.local || echo '/usr/local/sbin/vmware-synctimed &' >> /etc/rc.local
tail /etc/rc.local
/usr/local/sbin/vmware-synctimed &

i386 Linux

# cat niseinst.sh
wget ftp://ftp.morishima.net/pub/morishima.net/naoto/VMware-NiseTools/vmware-nisetools-0.2.1.tar.gz
tar xvzf vmware-nisetools-0.2.1.tar.gz
cd vmware-nisetools-0.2.1/
./configure
patch -f << EOS
--- vmware-synctimed.c.org      2006-12-04 00:00:00.000000000 +0900
+++ vmware-synctimed.c  2006-12-04 00:00:00.000000000 +0900
@@ -39,6 +39,7 @@
 #include <string.h>
 #include <signal.h>
 #include <getopt.h>
+#include <time.h>

 #include <sys/types.h>
 #include <sys/time.h>
EOS
make vmware-synctimed
cp vmware-synctimed /usr/local/sbin/
grep vmware-synctimed /etc/rc.local || echo '/usr/local/sbin/vmware-synctimed &' >> /etc/rc.local
tail /etc/rc.local
/usr/local/sbin/vmware-synctimed &

ここまでやるならパッケージにすべきかな..

このページにはhatena以外のサービスからのコンテンツが埋め込まれています。 hatenaによりGoogle AdSense 広告が埋め込まれています。