Shell's Home

Jul 11, 2006 - 2 minute read - Comments

debian live

准备做debian

live了,期间有什么东西都会写在这里。大致来说就是打算实践一个项目。

copyright

Shell.E.Xu撰写,按GPL发布。

abstract

用debian3.1testing为基础建立live cd。128M以内,无X系统,无交换区和/tmp,使用内存盘。

target

用于挂载ext3 ntfs vfat文件系统,实施文件系统管理和修复,访问文件系统内容并修改。

注:准备特别针对3721,yahoo助手之类类似rootkit的东西实施扫描清理。

environment

debian 3.1 starg testing(貌似是废话)

grub stage2_eltorito支持光盘启动

linux-kernel-2.6.15-8 直接使用deb包中内容

initrd 在kernel包中包含

step by step

1.建立基础文件系统并且复制所需文件

建立~/syscd/boot/grub/,复制menu.lst stage2_eltorito文件过去。

复制vmlinuz system.map config到~/syscd/boot中,注意ISO9660格式中文件名不能过长(多少记不清了)。

复制/lib到~/syscd/lib,并且调节内容。(我个人在其中添加了我需要的nVIDIA显卡驱动)

2.grub和iso

cd \~
mkdir initrd
#关于initrd的原理生成和使用后面讲
mkdir root
#这个是用于内存的镜像内容
mkdir cramfs
#这个是只读镜像内容
vi \~/testsyscd

------------------我是邪恶的分割线--------------------
#!/bin/bash
qemu -no-kqemu -cdrom \~/syscd.iso -boot d >/dev/null

------------------我是邪恶的分割线--------------------
chmod 755 \~/testsyscd
vi \~/mksyscd

------------------我是邪恶的分割线--------------------
#!/bin/bash
COMPRESS_MODE=-9
cd \~
# block of create initrd.img, disable when u already get one.
cd initrd
find . | cpio -H newc -o > ../initrd.img
cd ..
gzip -c $COMPRESS_MODE initrd.img > syscd/boot/initrd.img
rm initrd.img
# block of create root.tar.gz, disable when u already get one.
cd root
tar cvf ../root.tar * >/dev/null 2>&1
cd ..
gzip -c $COMPRESS_MODE root.tar > syscd/boot/root.tar.gz
rm root.tar
# mkcramfs
mkcramfs cramfs syscd/cdrom.cramfs
# block of make iso img
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o syscd.iso syscd

------------------我是邪恶的分割线--------------------
chmod 755 \~/mksyscd
#试验一下
./mksyscd

如此处理后,运行mksyscd就可以生成我们所需要的iso。不过现在生成的试验品是没有用处的,我们安装了grub和linux内核,可是没有让grub去引导光盘上的内核.

vi \~/syscd/boot/grub/menu.lst

------------------我是邪恶的分割线--------------------
title Debian GNU/Linux, kernel 2.6.15-1-686
root (cd)
kernel /boot/vmlinuz boot=cramfs root=/dev/cdrom 1
initrd /boot/initrd.img
boot
### END DEBIAN AUTOMAGIC KERNELS LIST
title from Harddisk
root (hd0)
chainloader +1
boot
------------------我是邪恶的分割线--------------------

注意两个问题,一个千万不能找debian的默认配置学savedefault[1]。都光驱了你还save个啥阿?还有就是root行可以省略,不过我还是放出来。

3.kernel & initrd

注意到上面的initrd了吧,这个东西本来是用来启动内核的。先加载initrd,然后加载驱动,初始化,然后内核切换到root再启动init。不过在2.6内核中,有一种cpio-initrd[2]。这种东西可以直接当做内存盘用,端的是爽歪歪。把内容先用cpio打包,再gzip压缩就好了。不过内存盘中的内容建议能精简就精简,而且注意,文献[2]中的内容用的参数是cpio -c -o。根据我的试验,2.6.15内核不认可pre-SRV4格式的cpio-initrd。debian默认的是SRV4 non-CRC的,所以我们使用cpio -H newc -o参数[3]。

然后就是initrd的内容,我们使用标准的initrd解压后自己mod。首先是把tar复制到bin下面,因为等等我们会在生成root的时候使用tar(如果你觉得只有1M不到不用压缩也可以,不过要手工生成很多连接,最好还是用tar打个包,比较方便)。其次,如果需要用cramfs方式的,要记得把loop.o内核模块也放到initrd的对应位置。否则没有loop设备是不能挂载的。然后我们在scripts下面生成一个cramfs文件,不需要可执行。

------------------我是邪恶的分割线--------------------
# Local filesystem mounting -*- shell-script -*-
# Parameter: Where to mount the filesystem
mountroot ()
{
    [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
    run_scripts /scripts/local-top
    [ "$quiet" != "y" ] && log_end_msg
    [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
    run_scripts /scripts/local-premount
    [ "$quiet" != "y" ] && log_end_msg
    # We've given up, but we'll let the user fix matters if they can
    while [ ! -e "${ROOT}" ]; do
        panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
    done
    mkdir /mnt
    mount -n -t iso9660 -r -o exec ${ROOT} /mnt
    mount -n -t ramfs none ${rootmnt}
    if [ ! -e /mnt/boot/root.tar.gz ]; then
        echo "no root.tar.gz"
    fi
    tar xzf /mnt/boot/root.tar.gz -C ${rootmnt}
    mount -n -o move /mnt ${rootmnt}/cdrom
    modprobe loop
    mknod /dev/loop0 b 7 0
    mount -t cramfs -o loop ${rootmnt}/cdrom/cdrom.cramfs
    ${rootmnt}/media
    [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/log-bottom"
    run_scripts /scripts/local-bottom
    [ "$quiet" != "y" ] && log_end_msg
}

------------------我是邪恶的分割线--------------------

然后我们看上面~/syscd/boot/grub/menu.lst的内核参数,现在知道为什么要boot=cramfs了吧。至于root,如果你是双光驱,那么cdrom可能指向错误的光驱。在grub的时候手工调整参数就照样启动了。至于那个1,是用来进入单用户模式的,虽然我其实在/etc/inittab里面调整了。

cramfs首先套用了local启动方式的外壳脚本,然后在挂载的时候,先吧ROOT设备挂载到/mnt,这是initrd的一个空目录。然后再在目标位置挂载一个ramfs。然后检查光盘上的boot/root.tar.gz。用刚刚我们说的tar解压到目标位置。再把/mnt下面的光盘移动挂载到目标目录的cdrom下面(如果不用cramfs,就移动到media,因为root中制作的所有连接都指向了media下面)。

[5]cramfs是一种压缩只读文件格式,做光盘live的时候最适合使用,我们假定做了一个cdrom.cramfs放在光盘根目录下面(这个其实是用mksyscd自动把cramfs目录生成出来的)。这个时候挂载就好了,指令不复杂。不过挂载前要

Tags: debian linux

linux中文说 论linux引导过程

comments powered by Disqus