2009年7月12日星期日

怎样正确的创建Slax的模块

如果你是Slax模块的唯一使用者,你可以任意的定制它们。但是,如果您想与其他用户分享你的模块,你必须遵循以下文档中描述的规则。该规则旨在把有益于最终用户放在首位;所以,如果你违反了相关规则,你的模块将永远不会被官方Slax仓库接受。

技术简概
Slax模块是被压缩过的以.lzm为后缀的squashfs(一套供Linux核心使用的GPL开源只读压缩档案系统)文件系统。该模块由mksquashfs工具创建,并可使用unsquashfs工具进行提取(解压)。这两种工具已经包含在Slax中,且被修改以支持LZMA压缩算法 。

每个Slax模块都包含完整路径的目录和文件。例如,一个包含bash(包括二进制文件和一些man页面)的模块可能像这样:

/bin/
/bin/bash
/usr/
/usr/man/
/usr/man/man1/
/usr/man/man1/bash.1


规则

1) 你模块中的所有目录都必须能被普通用户访问。重置所有目录的权限为755 (drwxr-xr-x),除非有合理理由使用不同权限于特定目录。

find ./ -type d | xargs chmod -v 755;


2) 尽可能地保持你的模块最小。解压所有需要保留的文档(例如man页面,因为LZMA可以更好的压缩它们),删除运行此软件所用不到的文件(例如:不需要的文本、声音、png/jpg图像、/usr/share/locale中的翻译文件),去除二进制文件中不需要的代码。

find ./usr/man/ -type l -name "*.gz" | xargs -r gunzip -f
find ./usr/man/ ! -type l -name "*.gz" | xargs -r gunzip
find . | xargs file | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded


3) 如果你是从源代码来编译模块,那么你必须提供建立这个模块时所需要用到的编译脚本。这个编译脚本必需控制整个模块的创建,任何需要手工操作(复制/删除文件等)都是不允许的。这些脚本就像是说明文档一样告诉别人如何编译你的模块;如果有一天你停止更新模块了,其他人将可以通过阅读脚本简单的把你的模块接手并重新建立。请复制你的编译脚本到:

/usr/src/slaxbuilds/your_module_name.slaxbuild

4) 当你编译软件时,请确保正确的 cflags 和 参数。一般推荐使用 i486 构架(以提供良好的向下兼容性),如果你的代码想在i686下提供更好的性能,在Slax里你可以使用 'configure-for-slax' 快捷方式。它会得到你想要的效果::

CFLAGS="-O3 -march=i486 -mtune=i686" ./configure --prefix=/usr --build=i486-Slackware-linux

5) 在你的模块里永远不要包含任何在 Slax 里已经存在的文件,即使你曾经更改过它。换句话说,你的模块永远不要覆盖任何 Slax 里存在的文件。除非你有特别的原因,一旦你覆盖掉任何 Slax 里的文件则会产生无法兼容新版本 Slax 的问题,并造成其他用户产生无法预知的错误。如果你一定要覆盖掉某个Slax 里的文件(例如:在/etc/ld.so.conf里增加一个新的路径),有一个替代方案就是自己写一个开机启动脚本,尽量在开机启动脚本里来处理(修改/更新)特定的文件,而不是直接覆盖掉。

例子:在启动脚本里删除 ld.so.conf 一行,并在最后添加一个新行:

#!/bin/bash
sed -i -r '\;/usr/local/lib;d' /etc/ld.so.conf
echo '/opt/kde/lib' >> /etc/ld.so.conf

这个是一个永远不要在你模块里出现的文件的简单列表:
/etc/init.d
/etc/rc.d/rc.S
/etc/rc.d/rc.M
/etc/rc.d/rc.K
/etc/rc.d/rc.local
/lib/modules/2.6.x/modules.dep
/lib/modules/2.6.x/modules.alias
/etc/ld.so.conf
/etc/ld.so.cache
/etc/passwd
/etc/group
/etc/shadow

6) 如果你的模块需要在系统启动或关闭时执行,请使用sysvinit式目录。最好的办法是弄一个通用脚本在 /etc/rc/d/init/d 目录,同时这个脚本同样可以使用 'start' 和 'stop' 等参数。所有在这个目录的脚本都会通过 'start' 参数在开机时启动模块,在关机时通过 'stop' 来关闭。你可以选择大写的S(start)或者大写的K(kill)为开头的链接到对应于运行级别(runlevel)的 sysvinit 目录下的脚本,例如/ etc/rc.d/rc3.d/。每次运行级别改变,Slax 会执行改变前运行级别所对应目录里所有以K开头的脚本,然后再启动改变后所对应目录里所有以S开头的脚本。

在下面的例子里,Slax 将会在 runlevel 3 (这意味着系统启动过程)里执行 'apache.sh start',同时在 runlevel 0 或 runlevel 6 (这意味着,当Slax要关机或重新启动) 里执行 'apache.sh stop' 。

# 简单的通用脚本:: /etc/rc.d/init.d/apache.sh

#!/bin/bash
if [ "$1" = "start" ]; then
echo "start apache @ startup"
... start apache here ...
fi
if [ "$1" = "stop" ]; then
echo "stop all apache @ shutdown"
... stop apache processes here ...
fi

# 当你的通用脚本建立后,创建如下链接:

ln -s ../init.d/apache.sh /etc/rc.d/rc3.d/S-apache
ln -s ../init.d/apache.sh /etc/rc.d/rc0.d/K-apache
ln -s ../init.d/apache.sh /etc/rc.d/rc6.d/K-apache

7) 如果你的软件可以在图形用户界面(GUI)里运行(例如: KDE,XFCE 等),你必须包括一个图标,并添加一个菜单条目文件到你的模块里,这样用户就可以在菜单里很容易的找到并运行它。增加一个菜单条目只需要简单的建立两个文件:

/usr/share/applications/your-application.desktop
/usr/share/pixmaps/your-applications-icon.png

第一个文件( *.desktop)描述了菜单条目。它看起来可能像:
[Desktop Entry]
Encoding=UTF-8
Exec=firefox %u
Icon=/usr/share/pixmaps/firefox.png
Type=Application
Categories=Application;Network;
Name=Firefox
Name[cs]=Firefox
GenericName=Web Browser
GenericName[cs]=Webovy prohlizec
MimeType=text/html
X-KDE-StartupNotify=true

8) 当你模块里的软件开始运行,它应该能马上运行而没有任何不必要的对话框,比如提示“今日新闻”,“应用技巧”,许可协议等这些东西。请记住你的模块很可能是运行在一张只读CD上,它没办法保存选项之类的东西,不要让模块每次运行时都去打扰你的用户。

9) 你的模块依赖性应该尽可能的低。意思是,你的模块尽量不要依赖别的模块,最好能独立运行,同时别忘记模块尽可能的小。例如:你的模块可以在没有 Python 的情况下安全的运行,那就从你的模块里干掉 Python,而不是包含它。

如果你需要包含一些只会被你的模块使用的函数库,请把它们直接包含在你的模块里,而不是分开几个部分。例如:xfce 需要一堆的 xfcelib* 库文件,而别的模块几乎都用不到。那么就把它们打成%

另一方面,当你或者其它模块都会用到的一些函数库,请独立打包上传它。并且不要包含在你的模块里。比如 Python 应该永远被独立上传,同时不会被任何模块所包含。



上传你的模块


当你的模块遵循如下规则,你可以与他人共享。官方模块应该尽可能的帮助最终用户;同样的让一个模块有一个好的图标也很重要,一个屏幕抓图可以显示你软件在运行时的效果(请使用默认的 KDE 风格窗口),并且有必要提供一个有意义的描述,这些都有助于人们更多的了解这个模块。

一些库或程序没有任何的用户界面,在这种情况下没必要抓图。但是为你的模块弄一个不错的图标还是很要必要。没有图标的模块将很难被接受,如果你认为这个模块不可能找到一个适合的图标,那请多想想。你的模块图标并不需要独一无二,但是用户必需能够通过图标快速的分辨出你是一个文字编辑器还是一个Email编辑器。

标题应不包含任何不必要的破折号、下划线什么的,并强调只要有软件名称、其次是版本编号就可以了。以下是正确的: vim 7.1. 以下是不正确的: vim_7.1-112-i486-15

描述必须足够长,以便使分类概况看上去很好,但应该只包含对用户有用的信息。这些描述是给一个完全不清楚用途和不知道里面有什么东西的用户看的。不要弄虚作假,不要留联系方式,也不要有错别字、惊叹号,也不要包含更新日志。推荐长度超过40个字。

标签:


评论: 发表评论

订阅 博文评论 [Atom]





<< 主页

This page is powered by Blogger. Isn't yours?

订阅 博文 [Atom]