LinuxからHFS+ボリュームを読み書きする (HFS+ as cross-platform file system)

以前のエントリ「Mac OS XからNTFSパーティションを読み書きする - MacFUSE + NTFS-3G」において、クロスプラットフォームなファイルシステムとしてNTFSを検討してみましたが、Mac OS XにおけるNTFS-3Gのパフォーマンスがよくないという問題がありました。Mac版NTFS-3Gの改善を待つという手もありますが、他の方法を検討してみたところMac OS Xがネイティブで使用しているHFS+も候補として悪くないことが分かりました。

最近のLinuxカーネルは(少なくとも現在試用しているFedora 7では問題なく)、デフォルトでHFS+パーティションのマウントと読み書きに対応しています。しかも、パフォーマンスに関しても全く問題なく、手元にあるUSB外付けHDで、30MB/s程スピードでファイルの書き込みができました。漢字のファイル名についても、Linux側でロケールをja_JP.UTF-8にしている限りは問題ありません。

一方、WindowsはデフォルトではHFS+ボリュームのマウントはできませんが、Mediafour MacDrive ($49.95)をWindowsにインストールすることで、HFS+の読み書きを問題なく行うことができます。私はちょっと古いMacDrive 5しか所有していませんが、Windows XPから日本語ファイル名を含むHFS+ボリュームへのアクセスが問題なくでき、パフォーマンス上の問題もないことを確認しています。最新のMacDrive 7では、Windows VistaとBoot Campにも対応しているそうです。

残念ながらSolarisからHFS+ボリュームにアクセスする手段はないようなので、Solarisとのファイル共有だけネットワーク経由にすることにすれば、HFS+はMac OS X、Linux、Windowsで共通に使用できるローカルな共有ファイルシステムとして有効な選択であると言うことができます。

GNOMEデスクトップのLinux環境では、USB外付けディスクであれば接続しただけで、自動的に/mediaディレクトリ配下に接続したディスクのHFS+パーティションがマウントされ、デスクトップにはマウントしたディスクのアイコンが現れます。

ただし、マルチブート構成にした内蔵HDのMac OS Xパーティションは、自動的にはマウントされないため、以下のようにmountコマンドで明示的にマウントする必要があります。

$ sudo mkdir /mnt/macosx
$ sudo mount -t hfsplus /dev/sda2 /mnt/macosx

なお、LinuxにおけるHFS+パーティションの読み書きは、現状ジャーナリングがオフの場合に限定されています。ジャーナリングが有効になっているHFS+パーティションでは読み込みだけができるようになっています。HFS+のジャーナリングをオフにするときは、Mac OS X上のコマンドラインで、

$ diskutil disableJournal disk0s2
Journaling has been disabled on disk0s2

のように実行し、オンにするときは、

$ diskutil enableJournal disk0s2
Journaling has been enabled on disk0s2

とすることで、いつでもジャーナリングをオン/オフすることができます。

ジャーナリングは、思いがけない電源断においてもファイルシステムを安定に保つための有効な手段です。そのため、Mac OS X全体のボリュームのジャーナリングをオフにしてLinuxからHFS+への書き込みを常用するのはお勧めしません。Mac OS Xとユーザのホームディレクトリはジャーナリングオンを保ち、LinuxやWindowsとの共有専用のパーティションや外付けディスクを用意し、そこだけジャーナリングを無効にするのが安全であろうと思います。

なお、HFS+はUNIXベースのファイルパーミッションと互換性があるため、Mac OS XとLinuxとで使用するユーザのUID/GIDを合わせておくと都合がいいです。Mac OS XのUID/GIDは501番から採番され、Linuxでは500番から採番されるため、多くの場合、両者のUID/GIDはずれているはずです。この問題を修正するには、Linux側でrootでログインし直し、/etc/passwordと/etc/group内の該当ユーザのUID/GIDを修正した後、ホームディレクトリと/tmpディレクトリの一時ファイルの所有者を変更します。

# chown -R <user>.<group> /home/<user>
# find /tmp -user 500 -exec chown <user>.<group> {} \;

ここで、<user>がアカウント名、500が/etc/passwd修正前のLinuxのUIDです。以上の作業が完了後、該当ユーザでログインすれば、マウントしたHFS+パーティションのアクセスが両OS共通のアカウントでシームレスにアクセスできるようになります。

| | コメント (0) | トラックバック (0)

KVM on Fedora 7 test 4

Fedora 7のkernel 2.6.20から、仮想マシンとしてKVMが標準でサポートされたため、簡単にKVMを試すことができるようになりました。また、Fedora  7ではXenも簡単に導入できます。以下にFedora 7 test 4におけるKVMとXenのインストール方法を示します。

KVMをインストールする場合:

$ sudo yum install kvm qemu virt-manager

Xenをインストールする場合:

$ sudo yum install xen kernel-xen virt-manager

※現在のところ、yumからインストールできるkernel-xenのバージョン2.6.20-2925.9.fc7 が私のMacBook上で正しくブートできない(カーネルの起動途中で強制リブートがかかる)ため、KVMの方を試してみました。

KVMとXenのどちらの場合も仮想マシンの作成はVirtual Machine Manager (virt-manager)によるGUIを用いてとても簡単にできます。virt-managerの起動は以下のようにコマンドラインから実行するか、

$ sudo virt-manager

または、メニュー「アプリケーション>システムツール>Virtual Machine Manager」を選択して、rootのパスワードを与えてあげることで起動されます。

virt-managerの最初の起動時にハイパーバイザーの接続先としてXenとQEMUのどちらを使用するかを聞かれますが、KVMの場合はQEMUを選択します。

すると、現在利用可能なVMの一覧画面が現れます。この画面下の「新規(N)」ボタンを押し、ウィザードにしたがって、必要な情報を設定していくことで仮想マシンの作成からゲストOSのインストーラの起動までが簡単に行えます。VMWareParallelsを使用したことのある方であれば、ほとんど迷うことなく最初の作業ができると思います(virt-managerからのVM作成の手順はPhoronixの記事「Fedora 7 KVM Virtualization How-To」が参考になります)。

今回、私がゲストOSとして試したのは、Solaris 10 (11/06)で、インストール先にはディスクイメージを、ネットワークには仮想ネットワークを選択しました。インストールと起動は問題なくできています。

Solaris10onkvm

しかし、実用的に使用するのに適しているかというとそうではありません。現状のKVMの欠点としては以下が挙げられます。

  • パフォーマンスがよくない。ベンチマークをとった結果ではないので体感的なものですが、VMwareに比べてかなりもたつきが感じられます。
  • CPUホグ。何の操作をしていなくても、qemu-kvmはCPUの90%以上を占有していますので、バッテリ動作のMacBookでの使用には適していません。
  • ディスクイメージのサイズが固定。もしかしたら、qemuのインクリメンタルなイメージをゲストOSとして使用することができるかもしれませんが、virt-managerの画面からは固定サイズのrawイメージしか作成できません。

このように残念ながら、KVMは実用的ではないと言わざるをえません。

現状では、パフォーマンスの面でも、また、ゲストOSのディスクイメージをMac OS Xと共通化するという意味でも、VMwareやParallelsを選択するのが現実的であろうと思います。

| | コメント (0) | トラックバック (0)

Fedora 7 test 4 on MacBook (multi boot)

先日、MacBookに作成したBoot CampパーティションにSolaris Nevadaを入れようとして失敗したので、今回はLinuxを入れてみることにしました。Linuxのどのディストリビューションにするかについては迷ったのですが、やはりインストーラが初めからIntel MacのGPT/GUIDパーティションに対応しているFedoraを選んでみました。FedoraのIntel Mac対応はFedora Core 6から始まっていますが,今回はGAが間近なFedora 7 test 4を使いました。

Fedora7compiz

上図のように、Compizも比較的安定してきており、3Dキューブのデスクトップ切り替えや、ウィンドウがぐにゃぐにゃ変形するエフェクトは新鮮な感覚を与えてくれます。

MacBookへのインストール自体には大きな問題はありませんが、いくつか注意しておきたい点がありますので、以下にまとめておきます。

  • インストール先ディスクの選択フェーズではカスタム構成を選択し、Boot Campパーティションのsda3のみマウントポイント(/)とフォーマットタイプ(ext3)を設定します。好みにもよりますが、私は独立したswapパーティションは作らず、Mac OS Xと同様にswapファイルで代用することにしました。
  • Fedora 7 test 4のインストールDVDではトラックパッドが効かないため、textインストールを選択するか、GUIインストールを使用したいならUSBマウスを接続します(インストール後はきちんとトラックパッドが使えます)。
  • AirMac用のドライバMADWifiをコンパイルする必要があるため、パッケージ選択画面で「開発ツール」を選択しておいた方がいいでしょう。

正しくインストールできたら、Mac OS XとFedoraの切り替えはブート時にoptionキーを押すことで出てくるブートメニューでWindowsと書かれたディスクを選択するだけです(Windowsを選択してLinuxが起動するというのも気持ちが悪いですが)。そのため、Fedoraの場合はrEFItをインストールする必要はありません。

FedoraはIntel Macを初めからサポートしていることもあり、デフォルトの状態で以下のデバイスがほぼ正しく動作しています。

  • ディスプレイ (1280x800という変則的な解像度もOK)
  • キーボード (一部のキーは認識されない
  • トラックパッド (2フィンガージェスチャは不可)
  • サウンド
  • Ethernet
  • USB (USBハードディスクのマウントを確認)
  • ACPI (メニューバーにバッテリの残量確認のアイコンが出ます)
  • Bluetooth (認識していることのみ確認)

デフォルトでもかなりいい線をいっているのですが、きちんと使えるような状態にするのに、以下の作業を行いました。

参考のため、これらの作業手順を以下に示します。

swapファイルの作成

今回は、パーティション構成をシンプルにするため、Linux用には1つのパーティションだけを使うことにし、swap領域にはファイル形式を利用することにしました。swapファイルはddコマンドで作成し、mkswapコマンドでswapフォーマットに変換します。以下の例は、1GBのスワップを用意する場合です。

# dd if=/dev/zero of=swapfile bs=1024 count=1024000
# /sbin/mkswap swapfile 1024000

後は、/etc/fstabに以下のようなswapのエントリを追加し、

/swapfile    none    swap    defaults    0 0

swaponコマンドでスワップを有効化します。

# /sbin/swapon -a

うまく設定されたかどうかは、topコマンドなどで確認します。

認識されないキーの代替マッピング

これはFedoraだけの問題ではなく、Ubuntuなどでも同様のようですが、MacBookの一部のキーが認識されません。「英数」や「かな」はいいとしても、「¥と|」のキーと「_」のキーが入力されないのは問題です。しかたがないので、以下のような~/.xmodmapファイルを作成し、「¥と|」をF10に、「\と_」をF9にマッピングしました。

keycode 216 = backslash underscore
keycode 217 = yen bar

上記のマッピングを有効にするには以下のように実行します。

$ xmodmap ~/.xmodmap

また、3ボタンエミュレーションを有効にするには、/etc/sysctl.confを設定します。以下の例は、ボタン2をF11に、ボタン3をF12にマッピングした例です。

# Mouse button emulation for MacBook (F11 -> button2, F12 -> button3)
dev/mac_hid/mouse_button_emulation = 1
dev/mac_hid/mouse_button2_keycode = 87
dev/mac_hid/mouse_button3_keycode = 88

なお、デフォルトではkeycodeを調べるためのxevがインストールされないため、キーマップをカスタマイズしたい方は、yum install xorg-x11-utils しておくといいでしょう。

AirMacを認識させるためMadWifiのインストール

Core Duoの初代MacBookのAirMacはAtherosのAR2425というチップで、MADWifiでサポートされています。802.11nにアップグレードできるCore 2 DuoのMacBookのチップがサポートされているかどうかは分かりませんので、以下の方法でベンダ:デバイスIDを調べ、MADWifiのコンパチビリティリストで動作確認されているかどうかを確認するといいでしょう。まず、lspciコマンドの結果をgrepし、

$ /sbin/lspci|grep Atheros
02:00.0 Ethernet controller: Atheros Communications, Inc. Unknown device 001c (rev 01)

先頭の02:00.0の部分をキーにもう一度lspciコマンドを実行します。

$ /sbin/lspci -n |grep 02:00.0
02:00.0 0200: 168c:001c (rev 01)

ここで、168c:001cの部分がベンダ:デバイスIDです。MADWifiのコンパチビリティリストにこのデバイスが載っていて、Notes:欄に動作すると書かれていれば大丈夫です。

MADWifiをコンパイルする前に、wireless-toolsとkernelソースがインストールされているか確認しましょう。前者はデフォルトで、後者はインストール時に開発ツールを選択していればインストールされているはずです。

$ yum list installed | grep wireless-tools
wireless-tools.i386                      1:28-1.fc6             installed
$ yum list installed | grep kernel-devel
kernel-devel.i686                        2.6.20-1.3104.fc7      installed

MADWifiのコンパイルですが、Fedora 7のkernel 2.6.20では安定版0.9.3が正しくコンパイルできませんので、madwifi-ngから最新のスナップショットを持ってきてコンパイルします(5/24現在、新しい安定版0.9.3.1が出ていますので、ひょっとしたらこちらでもコンパイルできるかもしれません)。

$ tar zxvf madwifi-ng-r2362-20070522.tar.gz
$ cd madwifi-ng-r2362-20070522
$ make
$ sudo make install

インストールができたら、modprobeコマンドでデバイスを認識します。正しく認識されれば、wifi0とその仮想デバイスath0が増えているはずです。

$ sudo /sbin/modprobe ath_pci

$ /sbin/ifconfig -a
ath0      Link encap:Ethernet  HWaddr 00:16:CB:BD:47:0F 
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
              :
wifi0     Link encap:UNSPEC  HWaddr 00-16-CB-BD-47-0F-58-EE-00-00-00-00-00-00-00-00 
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:199
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:16

普通なら、後は「システム>管理>ネットワーク」メニューで設定をするだけですが、なぜかwifi0がEthernetデバイスとして認識され、本来のath0がリストに現れません。しかたがないので、手作業で/etc/sysconfig/network-scriptsディレクトリに以下のようなファイルifcfg-ath0を作成します。

DEVICE=ath0
BOOTPROTO=dhcp
ONBOOT=no
MODE=Managed
ESSID="ネットワーク名を記入"
KEY="パスワードを記入(ASCIIなら s:passwordの形式)"

設定ファイルができたら、ifupコマンドでath0を有効化します。全てがうまくいけば、ifconfigでath0にIPアドレスが割り当てられていることが確認できます。

$ sudo /sbin/ifup ath0

$ /sbin/ifconfig -a
ath0      Link encap:Ethernet  HWaddr 00:16:CB:BD:47:0F 
          inet addr:10.0.1.4  Bcast:255.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:121 errors:0 dropped:0 overruns:0 frame:0
          TX packets:156 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:74333 (72.5 KiB)  TX bytes:25209 (24.6 KiB)
              :

なお、MADWifiのソースツリーは消さずにそのまま残しておきましょう。kernelをアップデートする度にMADWifiのカーネルモジュールが無効化されてしまうため、kernelをアップデートしたら上記の手順を(make cleanしてから)繰り返す必要があるためです。

以上の作業で、なんとか使える環境になりました。他にも解決したい大きな問題として以下の2つがあります。

  • トラックパッドをタップすると、デフォルトで左クリックとして認識されるようになっているのですが、これがとてもセンシティブで不用意にあちこちをクリックしてしまいます。この動作を無効にしたいのですが、方法が分かっていません。
  • Mac OS Xと同様、液晶パネルを閉じるとスリープ、開くとスリープ解除にできる点は素晴らしいのですが、スリープ解除後にAirMacが復帰してくれません。そのため、スリープ解除する度にsudo ifdown ath0; sudo ifup ath0を実行しなければなりません。

もし、上記2つの問題の解決策をご存じの方がおられましたら、アドバイスよろしくお願いします。

| | コメント (2) | トラックバック (0)

その他のカテゴリー

applescript | book | camcorder | development | english | iphone | ipod | java | linux | mac | solaris | 携帯