您的位置:首页 > 运维架构 > Linux

UML进行Linux内核调试 --1 环境搭建

2012-08-16 19:52 369 查看
1、下载内核版本:

linux-3.4.9.tar.bz2




2、解压编译,注意在配置的时候menuconfig或者xconfig等的时候不要去修改UML的关于cpu设置的配置

linux #make mrproper

linux #make mrproper ARCH=um
 
linux #make menuconfig ARCH=um
 
linux #make linux ARCH=um

linux #make modules ARCH=um 

linux #make modules_install ARCH=um




OK了,生成我们需要的内核了,而且支持调试了。

直接启动会有问题的,提示找不到root文件系统。这样我们用人家现成的。

去这里下载,一个文件系统,我的系统是RHEL 6.3,没有关系就下一个Centos的文件系统就可以了:

http://user-mode-linux.sourceforge.net/

这个网址里面有配置好的内核版本和编译好的文件系统。

可以去kernel.org下载源代码形式的内核版本呢,这里http://uml.devloop.org.uk/kernels.html他给出了一个config文件(记得选择一直的内核版本和config文件),复制过去,你直接到内核根目录下面去,执行这个命令:

make linux ARCH=um

图方便就直接下载二进制的内核版本就是了,但是我不使用人家的现成的,因为那样无法修改内核代码,只能trace流程:

http://uml.devloop.org.uk/kernels.html

文件系统呢,下载就是100m左右,解压后是1.6g左右。如果下载了文件系统,就不要像上面一样编译了,可以直接解压使用的。

http://fs.devloop.org.uk/

我下载的文件系统是CentOS6.x-x86-root_fs.bz2,解压,重命名为:root_fs即可

文件系统下载完了,就可以直接启动内核了:

[root@localhost linux-3.4.9]# ./vmlinux ubda=root_fs mem=256m

或者:
[root@localhost linux-3.4.9]# ./linux ubda=root_fs mem=256m

他会一直运行,知道提示输入用户名和密码,用户名初始为root,没有密码。

但是,这样也有问题,进入系统后,会一直提示:

modprobe: FATAL: Could not load /lib/modules/3.5.1/modules.dep: No such file or directory

modprobe: FATAL: Could not load /lib/modules/3.5.1/modules.dep: No such file or directory

modprobe: FATAL: Could not load /lib/modules/3.5.1/modules.dep: No such file or directory

这是因为我们从网上下载的现成的文件系统的lib的/lib/modules/路径下面没有我们刚才编译的内核的modules,所以需要把开始操作:linux #make modules_install ARCH=um 生成的文件夹拷贝到文件

系统映像里面去,路径就是host主机的/lib/modules/3.5.1。但是我不这么做,因为网上下载的文件太小,我觉得不够用,所以我自己做一个文件映像:

路径:/azuo
操作1,创建文件系统:
[root@localhost azuo]# dd if=/dev/zero of=disk.img bs=1000M count=10 
操作2,格式化为ext3格式:
mkfs.ext3  disk.img 
操作3,重命名:
mv disk.img root_fs
操作4,创建挂载文件夹,/azuo/mnt_fs
mkdir /azuo/mnt_fs
操作5,挂载root_fs到/azuo/mnt_fs:
cd /azuo;
mount -o loop root_fs mnt_fs
操作6: 
下载网上的已经做好的映像文件到路径/um_linux/,重命名为root_fs;
[root@localhost linux-3.5.1]# cd /um_linux/
[root@localhost um_linux]# dir
config  install.sh  kernel32-3.5.1  linux-3.5.1  linux-3.5.1.tar.bz2  root_fs
操作7,把这个root_fs挂载到/mnt:
mount -o loop root_fs /mnt
操作8,把挂载后的/mnt下面的所有东西都拷贝到/azuo/mnt_fs下去
[root@localhost um_linux]# cd /mnt
[root@localhost mnt]# dir
bin  boot  cgroup  dev  etc  home  lib  lost+found  media  mnt  opt 
proc  root  sbin  selinux  srv  sys  tmp  usr  var
[root@localhost mnt]# cp -r * /azuo/mnt_fs/
操作9,把宿主机host上面linux #make modules_install ARCH=um 生成的文件夹拷贝到/azuo/mnt_fs下去
[root@localhost modules]# cp -r /lib/modules/3.5.1 /azuo/mnt_fs/lib/modules/
操作10,卸载挂载的文件夹:
[root@localhost azuo]# umount mnt_fs/
[root@localhost azuo]# umount /mnt

然后我们试试看看这个文件系统好使不,到编译好的um格式的linux内核路径下去操作:

[root@localhost azuo]# cd /um_linux/linux-3.5.1
[root@localhost linux-3.5.1]# 
[root@localhost linux-3.5.1]# dir
arch     CREDITS        drivers   include  Kbuild   lib          Makefile         
modules.order   README          samples   sound       usr      vmlinux.o
block    crypto         firmware  init     Kconfig  linux        mm              
 Module.symvers  REPORTING-BUGS  scripts   System.map  virt
COPYING  Documentation  fs        ipc      kernel   MAINTAINERS  modules.builtin  net
 root_fs         security  tools       vmlinux
[root@localhost linux-3.5.1]# ./linux ubda=/azuo/root_fs mem=256m

实际效果如下,相当好使:

------------------------------

[root@localhost linux-3.5.1]# ./linux ubda=/azuo/root_fs mem=256m
Locating the bottom of the address space ... 0x0
Locating the top of the address space ... 0xc0000000
Core dump limits :
        soft - 0
        hard - NONE
Checking that ptrace can change system call numbers...OK
Checking syscall emulation patch for ptrace...OK
Checking advanced syscall emulation patch for ptrace...OK
Checking for tmpfs mount on /dev/shm...OK
Checking PROT_EXEC mmap in /dev/shm/...OK
Checking for the skas3 patch in the host:
  - /proc/mm...not found: No such file or directory
  - PTRACE_FAULTINFO...not found
  - PTRACE_LDT...not found
UML running in SKAS0 mode
Adding 12857344 bytes to physical memory to account for exec-shield gap
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 3.5.1 (root@localhost.localdomain) (gcc version 4.4.6 20120305 
(Red Hat 4.4.6-4) (GCC) ) #1 Fri Aug 17 08:52:02 CST 2012
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 68138
Kernel command line: ubda=/azuo/root_fs mem=256m root=98:0
PID hash table entries: 2048 (order: 1, 8192 bytes)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
allocated 549400 bytes of page_cgroup
please try 'cgroup_disable=memory' option if you don't want memory cgroups
Memory: 254248k available
NR_IRQS:15
Calibrating delay loop... 984.67 BogoMIPS (lpj=4923392)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
Initializing cgroup subsys cpuacct
Initializing cgroup subsys memory
Initializing cgroup subsys devices
Initializing cgroup subsys freezer
Checking for host processor cmov support...Yes
Checking that host ptys support output SIGIO...Yes
Checking that host ptys support SIGIO on close...No, enabling workaround
devtmpfs: initialized
Using 2.6 host AIO
NET: Registered protocol family 16
bio: create slab <bio-0> at 0
Switching to clocksource itimer
NET: Registered protocol family 2
IP route cache hash table entries: 4096 (order: 2, 16384 bytes)
TCP established hash table entries: 16384 (order: 5, 131072 bytes)
TCP bind hash table entries: 16384 (order: 6, 327680 bytes)
TCP: Hash tables configured (established 16384 bind 16384)
TCP: reno registered
UDP hash table entries: 256 (order: 1, 12288 bytes)
UDP-Lite hash table entries: 256 (order: 1, 12288 bytes)
NET: Registered protocol family 1
mconsole (version 2) initialized on /root/.uml/m30WOZ/mconsole
Checking host MADV_REMOVE support...OK
Host TLS support detected
Detected host type: i386 (GDT indexes 6 to 9)
Initializing RT-Tester: OK
VFS: Disk quotas dquot_6.5.2
Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
fuse init (API version 7.19)
msgmni has been set to 496
io scheduler noop registered
io scheduler deadline registered (default)
start plist test
end plist test
TCP: cubic registered
NET: Registered protocol family 17
Initialized stdio console driver
Console initialized on /dev/tty0
console [tty0] enabled
Initializing software serial port version 1
console [mc-1] enabled
 ubda: unknown partition table
kjournald starting.  Commit interval 5 seconds
EXT3-fs (ubda): mounted filesystem with ordered data mode
VFS: Mounted root (ext3 filesystem) readonly on device 98:0.
devtmpfs: mounted
cat: /proc/cmdline: No such file or directory
                Welcome to CentOS 
Starting udev: udev: starting version 147
udevd (306): /proc/306/oom_adj is deprecated, please use /proc/306/oom_score_adj instead.
line_ioctl: tty0: unknown ioctl: 0x541e
[  OK  ]
Setting hostname localhost.localdomain:  [  OK  ]
Setting up Logical Volume Management:   No volume groups found
[  OK  ]
Checking filesystems
Checking all file systems.
[  OK  ]
Remounting root filesystem in read-write mode:  EXT3-fs (ubda): using internal journal
[  OK  ]
Mounting local filesystems:  [  OK  ]
/etc/rc.d/rc.sysinit: line 596: plymouth: command not found
Enabling /etc/fstab swaps:  [  OK  ]
/etc/rc.d/rc.sysinit: line 661: plymouth: command not found
Entering non-interactive startup
FATAL: Module ipv6 not found.
Bringing up loopback interface:  [  OK  ]
Bringing up interface eth0:  Device eth0 does not seem to be present, delaying initialization.
[FAILED]
FATAL: Module ipv6 not found.
Mounting other filesystems:  [  OK  ]
Retrigger failed udev events[  OK  ]
cat: /proc/sys/crypto/fips_enabled: No such file or directory
/etc/rc3.d/S55sshd: line 50: [: too many arguments
Starting sshd: [  OK  ]

CentOS release 6.2 (Final)
Kernel 3.5.1 on an i686

localhost login: 

CentOS release 6.2 (Final)
Kernel 3.5.1 on an i686

localhost login: root
Last login: Thu Aug 16 20:44:48 on tty0
[root@localhost ~]# 

------------------------------

下面用gdb调试内核:

linux #gdb ./linux 
(gdb) handle SIGSEGV pass nostop noprint 
(gdb) handle SIGUSR1 pass nostop noprint 
(gdb) b main 
(gdb) run ubd0=root_fs mem=256m
记住上面的两个handle一定要输入的,要不系统会一直卡在启动的地方提示segment fault。

上面启动的都是自己编译的生成文件。下载的直接启动./kernel32-3.5.1(前提是kernel32-3.5.1是下载的文件)

注意:

补充1、我上面从官网下面下载的是centos 6.2的版本,但是2012 6 18日官网更新到了centos 6.3版本,这个版本根本起不来,只能配置官网编译好的内核使用,自己编译的是不行的。

只能自己拷贝自己主机host根目录下面的lib bin sbin过去到自己做的那个文件系统下面去就是了。

[root@zhoutianzuo mnt]# cp -r /lib /azuo/mnt
[root@zhoutianzuo mnt]# cp -r /bin /azuo/mnt
[root@zhoutianzuo mnt]# cp -r /sbin /azuo/mnt
[root@zhoutianzuo mnt]# cp -r /boot /azuo/mnt
[root@zhoutianzuo mnt]# cp -r /etc /azuo/mnt
[root@zhoutianzuo mnt]# cp -r /sys /azuo/mnt
[root@zhoutianzuo mnt]# cp -r /dev /azuo/mnt
[root@zhoutianzuo mnt]# mkdir /azuo/mnt/usr
[root@zhoutianzuo mnt]# cp -r /usr/bin /azuo/mnt/usr
[root@zhoutianzuo mnt]# cp -r /usr/sbin /azuo/mnt/usr
[root@zhoutianzuo mnt]# cp -r /usr/lib /azuo/mnt/usr
[root@zhoutianzuo mnt]# cp -r /usr/etc /azuo/mnt/usr




如果可以还是请使用官网发行是文件系统,拷贝到自己的文件系统,然后,把modules部分拷贝过去。

补充2、今天2012-8-19尝试了使用Centos 5.8,这个上面编译不了内核3.5.2这个版本,所以我尝试了2.6.35.13这个版本,但是这个版本要注意,一定要在编译的内核里面开启EXT4功能的支持。然后使用官网下载的文件系统版本,因为官网的文件系统是ext4格式的。.





补充3 今天换了虚拟机,Virtualbox 4.2.6,安装系统是CentOS 6.3,下面可以显示系统默认内核版本,

[root@BTazuo linux-2.6.39]# 
[root@BTazuo linux-2.6.39]# uname -a
Linux BTazuo 2.6.32-279.el6.i686 #1 SMP Fri Jun 22 10:59:55 UTC 2012 i686 i686 i386 GNU/Linux
[root@BTazuo linux-2.6.39]#

我这里尝试过3.5.1 3.4.9的内核版本都不行,可行的就是2.6.39.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: