2009年2月1日

NetBSD 4.0.1 の amd64 版の boot-big.fs はどこ?

最近、Debain/NetBSD/OpenBSD/FreeDOSの安定版のインストーラー(amd64版があればそいつを含んだ奴)を一つにまとめた DVD を欲しくて作ってみた。

grub2 は USB-CD/DVD のアクセス対応のコードがまだ天から降ってこないので、まだ isolinux を使う必要がある。(grub2のbsd系のブートコマンドは、まだ 64bit ELFをサポートしていないので、まだまだなんだがなぁ。。。)

Linux 以外では、floppy イメージをsyslinux の memdiskでエミュレートすることで、インストール作業ができる。ただし、floppy ディスクの交換までエミュレートできないので、一つにまとまったイメージが必要になる。

で、

NetBSD/amd64 4.0 には、boot-big.fs はあったのだが、4.0.1 では提供されていないぞっと。。。なんでかぁ

困ったなぁ

コイツらは普通につくれるのかぁ、、、、Linux システム上で!

小一時間考えて、作ってみた。

NetBSD 4.0.1 のバイナリファイル群を取ってくる。下のスクリプトのTOPDIRに指定して、スクリプトを走らせると。。。memdisk でブートできる boot-big.fs を出来る。。。

#!/bin/sh

TOPDIR=/path/to/NetBSD-4.0.1/amd64

BOOTBIGFS=${TOPDIR}/installation/floppy/boot-big.fs

[ -e $BOOTBIGFS ] && exit

#VOLSIZE=5760  # blocks

workdir=/tmp/work$$
mkdir $workdir
mkdir $workdir/USTAR

tar xfz ${TOPDIR}/binary/sets/base.tgz -C $workdir ./usr/mdec

cp $workdir/usr/mdec/boot $workdir/USTAR
cp $workdir/usr/mdec/bootxx_ustarfs $workdir
cp ${TOPDIR}/binary/kernel/netbsd-INSTALL.gz $workdir/USTAR/netbsd

if [ "x$VOLSIZE" = "x" ] ; then
	needblocks=`du -s -B512 $workdir/USTAR | awk '{print $1}'`
	VOLSIZE=`expr $needblocks + 20`
fi

OVOLSIZE=`printf "%o" $VOLSIZE`
touch $workdir/USTAR/USTAR.volsize.$OVOLSIZE
tar --posix -cf $workdir/USTAR.tgz -C $workdir/USTAR boot USTAR.volsize.$OVOLSIZE netbsd

dd if=$workdir/bootxx_ustarfs of=$workdir/boot-big.fs
dd if=$workdir/USTAR.tgz of=$workdir/boot-big.fs seek=16

cp $workdir/boot-big.fs $BOOTBIGFS

rm -rf $workdir

USTARFSは、initrd で cpio イメージを使うっぽい感じで tar を扱う奴らしい(ちょっと違うけど)。ボリュームのサイズは含まれる特殊なファイル名(USTAR.volsize.XXXX)で指定され、かつ8進数を使うのは、、、如何にも歴史を感じられるなぁ~

で、目的のDVDを無事ゲットできましたとさぁ。。。

まぁ、ついでに Ubunut 8.04.2 LTS Desktop/Server i386/amd64 も作ってもうたぁが、それは別の話。


[全文を読む]

CPANでインストールしたモジュールは?

Linux 上で Perl を使う場合、 自前ではビルドせずに大抵ディストロのパッケージ(rpm/deb)を使うのがほとんどである。 CPAN上のモジュールでも対応するディストロの方を使うのが、僕は好みである。 ディストロ側に対応するパッケージが無い場合は、仕方なく cpan コマンドを使ってインストールして使っている。

cpan -i モジュール名

cpan コマンドでインストールしたモジュールをアンインストールしたいとか思っても、いまいち方法が分からなかった。。。

「cpan help」 とかやると、よくわからん help モジュールがインストールされたり、「cpan list」とやっても、list モジュールが、、、以下略。

で、CPANを使うと運用状態が続くと /usr/local 以下が何故だか意味不明な状態になってしまう。

私だけだろうけど、、、どうしたもんだろうかなぁ。

cpanコマンドでインストールされたもののリスト

ExtUtils::Installed モジュールを組み合わせると取得できるようなので、次のようにスクリプトを組んでみた。

cpan-list

#!/usr/bin/perl

use ExtUtils::Installed;

$inst = ExtUtils::Installed->new();

for $module (sort $inst->modules()) {
	$version = $inst->version($module);
	print "$module $version\n";
}

どっかの御大ならば一行スクリプトに仕立てるんだろうけどねぇ。。。
そこまで Perl 臭が染み付いていないので、これでいいかなぁ。。。

実行例

# ./bin/cpan-list      
HTML::Perlinfo 1.54
Perl 5.8.8

cpanコマンドでインストールされたもののアンインストール

同様に ExtUtils::Installedとかを組み合わせると、アンインストールするスクリプトが作れる。

cpan-uninstall

#!/usr/bin/perl

use ExtUtils::Installed;
use ExtUtils::Install;

$module = $ARGV[0];

$inst = ExtUtils::Installed->new();
@modules = $inst->modules();

(grep $module,@modules) || die "$module is not install...";

uninstall($inst->packlist($module)->packlist_file());
print "uninstalled $module\n";

削除したいものを指定すれば削除できる。

実行例

# ./cpan-uninstall Module::Name
uninstalled Module::Name

まとめ

果たして、これで良いのか疑問に残るが、目的は達したので良いのかなぁ。。。
取り敢えず、ディストロとCPANの組み合わせは怖くなくなったぞぃと。


[全文を読む]