2024年4月25日

HYEOS

随事而为

用Debian建设一个自己的Linux发行版(转)

2 min read

建设一个自己的Linux发行版是每个自由开源软件爱好者的一个梦想.这曾经是一件难度非常高的事情,能做一个Linux发行版的人也是凤毛麟角,自己能做一个Linux发行版曾经也是极其荣耀的事情.但是,本身提倡发挥自身潜力,提倡自己亲身实践精神的自由开源世界,是不会把大家都期盼的事情故意打扮成远离大众的冰雪美人,她会不断地改革自身的发展机制,让每个人都逐渐地参与到自己的发展中间来,从而也促进自身的发展.

简而言之,现在,做一个Linux发行版并不是困难的事情.
一 做一个Linux发行版的基础问题.
我想,要做一个Linux发行版,你首先要考虑的问题是:
1 为什么要一个Linux发行版?
2 是打算从无做起,还是在其他的Linux发行版的基础上进行修改?
3 做一个自己的Linux发行版的关键和难点是什么?
4 选择哪个现有的Linux发行版开始自己的工作.

先来看第一个问题,为什么要一个Linux发行版?
这个问题的答案很多,比较普遍的一种就是我就想做,没有理由,一定要说理由的话,我就借用一句时髦的话:Just for Fun!,这就是很好的理由了.

然后一个重要的理由是:我需要一个满足我自己的特殊需要的Linux发行版,比如说:我正在学习Perl编程,我需要一个小型的,随时跟着我的perl编译系统,其他的东西都可以不要,那么我需要制作一个支持USB启动的Linux发行版,上面只有基本系统加编辑器加Perl,我可以随身携带,只要有电脑我就可以随时开始我的学习.

至于我为什么想做一个Linux发行版,原因很简单:我是一个老师!我觉得做一个符合教育规律,以教育相关软件为主的Linux发行版很有必要,再具体一点,我是一个地理老师,现在的新课程标准与时俱进,要求学生学习GIS知识,无论是必修模块还是选修模块都有要求.我看不惯我们的地理教育者们一讲到GIS教育,就言必称ArcInfo和MapInfo,仿佛那些即便是国内很富有的学术研究机构都不舍得破费购买的软件是随处可拣一样.在在自由开源的软件世界里,有着极其丰富的3S(GIS,GPS,RS)地理软件.就GIS软件而言,就有几十上百种之多,著名的如Grass QGis等,这些免费的软件虽然在功能上比不上商业软件,但是足以满足以理解基本GIS基本概念为目的的一般GIS教学.而且这些软件还有一些自己的优点和长处.再考虑到我们目前的学校电脑都是运行Window这一现实,我就想做一个自己的,以光盘形式启动和运行的,以GIS软件为主的,性能和运行速度都令人满意的Linux发行版.
(注:类似的系统目前世界上已经有多个,包括联合国教科文组织的FreeDUC,即含有QGis,只不过还没有支持中文的)

自己要做一个Linux发行版的第三个理由就是为名为利,有些人做一个发行版是为了赚钱和盈利,这并不与自由软件以及GPL版权发生冲突,RedHat近来的盈利给许多的年轻人带来了新的幻想,都期待自己也许能够成为下一代的比尔盖茨.另外一些人做了自己的发行版就在网络上提供免费下载,使用的人越多他就越高兴,他只收获自己所看重的善名和对自己技术的赞誉.

总之,有很多的理由使我们需要建设一个自己的Linux发行版,尤其是工作在教育第一线的广大教师!

2 如何开始做一个自己的Linux发行版
然后我们要解决第二个问题,我做一个Linux发行版是选择从零做起还是在别人的Linux发行版的基础上,加以以自己的意愿而进行的修改呢?

其实,我们所说的从零开始是相对而言.你从哪个零开始呢?是从自己编写一个OS开始?还是从自己编译配置现有的Linux内核开始?

我想我们是不可能从真正的零开始的,那也绝对不可能是一个人所能完成的工作,我们应该在前人的工作的基础上开始自己的工作.就制作自己的Linux发行版而言,就是这种对前人工作的继承可以划分为这么两种情况:

A 只基于现有的Linux内核及其他源码做自己的Linux发行版
这种情况其实就是基于LFS(Linux from Scratch)制作自己的Linux发行版.由于LFS是在利用源代码的基础上,从零开始建设自己的Linux发行版,因此,采用这种方法制作自己的发行版最能使制作者深入了解Linux中各种软件之间的关系,深入了解Linux内部的一些运行机制.但这种方式耗时长,难度相对较大,适合对事情喜欢刨根问底的人士.
基于LFS制作的Linux发行版看起来都是个人玩赏的作品,闻名于大众的作品很少.

B 基于现有的其他Linux发行版制作自己的Linux发行版
这种情况就是在现有的著名的Linux发行版中,挑选自己中意的Linux发行版再按照自己的意愿进行剪裁,添加,加工,然后做成自己的Linux发行版.

这种方式简单快速,适合于一般用户或者急于制作出成品的用户.现在采用这种方式制作的Linux发行版犹如恒河沙数,已经难以统计,其中著名的作品不少,是否会有一两个成为下一代的OS霸主那也难说。

为了快速简便地达到做一个自己的Linux发行版的目的,我们选择在已有的Linux发行版的基础上加以改造以建立自己的发行版的方式。那么,我们选择哪个发行版作为我们的起点呢?回答这个问题之前,我们先来解决第三个问题。

3 做一个自己的Linux发行版的关键和难点是什么?
做一个自己的Linux发行版的关键和难点在哪里呢?初入门者可能觉得难点在于如何启动一个自己的Linux系统,其实不然。我想定制一个自己的Linux发行版的关键就在于解决发行版之中的各种软件包之间的以来关系。

自由开源软件既使用前人的源码,也对后人开放自己的源码,所以,自由开源软件总是相互使用各种不同的软件包,这一方面给软件的开发带来了极大的便利,另一方面也使各个软件包的之间的关系错综复杂,常给软件的集成带来灾难性的后果。比如说,你打算在你的发行版中安装软件A,B和C,而A的运行需要依赖包A1,A2和A3,B的运行需要依赖B1和B2,C的运行需要依赖C1,为了安装软件A,B,C,你就必须安装A1,A2,A3,B1,B2,C1,安装好了后,发现A1的运行又要使用库A11和A12,C1的运行需要使用库C11,等你费了九牛二虎之力找到A11,A12和C11的源码来编译,安装之后,才发现A12和C11是相互冲突的!你哭吧!

所以,我认为做一个自己的Linux发行版的关键在于正确地解决好各个软件包之间的依赖关系。

4 选择哪个现有的Linux发行版开始自己的工作
那么到底选择哪个现有的Linux发行版开始自己的工作呢?我想这会司一个萝卜和青菜的问题,你可以选择FC,你也可以选择Slackware,但是从我上面的叙述来看,显然我是倾向于选择基于Debian来开发定制自己的发行版的。我认为Debian的最大长处就在于其先进的,独特的软件包管理方式,通过世界各地的优秀的程序员的辛勤无私的工作,很好地解决了各种自由开源软件之间的依赖,冲突等关系,使Debian拥护可以采用一种所有操作系统中最便利的方式安装软件,同时也给基于Debian开发定制自己的发行版带来了极大的便利性。

当然,也有人可能会说,FreeBSD的软件包的管理方式也很便利和强大,为什么不选择FreeBSD呢?这是因为FreeBSD并不遵守GPL版权,其自己的FreeBSD许可证并不允许基于FreeBSD开发个性化的发行版,所以我们只有望洋兴叹。

现在我打算基于Debian开发定制我的发行版了,还能不能有更简便的开发之道呢?考虑到我的实际开发需求,我只需要开发一个用于教学用的演示系统,我最好做成一个LiveCD,即在光盘上运行的Linux定制系统,我打算基于Knoppix或Morphix系统来开发我的定制系统。

Knoppix是一套基于Debian开发的著名的LiveCD系统,使用了一些独特的技术使得在它上面的再开发又比在Debian上面开发更容易,而Morphix又是基于Knoppix开发的模块式的LiveCD,从它的名字看,Morphix的意思就是变形Linux,它是为定制个性化Linux而生的!它把定制Linux系统的简便性又推进了一步!

但人们还是不满足,有人还在开发remaster,开发TROM等,他们的目标在于:在一个图形界面下,点几下鼠标,新的定制的发行版就产生了!这一天可能不要多久就要来到!这是令人振奋的消息还是令人恐怖的消息呢?至少我是感觉挺紧张的,我要快点写这篇文章,赶在那种软件产生之前完成这篇文章,否则的话,只要点几下鼠标就可以造出自己的发行版,谁还来看我的文章呢?

Debian-->Knoppix-->Morphix,基于这三个发行版的定制开发越来越容易,但在我的实际运用中,基于Morphix以及更简便的TROM工具的开发经常出错,而基于Knoppix的开发却很稳定,所以,我决定基于Knoppix开发一个中文版的GIS发行版。

二 具体的开发过程。
以下是我的具体开发过程,当然是在参照各位前贤的文章基础上写的,但根据我自己的理解,并针对新的Knoppix版本做了一些变动。文章完全是在一台Windows机器上凭记忆所写,所以有些细节上的错误。

1 准备工作:
我想准备工作的第一步就是看一下你的电脑是否足够强大!最好一G内存,二G交换分区,十G以上硬盘!当然256M内存+1G交换分区也能工作,慢一些而已。硬盘空间尽可能大,我开始的时候大手大脚地进行定制,竟然搞到8G硬盘不够空间!当然,我下面写的过程是小心翼翼地使用硬盘空间,及时地删除和卸载不用的空间,应该有3-4G硬盘空余就可以了。

然后要安装cloop的相关软件。引入cloop我想是Knoppix的最大特点,我使用的是Debian系统,那么:
#apt-get install cloop-utils
就可以了。

再然后就是获得最新版本的Knoppix了,当前的最新版本是3.7了,但似乎还没有正式宣布,我们就使用3.6的版本吧,后面假设我下载来的是knoppix36.iso吧。刻不刻盘不影响后面的定制工作,我就不刻盘了。

再就是建立工作目录,我在工作目录中建立了一个/wen的目录,其中又建立了old和new两个子目录,显然前者是存放knoppix36.iso的原有内容,而后者将存放经过我改造后的内容。

2 开始定制改造。
先要挂载knoppix36.iso这个滚滚盘映像文件:
#mount -o loop -t iso9660 /root/knoppix36.iso /mnt/cdrom
显然我下载的knoppix在root目录下而我把它挂载在/mnt/cdrom下,后面这两个参数都可以根据实际情况修改。

现在你可以进入到/mnt/cdrom中去看一下knoppix中到底有些什么东西了,有一个boot目录,显然这还启动有关,以后你要修改启动画面等,就要去修改这里面的东西了,我们现在暂时不理会这些。还有一个Knoppix目录,它下面有一些文件,其中一个KNOPPIX文件巨大达到近700M!这个就是我们要修改的主体了!

下面我们先把/mnt/cdrom下的所有内容拷贝到/wen/new下面,因为我们需要修改的只有KNOPPIX这一个文件,等下我们会删除的,但现在还有用:
#cd /mnt/cdrom
# cp -R * /wen/new/
#umount /mnt/cdrom
你现在甚至可以删除knoppix36.iso文件以节约硬盘空间了。

下面我们要对/wen/new/KNOPPIX/KNOPPIX文件动手术了,这个文件巨达700M,还是使用cloop压缩的,所以我们首先要解压:
#cd /wen/new/KNOPPIX/
#extract_compressed_fs KNOPPIX > tmp.iso
将解压的结果以tmp.iso的形式放在根目录下。注意这个解压过程极其漫长,我一般这时候烧开水,泡方便面,慢慢吃,打扫桌面,解压完了吗?
No!早着呢!出去运动一下吧,等你把方便面消耗得差不多了,解压就基本完成了,看一下根目录,吓你一跳,tmp.iso竟然将近2G!
现在一定要删除文件/wen/new/KNOPPIX/KNOPPIX,因为我们要对tmp.iso进行改造以生成新的KNOPPIX文件,切记!

再挂载tmp.iso并把所有内容拷贝到/wen/old/KNOPPIX下面,你应该相当熟悉了:
#mount -o loop -t iso9660 /tmp.iso /mnt/cdrom
#mkdir /wen/old/KNOPPIX
#cd /mnt/cdrom
#cp -r * /wen/old/KNOPPIX
#umount /mnt/cdrom
为了节约硬盘,你现在连/tmp.iso也可以删除。

再下面就要进入具体改造工作阶段了,这里主要是使用了chroot这个命令以及Debian系统便利的apt-get的安装、卸载软件,需要注意的事情有:
为了使用网络,你需要在chroot环境下挂载proc,还要注意chroot环境下能够正确解析域名。后面这个问题我是这样解决的,再开一个console窗口,执行:
#cp /etc/apt/sources.list /wen/old/KNOPPIX/etc/apt/sources.list
#cp /etc/resolv.conf /wen/old/KNOPPIX/etc/resolv.conf
这样做的前提是你没有chroot之前你的网络是通畅的。还有一个解决方法是我先ping一下自己sources.list表中的apt源以获得IP,直接写入到chroot后的sources.list文件之中以省却DNS解析的麻烦。
#chroot /wen/old/KNOPPIX/
$ mount -t proc /proc proc

现在你就进入到旧的KNOPPIX3.6之中了,你完全可以把它当作一个普通的Debian系统来对待,使用常用的命令来改造旧的系统:
$ apt-get remove openoffice.org
$ apt-get remove kde-i18n-{es,de,fr,it,nl}
(先删除几个我不常用的大的软件包,上面可以节约300-400M空间。你可以使用命令dpkg-query -l查看安装了哪些软件包,再根据自己的意愿进行删除)
$ apt-get install grass
$ apt-get install qgis
(安装了两个我需要的软件)

简单的改造工作完成,现在再做一点清理工作就可以退出了:
$ apt-get clean
(删除刚下载的软件包,免得被包含到新的发行版中)
$ updatedb
(更新软件数据库)
$ update-menus
(更新菜单)
$ umount proc
(切记!)

下面就使用ctrl-d退出chroot环境,最后我们还要做两件事情:一是将改造后的/wen/old/KNOPPIX重新压缩为KNOPPIX文件并写入/wen/new/KNOPPIX,二是/wen/new/做成一个光盘映像文件。这两步都要使用makeisofs命令,系统中没有的话要先自行安装。这两个命令都很长,我一般把它们写成脚本文件,以方便重复使用。
#mkisofs -R -U -V "" -P "" -hide-rr-moved -cache-inodes -no-bak -pad /wen/old/KNOPPIX | nice -5 create_compressed_fs - 65536 > /wen/new/KNOPPIX/KNOPPIX
注意以上要写在一行之内,这个压缩过程需要的时间和前面解压的时间一样漫长,再吃一包方便面吧!
/wen/old目录不要删除,以后还可以在它的基础继续改造。

制作光盘映像文件:(针对3.6版本而言, 3.3版本有所差别)
#mkisofs -pad -l -r -J -v -V "WENPPIX" -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -hide-rr-moved -o /home/ftp/knoppix.iso /wen/new
倒数第二个参数是指新生成的iso的位置,可自己调整。执行这个命令注意执行时的目录位置!虽然使用了绝对路径,似乎这个命令也不能在其他目录执行。

新的发行版就做好了,很简单,但是要做好就难了,我们还有许多细节的工作要做:
1 修改启动画面等
2 修改启动脚本
3 删除软件包以使自己的发行版尽量小,这可是费时费神的事情。
4 自己改造的发行版通常运行比原版的慢,要进行优化。
5 如何安装在硬盘和U盘。
.......

总之,做一个发行版,做好就难,维护就更难了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注