LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4121|回复: 21

我的initrd.img

[复制链接]
发表于 2008-2-1 12:25:42 | 显示全部楼层 |阅读模式
[color="Red"]这是整理后的文档地址:http://imghch.com/doc/bk02.html

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

我用来做自己的 lfs 发行版

版本是 lfs 6.3


  1. .
  2. ./lost+found
  3. ./bin
  4. ./bin/bash
  5. ./bin/tar
  6. ./bin/rm
  7. ./bin/mount
  8. ./bin/sh
  9. ./bin/cp
  10. ./bin/stty
  11. ./bin/mountpoint
  12. ./bin/grep
  13. ./bin/cat
  14. ./bin/echo
  15. ./bin/ls
  16. ./bin/bzip2
  17. ./bin/umount
  18. ./dev
  19. ./dev/console
  20. ./dev/core
  21. ./dev/fd
  22. ./dev/null
  23. ./dev/pts
  24. ./dev/shm
  25. ./dev/stderr
  26. ./dev/stdin
  27. ./dev/stdout
  28. ./etc
  29. ./etc/udev
  30. ./etc/udev/rules.d
  31. ./etc/udev/rules.d/60-persistent-storage.rules
  32. ./etc/udev/rules.d/81-cdrom.rules
  33. ./etc/udev/rules.d/70-persistent-cd.rules
  34. ./etc/udev/rules.d/95-udev-late.rules
  35. ./etc/udev/rules.d/25-lfs.rules
  36. ./etc/udev/rules.d/60-cdrom_id.rules
  37. ./etc/udev/rules.d/26-modprobe.rules
  38. ./etc/udev/rules.d/75-cd-aliases-generator.rules
  39. ./etc/udev/rules.d/27-firmware.rules
  40. ./etc/udev/rules.d/60-persistent-input.rules
  41. ./etc/udev/rules.d/75-persistent-net-generator.rules
  42. ./etc/udev/rules.d/70-persistent-net.rules
  43. ./etc/udev/rules.d/05-udev-early.rules
  44. ./etc/udev/udev.conf
  45. ./etc/rc.d
  46. ./etc/rc.d/init.d
  47. ./etc/rc.d/init.d/functions
  48. ./etc/rc.d/init.d/mountfs
  49. ./etc/rc.d/init.d/mountkernfs
  50. ./etc/rc.d/init.d/rc
  51. ./etc/rc.d/init.d/udev
  52. ./etc/rc.d/init.d/udev_retry
  53. ./etc/rc.d/rcsysinit.d
  54. ./etc/rc.d/rcsysinit.d/S40mountfs
  55. ./etc/rc.d/rcsysinit.d/S45udev_retry
  56. ./etc/rc.d/rcsysinit.d/S00mountkernfs
  57. ./etc/rc.d/rcsysinit.d/S10udev
  58. ./etc/sysconfig
  59. ./etc/sysconfig/rc
  60. ./etc/fstab
  61. ./etc/vimrc
  62. ./lib
  63. ./lib/libc.so.6
  64. ./lib/ld-linux.so.2
  65. ./lib/librt.so.1
  66. ./lib/libpthread.so.0
  67. ./lib/libreadline.so.5
  68. ./lib/libhistory.so.5
  69. ./lib/libncursesw.so.5
  70. ./lib/libdl.so.2
  71. ./lib/libblkid.so.1
  72. ./lib/libuuid.so.1
  73. ./lib/udev
  74. ./lib/udev/devices
  75. ./lib/udev/devices/core
  76. ./lib/udev/devices/fd
  77. ./lib/udev/devices/null
  78. ./lib/udev/devices/pts
  79. ./lib/udev/devices/shm
  80. ./lib/udev/devices/stderr
  81. ./lib/udev/devices/stdin
  82. ./lib/udev/devices/stdout
  83. ./lib/libext2fs.so.2
  84. ./lib/libcom_err.so.2
  85. ./lib/libe2p.so.2
  86. ./lib/libbz2.so.1.0
  87. ./linuxrc
  88. ./mnt
  89. ./mnt/cdrom
  90. ./mnt/lfs
  91. ./proc
  92. ./sbin
  93. ./sbin/udevd
  94. ./sbin/udevsettle
  95. ./sbin/udevtrigger
  96. ./sbin/fdisk
  97. ./sbin/mkfs
  98. ./sbin/mkfs.ext2
  99. ./sbin/mkfs.ext3
  100. ./sbin/mkswap
  101. ./sbin/swapon
  102. ./sys
  103. ./usr
  104. ./usr/bin
  105. ./usr/bin/udevtest
  106. ./usr/bin/vi
  107. ./usr/sbin
  108. ./usr/sbin/chroot
复制代码


这是其中 linuxrc 内容

  1. #!/bin/bash
  2. /etc/rc.d/init.d/rc sysinit
  3. echo 'Hello, world!'
  4. bash
  5. exit
复制代码


这是我用来抓库的 php 脚本 (不好意思,没用 perl)

  1. #!/usr/local/bin/php

  2. <?php

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

  5. $filez=file($lddfile);


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

  9.         foreach($return as $items) {
  10.                 $itemz = explode(' ', $items);
  11.                 array_pop($itemz);
  12.                 $pop=array_pop($itemz);
  13.                 if($pop <> '') {
  14.                         $pop = ltrim($pop);
  15.                         $fnz[]=$pop;
  16.                 }
  17.         }
  18.         $src=rtrim($file);
  19.         $dst=$pre."/initrd".$src;
  20.         $dir = dirname($dst);
  21. #       print "dirsrc: $dir \n";
  22.         if (!file_exists($dir)) {
  23.                 mkdir($dir);
  24.         }
  25.         print "$src => $dst\n";
  26.         exec("cp $src $dst");
  27. }


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

  34.         if (!file_exists($dst)) {
  35.                 if (!file_exists($dir)) {
  36.                         mkdir($dir);
  37.                 }
  38.           exec("cp $src $dst");
  39.                 print "$src => $dst\n";
  40.         }
  41. }
  42. ?>
复制代码
发表于 2008-2-3 19:14:17 | 显示全部楼层
Server 兄有几个疑问:

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

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

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

请 Server 兄解说一下,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 可用,经过反复试验,我觉得作为一个发行版所需要的命令应该有:

  1. /usr/sbin/chroot
  2. /sbin/mkswap
  3. /bin/bzip2
  4. /bin/cat
  5. /bin/echo
  6. /bin/tar
  7. /sbin/fdisk
  8. /bin/rm
  9. /bin/grep
  10. /bin/mountpoint
  11. /bin/stty
  12. /bin/bash
  13. /bin/ls
  14. /bin/mount
  15. /bin/umount
  16. /bin/cp
  17. /sbin/udevd
  18. /sbin/udevtrigger
  19. /sbin/udevsettle
  20. /sbin/mkfs
  21. /sbin/mkfs.ext2
  22. /sbin/mkfs.ext3
复制代码

(我把他们放到 lddfiles.dat 里)

并且需要这些命令所依赖的库
怎么知道需要什么库呢?需要运行:
ldd xxxx
比如 ldd /bin/bash 结果是这样:

  1. root@lfs:/livecd# ldd /bin/bash
  2.         linux-gate.so.1 =>  (0xffffe000)
  3.         libreadline.so.5 => /lib/libreadline.so.5 (0xb7f85000)
  4.         libhistory.so.5 => /lib/libhistory.so.5 (0xb7f7e000)
  5.         libncursesw.so.5 => /lib/libncursesw.so.5 (0xb7f31000)
  6.         libdl.so.2 => /lib/libdl.so.2 (0xb7f2d000)
  7.         libc.so.6 => /lib/libc.so.6 (0xb7e02000)
  8.         /lib/ld-linux.so.2 (0xb7fb6000)
  9. 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 之



这是运行我那个脚本的输出,效果是复制 => 左边的文件到 => 右边位置,目录不存在时自动创建:

  1. lddfiles:
  2. /usr/sbin/chroot => /livecd/initrd/usr/sbin/chroot
  3. /sbin/mkswap => /livecd/initrd/sbin/mkswap
  4. /bin/bzip2 => /livecd/initrd/bin/bzip2
  5. /bin/cat => /livecd/initrd/bin/cat
  6. /bin/echo => /livecd/initrd/bin/echo
  7. /bin/tar => /livecd/initrd/bin/tar
  8. /sbin/fdisk => /livecd/initrd/sbin/fdisk
  9. /bin/rm => /livecd/initrd/bin/rm
  10. /bin/grep => /livecd/initrd/bin/grep
  11. /bin/mountpoint => /livecd/initrd/bin/mountpoint
  12. /bin/stty => /livecd/initrd/bin/stty
  13. /bin/bash => /livecd/initrd/bin/bash
  14. /bin/ls => /livecd/initrd/bin/ls
  15. /bin/mount => /livecd/initrd/bin/mount
  16. /bin/umount => /livecd/initrd/bin/umount
  17. /bin/cp => /livecd/initrd/bin/cp
  18. /sbin/udevd => /livecd/initrd/sbin/udevd
  19. /sbin/udevtrigger => /livecd/initrd/sbin/udevtrigger
  20. /sbin/udevsettle => /livecd/initrd/sbin/udevsettle
  21. /sbin/mkfs => /livecd/initrd/sbin/mkfs
  22. /sbin/mkfs.ext2 => /livecd/initrd/sbin/mkfs.ext2
  23. /sbin/mkfs.ext3 => /livecd/initrd/sbin/mkfs.ext3

  24. lib files:
  25. /lib/libc.so.6 => /livecd/initrd/lib/libc.so.6
  26. /lib/ld-linux.so.2 => /livecd/initrd/lib/ld-linux.so.2
  27. /lib/libuuid.so.1 => /livecd/initrd/lib/libuuid.so.1
  28. /lib/libbz2.so.1.0 => /livecd/initrd/lib/libbz2.so.1.0
  29. /lib/librt.so.1 => /livecd/initrd/lib/librt.so.1
  30. /lib/libpthread.so.0 => /livecd/initrd/lib/libpthread.so.0
  31. /lib/libreadline.so.5 => /livecd/initrd/lib/libreadline.so.5
  32. /lib/libhistory.so.5 => /livecd/initrd/lib/libhistory.so.5
  33. /lib/libncursesw.so.5 => /livecd/initrd/lib/libncursesw.so.5
  34. /lib/libdl.so.2 => /livecd/initrd/lib/libdl.so.2
  35. /lib/libblkid.so.1 => /livecd/initrd/lib/libblkid.so.1
  36. /lib/libext2fs.so.2 => /livecd/initrd/lib/libext2fs.so.2
  37. /lib/libcom_err.so.2 => /livecd/initrd/lib/libcom_err.so.2
  38. /lib/libe2p.so.2 => /livecd/initrd/lib/libe2p.so.2
复制代码

-- cp 了所有 lddfiles.dat 里的命令以及所需的库



整个制作过程是一个循环:

  1. 生成 iso 并尝试启动
  2. 发现缺少某个命令
  3. 调整 lddfiles.dat
  4. 运行 php 脚本
复制代码



启动后就是附图样子

最后我认为此文应该加精,是精华贴 "LiveCD是这么产生的 " 的裸奔版(或scratch 版)
与其不同的是:他是编译安装需要的包,而我是直接从系统复制,所以我只需要4M

另外,加上 httpd 恐怕就是传说中 5M 的 apache 了(看了下httpd, 1.8M, 蛮大地说),有空我会试试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2008-2-3 22:27:12 | 显示全部楼层
支持精华 !
赞 !
回复 支持 反对

使用道具 举报

发表于 2008-2-4 07:56:09 | 显示全部楼层
Oh,不好意思看漏眼,没注意 echo "Hello, world!" 上面还有一句 rc

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

最後建议 Server 兄换个醒目一点的标题,方便日後兄弟们查找,谢谢分享 :cool:
回复 支持 反对

使用道具 举报

发表于 2008-2-4 09:44:58 | 显示全部楼层
贡献一个 perl 的,代替那个 php 的。
昨晚临时写的,比较仓促,有啥bug在这里说。@~@。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-4 13:17:42 | 显示全部楼层
谢谢大家,我会找时间好好整理一下。
回复 支持 反对

使用道具 举报

发表于 2008-2-4 14:30:35 | 显示全部楼层
另外,加上 httpd 恐怕就是传说中 5M 的 apache 了(看了下httpd, 1.8M, 蛮大地说),有空我会试试
幸 !
我也有些心痒痒了。
回复 支持 反对

使用道具 举报

发表于 2008-2-4 15:34:07 | 显示全部楼层
Post by 晨想;1814065
贡献一个 perl 的,代替那个 php 的。
昨晚临时写的,比较仓促,有啥bug在这里说。@~@。
晨晨早该出招,先下来学习学习。。。
回复 支持 反对

使用道具 举报

发表于 2008-2-4 20:04:09 | 显示全部楼层
幸亏偶写了 comment,不然你就有的享受了。嘿嘿。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表