制作DOM 盘上的Linux 系统

环境:
台式机 + 一块IDE 硬盘(安装了WindowsXP + RedHat-2.4.18) + 一个64M 的DOM 盘(类似
于一个小硬盘,但是不同于USB 存储)
目标:
在DOM 盘上制作一个能独立启动并包含常用命令集的Linux 系统
内容说明:
首先:分三步进行介绍,分区,grub 安装与解读和busybox 的安装。
其次:本文是针对具体环境和grub 这种引导加载器进行阐述的,所以在应用于其它环境或
者使用lilo 引导加载器时可能会出现一些问题或者不能全面涵盖相关知识,请谅解。
最后:作者水平有限,虽然已经尽可能全面的将自己的经验写出来,并参考了不少的网络上
的朋友的资料和建议,但是文中肯定不乏缺陷与错误,如有发现,欢迎跟我联系,指
出,以便对这份文档进行及时更新。
(1):使用 fdisk 对DOM 盘进行分区
硬盘和DOM 盘分别通过一根数据线连接到主板的两个IDE 接口上(一般情况下,硬盘占一
个口,光驱占一个口,所以可以把光驱连接的IDE 口暂时借给第二块硬盘)。
系统正常启动后(或许需要跳线设置),执行命令fdisk –l,查看Linux 系统是否发现了第二块
硬盘, 如图:
从图中我们可以看到,/dev/hda 为机器自带的80G IDE 硬盘,而/dev/hdc 正是刚连接上去的
DOM 盘。
首先对DOM 盘进行分区,我们将其划分为两个分区,编号为1 和2,一个分区对应我们将
要做的新的系统的boot 分区,也就是安装内核的分区,另外一个对应系统得/分区;由于boot
分区中存放的是系统启动时用到的内核文件,它并不会占据太大的空间,所以我们给其分配
10M 空间,而剩下的50M 左右的空间留给/分区。下面,我们使用fdisk 命令将DOM 分成
/dev/hdc1 和/dev/hdc2 两个分区。
首先,删除原来的hdc1 分区:
查看一下分区情况:
创建分区hdc1,主分区,编号为1,大小为+10M:
将剩下的空间分给hdc2,主分区,编号为2,空间大小选择默认,fdisk 就会使用剩余的全部
空间;保存退出。
再用fdisk -l 命令进行查看[注4]:
可以看到分好的两个分区hdc1 和hdc2,接着将其格式化为ext3 格式:
[root@cucme root]#mke2fs –j /dev/hdc1
[root@cucme root]#mke2fs -j /dev/hdc2
(2):grub 安装与配置
为了能对DOM 盘的两个分区hdc1 和hdc2 进行像普通文件一样的访问,我们在mnt 目录下
建立两个目录和这两个分区对应起来,取名为fakeboot 和fakeroot,将目录的名字和他们的
实际作用对应起来。
[root@cucme root]# mkdir /mnt/fakeboot
[root@cucme root]# mkdir /mnt/fakeroot
然后通过命令
[root@cucme root]# mount /dev/hdc1 /mnt/fakeboot
[root@cucme root]# mount /dev/hdc2 /mnt/fakeroot
将其挂载到对应的目录。
用df 命令查看下:
可看到fakeroot 可用空间为44M, fakeboot 可用空间为8.2M,这正是我们前面对DOM 进行
划分的结果。
为了hdc 分区能开机自动挂载,修改/etc/fstab 文件,在其中添加如下条目:
/dev/hdc1 /mnt/fakeboot ext3 defaults 0 0
/dev/hdc2 /mnt/fakeroot ext3 defaults 0 0
保存。(关于fstab 文件结构解释,见注0)
然后reboot,使用df –h 命令查看各个分区的磁盘空间,应该跟手动挂载上的效果是一样的。
下一步,我们使用grub-install 命令将grub 安装到/dev/hdc 上
然后用ls 命令查看 /mnt/fakeboot 目录,也就是/dev/hdc1 的情况:
可以看到grub 已经成功安装到/dev/hdc 这个磁盘上了。
下面需要创建一个menu.lst 链接,可以将原来系统的grub.conf 文件直接拷贝到新的grub 目
录下再进行修改,这样省却了自己手动敲上所有内容或者不必要的复制,修改后再创建一个
符号链接:
[root@cucme root]# cp /boot/grub/grub.conf /mnt/fakeboot/grub/
然后打开/mnt/fakeboot/grub 下的grub 文件,我们知道,现在这个grub 引导加载器是装在
DOM 盘上的,我们可以用它来引导DOM 上的Linux 系统,也可以用来引导原来硬盘上的
Linux 系统(当然这是在硬盘和DOM 盘都连接在机器上时我们才能做的,不过由于DOM 盘
已经安装了grub,所以我们可以用它单独来引导一个系统)。首先对grub.conf 文件中的内容
进行简单的分析:
除去注释,有用的就是10 行到19 行
default=0 表示默认启动进入第一个操作系统,也就是本文件中的Red HatLinux(13 行)
timeout=10 表示等待用户选择的时间(秒),超过这个时限,系统自动选择默认其动项。
splashimage=xxx 表示启动进入grub 选项时背景图像的存放处,如果感兴趣的话,你可以
自己创建xpm 文件然后gzip 压缩,设置你喜欢的风格,比如我做的这个:
title 是显示的标题,可以自己修改
这里我们需要关注的是14 行,15 行和16 行
root(hd0, 7) 指的是grub 的root 分区的位置,却并不一定就是通常所说的Linux 系统的root
分区, 因为grub 的root 分区指的是Linux 的内核文件(img 和initrd)的存放位置,例如最简单
的情况,我们将内核文件存放在/dev/hdc1 上,那么此处就应该改为root(hd1, 0),如果将内核
文件存放在主机自带的那块硬盘上,这里大概就应该用(hd0,n)来表示了,n 表示那块硬盘上
存放内核文件的分区编号(不过这种方法我却没有试验过^_^,只是推断,有条件你可以试试),
你也可以尝试将内核文件放置在/dev/hdc2 上,这样此处就可以用root(hd1,1)来替代。
kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
kernel 后面的内容表示内核文件是grub 的root 分区下(也就是Linux 系统的boot 分区)的名
为vmlinuz-2.4.18-14 这个文件,为了验证这一点,在本例中,我们在/mnt/fakeboot 中建立
两个子目录kernel 和initrd , 然后将vmlinuz-2.4.18-14 拷贝进kernel 目录, 将
initrd-2.4.18-14.img 拷贝进initrd 目录;ro 表示readonly 只读,root=/LABEL=/是Linux 的
硬盘分区表示法,表示Linux 系统的/分区,可以在/etc/fstab 文件中看到这一行
LABEL=/ / ext3 defaults 1 1
这实质上是将/目录的位置传递给引导加载器,也可以直接将对应的设备文件写上去,改成
root = /dev/hda9
另外;如果我们选择从DOM 盘进行启动的话,DOM 盘的编号就变为hd0 了,而原来的硬
盘的编号就变为hd1 了,所以,要从DOM 盘启动原来硬盘上的系统,还必须将启动项进一
步修改:
title Red Hat Linux (2.4.18-14--DISK--)
root (hd1,7)
kernel /vmlinuz-2.4.18-14 ro root=/dev/hda9
initrd /initrd-2.4.18-14.img
修改完后,在BIOS 设置第二块硬盘启动,重启,你就可以从DOM 盘上的grub 选择启动第
一块硬盘上的Linux 系统。(如果有问题的话仔请仔细休检查或者跟作者联系)
下来,修改windowsXP 的启动项,以保证能够从DOM 盘启动硬盘上的WindowsXP
系统。
将原来grub.conf 文件中的windowsXP 的启动项部分修改为如下的格式:
title WindowsXP
## windowsXP is a kind of system that can not
## be booted from another disk,so we map disk1 to disk2 and
## disk2 to disk1
rootnoverify (hd1,0)
chainloader (hd1,0)+1
makeactive
map (hd0) (hd1)
map (hd1) (hd0)
boot
其中的rootnoverify 和root 的作用差不多(如果使用rootnoverify 有问题可以尝试改为root
命令),由于windowsXP 是一个无法从第二块硬盘启动的操作系统,所以需要用map 命令
将hd0 映射为hd1,而将hd1 映射为hd0,关于链式装载器chainloader 以及map 命令的详
细用法可参考相关文档。
修改完成后重新启动系统(从DOM 盘),选择WindowsXP 这一项,便会进到WindowsXP 系
统中。
下面,为将要制作的DOM 盘上的系统添加一个启动项:
首先将原来的内核文件直接拷贝到fakeboot 下的kernel 目录和initrd 目录
[root@cucme fakeboot]# rsync -av /boot/vmlinuz-2.4.18-14 kernel/
[root@cucme fakeboot]# rsync -av /boot/initrd-2.4.18-14.img initrd/
现在,启动新的系统的内核文件已经存在了,需要告诉grub 跟启动有关的参数:
我们已经知道/dev/hdc 是新的grub 所在的磁盘,而且hdc 的第一个分区中的kernel 目录和
initrd 目录放置了启动系统相关的内核文件和镜像文件,并且按照我们一开始分区的目的,
hdc 的第二个分区也就是/dev/hdc2 将作为新的Linux 系统的/分区,所以可以添加如下的一
个启动项:
#####----for a mini linux on our DOM disk
title Red Hat Linux (2.4.18-14--DOM--)
root (hd0,0)
kernel /kernel/vmlinuz-2.4.18-14 ro root=/dev/hdc2
initrd /initrd/initrd-2.4.18-14.img
(注1)
然后创建一个链接
[root@cucme grub]# ln -fs grub.conf menu.lst
得到完整的grub.conf 文件内容如下:
然后在BIOS 中设置用第二块硬盘启动或者在启动时按F12 选择用第二块硬盘启动,测试能
否进入到原来的Linux 系统和windows 系统(我相信你一定能成功的,只需要耐心 ^_^)
现在boot 做好了,还要对root 进行处理:
首先在/mnt/fakeroot 下创建根/目录下一样的空目录。
有initrd, bin, sbin, lib, etc, dev, usr, var, boot, dev.
然后将/etc 下的fstab 文件拷贝到/mnt/fakeroot/etc 下,修改成如下格式(注2):
/dev/hdc2 / ext3 defaults 0 0
/dev/hdc1 /boot ext3 defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
接着,将/dev 下的几个重要的设备文件拷贝到/mnt/fakeroot/dev 目录下
[root@cucme dev]# mkdir –p /data/dev/
[root@cucme dev]# cp -dpR hda* hdc* console tty tty0 tty1 ram* /data/dev/
[root@cucme dev]# cd /data/dev/
[root@cucme dev]mkdir /mnt/fakeroot/dev/pts
[root@cucme dev]mkdir /mnt/fakeroot/dev/shm
[root@cucme dev]# cp -dpR * /mnt/fakeroot/dev/
(注3)
这时,如果选择DOM 对应的那个启动项,应该会看到:
Kernel panic: No init found. Try passing init= option to kernel.
从这个错误提示我们大概可以知道:内核已经成功加载,但是,遵循Linux 的启动过程--当
内核成功加载进内存后,它会将系统启动的剩下工作交给init 程序(而此时DOM 上的init
程序还不知道在哪里),所以,下面我们将会完善boot/root 中的root 部分。
(3):使用busybox 为系统提供命令集。
由于原始的/目录下子目录包含的可执行程序,相关的动态库以及配置文件都比较大(远远超
过一个DOM 盘的50M 空间),所以我们自然而然应该去寻找一个占据较小空间但是又能替
代Linux 的命令集的程序组,这就是busybox。
关于busybox 的介绍,请参见随带文档或者相关网络资源。
下载busybox-1.2.0.tar.gz,解压缩。
[root@cucme tmp]# cd busybox-1.2.0
[root@cucme busybox-1.2.0]# make menuconfig
选择时要注意几项:
Build Options --->
中将
[*] Build BusyBox as a static binary (no shared libs)
选上
Installation Options --->
中将
[*] Don't use /usr
选上,其它的自己选择,不过常见的命令都要选上哦,还有init 进程和ash。
配置完后保存,编译:
[root@cucme busybox-1.2.0]# make
安装:
[root@cucme busybox-1.2.0]# mkdir /data/busybox
[root@cucme busybox-1.2.0]# make PREFIX=/data/busybox install
这个时候可以看到/data/busybox 下生成了对应的目录和文件:
[root@cucme busybox-1.2.0]# ls /data/busybox/
bin linuxrc sbin
将这些文件拷贝到/mnt/fakeroot 下
[root@cucme busybox]# rsync -av * /mnt/fakeroot/
然后将/tmp/busybox-1.2.0/examples/bootfloppy/etc 下的inittab 拷贝到/mnt/fakeroot/etc 下,
在/mnt/fakeroot/etc 下建立目录init.d
[root@cucme etc]# mkdir /mnt/fakeroot/etc/init.d
拷贝/tmp/busybox-1.2.0/examples/bootfloppy/etc/init.d
下的rcS 文件到/mnt/fakeroot/etc/init.d 目录下。
[root@cucme init.d]#cp rcS /mnt/fakeroot/etc/init.d/
[root@cucme init.d]# cd /mnt/fakeroot/etc/init.d/
[root@cucme init.d]# chmod 777 rcS
修改rcS 文件内容为:
#! /bin/ash
export PATH=/sbin:/bin
/bin/mount -n -t proc none /proc
/bin/umount /initrd
/bin/mount -n -o remount,rw /
/bin/mount -n -o remount,rw -t proc none /proc
/sbin/insmod eepro100.o
/sbin/ifconfig eth0 192.168.0.168
/bin/echo "-------------Welcome To my Linux System-------------"
首先使用busybox 的ash,导出PATH 的路径,接着挂载proc,插入网卡的驱动,然后设置ip
地址,最后打印提示信息。
当然,要加载驱动,就需要把网卡的驱动按照跟原来系统一样的路径复制到新的系统目录
[root@cucme init.d]# cd /lib/modules/2.4.18-14/kernel/drivers/net/
[root@cucme net]# cp eepro100.o /mnt/fakeroot/lib/modules/2.4.18-14/kernel/drivers/net/
然后将/mnt/fakeroot/etc 下的inittab 修改为:
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty 115200 ttyS0
::respawn:/bin/ash
::askfirst:/bin/ash
::ctrlaltdel:/bin/umount -a -r
::restart:/bin/init
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a
保存重启。
如果一切正常那的话就应该能看到加载网卡驱动的提示信息和echo 出来的提示信息。
另外提示:“Please press Enter to activate this console”
回车,就进入ash 的命令行了。
Ps 命令只能看到10 个左右的内核线程,因为应用程序和服务还没有加上去。
关于这个嵌入式系统(不知道这么叫是否合适)的制作,到目前就告一段落,其实还有很多需
要完善,比如ssh 服务的添加,longin 的添加,还有其它好多程序,不过这些都是跟具体的
应用相关了,到此我们就算将一个小小的系统搭建起来了。
(4):问题与解答
0)fsab 文件:
第1 列是需要挂载的文件系统或存储设备;第2 列是挂载点;第3 列指定文件系统或
分区的类型,比如fat 或者ext2; 第4 列为挂载选项,比如
auto: 系统自动挂载,fstab 默认就是这个选项
ro: read-only
rw: read-write
defaults: rw, suid, dev, exec, auto, nouser, and async.
第5 列为dump 选项,设置是否让备份程序dump 备份文件系统,0 为忽略,1 为备
份。
第6 列为fsck 选项,告诉fsck 程序以什么顺序检查文件系统,0 为忽略
1) 不同于Linux 系统的默认设置,我们将内核文件和镜像文件放进了一个嵌套的子目录
kernel 和initrd 中,目的是为了加深对root(hd0,0)的理解。
2) 在fstab 的修改中注意要将前两行的后两位改为0 ,0, 如果沿用系统原来的1 1 和 1
2 的话,得到的操作系统是只读的,不能写(比如vi 建立的文件没法保存),这个问题是
我在做好之后才发现的。
3) /dev 下有几个文件在开始时没有拷贝,所以系统启动时总有问题,下面是最终做好的小
Linux 的dev 下的文件:had*,hdc*, fb*,ram*,tty,tty0,tty1,tty2,zero,console,可以参考下。
4) Thdatday 给出了更好的建议,使用如下命令更精确,因为他最近在学习shell, 所以shell
代码的思路就比较多了:

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyw2698/archive/2007/12/13/1932387.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值