环境
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]
这里的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
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