qemu linux kernel & vmware linux kernel
2016-08-04 15:19
1251 查看
一)qemu linux
1.制作启动img
1)dd if=/dev/zero of=./busybox.img bs=1M count=32(这个可以自己设定)
2)mkfs.ext3 busybox.img
3)下载busybox,http://www.busybox.net/downloads/
#tar jxvf busybox-1.18.0.tar.bz2 (解压busybox压缩包)
#cd busybox-1.18.0 (进入到解压后的busybox源码目录)
#make menuconfig (配置busybox)
注意配置时,一定要选择静态链接选项,该选项位于:
Busybox Settings –> Build Options –> Build Busybox as a static binary
#yum install libselinux-static libsepol-static glibc-static(具体根据系统可能还需要其它的包,这是我的系统中需要安装的几个包,是链接busybox所需要的)
接下来,我们安装busybox
#make install (busybox默认安装到了其源码树目录的名字为_install的目录中)
4)制作启动img
在busybox源码目录
cp -a ./_install/* /mnt/disk/
sudo cp -a ./examples/bootfloppy/etc /mnt/disk
sudo mkdir /mnt/disk/dev
sudo mkdir /mnt/disk/proc
sudo mkdir /mnt/disk/etc
sudo cp -ar ./examples/bootfloppy/etc /mnt/disk/etc
sudo cp -a /dev/zero /mnt/disk/dev/
sudo cp -a /dev/console /mnt/disk/dev/
sudo cp -a /dev/null /mnt/disk/dev/
sudo cp -a /dev/tty* /mnt/disk/dev/
sudo cp -a /dev/ttyS0 /mnt/disk/dev/
2.编译内核(qemu模拟x86_64)
1)下载linux内核源码(https://www.kernel.org)
在linux内核源码目录(以3.5.0为例)
make mrproper
make localmodconfig(使用本机x64编译模块config)
make menuconfig(选择qemu需要编译网卡驱动,RealTek,8139cp,否则系统跑起来无网卡,这个问题调试一周,是根据本机的/boot下vmlinuz,和initrid对比才知道需要加载这个模块)
make -j4(双核cpu,可以4线程编译)
make modules
make install
mkinitramfs -o /boot/initrd.img-3.5.0(核心版本号)
2)
得到/boot/vmlinuz-3.5.0,/boot/initrd.img-3.5.0
3.安装qemu,启动linux
1)启动linux脚本
#!/bin/sh
mount -o loop busybox.img /mnt/disk
LINUX=$(find linux* -maxdepth 0)
#启动qemu
if [ $# = 0 ] ; then
qemu-system-x86_64 -kernel bzImage -hda ./busybox.img -initrd initrd.img -append "root=/dev/sda console=ttyS0" -nographic -net nic,vlan=0 -net tap,ifname=tap0,script=/etc/qemu-ifup,vlan=0 -net user
fi
if [ "$1" = "s" ] ; then
qemu-system-x86_64 -s -S -kernel bzImage -hda ./busybox.img -initrd initrd.img -append "root=/dev/sda console=ttyS0" -nographic -net nic,vlan=0 -net tap,ifname=tap0,script=/etc/qemu-ifup,vlan=0
fi
其中busybox.img为busybox生成的文件系统;bzImage 为/boot/vmlinuz-3.5.0;initrd.img 为/boot/initrd.img-3.5.0;console=ttyS0" -nographic这个是为命令行启动,而非新
界面启动,对于调试获取信息很方便;
/etc/qemu-ifup:
#!/bin/bash
#!/bin/bash
ifconfig $1 192.168.0.10 netmask 255.255.255.0 up
iptables -t nat -A POSTROUTING -s 192.168.0.10/255.255.255.0 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.11/255.255.255.0 -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward//支持转发,让虚拟机可以上外网
2)网络配置
配置了eth0的ip,但是无法ping通设置ip;是由于lo接口ip未设置导致,设置ifconfig lo 127.0.0.1即可
虚拟机启动img,网络配置,/etc/init.d/rcS
mount -n -t proc none /proc
mount -n -t sysfs none /sys
mdev -s
/bin/mount -a
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.0.11 netmask 255.255.255.0
route add default gw 192.168.0.10
4.如何向busybox中添加新命令;
参考:http://blog.csdn.net/flexman09/article/details/51792563
gdb问题:
1)下载gdb7.7,http://ftp.gnu.org/gnu/gdb/
2)到gdb源码目录,vim gdb/remote.c
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
改成:
if (buf_len > 2 * rsa->sizeof_g_packet) {
rsa->sizeof_g_packet = buf_len ;
for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
if (rsa->regs[i].pnum == -1)
continue;
if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
3)重新编译安装gdb:
./configure --prefix=/usr/local/mygdb
make && make install
4)使用新gdb:
/usr/local/mygdb/bin/gdb vmlinux
二)vmware linux
1.编译linux 核心和intrid
如果只是测试更新的核心,编译以后可以通过update-grub2来更新grub来加载,如果grub不显示加载memu,参考:http://www.2cto.com/os/201306/217198.html,来显示menu;
2.划分一个分区放文件系统;编译busybox ,拷贝到新分区
3.修改grub;/boot/grub/grub.cfg
menuentry 'test linux busybox ' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-24-generic-recovery-65626a50-6202-4941-81bd-b587e4d5bff7' {
recordfail
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 65626a50-6202-4941-81bd-b587e4d5bff7
else
search --no-floppy --fs-uuid --set=root 65626a50-6202-4941-81bd-b587e4d5bff7
fi
echo '载入 Linux 3.13.0-24-generic ...'
linux /boot/vmlinuz-4.7.0 root=/dev/sda2 ro recovery nomodeset locale=zh_CN
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.7.0
}
root=/dev/sda2;表示根文件系统所在分区;
set root='hd0,msdos1'//设置载入的intrid和vmlinuz所在的分区
linux /boot/vmlinuz-4.7.0 指定核心
initrd /boot/initrd.img-4.7.0 指定intrid
三、qemu openwrt
https://wiki.openwrt.org/doc/howto/qemu?s[]=qemu
1.制作启动img
1)dd if=/dev/zero of=./busybox.img bs=1M count=32(这个可以自己设定)
2)mkfs.ext3 busybox.img
3)下载busybox,http://www.busybox.net/downloads/
#tar jxvf busybox-1.18.0.tar.bz2 (解压busybox压缩包)
#cd busybox-1.18.0 (进入到解压后的busybox源码目录)
#make menuconfig (配置busybox)
注意配置时,一定要选择静态链接选项,该选项位于:
Busybox Settings –> Build Options –> Build Busybox as a static binary
#yum install libselinux-static libsepol-static glibc-static(具体根据系统可能还需要其它的包,这是我的系统中需要安装的几个包,是链接busybox所需要的)
接下来,我们安装busybox
#make install (busybox默认安装到了其源码树目录的名字为_install的目录中)
4)制作启动img
在busybox源码目录
mount -o loop busybox.img /mnt/disk/
cp -a ./_install/* /mnt/disk/
sudo cp -a ./examples/bootfloppy/etc /mnt/disk
sudo mkdir /mnt/disk/dev
sudo mkdir /mnt/disk/proc
sudo mkdir /mnt/disk/etc
sudo cp -ar ./examples/bootfloppy/etc /mnt/disk/etc
sudo cp -a /dev/zero /mnt/disk/dev/
sudo cp -a /dev/console /mnt/disk/dev/
sudo cp -a /dev/null /mnt/disk/dev/
sudo cp -a /dev/tty* /mnt/disk/dev/
sudo cp -a /dev/ttyS0 /mnt/disk/dev/
2.编译内核(qemu模拟x86_64)
1)下载linux内核源码(https://www.kernel.org)
在linux内核源码目录(以3.5.0为例)
make mrproper
make localmodconfig(使用本机x64编译模块config)
make menuconfig(选择qemu需要编译网卡驱动,RealTek,8139cp,否则系统跑起来无网卡,这个问题调试一周,是根据本机的/boot下vmlinuz,和initrid对比才知道需要加载这个模块)
make -j4(双核cpu,可以4线程编译)
make modules
make install
mkinitramfs -o /boot/initrd.img-3.5.0(核心版本号)
2)
得到/boot/vmlinuz-3.5.0,/boot/initrd.img-3.5.0
3.安装qemu,启动linux
1)启动linux脚本
#!/bin/sh
mount -o loop busybox.img /mnt/disk
LINUX=$(find linux* -maxdepth 0)
#启动qemu
if [ $# = 0 ] ; then
qemu-system-x86_64 -kernel bzImage -hda ./busybox.img -initrd initrd.img -append "root=/dev/sda console=ttyS0" -nographic -net nic,vlan=0 -net tap,ifname=tap0,script=/etc/qemu-ifup,vlan=0 -net user
fi
if [ "$1" = "s" ] ; then
qemu-system-x86_64 -s -S -kernel bzImage -hda ./busybox.img -initrd initrd.img -append "root=/dev/sda console=ttyS0" -nographic -net nic,vlan=0 -net tap,ifname=tap0,script=/etc/qemu-ifup,vlan=0
fi
其中busybox.img为busybox生成的文件系统;bzImage 为/boot/vmlinuz-3.5.0;initrd.img 为/boot/initrd.img-3.5.0;console=ttyS0" -nographic这个是为命令行启动,而非新
界面启动,对于调试获取信息很方便;
/etc/qemu-ifup:
#!/bin/bash
#!/bin/bash
ifconfig $1 192.168.0.10 netmask 255.255.255.0 up
iptables -t nat -A POSTROUTING -s 192.168.0.10/255.255.255.0 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.11/255.255.255.0 -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward//支持转发,让虚拟机可以上外网
2)网络配置
配置了eth0的ip,但是无法ping通设置ip;是由于lo接口ip未设置导致,设置ifconfig lo 127.0.0.1即可
虚拟机启动img,网络配置,/etc/init.d/rcS
mount -n -t proc none /proc
mount -n -t sysfs none /sys
mdev -s
/bin/mount -a
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.0.11 netmask 255.255.255.0
route add default gw 192.168.0.10
4.如何向busybox中添加新命令;
参考:http://blog.csdn.net/flexman09/article/details/51792563
gdb问题:
1)下载gdb7.7,http://ftp.gnu.org/gnu/gdb/
2)到gdb源码目录,vim gdb/remote.c
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
改成:
if (buf_len > 2 * rsa->sizeof_g_packet) {
rsa->sizeof_g_packet = buf_len ;
for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
if (rsa->regs[i].pnum == -1)
continue;
if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
3)重新编译安装gdb:
./configure --prefix=/usr/local/mygdb
make && make install
4)使用新gdb:
/usr/local/mygdb/bin/gdb vmlinux
二)vmware linux
1.编译linux 核心和intrid
如果只是测试更新的核心,编译以后可以通过update-grub2来更新grub来加载,如果grub不显示加载memu,参考:http://www.2cto.com/os/201306/217198.html,来显示menu;
2.划分一个分区放文件系统;编译busybox ,拷贝到新分区
3.修改grub;/boot/grub/grub.cfg
menuentry 'test linux busybox ' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-24-generic-recovery-65626a50-6202-4941-81bd-b587e4d5bff7' {
recordfail
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 65626a50-6202-4941-81bd-b587e4d5bff7
else
search --no-floppy --fs-uuid --set=root 65626a50-6202-4941-81bd-b587e4d5bff7
fi
echo '载入 Linux 3.13.0-24-generic ...'
linux /boot/vmlinuz-4.7.0 root=/dev/sda2 ro recovery nomodeset locale=zh_CN
echo '载入初始化内存盘...'
initrd /boot/initrd.img-4.7.0
}
root=/dev/sda2;表示根文件系统所在分区;
set root='hd0,msdos1'//设置载入的intrid和vmlinuz所在的分区
linux /boot/vmlinuz-4.7.0 指定核心
initrd /boot/initrd.img-4.7.0 指定intrid
三、qemu openwrt
https://wiki.openwrt.org/doc/howto/qemu?s[]=qemu
qemu-system-arm -M realview-pbx-a9 -m 1024M -nographic \ -kernel openwrt-realview-vmlinux.elf \ -sd openwrt-realview-sdcard.img \ -append "console=ttyAMA0 verbose debug root=/dev/mmcblk0p1"
相关文章推荐
- qemu-kvm virtio 虚拟化-----Linux客户机 virtio设备初始化 (基于Qemu2.0.0 & kernel 3.10.0)
- Debug a NIC driver in linux(kernel version 2.4.20-8) which running on VMware workstation version 4.5.2
- 在VMware上编译linux内核出现VFS: Cannot open root device "LABEL=/" or unknown-block(0,0) 错误的解决方法
- VMWARE 显示Unable to open kernel device "\\.\Global\vmx86" 的解决办法
- 『Linux & Oracle 优化』kernel 说明
- Linux Kernel & Distributions
- Linux kernel & module program
- VMware Workstation 中安装Redhat linux 9.0
- 解说Ubuntu10.10_64bit(Kernel 2.6.35) 下vmware 2.0.2 Server for linux 的安装
- VMWARE 7.14 ON LINUX KERNEL >=2.6.39 安装问题解决
- linux-kernel 3.5.3Tcp系统调用,源码分析2-sys_socket & sock_create
- Debug Linux Kernel with Qemu
- Roboard DM&P X-Linux 更新内核 kernel 2.6.35.7
- (zz)嵌入式linux调试(bootloader && kernel)
- Linux获得root权限(kernel>=2.6.39)
- Linux Kernel < 2.6.29 exit_notify() Local Privilege Escalation Exploit
- "android linux kernel" VS "standard linux kernel"
- VMware下Linux安装VMWare Tools 后无法启动图形界面,出现"no screens found" 的解决办法
- Debian / VMware Ubuntu linux install kernel headers package
- qemu调试 linux-kernel