设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 7241|回复: 2

[原创]源代码搭建应用(二)??建立自己的Linux LiveCD系统 [复制链接]

Rank: 6Rank: 6

签到
44
注册时间
2009-1-21
最后登录
2014-4-22
在线时间
95 小时
阅读权限
70
积分
2690
帖子
127
主题
14
精华
0
UID
1131
发表于 2009-3-20 10:20:21 |显示全部楼层
源文地址:http://blog.chinaunix.net/u/13265/showart.php?id=477664

源代码搭建应用(二)??建立自己的Linux LiveCD系统
作者:孙海勇

更新日志
2008年2月12日:本文发布。

前言:
  也许有很多朋友想将自己制作的Linux系统应用到自己的实际工作生活中,但往往因为各种原因不能在你操作的机器上安装你要的系统,所以现在出现了各种不同的LiveCD来解决各种应用方面的需求,可能有朋友对这种LiveCD的制作非常感兴趣,我结合我自己的认识和实际的应用经验总结了一套手工制作LiveCD的方法,希望对想制作LiveCD或者对这方面感兴趣的朋友有所帮助。
  制作LiveCD的方法有很多,我这里只介绍我实际制作LiveCD的方法,与通常制作LiveCD的软件有所不一样,不过效果类似,希望能起到抛砖引玉的效果,如果有什么建议或想法也欢迎一起探讨,共同提高水平。

  更新,文章中难免出现一些错误或者笔误,也有可能加入新内容,因此难免会进行修正或增删一些内容,如果本文被转载可以在www.linuxsir.org的LFS版中或者在本人的Blog中查看最新版本。
  linuxsir:http://www.linuxsir.org/bbs/showthread.php?t=322970
  我的Blog:http://youbest.cublog.cn
  如须转载请注明作者为孙海勇(冲天飞豹),并提供转载出处。
  


LiveCD原理分析
  启动过程
    1)计算机启动光盘上的引导程序,这部分我采用grub来完成,当然还可以使用如lilo,如果是其它非x86架构的机器也可以用其它适合的引导程序。
    2)引导程序装入光盘上的Linux内核,并同时装入一个RAM disk,本文中采用grub的功能来完成,RAM disk使用的是initrd的方式,当然也可以采用其它Linux支持的方式,不过可能启动脚本需要进行一定的修改。
    3)内核启动后转入到initrd中linuxrc,由linuxrc来完成各种初始化的操作。
    4)linuxrc必须是一个可执行文件,这里我们采用的是bash的脚本来完成,本文中的linuxrc主要是完成各种必须的文件加载、设备的识别及内核模块的加载,建立和准备好用户操作根目录环境
    5)linuxrc运行结束后会进入根系统的/sbin/init继续执行,该程序将利用/etc/inittab文件来完成系统的启动过程
    6)启动完成,进入用户操作模式。
  需要注意的地方
    1)RAM disk的大小必须小于Linux中对RAM disk设置的大小,如果超过了必须重新配置内核并重新编译。
    2)RAM disk所使用的文件系统必须是Linux内核内制支持的,在编译内核的时候不能把该文件系统编译成模块。
    3)LiveCD在启动中或者启动后会需要创建或者写入一些文件,所以这部分文件就需要存放在可以写入的文件系统中,这里我采用tmpfs的方式来存放这些需要变动的文件,经过分析本文所制作的LiveCD需要修改的目录包括/etc、/home、/root、/var,对于/etc则将其打包并在系统启动中的适当时机解压缩到一个可以写入的空间中,而对于/home、/root、/var本文采用了动态生成生成的方式,当然这个没有必须的方法,这个需要随具体情况来变化,也都可以采用类似/etc的处理方式。


准备工作:
  请按照LFS手册也可以参考我写的《第二版 手把手教你如何建立自己的Linux系统(LFS速成手册)》创建好一个基本的Linux系统,本文的内容将基于一个标准的LFS-6.3系统来完成全部工作。

编译安装必要的工具:
1、squashfs的内核补丁
  本文创建的系统利用的是squashfs方式压缩文件系统,所以必须让内核支持squashfs
  1)下载squashfs-3.3,并解压缩,在其目录中有linux kernel的补丁,找到你需要的内核补丁,因为LFS-6.3使用的是Linux-2.6.22.5这个版本,因此在内核的源代码目录中使用
     patch -Np1 -i <path>/squashfs-3.3/kernel-patch/linux-2.6.22/squashfs-patch
  2)重新配置内核,添加如下选项
     File systems -> Miscellaneous filesystems -> SquashFS 3.3

  3)重新编译安装内核,使其支持squashfs
2、安装squashfs-tools
  内核支持squashfs后,还需要有专门的工具来创建squasfs文件,该工具包含在squashfs软件包中,进入squashfs-tools
    make
    install -m 755 unsquashfs mksquashfs /usr/bin
现在系统已经可以创建并识别squashfs文件系统了。
3、安装cdrtools-2.01
  安装这个包是为了使用其包含的命令mkisofs,这个是建立光盘镜像的工具。编译该包可以参考BLFS手册中该软件包部分。
    patch -Np1 -i ../cdrtools-2.01-mkisofs_iconv-1.patch
    patch -Np1 -i ../cdrtools-2.01-ascii-2.patch
    make INS_BASE=/usr DEFINSUSR=root DEFINSGRP=root
    make INS_BASE=/usr DEFINSUSR=root DEFINSGRP=root install &&
    install -v -m755 -d /usr/share/doc/cdrtools-2.01 &&
    install -v -m644 README* ABOUT doc/*.ps \
     /usr/share/doc/cdrtools-2.01
  好,到目前为止,系统已经具备了创建LiveCD的必要环境,下面就开始讲解创建一个简单的LiveCD的制作步骤。


准备工作目录:
代码:

mkdir -pv /opt/iso/{boot,modules}cd /opt/iso



编译制作LiveCD专用的内核:
  LiveCD可以通过initrd来加载需要的设备驱动,因此建议将不是开始运行就需要的功能都制作成模块形式,这样可以减少内核的体积,同时也可以增加系统的灵活性。
  内核必须功能(这些功能必须包含在内核本身,不能以模块的形式出现)
    Automatic kernel module loading支持:
      这样可以方便今后加载模块。
    RAM disk support:
      initrd是采用RAM disk的方式使用的,因此内核必须支持该功能
      同时,这里设定RAM disk的大小的时候为了方便今后可能的扩展,如果在使用的机器上内存不是很紧张的话建议调整的大一些,我在这里把起调整为10M大小

    ext2支持:
      因为initrd.img本身是一个ext2的文件系统,所以要想使用initrd就必须让内核能够识别出ext2文件系统。
  内核必须的功能,但可以使用模块的形式出现
    loop支持:
      squashfs需要loop的支持才能正常使用,因此必须包含此功能。
    squashfs支持:
      这里制作LiveCD的方法中,压缩的文件系统采用squashfs,所以内核也必须包含此功能。
  非必须功能:
    如网卡、声卡、磁盘驱动等,这些并不是一定需要的,可以根据你的LiveCD的功能来进行取舍,如你需要制作一个应急修复盘,那么磁盘驱动方面就比较重要了,而声卡什么的则不是必须的了;而如果你是要制作一个桌面的LiveCD,那么声卡什么的则非常必要了。
  编译内核,将内核文件放入/opt/iso/boot目录中,将模块放入/opt/iso/modules中。


制作LiveCD主系统:
  LiveCD主系统用于提供各种软件,整个系统为了减少存放体积,一般使用压缩的文件系统,这里我使用squashfs来制作。
  本文使用LFS-6.3的标准系统来制作LiveCD系统,如果你想制作的系统包含更多功能可能需要增加自己的软件后再制作压缩文件系统。
代码:

cd /mksquashfs bin lib sbin usr SYSTEM




现在在根目录建立好了一个SYSTEM文件,该文件就是一个经过squashfs压缩过的文件系统,将该文件放入“制作基地”中。
代码:

mv /SYSTEM /opt/iso




制作initrd.img:
  initrd.img的主要目的是为了在不同的机器环境下只加载适用于该机器的一些内核模块,如果将所有的内核模块都加入到内核文件本身中,那么内核本身将会变的非常臃肿,且占用需要不必占用的资源,因此一般的LiveCD都将大量的驱动编译为模块形式,在必要的时候才将其加载到内存中,这个时候initrd的作用就比较明显,initrd一般可以用来检测系统的硬件来适当的加载各种驱动模块。
  下面我们就制作一个简单的initrd的实现。
  1)建立initrd
代码:

cd /opt/iso/bootmkdir initrddd if=/dev/zero of=initrd.img bs=1M count=8mkfs.ext2 initrd.imgmount -o loop initrd.img initrd



  2)创建initrd下的目录
代码:

export INITRD=/opt/iso/boot/initrdcd ${INITRD}mkdir bin boot dev etc lib proc sbin sys



  3)确定initrd需要的东西
    initrd其实是一个最小化的Linux系统,但又必须包含一些检查硬件设备的功能。
    1)一个shell,这里我就直接用bash了,如果你觉得大也可以使用其它的shell,比如csh,或者busybox中包含的shell。
       代码:

cp -a /bin/bash ${INITRD}/bin



    2)linux kernel模块组,该模块组应该与引导用的内核相匹配,这里直接使用之前为LiveCD专门编译的内核生成的模块。
       代码:

mv /opt/iso/modules ${INITRD}/lib



    3)Udev,这里我就直接使用udev来进行硬件的检查,并自动加载必要的内核模块了。
       代码:

cp -a /lib/udev ${INITRD}/lib



       代码:

cp -a /lib/firmware ${INITRD}/lib



       代码:

cp -a /dev/{console,null} ${INITRD}/dev



       代码:

cp -a /etc/udev ${INITRD}/etc



    4)modprobe,udev需要使用该命令工具来加载内核。
    5)常用的一些命令。
  4)编写linuxrc文件
    initrd是从linuxrc文件开始运行的(这个是由内核决定的),那么我们所有的工作就从这个文件开始了
    首先是一些特定的文件系统,后面的许多程序需要这些文件系统的支持
代码:

cat > ${INITRD}/linuxrc << "EOF"#!/bin/bashmount -t proc proc /procmount -t sysfs sysfs /sys # 如果你将loop模块化,那么需要加入/sbin/modprobe loop # 建立/dev设备目录,并使用udev来创建各种设备文件mount -n -t tmpfs -o mode=0755 udev /devcp --preserve=all --recursive --remove-destination /lib/udev/devices/* /devchmod 1777 /dev/shmecho "" > /sys/kernel/uevent_helperecho "Starting Udev..."/sbin/udevd --daemonmkdir -p /dev/.udev/queue/sbin/udevtrigger/sbin/udevsettle # 创建用户使用环境# 在/SYSTEM中准备目录结构export SYSTEM=/SYSTEMmkdir -p ${SYSTEM}mount -t tmpfs tmpfs ${SYSTEM}mkdir -p ${SYSTEM}/{system,cdrom,dev,proc,sys,tmp,mnt,initrd,home,root}chmod 0777 ${SYSTEM}/tmpchmod 0700 ${SYSTEM}/root # 搜索LiveCD所在的设备for i in /proc/ide/hd*do    if test `cat $i/media` = "cdrom" ; then        mount -t iso9660 /dev/`basename $i` ${SYSTEM}/cdrom 2>/dev/null        if test $? = 0 ; then            if [ -f ${SYSTEM}/cdrom/LABEL ] ; then                if grep -q "Sunhaiyong's LiveCD" ${SYSTEM}/cdrom/LABEL ; then                    break;                fi            fi            umount ${SYSTEM}/cdrom        fi    fidone # 加载squashfs压缩的主文件系统mount -o loop -t squashfs ${SYSTEM}/cdrom/SYSTEM ${SYSTEM}/systemln -s /system/bin ${SYSTEM}ln -s /system/sbin ${SYSTEM}ln -s /system/lib ${SYSTEM}ln -s /system/usr ${SYSTEM} # 将根目录从initrd转换到主系统killall /sbin/udevdecho 0x0100 > /proc/sys/kernel/real-root-devpivot_root ${SYSTEM} ${SYSTEM}/initrdcd / # 解压缩一些必要的目录和文件tar xf /cdrom/etc.tar.bz2 -C / #转移内核文件系统mount --move /initrd/dev /devmount --move /initrd/proc /procmount --move /initrd/sys /sysmkdir -p /var/{run,log,lock}touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}chgrp utmp /var/run/utmp /var/log/lastlogchmod 664 /var/run/utmp /var/log/lastlog #结束EOF




现在根据linuxrc用到的命令复制到initrd中
代码:

cp -a /bin/{bash,bunzip,bzcat,bzip2,killall,chmod,cp,grep,mount,tar,ln,cat,mkdir} ${INITRD}/bincp -a /usr/bin/basename ${INITRD}/bincp -a /sbin/pivot_root ${INITRD}/sbincp -a /sbin/{udevd,udevsettle,udevtrigger,modprobe} ${INITRD}/sbin



复制这些命令所需要的各种动态链接库,可通过ldd命令查看。
代码:

cp -a /lib/ld-* ${INITRD}/lib/cp -a /lib/libc-2.5.1.so ${INITRD}/lib/cp -a /lib/libc.so.6 ${INITRD}/lib/cp -a /lib/lib{dl,pthread,rt}-* ${INITRD}/lib/cp -a /lib/lib{readline,history,ncursesw,dl,bz2,blkid,uuid,rt,pthread}.so* ${INITRD}/lib/




创建一些必要的文件
代码:

touch ${INITRD}/etc/fstab



创建LiveCD标签
代码:

echo "Sunhaiyong's LiveCD" > /opt/iso/LABEL



卸载initrd,并将其压缩
代码:

cd /opt/iso/bootumount initrdgzip -9 initrd.img




建立etc.tar.bz2文件
代码:

cd /opt/isocp -a /etc ./



可以对etc目录进行特定的修改,然后打包压缩
代码:

tar -cjf etc.tar.bz2 etcrm -r etc




创建grub及启动选择
代码:

cd /opt/isomkdir -p boot/grubcp -a /usr/lib/grub/i386-pc/stage2_eltorito boot/grub



创建menu.lst
代码:

cd /opt/iso/boot/grubcat > menu.lst << "EOF"default 0timeout 3color green/black light-green/blacktitle MyLiveCD 1.0root (cd)kernel /boot/kernelinitrd /boot/initrd.img.gz





生成iso文件
代码:

cd /optmkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o mylivecd.iso iso




  好了,现在在/opt目录下将出现一个mylivecd.iso文件,将这个文件刻录到光盘上,就可以用来引导一台x86的机器了。

注意:
  如果需要刻录光盘,建议您先用虚拟机来测试一下这个iso文件是否工作正常,避免不必要的浪费。:-)

  将这个自己制作的LiveCD光盘插入光驱,很快系统就会完成整个LiveCD的引导过程进入Login状态。

  本文到现在为止只是完成了一个LiveCD的基本功能,用户可以根据自己的需求增加各种功能,这些都可以在主系统的后续引导过程中增加。

(转载请保持文章的完整性,请注明作者和出处)
                               作者:孙海勇(冲天飞豹)
                               Email:youbest@sina.com
                               2008年2月12日


  以上就是整个LiveCD的制作过程,引导完成后的样子如下:



更新日志:
2008年2月12日:本文发布。

Rank: 3Rank: 3

注册时间
2013-12-26
最后登录
2014-1-6
在线时间
2 小时
阅读权限
30
积分
360
帖子
80
主题
0
精华
0
UID
40702
发表于 2013-12-30 17:55:06 |显示全部楼层
Keycer是一家位于荷兰的基础网络服务提供商,全球IP单一架构,在客户单台服务器,提供任意国家的IP
全能独立IP空间,支持IP访问网站,独立IP更利于SEO,让您选择更专业,海外免备案空间,海外服务器,稳定高速。
新品发布
全球最低价 限量50台供应
每人限购3台
•        6核心CPU
•        12GB 内存
•        2TB硬盘
•        1TB流量
•        256个C段不连续IP
•        大机房质量保障/全球IP

更多请点击: http://www.keycer.org/support/cart/cloud-promotion/&step=0
详情咨询QQ:800066022

使用道具 举报

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

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2019-10-23 18:00 , Processed in 0.024208 second(s), 14 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部