/livecd/gld.pl(感谢 DawnFantasy 提供的这个 perl 脚本! )这个脚本复制文件以及所依赖的库到指定位置.
由于这个脚本中包含一些特殊字符, 在使用 cat 生成时会有一定困难, 所以请自己创建这个文件.
vi /livecd/gld.pl
...
chmod +x /livecd/gld.pl
#!/usr/bin/perl
#===============================================================================
#
# DESCRIPTION: Get library
#
# AUTHOR: DawnFantasy, <goldenshore999 # gmail # com>
# VERSION: 1.1
# DATE: 2008-02-04
#
#===============================================================================
use strict;
use warnings;
use Getopt::Long;
my %opts;
$opts{target} = 'initrd';
usage(), exit -1
if ( not GetOptions( \%opts, 'import=s', 'verbose', 'target|t=s' ) );
usage(), exit -1
if ( ( not @ARGV ) xor ( defined $opts{import} ) );
sub usage {
print <<EOU;
Usage:
$0 file1 [file2...fileX] [-t DIR] [-v]
or
$0 -i list [-t DIR] [-v]
Options:
-i, --import=FILE Process files listed in FILE
-t, --target=DIR Use DIR as root. (Default ./initrd)
-v, --verbose Be verbose.
EOU
return;
}
## files to process
my @files;
{
my @filess;
{
## files in @ARGV
if ( not defined $opts{import} ) {
push @filess, @ARGV;
last;
}
## import list
open my $fh, '<', $opts{import}
or die "$!\n";
@filess = (<$fh>);
@filess = map { chomp; $_ } @filess;
close $fh;
}
print "File to process: (! means file NOT found.)\n";
foreach (@filess) {
print " ! $_ \n" and next if not -f $_;
push @files, $_;
print " $_\n";
}
}
## parse libs to copy
my @libs;
{
print "\n";
foreach (@files) {
my $ldd = qx{/usr/bin/ldd $_};
chomp $ldd;
print "$ldd\n\n" if defined $opts{verbose};
my @files = split /\s+/, $ldd;
push @libs, grep { -f $_ } @files; ## check for existence
}
## Unified them
my %h = map { ( $_, 1 ) } @libs;
@libs = sort keys %h;
if ( defined $opts{verbose} ) {
print "Libraries to copy:\n";
print " $_ => $opts{target}$_\n" foreach @libs;
}
}
## Do the real work
print "\n";
{
print "Copying files, please wait...\n";
## Add those files in the original list
push @libs, @files;
if ( not -d $opts{target} ) {
print "Creating directory $opts{target}\n";
system qq{ mkdir -p $opts{target} };
}
my $v = $opts{verbose} ? 'v' : '';
foreach (@libs) {
if (/^\//) {
## 绝对目录
s/^\///;
system
qq{ tar -C / -hpmcf - $_ | tar -C $opts{target} -pmx$v -f - };
} else {
## 相对目录
system
qq{ tar -hpmcf - $_ | tar -C $opts{target} -pmx$v -f - };
}
}
}
好了, 万事具备, 让我们开始吧!
3. 安装 grub, 创建 menu.lst, 安装 kernel
cd /livecd
#install grub
mkdir iso/boot/grub -p
cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub
#create menu.lst
cat > iso/boot/grub/menu.lst << EOF
default 0
timeout 3
color green/black light-green/black
title grub livecd
root(cd)
kernel /boot/kernel root=/dev/ram0 rw init=/bin/bash --rcfile /etc/profile
initrd /boot/initrd.img
EOF
#install kernel
cp /boot/lfskernel-2.6.22.5 iso/boot/kernel
#create livecd and upload
./mkiso
因为还没有 initrd.img, mkiso 会出一些错误提示, 不过没关系, 不会影响正常运行
4. 创建 initrd.img
cd /livecd
#create initrd.img, size is 8M
dd if=/dev/zero of=initrd.img bs=400k count=20
mke2fs -F -m0 initrd.img
mount -o loop initrd.img initrd
mkdir initrd/dev
mknod initrd/dev/console c 5 1
./mkiso
5. 复制需要的命令及其库文件
我们都需要些什么呢?- bash
- 一些简单命令如: ls, cat, tar, rm, bzip2 等
- 加载分区需要的命令如: mount, umount, mountpoint, udev 等
- 分区需要的命令如: fdisk, mkfs, mkswap 等
以下这个列表应该足够了:/bin/bash
/bin/bzip2
/bin/cat
/bin/cp
/bin/echo
/bin/grep
/bin/ls
/bin/mount
/bin/mountpoint
/bin/rm
/bin/stty
/bin/tar
/bin/umount
/sbin/fdisk
/sbin/mkfs
/sbin/mkfs.ext2
/sbin/mkfs.ext3
/sbin/mkswap
/sbin/swapon
/sbin/udevd
/sbin/udevsettle
/sbin/udevtrigger
/usr/sbin/chroot
我们复制它们(以及它们所依赖的库文件)
cat > /livecd/lddfiles.dat << EOF
/bin/bash
/bin/bzip2
/bin/cat
/bin/cp
/bin/echo
/bin/grep
/bin/ls
/bin/mount
/bin/mountpoint
/bin/rm
/bin/stty
/bin/tar
/bin/umount
/sbin/fdisk
/sbin/mkfs
/sbin/mkfs.ext2
/sbin/mkfs.ext3
/sbin/mkswap
/sbin/swapon
/sbin/udevd
/sbin/udevsettle
/sbin/udevtrigger
/usr/sbin/chroot
EOF
cd /livecd
./gld.pl -i lddfiles.dat
cd initrd/bin
ln -s bash sh
6. 创建/复制一些配置文件, 复制一些系统脚本
/etc/profile
mkdir /livecd/initrd/etc
cat > /livecd/initrd/etc/profile << EOF
/etc/rc.d/init.d/rc sysinit
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
export HISTSIZE=1000
export PS1="\w# "
alias ls="ls -l --color"
# End /etc/profile
EOF
/etc/fstab
cat > /livecd/initrd/etc/fstab << EOF
/dev/root / ext2 defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts defaults 0 0
EOF
udev 相关的文件
cd /livecd
cp /etc/udev /livecd/initrd/etc/ -a
mkdir -p initrd/etc/rc.d
mkdir -p initrd/etc/rc.d/init.d
cp -a /etc/rc.d/init.d/functions initrd/etc/rc.d/init.d/functions
cp -a /etc/rc.d/init.d/mountfs initrd/etc/rc.d/init.d/mountfs
cp -a /etc/rc.d/init.d/mountkernfs initrd/etc/rc.d/init.d/mountkernfs
cp -a /etc/rc.d/init.d/rc initrd/etc/rc.d/init.d/rc
cp -a /etc/rc.d/init.d/udev initrd/etc/rc.d/init.d/udev
cp -a /etc/rc.d/init.d/udev_retry initrd/etc/rc.d/init.d/udev_retry
mkdir -p initrd/etc/rc.d/rcsysinit.d
cp -a /etc/rc.d/rcsysinit.d/S40mountfs initrd/etc/rc.d/rcsysinit.d/S40mountfs
cp -a /etc/rc.d/rcsysinit.d/S45udev_retry initrd/etc/rc.d/rcsysinit.d/S45udev_retry
cp -a /etc/rc.d/rcsysinit.d/S00mountkernfs initrd/etc/rc.d/rcsysinit.d/S00mountkernfs
cp -a /etc/rc.d/rcsysinit.d/S10udev initrd/etc/rc.d/rcsysinit.d/S10udev
mkdir -p initrd/etc/sysconfig
cp -a /etc/sysconfig/rc initrd/etc/sysconfig/rc
mkdir -p initrd/lib/udev
cp -a /lib/udev/devices initrd/lib/udev/
让 udev 自动创建 cdrom 链接
cat > /livecd/initrd/etc/udev/rules.d/75-cd-aliases-generator.rules << EOF
SYSFS{device/media}=="cdrom", SYMLINK+="cdrom"
EOF
创建 /proc, /sys, /mnt/cdrom
mkdir /livecd/initrd/proc
mkdir /livecd/initrd/sys
mkdir -p /livecd/initrd/mnt/cdrom
7. 这就是我们所要做的一切了
cd /livecd
./mkiso
cd /livecd
ls -l
total 11917
drwxr-xr-x 2 root root 4096 Feb 5 06:05 doc
-rwxr-xr-x 1 root root 2408 Feb 5 06:05 gld.pl
drwxr-xr-x 9 root root 1024 Feb 5 06:10 initrd
-rw-r--r-- 1 root root 8192000 Feb 5 05:41 initrd.img
drwxr-xr-x 3 root root 4096 Feb 5 05:35 iso
-rw-r--r-- 1 root root 277 Feb 5 06:08 lddfiles.dat
-rw-r--r-- 1 root root 3973120 Feb 5 06:16 livecd.iso
-rwxr-xr-x 1 root root 450 Feb 5 05:33 mkiso
root@lfs:/livecd#