轻量LINUX:利用旧硬件打破软硬件升级周期
发表于:2007-07-04来源:作者:点击数:
标签:
策略与建议 我计划将这台便携式电脑 用于写作以及远程访问我的功能更强大的桌面 开发 系统。因此,我需要系统具有 网络 支持、shell、象 vi 这样的文本编辑器、用于文档 版本控制 的 CVS 以及用于 安全 远程访问的 SSH。在资源方面,我有 12 MB 内存和 540 M
策略与建议 我计划将这台便携式电脑用于写作以及远程访问我的功能更强大的桌面
开发系统。因此,我需要系统具有
网络支持、shell、象 vi 这样的文本编辑器、用于文档
版本控制的 CVS 以及用于
安全远程访问的 SSH。在资源方面,我有 12 MB 内存和 540 MB 硬盘可以使用。
因为进入了我还未完全研究过的领域,所以我选择了有许多小里程碑的途径。我在本文中采用了这种方法。经常出现的里程碑帮助我确定是否在解决问题方面有所进展;经常出现的里程碑在某一步骤不象所宣称的那样有效工作时,可以帮助您调试过程。我在本文中有好几处鼓励您,即使在系统还未完成时,也不妨试用一下您的系统。这些
测试可以帮助您判断到那一点为止的工作是否正确。
我的第一点建议是不要考虑使用任何已建立的 Linux 分发版。我最初也希望通过安装现有的 Linux 分发版来避免从头开始工作。但很快发现它们都需要比可用资源更多的资源。即使 Slackware(长久以来一直以支持低内存系统著称)也至少需要 12 MB 内存才能安装分发版,即使在那样的情况下也工作得非常勉强。
在着手构建系统之前您可能需要考虑的一个可能性是从现有的“单磁盘” Linux 分发版 — 如 tomsrtbt(单磁盘应急软盘分发版)、Trinux(单磁盘 Linux 安全性工具箱)甚至 Tin Foil Hat Linux(被设计用于加密、签名和擦除文件的安全 Linux 分发版)— 开始,然后对其进行扩展。
在正式开始构建自己的系统以前,我研究了几个这样的迷你分发版本并从中学到了很多。尽管我研究的分发版中没有一个是专门面向资源有限的硬件(比如我的便携式电脑)的,但它们的确都有一个共同目标 — 将尽可能多的功能塞进尽可能小的空间。尽管它们为实现这一目标所做的许多权衡对我来说是不可接受的,但我注意到了 uClibc 和 BusyBox,最终我使用了这两者。
uClibc
每个 Linux 系统都需要一个 C 库。C 库提供了常用的文件操作(打开、读和写)、内存管理操作(malloc 和 free)和许多其它使一个 Linux 系统名副其实的函数。大多数 Linux 系统使用 Glibc。Glibc 是成熟的、经过良好测试的,并且正在积极的开发中。遗憾的是,它使用的内存数量相对也较多,对于我的机器来说是不可接受的。
我并不建议使用 Glibc,而建议使用 uClibc,这是一个现代的、稳定的、具有高度
兼容性的 Glibc 替代品。uClibc 是针对
嵌入式系统开发的,所以它力图成为完整但轻量级的 C 库。速度与大小之间的权衡最后由大小决定。尽管如此,在绝大多数情况下,针对 uClibc 编译的应用程序和工具与针对 glibc 编译的没有分别。uClibc 网站(请参阅参考资料)列出了超过一百个已知或已得到报告使用 uClibc 的应用程序。该列表包括象 Gzip 和 Lilo 这样的标准实用程序,以及象 Lame(MP3 编码器)和 Freeswan(VPN 实现)这样不太常用的实用程序。因为我通过运行在系统上的工具和应用程序的成熟度来衡量一个系统的有效性,所以对我来说,我选择的 C 库能支持我需要的工具是很重要的。
Dietlibc 是另一个可替代 Glibc 的 C 库。我的研究表明:尽管 Dietlibc 需要的内存比 uClibc 更少,但它是通过牺牲与 Glibc 的兼容性实现这一点的。最后,我选择使用 uClibc,因为它看起来能支持更多我需要使用的应用程序。
BusyBox
Linux 系统用户需要一个由数量丰富的命令行工具集组成的工作环境。因为逐一构建所有必需的工具似乎是一个很耗时间的任务,所以我再次借用嵌入式系统的经验,选择了 BusyBox,这是一个“样样皆通”的应用程序,它在一个二进制文件中提供了您希望在 Linux 系统中看到的大多数工具的实现。
通过使用 BusyBox,我保留了宝贵的资源并节省了大量的时间投入。我找不到象它这样的其它工具集。
组成部分及准备工作 要继续下去,您需要有权使用一个现有 Linux 系统 — 最好该系统运行所用的微处理器与您目标系统的是同一系列。一台运行 Linux 的老式便携式电脑是用于编写和编辑的极佳环境,但在编译软件包时它是无法与现代硬件竞争的。我们将使用现有的 Linux 系统来构建内核及支持软件,并创建引导目标系统进入 Linux 所必需的磁盘。将 Linux 安装在目标系统上之后,在把完成的产品转移到目标系统之前,我们将继续使用现有的系统来构建应用程序。我把现有的 Linux 系统称为“构建系统”,把另外那个 Linux 系统称为“目标系统”。
首先
下载以下软件包(请参阅参考资料以获得链接):
linux-2.4.19.tar.gz(内核)
uClibc-0.9.15.tar.gz(C 库)
busybox-0.60.4.tar.gz(有用的命令行工具)
util-linux-2.11u.tar.gz(fdisk 可执行文件)
e2fsprogs-1.27.tar.gz(用于文件系统的创建)
lilo-22.3.2.tar.gz(引导装入程序,boot loader)
为了用 uClibc 构建和链接 BusyBox,您需要在目标系统的 /usr 目录中安装 uClibc 开发环境,因此您需要对该目录的写访问权。
该过程的一部分包含构建一个简单的根文件系统。我通过提供合适的根文件系统框架简化了这一步骤,同时提供的还有必需的配置文件和设备文件。您可以从参考资料下载该文件框架 skeleton.tar.gz。
您需要阅读并理解必要的文档,其中包括 README 和 INSTALL 文档。由于有太多的选项和特殊情况,所以无法在本文中介绍所有的排列组合。在以下几节中,我介绍了我推荐的配置。
让我们来构建内核。
构建 Linux 内核
构建一个有效的 Linux 内核而不更改缺省配置是可能的。但几个经过慎重考虑的更改将产生更适合我们需要的系统。特别地,我始终记得网络连接的
需求。下表列出了我更改的选项,并就您可能希望对系统作的更改提出了建议。
内核配置 javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)"> 注:便携式电脑联网可能需要" PCMCIA 支持。较旧的便携式电脑不能支持较新的 Cardbus(32 位)卡,但那通常不成问题,因为仍有许多 16 位网卡有售。如果您计划通过电缆连接到网络,则需要在“PCMCIA network device support”下选择合适的驱动程序,这没有包括在上表中。我使用无线连接。许多 16 位 PCMCIA 卡使用 Hermes 芯片组。您可能需要稍稍更改配置以符合您的 PCMCIA 控制器芯片组和 PCMCIA 卡。
应配置内核以专门支持您的 CPU。如果您在新机器上为较旧的机器构建内核,那么需要选择适当的处理器,如 Intel 386 或 486。为了节省空间,您可能要禁用您认为不需要的一切选项,特别是 SCSI 支持。
以下是构建内核的步骤:
make xconfig
make dep
make bzImage
make modules
稍后我将描述如何安装内核。
构建 uClibc
构建 uClibc 比构建内核更有挑战性。uClibc 软件包构建两个相关组件。第一个组件是支持您目标系统的实用程序和应用程序的运行时库。第二个组件是一个开发环境。uClibc 开发环境使构建使用 uClibc 的实用程序和应用程序变得简单,甚至在本身不使用 uClibc 的系统上也是如此。uClibc 创建并安装用于 gcc 及相关工具的封装器。一旦安装了 uClibc 开发环境,您就可以针对 uClibc 而不是 glibc 来编译并链接大多数应用程序。
uClibc 配置 上表中的这三个选项使构建和安装象" SSH 和 NFS 这样的软件(如果您以后选择这么做的话)成为可能。您还需要指定 Linux 内核源文件的位置。
下面的步骤概述了如何构建 uClibc 软件包。采用这些步骤的前提是您已将压缩文档解压缩到名为 uClibc-0.9.15 的目录中:
cd uClibc-0.9.15
ln -s ./extra/Configs/Config.i386 ./Config
编辑 Config 文件。启用上表中指定的选项。
make
上面的指示信息假定您正为 Intel 微处理器构建 uClibc。如果您为别的微处理器构建 uClibc,则可在上面的步骤 2 中创建指向适当 Config 文件的链接。
make 命令构建软件包。为了用 uClibc 编译和链接其它实用程序和应用程序,您需要安装开发环境。make install 命令安装开发环境。
一旦安装了开发环境,您就可以通过更改 PATH 环境变量,使用 uClibc 开发工具来替代标准的基于 Glibc 的开发工具,如下所示:
export PATH=
/usr/bin:$PATH
一旦更改了 PATH 环境变量,您就会发现大多数开发命令(gcc、ld 和 ldd 等)如今指向 uClibc 封装器。但是命令仍应照常工作。在构建下面的任何软件之前正确设置 PATH 环境变量是非常重要的。
在我的 Redhat 7.3 系统上不能原封不动地构建 uClibc 的最新版本(版本 0.9.15)。用于定位 gcc 头的技术在发行版本 0.9.12 时有了变化。如果在您的系统上不能构建 uClibc,可以应用本文参考资料一节中提供的 uclibc 补丁程序。它将以前的技术移植到 uClibc 的最新发行版。
稍后我将描述如何在引导盘和根文件系统盘上安装运行时环境。
构建 BusyBox
如果有一个任务比其它任务更能简化从头构建 Linux 系统的过程的话,那就是构建和安装 BusyBox 软件包。BusyBox 是一个可执行文件,它提供许多其它常用命令行工具的功能,所有这些功能都合为一体。BusyBox 的文档声称构建一个有效系统所需要的全部就是 BusyBox 和“/dev、/etc 以及内核”— 而且他们没有开玩笑。
下表描述了您应对 Config.h 文件做的更改。
BusyBox 配置
确保您选择" ASH 作为缺省 shell — 它是 BusyBox 中可用且最能兼容 Bourne 的 shell。它将运行大多数 shell 脚本,包括那些设置联网所必需的脚本。
如果您启用 NFS 挂装支持,请注意告诉您必须用“-o nolock”选项挂装的注释,因为您极有可能不在运行 portmapper 守护程序。
您还必须更改 Makefile 并启用大文件支持。将 DOLFS 设置为 true。
用 make 命令构建 BusyBox。
构建 Util-linux
Util-linux 是一组低层系统实用程序。我们对 fdisk 实用程序感兴趣:我们需要它对便携式电脑的硬盘进行分区。
Util-linux 易于配置和构建。输入 configure 然后输入 make。
构建 E2fsprogs
E2fsprogs 是用于创建和操作 ext2 和 ext3 格式的文件系统的实用程序集。一旦使用 fdisk 对硬盘分区后,则将使用 e2fsprogs 实用程序来创建文件系统。
以下是构建 E2fsprogs 软件包的步骤。
mkdir build
cd build
../configure --enable-elf-shlibs
make
make distribution_tar_file
最后一步中未记录的 makefile 目标创建一个包含必需的库和可执行文件的 TAR 文件。我们将在后面用该文件安装软件包。
构建 LILO
LILO 是 Linux 引导装入程序。它负责装入和启动 Linux 内核。LILO 有替代品,如 GRUB。我选择 LILO 是因为我对它及其配置最为熟悉。如果您觉得有风险,可以考虑使用替代品中的一个。
make 命令构建了 LILO。
创建引导盘
引导盘包含您先前构建的 Linux 内核。当您开机或复位系统时,将使用这个引导盘将内核装入目标系统。
构建引导盘有几种不同的方法。Linux 内核可以直接从软盘引导(如果配置成这样做的话)。然而,大多数 Linux 用户通过引导装入程序(如 LILO 或 GRUB)的帮助来引导系统。Boot Disk HOWTO(请参阅参考资料)描述这两个方法和其它一两个方法。我将描述如何构建我的基于 LILO 的引导盘版本。我推荐基于 LILO 的方法,因为它允许在引导期间向内核传递参数。这在处理较旧的硬件时非常重要,旧的硬件常常会受到麻烦的特性的困扰。在我的例子中,Linux 软盘驱动器需要指定参数“floppy=thinkpad”,以便解决我的这一型号 ThinkPad 软盘驱动器的问题。
LILO 方法需要在您构建软件的系统上安装 LILO 可执行文件以使引导软盘可引导,因此必须安装 LILO 才能继续。如果您不能或不打算安装 LILO,我建议您尝试 Boot Disk HOWTO 中描述的创建引导盘的其它方法。
您必须具有 root 用户身份以便执行以下操作:
将一张软盘放入软驱
mke2fs -N 24 -m 0 /dev/fd0
mount -o dev /dev/fd0 /mnt
mkdir /mnt/boot
mkdir /mnt/dev
cp -R /dev/null /mnt/dev
cp -R /dev/fd0 /mnt/dev
cp /boot/boot.b /mnt/boot
现在您必须将内核从 /arch/i386/boot 目录复制到软盘并设置 ramdisk 字。用您构建内核的目录替代下面路径中的 。
cp /arch/i386/boot/bzImage /mnt
rdev -r /mnt/bzImage 49152
为了制作引导软盘,您必须运行 LILO。首先,创建名为 /mnt/bdlilo.conf 的 LILO 配置文件。我创建了一个具有以下信息的文件:
Lilo 配置
boot =/dev/fd0
install =/boot/boot.b
map =/boot/map
read-write
backup =/dev/null
compact
image =/bzImage
label =Linux
root =/dev/fd0
以下命令将引导装入程序复制到引导盘。
lilo -v -C bdlilo.conf -r /mnt
如果您够勇敢的话,现在就可以尝试从引导磁盘引导您的目标系统了。但您不会看到命令提示符,因为我们还遗漏了根文件系统盘,不过您可以感觉一下是否成功地执行了以上步骤。
创建根文件系统盘
如果您尝试引导目标系统,随着内核的各个部分被初始化,您将看到一行行熟悉的内核输出。内核引导过程将以与下面相似的一行结束:
VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER
我们在上一节创建的引导盘只拥有内核。为了创建有效的基于软盘的 Linux 系统,我们需要一个完整的文件系统以及先前构建的 BusyBox 软件。
在本文的参考资料一节中,我提供了一个链接,它指向一个包含文件系统框架的文件。该文件系统框架包含适当的目录层次结构,并且还在 /dev 目录中定义了足够的设备以使您的系统能够运转。我们将把来自先前构建的软件包的文件、库和可执行文件添加到这个文件系统。
您需要具有 root 用户身份才能执行以下操作:
将一张软盘放入软驱
dd if=/dev/zero of=/tmp/fsfile bs=1k count=4096
mke2fs -m 0 -N 2000 /tmp/fsfile
mount -t ext2 -o loop /tmp/fsfile /mnt
cd /mnt
tar xvzf
我们将把 uClibc 和 BusyBox 安装到新的文件系统上。
cd
make PREFIX=/mnt install_target
cd
make PREFIX=/mnt install
将文件系统复制到磁盘就完成了这部分的操作。
cd ..
umount /mnt
dd if=/tmp/fsfile bs=1k | gzip -v9 > /tmp/fsfile.gz
dd if=/tmp/fsfile.gz of=/dev/fd0 bs=1k
引导盘和根文件系统盘是您引导系统进入 Linux 所需的全部。接下来是将 Linux 安装到便携式电脑的硬盘上。
创建辅助盘
辅助盘保存对便携式电脑的硬盘进行分区和构建文件系统所必需的工具。
将一张软盘放入软驱
dd if=/dev/zero of=/tmp/sufile bs=1k count=1440
mke2fs -m 0 -N 2000 /tmp/sufile
mount -t ext2 -o loop /tmp/sufile /mnt
cd /mnt
我们将把余下的工具和实用程序安装到新的文件系统上。
cd
mkdir /mnt/sbin
cp fdisk/fdisk /mnt/sbin
cd /mnt
tar -xvzf /build/e2fsprogs-1.27-elfbin.tar.gz
cd
make ROOT=/mnt install
将文件写到磁盘就完成了这部分的操作。辅助盘将象普通盘一样挂装,因此重要的是不要压缩该映象。
cd ..
umount /mnt
dd if=/tmp/sufile of=/dev/fd0 bs=1k
现在您的三张软盘上有了在便携式电脑上安装 Linux 需要的所有文件。
安装 Linux
是享受您的劳动成果的时候了。将引导盘放入您目标系统的软驱,然后打开电源。Linux 内核应进行引导。引导后它会要求您插入根文件系统盘。插入根文件系统盘。内核将把经过压缩的文件系统从根文件系统盘装入 ramdisk 并完成系统引导过程。下图显示了结果。
图 1. 引导内核
图" 2. 装入根文件系统
一旦" Linux 已经引导,就可以挂装辅助盘并将文件从那个磁盘复制到 ramdisk 上的根文件系统。一旦复制了 fdisk、mke2fs、lilo 及其支持文件,您就可以着手在目标系统的硬盘驱动器上进行分区和构建文件系统了。
fdisk 是用于创建和操作分区表的菜单驱动的实用程序。它相对来说易于使用:m 打印可用命令,n 添加新的分区,p 打印分区表,而 w 则写分区表然后退出。请查阅手册页以获得更详细的信息。
当对硬盘驱动器分区时,不要忘了添加一个交换(swap)分区。我建议创建一个大小为系统内存三到四倍的交换分区。
mke2fs 在分区上创建 ext2 或 ext3 文件系统。命令 mke2fs -j /dev/hda1 将在 /dev/hda1 上创建一个 ext3 分区。我建议使用较新的 ext3 文件系统而不是 ext2。日志记录活动的额外代价换来的是增强的可靠性。
一旦对硬盘进行了分区并且构建了文件系统,就可以挂装硬盘并将文件从基于 ramdisk 的根文件系统复制到新的文件系统。您需要但却不在基于 ramdisk 的根文件系统上的文件只有 Linux 内核和 LILO 配置文件。您可以从先前创建的引导盘获取这些文件。插入并挂装引导软盘,然后将内核及 LILO 配置文件复制到硬盘驱动器上。将二者都放入硬盘驱动器文件系统的 /boot 目录中。将 LILO 配置文件重命名为 lilo.conf,然后编辑它,使它与下面的内容相似:
Lilo 配置
boot =/dev/hda1
install =/boot/boot.b
map =/boot/map
read-write
backup =/dev/null
compact
image =/boot/bzImage
label =Linux
root =/dev/hda1
最后,按以下步骤安装 LILO(假定硬盘驱动器挂装到 /hd):
chroot /hd /bin/ash
/sbin/lilo
那应该能成功。您已经构建了必需的软件,用它从软盘引导目标系统进入 Linux,在目标系统上进行分区并创建文件系统,然后设置系统直接从硬盘驱动器引导。一天劳动的结果并不坏!
结束语
Linux 内核、uClibc 库与 BusyBox 软件的结合使从头构建 Linux 系统变得很容易。以上描述的过程与基本原理非常适合构建恢复盘、创建您自己的定制 Linux 分发版、以及针对较旧的硬件或非传统的嵌入式应用程序构建占用资源较少的分发版。
原文转自:http://www.ltesting.net