Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3785748
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: LINUX

2020-05-12 16:17:50

原文地址:Busybox制作Linux系统 作者:LinuxStack

    简单的Linux系统包含:文件系统和Linux 内核,然后根据需要添加必要的系统与应用功能。

一.制作Linux内核镜像文件

    下载内核源码linux-2.6.35.tar.bz2,默认配置编译,也可通过menuconfig选择编译,编译出内核镜像文件bzImage。

  1. cd /usr/src
  2. tar jxvf linux-2.6.35.tar.bz2
  3. ln -s linux-2.6.35 linux
  4. cd linux
  5. make O=/home/name/build/kernel defconfig
  6. make O=/home/name/build/kernel menuconfig
  7. make O=/home/name/build/kernel
二.制作RAM文件系统

1.编译安装Busybox
   Busybox是集合了许多Linux命令的工具,主要是用于有限制硬盘与内核大小的系统中,如嵌入式系统中。把Busybox集成到文件系统中,以支持系统的命令操作。

  1. wget busybox.net/downloads/busybox-1.20.0.tar.bz2
  2. tar jxvf busybox-1.20.0.tar.bz2
  3. cd busybox-1.20.0
  4. make menuconfig
   编译选项配置静态编译,这个是为了制作的系统上使用时不依赖动态库;若动态编译时,需要将必须的动态库制作进去。系统中一般没有安装glibc的静态库,需要先安装,否则编译链接crypt,m库时失败。
   Busybox Settings  ---> Build Options  ---> [*] Build BusyBox as a static binary (no shared libs) 

   在该版本在fedora15 上静态编译时inetd链接不过,可以配置menuconfig去掉inetd支持。
   Networking Utilities  ---> [ ] inetd


  1. make
2.制作initrd镜像
   Initrd:boot loader initialized RAM disak, 表示启动初始化的内存盘。在linux内核启动前,boot loader会将initrd加载到内存中,因此在访问真正的根文件系统回访问内存的initrd文件系统。
   Initrd 的用途主要有以下四种:
   1). linux 发行版的必要部件;
   2). livecd 的必备部件;
   3). linux usb启动盘使用;
   4). linuxrc脚本中可以方便定制bootsplash。
a.安装busybox到镜像文件

  1. mkdir image
  2. make install CONFIG_PREFIX=./image
  3. cd image
b.若是动态编译,复制必要的动态链接库

  1. mkdir lib
  2. cp /lib/ld-linux.so.2 lib
  3. cp /lib/libc.so.6 lib
  4. cp /lib/libcrypt.so.1 lib
  5. cp /lib/libm.so.6 lib
c.在image下创建必要的目录和设备文件

  1. mkdir proc sys etc mnt
  2. mknod -m 600 dev/null c 1 3
  3. mknod -m 600 dev/console c 5 1
d.在image目录下写一个init脚本

编辑内容
  1. #!/bin/sh
  2. mount -t proc proc /proc
  3. mount -t sysfs sysfs /sys
  4. mdev -s  #自动装配/dev下面设备文件
相关处理
  1. chmod +x init               # 添加执行权限
  2. touch etc/mdev.conf    # 避免mdev出错
e.在image中写etc/inittab脚本

  1. cd image
  2. mv init etc/init.d/rcS
  3. mv linuxrc init
  4. touch etc/fstab #reboot命令访问
文件内容
  1. ::sysinit:/etc/init.d/rcS
  2. tty1::askfirst:/bin/sh
  3. tty2::askfirst:/bin/sh
  4. tty3::askfirst:/bin/sh
  5. tty4::askfirst:/bin/sh
  6. tty5::askfirst:/bin/sh
  7. tty6::askfirst:/bin/sh
  8. ::restart:/sbin/init
  9. ::ctrlaltdel:/sbin/reboot
  10. ::shutdown:/bin/umount -a -r
文件格式说明:
:::
: 
  id代表的是这个语句中process执行所在的tty设备,内容就是/dev目录中tty设备的文件名。
: 
  busybox不支持runlevel,所以此字段完全被忽略。 
: 
  sysinit, respawn, askfirst, wait,once, restart, ctrlaltdel, shutdown 
  其含义与通常的inittab的定义相同。特别提一下askfirst,它的含义与respawn相同,只是在运行process前,会打出一句话 “please press Enter to active this console”,然后等用户在终端上敲入回车键后才运行process。 
  
  指定要运行的process的命令行。

f.创建initrd镜像

  1. find . | cpio --quiet -H newc -o | gzip -9 -n > ../initrd.gz
cpio命令说明(cpio - copy files to and from archives);
  -o :  copy-out mode,cpio copies files into an archive;
  -H :  指定打包文件的具体格式,要生成initramfs,只能用newc 格式;
  -i :  copy-i mode,cpio copies files out of an archive or lists the ar‐
        chive contents;
  -F :  指定的文件名;
  -t :  查看包文件中的文件类似ls -l;
  zcat initrd.gz | cpio -t

3.测试镜像文件

  启动调试bzImage的命令,默认端口是gdb端口1234;
  1. qemu-system-i386 -kernel bzImage -append "root=/dev/ram0" -initrd initrd.gz -s -S
  -s enables the gdb stub
  -S instructs Qemu to stop after system restart, Wait for gdb to connect.
4.其他
 
可以制作一个rootfs镜像文件
  1. dd if=/dev/zero of=rootfs.img bs=1024k count=5
  2. mkfs.ext2 -i 1024 -F rootfs.img
  3. mkdir rootfs
  4. mount -o loop rootfs.img rootfs
  5. rsync -a image rootfs/
  6. chownR root:root rootfs
  7. sync
测试

  1. qemu -32 –hda rootfs.img -kernel bzImage –append “root=/dev/hda clock=pit”

参考文档
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/
http://blog.chinaunix.net/uid-26061689-id-3032291.html


阅读(1222) | 评论(0) | 转发(0) |
1

上一篇:grub2详解

下一篇:busybox制作文件系统

给主人留下些什么吧!~~