LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3274|回复: 3

无盘linux的制作方法!

[复制链接]
发表于 2006-9-16 12:08:08 | 显示全部楼层 |阅读模式
看了一篇制作babylinux文章后自己做的一个无盘linux`由于本人刚接触这方面,希望大家不要笑话我,同时如果有缺点也希望大家帮忙改正.(由于需要写的东西很多`我就抄了一些希望作者能不收我版权费用)
需要的工具:windows2000主机一台 配置下面在讲
           linux机器一台 (也可以把2000和linux 装在一台机器上)
           无盘工作站.即一台没硬盘的机器 注意:网卡上需要有启动芯片
           
一.编译内核
   1. 进入linux源代码目录:
      #cd /usr/src/linux-2.4.20
   2. 清理源代码树,检测内核包里面的文件是否正确:
      #make mrproper
   3. 运行配置程序:
      #make xconfig
      说明:最关键要选择fs(ext3),initrd,cpu,网卡型号的支持,或直接将准备好的config文件拷贝到/usr/src/linux-2.4.20/arch/i386目录下,改名为defconfig(注意先将原有的defconfig文件备份,切记).
   4. 开始编译,检查相关独立性:
      #make dep
   5. 清除内存和编译过程中生成的.o文件:
      #make clean
   6. 生成bzImage内核文件,在./arch/i386/boot下:
      #make bzImage
二.Busybox文件系统的生成
   1. Busybox简介
      busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.  
   2. 配置busybox
      busybox的配置程序和linux内核菜单配置方式简直一模一样.
      解压:  #tar xvfz /Nodiskboot/busybox-1.00.tar.gz
      #cd /Nodiskboot/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内核不能使他正常工作.

      Installation Options
      Don't use /usr
      这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.

      其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了.

      配置好后退出并保存.

   3. 编译并安装busybox
      #make
      #make install
      这样,在busybox目录下将生成一个_install的文件夹,里面会有四项bin,sbin和linuxrc,其中bin,sbin都是目录,busybox文件放在bin下面,然后其他的所有文件都是符号连接,连接到busybox上。
      上述步骤生成了initrd简单的目录架构,我们还有手工添加若干。
   4. 制作根文件系统
      一个根文件系统必须包含支持一个完整的Linux系统所需的最基本的全部文件:
* 最基本的文件结构
* /dev, /proc, /bin, /etc, /lib, /usr, /tmp 等目录的最小集合
* sh, ls, cp, mv等基本工具程序
* rc, inittab, fstab等基本配置文件
* /dev/hd*, /dev/tty*, /dev/fd0等基本设备
* libc-x.x.x.so等程序运行所需的各种动态库文件
      1).创建目录rootfs
        mkdir  /Nodiskboot/rootfs
        cd /Nodiskboot/rootfs
      2).基本目录结构
        #mkdir etc usr var tmp proc home root dev etc/init.d mnt lib
        #chmod 755 etc usr var tmp home root dev etc/init.d mnt lib
        #chmod 555 proc
        介绍一下各种目录的作用:
* /dev -- 设备文件,实现系统I/O 所需
* /proc -- 使用proc文件系统所需
* /etc -- 包含系统配置文件
* /sbin -- 包含重要的系统程序
* /bin -- 包含大部分系统程序
* /lib -- 包含提供动态链接所需的共享库文件
* /mnt -- 挂载其他设备:磁盘、光盘、usb设备等的挂载点
* /usr -- 额外的程序、函数库文件以及配置文件
      3).拷贝busybox
        #cp -R /Nodiskboot/busybox-1.00/_install/* /Nodiskboot/rootfs/
      4).建立dev设备文件名
        #cd /Nodiskboot/rootfs/dev

        #mknod -m 666 tty c 5 0
        #mknod -m 666 console c 5 1
        #mknod -m 666 tty0 c 4 0
        #mknod -m 600 fd0 b 2 0
        #mknod -m 600 ram0 b 1 0
        #mknod -m 600 null c 1 3
        mknod是在dev下成生mknod节点设备文件。加载磁盘的命令是:
        #mknod -m 660 hda b 3 1
        其中3是第一条主线上,1是主设备上第一个分区(0~63),如果是第二条线则是22,如果是从设备则是(64~127).
        但是手工方法建立太麻烦了,通常直接从/dev下把需要的设备文件拷贝过来.
这些设备文件是特殊文件,在拷贝时一定要加上-R参数才能拷贝.
        #cp -R /dev/console ./
        #cp -R /dev/null ./
        #cp -R /dev/zero ./
        ...(具体项目参考babylinux制作)
      5).建立etc目录下的配置文件
        写入三个文件inittab,fstab,init.d/rc.sysinit,文件内容如下
        inittab:
        ::sysinit:/etc/init.d/rcS
        ::askfirst:/bin/sh
        
        fstab:
        proc /proc proc defaults 0 0

        init.d/rcS:
        #!/bin/sh
        mount –a

        
      6).在lib下面cp相应的库文件
        用ldd命令查看文件运行所用到的库,由于未用到动态链接库,而是直接链接到linuxrc文件上,所以lib下面是空的.
      7).存储节点的初始化是另一个需要注意的问题。在前面曾提到,内核引导的最后一项工作是创建并执行init进程,随后init进程将创建其他进程,运行一些系统所需的重要程序。由于在通常的Linux系统中的init程序的使用和配置与System V系统中的init程序类似,而在嵌入式系统等特殊应用场合并不需要实现多个用户(multiuser)的使用,也不需要用户登陆终端,所以System V系统中的init程序对我们的要求而言功能过于复杂。在此,我们采用使用比较广泛的工具busybox中的init程序。busybox包含常用的基本工具程序如:sh,ls,mount,init,cp等,而大小只有几百K(视所选择工具程序的数目来决定大小)。实际上,编译busybox后只有一个busybox程序,其余的所有工具程序都是busybox程序的符号链接,busybox通过辨别不同的程序名称,跳转执行不同的功能。
busybox中的init程序可以完成初始化的基本功能而且去掉了System V系统init程序的多余功能,init程序执行的顺序如下:
   <1>. 创建init的信号处理
   <2>. 初始化控制台
   <3>. 分析inittab文件,/etc/inittab
   <4>. 执行系统初始化脚本,/etc/init.d/rcS
   <5>. 执行所有inittab中类型为wait的程序
   <6>. 执行所有inittab中类型为once的程序
  完成以上步骤后,init循环执行所有inittab中类型为respawn和askfirst的程序。文件inittab中的每一行配置遵照格式如下:
  id:runlevel:action:process
  虽然这个格式与传统的System V init 类似,但是id 域的含义不同。id 通常是用来指定控制启动进程运行的tty。如果id域为空则代表这个进程的运行不需要与shell交互。在busybox中,runlevel域 可以完全忽略。process 指明执行程序以及所带参数选项。 action           域可以选择一下八个类型:
  sysinit提供给init初始化脚本所在的路径;
  respawn当进程终止后将其重新启动;
  askfirst与respawn类似,不同之处是在终端提示“Please press Enter to activate this console.”;
  wait代表init等待这个程序执行完后才继续执行;
  once表示执行一次而且不需要等待完成;
  ctrlaltdel表示当按下Ctrl-Alt-Delete时执行;
  shutdown表示程序在关机时执行;
  restart表示程序在重启时执行,通常是init本身。
  在存储节点上运行的程序是:挂载硬盘(mount),扫描硬盘生成多媒体文件报告的程序,流媒体服务器(vls),与管理节点通信程序(agent),监视网络带宽使用状况的程序()。其中,mount的action域应为wait,因为首先要将存有多媒体文件的硬盘挂载才能对其执行扫描;vls的action域应为respawn,vls运行出现严重错误后,重新启动vls,并向管理节点报告,写入log。
三. 制作ramdisk映象文件
    根文件系统所有东西都放在/Nodiskboot/rootfs下,我们将利用ramdisk把这些内容做成ramdisk映象文件并压缩它.
    # dd if=/dev/zero of=/dev/ram0
      dd: 正在写入 ‘/dev/ram1’: 设备上没有空间
      读入了 8193+0 个块
      输出了 8192+0 个块

      zero是一个特殊的设备,表示全部为0的字符块.上面这条命令的意思是把系统的第一个ramdisk用全部为0的数据填充,因为  ramdisk默认大小为4M,因此当读满8192个块(每块512字节)后,显示'设备上没空间'.这很正常,/dev/ram0已经被填充满了.
如果指定块的大小:

    # dd if=/dev/zero of=/dev/ram0 bs=1M count=4
      读入了 4+0 个块
      输出了 4+0 个块

      不会有错误提示,这里演示了dd的一般用法,接下来还要频繁用到dd命令.

      在/dev下有很多ramdisk设备ram0,ram1,ram2,ram3.... 一般用第一个就可以了.
      填充后,ram1就有可空间,可以在这个空间上创见一个文件系统:
      # mkfs.ext2 -m0 /dev/ram0
      
      将ram0挂装到文件系统中:
      先建立一个挂装点:
      #mkdir /mnt/ram0
      挂上ram0:
      #mount /dev/ram0 /mnt/ram0
      将先前做好的Nodiskboot根文件系统拷贝到ram0上.
      #cp -R /Nodiskboot/rootfs/* /mnt/ram0

      做完以上几步,你应就白了ramdisk设备的含义,他是和hda1,hdb1,一样的块设备,用mount挂到文件系统下后就可以访问,往里放东西,但是所有的东西在内存上.关机将丢失所有东西.

      拷贝好Nodiskboot根文件系统后卸载ram0:
      #umount /dev/ram0
      如果出现"device is busy",说明有别的进程在使用/dev/ram0上的文件,解决办法如下:
      #fuser -v /mnt/ram0
      #umount /dev/ram0
      这时,虽然不能通过/mnt/ram这个挂装点访问ram0中的内容了,但是他却切切实实得在内存中存在.

      再用dd把这个ram1以映象方式取出来:
      # dd if=/dev/ram0 of=/Nodiskboot/ramdisk.img
      
      验证一下取出来的内容:
      # file ramdisk.img
      ramdisk.img: Linux rev 1.0 ext2 filesystem data
      他是一个ext2 文件系统,类似一个ISO光盘映象文件.
      因次,我们可以用loop设备来把他重新挂装到文件系统里:
      # mount -o loop ramdisk.img /mnt/ram0/
      为了方便,我仍旧把他挂在/mnt/ram0下,因此,在先前一定要把/dev/ram0 umount掉

      查看/mnt/ram0下的内容,他应该和/Nodiskboot/rootfs下的一模一样,否则就是出错了:
      # ls /mnt/ram0
        etc usr var tmp proc home root dev etc/init.d mnt lib

      这样,我们就得到了一个ramdisk根文件系统映象ramdisk.img
      把他umount掉:
      #umount /mnt/ram0
四 配置2000或linux主机
    做主机的话需要安装有dhcp 和 tftp 这两个服务
     在2000的主机上配置 dhcp 新建作用域主机的网络段要和分配出去的地址网段相同
       在"作用域选项"中选"启动服务器启动名"填入主机的IP
           在"服务器选项"中填入"pxelinux.0"
     设置好tftp 的下载目录.
       在下载目录中还需要一些东西可以把具体东西上传上来大家可以下载
      我的tftp下载目录下的文件:  
     ramdisk.img   pxelinux.0  vmlinuz  和一个文件夹 pxelinux.cfg
    (pxelinux.o这个文件可以下的到具体使用方法可以参考)
      linux的下配置``你们自己来吧``我也在学习.
      我用2000做主机我是成功了
    需要我做好的启动项目的请留下邮箱
五 启动无盘客户端
   很快几秒后就能看到linux 的经典黑屏了 ```嘿嘿`
六  问题和BUG
   我做成了这个系统只是有些问题我还是没办法解决
  1.最大的问题是不可写
     其原因是因为在无盘工作站上系统只在内存中运行
       后来自己搞了一下在 rcS 中加了一行 mount -o remount ,rw /dev/ram0
       在fstab 中加了一行 /dev/ram0 /  exit2 rw 0 0
      上面两句是在标准的linux主机上加的不是在无盘工作站上 加的
    后可以用命令创建文件和删除文件但是修改不行.
  2 我想在无盘工作站上运行 samba 图形界面 鼠标 USB设备 不知道要怎么修改希望家    能帮个忙一起搞下``这样可以省下买硬盘的钱`

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2006-9-20 15:20:55 | 显示全部楼层
请使用code/php来格式化帖子.培养读者对帖子的阅读兴趣.
回复 支持 反对

使用道具 举报

发表于 2006-9-20 15:21:23 | 显示全部楼层
请使用code/php来格式化帖子.培养读者对帖子的阅读兴趣.
回复 支持 反对

使用道具 举报

发表于 2006-9-26 10:06:37 | 显示全部楼层
楼主好。方便留下联系方式吗?
你提出的问题 咱们可以研究研究的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表