Monthly Archives: 11月 2009

日本語ファイルを含むzipが展開できない件

Pocket

Windowsで圧縮した日本語ファイルをFreeBSDでunzipすると文字化けする。

ここでの文字化けは、ファイル名だけでなく、どうも中身も壊れてしまうようだ。

該当ファイルをlsしてみると、(無効なエンコーディング)と表示される。

$ ls
進捗1112.xls (無効なエンコーディング)
$

仕事上、メールをFreeBSDマシンで受けることがあるのだが、このおかげでメールに添付されたファイルを開けない。

困っていて検索したところ、以下のページがヒット。

これで内容が壊れる件は問題なく出来た。(ファイル名はSJISなのでやっぱり化ける。UTF-8やEUC-JPにするにはconvmvが必要)

http://nhh.mo-blog.jp/ttt/2007/03/zipunzip_315b.html

ここに記載の通り、”CFLAGS+=-D’Ext_ASCII_TO_Native(string, hostnum, hostver, isuxatt, islochdr)'”をつけてmake。

出来たカスタム版unzipだが、/usr/local/bin配下に置くのはちょっと嫌なので、ホームディレクトリのbin配下にコピー。さらにカスタム版だということが分かるよう、名前はunzip.custに変えた。

$ cd /usr/ports/archivers/unzip
$ make "CFLAGS+=-D'Ext_ASCII_TO_Native(string, hostnum, hostver, isuxatt, islochdr)'"
(略)
$ cd ./work/unzip60 (workの下のディレクトリ名は異なる可能性あり)
$ cp unzip ~/bin/unzip.cust
$
No tags for this post.

カスタムカーネルを使用しているときのfreebsd-update。

Pocket

大したことはないのだが。

カスタムカーネルを使っている場合でも、/boot/GENERICにGENERIC kernelを置いとけば更新してくれるよ、という話。ハンドブックに書いてある。

カスタムカーネルを使っていて、なおかつ/boot/GENERICを置いているマシンでfreebsd-udpdateをした場合。

isis# uname -a
FreeBSD isis 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Tue Aug 11 08:47:28 JST 2009     doe@isis:/usr/obj/usr/src/sys/ISIS  i386
isis# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... none found.
Fetching metadata signature for 7.2-RELEASE from update.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.
The following files will be updated as part of updating to 7.2-RELEASE-p3:
/boot/GENERIC/if_bce.ko
/boot/GENERIC/if_bce.ko.symbols
/boot/GENERIC/if_fxp.ko
/boot/GENERIC/if_fxp.ko.symbols
/boot/GENERIC/kernel
/boot/GENERIC/kernel.symbols
/lib/libc.so.7
/lib/libthr.so.3
#

通常は/boot/kernel/と表示されるはずが、/boot/GENERICとなっているのに注目。

あとは普段どおりinstallして、reboot -kか、nextbootでGENERICを指定すればOK。

# freebsd-update install
Installing updates... done.
# shutdown -r now
(中略)
# uname -a
FreeBSD isis 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Tue Aug 11 08:47:28 JST 2009     doe@isis:/usr/obj/usr/src/sys/ISIS  i386
#

通常のrebootでは当然7.2-RELEASEのまま。

reboot -kでGENERICを指定すると。

# sync;sync
# reboot -k GENERIC
#
# uname -ir
7.2-RELEASE-p2 GENERIC
No tags for this post.

freebsd-updateを使ったら楽すぎて吹いた。

Pocket

自宅サーバはほぼ10年前のノートPCだ。

ここにFreeBSDを入れてApache, Samba, mt-daapdを動かしている。バッテリーはさすがに死んでいるが動作には全くといっていいほど問題ない。

とはいえ、通常運用時はともかくとして、セキュリティフィックスなどでOSやportsの更新が発生したときの手間がさすがにつらくなってきた。

portsはもうかなり前から別マシンでコンパイルするようにしていて、これはもう解決。

OSは別マシンでbuildした/usr/objからインストールしたり、snapshotsのISOイメージを使うようにしていたが、とうとうこれもあきらめてfreebsd-updateに移行することにした。

そしたら予想以上に楽で驚いた。

ただ、RELEASEなど安定版バージョン(とそのBETA版、RC版)でなければ使えない。

FreeBSDにはRELEASEブランチのほかに開発版であるSTABLE, CURRENTというのもある。人柱用のCURRENTはともかく、CURRENTで実験済みのソースがバンバン突っ込まれるSTABLEで使えないのはちょっと寂しく、これが今まで俺がfreebsd-updateを使わなかった理由なんだが、まあSTABLEでのバイナリアップデートはきつかろう。

あともう一つ、カーネルもカスタマイズしている場合には注意が必要。

そういった訳で、7-STABLEからわざわざ7.2-RELEASEに戻してやってみた。

実際にやったのは1ヶ月ほど前なので、以下の例では7.2-p3までのアップデートです。11/5時点では7.2-p4が最新。

freebsd-update fetchで必要なファイルをダウンロード。

# uname -r
7.2-RELEASE
# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... none found.
Fetching metadata signature for 7.2-RELEASE from update.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 35 patches.....10....20....30.. done.
Applying patches... done.
The following files will be updated as part of updating to 7.2-RELEASE-p3:
/boot/kernel/if_bce.ko
/boot/kernel/if_bce.ko.symbols
/boot/kernel/if_fxp.ko
/boot/kernel/if_fxp.ko.symbols
/boot/kernel/kernel
/boot/kernel/kernel.symbols
/lib/libc.so.7
(中略)
/usr/src/sys/conf/newvers.sh
/usr/src/sys/dev/bce/if_bce.c
/usr/src/sys/dev/fxp/if_fxp.c
/usr/src/sys/kern/sys_pipe.c
/usr/src/sys/netinet6/in6.c
#

その後、installして再起動。

uname -rとすればパッチレベルの上がっている事が確認できる…はずだが、unameの応答はp2になっていてp3ではない。

# freebsd-update install
# reboot
(略)
$ uname -r
7.2-RELEASE-p2
$

これはなぜかというと、p2からp3で修正されたのはbindだけで、kernelは修正されておらず、p2の時のままだから。

unameに対してkernelが返す値は、/usr/src/sys/conf/newvers.shが元になっているが、こちらを確認すればしっかりp3になっていることが確認できる。

繰り返しになるが、p2からp3になったときに、freebsd-updateはbindを更新し、kernelは更新しないからunameの応答はp2になるというわけ。

ただ、freebsd-updateはパッチレベルが上がった時には必ずnewvers.shを更新しているので、kernelに更新がなくとも、kernelを再作成すればパッチレベルは上がる。

真面目なサーバの場合は、kernelを再作成しておいた方がよいと思う。

ロールバックも試しにやってみた。

# uname -r
7.2-RELEASE
$ uname -r
7.2-RELEASE-p2
# freebsd-update rollback
Uninstalling updates... done.
$ uname -r
7.2-RELEASE
No tags for this post.