从开放源代码打造linux操作系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从开放源代码打造Linux操作系统
摘要:在有一定编程、编译和Linux的知识之上,利用开放源代码软件和Linux内核的源代码开放的特性,自我打造一个Linux操作系统。
本文讨论了它的意义、可行性、具体的打造过程和一些应用实例。
关键词:开放源代码打造编译Linux 操作系统
Abstract:On the base of some programming、compiling and linux skill, build a linux operating system myself with open speciality of open source software and linux kernel. Discuss it’s meaning, feasibility, specific building process and same example in the article.
Key words:Open Source Code, Build, Compile, Linux, Operating System
目录
1、引言 (4)
2、从开放源代码打造Linux系统的意义 (4)
3、从开放源代码打造Linux系统的可行性 (5)
3.1从零开始,是如何开始? (5)
3.2开始以后,怎么打造? (5)
4、从开放源代码打造Linux系统的过程 (6)
4.1 开始打造前的准备 (6)
4.1.1 选择一个平台 (6)
4.1.2 源系统的安装 (6)
4.1.3 准备好一个分区 (7)
4.1.4 准备好所有的需要的软件包的源代码 (7)
4.1.5 为打造目标系统创建一个用户 (8)
4.2 创建基本的文件系统 (8)
4.3 安装系统软件 (10)
4.3.1 安装Makedev (10)
4.3.2 安装Bash (10)
4.3.3 安装Binutils (11)
4.3.4 安装Bzip2 (11)
4.3.5 安装Diffutils (11)
4.3.6 安装Fileutils (12)
4.3.7 安装Gawk (12)
4.3.8 安装GCC (12)
4.3.9 安装Grep (13)
4.3.10 安装Gzip (13)
4.3.11 安装Linux Kernel (14)
4.3.12 安装Make (14)
4.3.13 安装Patch (14)
4.3.14 安装Sed (15)
4.3.15 安装Sh-utils (15)
4.3.16 安装Tar (16)
4.3.17 安装Texinfo (16)
4.3.18 安装Textutils-2.0 (16)
4.3.19 安装Lilo (16)
4.3.20 安装Util-linux (17)
4.4 创建目标系统启动时的脚本文件 (18)
4.4.1 /etc/host.conf (18)
4.4.2 /etc/hosts (18)
4.4.3 /etc/nssswitch.conf (19)
4.4.4 /etc/inittab (19)
4.4.5 配置键盘 (21)
4.4.6 配置日志文件 (21)
4.5 使目标系统能自我启动 (21)
5、打造出的Linux系统的实例应用 (21)
5.1 接入式代理服务器 (21)
5.2 视频终端 (21)
6、结束语 (22)
1 引言
我接触Linux系统是一个偶然的机会,当时只知道她是一种操作系统而已。
在那以后的日子里,我慢慢地了解多了一些,知道她的免费,自由,开放及其开放的精神。
其中开放源代码的做法,让我对软件开发的理解更深了一层,原来我们可以这样看待软件的开发和改进。
再到后来,由于爱好和工作的原因,我开始努力的从各个单一的源代码软件包和Linux的内核中抽取项目必要的部分来打造一个很小的Linux系统。
接下来的部分将是讨论从开放源代码软件打造Linux系统的意义、可行性、具体的打造过程和它的一些应用实例。
2 从开放源代码打造Linux系统的意义
从源代码打造Linux系统有什么意义呢?对我当初的想法而言,仅仅是爱好而已,后来也只是为了完成一些小项目。
但是它真正的意义绝对不止这么少一点,或者这么小一点。
首先,从源代码打造Linux系统有特制的意思。
我们可以按照要求定制一个Linux系统以符合特别的环境。
例如:一台486的计算机,8M的内存,8M的硬盘,两块NIC,要做一个接入型代理服务器,没有现成的OS,只有自己做一个,系统不能多一点无用的东西。
其次,是安全。
因为每一个系统里的文件都是从开放源代码的软件来编译而成的,系统的每一行代码都要经过自己的眼睛,要多高的安全级,只要自身能,就做的到。
最后,就是继承了Linux的低能耗,网络性能强等等,对个人而言,可以了解更多的系统运行的情况。
3 从开放源代码打造Linux系统的可行性
对于从源代码打造Linux系统的可行性没有什么实质上的困难,因为现在所有成型的Linux的发行版(例如Redhat,Debian,Mandrake等等这些就是Linux的发行版)也都是Linux的内核加大量的开放源代码软件组合而成的。
只不过他们有一些便携的安装,管理方法。
这里只是对打造的具体方法做可行性的研究。
3.1 从零开始,是如何开始?
从零开始,把新打造的东西放在哪?显然需要一个“母”系统,这个系统上我们能编译新的东西,当一些基本的东西在“子”系统上都具备的时候,再让他自身生息。
我们要打造的是Linux系统,第一想到的“母”系统当然也是Linux系统,实际上她也能胜任,而且是最好的。
在“母”系统里,先分出一个空的分区,把一个最基本的东西安装在上面,这就解决“放在哪”
3.2 开始以后,怎么打造?
这要涉及到用什么编译方式的问题。
选动态编译,还是静态编译?
当编写一个新软件的时候,所有的基本函数是使用函数库(library)来代替的,而不用重写。
例如:Linux下最关键的一个函数库,glibc,包含了几乎所有的常用函数,像打开文件函数,打印函数,输入输出函数。
当软件编译的时候,软件只用连接(link)函数库,就可以使用函数库中带有的任何函数。
这就是动态编译。
动态编译看上去很不错,节约了空间和硬件开销。
但是有时候不是这样的。
假设一个函数库有3MB大,只有一个软件使用了它其中的一部分,当我们编译完成的时候,为了在其他也能运行,就要带上这个3MB大的家伙,但是我们用静态编译(在编译连接的时候把函数库中需要的部分一同编译在软件中)的时候,软件只增大了0.5MB,那么静态编译会更好一些。
所以在编译的时候要酌情考虑两个编译方式,可以在一个系统里同时使用两种编译方式,以节约磁盘空间(有时我们的系统是为嵌入式设备开发的)和硬件开销。
下面是一个静态编译的例子。
它仅仅只是一个例子,只是表明从源代码软件打造Linux系统的大概步骤。
打造出来的也不一定是一个实际有用途的Linux系统。
一定要主要到这一点。
对于有实际用途的Linux系统,在后面的“打造出的Linux系统的实例应用”一章中描述了两个本人实际打造出来的系统。
因为打造实际的系统需要长时间的调试和实际的硬件才能得出。
下面是实际的打造过程。
4 从开放源代码打造Linux系统的过程
4.1 开始打造前的准备
4.1.1 选择一个平台
我们开始打造之前要有一个工作平台,这个平台选择了一个Linux的发行版——Redhat Linux 7.3。
这个版本是2002年5月发布的。
也许新了点,但是这不是什么必要的,版本6.x/7.x行,其他的发行版也行。
我们把这个系统叫做源系统(Source System),把要打造的系统叫做目标系统(Target System)。
4.1.2 源系统的安装
这只是一般普通的Linux的系统安装。
开始安装Redhat Linux 7.3。
先准备好足够的磁盘空间,在安装过程中选择了自定义(custom),在基本的系统上选择了Network和Software Develop两个大项。
这个不是一定的,只要源系统有make,gcc,patch等等必要的开发工具就可以了。
如果磁盘空间允许,而且个人喜欢,还可以加上X-Window系统和Mozilla浏览器以便在Web里查一些资料。
4.1.3 准备好一个分区
接下来为目标系统准备要一个空的独立的分区(Partition),我们将把目标系统打造在上面,这个分区的大小取决于你将打造的Linux系统的大小和其所有源代码和中间文件。
在这次实际操作中,使用的是500MB。
4.1.4 准备好所有的需要的软件包的源代码
下面列出的只是这次所需要的软件包,不是一定的。
这里仅仅是为了说明打造的过程。
而没有过多的考虑实际目标系统的功能,效果和大小。
Makedev-1.4
Bash-2.05a
Binutils-2.12
Bzip2-1.0.2
Diffutils-2.8
Gawk-3.1.0
GCC-2.95.3
Grep-2.5
Gzip-1.2.4a
Linux Kernel-2.4.18
Make-3.79.1
Patch-2.5.4
Sed-3.02
Sh-utils-2.0
Tar-1.13
Texinfo-4.1
Textutils-2.0.
Lilo-22.2
Util-linux
这些开放源代码软件都是可以在Internet上免费获取的。
大部分可以到下载到。
4.1.5 为打造目标系统创建一个用户
为了避免安装过程中一些有损源系统的行为,专门创建一个新用户是个不错的主意。
在这里使用的是build的名称。
设定/mnt/target目录为工作目录。
mkdir /mnt/target
加载export TGT=/mnt/target到build用户的~/.bashrc,以后就可以使用cd $TGT就到了目标系统的工作目录了。
4.2 创建基本的文件系统
目标系统是要安装在文件系统上的。
因此首先我们得使用命令mke2fs来创建文件系统,然后将其挂载(mount)到某个地方,这里是挂载到/mnt/target这个目录上。
接下来的操作中,假定就使用这么目录了。
为了节省时间,还可以把它写在/etc/fstab里。
以便系统每次启动的时候就能够自动将这个目录挂载上。
当启动了目标系统,放置在/mnt/target上的所有东西就会被当成了放置在/根(root)目录了。
我们还需要在目标系统上建立固定的目录结构,这些目录结构都是POSIX规范中标准目录。
cd $TGT &&
mkdir -p bin boot dev/pts etc/opt home lib mnt proc root sbin tmp var opt &&
for dirname in $TGT/usr $TGT/usr/local
do
mkdir $dirname
cd $dirname
mkdir bin etc include lib sbin share src
ln -s share/man
ln -s share/doc
ln -s share/info
cd $dirname/share
mkdir dict doc info locale man nls misc terminfo zoneinfo
cd $dirname/share/man
mkdir man{1,2,3,4,5,6,7,8}
done &&
cd $TGT/var &&
mkdir -p lock log mail run spool tmp opt cache lib/misc local &&
cd $TGT/opt &&
mkdir bin doc include info lib man &&
cd $TGT/usr &&
ln -s ../var/tmp
4.3 安装系统软件
把所有的软件包的源代码放在$TGT/usr/src下面。
安装的默认起始目录就是$TGT/usr/src/<building software>,而且软件包都是用tar/gzip/bzip2工具解压过的。
下面安装的软件,这里只说了它的功能和包含的软件。
具体为什么需要这些软件是根据一个普通的Linux的基本功能而定的。
在修改它们时,一定要对Linux比较熟悉,和知道自己修改了什么,为什么要修改。
4.3.1 安装Makedev
Makedev是一个脚本文件(script file)。
它是用来创建一些系统必要的设备文件,这些文件通常是放在/dev下面的。
cp MAKEDEV-1.4 /dev/MAKEDEV &&
cd /dev &&
chmod 754 MAKEDEV &&
./MAKEDEV -v generic
4.3.2 安装Bash
Bash是一个Unix/Linux下广泛使用的Shell,它负责着从标准输入中读取数据来运行。
./configure --enable-static-link --prefix=$TGT/usr \
--bindir=$TGT/bin --with-curses &&
make &&
make install &&
cd $TGT/bin &&
ln -sf bash sh
4.3.3 安装Binutils
它包含了addr2line, ar, as, c++filt, gasp, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings and strip基本程序。
mkdir ../binutils-build &&
cd ../binutils-build &&
../binutils-2.12/configure --prefix=$TGT/usr --disable-nls &&
make LDFLAGS=-all-static tooldir=$TGT/usr &&
make tooldir=$TGT/usr install
4.3.4 安装Bzip2
它是现在Unix/Linux下基本的压缩和解压缩程序之一。
包含了bunzip2 (link to bzip2), bzcat (link to bzip2), bzip2 and bzip2recover。
make CC="gcc -static" &&
make PREFIX=$TGT/usr install &&
cd $TGT/usr/bin &&
mv bzcat bunzip2 bzip2 bzip2recover bzless bzmore $TGT/bin
4.3.5 安装Diffutils
包含了经典程序cmp, diff, diff3 and sdiff。
./configure --prefix=$TGT/usr --disable-nls &&
make LDFLAGS=-static &&
make install
4.3.6 安装Fileutils
包含了经典程序chgrp, chmod, chown, cp, dd, df, dir, dircolors, du, install, ln, ls, mkdir, mkfifo, mknod, mv, rm, rmdir, shred, sync, touch and vdir。
./configure --disable-nls \
--prefix=$TGT/usr --bindir=$TGT/bin &&
make LDFLAGS=-static &&
make install &&
cd $TGT/usr/bin &&
ln -sf ../../bin/install
4.3.7 安装Gawk
包含了awk解释程序。
(GNU/Linux下很多脚本都会用到它)
cp awklib/Makefile.in awklib/Makefile.in.backup &&
sed -e '/^datadir/s/awk/gawk/' \
-e '/^libexecdir/s%/awk%%' awklib/Makefile.in.backup \
> awklib/Makefile.in &&
./configure --prefix=$TGT/usr --disable-nls \
--libexecdir=$TGT/usr/bin &&
make LDFLAGS=-static &&
make install
4.3.8 安装Gcc
不用多解释。
UNIX/Linux下的编译工具。
包含了c++, c++filt, cc (link to gcc), cc1, cc1plus, collect2, cpp, cpp0, g++, gcc, gcov, protoize and unprotoize等程序。
mkdir ../gcc-build &&
cd ../gcc-build &&
../gcc-2.95.3/configure --prefix=/usr --enable-languages=c,c++ \
--disable-nls --disable-shared --enable-threads=posix &&
make BOOT_LDFLAGS=-static bootstrap &&
make prefix=$TGT/usr install &&
cd $TGT/lib &&
ln -sf ../usr/bin/cpp &&
cd $TGT/usr/lib &&
ln -sf ../bin/cpp &&
cd $TGT/usr/bin &&
ln -sf gcc cc &&
rmdir $TGT/usr/*-gnu/include &&
rmdir $TGT/usr/*-gnu
4.3.9 安装Grep
包含了egrep, fgrep and grep程序。
它是非常重要的文本分析程序。
./configure --prefix=$TGT/usr --disable-nls \
--bindir=$TGT/bin &&
make LDFLAGS=-static &&
make install
4.3.10 安装Gzip
它是现在Unix/Linux下基本的压缩和解压缩程序之一。
包含了gunzip (link to gzip), gzexe, gzip, uncompress (link to gunzip), zcat (link to gzip), zcmp, zdiff, zforce, zgrep, zmore and znew程序。
./configure --prefix=$TGT/usr &&
make LDFLAGS=-static &&
make install &&
cp $TGT/usr/bin/gunzip $TGT/usr/bin/gzip $TGT/bin &&
rm $TGT/usr/bin/gunzip $TGT/usr/bin/gzip
4.3.11 安装Linux Kernel
安装Linux Kernel要说详细的话,可以写几十页的文章。
在这里不多说了,大家一定要早以熟悉编译Kernel的内核。
在这里要注意的是,如果让目标系统有开发功能的话,那么在编译完毕后要保留Linux Kernel Head Files。
make mrproper
make menuconfig
make dep
make clean
make bzImage
(如果要编译成可装载module的kernel,就有下面的步骤)
make modules
make modules_install INSTALL_MOD_PATH=$TGT/lib/modules
4.3.12 安装Make
这是目标系统有开发能力的主要工具。
它包含make工具。
./configure --prefix=$TGT/usr --disable-nls &&
make LDFLAGS=-static &&
make install
4.3.13 安装Patch
这是目标系统有开发能力的主要工具。
它包含patch工具。
export CPPFLAGS=-D_GNU_SOURCE &&
./configure --prefix=$TGT/usr &&
unset CPPFLAGS &&
make LDFLAGS=-static &&
make install
4.3.14 安装Sed
包含了sed解释程序。
(GNU/Linux下很多脚本都会用到它)
./configure --prefix=$TGT/usr --bindir=$TGT/bin &&
make LDFLAGS=-static &&
make install
4.3.15 安装Sh-utils
包含了basename, chroot, date, dirname, echo, env, expr, factor, false, groups, hostid, hostname, id,
logname, nice, nohup, pathchk, pinky, printenv, printf, pwd, seq, sleep, stty, su, tee, test, true, tty, uname, uptime, users, who, whoami and yes基本程序。
./configure --prefix=$TGT/usr --disable-nls &&
make LDFLAGS=-static &&
make install &&
cd $TGT/usr/bin &&
mv basename date echo false hostname $TGT/bin &&
mv pwd sleep stty test true uname $TGT/bin &&
mv chroot ../sbin
4.3.16 安装Tar
它是现在Unix/Linux下基本的打包程序。
包含了rmt,tar程序。
./configure --prefix=$TGT/usr --disable-nls \
--libexecdir=$TGT/usr/bin --bindir=$TGT/bin &&
make LDFLAGS=-static &&
make install
4.3.17 安装Texinfo
包含了info, install-info, makeinfo, texi2dvi and texindex程序。
./configure --prefix=$TGT/usr --disable-nls &&
make LDFLAGS=-static &&
make install
4.3.18 安装Textutils
包含了基本的程序cat, cksum, comm, csplit, cut, expand, fmt, fold, head, join, md5sum, nl, od, paste, pr, ptx, sort, split, sum, tac, tail, tr, tsort, unexpand, uniq and wc。
./configure --prefix=$TGT/usr --disable-nls &&
make LDFLAGS=-static &&
make install &&
mv $TGT/usr/bin/cat $TGT/usr/bin/head $TGT/bin
4.3.19 安装Lilo
配置文件/etc/lilo.conf要自己配置。
ROOT=$TGT ./QuickInst
lilo.conf的一个例子:
boot = /dev/hda
prompt
timeout = 50
default = linux
image = /boot/bzImage
label = linux
root = /dev/hda1
read-only
other = /dev/hda2
label = dos
4.3.20 安装Util-linux
软件包util-linux包含有agetty和login.我们需要这两个程序才能登陆系統(log in)和得到命令行提示符(bash prompt).在安裝之后,请在目标系統的/sbin目录下为agetty建立一个符号连接到
getty.getty是所有Unix类系統当中被认为因该呆在那个地方的程序之一,所以生成连接的主意要强于改动/etc/inittab?碓诵agetty。
包含下列程序:agetty, arch, blockdev, cal, cfdisk, chkdupexe, col, colcrt, colrm, column, ctrlaltdel, cytune, ddate, dmesg, elvtune, fdformat, fdisk, fsck.minix, getopt, hexdump, hwclock, ipcrm, ipcs, isosize kill, line, logger, look, losetup, mcookie, mkfs, mkfs.bfs, mkfs.minix, mkswap, more, mount, namei, pivot_root, ramsize (link to rdev), raw, rdev, readprofile, rename, renice, rev, rootflags (link to rdev), script, setfdprm, setsid, setterm, sfdisk, swapoff (link to swapon), swapon, tunelp, ul, umount, vidmode, whereis and write。
./configure --prefix=$TGT/usr disable-nls &&
make HA VE_SLN=yes LDFLAGS=-static &&
make HA VE_SLN=yes install
4.4 创建目标系统启动时的脚本文件
接下来要考虑系统的可启动性。
这些都是Linux系统的知名(well-known)文件,是系统启动和运行必须的。
他们包括:rc系列,crontab,fstab,group,host.conf,hosts,inittab,issue,,ls.so.conf,login.defs,passwd,resolv.conf,shells,nssswitch.conf等等。
这些文件的存在与对目标系统的要求有很大的关系,采用SysV还是BSD则和控制有比较大的关系。
这里采用的是SysV。
下面举一些例子,大部分的文件可以直接用源系统的文件。
具体的帮助文件可以用源系统的man 手册页。
例如:man fstab。
4.4.1 /etc/host.conf
order hosts,bind
multi on
4.4.2 /etc/hosts
# Begin /etc/hosts
127.0.0.1 localhost
202.115.137.168 virgo
202.115.137.169 kitty
# Begin /etc/hosts
4.4.3 /etc/nssswitch.conf
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
publickey: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: db files
# End /etc/nsswitch.conf
4.4.4 /etc/inittab
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:respawn:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
4.4.5 配置键盘
cd /usr/share/kbd/keymaps &&
ln -s <path/to/keymap> defkeymap.map.gz
4.4.6 配置日志文件
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp} &&
chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}
4.5 使目标系统能自我启动
配置lilo是这里的主要任务。
最好可以看看lilo.conf的手册页(man)。
配置好lilo.conf后。
chroot /mnt/target
/sbin/lilo –L
重新启动你的系统,进入目标系统。
试用,配置和调试系统。
排除一些小问题。
反复如此,直到系统达到要求。
5 打造出的Linux系统的实例应用
5.1 接入式代理服务器
使用thinlogin/busybox的嵌入式系统软件。
有如下特征:系统大小8MB,telnet服务器和客户端,ftp服务器和客户端,adsl和局域网接入功能,NAT代理上网,软件防火墙,定时器,telnet管理。
最低硬件要求:Intel 386处理器,8M硬盘,8M内存。
本论文提供的程序就是这个。
完成于2002年5月10日。
5.2 视频终端
同样使用了thinlogin/busybox的嵌入式系统软件。
有如下特征:系统大小24MB,telnet服务器和客户端,ftp服务器和客户端,X-Window系统,opera网络浏览器,flash浏览,定时器,telnet/ftp管理。
最低硬件要求:Intel 586处理器,32M硬盘,16M内存。
作为成都精通新网络有限公司的一个项目,完成于2002年6月1日。
6 结束语
感谢大学四年来各位老师的教导。
感谢有幸一起度过大学时光的各位同学。
感谢成都精通新网络有限公司的工程师们的帮助。
参考文献:
1. Sriranga Veeraraghavan,前导工作室译,Unix Shell 编程,机械工业出版社,1999
2. Daniel Quinlan,Filesystem Hierarchy Standard Version 2.0,Filesystem Hierarchy Standard Group,1997
3. The Linux Documentation Project:Linux-From-Scratch HOWTO,2002
4. The Linux Documentation Project:From-PowerUp-To-Bash-Prompt HOWTO,2000。