昨日FreeBSD 8.0-RELEASEのアップグレードは難しいで記事を書きましたが、現実的なアップグレード方法を研究しました。
ずばり、portsのmisc/compat7xをインストールすることです。
# portsnap fetch update # freebsd-update upgrade -r 8.0-RELEASE # freebsd-update install # shutdown -r now # freebsd-update install # portinstall misc/compat7x # freebsd-update install # shutdown -r now
これでばっちりです。とりあえずこれでバージョンアップ作業を進めていきたいと思います。
FreeBSD 8.0-RELEASEが11/25付でリリースされました。主な新機能は以下の通りです。
マイコミジャーナル・スラッシュドットで記事になっています。
で、早速FreeBSD 7.2-RELEASEからFreeBSD 8.0-RELEASEにバージョンアップしようとしましたが、、、なかなか手強いです。今回のバージョンアップから、過去ライブラリとの互換性が失われることにより、portsのrebuildが必要となります!!
実際の手順はFreeBSD 8.0-RELEASE Announcement と FreeBSD Update to 8.0-BETAを参考にしてやってみましたが、はまりました。
バージョンアップ手順は、以下の順序で行います。
# portsnap fetch update # portupgrade -a => portsの最新化 # freebsd-update upgrade -r 8.0-RELEASE => この時点ではパッチのダウンロードのみ # freebsd-update install => この時点でkernelだけがアップグレードされる # shutdown -r now # freebsd-update install => FreeBSD 8.0-RELEASEのバイナリ・ライブラリがインストールされる # portupgrade -f ruby\* # rm /var/db/pkg/pkgdb.db # portupgrade -af => FreeBSD 8.0-RELEASEのライブラリを利用してportsの強制rebuild # freebsd-update install => FreeBSD 8.0-RELEASE以前のライブラリが削除される # shutdown -r now
上記の通りにやっても、portsの強制rebuild再構成時に依存性や各種諸々の制約でrebuildが失敗します。
この結果、FreeBSD 8.0のシステムができあがった後にportsのdaemon(BIND/Apache等)が起動してこなくて、ひどい目に遭います(libz.so.4/libwrap.so.5がないとかいろいろ怒られました)。
BIND起動時の例)
[root@hoge ~]# /etc/rc.d/named start /libexec/ld-elf.so.1: Shared object "libz.so.4" not found, required by "named-checkconf" /etc/rc.d/named: ERROR: named-checkconf for $named_conf failed
openssh-portable起動時の例)
[root@hoge ~]# /usr/local/etc/rc.d/openssh start /libexec/ld-elf.so.1: Shared object "libwrap.so.5" not found, required by "sshd" /usr/local/etc/rc.d/openssh: WARNING: failed precmd routine for openssh
一応抜け道としてcompat7xをインストールすればいいという話もありますが、それはまだ試していません。またの機会にでも試してみたいですね。
compat7xを利用すれば簡単にバージョンが上げられますね。詳細はここで。
ノードごとのリソースグラフを管理するため、cactiを0.8.7b から 0.8.7eにバージョンアップしようとしたのですが、以下のエラーが出ます。
Invalid Cacti version 0.8.7b , cannot upgrade to 0.8.7e
なんでだろうと調べてみたら、結論から言うと、my.cnfにdefault-character-set = binaryの設定を登録していたことが原因だった。では何故こうなるのか?を以下にまとめます。
上記エラーを出す部分のソースコードですが、cacti0.8.7eのバージョンアップ画面で利用されるinstall/index.phpの364-369行目が該当します。
364 if (!is_int($old_version_index)) {
365 print " <p style='font-family: Verdana, Arial; font-size: 16px; font-weight: bold; color: red;'>
Error</p>
366 <p style='font-family: Verdana, Arial; font-size: 12px;'>Invalid Cacti version
367 <strong>$old_cacti_version</strong>, cannot upgrade to <strong>" . $config["cacti_versio
n"] . "
368 </strong></p>";
369 exit;
370 }
364行目で$old_version_index変数の条件判定が失敗するため、エラーになることがわかります。
この$old_version_index変数の中身はmysqlのversionテーブルから取得したもので、mysqlからバージョンアップ前のバージョン情報を取得することで、バージョンアップ可能かどうかを判定しています。
データベースのcharacter-set=utf8だと正常にバージョンアップできます。試しにmysqlに対してversionテーブルが持つ値を検索してみたところ、以下応答となります。versionテーブルのcactiカラムはchar(20)であり、取得できるバージョンも”0.8.7b”となります。
mysql> desc version; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | cacti | char(20) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from version; +--------+ | cacti | +--------+ | 0.8.7b | +--------+ 1 row in set (0.00 sec)
character-setがbinaryだと以下のようにversionテーブルのcactiカラムがbinary(20)!!!となり、応答結果は”0.8.7b______________”‘(表示都合上、NULL文字を”_”で表現)”となります。cactiの初期データ作成に用いるcacti.sqlではCHAR(20)を指定しているのに・・・binary型に変換されるようですね。
mysql> desc version; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | cacti | binary(20) | YES | | NULL | | +-------+------------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from version; +----------------------+ | cacti | +----------------------+ | 0.8.7b | +----------------------+ 1 row in set (0.00 sec)
この場合、上述の$old_version_index変数にはバージョン情報 + NULL情報を含んだ値が返されるため、エラーになる・・ということがことの真相のようです。
言い訳ですが、今回cactiに利用しているデータベースは昔MySQL 4.0系を利用していた物を流用しました。流用の中で、セキュリティ対策を考慮して4.0系から5.1系までバージョンアップさせた物を使っています。
有名な話ですが、4.0系から5.0系以上にバージョンアップすることは大変な苦労を伴います。理由はMySQLの4.1系で文字コード自動変換が実装された事が原因であり、そのままバージョンアップすると、文字化けすると既存データ破損が大量に発生するため、苦肉の策としてcharacter-setをbinaryにした上でバージョンアップ作業を行っていました。
でもまさかこんなところで落とし穴があるとは・・・・。
下手なことはやらないものですね。以後気をつけます。
今更ですが、sambaでWindows NT 4.0と信頼関係を結ぶ機会があったので、忘れずに書いておきます。
ほんと今時Windows NT 4.0ってないと思うんですが、たまたま設定する機会があったので・・・。そうそう、Windows NT4.0の時代はドメイン間の信頼関係も双方から結ばないとだめでしたね。
1. SAMBAドメイン(samba)側で、Windows NT 4.0ドメイン(ntdomain)から信頼を受け付けるアカウントを登録。登録したパスワードはWindows NT側で信頼関係を結ぶ際に利用するので忘れずに。
root# smbpasswd -a -i ntdomain New SMB password: XXXXXXXX Retype SMB password: XXXXXXXX Added user ntdomain$
2. Windows NT 4.0 ドメイン(ntdomain)でSAMBAドメイン(samba)に対しての信頼の作成。ドメイン・ユーザー・マネジャー を起動し設定。パスワードは1.で設定したものを利用する。
3. Windows NT 4.0 ドメイン(ntdomain)でSAMBAドメイン(samba)からの信頼を受け付ける設定。ドメイン・ユーザー・マネジャーを起動して設定。SAMBA側からの信頼登録に利用するパスワードを設定するため、忘れず記録
4. SAMBAドメイン(samba)で3.で取得したパスワードを用いてWindows NT 4.0側ドメインに対しての信頼関係を作成する
root# net rpc trustdom establish ntdomain
http://www9.samba.gr.jp/project/translation/3.0/htmldocs/InterdomainTrusts.html
www.kinusati.netのコンテンツ(wordpress/mediawiki/cacti)がもっさりしていると指摘があったので、PHP高速化にチャレンジしました。結果は以下のWikiページにまとめています。
APC(Alternative PHP Cache)を利用して、サイト全体が高速化してびっくり。使えるものは使ったほうがいいですね。
rsyncでサーバのデータバックアップを取得したい。
ssh経由でアクセスしてrsyncすればすむ話といえばそうなのだが、一般ユーザでsshした場合は権限が不足してバックアップ漏れが発生する。かといって、root権限でsshすることはセキュリティ上も、便宜上も不可!としている。
やっぱroot権限でsshできちゃうと負けた気がするし、万が一、rootアカウントのパスワードが推測されてしまうと、目も当てられないし(毎日のようにsshの接続失敗ログにrootアカウントでパスワードハックしようとしているログを見てしまうとどきどきしちゃいます)。
じゃぁバックアップはどうするの?という話になりますが、rsync先のサーバでsudoコマンド + rsyncコマンドを実行するように設定&指定すればよい。
まず、rsync先サーバに対してssh接続するアカウントにsudoの設定を加えよう。具体的なsudoの設定は以下のようにしよう。hogehogeユーザがsudo実行する場合はパスワードなしでsudo可能としている。
hogehoge ALL=(ALL) NOPASSWD: ALL
次に、rsync呼び出し時は、--rsync-pathオプションに"sudo rsync"を指定すればよい。
# rsync -v --rsync-path="sudo rsync" -a hogehoge@www.example.com:/usr/local/etc /var/backup/www.example.com/usr-local
これでばっちりだ!
Wikiページで技術ネタについてまとめているのですが、週末更新したのでお知らせします。
TOPページ :
更新ページ (Solaris10):
他
更新ページ(FreeBSD):