使用buildroot为jslinux创建root.bin

13 篇文章 0 订阅
环境
gcc 版本 4.8.5 centos 7.2.1511 (AltArch) 内核版本3.10.0-327.13.1 32位操作系统
buildroot版本buildroot-2016.02
########################

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

[b]1.jslinux.js里面有一行[/b]

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 <initfile>

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

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

[b]4.注意观察 /etc/fstab /etc/mtab /etc/inittab[/b]

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

[code]
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 中的包都考过去节省时间
[/code]
[color=red][b]注意:得到的rootfs.ext2不能超过4M,否则不能作为ram挂载[/b][/color]

yum install patch -y
#编译出错可能需要需要这个补丁(pthread.h找不到的问题,偶尔遇到)
../../../libgcc/generic-morestack-thread.c:41:21: fatal error: pthread.h: No such file or directory
#include <pthread.h>
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

[code]
mkdir tmp
mount -o loop rootfs.ext2 tmp
[/code]
需要改几个地方
sbin/init
改成:
[code]
---------------------------------
#!/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 >/dev/ttyS0 2>&1'

#done
echo "this will run /bin/sh"
exec /bin/sh
echo "linux start up ,hahahahah haoningge"
-----------------------------
[/code]
注意,/dev下的设备文件是由mdev -s生成的
/proc /sys需要挂载,
生成的/dev下面可能会缺需要的交互设备/dev/jsclipboard 和/dev/net/tun等去 jslinux上ls -l一下
没有的可以这样建立

[url]https://github.com/Pivosgroup/buildroot-linux-kernel/blob/master/Documentation/networking/tuntap.txt[/url]
[b]
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
[/b]

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

#如果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
[code]Ctrl-a x[/code]


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

使用qemu跑这个img的话:qemu不需要修改/sbin/init,是jslinux需要
[code]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[/code]
注意root=/dev/sda 为sda
因为rootfs.ext2大于4M,如果buildroot不编译pppd,可以达到2.1M,这样可以直接用
[code]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[/code]

而使用root=/dev/hda 会报错误
[img]http://dl2.iteye.com/upload/attachment/0117/3081/a9e9f0b2-31ab-3f3a-9b92-20b4d98a0ac1.png[/img]

使用sda后
正确结果
[img]http://dl2.iteye.com/upload/attachment/0117/3083/4c2a0e76-24d7-338e-adc0-768d15160182.png[/img]

只加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


最终结果为
[img]http://dl2.iteye.com/upload/attachment/0117/3186/8e46cfd5-2fb3-38d6-a24d-0647765edf5b.png[/img]


###################附加,如果是ubuntu上#####
----------ubuntu-----------
make menuconfig
apt-get install make gcc g++ libncurses5-dev unzip -y
[code]
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
[/code]

附加没用的信息
vim include/platform.h
#include <sys/resource.h>

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值