MacOS X v10.4からMacOS X v10.6へのアップグレード

色々なアプリケーションでMacOS X v10.4 Tigerのサポートが打ち切られ始めているので、そろそろMacOS X v10.6 Snow Leopardへアップグレードしようかと思い、先月23日から作業を始め、仕事などで中断しつつ、最近になってようやくほとんどの問題が解消したところです。

MacOS X v10.6へのアップグレード前準備

MacOS Xは有償のOSなので、Apple Storeamazon.co.jpなりで購入する必要があります。

今回はMacOS X v10.4 Tigerからのアップグレードなので、MacOS Xのほか、iWorksiLifeがセットになったMac Box Setが必要になります。

あとアップグレード後に何かしらの問題が起こって元に戻したくなることも起こりえるので、アップグレード作業の前にバックアップを取っておきます。

sudo asr restore --source / --target /Volumes/newdisk

更に「アプリケーション→ユーティリティ→ディスクユーティリティ」を実行して「ディスクのアクセス権を修復」をしておきます。これをしておかないと時々アップグレード時にファイルを置き換えられない等々のエラーでアップグレードが失敗してハマります。ただ、自分の環境では正直言うとディスクユーティリティからではアクセス権の修復が完全に行なえてなかったようで、最終的にはOnyXでアクセス権の修復をしました。

MacOS X v10.6へのアップグレード

MacOS Xのアップグレード作業自体はOSのインストールDVDから起動するようにして、画面の指示に従っていけばそれで終わりです。Windowsのようにパッケージが分かれてないので、「クリーンインストールされちゃうんだろうか?」など不安になったりするかもですが、アップグレード作業で/Usersディレクトリ以下のユーザ領域には変更は加わらないので大丈夫です。裏を返すとそれ以外は結構置き換わります。アップグレード後、crontabの設定ファイルが別の場所に移っていたのにしばらく気づいてませんでした……。

ちなみにMacの電源を入れた際にoptionキーを押し続けてると起動ディクスの選択画面が表示されるので、そこでインストールDVDからの起動が可能です。

macportsは難関

MacOS Xのアップグレード後のマイグレート方法についてはMigration – MacPortsに書かれているのですが、1st Stepから

Reinstall Xcode and MacPorts

After performing either of these types of system upgrades, you will first need to install the base MacPorts system again, either from the appropriate disk image or from source. If you are upgrading from a prior version of Mac OS X, install the latest version of Xcode for your new OS. This will not be done for you automatically; Xcode is not updated by Software Update, so you must update it manually. You will find the Xcode installer on the Mac OS X installation DVD or on the Apple Developer web site.

更に同じページではReinstall portsと続くように、要はMacOS Xのアップグレード後、macportsは本体(依存するXcodeも)・portともに一から入れ直すことが求められてます。

で、Reinstall portsの手順として、まず最初に

port installed > myports.txt

前バージョンでインストール済のports一覧を作っておいて、一旦アンインストール/アーカイブの削除をした上で、

  1. 4. Browse myports.txt and install the ports that you actually want to use (as opposed to those that are only needed as dependencies) one by one, remembering to specify the appropriate variants:
    sudo port install portname +variant1 +variant2 ...

Note that if you have specified variants which are not the default, you may need to install ports in an order other than the alphabetical order recorded in myports.txt.

ちょー意訳ですが、最初に作ったports一覧を見ながらインストールし直します。variantsの選択が標準と違う場合はアルファベット順のmyports.txtと同じ順ではダメな場合もあるよ。ってそんなー、という感じになります。で、実際ハマります。特にportsからではなくcpanを利用してPerlのモジュールをインストールしている場合、厳しい結果が待ってる可能性が高いです。

なぜかPerlがエラーを乱発する

結論から言うと、macportsでインストールしたPerlを利用していて、そのPerlを利用する上でportsからではなくcpanを利用してPerlのモジュールをインストールしていた場合、MacOS Xのアップグレードに伴ってXS系モジュールが使えなくなり、当該モジュールを利用する度にエラーを発生させるようになります。この状態になるとPerl5に依存するportsがperl5を呼び出す度にエラーが発生し、最終的にはことごとくportsのインストールに失敗していきます。

なので、条件に当てはまる場合は /opt/lib/perl5 以下の内容をバックアップした上で削除し、旧OSに合わせてインストールされたモジュールにアクセスさせないようにする必要があります。

CPANの環境再構築はアップグレード作業が落ち着いてからにでも頑張ります。

rubygems

MacOS Xアップグレードのrubygems(これも自分の環境ではmacpotsでインストール)の扱いは正直分かりません。というのも、OSアップグレードに合わせてruby1.8.6から一旦1.9.2へアップグレードさせたんで、rubygemsでインストールしたrubyのモジュールは全部入れ直したのでした。

前のPerlの問題でmacportsの再構築を何度かやり直してるうちに、最終的にRubyは1.8.7を入れることにしたので、更にrubygemsの環境を再構築したのですが。

PHP5はあまり影響ないかも

macports経由のPHP5環境は、以前variantで拡張を追加してたのがいつの間にか

#port variants php5
php5 has the variants:
   apache: Add Apache 1 web server module
     * conflicts with apache2 no_web
[+]apache2: Add Apache 2.2 web server module
     * conflicts with apache no_web
   debug: Enable debug support (useful to analyze a PHP-related core dump)
   fastcgi: Add FastCGI web server binary
     * conflicts with no_web
   gmp: Obsolete; install php5-gmp port instead
   imap: Obsolete; install php5-imap port instead
   ipc: Add semaphore, shared memory and IPC functions
   macports_snmp: Obsolete; install php5-snmp port instead
   mssql: Obsolete; install php5-mssql port instead
   mysql4: Obsolete; install php5-mysql port instead
   mysql5: Obsolete; install php5-mysql port instead
   mysqlnd: Obsolete; install php5-mysql port instead
   no_web: Don't include any web server support
     * conflicts with apache apache2 fastcgi
   oracle: Obsolete; install php5-oracle port instead
   pcntl: Obsolete; install php5-pcntl port instead
   pear: Add PEAR
   postgresql82: Obsolete; install php5-postgresql port instead
   postgresql83: Obsolete; install php5-postgresql port instead
   pspell: Obsolete; install php5-pspell port instead
   snmp: Obsolete; install php5-snmp port instead
   sockets: Obsolete; install php5-sockets port instead
   sqlite: Obsolete; install php5-sqlite port instead
   suhosin: Add Suhosin patch
   tidy: Obsolete; install php5-tidy port instead
   universal: Build for multiple architectures

と、逐一portsからインストールすることになったみたいなので、portsの再インストールでPHP5環境は概ね整います。自分の環境では php5-snmp が依存する net-snmp が更に perl5 に依存するので、Perl5の問題を解消しないと入れられませんでした。が、まぁその程度ですみます。

ただ、PEAR経由で入れたPECLモジュールがあるなら再インストールが必要かもです。自分の環境で入れてなかったので分かりません。

macports環境の再構築が片付くと後は何とかなるかも

自分の環境ではCPANやrubygemsの環境再構築が必要になったり、その余波でpassengerのパスが変わったりしてhttpd.confを書き換えたりしましたが、ここまで来るとアプリケーションの一部が動かないということがあっても、ほとんど動かなくなってどうにもならないということはなくなるので、問題点を個別撃破していけばいずれ何とかなります。

snow leopardになってから妙な部分が変わってたりして「あれれ……?」と感じる部分が、使っているうちに続発しますが、それはまた別の話で。