linux2.4.18----25.文件系统的构建

3020阅读 0评论2016-12-22 wangcong02345
分类:LINUX

一. 文件系统的构建
1.busybox的编译
方法: 用虚拟机的redhat9.0进行编译
版本: busybox-1.00  -->make menuconfig -->make -->make install 
  1. cong@msi:/work/os/rootfs/busybox/busybox-1.00$ readelf -a ./busybox | grep "NEEDED"
  2.  0x00000001 (NEEDED) Shared library: [libm.so.6]       -->所以文件系统中需要包含这两个库libm与libcrypt,是可选的
  3.  0x00000001 (NEEDED) Shared library: [libcrypt.so.1]    
  4.  0x00000001 (NEEDED) Shared library: [libc.so.6]       -->libc库是最基础的任何程库就需要,是必需的
不需要选择  []Build BusyBox as a static binary (no shared libs)   

2. 内核的修改
  1. init/main.c中L128
  2. //int root_mountflags = MS_RDONLY;
  3. int root_mountflags = 0
去掉根文件系统的只读属性,
其中这个root_mountflags会在mount_root-->read_super中设置/dev/hda1的属性为MS_RDONLY

3.etc目录下的文件
  1. cong@msi:/work/os/rootfs/ext2/etc$ tree
  2. .
  3. ├── fstab      -->只需要fstab与rcS
  4. ├── init.d
  5. │   └── rcS    -->只需要rcS与rcS
  6. └── mtab       -->这个文件是mount程序创建的本身不要文件系统
fstab的内容:挂载proc
  1. cong@msi:/work/os/rootfs/ext2/etc$ cat fstab
  2. proc /proc proc defaults 0 0
rcS的内容,mount all
  1. cong@msi:/work/os/rootfs/ext2/etc$ cat init.d/rcS
  2. #!/bin/sh
  3. mount -a
4. 制作根文件系统的脚本
cong@msi:/work/os/rootfs/ext2$ cat creatext2.sh 

  1. #!/bin/sh
  2. TOPDIR=`pwd`
  3. create_fs()
  4. {
  5.     echo "cong: next create fs"
  6.     #create filesystem
  7.     cd /tmp/ext2

  8.     #先创建系统目录
  9.     sudo mkdir -pv dev/ tmp/ sys/ proc/
  10.     sudo mknod ./dev/tty1 c 4 1
  11.     sudo mknod ./dev/console c 5 1
  12.     #sudo cp $TOPDIR/busybox ./bin/
  13.     #sudo cp $TOPDIR/src/hello ./bin/sh
  14.     sudo cp -arf $TOPDIR/lib ./
  15.     sudo cp -arf $TOPDIR/bin ./
  16.     sudo cp -arf $TOPDIR/sbin ./
  17.     sudo cp -arf $TOPDIR/etc ./
  18. }
  19. mount_fs()
  20. {
  21.     echo "cong: next losetup /dev/loop0"
  22.     sudo losetup /dev/loop0 ./hdc.img
  23.     #512*2048=1048576
  24.     echo "cong: next losetup /dev/loop1"
  25.     sudo losetup -o 1048576 /dev/loop1 /dev/loop0
  26.     echo "cong: next show losetup all"
  27.     sudo losetup -a

  28.     echo "cong: next mount "
  29.     mkdir /tmp/ext2
  30.     sudo mount -t ext2 /dev/loop1 /tmp/ext2/
  31. }
  32. #fdisk hdc.img to ext2 83
  33. make_fs()
  34. {
  35.     #64M
  36.     dd if=/dev/zero of=./hdc.img bs=1M count=64
  37.     fdisk ./hdc.img <<EOF
  38.     n
  39.     p
  40.     1
  41.     2048
  42.     131071
  43.     t
  44.     83
  45.     w
  46. EOF
  47.     sleep 1
  48.     fdisk -l ./hdc.img

  49.     echo "cong: next losetup /dev/loop0"
  50.     sudo losetup /dev/loop0 ./hdc.img
  51.     #512*2048=1048576
  52.     echo "cong: next losetup /dev/loop1"
  53.     sudo losetup -o 1048576 /dev/loop1 /dev/loop0
  54.     echo "cong: next show losetup all"
  55.     sudo losetup -a

  56.     echo "cong: next mkfs ext2 /dev/loop1"
  57.     sudo mkfs.ext2 /dev/loop1

  58.     echo "cong: next mount "
  59.     mkdir /tmp/ext2
  60.     sudo mount -t ext2 /dev/loop1 /tmp/ext2/
  61.     create_fs
  62. }
  63. umount_fs()
  64. {
  65.     sudo umount /tmp/ext2
  66.     sudo losetup -d /dev/loop0
  67.     sudo losetup -d /dev/loop1
  68.     sudo losetup -a
  69. }

  70. clean_fs()
  71. {
  72.     echo "cong: next umount /tmp/ext2"
  73.     sudo umount /tmp/ext2
  74.     echo "cong: next rm -rf /tmp/ext2"
  75.     sudo rm -rf /tmp/ext2
  76.     echo "cong: next losetup -d"
  77.     sudo losetup -d /dev/loop0
  78.     sudo losetup -d /dev/loop1
  79.     echo "cong: next show losetup"
  80.     sudo losetup -a
  81.     echo "cong: next rm -rf ./hdc.img"
  82.     rm -rf ./hdc.img
  83. }

  84. case "$1" in  
  85.     fs)
  86.         make_fs
  87.         ;;
  88.     clean)
  89.         clean_fs
  90.         ;;
  91.     mount)
  92.         mount_fs
  93.         ;;
  94.     umount)
  95.         umount_fs
  96.         ;;
  97.     *)
  98.         make_fs
  99.         ;;
  100. esac
5.用到的
  1. cong@msi:/work/os/rootfs/ext2$ tree
  2. .
  3. ├── bin                          -->会复制为根文件系统的bin目录
  4. │   ├── busybox
  5. │   ├── busybox_0.60.5
  6. │   ├── cat -> busybox
  7. │   ├── cp -> busybox
  8. │   ├── df -> busybox
  9. │   ├── dmesg -> busybox
  10. │   ├── echo -> busybox
  11. │   ├── grep -> busybox
  12. │   ├── hostname -> busybox
  13. │   ├── ln -> busybox
  14. │   ├── ls -> busybox
  15. │   ├── mkdir -> busybox
  16. │   ├── mknod -> busybox
  17. │   ├── mount -> busybox
  18. │   ├── mv -> busybox
  19. │   ├── netstat -> busybox
  20. │   ├── ping -> busybox
  21. │   ├── ps -> busybox
  22. │   ├── pwd -> busybox
  23. │   ├── rm -> busybox
  24. │   ├── sh -> busybox
  25. │   ├── sync -> busybox
  26. │   ├── touch -> busybox
  27. │   ├── umount -> busybox
  28. │   └── vi -> busybox
  29. ├── creatext2.sh               -->制作根文件系统的脚本
  30. ├── etc                        -->会复制为根文件系统的etc目录
  31. │   ├── fstab
  32. │   ├── init.d
  33. │   │   └── rcS
  34. │   └── mtab
  35. ├── lib                        -->会复制为根文件系统的lib目录
  36. │   ├── ld-linux.so.2          //解释器
  37. │   ├── libc-2.3.2.so          //libc库,这是最基础的
  38. │   ├── libcrypt-2.3.2.so      //剩下的libcrypt与libm库单跑helloworld是不需要的
  39. │   ├── libcrypt.so.1 -> libcrypt-2.3.2.so
  40. │   ├── libc.so.6 -> libc-2.3.2.so //但这儿的busybox用到了,就添加上了
  41. │   ├── libm-2.3.2.so
  42. │   └── libm.so.6 -> libm-2.3.2.so
  43. ├── Makefile
  44. ├── sbin                      -->会复制为根文件系统的sbin目录
  45. │   ├── ifconfig -> ../bin/busybox
  46. │   ├── init -> ../bin/busybox
  47. │   ├── insmod -> ../bin/busybox
  48. │   ├── lsmod -> ../bin/busybox
  49. │   ├── modprobe -> ../bin/busybox
  50. │   └── rmmod -> ../bin/busybox
  51. └── src                      -->一些测试程序的代码
  52.     ├── as
  53.     │   ├── hello.s
  54.     │   └── Makefile
  55.     ├── hello.c
  56.     ├── Makefile
  57.     ├── mycompile.sh
  58.     └── nasm
  59.         ├── hello
  60.         ├── hello.o
  61.         ├── hello.s
  62.         ├── hello.s_nasm
  63.         ├── init.c_hello
  64.         └── Makefile

  65. 8 directories, 54 files
5.1 所用到的文件打包
ext2.rar
(下载后改名为ext2.tar.gz)

二.linux-2.6.24可用的文件系统

如果出现如下:
  1. version glibc_2.7 not found -->说明需要更新libc的版本

  2. cong@msi:/work/os/rootfs/ext3$ mv libc-2.3.2.so libc-2.3.2.so_bak
  3. cong@msi:/work/os/rootfs/ext3$ rm libc.so.6
  4. cong@msi:/work/os/rootfs/ext3$ ln -s libc-2.9.so libc.so.6




如果出现如下:
  1. /sbin/init: relocation error: /lib/libc.so.6: symbol _rtld_global_ro, version
  2. GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference  -->说明需要更新ld的版本

  3. cong@msi:/work/os/rootfs/ext3/lib$ rm ld-linux.so.2
  4. cong@msi:/work/os/rootfs/ext3/lib$ mv /tmp/ld-2.9.so .
  5. cong@msi:/work/os/rootfs/ext3/lib$ ln -s ld-2.9.so ld-linux.so.2




上一篇:linux2.4.18----23.内核线程
下一篇:linux2.4.18----26.由内核态切换到用户态