一个 Debian bittorrent 软件


BT(BitTorrent)出现后,立即受到欢迎。一些好用的下载软件也随即推出,如Windows下常用的bitcomet。Linux下也有一些好用的BT下载工具,但多数都比较具备GNU简洁和命令行方式特色,因此不太受国人的喜受,如bittorrent,bittorrent-gui等。随着Linux桌面软件的发展,许多优秀的桌面软件不断推出,BT客户端软件也自然少不了了。今天推荐给大家的是收录到Debian(contrib)的一款非常好用的BT下载软件:Azureus。Azureus是一款基于Java的GUI软件,其功能非常丰富,并支持跨平台运行,因此,如果喜欢,你也可以在Windows或MAC下使用Azureus。软件基于GPL License,支持开放接口,用户可以根据需要创建自己的插件。

安装azureus非常简单,通过apt-get直接安装即可:

root@debian ~# apt-get update
root@debian ~# apt-get install azureus
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
将会安装下列额外的软件包:
libcommons-cli-java liblog4j1.2-java libseda-java libswt-gtk-3.2-java
libswt-gtk-3.2-jni
建议安装的软件包:
libgnumail-java libswt-mozilla-gtk-3.2-jni libswt-gnome-gtk-3.2-jni
推荐安装的软件包:
java-package
下列【新】软件包将被安装:
azureus libcommons-cli-java liblog4j1.2-java libseda-java libswt-gtk-3.2-java
libswt-gtk-3.2-jni
...
正在设置 libswt-gtk-3.2-jni (3.2-1) ...
正在设置 libswt-gtk-3.2-java (3.2-1) ...
正在设置 azureus (2.5.0.0-1) ...
root@debian ~#

安装完成后,可以在Internet站点下发现 Azureus 菜单项,直接选取即可启动。软件的使用说法就不介绍了,其包括了大多数BT客户端都具备的功能。


Debian Live

Debian live可不是Microsoft live service,其目的是创建Debian的可运行光盘版本,包括可运的CD、DVD、USB以及网络启动映像,开发基于Etch或更高的Debian版本。Debian live 的三条指导原则是:

  1. 使用未修改过的官方包;
  2. Live系统不能有配置文件;
  3. 没有Live系统到硬盘的安装程序。

目前,Debian live项目已经取得了一定的成绩,非稳定版本(unstable)和测试版本(testing)已经可以正常工作。如果希望了解更多的信息,可以订阅Debian live的邮件列表(debian-live-devel@alioth.debian.org),加入项目的IRC或查看项目Wiki,开发者可以通过Subversion直接获取项目最新代码:

svn co svn://live.debian.net/

可以从下面的站点下载Debian live CD:

用ndiswrapper驱动无线网卡

最近试了一下在Debian下安装无线网卡,由于是笔记本电脑的PCMCIA卡,这种卡多数只提供Windows的驱动程序而没有Linux的驱动,查了一些资料,发现可以通过ndiswrapper来完成将Windows驱动直接加载到Linux中使用的功能。下面就讲一下如何在Debian下安装ndiswrapper并配置无线网卡。

查到的文字中多数通过下载ndiswrapper源码,并通过重新编译核心等复杂的方法来完成,因为ndiswrapper需要编译一些用户工具并安装一个核心模块。这里介绍一下通过Debian的一些工具来辅助完成模块编译等工作的过程。要说明一下的是,如果你使用的是稳定版本或非稳定版本的较早期一点的核心,你可能直接在Debian的官方或非官方包中找到你想要的驱动。我使用的是Debian的unstable版本,最初测试时用的核心是kernel-images-2.6.8-3-686,并且可以发现安装包中有这个核心已经编译好的ndiswrapper模块。这样,所有的安装过程就简单到执行几条apt-get命令:

root@debian ~# apt-get install ndiswrapper-modules-2.6.8-2-386
root@debian ~# apt-get install ndiswrapper-common

不幸的是,我太喜欢新的东东了,所以过了几天,我的核心升级到了2.6.17-1,这时,对应的ndiswrapper模块没有了。这时,也不要先考虑到ndiswrapper的站点上去下载源码并编译,可以考虑通过下载并编译Debian包源码来完成ndiswrapper驱动的安装。Debian的安装包中的确有一个叫ndiswrapper-source的包,简单的想法肯定的下载后,下载当前核心的头文件(kernel-headers-2.6.17-1),然后编译并安装ndiswrapper的核心模块。不过,Debian提供更为简洁的方法来完成这些工作。

Debian中有一个叫module-assistant的工具,这个工具可以用来创建一个以当前核心为基础的模块核心编译环境,并提供菜单式的简洁操作界面来编译核心所支持的第三方模块。如果你的系统上还没有安装这个工具,通过下面的命令来安装:

root@Debian ~# apt-get install module-assistant

安装完成后,直接运行 module-assistant 可以看到一个 curses 的图形界面,提供一些菜单项,包括:

  • OVERVIEW: 总体介绍module-assistant的功能;
  • UPDATE:更新缓存信息,类似于apt-get update的功能,从镜像站获得包更新;
  • PREPARE:准备模块编译所需环境,如下载相应核心的头文件,配置文件,安装必要的工具等;
  • SELECT:选择需要编译的核心模块;
  • EXIT: 退出module-assistant。

与dselect相类似,一次模块的编译工作可以通过顺序选择一次菜单来完成。中间会有一些提示确认信息或安装一些新的软件包,根据提示确认即可。依次选择UPDATE和PREPARE后,module-assistant已经作好编译核心模块的必要准备工作。选择select项,进入一个新的选择页面,其中列出了可供选择的所有核心模块,从列表中找到ndiswrapper选中后确认,出现一个新的菜单。这个菜单是对于选中的模块可进行的操作列表,不再详细说明。仍然可以通过顺序选取每一项来完成模块的编译(前两项LIST和SEARCH可以不必选)。选择GET将从Debian提供的镜像站下载ndiswrapper源码,选取BUILD进行模块编译,这可能需要一些时间。最后,选择INSTALL,编译出的ndiswrapper核心模块被安装到系统的核心模块并自动完成模块的依赖更新和本模块依赖的软件的安装(如会安装ndiswrapper-common,ndiswrapper-utils包等)。

顺利的话,上面的过程完成后,ndiswrapper驱动就安装完成了,并且ndiswrapper工具也自动被安装到系统中了。安装完ndiswrapper是否就可以使用无线网卡了呢?还不行,上面的工作只代表着在Linux下使用Windows的基于ndis驱动的准备工作完成了。下面我们来安装无线网卡驱动程序,并简单说明一下如何进行配置。

安装PCMCIA无线网卡驱动

我用的是一款TENDA的PCMCIA无线网卡,查看驱动后,从inf文件中发现其基于Marvell的芯片做的,用的实际上是Marvell的驱动(mrv8335)。使用ndiswrapper时,通常只需要驱动程序中的inf文件和sys扩展名的文件。简单的方法是让ndiswrapper自己来选择需要哪些文件。将无线网卡驱动在Debian下解开(Debian下可以安装unzip和unrar等工具来解压或压缩zip和rar文件),选择windows2000或windowsXP的驱动目录,找到相应的inf文件,使用类似下面的命令来安装:

root@debian ~# ndiswrapper -i mrv8335.inf

完成后,驱动程序相关的文件将被复制到 /etc/ndiswrapper目录中,由ndiswrapper来管理。通过下面的命令可以查看ndiswrapper已经支持的驱动列表:

root@debian ~# ndiswrapper -l
Installed drivers:
mrv8335 driver installed

将网卡插好后,执行命令ndiswrapper -m将ndiswrapper模块加入到modprobe的配置文件中。加载ndiswrapper模块即可看到无线网卡接口设备了,通常名称以wlan开始,第一个为wlan0:

root@debian ~# ndiswrapper -m # 只需执行一次即可
root@debian ~# modprobe ndiswrapper

通过命令iwconfig可以看到一个叫wlan0的无线接口,通过ifconfig也可以看到这个接口。通过iwlist命令可以搜索无线网络情况:

root@debian ~# iwlist wlan0 scan

接下来开始配置无线网络了,相关的配置说明可以查看wireless-tools的相关手册,这里就不多讲了。一个示例命令如下:

root@debian ~# iwconfig wlan0 essid home_ap # 设置ESSID
root@debian ~# iwconfig wlan0 mode Managed
root@debian ~# iwconfig wlan0 key restricted XXXXXXXX

我的/etc/network/interfaces里有类似如下的配置:

iface wlan0 inet dhcp
pre-up modprobe ndiswrapper
post-down rmmod ndiswrapper
wireless-essid Default
wireless-key Off
wireless-mode Managed
wireless-rate auto

这样,当我要启用无线网络时,只需要使用命令:ifup wlan0即可自动完成驱动加载等工作;而当我要关闭无线网络时,也只要命名用ifdown wlan0即可自动关闭无线模块,并卸载ndiswrapper模块。

在Debian上安装Oracle Database XE

OracleXE 简介

甲骨文2005年宣布向中国市场推出的可免费下载的Oracle Database 10g Express Edition (Oracle Database XE) ,供专业人员在学习及应用开发的起步阶段使用。Oracle Database XE建立在Oracle数据库10g第二版的代码库之上,与Oracle数据库产品系列完全兼容。Oracle Database XE可用于32位Linux和Windows操作系统,在功能上,Oracle Database XE版相当于Oracle Standard Edition One。但由于是免费版本,在硬件上受到了一定的限制,如:

  • 至多使用1个CPU或1个双核CPU的处理能力;
  • 最多可使用1GB内存;
  • 每个服务器只限于一个CPU;
  • 最多存储4GB的用户数据。

安装Oracle XE

测试环境建立于Debian系统上,系统具备4Gb的磁盘空间用于建立数据库,500M以上的空间用于安装数据库。要数据库真正运行起来,那么你最好为你的系统配置1Gb的内存。下一步,我们将配置Debian的sources.list,加入oracle安装包的站点:

root@debian ~# echo "deb http://oss.oracle.com/debian/ unstable main non-free" >> /etc/apt/sources.list
root@debian ~# apt-get update

安装oracle database XE只需要简单的安装两个包即可,安装过程如下:

root@debian ~# apt-get install oracle-xe-client
root@debian ~# apt-get install oracle-xe

完成后,安装过程就完成了。安装过程会更新一些核心的配置参数,可以通过查看/etc/sysctl.conf来查看这些变化,如果你不想重启系统就启动oracle数据库,那么需要先应用这些配置。下面我们直接应用Oracle database XE的默认配置,如用户账号:

root@debian ~# sh /etc/init.d/oracle-sh configure

Oracle Database XE启动后,将打开服务端口1521,可以通过命令lsof来查看(lsof -n -i TCP:1521),默认安装的情况下,我们还可以通过Web管理接口在本机进行数据库管理(http://127.0.0.1:8080/apex)。我们可以通过 /etc/default/oracle-xe 文件来查看和更新当前 oracle 数据库的配置。

Oracle database XE的运行除了要求有一定数量的物理内存外,对交换空间也有一定的要求。Oracle Database 10g Express Edition 要求系统有1006MB的交换空间。如果不希望重启系统,你可以通过创建一个文件交换来达到这一要求:

root@debian ~# dd if=/dev/zero of=/MY_SWP_FILE bs=1M count=1000
root@debian ~# mkswp /MY_SWP_FILE
root@debian ~# swapon /MY_SWP_FILE

要启用或禁止Oracle database XE在开机时自动启动,可以通过 update-rc.d 工具来完成,或者修改文件/etc/default/oracle-xe文件,将其中 ORACLE_DBENABLED=true改为ORACLE_DBENABLED=false

对于如何使用Oracle database XE不是本文所涉及的内容,就不多讲了。

Debian与《玩具总动员》


到目前为止Debian的发行版名称均出自Pixar的电影《Toy Story》,中文名称叫做 “玩具总动员”。看看下面的发行版名称吧:

  • Buzz(Buzz Lightyear)是个宇航员,
  • Rex是只暴龙,
  • Bo(Bo Peep)是个放羊的女孩,
  • Hamm是个小猪攒钱罐,
  • Slink(Slinky Dog)是只玩具狗,
  • Potato当然就是Potato Head先生,
  • Woody是个牛仔,
  • Sarge是位绿色塑料玩具士兵首领,
  • tch(Etch-a-Sketch)是玩具黑板,
  • Sid是隔壁的男孩,那个玩具终结者。Sid还有一个解释,就是"Still in development" :)

1995年的玩具总动员(Toy Story)是第一部完全电脑动画制作的电影长片,讲述了六岁小男孩安迪的玩具有着它们自己的生活,新玩具太空战警巴斯光年的到来威胁到原来的玩具头领牛仔胡迪的统治地位。于是胡迪开始想方设法与巴斯光年作对,但结果是它们两个都阴差阳错地置身于屋外的世界。尽管巴斯光年有电动折叠翼、探照灯和腕式对讲机,可一旦离开主人的庇护,它也是寸步难行。更糟糕的是,它们还受到安迪邻居家的狗带来的威胁。于是它们只有捐弃前嫌相依为命,彼此相帮着找到回家的路。影片于95年万圣节在美国上映,以近2亿美元的收入成为当年的票房冠军。

1999年的玩具总动员2(Toy Story 2)延续了第一集的情节,讲述牛仔胡迪被艾尔玩具站的老板偷偷带走。原来胡迪是50年代最有名的组合玩具胡迪牛仔秀的大明星,艾尔预备将胡迪与其他与胡迪同组的玩具们运往日本的玩具博物馆,其中包括,老矿工、胡迪警长座骑以及女牛仔。于是胡迪终于与失散已久的同伴们团圆。在安迪家里,巴斯光年率领蛋头先生、抱抱龙、火腿及其他玩具出发前往艾尔玩具店,准备救出胡迪。经过四处寻找,玩具们终于在艾尔家中找到胡迪,不料胡迪却不愿回家。而巴斯又遇上他的死对头——札克大王。玩具们该如何同时对付:艾尔、札克大王以及不想回家的胡迪呢?本片评价极高,被媒体盛誉为超越前集的经典续作,而无论是从口碑还是票房上看,确实配得上这种夸奖。

另外,Debian的Logo也来自于这部电影,看一看玩具总动员的宣传画,在里面找一下,看能不能发现这个标志在什么地方呢?

一台Debian配置上配置多个Web服务

有许多虚拟服务器的提供商可以在一台主机上为多个用户提供Web服务,并且每个Web服务器可以通过不同的域名来访问。在Debian上,我们可以轻松的通过apache2来实现类似的功能。除了进行一些简单的配置外,我们所需要的软件包都使用Debian提供的安装包而不必从源代码来安装。

有许多种不同的方法可以将Apache配置这样的功能,这里介绍一种通过 NameVirtualHost 来进行配置的方法,这种方法的好处是你不需要在主机上绑定多个不同的IP地址,只需要将不同的域名都指向Web服务器的IP地址即可。

例如在一台主机IP地址为 222.222.222.222的Web服务器上,希望配置 www.rediceli.com,mail.rediceli.com,services.rediceli.com,只需要在DNS服务器(或DNS提供商的服务器)上将这些域名都指向222.222.222.222即可。当然,还可以是另一些完全不同的域名,如 www.example.com。

因为我们要在一台机器上提供多个Web服务器,为了不至于引起不必要的混乱,最好将每个服务器的Web根目录,CGI目录和日志目录等完全分开。可以直接在Debian提供的Web目录下构造这些目录,也可以在一个完全不同的目录里构造,如/opt/www目录。例如,可以类似如下的目录结构:

root@debain ~# mkdir /opt/www

root@debain ~# mkdir /opt/www/www.rediceli.com
root@debain ~# mkdir /opt/www/www.rediceli.com/html
root@debain ~# mkdir /opt/www/www.rediceli.com/cgi-bin
root@debain ~# mkdir /opt/www/www.rediceli.com/logs

root@debain ~# mkdir /opt/www/mail.rediceli.com
root@debain ~# mkdir /opt/www/mail.rediceli.com/html
root@debain ~# mkdir /opt/www/mail.rediceli.com/cgi-bin
root@debain ~# mkdir /opt/www/mail.rediceli.com/logs

root@debain ~# mkdir /opt/www/service.rediceli.com
root@debain ~# mkdir /opt/www/service.rediceli.com/html
root@debain ~# mkdir /opt/www/service.rediceli.com/cgi-bin
root@debain ~# mkdir /opt/www/service.rediceli.com/logs

上面的过程,我们分别为三个域名创建了Web服务器所需的目录。下一步,我们应该在apache的配置中开启虚拟主机(Virtual hosts)的功能。简单的方法是创建一个配置文件 /etc/apache2/conf.d/virtual.conf,文件的内容如下:

#
# We're running multiple virtual hosts.
#
NameVirtualHost *

完成上面的工作后,我们可以开始为每个域名建立一个独立的配置文件。Apache2的站点配置包括两个目录:

  • /etc/apache2/sites-available 这个目录包含一些可用的站点配置文件,但这些并不一定生效。
  • /etc/apache2/sites-enabled 这个目录内的配置为已经生效的站点的配置。

apache2启动时,sites-enabled目录的内容将被读取并生效,而sites-available目录的内容则不会理会。通常Debian的作法是,将所有的站点配置文件都放在sites-available中,而将需要生效的配置通过软链放置到sites-enabled中。我们配置时也会将所有的配置都放置到sites-available目录中,然后在sites-enabled中创建指向相应配置的链接。Debian有一些工具a2ensite和a2dissite来辅助我们完成允许和禁用站点的功能,这样,我们只需要在sites-available目录中创建相应的配置,再执行相应的命令,即可使这些配置生效或禁用。

下面我们开始为 www.rediceli.com 创建配置文件,创建文件 /etc/apache2/sites-available/www.rediceli.com,包含下面的内容:

#
# www.rediceli.com (/etc/apache2/sites-available/www.rediceli.com)
#
<VirtualHost *>
ServerAdmin webmaster@rediceli.com
ServerName www.rediceli.com
ServerAlias rediceli.com

# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /opt/www/www.rediceli.com/html/

# CGI Directory
ScriptAlias /cgi-bin/ /opt/www/www.rediceli.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>

# Logfiles
ErrorLog /opt/www/www.rediceli.com/logs/error.log
CustomLog /opt/www/www.rediceli.com/logs/access.log combined
</VirtualHost>

下面创建 mail.rediceli.com的配置文件,创建文件/etc/apache2/sites-available/mail.rediceli.com,包含下面的内容:

#
# mail.rediceli.com (/etc/apache2/sites-available/mail.rediceli.com)
#
<VirtualHost *>
ServerAdmin webmaster@rediceli.com
ServerName mail.rediceli.com

# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /opt/www/mail.rediceli.com/html/

# CGI Directory
ScriptAlias /cgi-bin/ /opt/www/mail.rediceli.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>

# Logfiles
ErrorLog /opt/www/mail.rediceli.com/logs/error.log
CustomLog /opt/www/mail.rediceli.com/logs/access.log combined
</VirtualHost>

最后在文件/etc/apache2/sites-available/service.rediceli.com中创建 service.rediceli.com的配置:

#
# service.rediceli.com (/etc/apache2/sites-available/service.rediceli.com)
#
<VirtualHost *>
ServerAdmin webmaster@rediceli.com
ServerName service.rediceli.com

# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /opt/www/service.rediceli.com/html/

# CGI Directory
ScriptAlias /cgi-bin/ /opt/www/service.rediceli.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>

# Logfiles
ErrorLog /opt/www/service.rediceli.com/logs/error.log
CustomLog /opt/www/service.rediceli.com/logs/access.log combined
</VirtualHost>

现在,我们已经为三个域名分别创建了配置文件,并建立了不同的目录来存放web页面,CGI程序和日志文件。要允许这些配置,可以通过下面的命令来完成:

root@debain ~# a2ensite www.rediceli.com
Site www.rediceli.com installed; run /etc/init.d/apache2 reload to enable.

root@debain ~# a2ensite mail.rediceli.com
Site mail.rediceli.com installed; run /etc/init.d/apache2 reload to enable.

root@debain ~# a2ensite service.rediceli.com
Site service.rediceli.com installed; run /etc/init.d/apache2 reload to enable.

注意:a2ensite并不会立即在当前运行的apache服务器里生效,必需通过重新启动apache来生效这些配置,这在前面解释a2ensite时已经解释过了,它的功能主要用于建立一个sites-enabled目录中的链接。

现在,你可以分别在每个站点的主目录里放置一个不同的主页文件(index.html),然后重启apache服务器,看一下是否可以通过三个不同的域名来访问不同的服务页面。重启apache服务器通过下面的命令来完成:

root@debain ~# /etc/init.d/apache2 reload
Reloading web server config...done.
root@debain ~#

好了,一个拥有三个虚拟Web服务器的Debian服务器配置完成了。如果你的服务器够强大,还可以类似的配置更多的站点。

通过debootstrap安装Debian

Debian的工具debootstrap可以用于在系统的某个目录中安装一套基本系统,这个基本系统除了一些配置项外,与Debian安装程序在安装的第一阶段安装的内容基本相同。这项功能有许多有趣的功能,例如,你可以从某个定制版本的Debian Live光盘上通过这个命令快速的在硬盘上安装Debian而不需要Debian的安装程序,也可以把创建在硬盘上的基本系统目录作为某些涉及系统安全性服务的chroot运行环境,通过chroot进入该目录并调试和运行一些可能修改系统配置的应用程序,作为定制小型系统模板等等。

Debootstrap必需以root身份来运行,如果当前系统中没有这个工具,可以通过下面的命令来安装:

root@debian ~# apt-get install debootstrap
下面我们来看一下,如何在当前Debian系统中某个目录里安装一个Debian的基本系统。假设我们将基本系统安装到 /root/chroot_env 目录下,只需要通过下面的命令即可完成安装过程:
root@debian ~# mkdir /root/chroot_env
root@debian ~# debootstrap sarge /root/chroot_env http://debian.cn99.com/debian
I: Retrieving Release
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional required dependencies: libtext-iconv-perl zlib1g
I: Checking component main on http://debian.cn99.com/debian...
I: Retrieving adduser
I: Validating adduser
I: Retrieving apt
I: Validating apt
....
I: Installing core packages...
I: Unpacking required packages...
I: Configuring required packages...
I: Installing base packages...
I: Base system installed successfully.
root@debian ~#
几分种后(取决于你选取的Debian镜像和网络速度等),安装过程结束,在目录 /root/chroot_env中已经有一个全新安装的Debian基本系统。我们可以通过chroot命令来进入到该基本系统环境:
root@debian ~# chroot /root/chroot_env
root@debian /# ls
bin dev home lib mnt proc sbin sys usr
boot etc initrd media opt root srv tmp var
root@debian /# apt-get clean
root@debian /# du -sh
111M .
基本系统大约110M左右。如果希望在基本系统中执行一些与系统相关的命令,应当先在该基本系统中加载proc文件系统,并且其反映的一些信息都是当前系统的信息。
root@debian /# mount -t proc proc /proc
root@debian /# ps -aef # 将显示主机的所有进程
...
root@debian /# hostname # 将显示当前主机名而非新系统主机名
redice
如果上述过程中,/root/chroot_env目录挂接了一个硬盘分区的话,新的系统将可以通过Lilo,grub等作为根分区来引导系统。这时,需要进行一些必要的配置,如/etc/hosts,/etc/hostname,/etc/network/interfaces文件等都需要进行适当的修改。另外,由于通过debootstrap进行安装时,无法确知硬盘的分区情况,因此,还必需手工修改/etc/fstab文件。

从源代码编译Debian包

Debian优秀的包管理无疑是其吸引人的一个重要原因,安装于Debian系统的所有包有着紧密的依赖关系。举个例子来说,假设你只希望安装一个叫 foo的包,这个包依赖于其它的一些库或工具,如libbaa,那么当你使用:

apt-get install foo

来安装这个包时,实际上这个过程会提示并安装foo所依赖的包libbaa。反之,如果你通过命令:
apt-get remove libbaa

来御载libbaa,毫无疑问的,apt工具会提示包foo也将被御载掉。这样,Debian的系统将始终保持着一种稳定的完整性,不存在安装但由于依赖性而不可用的软件(但可能存在安装但没有用的软件或库,但可以通过一些工具将这些包删除掉)。

显然,如果我们自行从源代码通过常规的 make/make install的方式进行安装,系统的这种完整性就会被破坏掉。虽然Debian的官方和非官方的站点提供了大量的应用软件和库,但有时我们为了在系统中使用最新版本的软件或对某些软件需要特别的配置,还是有可能需要从源码生成可执行文件。这就有必要了解一下该如何生成一个deb包,并可以通过Debian的包管理工具进行统一的管理。

从头开始制作一个debian的安装包并不容易,只有软件的开发者或对该软件有相当了解的人才能制作一个善的deb包。从最基本的原代码开始,必需对代码所依赖的编译环境,编译时库和运行时库或其它软件条件支持等非常了解和全面。如果只想学习一下过程,完全可以从Debian的镜像站点中下载Debian软件包和对应的支持文件来编译一个Debian的安装包。下面我们以编一个gaim包的过程简要说明一下如何制作一个debian的安装包并制作第三方发布镜像。

获取源代码
首先,从Debian的镜像站点下载gaim的源代码及Debian的补丁和支持文件(扩展名dsc的文件),包括:
  • gaim_1.5.0+1.5.1cvs20051015.orig.tar.gz
  • gaim_1.5.0+1.5.1cvs20051015-5.dsc
  • gaim_1.5.0+1.5.1cvs20051015-5.diff.gz
其中,第一个文件为gaim的源代码,通常是从源码开发者所提供的代码发布版本或源代码库中取得(如CVS或Subversion),本例中的gaim即是从CVS库中获取的2005年10月15日的代码版本,从版本号看,应该是1.50版本之后经过修定,但1.51版本尚未推出时的一个版本。Debian代码库中对这些源代码通常会保持其原状而不作任何修改。

第二个文件包含了一些编译过程和Debian包所需的一些信息,包括包名,版本号,生成deb包的名称(一个源码可能不只生成一个.deb的包,如gaim源码会生成gaim, gaim-dbg, gaim-dev, gaim-data几个.deb的包),作者/发布者,平台,编译环境依赖,冲突,包签名和Hash等信息。

第三个文件为Debian为了编译.deb包而对源代码所作的修定,有时还可能包括对一些功能的改进或对Bug的修改等。最主要的,这个补丁会在源代码目录中增加一个包含了如何生成Debian发布包信息的目录,目录名称debian。

从源代码编译debian包
前面已经提到,dsc扩展名的文件内包含了编译一个源码包所依赖的其它软件包,编译前,我们应该确认一下这些包否已经安装,并且版本满足要求。本例中,编译gaim所依赖的其它软件有:
bzip2, cdbs, debhelper (>= 5.0.0), libgtk2.0-dev, libxss-dev, libgnutls-dev (>= 1.0.16-5), tcl8.4-dev, tk8.4-dev, libao-dev, libaudiofile-dev, libgtkspell-dev, libltdl3-dev, libstartup-notification0-dev, xutils, libzephyr-dev, libxml2-dev, libebook1.2-dev, libedata-book1.2-dev, libcamel1.2-dev
要查看一个包是否安装,可以通过dpkg命令来查看,如查看是否安装bzip2:
redice@debian $ dpkg -l bzip2
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description========================================
pn bzip2 (no description available)
上面的信息说明没有安装bzip2,通过 apt-get install bzip2 安装bzip2后,再次查看:
redice@debian $ dpkg -l bzip2
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-===================-===================-======
ii bzip2 1.0.3-2 high-quality block-sorting file compressor - utilities
确认上面所有依赖的包都已经安装好后,可以开始编译gaim包了。编译过程较为简单,通过下面几条命令即可完成:
redice@debian $ dpkg-source -x gaim_1.5.0+1.5.1cvs20051015-5.dsc
redice@debian $ cd gaim-1.5.0+1.5.1cvs20051015
redice@debian $ fakeroot dpkg-buildpackage
简单说明一下,第一条命令用于将上面下载的源代码包解开到目录gaim-1.5.0+1.5.1cvs20051015中,并打上debian补丁包,然后通过debian专用的编译debian包的工具dpkg-buildpackage完成对源代码的编译工作。fakeroot是一个使普通用户可以虚拟的完成超级用户才能做的一些功能的库,如通过fakeroot普通用户可以执行mknod等功能。

编译完成后,在源代码的上级目录会生成几个deb扩展名的包,本例中会生成以下几个文件:
gaim-data_1.5.0+1.5.1cvs20051015-5_all.deb
gaim_1.5.0+1.5.1cvs20051015-5_i386.deb
gaim-dbg_1.5.0+1.5.1cvs20051015-5_i386.deb
gaim-dev_1.5.0+1.5.1cvs20051015-5_i386.deb

构建一个本地包发布库
这样构造出来的包可以通过dpkg直接安装,更好的方式是构造一个类似于非其它Debian非官方的包发布站点的库,这样可以直接通过apt-get或dselect等工具来进行统一的管理。

假设我们只需要在本地构造一套发布库,如/opt/my_packages。建立目录/opt/my_packages,将生成的所有deb扩展名的包复制到该目录,然后通过Debian工具dpkg-scanpackages来生成索引文件。
redice@debian $ mkdir -p /opt/my_packages
redice@debian $ mv *.deb /opt/my_packages
redice@debian $ dpkg-scanpackages /opt/my_packages /dev/null | gzip -f9 > /opt/my_packages/Packages.gz
以root身份更新 /etc/apt/sources.list后,即可通过 apt-get 或dselect等工具来安装刚生成的这些Debian包了。
redice@debian # echo "deb file:/opt/my_packages ./" >> /etc/apt/sources.list
redice@debian # apt-get update
redice@debian # apt-get install gaim

通过网络安装Debian Linux

通过网络来安装Debian是一件非常愉快的事情,这对于理解Debian的先进性也是有极大帮助的。简单的说,通过网络来安装Debian只需要有一个可启动的网络安装引导程序就行了,这个引导程序只包括基本的操作系统和部份安装工具等。启动界面后,安装程序在进行简单的语言和键盘等基本配置后,立即配置网络,成功后,即开始下载安装程序的余下部份并开始与本地安装一样的安装过程。

通过网络安装Debian需要具备网络安装包,这个包可以从Debian镜象站点获得,网络安装包可以是一个小型的光盘映像(ISO),也可以是由一个核心和一个Ramdisk两个文件组成的可通过lilo,grub,ethboot,syslinux, Loadlin等启动的最小系统。两种形式本质上没有什么区别,ISO只是将后一种的两个文件通过mkisofs工具和isolinux制作成了可引导光盘而已。以Debian3.1为例,可以从Debian的镜像站点的netboot目录中找到网络安装包,如:

netboot目录包括一个可启动的网络安装光盘 mini.iso,这个光盘可用于在虚拟机,如Qemu, bochs, VmWare,VPC等上使用,也可以刻录到小型光盘上后通过光盘启动来安装。不过这好象有点浪费了,因为这个光盘只有8.1M而已。

另外有一个压缩包netboot.tar.gz,这个文件实际上是除了mini.iso以外的其它文件的归档压缩文件。余下的这些文件可以用来通过网络启动来安装Debian。如果你的BIOS支持网络引导,那么可以在另一台Linux系统上解开这个压缩包,并配置网络引导服务支持如tftp等,这样就可以从一台完全的裸机不加任何额外的界质,从网络安装Debian系统。

通过 Mini.iso 安装Debian

通过Mini.iso来安装系统通常只会在需要进行多次安装或使用虚拟机安装的情况下才会使用。刻录成光盘后安装没有什么问题,与常规安装相似一路确认,不同的是配置网卡会被提前到安装包之前。通过虚拟机来安装更简单,下载iso映像文件后,在虚拟机中加载,并设置虚拟机通过光驱来启动即可。以qemu为例:
Linux $ qemu -cdrom mini.iso -hda -m 256 -boot d
Qemu会从光盘上启动,并进入安装过程。VPC、VmWare等可以通过图形配置或菜单来配置从光盘启动。

通过已有的Linux来安装Debian

如果已经有一个Linux的发行版本,如 Redhat等,则可以通过当前系统的Loader来引导并安装Debian。较旧的一些发行版通常使用lilo作为loader,新一些的开始使用功能更为丰富的grub作为Loader。在已有的Linux基础上安装Debian可以通过下载安装程序核心linux和initrd.gz并配置Loader,增加一个启动项。以grub为例,建立目录/boot/deb,并从上面提供的地址下载2.6核心版本的安装程序到该目录,参考的grub配置(menu.lst)如下:
...
title installer
root (hd0,0)
kernel /boot/deb/linux vga=normal ramdisk_size=10934 root=/dev/rd/0 devfs=mount,dall rw
initrd /boot/deb/initrd.gz
...
重启后,可以看到多出一个叫 installer 的启动菜单项,选择后可进入安装程序界面进行安装。

通过DOS系统进入网络安装

与上面的方式类似,先下载安装程序核心linux和initrd.gz,然后下载 DOS 方式下Linux引导工具Loadlin.exe,进入DOS方式后,通过下面的命令启动安装程序:
loadlin linux root=/dev/rd/0 initrd=initrd.gz ramdisk_size=10934 devfs=mount,dall rw
其它方式

如果要在一个局域网内有一个bootp服务器,则可以通过网络启动来加载安装程序。如常见的PXE,主机启动后直接查找bootp服务器,并下载核心和initrd,加载后启动进入到安装程序界面。安装程序和启动配置参数都配置在bootp服务器上。如果网卡不支持PXE,还可以通过在客户机上安装带网络支持的grub来远程加载和引导安装程序。