制作自己的Linux OS

制作一个光盘启动的 Linux 系统 , 大小 5.15M , 功能包括 Linux 大多数基本命令。(花了几天的时间)

系统介绍

文件系统用的是 ram, 速度很快 , 采用 isoLinux 光盘启动 , 可以方便升级 kernel 和更改 root fs( 增减 Linux 命令 ), 实际上这个东西还可以做的更小 , 考虑到是 iso 所以不是很在乎空间 , 如果是嵌入式系统 , 可以考虑把 root fs 采用 gzip -9 压缩存贮 . 我测试了完全可以在 1.44M 以内解决问题 .

知识背景

1.Linux 启动

首先 , 主板的 BIOS 会读取硬盘的主引导记录 (MBR),MBR 中存放的是一段很小的程序 , 他的功能是从硬盘读取操作系统核心文件并运行 , 因为这个小程序太小了 , 因此通常这个小程序不具备直接引导系统内核的能力 , 他先去引导另一个稍微大一点的小程序 , 再由这个大一点的小程序去引导系统内核 (ps: 这个稍微大一点的程序 , 就是我们平常熟知的 lilo grub, 但是本系统采用的 isoLinux+mkisofs). Linux 系统内核被引导程序装入内核并运行后 ,Linux 内核会检测系统中的各种硬件 . 并做好各种硬件的初始化工作 , 使他们在系统正式运行后能正常工作 . 之后内核做的最后一个工作是运行 /sbin 下的 init 程序 ,init 是英文单词 initialization( 初始化 ) 的简称 ,init 程序的工作是读取 /etc/inittab 文件中描述的指令 , 对系统的各种软硬件环境做最初化设定 . 最后运行 getty 等待用户输入用户名登录系统 . 所有的工作就这么简单 , 虽然 Linux 启动的时候有很多内容 , 看上去十分高深 , 但是都不过是对这个过程的扩充 . 明白了这个道理 , 你可以写一些脚本程序让他在系统启动的特定时间运行完成任务 . 事实上系统内核并不关心 /sbin 下的 init 是不是真的 init, 只要是放在 /sbin 下名叫 init 的可执行程序他都可以执行 , 在本系统中 , 我直接让系统进入 /bin/bash, 绕开了系统 login 登陆验证 .

2. 操作系的构成

引导程序 + 内核 + 文件系统 (ps: 不知道这样说确切不 , 但我是这么认为的 )

3. 内核编译

www.kernel.org 下载 linux-2.6.xx.tar.gz

tar –xzvf linux-2.6.xx.tar.gz –C /usr/src/kernel/

cd /usr/src/kernel/linux-2.6.xx

make mrproper

make menuconfig

make dep

meke clean ( 可以不用 )

make bzImage

好了 , 我没有加入对 modules 的支持 , 生成的 bzImage 文件在 usr/src/Linux/arch/i386/

4.busybox

1,busybox 简介

busybox 是一个集成了一百多个最常用 Linux 命令和工具的软件 , 他甚至还集成了一个 http 服务器和一个 telnet 服务器 , 而所有这一切功能却只有区区 1M 左右的大小 . 我们平时用的那些 Linux 命令就好比是分力式的电子元件 , busybox 就好比是一个集成电路 , 把常用的工具和命令集成压缩在一个可执行文件里 , 功能基本不变 , 而大小却小很多倍 , 在嵌入式 Linux 应用中 ,busybox 有非常广的应用 , 另外 , 大多数 Linux 发行版的安装程序中都有 busybox 的身影 , 安装 Linux 的时候案 ctrl+alt+F2 就能得到一个控制台 , 而这个控制台中的所有命令都是指向 busybox 的链接 . Busybox 的小身材大作用的特性 , 给制作一张软盘的 Linux 带来了及大方便 .

2,busybox 的用法

可以这样用 busybox #busybox ls , 他的功能就相当运行 ls 命令 最常用的用法是建立指向 busybox 的链接 , 不同的链接名完成不同的功能 .

#ln -s busybox ls

#ln -s busybox rm

#ln -s busybox mkdir

然后分别运行这三个链接 :

#./ls

#./rm

#./mkdir

 

就可以分别完成了 ls rm mkdir 命令的功能 . 虽然他们都指向同一个可执行程序 busybox 但是只要链接名不同 , 完成的功能就不同 ,busybox 就是这么的神奇 . 目前版本是 busybox1.0 正式版 .

3. 下载

http://www.busybox.net/downloads/

三、准备工作

1.mkdir -p /mnt/myOS ----- 作为产生我们新系统的目录

2.mkdir -p /mnt/myOS/isoLinux ----- 必需 , http://sysLinux.zytor.com/iso.php

3. 安装 mkisofs, 可以直接下载 rpm 来安装 , 版本最新为宜 ---rpm -ivh ***.rpm

4. 编译内核 , 生成 bzImage,cp bzImage /mnt/myOS/ ----- 编译内核请参考 , 请注意一定加入 RAM disk support initial RAM disk (initrd) support 的支持 , 要不然等下你的新系统肯定启动不了

5. 下载 busybox -----http://www.busybox.net/downloads/

四、编译

busybox 的配置程序和 Linux 内核菜单配置方式简直一模一样 . 熟悉用 make menuconfig 方式配置 Linux 内核的朋友很容易上手 .

#cp busybox-1.00.tar.gz /tmp/ada

#cd /tmp/ada

#tar xvfz busybox-1.00.tar.gz

#cd busybox-1.00

#make menuconfig

下面是需要编译进 busybox 的功能选项 , 其他的可以根据需要自选 , 但是同样不要太贪心 .

General Configuration 应该选的选项

Show verbose applet usage messages

Runtime SUID/SGID configuration via /etc/busybox.conf

 

Build Options

Build BusyBox as a static binary (no shared libs)

这个选项是一定要选择的 , 这样才能把 busybox 编译成静态链接的可执行文件 , 运行时才独立于其他函数库 . 否则必需要其他库文件才能运行 , 在单一个 Linux 内核不能使他正常工作 . (比如,不需要 glibc 库,如果在嵌入式中或者 pc 上使用 glibc 或者 uclibc 库的话,推荐使用 shared lib

Installation Options

Don't use /usr

这个选项也一定要选 , 否则 make install busybox 将安装在原系统的 /usr , 这将覆盖掉系统原有的命令 . 选择这个选项后 ,make install 后会在 busybox 目录下生成一个叫 _install 的目录 , 里面有 busybox 和指向他的链接 . 其他选项都是一些 Linux 基本命令选项 , 自己需要哪些命令就编译进去 , 一般用默认的就可以了 .

配置好后退出并保存 .

make

make install

编译好后在 busybox 目录下生成子目录 _install, 里面的内容 :

drwxr-xr-x 2 root root 4096 11 24 15:28 bin

lrwxrwxrwx 1 root root 11 11 24 15:28 Linuxrc -> bin/busybox

drwxr-xr-x 2 root root 4096 11 24 15:28 sbin

其中可执行文件 busybox bin 目录下 , 其他的都是指向他的符号链接

五、制作自己的 root fs

1. 目录结构

mkdir /mnt/myOS/rootfs

cd /mnt/myOS/rootfs

mkdir etc usr var tmp proc home root dev

其中 etc,proc dev 是一定要建的 ,bin sbin 不用建 , 因为 busybox 中已经有了 .

其他的可以象征性的建几个就可以了 .

拷贝 busybox

#cp -R /tmp/ada/busybox-1.00/_install/* /mnt/myOS/rootfs/

2. 设备文件

我是直接在 redhat 系统 /dev 目录里 cp , 方法如下 :

#cp -R /dev/console ./

#cp -R /dev/null ./

#cp -R /dev/zero ./

你认为需要的都 cp 过来

3, 建立 etc 目录下的配置文件

这个请参考我的 /etc

4. 制作 ramdisk 映象文件

cd /mnt/myOS/

dd if=/dev/zero of=initrd4m.img bs=1M count=4    ------ 初始化 4M 内存空间

mkfs.ext2 -m0 initrd4m.img                                   ------ 格式化为 ext2

mkdir ramdisk

mount initrd4m.img ramdisk –o loop                      ------ 挂载 initrd4m 镜像文件到 loop 设备

cp -R rootfs/* ramdisk                                                 ------ rootfs 写入 initrd4m 镜像文件

umount ramdisk                                                     ------ 卸载 loop 设备

 

initrd4m.img 就是我们的 rootfs

 

六、整合

1.kernel

cp /usr/src/Linux/arch/i386/bzImage /mnt/myOS/

2.rootfs

已经在这个目录了 , 就是 ramdisk.img

3.isoLinux

cp isoLinux.bin isoLinux.cfg /mnt/myOS/isoLinux

编辑 isoLinux.cfg. 写法和 grub 的差不多

. 制作 iso

cd /mnt/myOS

目录里的东西如下 :

bzImage

ramdisk.img

└─ isoLinux

isoLinux.bin

isoLinux.cfg

boot.cat ----|

-> 这两个文件你可以自己随便写

boot.msg ----|

mkisofs - myiso.iso -b isoLinux/isoLinux.bin -c isoLinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table /mnt/Myiso

制作完毕,赶快测试自己的 OS 吧!

你可能感兴趣的:(L.Linux,开发,O.嵌入式系统开发,linux,initialization,工作,嵌入式,applet,build)