1.busybox的编译
方法: 用虚拟机的redhat9.0进行编译
版本: busybox-1.00 -->make menuconfig -->make -->make install
-
cong@msi:/work/os/rootfs/busybox/busybox-1.00$ readelf -a ./busybox | grep "NEEDED"
-
0x00000001 (NEEDED) Shared library: [libm.so.6] -->所以文件系统中需要包含这两个库libm与libcrypt,是可选的
-
0x00000001 (NEEDED) Shared library: [libcrypt.so.1]
- 0x00000001 (NEEDED) Shared library: [libc.so.6] -->libc库是最基础的任何程库就需要,是必需的
2. 内核的修改
-
init/main.c中L128
-
//int root_mountflags = MS_RDONLY;
- int root_mountflags = 0
其中这个root_mountflags会在mount_root-->read_super中设置/dev/hda1的属性为MS_RDONLY
3.etc目录下的文件
-
cong@msi:/work/os/rootfs/ext2/etc$ tree
-
.
-
├── fstab -->只需要fstab与rcS
-
├── init.d
-
│ └── rcS -->只需要rcS与rcS
- └── mtab -->这个文件是mount程序创建的本身不要文件系统中
-
cong@msi:/work/os/rootfs/ext2/etc$ cat fstab
- proc /proc proc defaults 0 0
-
cong@msi:/work/os/rootfs/ext2/etc$ cat init.d/rcS
-
#!/bin/sh
- mount -a
cong@msi:/work/os/rootfs/ext2$ cat creatext2.sh
-
-
#!/bin/sh
-
TOPDIR=`pwd`
-
create_fs()
-
{
-
echo "cong: next create fs"
-
#create filesystem
-
cd /tmp/ext2
-
-
#先创建系统目录
-
sudo mkdir -pv dev/ tmp/ sys/ proc/
-
sudo mknod ./dev/tty1 c 4 1
-
sudo mknod ./dev/console c 5 1
-
#sudo cp $TOPDIR/busybox ./bin/
-
#sudo cp $TOPDIR/src/hello ./bin/sh
-
sudo cp -arf $TOPDIR/lib ./
-
sudo cp -arf $TOPDIR/bin ./
-
sudo cp -arf $TOPDIR/sbin ./
-
sudo cp -arf $TOPDIR/etc ./
-
}
-
mount_fs()
-
{
-
echo "cong: next losetup /dev/loop0"
-
sudo losetup /dev/loop0 ./hdc.img
-
#512*2048=1048576
-
echo "cong: next losetup /dev/loop1"
-
sudo losetup -o 1048576 /dev/loop1 /dev/loop0
-
echo "cong: next show losetup all"
-
sudo losetup -a
-
-
echo "cong: next mount "
-
mkdir /tmp/ext2
-
sudo mount -t ext2 /dev/loop1 /tmp/ext2/
-
}
-
#fdisk hdc.img to ext2 83
-
make_fs()
-
{
-
#64M
-
dd if=/dev/zero of=./hdc.img bs=1M count=64
-
fdisk ./hdc.img <<EOF
-
n
-
p
-
1
-
2048
-
131071
-
t
-
83
-
w
-
EOF
-
sleep 1
-
fdisk -l ./hdc.img
-
-
echo "cong: next losetup /dev/loop0"
-
sudo losetup /dev/loop0 ./hdc.img
-
#512*2048=1048576
-
echo "cong: next losetup /dev/loop1"
-
sudo losetup -o 1048576 /dev/loop1 /dev/loop0
-
echo "cong: next show losetup all"
-
sudo losetup -a
-
-
echo "cong: next mkfs ext2 /dev/loop1"
-
sudo mkfs.ext2 /dev/loop1
-
-
echo "cong: next mount "
-
mkdir /tmp/ext2
-
sudo mount -t ext2 /dev/loop1 /tmp/ext2/
-
create_fs
-
}
-
umount_fs()
-
{
-
sudo umount /tmp/ext2
-
sudo losetup -d /dev/loop0
-
sudo losetup -d /dev/loop1
-
sudo losetup -a
-
}
-
-
clean_fs()
-
{
-
echo "cong: next umount /tmp/ext2"
-
sudo umount /tmp/ext2
-
echo "cong: next rm -rf /tmp/ext2"
-
sudo rm -rf /tmp/ext2
-
echo "cong: next losetup -d"
-
sudo losetup -d /dev/loop0
-
sudo losetup -d /dev/loop1
-
echo "cong: next show losetup"
-
sudo losetup -a
-
echo "cong: next rm -rf ./hdc.img"
-
rm -rf ./hdc.img
-
}
-
-
case "$1" in
-
fs)
-
make_fs
-
;;
-
clean)
-
clean_fs
-
;;
-
mount)
-
mount_fs
-
;;
-
umount)
-
umount_fs
-
;;
-
*)
-
make_fs
-
;;
- esac
-
cong@msi:/work/os/rootfs/ext2$ tree
-
.
-
├── bin -->会复制为根文件系统的bin目录
-
│ ├── busybox
-
│ ├── busybox_0.60.5
-
│ ├── cat -> busybox
-
│ ├── cp -> busybox
-
│ ├── df -> busybox
-
│ ├── dmesg -> busybox
-
│ ├── echo -> busybox
-
│ ├── grep -> busybox
-
│ ├── hostname -> busybox
-
│ ├── ln -> busybox
-
│ ├── ls -> busybox
-
│ ├── mkdir -> busybox
-
│ ├── mknod -> busybox
-
│ ├── mount -> busybox
-
│ ├── mv -> busybox
-
│ ├── netstat -> busybox
-
│ ├── ping -> busybox
-
│ ├── ps -> busybox
-
│ ├── pwd -> busybox
-
│ ├── rm -> busybox
-
│ ├── sh -> busybox
-
│ ├── sync -> busybox
-
│ ├── touch -> busybox
-
│ ├── umount -> busybox
-
│ └── vi -> busybox
- ├── creatext2.sh -->制作根文件系统的脚本
-
├── etc -->会复制为根文件系统的etc目录
-
│ ├── fstab
-
│ ├── init.d
-
│ │ └── rcS
-
│ └── mtab
-
├── lib -->会复制为根文件系统的lib目录
-
│ ├── ld-linux.so.2 //解释器
-
│ ├── libc-2.3.2.so //libc库,这是最基础的
-
│ ├── libcrypt-2.3.2.so //剩下的libcrypt与libm库单跑helloworld是不需要的
-
│ ├── libcrypt.so.1 -> libcrypt-2.3.2.so
-
│ ├── libc.so.6 -> libc-2.3.2.so //但这儿的busybox用到了,就添加上了
-
│ ├── libm-2.3.2.so
-
│ └── libm.so.6 -> libm-2.3.2.so
-
├── Makefile
-
├── sbin -->会复制为根文件系统的sbin目录
-
│ ├── ifconfig -> ../bin/busybox
-
│ ├── init -> ../bin/busybox
-
│ ├── insmod -> ../bin/busybox
-
│ ├── lsmod -> ../bin/busybox
-
│ ├── modprobe -> ../bin/busybox
-
│ └── rmmod -> ../bin/busybox
-
└── src -->一些测试程序的代码
-
├── as
-
│ ├── hello.s
-
│ └── Makefile
-
├── hello.c
-
├── Makefile
-
├── mycompile.sh
-
└── nasm
-
├── hello
-
├── hello.o
-
├── hello.s
-
├── hello.s_nasm
-
├── init.c_hello
-
└── Makefile
-
- 8 directories, 54 files

二.linux-2.6.24可用的文件系统
如果出现如下:
-
version glibc_2.7 not found -->说明需要更新libc的版本
-
-
cong@msi:/work/os/rootfs/ext3$ mv libc-2.3.2.so libc-2.3.2.so_bak
-
cong@msi:/work/os/rootfs/ext3$ rm libc.so.6
- cong@msi:/work/os/rootfs/ext3$ ln -s libc-2.9.so libc.so.6
如果出现如下:
-
/sbin/init: relocation error: /lib/libc.so.6: symbol _rtld_global_ro, version
-
GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference -->说明需要更新ld的版本
-
-
cong@msi:/work/os/rootfs/ext3/lib$ rm ld-linux.so.2
-
cong@msi:/work/os/rootfs/ext3/lib$ mv /tmp/ld-2.9.so .
- cong@msi:/work/os/rootfs/ext3/lib$ ln -s ld-2.9.so ld-linux.so.2