基于X86的小型内存Linux操作系统

这篇文章我觉得对于理解initrd文件系统,以及作为最基础的系统构建有一定的帮助

摘要:X86、LiveCD、LiveUSB

由于工作需要,最近花了点时间真正研究了一下如何纯手工制作一个Linux系统。虽然以前也曾用gentoo、lfs等成功制作过Linux系统,但那都是看着别人的教程一步步完成的,虽然成功了,但自己总觉得东西还是别人的,没有真正变成自己的知识。其次,像gentoo与lfs都是教你如何制作一个通用的Linux操作系统,此系统过于庞大,对于一个专用系统来说,不需要如此庞大的系统,特别是要求系统要完全运行于内存中时,更不能过于庞大。鉴于此,通过手工完全制作一个Linux系统是唯一的方法。好比在ARM、MIPS、POWERPC等平台下的嵌入式Linux一样。现在我需要做的是一个类似的,X86小型专用化的Linux。

早就想做一个这样的系统,但网上一直没有找到合适的教程,所以我也没有方向,也就没有动手做。但今天到了必需要用的时候了,我只能硬着头皮上,从零开始,自己制作。但也不是完全的没有参考,在网上找到些资料,关于用busybos做LiveCD与认识initramfs的文章都写的非常好,谢谢这些辈们的积累。在这里,我把这篇文章献给跟我面对同样问题的朋友和想对Linux操作有更深入了解的朋友。

这里我们来点知识预习,以下内容部分来自于网络。

1认识ramfs、initramfs、ramdisk

讲到内存Linux系统,那就离不开ramfs、initramfs、ramdisk,为了选择更好的方式,我们首先来认识这三种文件系统的不同与相同之处。

1.1了解ramfs

ramfs直接利用了内核的磁盘高速缓存机制。所有的文件的读写数据都会在内存中做高速缓存(cache),当系统再次使用文件数据时,可以直接从内存中读写,以提供系统的I/O性能。高速缓存中的写入数据会在适当的时候回写到对应的文件系统设备(如磁盘等)中,这时它的状态就标识为clean,这样系统在必要时可以释放掉这些内存。ramfs没有对应文件系统设备,所以它的数据永远都不会回写回去,也就不会标识为clean,因此系统也永远不会释放ramfs所占用的内存。

1.2了解initramfs

Initramfs是ramfs的一种,在2.6版本之后的linux内核中,都包含一个压缩过的cpio格式的打包文件。当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs中是否包含有init文件,如果有则执行它,作为PID为1的第一个进程。这个init进程负责启动系统后续的工作,包括定位、挂载“真正的”根文件系统设备(如果有的话)。如果内核没有在rootfs中找到init文件,则内核会按以前版本的方式定位、挂载根分区,然后执行/sbin/init程序完成系统的后续初始化工作。

这个压缩过的cpio格式的打包文件就是init ramfs。编译2.6版本的linux内核时,编译系统总会创建init ramfs,然后把它与编译好的内核连接在一起。内核源代码树中的usr目录就是专门用于构建内核中的init ramfs的,其中的ini tramfs_data.cpio.gz文件就是init ramfs。缺省情况下,init ramfs是空的,X86架构下的文件大小是134个字节。

1.3了解ramdisk

RamDisk也就是内存盘的意思。所谓的RAM驱动器是在一块内存区域中创建的块设备,用于存放文件系统。ramdisk的容量是创建的时候就固定的。ramdisk需要内核的文件系统驱动程序(如ext2)来操作其上的数据。对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多。你可以把整个应用程序都安装在RamDisk的驱动器中,然后用内存的速度运行它。

2了解Linux操作系统够成

  简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。

平常我们所说的Linux系统只是指的系统的内核,用内核代表了整个Linux操作系统,严格的来说,所有能供计算机使用的Linux操作系统应该叫GNU/Linux。这是为什么呢?因为操作系统软主要分为三大块(启动引导器、内核、根文件系统),缺少任何一块都是无法正常使用的。而这每一部分所使用的软件,都是世界上无数开源爱好者们花了无数心血开发出来的。

2.1什么是启动引导器

所谓启动引导器是指计算机加电后,完成了CMOS自检,然后运行的第一个程序。此程序是保存在磁盘等物理介质的MBR上。该程序用来引导真正的操作系统的启动。比如现在最常使用的grub、lilo、uboot、syslinux等都是启动引导器。

2.2内核

每一个操作系统必有一个内核,平常所说的Linux严格的是指内核,现在最新版本的内核已经发展到2.6.31了,相信大家对Linux内核应该很熟悉了,不熟悉的话,可以看看相关书,在这里我就不多说了。

2.3根文件系统

根文件系统顾名思义就是Linux操作系统的根,若要运行一个Linux操作系统,除了需要内核以外,还需要另外一个重要的部分——根文件系统。根文件系统是一个存放系统运行时必需文件(例如系统配置文件、设备文件、应用程序等)和存储数据文件的外部设备。系统引导完成后,就会启动根文件系统里存放的用户态程序(如init是内核启动完成后运行的第一个用户态程序),接着把操作权交给用户态,来满足用户的各种应用。

根文件系统可以在磁盘上,也可以在内存里运行。

3开始手工制作Linux操作系统

我们将分以下几步来讲解此小巧的内存Linux操作系统的制作:

1)完全在内存中运行的小型Linux系统,根文件系统存放在硬盘里,运行在内存。

2)光盘启动的Linux操作系统,俗称LiveCD,根文件系统及内核存于光盘,运行在内存。

3)USB启动的Linux操作系统,根文件系统及内核存于U盘,运行在内存。

3.1启动引导器

在这里,我们在一台已经安装好GRUB启动引导器的PC机上做实验,稍后章节我将继续讲解如何使用及安装其它引导器来引导Linux内核。如做LiveCD用isolinux来引导,做USBLinux就用syslinux和extlinux来引导(这两个引导器的区别稍后再讲)。

注:在完成后续内容前需要有GRUB的使用基础,若GRUB的基本使用都还没有熟悉的话,我建议先熟悉Linux基础知识,然后再学习手动制作Linux,最好要有成功完过LFS的经验,朋友,学习东西不要心急,万丈高楼平地起啊…万事都是先易后难。

若有一定基础,并且又对Linux手动制作不熟悉的话,请往后看,接着我将为你解开Linux系统制作的神秘面纱。

3.2磁盘准备

预做Linux系统,最好独立一个磁盘分区用来存放制作的东西。这仅仅是个建议,比较熟悉的朋友,可以不需要这个独立分区。但新手我还是建议搞个独立分区较合适。

先使用fdisk来分一个可用的分区,大小要求不高,4GB的空间足够了。

[root@localhost ~]# fdisk –l

如上图示,我在这里采用/dev/sdb6作为我的新系统的工作区。我用的是vmware虚拟机平台,宿主机操作系统是Debian502,在该虚拟机下,我添加了两块虚拟磁盘,一块sdb专门用来做系统制作之用。

格式化分区,以下命令将sdb6分区格式成ext3文件系统:

[root@localhost ~]# mke2fs -j /dev/sdb6

挂载分区:

[root@localhost ~]# cd /mnt/

[root@localhost mnt]# mkdir sdab6

[root@localhost mnt]# mount -vt ext3 /dev/sdb6 sdb6

/dev/sdb6 on /mnt/sdb6 type ext3 (rw)

[root@localhost mnt]# cd sdab6

好了,到目前为止,前期准备工作已经完成,下面将正式进入主题。我们进入第一步:运行于磁盘的小型Linux系统。

3.3从磁盘启动的小型内存Linux系统

在本文中我主要讲解采用ramdisk的根文件系统方式来举例讲解制作小型内存系统。

1.3.1建立ramdisk镜像文件

命令

[root@localhost sdb6]# dd if=/dev/zero of=initrd.img bs=1Mcount=96

此命令用来创建大小为96M的镜像文件。

关于dd命令的用法,请查阅相关手册,Linux的dd命令提供了强大的文件、磁盘备份等功能,当然不仅限于此。

我所建立的initrd.img文件相当于一个块设备的镜像文件,我们可以对它进行格式化,建立文件系统,像操作磁盘一样操作它。

3.3.2格式化此镜像文件

[root@localhost sdb6]# mke2fs -F initrd.img

上述命令是将在此文件中创建ext2文件系统。

准备挂载该文件系统像像

[root@localhost sdb6]# mkdir initrd boot

[root@localhost sdb6]# mount -o loop initrd.img initrd

[root@localhost sdb6]# cd initrd/

[root@localhost initrd]# ls

lost+found

我们看到,已经成功挂载了此文件系统镜像。

3.3.3建立根文件系统目录树

Linux根文件系统目录树有一个标准,在此我就不按标准建立了,因为我要做的Linux操作系统是一个小型化的X86嵌入式Linux系统,精简了多余对目录,感兴趣的朋友可以去网上找相关Linux根文件系统的目录树标准的文档来阅读。

[root@localhost initrd]# mkdir -pv bin dev etc home mnt proc root sbin sys tmp

[root@localhost initrd]# mkdir -pvlib/modules usr/{lib,bin,sbin} var boot

[root@localhost initrd]# ls

bindevetchomelibmntprocrootsbinsystmpusrvar boot

在此就不再讲解目录树各目录的含义了,有兴趣的朋友可以在网上查,资料很多。

3.3.4Linux内核准备

我在这里是使用的Linux-2.6.24版本的内核,可以在http://www.kernel.org上下载此内核的源代码。

进行内核树目录:

[root@localhost ~]# cd /usr/src/linux-source-2.6.24/

先进行一下清理

[root@localhost linux-source-2.6.24]# make clean

配置内核

[root@localhost linux-source-2.6.24]# make menuconfig

按照你的需要,进行内核的配置,在此我就不多说,关于Linux配置方面的知识,可以写成一大本书罗。在此我只强调一点,磁盘支持(根文件系统运行于硬盘的时候需要此选项的支持,在内存中运行不需要)与文件系统(如ext2、ext3、jfs等)支持最好配置成编译成内核。这样在后面的步骤中才不会碰到麻烦。

注:在此需要的基础知识是对Linux内核的编译与裁剪要较熟悉,否则可能会碰到很多想不到的问题。

配置完成后,即开始编译:

[root@localhost linux-source-2.6.24]# make

2.6内核编译比较简单,只需要输入make就可以自动完成所有编译工作。

一个漫长的等待啊….机器性能强点的及配置选择少的,可能编译的会快很多,否则需要一个多小时时间来编译。休息一会儿!

好了,内核终于编译完了,复制必需的文件到我们的目标文件系统中。

[root@localhost linux-source-2.6.24]#mkdir ../modules_tmp

[root@localhost linux-source-2.6.24]# make INSTALL_MOD_PATH=/usr/src/modules_tmp/ modules_install

[root@localhost linux-source-2.6.24]# cd ../modules_tmp/

[root@localhost modules_tmp]# cd lib/modules/

我的内核小版本定的是MiniLinux-12。

复制内核模块到指定目录

[root@localhost modules]# cp -Rfva 2.6.24-MiniLinux-12 /mnt/sdb6/initrd/lib/modules/

进入到内核目录树,复制内核镜像文件到指定目录

[root@localhost linux-source-2.6.24]# cp -v arch/x86/boot/bzImage /mnt/sdb6/boot/

好了,到此为止,内核已经准备好了,接下来需要做根文件系统了。

3.3.5根文件系统制作

因为是制作小型化的Linux系统,所以在此,我采用busybox来制作根文件系统。因为它非常的小巧。

3.3.5.1什么是busybox

busybox号称是嵌入式Linux中的瑞士军刀——小巧、功能齐全。它把许多常用的Linux命令都集成到一个单一的可执行程序中,只用这一个可执行程序(即busybox)加上Linux内核就可以构建一个基本的Linux系统。busybox程序非常小巧,包含全部命令可执行文件大小也只有几百K。busybox是完全模块化的,可以很容易地在编译时增加、删除其中包含的命令。

由于busybox的这些特点,它广泛应用于LiveCD、应急修复盘、安装盘等系统中。我们也是以它为基础,小型X86嵌入式Linux系统。

busybox的官方最新稳定版本是1.15.2,基于我的习惯,我一般不会采用最新版本的来使用。所以我选择1.15.1版本。

从官方网站上http://www.busybox.net/可以下载busybox-1.15.1.tar.bz2文件。

3.3.5.2编译busybox

解压软件包

[root@localhost build]# tar -xjvf ../source/busybox-1.15.1.tar.bz2

[root@localhost build]# cd busybox-1.15.1/

[root@localhost busybox-1.15.1]# make menuconfig

配置安装目录:

Busybox Settings—>

Installation Options—>

[*] Don’t use /usr

选中此选项。

(./_install) BusyBox installation prefix

此选项说明安装的目录。

其它的配置安你的个人需要而定,但一定要选择init及shell的支持,其实用默认配置完全可以。

配置完成之后即开始编译:

[root@localhost busybox-1.15.1]# make

大概几分钟后就可以编译完成,我个人是比较佩服busybox的作者的,他为我们提供了一个这么好的东西,真是太好了。

编译完成之后,即可以安装了,这个安装只是一个虚拟安装,会安装在当前目录下的_install目录里,你只需要把这里面的文件复制到你需要的地方即可。

[root@localhost busybox-1.15.1]# make install

[root@localhost busybox-1.15.1]# cd _install

看看,它的东西真是少,也非常的小巧,仅占660K的空间。

复制所需要的文件

[root@localhost _install]# cp -Rfva bin/* /mnt/sdb6/initrd/bin/

[root@localhost _install]# cp -Rfva sbin/* /mnt/sdb6/initrd/sbin/

[root@localhost _install]# cd /mnt/sdb6/initrd/bin

查看busybox需要的动态链接库

[root@localhost bin]# ldd busybox

linux-gate.so.1 =>(0xffffe000)

libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7f55000)

libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfa000)

/lib/ld-linux.so.2 (0xb7f82000)

通过此命令可以看到,busybox需要以上几个库libm.so.6、libc.so.6、ld-linux.so.2

复制此库文件到指定目录

[root@localhost bin]# cp -v /lib/libm.so.6 ../lib/

[root@localhost bin]# cp -v /lib/libc.so.6 ../lib/

[root@localhost bin]# cp -v /lib/ld-linux.so.2 ../lib/

[root@localhost bin]# cd ..

3.3.5.3必要/etc目录文件配置

在根文件系统里的/etc目录是有几个文件是必不可少的:

fstab、mtab、passwd、shadow、group、hostname、inittab、passwd、profile

有些文件可以借用宿主机的

[root@localhost initrd]# cd etc

[root@localhost etc]# cp -v /etc/passwd* .

[root@localhost etc]# cp -v /etc/group* .

[root@localhost etc]# cp -v /etc/shadow* .

创建fstab文件

[root@localhost etc]# vi fstab

在此文件中写入如下内容:

proc/procprocdefaults00

devfs/devtmpfsdefaults,size=512K00

sysfs/syssysfsdefaults,size=1M00

写入完成后,保存并退出。

创建profile文件

[root@localhost etc]# vi profile

写入以下内容:

if [ "`id -u`" -eq 0 ]; then

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

else

PATH="/usr/local/bin:/usr/bin:/bin"

fi

u=`whoami`

if [ "$PS1" ]; then

if [ "$BASH" ]; then

PS1='[$u@\h \W]\$ ‘

else

if [ "`id -u`" -eq 0 ]; then

PS1=’# ‘

else

PS1=’$ ‘

fi

fi

fi

export PATH

alias ll=’ls -l’

alias la=’ls -A’

alias l=’ls -CF’

umask 022

创建hostname文件

[root@localhost etc]# touch hostname

[root@localhost etc]# echo “localhost” > hostname

创建重要文件:启动脚本inittab

Linux内核的初始化完成之后,运行的用户态第一个程序就是/sbin/init,而init程序即会按照/etc/inittab的配置来依次执行。以下我会创建此文件,并对此文件进行简单讲解。

[root@localhost etc]# vi inittab

写入如下内容:

::sysinit:/etc/init.d/rcS#指定系统初始化脚本

tty1::respawn:/sbin/getty 38400 tty1#激活终tty1登录,采用getty方式

tty2::respawn:/sbin/getty 38400 tty2#激活终tty2登录

::ctrlaltdel:/bin/umount -a –r#按下Ctrl+Shift+Del键发生的动作

busybox的inittab文件格式说明:

  要写自己的inittab,需要理解busybox的inittab文件格式。

  busybox的inittab文件与通常的inittab不同,它没有runlevel的概念,语句功能上也有限制。inittab语句的标准格式是

  :::

  各字段的含义如下

  :

  id字段与通常的inittab中的含义不同,它代表的是这个语句中process执行所在的tty设备,内容就是/dev目录中tty设备的文件名。由于是运行process的tty设备的文件名,所以也不能象通常的inittab那样要求每条语句id的值唯一。

  :

  busybox不支持runlevel,所以此字段完全被忽略。

  :

  为下列这些值之一:

  sysinit, respawn, askfirst, wait,once, restart, ctrlaltdel, shutdown

  其含义与通常的inittab的定义相同。特别提一下askfirst,它的含义与respawn相同,只是在运行process前,会打出一句话“please press Enter to active this console”,然后等用户在终端上敲入回车键后才运行process。

  :

  指定要运行的process的命令行。

创建重要文件:启动脚本rcS

[root@localhost etc]# mkdir init.d/

[root@localhost etc]# cd init.d/

[root@localhost init.d]# vi rcS

写入以下几行:

#! /bin/sh

/bin/mount -a#按照/etc/fstab的配置来挂载文件系统

/sbin/mdev -s#建立设备文件,以后会讲采用udev来进行设备创建及管理

/bin/hostname -F /etc/hostname#获取主机名

文件创建完毕后别忘了对rcS加上可执行文件的权限。

[root@localhost init.d]# chmod 755 rcS

OK,到目前为止,/etc目录的主要文件配置完成。是不是很简单?

接着要创建必需的几个设备文件了。

3.3.5.4创建必要设备文件

我们可以通过从宿主机复制几个重要设备文件。

[root@localhost etc]# cd ../dev/

[root@localhost dev]# cp -Rfva /dev/null .

[root@localhost dev]# cp -Rfva /dev/console .

[root@localhost dev]# cp -Rfva /dev/zero .

[root@localhost dev]# cp -Rfva /dev/ram{0..5} .

好了,到此为止,基本上万事具备,只欠东风了。但测试之前,还需要做一件事情,我们更换busybox里的shell程序,busybox里的shell功能太少了。在此,我们采用bash

3.3.5.5 bash的统计安装

从http://www.gnu.org/software/bash/这个网站上下载源码包,

http://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz

解压编译:

[root@localhost bash-3.2.48]# ./configure –prefix=/tmp/bash

[root@localhost bash-3.2.48]# make

[root@localhost bash-3.2.48]# make install

[root@localhost bash-3.2.48]# cd /tmp/bash/bin

[root@localhost bash]# rm -rf /mnt/sdb6/initrd/bin/bash

[root@localhost bash]# cp -v bash /mnt/sdb6/initrd/bin/

[root@localhost bash]# cd /mnt/sdb6/initrd/bin/

[root@localhost bin]# ls -l bash

查看bash需要哪些动态链接库文件:

[root@localhost bin]# ldd bash

linux-gate.so.1 =>(0xffffe000)

libncurses.so.5 => /lib/libncurses.so.5 (0xb7f5c000)

libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7f58000)

libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfc000)

/lib/ld-linux.so.2 (0xb7f95000)

需要libncurses.so.5、libdl.so.2、libc.so.6、ld-linux.so.2文件。基本libc.so.6、ld-linux.so.2两个库文件之前已经有了,现在只需要复制libncurses.so.5、libdl.so.2两个文件即可。

[root@localhost bin]# cp -v /lib/libncurses.so.5 ../lib/

[root@localhost bin]# cp -v /lib/libdl.so.2 ../lib/

建立sh文件链接

[root@localhost bin]# rm -rf sh

[root@localhost bin]# ln -s bash sh

[root@localhost bin]# ls -l sh

lrwxrwxrwx 1 root root 4 2009-10-23 10:21 sh -> bash

[root@localhost bin]# cd ..

若发现bash很大,可以用strip来去掉无用的东西来缩小它。

[root@localhost initrd]# strip bash

好了,到目前为止,具备启动使用的工作都做好了,我们进行一下简单的测试。

[root@localhost initrd]# chroot .

如上图示,我们chroot新的文件系统了。

bash-3.2# source etc/profile

然后就变成了

出现下图,说明文件系统工作正常

OK,测试成功,现在我们可以进行启动测试了。

[root@localhost /]# exit

[root@localhost initrd]# cd ..

卸载initrd.img的挂载。

[root@localhost sdb6]# umount initrd/

生成gzip的压缩镜像。

[root@localhost sdb6]# gzip -9 initrd.img

复制根文件系统到启动目录:

[root@localhost sdb6]# cp initrd.img.gz boot/initrd.gz

现在boot目录的东西如下图所示:

好了,辛苦了这么久,激动人心的时刻到了,下面就是检验我们成功与否一步了——系统引导启动测试。

3.3.6系统引导启动

重新启动当前的虚拟机:

[root@localhost boot]# reboot

虚拟机停到如图所示的位置后,键盘上按下“c”,进入到GRUB的交互式模式,如下图示:

输入命令:

grub> root (hd1,5)

grub> kernel /boot/bzImage root=/dev/ram0 ramdisk_size=1048576 ro

grub> initrd /boot/initrd.gz

grub> boot

太高兴了,如上图所示,系统正常启动了。相信大家跟我一样心情激动万分哦。赶紧登录进去体验一把。

OK,很正常哦。这表明我们的第一步成功了。此系统是完全运行在内存中的,内核镜像与根文件系统镜像是存在硬盘里的,系统也就是启动的时候需要读一次硬盘,其它时候完全可以不使用硬盘。达到我们的目的了,这种方式就可以联想到:只要有存放镜像文件的介质,从哪里启动该Linux系统都无所谓,刚好引出了后续章节要讲的LiveCD和U盘Linux制作方法。别急,后面会一一讲来。休息一会吧。顺便说一句,有兴趣的朋友,可以把很多应用都可以放到这个小系统里跑,如httpd、PHP、MySQL、SSH等。我所在的公司就有这种需要哦。毕竟我们不是学校实验室,辛苦做个东西是要有实际用处的。

1.3制作U盘启动的小型内存Linux系统

前面已经完成了磁盘引导的内存Linux系统,就像造车一样,核心部件基本都完成了,只需要进行不同的改装,即可完成不同的任务。下面我就讲解如何让这个小系统从U盘上进行引导启动。

进行系统引导有很多种方式,常用的引导程序GRUB、LILO等也可以用来引导U盘系统的启动,但我个人观点,这些引导程序还是有点过大,不够小巧,并且我做过实验,我采用GRUB进行U盘系统的引导没有成功,我看网上有的朋友成功过。在此,我采用syslinux进行U盘系统的引导。

1.3.1syslinux家族介绍

syslinux是一个轻量级的启动装载器,如果玩过Linux,一定知道lilo和grub,是的,所谓轻量级我想就是跟grub们相比而言的,尤其是grub2。

syslinux有很多变种(都是官方的)适用于各种媒质,如syslinux用于从微软的文件系统fat 16/32引导,isolinux用于从光盘引导,pexlinux用于从网络引导,extlinux用于从ext2/3文件系统引导。

从这也可以看出,syslinux对于各种设备的兼容做的很细致,据grub4dos的人说,用于兼容性方面的代码甚至超过了程序主要功能的实现代码。

考虑到我们通常使用的U盘是采用的FAT格式的文件系统,所以在此我们使用syslinux作为U盘Linux系统的引导程序。

下载syslinux到宿主机上编译安装。

插入U盘,在Linux下查看U盘的情况:

[root@localhost ~]# fdisk -l

上图是我的系统下的U盘的情况,sdc1即为我的U盘的分区。

但此分区还不是引导分区,用fdisk给此分区加上引导标志。

[root@localhost ~]# fdisk /dev/sdc

在fdisk的命令行里输入a

再输入1

则给sdc1加上的启动的标志,如下图示:

再输入w

则保存修改并退出。

[root@localhost ~]# cd /mnt/

[root@localhost mnt]# mkdir sdc1

挂载sdc1分区

[root@localhost mnt]# mount -vt vfat /dev/sdc1 sdc1

[root@localhost mnt]# cd sdc1

[root@localhost mnt]# mkdir boot

复制上一节制作好的Linux内核镜像与根文件系统镜像到sdc1上:

[root@localhost sdc1]# cp -v /mnt/sdb6/boot/* boot/

建立syslinux目录

[root@localhost sdc1]# mkdir syslinux

先做清除引导记录操作:

[root@localhost sdc1]# dd if=/dev/zero of=/dev/sdc bs=446 count=1

安装syslinux到U盘上:

[root@localhost sdc1]# syslinux -d syslinux /dev/sdc1

建立syslinux的配置文件syslinux.cfg

[root@localhost sdc1]# cd syslinux

[root@localhost syslinux]# vi syslinux.cfg

写入如下内容:

LABEL Linux

kernel /boot/bzImage

append initrd=/boot/initrd.gz ramdisk_size=1048576 root=/dev/ram0 ro

好了,到目录为止,U盘的引导应该做完了,下面我们重启测试了。

1.3从光盘启动的小型内存Linux系统

基于前面讲的syslinux家族知识,从光盘启动我们选择isolinux来引导系统启动。

[root@localhost /]# cd /mnt/sdb6

建立ISO文件主工作目录

[root@localhost sdb6]# mkdir iso-home

[root@localhost sdb6]# cd iso-home

建立syslinux的目录

[root@localhost iso-home]# mkdir isolinux

找到一个Linux LiveCD,从那里面找到isolinux.bin文件,然后复制到isolinux目录,

[root@localhost iso-home]# cd isolinux/

建立isolinux.cfg文件,

[root@localhost isolinux]# vi isolinux.cfg

写入以下内容:

DEFAULT /boot/bzimage initrd=/boot/initrd.gz

LABLE MiniLinux-20.iso

kernel /boot/bzimage

append initrd=/boot/initrd.gz load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=1671685 rw root=/dev/ram quiet

保存并退出。

[root@localhost isolinux]# cd ../../

开始制作光盘镜像文件:

mkisofs -o linuxtest.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table iso-home/

命令执行完成后,就在当前目录下生成linuxtest.iso文件,此文件即是我们制作的光盘镜像文件。

好了,用虚拟机测试一下,当然也可以刻成光盘进行测试。

2结束语

一个小型Linux系统制作的原理基本上已经验证通过了,这仅仅是个学习,离一个可以给企业使用的完整的Linux系统还有很大距离,其中包括Linux系统初始化脚本、系统关闭脚本、服务启动脚本、设备及驱动管理等等。还有很多很多东西需要做,由于时间原因,我在此先写这么多,开始之前,我确实想写一个较完整的手工制作Linux系统步骤及Linux启动脚本和初始化等的讲解,但考虑到内容实在太多,所以暂时不写了,以后若有时间我再补上。

泪,一种痛苦的雨滴,不知从什么时候开始已在我的世界下个不停。

基于X86的小型内存Linux操作系统

相关文章:

你感兴趣的文章:

标签云: