CSDN博客

img RobinsonNie

构建CD引导的小型linux(kernel + RAMDISK).--cdbooot.note

发表于2008/9/28 8:05:00  1196人阅读

+-----------------------------------------------------------------------------+
|                         第一部分 文档说明                                    |
+-----------------------------------------------------------------------------+
1 作用
##########
   构建CD引导的小型linux(kernel + RAMDISK).

2 版权
######
  版权: 聂大鹏(dozec)

3.2 作者
========
3.2.1 作者1
-----------
   姓名: 聂大鹏
   email: dozec@mail.csdn.net

4 产生时间
##########
  时间: 2007-2-9

5 版本
######
  版本: 0.1 版

6 修订过程
##########
6.1 第0.1版
===========


+-----------------------------------------------------------------------------+
|                         第二部分 文档正文                                    |
+-----------------------------------------------------------------------------+
1 实验环境
##########
工作站: RHEL4
        Linux version 2.6.14.7
        gcc version 3.4.6 20060404 (Red Hat 3.4.6-3))
        CPU: Pentium 1.7G
        Memory: 256MB
        装LFS根分区: /dev/hdd1 (hdd是一块4.3G硬盘)
           swap分区: /dev/hdd2
        /dev/hdd1               1         427     3429846   83  Linux
        /dev/hdd2             428         524      779152+  82  Linux swap

2 创建CDboot系统所用的内核
############################
2.1 内核配置说明
================
使用的是linux.2.6.14.7内核,配置重点说明:

Device Drivers  --->
        Block devices  --->
             <*> Loopback device support
             <*>   Cryptoloop Support
             以上2项是以VMWare5.0为基础虚拟的硬件来配置内核使支持loop设备

             <*> RAM disk support
                (16)  Default number of RAM disks
                (8196) Default RAM disk size (kbytes)
             [*]   Initial RAM disk (initrd) support
             以上2项使内核支持根文件系统位于RAMdisk之上.

        SCSI device support  --->
              SCSI low-level drivers  --->
                         <*> BusLogic SCSI support
                         以上项是支持VMWare5.0使用了SCSI硬件
        Network device support  --->
                Ethernet (10 or 100Mbit)  --->
                         <*>   AMD PCnet32 PCI support
                         以上项是支持VMware5.0使用网卡
File systems  --->
        <*> Second extended fs support
        <*> Ext3 journalling file system support

        CD-ROM/DVD Filesystems  --->
                  <*> ISO 9660 CDROM file system support  

        Pseudo filesystems  --->   
                 [*] /dev file system support
                 [*]   Automatically mount at boot
                 支持引导时便挂载devfs至/dev上. 为了在make menuconfig时出现这2个选项
                 需要先修改fs/Kconfig文件, 添加如下项:
                 menu "Pseudo filesystems"  <-- 找到它

                 config DEVFS_FS
                        bool "/dev file system support"
                        default y

                 config  DEVFS_MOUNT
                         bool "Automatically mount at boot"
                         default y
                         depends on DEVFS_FS


另外: i386的内核没有CMDLINE内核命令行参数这一选项, 推断应该是必须由bootloader
      向内核传送命令行参数.在光盘引导的linux系统当中,由于我们采用的是isolinux.bin
      故应该有isolinux.bin根isolinux.cfg的配置向kernel传送命令行参数.



3 根文件系统创建(RAMdisk)
#########################
3.1
===
[nie@hellokitty rootfs]$ mkdir my_rootfs initrd_mnt
my_rootfs为根文件系统
initrd_mnt用于最后生成RAMdisk时使用

3.2
===
[nie@hellokitty rootfs]$ cd my_rootfs/
[nie@localhost my_rootfs]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr
[nie@localhost my_rootfs]#mkdir usr/bin usr/lib usr/sbin
[nie@localhost my_rootfs]#mkdir mnt/cdrom mnt/lfs
mnt/cdrom用于挂载光盘, 从而读取光盘上的软件包
mnt/lfs用于挂载目标系统的根文件系统.

[nie@localhost my_rootfs]#touch linuxrc
权限参照你的linux工作站即可,基础目录介绍参见本文参考资料(未尾)。


3.3 创建linuxrc文件
===================
3.3.1 创建linuxrc,加入如下内容:
-------------------------------
[arm@localhost my_rootfs]#vi linuxrc
#!/bin/sh
#mount some file system
echo "------------toyLinux: mount /dev/shm as tmpfs"
/bin/mount -n -t tmpfs tmpfs /dev/shm

#挂载/proc为proc文件系统
echo "------------toyLinux: /proc as proc"
/bin/mount -n -t proc none /proc

#挂载/sys为sysfs文件系统
echo "------------toyLinux: /sys as sysfs"
/bin/mount -n -t sysfs none /sys

exec /sbin/init

3.3.2 修改权限
--------------
[arm@localhost my_rootfs]#chmod 775 linuxrc
[arm@localhost my_rootfs]#ls linuxrc al
rwxrwxrx 1 root root 533 Jun 4 11:19 linuxrc



3.4 安装busybox到my_rootfs当中
==============================
3.4.1
-----
# export TROOTFS=/home/nie/dev_home/graduation_paper/cdboot/rootfs/my_rootfs
# make PREFIX=$TROOTFS all install
参见<linux系统移植>.


3.4.2 增加lfs用户
-----------------
Username: lfs
Password: lfs

[/etc/passwd]
lfs:x:500:500::/home/lfs:/bin/sh

[/etc/shadow]
lfs:25h8wkHd7ewyI:13599:0:99999:7:::

[/etc/group]
lfs:x:502:

这样就省去了chapter05/addinguser.xml中调用adduser所不支持的命令参数的麻烦.


3.4.3
-----
另外, 在整个nALFS运行时,经常会有命令不支持参数的情况发生.(busybox)
这时可以从已经安装好的LFS系统当中拷取相应的命令到根文件系统当中来替换
busybox自身的命令.
例如:
tar  bzip2 bunzip2 patch install


3.4.4 编译shadow出现的问题
-------------------------
[nie@hellokitty sysapp]$ tar -jxvf shadow-4.0.9.tar.bz2
[nie@hellokitty sysapp]$ cd shadow-4.0.9
[nie@hellokitty shadow-4.0.9]$ ./configure --prefix=/home/nie/dev_home/graduation_paper/cdboot/rootfs/my_rootfs-withoutX --libdir=/lib --enable-shared
[nie@hellokitty shadow-4.0.9]$ make && make install
[nie@hellokitty shadow-4.0.9]$ cp -v etc/{limits,login.access} /home/nie/dev_home/graduation_paper/cdboot/rootfs/my_rootfs-withoutX/etc

ldd 安装的程序时, 会发现其动态库依赖的路径为/home/nie/dev_home/graduation_paper/cdboot/rootfs/...
 而非/lib.


3.5 相关配置文件的创建
======================
参见<linux系统移植>.
如下补充:
# vi etc/mtab  (支持mount命令)
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0

# vi etc/inittab
::sysinit:/etc/init.d/rcS         # 启动脚本,优先执行,内容在下(设置IP)
::once:-/bin/sh                   # 从askfirst(需要按回车确认)->once(只运行一次)
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

# mkdir etc/init.d
# vi etc/init.d/rcS
#!/bin/sh         [必须加这行, 因为是以脚本形式执行,而下面的profile则是由sh解释]
echo "------------toyLinux: Set ip to 172.16.109.2 and up"
ifconfig eth0 172.16.109.2 up
echo "------------toyLinux: Create device file and symbolic link"
mknod /dev/cdrom b 22 0
mknod /dev/hda   b 3  0
mknod /dev/hda1  b 3  1
mknod /dev/hda2  b 3  2
mknod /dev/hda3  b 3  3
mknod /dev/hda4  b 3  4
ln -s adduser /bin/useradd
ln -s addgroup /bin/groupadd
mkdir -p /root/.nALFS                 # nALFS -i 会自动检查该目录存在与否
                                      # 不存在会提示. 不需要它提示.




# vi profile  (Shell的全部配置文件)
# set search library path
echo "------------toyLinux: Set search library path int /etc/profile"
LD_LIBRARY_PATH=/lib:/usr/lib:/usr/X11R6/lib:/usr/lib/nALFS
export LD_LIBRARY_PATH
# Set user path
echo "------------toyLinux: Set user path in /etc/profile"
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin
export PATH
# Set PKG_CONFIG_PATH
echo "------------toyLinux: Set PKG_CONFIG_PATH"
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/X11R6/lib/pkgconfig
export PKG_CONFIG_PATH
# Set HOME variable
HOME=/root
export HOME
# Change sh
rm -rf /bin/sh
ln -s bash /bin/sh
# Set PS1
export PS1='[/u@ /W]/$ '
# Run /bin/bash  [keep /bin/sh --> busybox]
/bin/bash
# Set alias
alias ls='ls --color'



# mkdir var/bin                      这里用来存放我们的GUI app

总结: init首先会执行/etc/init.d/rcS(Set ip)
      然后启动Shell, 执行Shell的全部配置文件/etc/profile
      (设置PATH/LD_LIBRARY_PATH)


3.6 生成RAMdisk
===============
[nie@hellokitty rootfs]$ dd if=/dev/zero of=initrd bs=1024k count=8
[root@hellokitty rootfs]# /sbin/mkfs.ext2 initrd -F   (root permission)
[root@hellokitty rootfs]# mount -o loop initrd initrd_mnt/
[root@hellokitty rootfs]# rm -rf initrd_mnt/*
[root@hellokitty rootfs]# cp -var my_rootfs/* initrd_mnt/
[root@hellokitty rootfs]# umount initrd_mnt/

[root@hellokitty rootfs]# /sbin/e2fsck initrd
[root@hellokitty rootfs]# gzip -c9 initrd > initrd.gz

initrd.gz就是最后使用的RAMdisk.


4 制作cdboot linux
###################
4.1 总体思路
============
      主要是通过isolinux.bin来完成光盘引导我们的内核及根文件系统
      再通过mkisofs生成最后的iso镜像.


4.2
===
创建myiso目录
[nie@hellokitty experiment_dir]$ mkdir myiso
[nie@hellokitty experiment_dir]$ mkdir myiso/isolinux        存放启动所需要文件
[nie@hellokitty experiment_dir]$ mkdir myiso/lfs_source      存放LFS所需要的软件包

4.3 从rhel4 光盘中copy出isolinux.bin isolinux.cfg
    到myiso/isolinux/
==================================================
[nie@hellokitty myiso]$ cp /var/ftp/pub/rhel4/isolinux/isolinux.bin isolinux/
[nie@hellokitty myiso]$ cp /var/ftp/pub/rhel4/isolinux/isolinux.cfg isolinux/
[nie@hellokitty myiso]$ cp /var/ftp/pub/rhel4/isolinux/boot.msg isolinux/
[nie@hellokitty myiso]$ cp /var/ftp/pub/rhel4/isolinux/boot.cat isolinux/
[nie@hellokitty myiso]$ cp /var/ftp/pub/rhel4/isolinux/options.msg isolinux/


4.4 修改isolinux.cfg
=====================
修改如下:
default linux
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
label linux
  kernel vmlinuz
  append initrd=initrd.gz load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=8192 rw root=/dev/ram init=/linuxrc

  ramdisk_size要随ramdisk大小一致(也就是上面的dd命令一致)
说明: 按F1/2显示boot.msg与options.msg下的内容.
      直接回车, 将加载vmlinuz内核及initrd.gz根文件系统.

同样的,也可以修改boot.msg options.msg下的内容.


4.5 copy内核及initrd.gz到光盘根目录
===================================
[nie@hellokitty myiso]$ cp ../../../linux-2.6.14.7-/bak/cdboot/bzImage isolinux/
[nie@hellokitty myiso]# cp ../../../linux-2.6.14.7-/bak/cdboot/bzImage isolinux/vmlinuz
vmlinuz是通过zImage/bzImage拷贝改名而得.均是压缩过的内核镜像,并且开头有自解压代码
vmlinux是未压缩的内核镜像



2.3.7. 必须切换到root 才能生成可引导iso镜像
===========================================
[root@hellokitty experiment_dir]# mkisofs -o myiso.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -joliet-long -R myiso

mkisofs默认使用8.3文件名格式.(ISO9660)
-joliet-long指明使用JOLIET文件系统, 从而支持长文件名

-R
Generate  SUSP  and  RR records using the Rock Ridge protocol to further describe the files on
the iso9660 filesystem. --> support symbolic link


3 参考文档
##########

0 0

相关博文

我的热门文章

img
取 消
img