+ -
当前位置:首页 → 问答吧 → 我的initrd.img

我的initrd.img

时间:2008-02-01

来源:互联网

这是整理后的文档地址:http://imghch.com/doc/bk02.html

这是我的 initrd.img 文件列表,该有的都有了,大家可以以此做个 livecd,做出的 livecd 大概 4M

我用来做自己的 lfs 发行版

版本是 lfs 6.3

代码:
.
./lost+found
./bin
./bin/bash
./bin/tar
./bin/rm
./bin/mount
./bin/sh
./bin/cp
./bin/stty
./bin/mountpoint
./bin/grep
./bin/cat
./bin/echo
./bin/ls
./bin/bzip2
./bin/umount
./dev
./dev/console
./dev/core
./dev/fd
./dev/null
./dev/pts
./dev/shm
./dev/stderr
./dev/stdin
./dev/stdout
./etc
./etc/udev
./etc/udev/rules.d
./etc/udev/rules.d/60-persistent-storage.rules
./etc/udev/rules.d/81-cdrom.rules
./etc/udev/rules.d/70-persistent-cd.rules
./etc/udev/rules.d/95-udev-late.rules
./etc/udev/rules.d/25-lfs.rules
./etc/udev/rules.d/60-cdrom_id.rules
./etc/udev/rules.d/26-modprobe.rules
./etc/udev/rules.d/75-cd-aliases-generator.rules
./etc/udev/rules.d/27-firmware.rules
./etc/udev/rules.d/60-persistent-input.rules
./etc/udev/rules.d/75-persistent-net-generator.rules
./etc/udev/rules.d/70-persistent-net.rules
./etc/udev/rules.d/05-udev-early.rules
./etc/udev/udev.conf
./etc/rc.d
./etc/rc.d/init.d
./etc/rc.d/init.d/functions
./etc/rc.d/init.d/mountfs
./etc/rc.d/init.d/mountkernfs
./etc/rc.d/init.d/rc
./etc/rc.d/init.d/udev
./etc/rc.d/init.d/udev_retry
./etc/rc.d/rcsysinit.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
./etc/sysconfig
./etc/sysconfig/rc
./etc/fstab
./etc/vimrc
./lib
./lib/libc.so.6
./lib/ld-linux.so.2
./lib/librt.so.1
./lib/libpthread.so.0
./lib/libreadline.so.5
./lib/libhistory.so.5
./lib/libncursesw.so.5
./lib/libdl.so.2
./lib/libblkid.so.1
./lib/libuuid.so.1
./lib/udev
./lib/udev/devices
./lib/udev/devices/core
./lib/udev/devices/fd
./lib/udev/devices/null
./lib/udev/devices/pts
./lib/udev/devices/shm
./lib/udev/devices/stderr
./lib/udev/devices/stdin
./lib/udev/devices/stdout
./lib/libext2fs.so.2
./lib/libcom_err.so.2
./lib/libe2p.so.2
./lib/libbz2.so.1.0
./linuxrc
./mnt
./mnt/cdrom
./mnt/lfs
./proc
./sbin
./sbin/udevd
./sbin/udevsettle
./sbin/udevtrigger
./sbin/fdisk
./sbin/mkfs
./sbin/mkfs.ext2
./sbin/mkfs.ext3
./sbin/mkswap
./sbin/swapon
./sys
./usr
./usr/bin
./usr/bin/udevtest
./usr/bin/vi
./usr/sbin
./usr/sbin/chroot
这是其中 linuxrc 内容
代码:
#!/bin/bash
/etc/rc.d/init.d/rc sysinit
echo 'Hello, world!'
bash
exit
这是我用来抓库的 php 脚本 (不好意思,没用 perl)
代码:
#!/usr/local/bin/php

<?php

$pre="/livecd";
$lddfile=$pre."/"."lddfiles.dat";

$filez=file($lddfile);


print "lddfiles: \n";
foreach ($filez as $file) {
 exec("/usr/bin/ldd $file",$return);

 foreach($return as $items) {
 $itemz = explode(' ', $items);
 array_pop($itemz);
 $pop=array_pop($itemz);
 if($pop <> '') {
 $pop = ltrim($pop);
 $fnz[]=$pop;
 }
 }
 $src=rtrim($file);
 $dst=$pre."/initrd".$src;
 $dir = dirname($dst);
# print "dirsrc: $dir \n";
 if (!file_exists($dir)) {
 mkdir($dir);
 }
 print "$src => $dst\n";
 exec("cp $src $dst");
}


print "lib files: \n";
foreach ($fnz as $src) {
# print "src: $src \n";
 $dst=$pre."/initrd".$src;
 $dir = dirname($dst);
# print "dirsrc: $dir \n";

 if (!file_exists($dst)) {
 if (!file_exists($dir)) {
 mkdir($dir);
 }
 exec("cp $src $dst");
 print "$src => $dst\n";
 }
}
?>

作者: ServerOnly   发布时间: 2008-02-01

Server 兄有几个疑问:

1. 我不懂 php,上面说是用来抓库的,但是我该如何设置哪些库该抓呢?

2. linuxrc 里面只有 "Hello, world!",那麽库是怎样加载的呢?

3. 以上 php 脚本只是制作 initrd 时需要,并非完成後启动时所需的吧?

请 Server 兄解说一下,谢谢!

作者: d00m3d   发布时间: 2008-02-04

对于你的疑问:

1. 我不懂 php,上面说是用来抓库的,但是我该如何设置哪些库该抓呢?
那要看你需要什么命令,然后运行 ldd xxxx 检查

2. linuxrc 里面只有 "Hello, world!",那麽库是怎样加载的呢?
Hello, world 需要运行 echo, 需要找到 echo 所依赖的库

3. 以上 php 脚本只是制作 initrd 时需要,并非完成後启动时所需的吧?
没错



我不知道哪些是你已经知道的,哪些是不知道的,我就详细说一下整个过程:

1. 首先这个 livecd 是一个全裸奔的系统,也就是说没有安装任何一个软件包,需要什么文件就从系统里 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. 于是这个全裸奔的系统具备了一切需要的东西:
kernel, 命令及其库 -- 这不就是一个 linux 系统的全部吗?
里面有 fdisk, mkfs, mount, tar, chroot (这也是大致的使用顺序) ,(vi, grub 等我看就不需要了. 我们有chroot :-) ),然后就可以把你的 lfs 打包放上去了。

不知道解释清楚没有
根本思路及原理: 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, 蛮大地说),有空我会试试
上传的图像
sc.jpg (111.8 KB, 61 次查看)

作者: ServerOnly   发布时间: 2008-02-04

支持精华 !
赞 !

作者: tfkdmwmqtr   发布时间: 2008-02-04

Oh,不好意思看漏眼,没注意 echo "Hello, world!" 上面还有一句 rc

经 Server 兄解说现在明白了,既然兄弟们都认同了,也没必要吝啬,精上!

最後建议 Server 兄换个醒目一点的标题,方便日後兄弟们查找,谢谢分享

作者: d00m3d   发布时间: 2008-02-04

贡献一个 perl 的,代替那个 php 的。
昨晚临时写的,比较仓促,有啥bug在这里说。@~@。
上传的附件
gld.pl.bz2 (1.1 KB, 17 次查看)

作者: 晨想   发布时间: 2008-02-04

谢谢大家,我会找时间好好整理一下。

作者: ServerOnly   发布时间: 2008-02-04

引用:
另外,加上 httpd 恐怕就是传说中 5M 的 apache 了(看了下httpd, 1.8M, 蛮大地说),有空我会试试
幸 !
我也有些心痒痒了。

作者: tfkdmwmqtr   发布时间: 2008-02-04

引用:
作者: 晨想
贡献一个 perl 的,代替那个 php 的。
昨晚临时写的,比较仓促,有啥bug在这里说。@~@。
晨晨早该出招,先下来学习学习。。。

作者: d00m3d   发布时间: 2008-02-04

幸亏偶写了 comment,不然你就有的享受了。嘿嘿。。

作者: 晨想   发布时间: 2008-02-05

测试过了,很好用啊

作者: ServerOnly   发布时间: 2008-02-05

嘿嘿,那就好,别出什么篓子。哈哈。:)。

至于 5M 的系统,估计你要重新设计了,比如 libc 用 ulibc 代替,shell 用 busybox 等,反正有主系统,想加什么都容易的。

作者: 晨想   发布时间: 2008-02-05

更新一下,之前的在处理当前目录的文件会出错。

新的可以处理相对路径以及绝对路径的文件,命令行也可以指定多个文件名了。:)。
上传的附件
getldd.bz2 (1.2 KB, 18 次查看)

作者: 晨想   发布时间: 2008-02-05

晨晨顺便解说一下脚本吧

作者: d00m3d   发布时间: 2008-02-05

整理完毕,换新贴了,把这个精取消吧

另外,大家怎么都不睡觉啊

作者: ServerOnly   发布时间: 2008-02-05

一个 linux 系统是由内核、程序及其所依赖的库所组成的。本文介绍一种直接从现有系统里复制所需的文件来制作一个 linux livecd 的方法。
已经测试通过。

感谢晨想提供的 perl 脚本,比我那个 php 的强
上传的附件
livecd.bz2 (4.3 KB, 51 次查看)

作者: ServerOnly   发布时间: 2008-02-05

这个标题醒目多了,这样吧,把两个主题合拼起来好了

作者: d00m3d   发布时间: 2008-02-05

引用:
作者: d00m3d
晨晨顺便解说一下脚本吧
啊?晕。偶的 comment 应该很详细了啊,你有啥问题呢?可以提出来我详细说:)。

作者: 晨想   发布时间: 2008-02-05

下了,未看。。。(闪!)

作者: d00m3d   发布时间: 2008-02-06

打PP。哼哼。。~~

作者: 晨想   发布时间: 2008-02-10

livecd.bz2 这个文件用啥看阿?我用的是epiphany, 打开有点乱。

我在尝试弄一个只在ram内存在的系统。谢谢lz的启发和df的脚本。呵呵。

作者: idisblueflash   发布时间: 2008-02-12

原来这个livecd.bz2是:livecd.tar.bz2

作者: idisblueflash   发布时间: 2008-02-12

热门下载

更多