QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3333|回复: 9

[求助] 如何制作内核磁盘镜像

[复制链接]
发表于 2008-11-2 18:15:59 | 显示全部楼层 |阅读模式
我想制作一个 内核磁盘镜像, 像下面的这个一样的
http://bellard.org/qemu/linux-0.2.img.bz2
请各位大侠指点一下思路, 而且要使磁盘镜像的根目录
挂在到这个磁盘的根目录。
像上面的链接一样的镜像就可以!
文件 linux-0.2.img.bz2 下载下来之后,
# bunzip2 linux-0.2.img.bz2
之后可以得到 linux-0.2.img
# mount -o loop linux-0.2.img /mnt
# ls /mnt/
可以看到这个镜像里面的内容!
文件 linux-0.2.img 是可以直接用qemu引导以来的, 命令是:
# qemu -hda linux-0.2.img
我就想学会如何制作这样一个镜像达到这样的效果, 要从内核源代码编译
到完全可以引导的!

Any answer is appreciated, thanks a lot !
 楼主| 发表于 2008-12-8 14:58:18 | 显示全部楼层
我现在知道用下面的发行版可以很容易做出来了,
但是如何自己手动做, 还是不知道。
下面是网址。
www.openwrt.org
svn co https://svn.openwrt.org/openwrt/tags/kamikaze_7.09
然后编译就可以生成了。

[ 本帖最后由 nlcj 于 2008-12-8 15:01 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-12-9 16:31:56 | 显示全部楼层
论坛好冷清啊!
下面的是制作方法, 刚发现的。  ...
http://www.linux.org/docs/ldp/howto/Bootdisk-HOWTO/buildroot.html
回复

使用道具 举报

发表于 2008-12-9 19:50:52 | 显示全部楼层
现在都用 cpio 打包。里面就是一个最小化的 Linux 系统,/init 是内核即将执行的脚本。
2.4 用磁盘镜像。

这个 google 可以搜索到吧……
回复

使用道具 举报

 楼主| 发表于 2008-12-18 17:16:21 | 显示全部楼层
谢谢版主, 我会好好研究研究的!
回复

使用道具 举报

发表于 2008-12-19 10:47:25 | 显示全部楼层
我弄过一个 ML 的 Live 版 initrd 的启动脚本。你可以参考一下。
超级简单的实现 live 功能。里面的 init 脚本写的比较烂,不过应该可以替换成你自己的东西。
基本上,/init 可以是任何一个你想运行的东西。不过注意主进程(pid 为 1 )的线程一定不要没了,不然内核会认为是崩溃。很多系统底层的功能调用都要把 pid 传递过去,也就是运行程序命令要用 exec 。
回复

使用道具 举报

 楼主| 发表于 2008-12-23 09:31:15 | 显示全部楼层

多谢

原帖由 jiangtao9999 于 2008-12-19 10:47 发表
我弄过一个 ML 的 Live 版 initrd 的启动脚本。你可以参考一下。

版主说让我参考,为何不让我知道获取你写的脚本的方法呢?  
不过太感谢你的热心回答了, 我现在主要是通过linux的发行版 openwrt (www.openwrt.org)制作, 这是工作需要。
不过很想看一下你写的脚本阿! 我的电子邮件: [email protected]
多谢, 多谢!
回复

使用道具 举报

发表于 2008-12-23 19:05:22 | 显示全部楼层
init 文件内容,写的很垃圾的

  1. #!/bin/sh

  2. echo
  3. echo "Starting LiveUSB Initrd Script..."
  4. echo

  5. ############################# Define fn
  6. ############################# Get From Gentoo Install mini CD
  7. strlen() {
  8. eval echo "\${#${1}}"
  9. }

  10. parse_opt() {
  11. case "$1" in
  12. *\=*)
  13. local key_name="`echo "$1" | cut -f1 -d=`"
  14. local key_len=`strlen key_name`
  15. local value_start=$((key_len+2))
  16. echo "$1" | cut -c ${value_start}-
  17. ;;
  18. esac
  19. }

  20. ############################ Define fn END

  21. #mount necessary fs
  22. mount -n -t proc proc /proc
  23. mount -n -t sysfs sys /sys
  24. mount -n -o mode=0755 -t tmpfs tmpfs /dev

  25. # scan cmdline
  26. CMDLINE="`cat /proc/cmdline`"
  27. echo "Cmdline: ${CMDLINE}"
  28. echo
  29. # default var
  30. #  Live carrier
  31. ROOT_FS="/dev/sda1"
  32. #  root squashfs image
  33. ROOT_IMG="mgc.squ"
  34. #  root readonly
  35. ROOT_RO="-o ro"
  36. # scan pre-parameter in cmdline

  37. for x in ${CMDLINE}
  38. do
  39. case "${x}" in
  40. img\=*)
  41. ROOT_IMG=`parse_opt "${x}"`
  42. ;;

  43. root\=*)
  44. ROOT_FS=`parse_opt "${x}"`
  45. ;;

  46. shell)
  47. RUN_IN_SHELL=1
  48. ;;

  49. ntfs)
  50. MOUNT_NTFS=1
  51. ;;

  52. rwimg\=*)
  53. ROOT_RO=""
  54. RW_DEV="img"
  55. RW_FS=`parse_opt "${x}"`
  56. ;;
  57. rwdev\=*)
  58. ROOT_RO=""
  59. RW_DEV="dev"
  60. RW_FS=`parse_opt "${x}"`
  61. ;;
  62. esac
  63. done

  64. #mknod
  65. echo "* * * * * * * * *"
  66. echo "* Mknod..."
  67. mknod /dev/null c 1 3
  68. #mknod /dev/zero c 1 5
  69. #mknod /dev/systty c 4 0
  70. mknod /dev/tty c 5 0
  71. #mknod /dev/console c 5 1

  72. #insert kerne mod
  73. echo "* Insmod ..."
  74. #aufs
  75. insmod /lib/aufs.ko
  76. # squashfs with lzma compress
  77. insmod /lib/unlzma.ko
  78. insmod /lib/sqlzma.ko
  79. insmod /lib/squashfs.ko

  80. insmod /lib/ehci-hcd.ko
  81. insmod /lib/ohci-hcd.ko
  82. insmod /lib/uhci-hcd.ko

  83. # udev
  84. echo "* Start udev..."
  85. /bin/udevd &
  86. UDEVPID=$!
  87. echo "* udev deamon PID is $UDEVPID"

  88. # rescan devices
  89. echo "* Rescan device..."
  90. /bin/udevtrigger

  91. # sleep 5 sec is enough ?
  92. echo "* Wait udev scaning devices. Sleep 5 sec..."
  93. sleep 5

  94. #mkdir, which will be mounted
  95. mkdir -p /usbdisk
  96. mkdir -p /aufs
  97. mkdir -p /squashfs

  98. # mount fs
  99. if [ ${MOUNT_NTFS} ]
  100. then
  101. echo "* Mount root fs with ntfs-3g"
  102. insmod /lib/fuse.ko
  103. mount -t ntfs-3g ${ROOT_FS} /usbdisk ${ROOT_RO}
  104. else
  105. echo "* Mount root fs"
  106. mount -n -t auto ${ROOT_FS} /usbdisk ${ROOT_RO}
  107. fi

  108. # Mount rwfs
  109. case ${RW_DEV} in
  110. img)
  111. RW_OPT="-o loop"
  112. ;;
  113. dev)
  114. RW_OPT=""
  115. ;;
  116. *)
  117. RW_OPT="-t tmpfs"
  118. RW_FS="tmpfs"
  119. ;;
  120. esac
  121. echo "mount -n ${RW_OPT} /usbdisk/${RW_FS} /aufs"
  122. mount -n ${RW_OPT} /usbdisk/${RW_FS} /aufs

  123. # Mount fs..
  124. mount -n -t squashfs /usbdisk/${ROOT_IMG} /squashfs -o ro,loop

  125. mount -n -t aufs -o br:/aufs=rw:/squashfs=ro aufs /sysroot

  126. #mount -n -o bind /dev /sysroot/dev

  127. mkdir -p /sysroot/mnt/squashfs
  128. mount -n --move /squashfs /sysroot/mnt/squashfs
  129. mkdir -p /sysroot/mnt/usbdisk
  130. mount -n --move /usbdisk /sysroot/mnt/usbdisk


  131. mount -n --move /dev /sysroot/dev

  132. kill $UDEVPID

  133. umount /proc
  134. umount /sys

  135. # start a shell || start system in squashfs
  136. if [ $RUN_IN_SHELL ]
  137. then
  138. exec /bin/sh
  139. else
  140. exec /bin/switch_root /sysroot /sbin/init
  141. fi

  142. #umount /sysroot
  143. #umount /squashfs
  144. #umount /aufs
  145. #umount /usbdisk
  146. #umount /dev
复制代码
回复

使用道具 举报

发表于 2008-12-23 19:19:14 | 显示全部楼层
剩下的就是这个基本运行环境了。
我用的是 busybox 。他提供了大部分的命令。而且体积小,依赖的 so 也少(也可以让他静态编译而不依赖,不过容量会变大)。
/bin 里面放命令,busybox 支持的都作出连接(mount命令我用的是 ML 的,支持的功能多一些)。/lib 是需要的 .so 和 .ko
/etc 里面只有 udev 的配置文件。
这个 initrd 文件里面本身就是一个小的 Linux 程序环境。

之后在这个小文件系统的根上面
find ./ | cpio -H newc -o > ../xxxxx.cpio
就作成了一个 cpio 格式的镜像文件,普通 cramfs 的需要先制作一个 loopback 挂载的景象
我记得是先用 dd 生成一个需要体积的文件。
之后  mkfs.cramfs 来格式化这个文件(就像格式化一个分区一样,不过参数是这个文件)。
之后 -o loop 挂载这个文件,把这个小文件系统拷贝进去就行了。

最后在 gzip 压缩一下这个文件减小体积就行了,当然测试的时候不需要压缩。
回复

使用道具 举报

 楼主| 发表于 2008-12-30 09:27:17 | 显示全部楼层
谢谢版主共享, 写的很好啊! 从你的脚本和说明中受益很多!

[ 本帖最后由 nlcj 于 2008-12-30 09:33 编辑 ]
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 00:32 , Processed in 0.061440 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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