1、一个作为宿主机的Linux;本文使用的是Redhat Enterprise Linux 5.4;
2、在宿主机上提供一块额外的硬盘作为新系统的存储盘,为了降低复杂度,这里添加使用一块IDE接口的新硬盘;
3、Linux内核源码,busybox源码;本文使用的是目前最新版的linux-2.6.34.1和busybox-1.16.1。
说明:本文是一个step by step的实做指南;
一、为系统上的新硬盘建立分区,这里根据需要先建立一个大小为100M的主分区作为新建系统的boot分区和一个512M的分区作为目标系统(即正在构建的新系统,后面将沿用此名称)的根分区;100M的分区格式化后将其挂载至/mnt/boot目录下;512M的分区格式化后将挂载至/mnt/sysroot目录;
说明:
1、此处的boot和sysroot的挂载点目录名称尽量不要修改,尤其是boot目录,否则您必须保证后面的许多步骤都做了相应的改动;
2、新建系统的boot目录也可以跟根目录在同一个分区,这种方式比独立分区还要简单些,因此这里将不对此种方法再做出说明;
二、编译内核源代码,为新系统提供一个所需的内核(本例中的源代码包都位于/usr/src目录中)
# cd  /usr/src
# tar jxvf linux-2.6.34.1.tar.bz2
# ln  -sv  linux-2.6.34.1  linux
# cd linux
# make menuconfig
根据您的实际和规划选择所需要的功能;本实例计划制作一个具有网络的功能的tiny linux且不打算使用内核模块,因此,这里选择把本机对应的网卡驱动直接编译进了内核。作者使用的是vmware Workstation虚拟机,所以,所需的网上驱动是pcnet32的,其它的均按需要选择。选择完成后需要保存至当前目录下.config文件中。
# make  SUBDIR=arch/
# cp arch/x86/boot/bzImage  /mnt/boot
# make menuconfig
三、编译busybox
# cd /usr/src
# tar  -jxvf  busybox-1.16.1.tar.bz2
# cd  busybox-1.16.1
# make menuconfig
说明:
1、此处需要选择 Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,而完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可;这里采用后一种办法。
2、修改安装位置为/mnt/root;方法为:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值为/mnt/sysroot。
# make  install
安装后的文件均位于/mnt/sysroot目录中;但为了创建initrd,并实现让其启动以后将真正的文件系统切换至目标系统分区上的rootfs,您还需要复制一份刚安装在/mnt/sysroot下的busybox至另一个目录,以实现与真正的根文件系统分开制作。我们这里选择使用/mnt/temp目录;
# mkdir -pv /mnt/temp
# cp -r /mnt/sysroot/*  /mnt/temp
四、制作initrd
# cd  /mnt/temp
1、建立rootfs:
# mkdir -pv  proc  sys  etc/init.d  tmp  dev  mnt/sysroot
2、创建两个必要的设备文件:
# mknod  dev/console  c  5  1
# mknod  dev/null  c  1  3
3、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现它:
# rm  linuxrc
# vim  init
添加如下内容:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
mount -t ext3 /dev/hda2  /mnt/sysroot
exec  switch_root  /mnt/sysroot  /init
给此脚本执行权限:
chmod  +x  init
4、制作initrd
# find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 -n > /mnt/boot/initrd.gz
五、建立真正的根文件系统
# cd  /mnt/sysroot
1、建立rootfs:
# mkdir -pv  proc  sys  etc/init.d  tmp  dev  boot  var/log lib
2、创建两个必要的设备文件:
# mknod  dev/console  c  5  1
# mknod  dev/null  c  1  3
3、建立系统初始化脚本文件
# vim  etc/init.d/rcS
添加如下内容:
 
#!/bin/sh
echo -e "            Welcome to  \033[31mToyLinux\033[0m\n                "
echo -e "Mounting the filesystem .................[  \033[32mOK\033[0m  ]"
mount -t proc proc /proc
mount -t sysfs  sysfs  /sys
echo -e "Creating the files of device ............[  \033[32mOK\033[0m  ]"
mdev -s
echo -e "Mounting the filesystem .................[  \033[32mOK\033[0m  ]"
mount -a
echo -e "Remounting the root filesystem ..........[  \033[32mOK\033[0m  ]"
mount  -o  remount,rw  /
echo -e "Starting the log daemon .................[  \033[32mOK\033[0m  ]"
syslogd
klogd
echo -e "Configuring loopback interface ..........[  \033[32mOK\033[0m  ]"
ifconfig  lo  127.0.0.1/24
# END
而后让此脚本具有执行权限:
chmod +x  etc/init.d/rcS
4、配置init及其所需要inittab文件
# cd  /mnt/sysroot
# mv  linuxrc  init
# vim  etc/inittab
添加如下内容:
::sysinit:/etc/init.d/rcS
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、为系统准备一个“文件系统表”配置文件/etc/fstab
# vim  etc/fstab
添加如下内容:
/dev/hda2               /                       ext3    defaults        1 1
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/hda1               /boot                   ext3    defaults        0 0
6、由于在rcS文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送至/var/log/messages文件;
# vim  etc/syslog.conf
添加如下一行:
*.info    /var/log/messages
六、好了,至此一个简易的基于内存运行的小系统已经构建出来了,我们接下来为此系统创建所需的引导程序
# grub-install  --root-directory=/mnt  /dev/hda
说明:此处的/dev/hda为目标系统所在的那块新磁盘;
接下来为grub建立配置文件:
# vim  /mnt/boot/grub/grub.conf
添加类似如下内容:
default  0
timeout  3
color light-green/black light-magenta/black
title ToyLinux (2.6.34.1)
 root (hd0,0)
 kernel /bzImage ro root=/dev/hda2 quiet
 initrd /initrd.gz

接下来将此块硬盘接入一个新的主机(这里使用的是虚拟机),启动一下并测试使用。
七、为新构建的ToyLinux启用虚拟控制台
这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置。我们这里采用通过宿主机的方式(重新启动宿主机):
# cd /mnt/sysroot
将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rcS
tty1::askfirst:/bin/sh
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
tty5::askfirst:/bin/sh
tty6::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
好了,接下来就可以测试验正六个虚拟控制台的使用了。
八、尽管上述第七步已经实现了虚拟控制台,但其仍是直接进入系统,且系统没有用户帐号等安全设施,这将不利于系统的安全性。因此,接下来的这步实现为系统添加用户帐号(这里仍然基于宿主机实现)。
1、为目标主机建立passwd帐号文件
# cd /mnt/sysroot
# vim etc/passwd
添加如下内容:
root:x:0:0::/root:/bin/sh
接下来为root用户建立“家”目录:
# mkdir  root
2、为目标主机建立group帐号文件
# vim  etc/group
添加如下内容:
root:x:0:
3、为目标主机建立shadow影子口令文件,这里采用直接复制宿主机的shadow文件中关于root口令行的行来实现
# grep  "^root"  /etc/shadow  > etc/shadow
注:等目标主机启动时,root用户的口令也是宿主机的root用户的口令。
4、将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty 38400 tty1
::respawn:/sbin/getty 38400 tty2
::respawn:/sbin/getty 38400 tty3
::respawn:/sbin/getty 38400 tty4
::respawn:/sbin/getty 38400 tty5
::respawn:/sbin/getty 38400 tty6
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

好了,接下来就可以重新启动目标主机进行验正了。
九、在系统登录时提供banner信息
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
# vi  /etc/issue
添加如下内容:
Welcome to ToyLinux(http://marion.cublog.cn)...
Kernel \r

注:这里的内容可以根据你的需要进行修改。
十、在系统启动时为系统提供主机名称:
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
1、创建保存主机名称的配置文件
# mkdir /etc/sysconfig
# vi  /etc/sysconfig/network
添加如下内容:
HOSTNAME=marion.example.com
2、编辑系统初始化脚本,实现开机过程中设定主机名称
# vi /etc/init.d/rcS
在文件尾部添加如下行:
HOSTNAME=
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z ${HOSTNAME} ] && HOSTNAME="localhost"
[ -x /bin/hostname ] && /bin/hostname  ${HOSTNAME}
unset HOSTNAME
十一、移植宿主机的bash至目标主机,以实现在目标主机上使用bash
1、在宿主机上查看bash所依赖的库文件件,并将这些库文件复制到目标系统:
# cd  /mnt/sysroot
# ldd /bin/bash  (其显示可能类似如下所示:)
 linux-gate.so.1 =>  (0x003c0000)
 libtermcap.so.2 => /lib/libtermcap.so.2 (0x00aa6000)
 libdl.so.2 => /lib/libdl.so.2 (0x00604000)
 libc.so.6 => /lib/libc.so.6 (0x008c8000)
 /lib/ld-linux.so.2 (0x00bf8000)
2、此时,我们需要把除了第一行显示的以外的余下的所有库文件复制到目标主机的lib目录中:
# cp  /lib/libtermcap.so.2  lib/
# cp  /lib/libdl.so.2  lib/
# cp  /lib/libc.so.6  lib/
# cp  /lib/ld-linux.so.2  lib/
3、而后再把bash程序复制到目标主机的bin目录中即可:
# cp /bin/bash  bin/
十二、设置root用户的默认shell为/bin/bash,并为其定义常用环境变量(本过程在目标主机上直接实现)
1、新建/etc/shells文件,标明当前系统所用可用shell类型:
# vi /etc/shells
添加如下内容:
/bin/sh
/bin/bash
2、编辑/etc/passwd,设置root用户的默认shell为/bin/bash
3、编辑/root/.bash_profile,定义PATH, PS1等环境变量
# vim  /root/.bash_profile
添加如下内容:
PS1='[\u@\h \W]\$'
HISTSIZE=100
PATH=$PATH:/$HOME/bin
export PS1 HISTSIZE PATH
十三、定义名称解析方式
完成上述第十二步以后,用户的shell提示符中的用户名很可能显示为:”I have no name!“,这个主要是没有配置名称解析服务造成的。本步骤则来尝试解决此问题,并尝试实现为主机名称解析定义其解析方式。
提示:本步骤需要在宿主机上实现
1、为名称解析服务复制必要的库文件:
# cd /mnt/sysroot
# cp /lib/libnss_files*  lib/
# cp /lib/libnss_dns*  lib/
2、为目标主机建立名称解析文件nsswitch.conf
# vim etc/nsswitch.conf
添加如下内容:
passwd:  files
group:  files
shadow:  files
hosts:  files dns
3、为主机名称解析建立etc/hosts文件,可根据需要添加其内容
# vim  etc/hosts
添加如下内容(如果本机有IP地址,也可以在此配置):
127.0.0.1  localhost
十四、为目标主机提供一个web服务器
嵌入式系统上可用的轻量级web服务器有如Boa, thttpd, lighttpd, shttpd等。我们这里选用thttpd,且只提供简单的web服务。
1、在宿主机上编译thttpd
# tar zxvf thttpd-2.25b.tar.gz
# cd  thttpd-2.25b
# ./configure
# make
2、复制编译好的thttpd至目标主机
# mkdir -pv /mnt/sysroot/usr/local/sbin
# cp -p thttpd  /mnt/sysroot/usr/local/sbin/
3、复制thttpd依赖的库文件至目标主机
# ldd thttpd
 linux-gate.so.1 =>  (0x00e75000)
 libcrypt.so.1 => /lib/libcrypt.so.1 (0x04f3a000)
 libc.so.6 => /lib/libc.so.6 (0x00931000)
 /lib/ld-linux.so.2 (0x0090e000)
请确保以上所依赖的库文件均复制到了/mnt/sysroot/lib目录中。
4、为目标主机上运行thttpd进程建立一个有效用户帐号(此用户不需要“家”目录)
# echo "www:x:1000:1000:www::/bin/bash" >> /mnt/sysroot/etc/passwd
# echo "www:x:1000:" >> /mnt/sysroot/etc/group
5、接下来启动目标主机系统,登录后创建网站目录,并创建一个测试页面
# mkdir /var/www/html
# echo '<h1>A test page.</h1>' > /var/www/html/index.html
而后启动thttpd进程:
# /usr/local/sbin/thttpd  -u www -dd /var/www/html -l /var/log/thttpd.log &
接下来就可以进行测试访问了。请确保此时目标主机有合适的IP地址。

转载于:https://blog.51cto.com/shyzzu/364770

制作ttylinux实例相关推荐

  1. 用python如何制作表格步骤_Python中用xlwt制作表格实例讲解

    在Python中,我们也可以用xlwt来制作excel表格,是不是很神奇,接下来一起学习吧. 举例: ```python import xlwt wb = xlwt.Workbook(encoding ...

  2. FLASH游戏制作精选实例教程

    游戏是Flash制作中很重要的一部分,主要应用的是flash内嵌的action编程脚本.近期国内涌现出了很多优秀的FLASH游戏,譬如小小的<过关斩将II>,JQ的<狙击手I代> ...

  3. python进度条设计函数_Python进度条的制作代码实例

    这篇文章主要介绍了Python进度条的制作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import sys,time #导入模块 for ...

  4. python制作进度条显示_Python进度条的制作代码实例

    这篇文章主要介绍了Python进度条的制作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import sys,time #导入模块 for ...

  5. foxtable制作管理系统实例_某河道治理工程实例

    东月河治理工程实例 河道污染情况: 1.雨污混排,每到雨天,雨水混入污水管网,一起流入污水站,当超出污水处理站的处理能力时,污水处理站来不及处理,全排入河中,造成河水污染. 东月河上游小溪污水应急排放 ...

  6. python利用什么来写模块-Python模块的制作方法实例分析

    本文实例讲述了Python模块的制作方法.分享给大家供大家参考,具体如下: 1 目的 利用setup.py将框架安装到python环境中,作为第三方模块来调用, 2 第一步:完成setup.py的编写 ...

  7. 用c#语言做课程表系统代码,winform用datagridview制作课程表实例

    本文实例讲述了winform用datagridview制作课程表的方法.分享给大家供大家参考.具体分析如下: 课程表的最终效果如下图所示: 具体方法如下: 1.首先定义一个datatable,并添加列 ...

  8. Altium Designer PCB制作入门实例

    概要: 本章旨在说明如何生成电路原理图.把设计信息更新到PCB文件中以及在PCB中布线和生成器件输出文件.并且介绍了工程和集成库的概念以及提供了3D PCB开发环境的简要说明. 欢迎使用Altium ...

  9. WPF一个完整的GIF制作工具实例(Part3:生成GIF)

    这里生成GIF文件用的是AnimatedGifEncoder.LZWEncoder.NeuQuant,网上可以找到源码,由于该实例可对每一帧单独修改延时,所以修改了AnimatedGifEncoder ...

最新文章

  1. linux下Redis以及phpredis扩展安装
  2. Android 顶部切换实现(二)
  3. 用.NetCore 编译国产老牌PHP论坛DiscuzX ,世界上最好的语言从此属于.Net 的一员
  4. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)
  5. 监督学习 | ID3 C4.5 决策树原理
  6. c语言递归算法实验报告,递归算法实验报告.docx
  7. .NET (C#)ASP.NET 应用程序与页面生命周期
  8. LC415字符串相加
  9. easyexcel excel自定义列导出 格式导出
  10. Ms08067 de 阿青姐姐告诉你为什么要学Python内网开发,不看是你的损失!
  11. 多元函数偏导数连续、存在与可微的关系
  12. PDF怎么转换成图片?这两种转换方法快速转换
  13. 14个美容秘诀 网上疯传却最毁容
  14. iOS 防止截屏、录屏技术
  15. 未来五年移动互联网有哪些热门技术?(转)
  16. 异步爬虫(高效爬虫)
  17. 三皇时期的远古帝王---地皇
  18. 切比雪夫不等式例题讲解_2019高考数学大题押题(名师视频讲解,高考最后的提分机会)...
  19. 浅谈 MySQL 连表查询
  20. 【兴趣书签】类似《看不见的客人》的惊悚电影推荐

热门文章

  1. 2014策马奔腾(2),日新月异
  2. vue3 使用particles粒子效果插件,修改粒子画布宽高
  3. PDF生成、合并及压缩优化(Java)
  4. 正则表达式验证输入框内容
  5. 用10086客服热线理解Java高级多线程之线程池
  6. swiper做宣传画册——swiper动画
  7. Python中with语句的作用
  8. JavaScript 日期比较——如何在 JS 中比较日期
  9. 简单的动态网页(表格)——将SQL Server的数据读入表格中
  10. linux端口进程号pid,Linux根据端口号查看进程PID