|

楼主 |
发表于 2008-2-3 21:22:26
|
显示全部楼层
对于你的疑问:
1. 我不懂 php,上面说是用来抓库的,但是我该如何设置哪些库该抓呢?
[color="Orange"]那要看你需要什么命令,然后运行 ldd xxxx 检查
2. linuxrc 里面只有 "Hello, world!",那麽库是怎样加载的呢?
[color="orange"]Hello, world 需要运行 echo, 需要找到 echo 所依赖的库
3. 以上 php 脚本只是制作 initrd 时需要,并非完成後启动时所需的吧?
[color="orange"]没错
我不知道哪些是你已经知道的,哪些是不知道的,我就详细说一下整个过程:
1. 首先这个 livecd 是一个[color="Red"]全裸奔的系统,也就是说[color="red"]没有安装任何一个软件包,需要什么文件就从系统里 cp 什么文件
2. 我们知道安装 grub 并加载 kernel 后 linux 已经运行了。但此时还有很多工作要做
LFS 里是要运行 rc sysinit, 也就是说要运行 /etc/rc.d/rcsysinit.d/* (当然全是 /etc/rc.d/init.d/* 的链接)
于是我就首先 cp 了 /etc/sysconfig/rc, /etc/rc.d/rcsysinit.d/ 以及 /etc/rc.d/init.d/ 里我认为需要的东西:
./etc/rc.d/rcsysinit.d/S40mountfs
./etc/rc.d/rcsysinit.d/S45udev_retry
./etc/rc.d/rcsysinit.d/S00mountkernfs
./etc/rc.d/rcsysinit.d/S10udev
主要目的是加载设备
(当然不需要这么复杂,但我试了几次 udevd 不成功,于是干脆照搬 LFS 的启动脚本。这是一种偷懒的行为。在 linuxrc 里不运行 rc sysinit 而是直接 udevd --daemon 才是汉子)
3. 之后我们需要一些程序使这个 livecd 可用,经过反复试验,我觉得作为一个发行版所需要的命令应该有:
- /usr/sbin/chroot
- /sbin/mkswap
- /bin/bzip2
- /bin/cat
- /bin/echo
- /bin/tar
- /sbin/fdisk
- /bin/rm
- /bin/grep
- /bin/mountpoint
- /bin/stty
- /bin/bash
- /bin/ls
- /bin/mount
- /bin/umount
- /bin/cp
- /sbin/udevd
- /sbin/udevtrigger
- /sbin/udevsettle
- /sbin/mkfs
- /sbin/mkfs.ext2
- /sbin/mkfs.ext3
复制代码
(我把他们放到 lddfiles.dat 里)
并且需要这些命令所依赖的库
怎么知道需要什么库呢?需要运行:
ldd xxxx
比如 ldd /bin/bash 结果是这样:
- root@lfs:/livecd# ldd /bin/bash
- linux-gate.so.1 => (0xffffe000)
- libreadline.so.5 => /lib/libreadline.so.5 (0xb7f85000)
- libhistory.so.5 => /lib/libhistory.so.5 (0xb7f7e000)
- libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7f31000)
- libdl.so.2 => /lib/libdl.so.2 (0xb7f2d000)
- libc.so.6 => /lib/libc.so.6 (0xb7e02000)
- /lib/ld-linux.so.2 (0xb7fb6000)
- root@lfs:/livecd#
复制代码
知道需要什么库后,逐个 cp 之。但这绝对是个令人崩溃个过程,于是我写了那个php脚本。它的作用是
读取lddfiles.dat (里面放上你需要的命令), 找到 lddfiles.dat 里所有命令需要的库,cp 之。
4. 请注意,步骤2和步骤3是穿插进行的,因为那些 /etc/rc.d/init.d/* 也要执行命令
5. 于是这个全裸奔的系统具备了一切需要的东西:
[color="red"]kernel, 命令及其库 -- 这不就是一个 linux 系统的全部吗?
里面有 fdisk, mkfs, mount, tar, chroot (这也是大致的使用顺序) ,(vi, grub 等我看就不需要了. 我们有chroot :-) ),然后就可以把你的 lfs 打包放上去了。
不知道解释清楚没有
[color="red"]根本思路及原理: linux 是由命令以及命令所依赖的库组成的,找到它们,cp 之
这是运行我那个脚本的输出,效果是复制 => 左边的文件到 => 右边位置,目录不存在时自动创建:
- lddfiles:
- /usr/sbin/chroot => /livecd/initrd/usr/sbin/chroot
- /sbin/mkswap => /livecd/initrd/sbin/mkswap
- /bin/bzip2 => /livecd/initrd/bin/bzip2
- /bin/cat => /livecd/initrd/bin/cat
- /bin/echo => /livecd/initrd/bin/echo
- /bin/tar => /livecd/initrd/bin/tar
- /sbin/fdisk => /livecd/initrd/sbin/fdisk
- /bin/rm => /livecd/initrd/bin/rm
- /bin/grep => /livecd/initrd/bin/grep
- /bin/mountpoint => /livecd/initrd/bin/mountpoint
- /bin/stty => /livecd/initrd/bin/stty
- /bin/bash => /livecd/initrd/bin/bash
- /bin/ls => /livecd/initrd/bin/ls
- /bin/mount => /livecd/initrd/bin/mount
- /bin/umount => /livecd/initrd/bin/umount
- /bin/cp => /livecd/initrd/bin/cp
- /sbin/udevd => /livecd/initrd/sbin/udevd
- /sbin/udevtrigger => /livecd/initrd/sbin/udevtrigger
- /sbin/udevsettle => /livecd/initrd/sbin/udevsettle
- /sbin/mkfs => /livecd/initrd/sbin/mkfs
- /sbin/mkfs.ext2 => /livecd/initrd/sbin/mkfs.ext2
- /sbin/mkfs.ext3 => /livecd/initrd/sbin/mkfs.ext3
- lib files:
- /lib/libc.so.6 => /livecd/initrd/lib/libc.so.6
- /lib/ld-linux.so.2 => /livecd/initrd/lib/ld-linux.so.2
- /lib/libuuid.so.1 => /livecd/initrd/lib/libuuid.so.1
- /lib/libbz2.so.1.0 => /livecd/initrd/lib/libbz2.so.1.0
- /lib/librt.so.1 => /livecd/initrd/lib/librt.so.1
- /lib/libpthread.so.0 => /livecd/initrd/lib/libpthread.so.0
- /lib/libreadline.so.5 => /livecd/initrd/lib/libreadline.so.5
- /lib/libhistory.so.5 => /livecd/initrd/lib/libhistory.so.5
- /lib/libncursesw.so.5 => /livecd/initrd/lib/libncursesw.so.5
- /lib/libdl.so.2 => /livecd/initrd/lib/libdl.so.2
- /lib/libblkid.so.1 => /livecd/initrd/lib/libblkid.so.1
- /lib/libext2fs.so.2 => /livecd/initrd/lib/libext2fs.so.2
- /lib/libcom_err.so.2 => /livecd/initrd/lib/libcom_err.so.2
- /lib/libe2p.so.2 => /livecd/initrd/lib/libe2p.so.2
复制代码
-- cp 了所有 lddfiles.dat 里的命令以及所需的库
整个制作过程是一个循环:
- 生成 iso 并尝试启动
- 发现缺少某个命令
- 调整 lddfiles.dat
- 运行 php 脚本
复制代码
启动后就是附图样子
最后我认为此文应该加精,是精华贴 "LiveCD是这么产生的 " 的裸奔版(或scratch 版)
与其不同的是:他是编译安装需要的包,而我是直接从系统复制,所以我只需要4M
另外,加上 httpd 恐怕就是传说中 5M 的 apache 了(看了下httpd, 1.8M, 蛮大地说),有空我会试试 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|