CentOS 5.2にOpenNMSをインストール

OpenNMSはJavaで書かれたウェブベースの監視ツール。pingやコネクションベースの死活監視やSNMPノードであれば性能監視もおこなえる。
ApacheのStatusモジュールで得られる情報や、JMXを使ってTomcat等のサーブレットコンテナの情報が収集できるところが特徴的。
データはRRDtoolと同様の方式で累積されるようだ(RRDtoolをJavaで実装してるっぽい)。
OpenNMS自体はJetty同梱版での単独動作させるか、もしくはTomcat等にデプロイして動かす。

今回はJetty同梱版をインストール。こちらのページに従えばおおよそ大丈夫。
Installation:Yum - OpenNMS

ソフトウェアのインストール

  • OpenNMS本体
    # rpm -Uvh http://yum.opennms.org/repofiles/opennms-repo-stable-rhel5.noarch.rpm
    # yum -y install opennms
    
  • PostgreSQL
    # yum -y install postgresql-server
    
  • iplike
    # yum -y install iplike.x86_64
    

    x86_64環境にi386版も導入すると、後述のinstall_iplike.shスクリプトが正しく動作しないので注意(libdirが/usr/lib64ではなく/usr/libになってしまうため)。

PostgreSQLの設定

  • ローカルアカウントでのアクセスを信頼するようにpg_hba.conf修正
     local   all         all                               trust
     host    all         all         127.0.0.1/32          trust
     host    all         all         ::1/128               trust
    

    とりあえずOpenNMSのインストールドキュメントにしたがってやっているが、実際にはもう少し制限したほうがいいと思う(opennmsデータベースだけtrustにするとか)。

  • データベース作成
    # service postgres start
    # su - postgres
    $ createdb -U postgres -E UNICODE opennms
    $ exit
    
  • iplike functionのインストール
    # su - postgres
    $ install_iplike.sh
    $ exit
    
  • Javaのパス設定
    # /opt/opennms/bin/runjava -S /usr/java/jdk1.5.0_15/bin/java
    
  • データベースの中身を作成
    # su - postgres
    $ /opt/opennms/bin/install -dis -l /usr/lib64
    $ exit
    

OpenNMSサービスを開始

# service opennms start
# chkconfig opennms on

管理画面(http://localhost:8980/opennms/)には、user=admin、password=adminでログインできる。

virt-installで仮想マシンをお手軽セットアップ

CentOS 5.2のDomain-0上にCentOS 5.2をインストール。ディスクにイメージファイルを使う場合、virt-installで非常に簡単。

# vitrt-isnstall
Would you like a fully virtualized guest (yes or no)?  This will allow you to run unmodified operating systems. no
What is the name of your virtual machine? centos5
How much RAM should be allocated (in megabytes)? 512
What would you like to use as the disk (file path)? /var/lib/xen/images/centos5-sda.img
How large would you like the disk (/var/lib/xen/images/centos5-sda.img) to be (in gigabytes)? 8
Would you like to enable graphics support? (yes or no) no
What is the install location? http://mirror.centos.org/centos/5/os/x86_64/

ここまで答えればあとはインストーラが起動する。
"Would you like a fully virtualized guest (yes or no)?"にnoを答えれば準仮想化、すなわちXenのDomain-Uになる。
ディスクイメージはSELinuxを有効にしている場合/var/lib/xen/imagesに配置するのが無難らしい。
準仮想化の場合、install location配下のimages/xen/vmlinuzカーネルでブートするようなので、Fedora 9でもいけるかもしれない。

以下はML115 G5でのインストーラ起動までのブートログ。

Starting install...
Retrieving file .treeinfo 100% |=========================|  417 B    00:00
Retrieving file vmlinuz.. 100% |=========================| 1.9 MB    00:03
Retrieving file initrd.im 100% |=========================| 5.7 MB    00:08
Creating storage file...  100% |=========================| 8.0 GB    00:00
Creating domain...                                                 0 B 00:01
Bootdata ok (command line is   method=http://mirror.centos.org/centos/5/os/x86_64/)
Linux version 2.6.18-92.el5xen (mockbuild@builder10.centos.org) (gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)) #1 SMP Tue Jun 10 19:20:18 EDT 2008
BIOS-provided physical RAM map:
Xen: 0000000000000000 - 0000000020800000 (usable)
No mptable found.
Built 1 zonelists.  Total pages: 133120
Kernel command line:   method=http://mirror.centos.org/centos/5/os/x86_64/
Initializing CPU#0
PID hash table entries: 4096 (order: 12, 32768 bytes)
Xen reported: 2299.998 MHz processor.
Console: colour dummy device 80x25
Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
Software IO TLB disabled
Memory: 499968k/532480k available (2414k kernel code, 23744k reserved, 1349k data, 176k init)
Calibrating delay using timer specific routine.. 5756.12 BogoMIPS (lpj=11512251)
Security Framework v1.0.0 initialized
SELinux:  Initializing.
selinux_register_security:  Registering secondary module capability
Capability LSM initialized as secondary
Mount-cache hash table entries: 256
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
CPU: L2 Cache: 512K (64 bytes/line)
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 1
(SMP-)alternatives turned off
Brought up 1 CPUs
checking if image is initramfs... it is
Grant table initialized
NET: Registered protocol family 16
ACPI Exception (utmutex-0262): AE_BAD_PARAMETER, Thread 1E7A0 could not acquire Mutex [2] [20060707]
No dock devices found.
ACPI Exception (utmutex-0262): AE_BAD_PARAMETER, Thread 1E7A0 could not acquire Mutex [2] [20060707]
Brought up 1 CPUs
PCI: Fatal: No PCI config space access function found
PCI: setting up Xen PCI frontend stub
ACPI: Interpreter disabled.
Linux Plug and Play Support v0.97 (c) Adam Belay
pnp: PnP ACPI: disabled
xen_mem: Initialising balloon driver.
usbcore: registered new driver usbfs
usbcore: registered new driver hub
PCI: System does not support PCI
PCI: System does not support PCI
NetLabel: Initializing
NetLabel:  domain hash size = 128
NetLabel:  protocols = UNLABELED CIPSOv4
NetLabel:  unlabeled traffic allowed by default
NET: Registered protocol family 2
IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
TCP: Hash tables configured (established 131072 bind 65536)
TCP reno registered
audit: initializing netlink socket (disabled)
audit(1230701013.253:1): initialized
VFS: Disk quotas dquot_6.5.1
Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
Initializing Cryptographic API
ksign: Installing public key data
Loading keyring
- Added public key 52394A11B61A91
- User ID: CentOS (Kernel Module GPG key)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
pci_hotplug: PCI Hot Plug PCI Core version: 0.5
rtc: IRQ 8 is not free.
Non-volatile memory driver v1.2
Linux agpgart interface v0.101 (c) Dave Jones
RAMDISK driver initialized: 16 RAM disks of 16384K size 4096 blocksize
Xen virtual console successfully installed as xvc0
Event-channel device installed.
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
ide-floppy driver 0.99.newide
usbcore: registered new driver hiddev
usbcore: registered new driver usbhid
drivers/usb/input/hid-core.c: v2.6:USB HID core driver
PNP: No PS/2 controller found. Probing ports directly.
i8042.c: No controller found.
mice: PS/2 mouse device common for all mice
md: md driver 0.90.3 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: bitmap version 4.39
TCP bic registered
Initializing IPsec netlink socket
NET: Registered protocol family 1
NET: Registered protocol family 17
XENBUS: Device with no driver: device/vbd/51712
XENBUS: Device with no driver: device/vif/0
Write protecting the kernel read-only data: 461k

Greetings.
anaconda installer init version 11.1.2.113 starting
mounting /proc filesystem... done
creating /dev filesystem... done
mounting /dev/pts (unix98 pty) filesystem... done
mounting /sys filesystem... done
anaconda installer init version 11.1.2.113 using /dev/xvc0 as console
trying to remount root filesystem read write... done
mounting /tmp as ramfs... done
running install...
running /sbin/loader

xrdpでグラフィカルログイン

ディスプレイをもたないDebian sidにリモートデスクトップで接続できるようxrdpをセットアップした。
とはいってもxrdpとvncserver、それに実際にデスクトップ環境として使うパッケージをインストールするだけ。

# aptitude install xrdp
# aptitude install vnc4server
# aptitude install gnome-session gnome-terminal metacity
# env -i /etc/init.d/xrdp start

これでWindows PCのリモートデスクトップ接続を使ってDebianに接続できるようになる。
xrdpは裏でsesmanというプログラムを使ってVNCサーバであるXvncを起動しているのだが、接続時の指定に従ってXvncの起動オプション、-geometryや-depthを変えてくれるので便利(デフォルト定義のSesman-Xvncを使う場合)。
また、xrdpはVNCサーバへのProxyのように動作し、xrdpまでの通信はRSAで暗号化されるようになっているため、VNCサーバに素で接続するよりも安全性が高い(たぶん)。

何より、gdm等のディスプレイマネージャやVNC接続をセットアップする方法よりも簡単だと思った。接続用クライアントもWindows標準のもので済むし。

Domain-U DebianをLVMパーティションに作成

CentOS 5.2のXen環境にDomain-U Debian(sid)を構築してみた。
ディスクはイメージファイルではなく、論理ボリューム区画を割り当てている。
論理ボリューム区画にしてみたのは、将来ディスク領域が不足したときDomain0で割り当てを増やし(lvextend)、DomainUでファイルシステムをオンラインリサイズ(ext2online)できないものかと考えたから。

論理ボリュームの割り当てとフォーマット

vg00はCentOSセットアップ時に作成したボリュームグループ。

# lvcreate -L 96M -n debian_boot vg00
# lvcreate -L 1024M -n debian_swap vg00
# lvcreate -L 8192M -n debian_root vg00
# mke2fs -j /dev/vg00/debian_boot
# mke2fs -j /dev/vg00/debian_root
# mkswap /dev/vg00/debian_swap

論理ボリュームをマウント

# mkdir /mnt/debian
# mount /dev/vg00/debian_root /mnt/debian
# mkdir /mnt/debian/boot
# mount /dev/vg00/debian_boot /mnt/debian/boot

debootstrapコマンドの準備

debootstrapコマンドをインストール。rpmパッケージ管理外のファイルが/usr/binや/usr/lib直下に配置されるが良しとする。

# cd /usr/local/src
# wget -N http://ftp.debian.org/debian/pool/main/d/debootstrap/debootstrap_0.3.3.2_all.deb
# yum -y install binutils
# ar -x debootstrap_0.3.3.2_all.deb
# cd /
# zcat /usr/local/src/data.tar.gz | tar xvp

Debianインストール

debootstrapコマンドで論理ボリューム上にDebianをインストール。

# /usr/sbin/debootstrap --arch amd64 sid /mnt/debian http://ftp.jp.debian.org/debian

セットアップ

セットアップのためインストールしたDebianにchrootする。

# chroot /mnt/debian
# mount -t proc proc /proc
  • /etc/fstab作成
    # /etc/fstab: static file system information.
    #
    /dev/sda1    /boot   ext3    ro,nosuid,nodev         0 2
    /dev/sda2    /       ext3    defaults                0 1
    /dev/sda3    none    swap    sw                      0 0
    proc         /proc   proc    defaults                0 0
    
  • kernelイメージインストール
    # aptitude install linux-image-xen-amd64
    
  • /etc/inittabにXen用コンソール定義追加
    以下を追加。ラベルは重複しないものを適当に割り当てた。
    h0:12345:respawn:/sbin/getty 38400 hvc0
    x0:12345:respawn:/sbin/getty 38400 xvc0
    

    ちなみにDebian sidの場合、hvcもxvcも/etc/securettyには定義済み(以下、抜粋)。

    # Standard hypervisor virtual console
    hvc0
    
    # Oldstyle Xen console
    xvc0
    
  • /boot/grub/grub.conf作成
    boot=/dev/sda
    default=0
    timeout=5
    #splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title Debian (2.6.26-1-xen-amd64)
            root (hd0,0)
            kernel /vmlinuz-2.6.26-1-xen-amd64 ro root=/dev/sda2 xencons=xvc console=xvc0
            initrd /initrd.img-2.6.26-1-xen-amd64
    

    kernelパラメータにXen用コンソール定義、xvcを追加している。

  • /boot/grub/menu.lst作成(grub.confにシンボリックリンク)
    # cd /boot/grub
    # ln -s grub.conf menu.lst
    
  • /boot/grub/device.map作成
    (hd0)   /dev/sda
    
  • DomainU設定ファイル作成

    /etc/xen/debianで作成

    name = "debian"
    uuid = "4917533f-38ac-4650-a342-dd468650b2d3"
    maxmem = 384
    memory = 384
    vcpus = 1
    bootloader = "/usr/bin/pygrub"
    disk = [ 'phy:vg00/debian_boot,sda1,w',
             'phy:vg00/debian_root,sda2,w',
             'phy:vg00/debian_swap,sda3,w' ]
    vif = [ "mac=00:16:3e:27:ea:aa,bridge=xenbr0" ]
    on_poweroff = 'destroy'
    on_reboot   = 'restart'
    on_crash    = 'restart'
    

    uuidはuuidgenを使って生成。
    vifのMACアドレスは『19.22. MAC アドレス生成の為のスクリプト作成』に掲載されているmacgen.pyスクリプトを用意して生成。

    最初の目的であるファイルシステム拡張がおこなえるかどうかは後日。

    参考サイト

    HP ML115 G5にVMware ESXiをインストール

    格安サーバのHP ML115 G5にVMware ESXi(Version 3.5 Update 3 | 123629 - 11/06/08)をインストールしてみた。
    巷で見かけるUSBメモリをブートデバイスにして動かす方法ではなく、インストール途中でチェックスクリプトを書き換えて
    ハードディスクに無理やりインストールしてしまう方法。

    当然のことながらベンダーの動作保証外だし、今後のアップグレードを無事おこなっていけるかも含めて無保証。

    • インストールメディアを用意して起動。
    • Welcome screenが表示されたらInstallに進まずに、Alt+F1を押してターミナルに切り替える。
    • ログインプロンプトが表示されているので、ユーザー:root、パスワード:空でログインする。
    • インストーラのpythonプロセスをkillする。
    • エディタ(viが使えます)で/usr/lib/vmware/installer/Core/TargetFilter.pyの73行目(IDEFilterのところ)を以下のとおり書き換える。
      return interface.GetInterfaceType() == ScsiInterface.SCSI_IFACE_TYPE_IDE
      ↓
      return interface.GetInterfaceType() == ScsiInterface.SCSI_IFACE_TYPE_ISCSI
      
    • インストーラを起動する。
      /sbin/install
      
    • あとは普通にインストールできると思う。

      こちらのサイトを参考にさせていただいた。
      VMware ESXi on an HP Proliant ML115 G5 at Tom’s FreeBSD blog

      ■2008-12-30追記
      このあと再インストールを試みたが、スクリプト変更後に起動したインストーラの画面表示がうまくおこなわれず、先に進めなかった orz
      最初だけうまくいったのは偶然だったのか Puzzled
      ISOイメージに含まれるinstall.tgzに含まれるスクリプトを予め変更しておいて、途中で中断せずに進めたほうが確実かもしれない。どっちにせよ無保証だが。

    sqlite3-rubyのアップデート失敗(Windows)

    sqlite3-rubyのgem updateを実行してみたらnmakeがないと言われて失敗してしまう。

    C:\ruby\bin>gem update sqlite3-ruby
    Updating installed gems
    Updating sqlite3-ruby
    Building native extensions.  This could take a while...
    ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
        ERROR: Failed to build gem native extension.
    
    C:/ruby/bin/ruby.exe extconf.rb update sqlite3-ruby
    checking for fdatasync() in rt.lib... no
    checking for sqlite3.h... no
    
    nmake
    'nmake' は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    
    
    Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4 for inspection.
    Results logged to C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4/ext/sqlite3_api/gem_make.out
    

    Visual Studio 2008 Expressは入れてあるのだがnmakeにパスを通しただけではうまくいかない。

    C:\ruby\bin>"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
    Setting environment for using Microsoft Visual Studio 2008 x86 tools.
    
    C:\ruby\bin>gem update sqlite3-ruby
    Updating installed gems
    Updating sqlite3-ruby
    Building native extensions.  This could take a while...
    ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
        ERROR: Failed to build gem native extension.
    
    C:/ruby/bin/ruby.exe extconf.rb update sqlite3-ruby
    checking for fdatasync() in rt.lib... no
    checking for sqlite3.h... no
    
    nmake
    
    Microsoft(R) Program Maintenance Utility Version 9.00.30729.01
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    NMAKE : fatal error U1073: 'ruby.h' のビルド方法が指定されていません。
    Stop.
    
    
    Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4 for inspection.
    Results logged to C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4/ext/sqlite3_api/gem_make.out
    

    どうやらsqlite自体のヘッダーファイルなど、ビルド環境を整えないといけないらしいが、そこまでやるのも大変だ。
    で、いろいろ調べてみるとバイナリが提供されているバージョン番号を指定すればうまくいくことがわかった。

    C:\ruby\bin>gem install sqlite3-ruby --version=1.2.3
    Successfully installed sqlite3-ruby-1.2.3-x86-mswin32
    1 gem installed
    Installing ri documentation for sqlite3-ruby-1.2.3-x86-mswin32...
    Installing RDoc documentation for sqlite3-ruby-1.2.3-x86-mswin32...
    
    C:\ruby\bin>
    

    ビルドされたバイナリが提供されているかどうかは、RubyForge: SQLite-Ruby: ファイルリストで、*-mswin32.gemなファイルがあるか否かでわかる(のだと思う)。

    VMware Server 2.0のDHCPサーバIPアドレス

    VMware Server 2.0をインストールして、VMnet1のN/Wアドレスを変更したのだが、DHCPで割り当てられるIPアドレスがどうしても変わらない。やった内容は

    • ネットワーク接続でVMware Virtual Ethernet Adapter for VMnet1のTCP/IPプロパティでIPアドレスを変更
    • スタートメニューのVMware->VMware Server->Manage Virtual NetworksでSubnetやDHCPアドレスレンジを変更

    ちょっとレジストリを眺めていたらDHCPサーバ自体のIPアドレスがレジストリで設定されているようだ。

    VMnetDHCP ParametersVMnetDHCP Parameters

    HKLM\SYSTEM\CurrentControlSet\Services\VMnetDHCP\Parameters\VirtualEthernetSegments\1のHostIpAddressがそれで、DHCPサーバのIPアドレスを16進にして順序を逆にした値になっている。
    0x017ea8c0なので、c0.a8.7e.01、すなわち192.168.126.1。

    今回は3オクテット部分を126から80に192.168.10.1に変更したかったので、0x010aa8c0に変更してみたのだが、それだけではVMnetDHCPサービスが起動しなくなってしまった。イベントログには以下のメッセージ。

    No subnet declaration for VMnet1 (192.168.10.1). Please write a subnet declaration for the network segment to which interface VMnet1 is attached.

    結局C:\Documents and Settings\All Users\Application Data\VMware\vmnetdhcp.confのsubnet定義をごっそり変更しないとダメだった。

    Manage Virtual NetworksのGUIは何のためにあるんだろ Puzzled

    mod_jkでのsticky_session

    mod_jkでlbワーカを使う場合、セッションによって振り分け先を固定化するためにsticky_sessionという属性が用意されている(デフォルトtrue)。実際のところ、どういう動きになるのかソースを追ってみた。

    sticky_sessionパラメータを参照しているのは、jk/native/common/jk_lb_worker.cのJK_METHOD service()部分のここらへん。

        if (p->worker->sticky_session) {
            /* Use sessionid only if sticky_session is
             * defined for this load balancer
             */
            sessionid = get_sessionid(s, p->worker, l);
        }
    

    get_sessionid()もjk_lb_worker.cで実装されていて、以下のようになっている。

        val = get_path_param(s, p->session_path);
        if (!val) {
            val = get_cookie(s, p->session_cookie);
        }
    

    URLパスからsession_path入手を試み、ダメならsession_cookieから値を設定している。
    この時点でURLパスに含まれるsession_path値のほうがsession_cookieよりも優先されることが判明。

    ちなみにget_path_param()もget_cookie()もjk_lb_worker.cで実装されていて、get_path_param()のほうはURLパスからp->session_pathで始まる値の"="以降、終端(?か;か\0)までを返すようになっている。get_cookie()も似たような処理なので割愛。

    次にget_sessionid()で入手したsessionidは

    rec = get_most_suitable_worker(s, p->worker, sessionid, p->states, l);
    

    で一致するsessionidを探し、なければfind_best_worker()でワーカを決定するようになっている。

    なんとなく動きはわかったものの、JSESSIONIDという文字列がどこにも出現しないので、今度はそちらを追いかけてみることに。
    JSESSIONIDはjk/native/common/jk_global.hの中でJK_SESSION_IDENTIFIERとして定義されている。

    JK_SESSION_IDENTIFIERを参照してるのはjk_lb_worker.cのjk_get_lb_session_cookie()呼び出し部分。

        strncpy(p->session_cookie,
                jk_get_lb_session_cookie(props, p->name, JK_SESSION_IDENTIFIER),
                JK_SHM_STR_SIZ);
        strncpy(p->session_path,
                jk_get_lb_session_path(props, p->name, JK_PATH_SESSION_IDENTIFIER),
                JK_SHM_STR_SIZ);
    

    jk_get_lb_session_cookie()はjk/native/common/jk_util.cで定義されていて、JK_SESSION_IDENTIFIERはjk_map_get_string()にそのまま渡している。

    jk_map_get_string()は、結局MAKE_WORKER_PARAM(SESSION_COOKIE_OF_WORKER)マクロでworker.ワーカ名.session_cookieの設定値(デフォルト"JSESSIONID")を返すようになっていた。

    jk_get_lb_session_path()もほぼ同じでMAKE_WORKER_PARAM(SESSION_PATH_OF_WORKER)によりworker.ワーカ名.session_path設定値(デフォルト";jsessionid")を返す。

    結局のところ、こちらは両方ともworker.propertiesでの設定値かデフォルト値かを設定しているだけ。

    ここで設定されたキー(p->session_path=";jsessionid"かp->session_cookie="JSESSIONID")をベースに最初に出てきたget_most_suitable_worker()で振り分け先を決定している、ということになる。

    メモ帳での保存時文字コード比較

    Windowsのメモ帳で「a + 改行 + b」というデータを保存し、Cygwinでod -xしてみた結果。

    • "ANSI"で保存
      0000000 0d61 620a
      0000004
    • "Unicode"で保存 (UTF-16/UCS-2, little endien)
      0000000 feff 0061 000d 000a 0062
      0000012
    • "Unicode big endian"で保存 (UTF-16/UCS-2, big endien)
      0000000 fffe 6100 0d00 0a00 6200
      0000012
    • "UTF-8"で保存
      0000000 bbef 61bf 0a0d 0062
      0000007

    メモ帳のUTF-8ってBOMつきだったのですね。また、Windowsの内部表現にはUTF-16が使われているそうです(保存形式"Unicode"のBOMなし)。

    UTF-16 - Wikipediaより引用:

    UTF-16符号化形式は、WindowsXPなど多くのOSで、内部表現に使われている。

    Microsoft Windowsでは、リトルエンディアンのUTF-16符号化方式が使われている。内部表現では16ビット符号なし整数を符号単位するUTF-16符号化形式(CEFなのでBOMはなし)として扱い、ファイルなどではBOMありのUTF-16符号化方式(リトルエンディアン)が主である。

    参考:

    iBook G3にNetBSD/macppcをインストール

    NetBSD 4.0.1をiBook G3にインストールしたときのメモ。結構面倒でした。

    1. Command-Option-O-FでOpen Firmwareにする。
    2. Open Firmwareから以下のコマンドでインストーラCDからブート。
      0 > boot cd:,\ofwboot.xcf netbsd.macppc
      
    3. インストールではなくShellを起動し、pdiskでHFS含めたパーティションを作成。
      # pdisk /dev/wd0c
      
    4. sysinstを実行してインストールを開始。パーティションは作り直さない。
    5. インストール先のディスクをmountしchrootする。
      # mount /dev/wd0a /targetroot
      # chroot /targetroot
      
    6. hfsutilsパッケージをサイトから入手するためにN/W設定。
      # ifconfig gem0 192.168.0.51 netmask 0xffffff00
      # route add default 192.168.0.1
      # echo "nameserver 192.168.0.1" > /etc/resolv.conf
      

      インストール用カーネルではbpfが有効になっていないようで、dhclientは使えなかった。

    7. hfsutilsパッケージを入れる。
      # PKG_PATH=http://ftp.netbsd.org/pub/NetBSD/packages/4.0/macppc/All
      # export PKG_PATH
      # pkg_add hfsutils
      
    8. ofwbootをHFSパーティション(wd0d)にコピーする。
      # /usr/pkg/bin/hformat /dev/wd0d
      # /usr/pkg/bin/hmount /dev/wd0d
      # /usr/pkg/bin/hcopy /usr/mdec/ofwboot.xcf :
      # /usr/pkg/bin/humount
      
    9. リブートしてOpen Firmwareから以下のコマンドを実行。
      0 > boot hd:2,\ofwboot.xcf hd:3/netbsd
      

      wd0dからofwboot.xcfを読み込んで、wd0aからカーネルを読み込ませていることになります。

      基本的なことは
      October 5, 2008 INSTALL 8 NetBSD
      NetBSD/macppc Frequently Asked Questions
      に書かれているはずなのに、わかりにくかった(とくにofwbootを配置するHFSパーティションが必要だ、って部分)。

      あと、Open Firmwareのリファレンスはこちらでよいのかな。
      Open Firmware Quick Reference

      ■2008-10-27追記
      インストール後のブート時カーネルファイル指定はhd:3,/netbsdではなく、hd:3/netbsdが正解でした。","が余計だったようです。上のメモも直してあります。ofwbootのmanページをみて気がつきました。情けない。
      またpkg_addでhfsutilsをインストールする際の手順も若干変更しています。