2005年3月12日星期六

Knoppix Live Install的大致工作流程

我一直想不用remaster的方式给Knoppix添加中文支持,所以得先看看这个东西是怎样工作的。
问题是一篇文档也没有,我只能阅读knx-live-inst.sh这个脚本。

这个东西大致工作流程如下:
先 读取所有模块下的description(get_software()),然后用xdialog显示出来供用户选择要安装哪个模块 (choose_soft()), 然后调用该模块的eula.sh显示EULA(如果该模块有eula.sh的话),然后以non_interactive方式调用自身执行 install.sh(non_interactive()),如果安装成功完成就执行module的exit.sh(如果有的话)来完成一些post install操作,然后退出。

(下面简称Knoppix Live Install为KLI)

/usr/sbin/knx -live-inst.sh会先检查有哪些module可供安装(如果当前目录没有modules这个目录就检查缺省目录/usr/share/knx- live-inst/modules,这样倒是方便了自己括这新的module),目前提供了f-prot, flash plugin等模块。

每个module下面可能有如下一些文件
description 模块的描述文件
files 要从网上下载的文件,包含网地址、文件类型
install.sh 安装脚本
eula.sh (可选)用于显示End User License Agreement的脚本
一般用在一些非free的软件上,比如flash plugin, nvidia driver
exit.sh 安装完成后执行的脚本
menu (可选)指明需要在Kstart上创建的菜单项
exes (可选)指明程序所包含的可执行文件,KLI在AppDirs模式下使用,会在~/.dist/bin下创建相应的可执行程序
(实际是链接到~/Sofeware/$MODULE_NAME/bin/wrappper-$MODULE_NAME)

KLI 先读取所有模块下的description(get_software()),然后用dialog显示出来供用户选择要安装哪个模块 (choose_soft()), 然后调用该模块的eula.sh显示EULA(如果该模块有eula.sh的话),然后以non_interactive方式调用自身执行 install.sh(non_interactive()),如果安装成功完成就执行module的exit.sh(如果有的话)来完成一些post install操作,然后退出。

回头看non_interactive(),这个函数包含了安装的核心过程:
1. 先调用setup_destdir()修改~/.bashrc(将~/.dist/bin/加到PATH, ~/.dist/lib加到LD_LIBRARY_PATH)并创建~/.dist/bin/live-wrapper
2. 然后根据MODULE/files从网上下载指定的文件(用wget或者apt-get,见函数get_file()), 放到临时目录/tmp/knx-live-inst.$,检查md5
3. 将files列出的每个文件解压到/tmp/knx-live-inst.$/${MODULE_NAME} (knx-unpack())
4. 调用MODULE/install.sh执行模块特定的步骤
5. 如果模块有menu文件,安装菜单项目(install_icons())

再来看一些细节
1.文件下载
下载的文件可能会保存在~/.knx-live-inst/cache下(DL_DIRECTORY), 如果解压某个文件不成功会删除对应cache。
传入get_file的各个参数是:
$1: Module name
$2-$5: fields in files
$2: filename
$3: location to download (for apt type, it's empty)
$4: type (apt, tgz...)
$5: md5
注意这里是支持apt的,这可以让你安装跟当前系统配套的版本,而且这也可以利用debian丰富的软件包。

2. install.sh需要做的事情
主 要只有一件事: 将需要的文件从/tmp/knx-live-inst.$ (这也是install.sh开始运行时所在的目录),拷贝到合适的位置。如果是程序运行所需要的数据文件,为了统一,可以拷贝到~/.dist下去(不 要硬编码,用$DESTDIR变量)。可执行文件可以放到$(DESTDIR)/.dist/bin里面去。

3. live-wrapper
如果打算允许用户从桌面上运行,需要编写menu文件以便KLI创建对应的"快捷方式",这个快捷方式会用~/.dist/bin/live-wrapper来启动目标程序,以便PATH,MANPATH,LD_LIBRARY_PATH等问题不会影响程序运行。

live-wrapper内容如下:
#!/bin/bash

. ~/.bashrc (PATH, MANPATH等在~/.bashrc中设置)
PROG="$1"
shift
exec $DESTDIR/bin/$PROG "$@"


4. AppDirs模式
模 块可以采用AppDirs模式进行安装,就是每个模块各自一个目录~/Software/$MODULE_NAME,这样删除起来就比较方便。当用 AppDirs模式时,KLI会在~/.dist/bin下创建一个明为wrapper-${MODULE_NAME}的脚本,
DESTDIR=$DESTDIR (后面这个DESTDIR会在生成时被替换为实际值,
等于~/Software/$MODULE_NAME)
export MANPATH=$DESTDIR/man/:$MANPATH
export PATH=$DESTDIR/bin/:$PATH
export LD_LIBRARY_PATH=$DESTDIR/lib:$LD_LIBRARY_PATH
exec $DESTDIR/bin/$(basename $0) "$@"

然后对exes里面列出的每个名称在~/.dist/bin下创建一个到wrapper的链接。
最后KLI再调用install.sh执行后面的安装。
注意AppDirs模式下DESTDIR就是~/Software/$MODULE_NAME(所以前面说install.sh不要硬编码而要用$DESTDIR)。

没有评论: