[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:12648] boot-floppies/ja (or i18n+l10n) for potato



佐野@浜松です。

吉山さんと私信でやり取りしていたんですが、もっと多くの人に
参加してもらっていたほうが良いだろうということで合意したので
 devel@jp に振ります。

  | > 1)base-config+debconfについて
  | > 現行の Debian インストーラは、インストール後半の各種設定について
  | > debconfを利用しています (base-config パッケージの設定による)。
  | > ここで、init が直接 jfbterm 経由で dpkg-reconfigure コマンドを実行
  | > しているので、環境変数 LANG が設定されず、結果として base-config
  | > が i18n 化されません。

これは現状の potato 用インストーラについての話です。

  | えっと、「インストール後半の各種設定」というのはベースシステムを
  | インストールして再起動した後ですよね ? 
  | 
  |  init が直接 jfbterm を実行するのは rootdisk のほうだけじゃないかと
  | 思うのですが、違いましたっけ。 scripts/basedisks/* のほうにある
  |  *PACKAGES_* には jfbterm が含まれていないような。
  | 
  |  rootdisk のほうは scripts/rootdisk/prototype/etc/inittab に
  | 
  | # main setup program
  | ::respawn:/sbin/dbootstrap
  | 
  | とあるのを、rootdisk.sh の中で
  | 
  | if [ $LINGUA = "ja" ]; then
  |     info "modifying init script for Japanese installer"
  |     sed -e 's/\/sbin\/dbootstrap/\/usr\/bin\/jfbterm -e \/sbin\/dbootstrap/' \
  |         < $scripts/prototype/etc/inittab > $T/etc/inittab
  | fi
  | 
  | として
  | 
  | ::respawn:/usr/bin/jfbterm -e /sbin/dbootstrap
  | 
  | に書き換えてますが、scripts/rootdisk/prototype/etc/inittab.install 
  | (こいつが再起動後の base system で最初に使われる inittab のはず) には
  | 
  | 1:2345:respawn:/usr/sbin/dpkg-reconfigure base-config </dev/tty1 >/dev/tty1 2>&1
  | 
  | となっていて、今のところこいつを書き換えては「いない」と思います。
  | 
  | これも rootdisk.sh の中で書き換えることは可能だと思いますが、
  | そのためにはまず base system に jfbterm を入れないといけないですね。

これはまだ手がついていません。base system に直接入れてしまのが実装的には
簡単ですが、unicode base で (一応) 各国語を表示できる bterm (まだまだ完成
してないし、いろいろ bug ありそうですけど) を入れるならまだしも、
 cjk oriented な jfbterm を base に直接入れることに対して base のサイズ
が増えることを理由にした抵抗があるんじゃないかと危惧しています。

dbootstrap の終りのほうで、base + language pack をインストールできる
仕組を追加すれば、そういう方向で対応できるんじゃないかと夢想してるんですが。

いったん  base をインストールできてしまえば、chroot して dpkg を使えるはず
なので、(basedisks.sh でやっているように dpkg --root でも良い) /target 
(インストール先のディレクトリ) に language pack として必要なもの (ja 版なら
 locale-ja とか jfbterm とか) を入れることができると思います。

別に language に限らず 98 版で必要な syslinux98, fdisk98-2.1, grub98 などを
こういう形で追加することも可能なんじゃないでしょうか ?

ちょこっと utilities/dbootstrap/baseconfig.c の configure_base() の
後のほうに必要な処理を追加することって、できないかな。

もっと徹底すれば base は dpkg の実行に必要な最低限に絞り込んで、
それ以外のもの (e2fsprogs, elvis, fbset, fdutils, etc) はすべて
 dpkg --root でインストール、という方法が考えられそう。

 Joey Hess が構想してる woody 向けのインストーラはそのへんどうなって
いるのかな、と思って http://cvs.debian.org/debian-installer/doc の
 design.txt を眺めてみたら

3. installer
(snip)
  - unpacks the base system onto the filesystem the partitioner set up.
    (In an ideal world, the base system would be smaller, just containing dpkg
     and it's dependancies, and the rest would be downloaded and installed
     as .deb's in a chroot.)
  - chroots into the base system and runs the base setup program.

となっているんで、一応その方向で考えてるみたいですね。

<余談>
ただし、

 I think that much of what is done in step 3 can be postponed to step 4.
 (Things like time zone setup, configuration of hardware not necessary to
 boot, etc). Anything that is pushed back to step 4 becomes part of a "real"
 debian system, and so I think it will get a lot more attention.

と書いてあるんだけど、time zene setup とか RTC の UTC/localtime の設定を
先にしておかないと、インストールされたファイルの作成日時が再起動後に未来に
なってたりするような気が。
</余談>

問題としては、追加する pack をどこからどうやって取得するのかを決める
部分がやっぱり必要かなという気がするのと、どの add-on pack が必要に
なるかをどうやって決めるのかという部分がありそうかも。

でも base に入れるのと同様に考えるなら、make LINGUA= で決めうちの
処理になるんだから、base を取得する時に同じ場所から一緒に取得できる
ようにしておいて、どれを追加して取ってくるかも決めうちしちゃうという
方法でもいいような気がする。

あれ ? utilities/dbootstrap/extract_base.c の extract_base には

    if (status == 0) { /* Don't extract add-ons if extraction of base system failed. */
      sprintf(prtbuf,"%s/%s",Archive_Dir,ADDONS);
      if (NAME_ISREG( prtbuf,&statbuf)) {
        file=strdup(prtbuf);
        status=extract_from_file(file,_("Add-ons Set"));
        free(file);
      }
    }

って書いてあるぞ ? これは何だろう。dbootstrap.h に

 #define ADDONS  "addons.tgz"

と定義されているみたいだけど ? こんなのあったっけ ?

  http://cvs.debian.org/boot-floppies/utilities/dbootstrap/dbootstrap.h

によると

Revision 1.3 / (download) - [select for diffs] , Sun Apr 11 20:41:05 1999 UTC
(14 months, 3 weeks ago) by ezanard
Branch: MAIN
Changes since 1.2: +1 -2 lines
Diff to previous 1.2 (colored)
- After extracting the base system from the base2_1.tgz file, look for a file
  named "addons.tgz" (name defined on the ADDONS macro on dbootstrap.h)
  on the same directory and extract it too. That may be used for local
  customization (custom setup scripts for lab rooms and such stuff...).

となってますね。なるほど。

じゃあこれを流用して

 #define ADDONS  "addons"-$LINGUA".tgz"

とかしちゃうのはどうかな。

 net-fetch.c の中も

  files_to_fetch[] = {
    { "rescue.bin",   kernel_image_path, nf_extract_kernel,  SERIES_OS   },
    { "drivers.tgz",  drivers_path,      nf_extract_drivers, SERIES_OS   },
    { "base2_2.tgz",  BASETGZ,           nf_extract_base,    SERIES_BASE },
    { NULL,           NULL,              NULL,               0           }
  };

となっているので、LINGUA=ja の場合はここに addon2_2-ja.tgz を
追加してやれば OK ?

残る問題は extract_base.c の extract_from_floppy() ですね。

たぶん

  status=getFloppies(_("The system is being installed from the %s floppy drive.\
n\nPlease insert base disk %d."),device,file);
  if ( status == 0) {
    status=extract_from_file(file,descr);
  } else {
    sprintf(prtbuf,_("There was a problem reading the %s from %s"),descr,device)
; 
    problemBox(prtbuf,_("Floppy Error!"));
  }
  if (NAME_ISREG(file,&statbuf)) {
    unlink(file);
  }

の後に extract_file() の場合と同様に addon の処理を追加してやれば
 OK だと思うんだけど。

そうすると utilities/dbootstrap/baseconfig.c の configure_base() の
後のほうで dpkg -r するより、extract_base.c と net-fetch.c に
 $LINGUA で処理を変更するコードを追加するほうが早いか。

 locale-ja は maintainer script で何かやってるってふうでも無いし。
 jfbterm は suidregister 使ってるけど、もともと base には suidmanager
入ってないから関係無いよね。

 locale-ja + jfbterm だけならパッケージサイズで 160k くらい、
インストール後のサイズで 500k くらいだから base に入れちゃっても
問題無いでしょうけれど、日本語だけ特別扱いはできないとか言われたら
アレなので addon で対応するという方向のほうがいいかもしれない。

まあとりあえずこのへんは -boot ML に投げてみようかと思いますが、
あちらでの議論に参加してくれる人、試しに実装してくれる人、を
こっち (devel@jp) でも募集しておきます。

さて。

  | > > debconf の作者に、debconf が /etc/environment の LANG を参照する
  | > > パッチを送りましたが、「ややこしい事したくない」という理由で
  | > > 採用を拒否されています。しょうがないので、dpkg-reconfigure を
  | > > シェル経由で起動するよう boot-floppies を変更しないといけない

  | > 1:2345:respawn:/usr/bin/jfbterm -e /sbin/base-reconfig
  | > 
  | > とかして /sbin/base-config に
  | > 
  | >      #! /bin/sh
  | >      exec /usr/sbin/dpkg-reconfigure base-config </dev/tty1 >/dev/tty1 2>&1"
  | > 
  | > といった sh script を別に作成する、ということかな。
  | 
  | どちらかというと後者です。
  | 具体的には、アーキテクチャ、LANG、TERM を見て適当なコンソールを
  | 立ち上げるラッパースクリプトを作ろうと考えています。こうする事で、
  | 中国語や韓国語などの他マルチバイトや、あるいはシリアルポートでの
  | ダム端末、点字コンソール等に道を開くのではと考えています。
  | 
  | # sensitive-x-terminal に近い?

この話のあと、吉山さんから以下のスクリプトをもらいました。

  %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%% 
#!/bin/sh
#trap fail SIGTERM SIGINT

# Are these required?
# bash reads /etc/environment in booting.
#. /etc/environment

# Set all locale related environment variables.
LC_ALL=$LANG
export LANG LC_ALL

# Display Usage if no arguments.
if [ $1 = "" ]; then
	echo "usage: $0 [-nnt] <command> [...]"
	echo "-nnt: don't run another terminal"
	exit 0
fi

case `/usr/bin/tty` in
/dev/tty|/dev/console|/dev/tty[1-9]*)
	TERMINAL=console
	;;
/dev/tty[p-za-e]*)
	TERMINAL=pseudo
	if [ "$DISPLAY" != "" ]; then
		TERMINAL=x
	else
		case $TERM in
		rxvt|xterm*|kterm)	TERMINAL=x;;
		esac
	fi
	;;
/dev/tty[A-Z]*|/dev/cu*)
	TERMINAL=serial
	;;
esac

case $TERM in
dumb)	TERMINAL=dumb
esac

export TERMINAL

# Why don't we use dpkg-architecture? 
# Because it isn't in the base archive.
case $HOSTTYPE in 
i386)	/bin/grep -q pc9800 /proc/version && SUBARCH=pc9800 ;;
esac

# initialize WRAPPER.
WRAPPER=""

case $LANG in
ja*)	
	case $TERMINAL in
	x)
		#WRAPPER="/usr/X11R6/bin/kterm -e"
		WRAPPER="/usr/X11R6/bin/krxvt -e"
		;;
	console)
		if [ "$SUBARCH" != pc9800 -a "$TERMINAL" = console ]; then
			# Any plathome except PC9800 require jfbterm
			# to display japanese fonts on console.
			WRAPPER="/usr/bin/jfbterm -e"
		fi
		;;
	# On pseudo and serial, we couldn't know
	# that terminal can display japanese fonts...
	esac
	;;
esac

if [ "$1" = "-nnt" ]; then
	WRAPPER=""
	shift
fi

# testing $WRAPPER
if test ! -z "$WRAPPER" && $WRAPPER /bin/true; then
	echo	exec $WRAPPER $@
else
	echo	exec $@
fi

  %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%%   %%%%% 

とりあえずこれを scripts/rootdisk/prototype/sbin/termwrap として
入れ、utilities/dbootstrap/extract_base.c の extract_base() の
最後にある

  if (NAME_ISREG("/target/etc/inittab",&statbuf)) {
    rename("/target/etc/inittab","/target/etc/inittab.real");
  }
  sprintf(prtbuf,"cp %s %s","/etc/inittab.install","/target/etc/inittab"); 
  execlog(prtbuf, LOG_INFO);

の後に

  sprintf(prtbuf,"cp %s %s","/sbin/termrap","/target/sbin/termwrap"); 
  execlog(prtbuf, LOG_INFO);
  sprintf(prtbuf,"chmod 755 %s","/target/sbin/termwrap"); 
  execlog(prtbuf, LOG_INFO);

を追加、とかするのなら、簡単そうだし、いけるんじゃないでしょうか ?
という方向で -boot に投げてみます。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)