使用buildroot为jslinux创建root.bin

阅读更多
环境
gcc 版本 4.8.5 centos 7.2.1511 (AltArch) 内核版本3.10.0-327.13.1 32位操作系统
buildroot版本buildroot-2016.02
########################

使用buildroot生成jslinux的root.bin文件
由几个关键点:

1.jslinux.js里面有一行
pc.cpu.write_string(cmdline_addr, "console=ttyS0 root=/dev/ram0 rw init=/sbin/init notsc=1");

这里的sbin/init要改
默认可能会走/etc/init.d/rcS 等地方如果init改成rdinit按理可以指定其他地方的配置文件
编辑文件后需要chmod +x

2.需要/dev下面的设备文件,在init文件里面/sbin/mdev -s即可
如果缺少的手工mknod 创建

3.需要mount /sys和/proc文件系统

4.注意观察 /etc/fstab /etc/mtab /etc/inittab

5.使用initrd的时候,不能超过4M.
如果img文件大于4M,需要使用 ramdisk_size
这个qemu选项
#####################

make menuconfig
->Target options
-->Target Architecture 选i386 第三个选i686
->Filesystem images
-->ext2/3/4 variant (ext2 rev0) 选ext2
-->tar the root filesystem
-->Compression method(gzip) 选gzip
->build Option
-->libraries (shared only)
##->Toolchan
##-->C Libary(glibc) 不能用这个
->Target Package
-->Networking applications--> pppd iputils vtun socat等网络需要的工具 (这个最重要,不加这里,rootfs.ext2可以小于4M)

make

make会下一堆东西,
如果第二次编译,可以把buildroot-2016.02/dl 中的包都考过去节省时间

注意:得到的rootfs.ext2不能超过4M,否则不能作为ram挂载

yum install patch -y
#编译出错可能需要需要这个补丁(pthread.h找不到的问题,偶尔遇到)
../../../libgcc/generic-morestack-thread.c:41:21: fatal error: pthread.h: No such file or directory
#include
https://gcc.gnu.org/bugzilla/attachment.cgi?id=28902&action=edit
内容复制到mypatch
patch -p1 < mypatch
./output/build/host-gcc-final-4.9.3/libgcc/generic-morestack-thread.c
在把带pthread_t的函数全注释掉


生成rootfs.ext2

mkdir tmp
mount -o loop rootfs.ext2 tmp

需要改几个地方
sbin/init
改成:
---------------------------------
#!/bin/sh

echo "\n /sbin/init hello jslinux  sbin/init \n"
mount -t proc none /proc
mount -t sysfs none /sys

/sbin/mdev -s

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
export HOME=/root
export TERM=vt100

#mount -a

ifconfig lo 127.0.0.1

#sleep 2
# allow running DOS .COM executables with the small 'runcom' utility
#echo ':DOSCOM:E::com::/usr/bin/runcom:' > /proc/sys/fs/binfmt_misc/register

cd $HOME

stty -F /dev/ttyS0 rows 30

#show_boot_time

echo "Welcome to hahaha haoning JS/Linux"

#while /bin/true; do

 # echo "setsid sh ----->"
 # setsid sh -c 'exec sh /dev/ttyS0 2>&1'

#done
echo "this will run /bin/sh"
exec /bin/sh
echo "linux start up ,hahahahah haoningge"
-----------------------------

注意,/dev下的设备文件是由mdev -s生成的
/proc /sys需要挂载,
生成的/dev下面可能会缺需要的交互设备/dev/jsclipboard 和/dev/net/tun等去 jslinux上ls -l一下
没有的可以这样建立

https://github.com/Pivosgroup/buildroot-linux-kernel/blob/master/Documentation/networking/tuntap.txt

mknod -m 666 /dev/null c 1 3
mkdir /dev/net (if it doesn't exist already)
mknod /dev/net/tun c 10 200
mknode /dev/jsclipboard c 10 231
mknod /dev/ppp c 108 0


################
建立
/ppp_up
#---------------
#!/bin/sh
pppd /dev/ttyS1 noauth defaultroute usepeerdns
#-------------


#如果buildroot没有选net相关
#运行的时候可能会缺某些/lib下的库,不建议这样,最好编译
#ln -s libcrypt-1.0.12.so libcrypt.so.0
#ln -s libdl.so.1 libdl.so.0
#ln -s libc.so.1 libc.so.0

注意观察/etc/init.d/rcS 和网络相关的配置文件

把生成的rootfs.ext2覆盖到root.bin的位置即可
github上的两个工程可用
jsmodem和
jslinux-deobfuscated

退出qemu
Ctrl-a x



busybox的cpio的方式可以让qemu 的initrd方式运行
但是buildroot的不行,buildroot不加网络可以控制在4M以内,ram0方式是可以的,buildroot的直接放给 jslinux即可

使用qemu跑这个img的话:qemu不需要修改/sbin/init,是jslinux需要
qemu-system-i386 -kernel /root/jslinux/obj/linux-x86-basic/arch/i386/boot/bzImage -hda  rootfs.ext2 -append "console=ttyS0 root=/dev/sda rw init=/sbin/init notsc=1"  -nographic

注意root=/dev/sda 为sda
因为rootfs.ext2大于4M,如果buildroot不编译pppd,可以达到2.1M,这样可以直接用
qemu-system-i386 -kernel /root/jslinux/obj/linux-x86-basic/arch/i386/boot/bzImage -initrd  rootfs.ext2 -append "console=ttyS0 root=/dev/ram0 rw rdinit=/sbin/init notsc=1"  -nographic


而使用root=/dev/hda 会报错误
使用buildroot为jslinux创建root.bin_第1张图片

使用sda后
正确结果
使用buildroot为jslinux创建root.bin_第2张图片

只加pppd的,5.7M
1.jslinux-bellard
2.jslinux-network 支持
pc.cpu.write_string(cmdline_addr, "console=ttyS0 root=/dev/hda ro init=/sbin/init notsc=1");//zuichu haohsi 必须是ro,rw不行
3.jslinux-deobfuscated 需要加个参数 ramdisk_size=128000 支持超过4M的内存启动文件
pc.cpu.write_string(cmdline_addr, "console=ttyS0 root=/dev/ram0 rw init=/sbin/init notsc=1 ramdisk_size=128000");
4.jsmodem

##############QEMU BUILDROOT RAMDISK: IMAGE TOO BIG!########################
https://draskodraskovic.wordpress.com/2013/05/07/qemu-buildroot-ramdisk-image-too-big/
ramdisk_size` kernel argument has to be augmented.

Resolution :
drasko@Mali:~/buildroot/output/images$ qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.ext2 -append “ramdisk_size=128000”

References :
http://www.minimyth.org/forum/viewtopic.php?t=2594&f=5
http://linuxpmi.org/trac/wiki/Testing



最终结果为
使用buildroot为jslinux创建root.bin_第3张图片


###################附加,如果是ubuntu上#####
----------ubuntu-----------
make menuconfig
apt-get install make gcc g++ libncurses5-dev unzip -y
make menuconfig
->Target options
-->Target Architecture 选i386 第三个选i686
->Filesystem images
-->ext2/3/4 variant (ext2 rev0) 选ext2
-->tar the root filesystem
-->Compression method(gzip) 选gzip
->build Option
-->libraries (shared only)
##->Toolchan
##-->C Libary(glibc) 不能用这个
#->Target Package
#-->Networking applications--> pppd iputils vtun socat等网络需要的工具 (这个最重要)

make


附加没用的信息
vim include/platform.h
#include

BusyBox Settings->Network device->[]route
#####################################
重新编译内核

发现apache不能访问新的内核
stat vmlinux-2.6.20.bin
对比原来能跑的内核和新的内核
chcon -R -t httpd_sys_content_t vmlinux-2.6.20.bin
chcon -R -t httpd_sys_content_t vmlinux403.bin




http://stackoverflow.com/questions/17242403/linux-running-self-compiled-kernel-in-qemu-vfs-unable-to-mount-root-fs-on-unk

  • 使用buildroot为jslinux创建root.bin_第4张图片
  • 大小: 18.5 KB
  • 使用buildroot为jslinux创建root.bin_第5张图片
  • 大小: 73.1 KB
  • 使用buildroot为jslinux创建root.bin_第6张图片
  • 大小: 32.4 KB
  • 查看图片附件

你可能感兴趣的:(qemu,jslinux,buildroot)