感谢大家!
分类: LINUX
2008-02-12 23:58:45
mkdir -pv /opt/iso/{boot,modules} cd /opt/iso
cd / mksquashfs bin lib sbin usr SYSTEM
mv /SYSTEM /opt/iso
cd /opt/iso/boot mkdir initrd dd if=/dev/zero of=initrd.img bs=1M count=8 mkfs.ext2 initrd.img mount -o loop initrd.img initrd
export INITRD=/opt/iso/boot/initrd cd ${INITRD} mkdir bin boot dev etc lib proc sbin sys
cp -a /bin/bash ${INITRD}/bin
mv /opt/iso/modules ${INITRD}/lib
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
cat > ${INITRD}/linuxrc << "EOF" #!/bin/bash mount -t proc proc /proc mount -t sysfs sysfs /sys # 如果你将loop模块化,那么需要加入 /sbin/modprobe loop # 建立/dev设备目录,并使用udev来创建各种设备文件 mount -n -t tmpfs -o mode=0755 udev /dev cp --preserve=all --recursive --remove-destination /lib/udev/devices/* /dev chmod 1777 /dev/shm echo "" > /sys/kernel/uevent_helper echo "Starting Udev..." /sbin/udevd --daemon mkdir -p /dev/.udev/queue /sbin/udevtrigger /sbin/udevsettle # 创建用户使用环境 # 在/SYSTEM中准备目录结构 export SYSTEM=/SYSTEM mkdir -p ${SYSTEM} mount -t tmpfs tmpfs ${SYSTEM} mkdir -p ${SYSTEM}/{system,cdrom,dev,proc,sys,tmp,mnt,initrd,home,root} chmod 0777 ${SYSTEM}/tmp chmod 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 fi done # 加载squashfs压缩的主文件系统 mount -o loop -t squashfs ${SYSTEM}/cdrom/SYSTEM ${SYSTEM}/system ln -s /system/bin ${SYSTEM} ln -s /system/sbin ${SYSTEM} ln -s /system/lib ${SYSTEM} ln -s /system/usr ${SYSTEM} # 将根目录从initrd转换到主系统 killall /sbin/udevd echo 0x0100 > /proc/sys/kernel/real-root-dev pivot_root ${SYSTEM} ${SYSTEM}/initrd cd / # 解压缩一些必要的目录和文件 tar xf /cdrom/etc.tar.bz2 -C / #转移内核文件系统 mount --move /initrd/dev /dev mount --move /initrd/proc /proc mount --move /initrd/sys /sys mkdir -p /var/{run,log,lock} touch /var/run/utmp /var/log/{btmp,lastlog,wtmp} chgrp utmp /var/run/utmp /var/log/lastlog chmod 664 /var/run/utmp /var/log/lastlog #结束 EOF
cp -a /bin/{bash,bunzip,bzcat,bzip2,killall,chmod,cp,grep,mount,tar,ln,cat,mkdir} ${INITRD}/bin cp -a /usr/bin/basename ${INITRD}/bin cp -a /sbin/pivot_root ${INITRD}/sbin cp -a /sbin/{udevd,udevsettle,udevtrigger,modprobe} ${INITRD}/sbin
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
echo "Sunhaiyong's LiveCD" > /opt/iso/LABEL
cd /opt/iso/boot umount initrd gzip -9 initrd.img
cd /opt/iso cp -a /etc ./
tar -cjf etc.tar.bz2 etc rm -r etc
cd /opt/iso mkdir -p boot/grub cp -a /usr/lib/grub/i386-pc/stage2_eltorito boot/grub
cd /opt/iso/boot/grub cat > menu.lst << "EOF" default 0 timeout 3 color green/black light-green/black title MyLiveCD 1.0 root (cd) kernel /boot/kernel initrd /boot/initrd.img.gz
cd /opt mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o mylivecd.iso iso
chinaunix网友2008-11-11 21:09:43
回“figured69”:linuxrc就是放在initrd的根目录下,由内核去启动的,现在我感觉可能grub4dos不能正确加载到initrd文件。
chinaunix网友2008-11-11 20:50:01
你好,我按照你这篇文章写的一步步做出了LIVECD,但在虚拟机里启动到 VFS: Mounted root (ext2 filesystem). VFS: Mounted root (ext2 filesystem) readonly. Trying to move old root to /initrd ... okay Freeing unused kernel memory:220K freed的地方就不行了,然后显示: Warning: unable to open an intial console. Kernel panic: No init found. Try passing init= option to kernel. 我在网上找了很多方法都行不通。制作过程中我使用的UDEV的版本是030,没有udevtrigger和udevsettle,在linuxrc文件中使用的命令是/sbin/udevstart,但感觉现在启动的时候还没到这一步就停止了。所以我想请问一下,这种情况一般来说是哪里出现了问题
chinaunix网友2008-11-11 13:58:16
豹哥,有一个问题,linuxrc是用什么样的方式启动的,或者说是什么时候用什么来执行的?谢豹哥,照着你的方式已经完成了livecd,虚拟机里当作cdrom能够正常启动,而自己装了grub4dos引导iso文件时,内核执行了,但是报错找不到initrd。郁闷