Bochs,发音同box,是我非常喜欢的虚拟机,灵活易用方便配置,功能极强,用来调试Linux内核是非常合适的。这篇博文主要讲解如何建立硬盘镜像,并且将Grub安装上去,最后的结果就是bochs启动后能进入到grub引导界面。下一篇文章再讲解如何在镜像上安装Linux内核。
硬盘基础知识
硬盘的专业术语中有:柱面,磁头,扇区,每磁道扇区数这几个概念。
- 每个盘片有两个磁头,分别位于两面上,从0开始依次编号,英语中称为Heads,汉语中一般翻译为0面、1面……一般来说硬盘有16个盘面(磁头)
- 每个面都有很多同心圆轨道称为磁道,从外向内依此编号为0道、1道……,英语中称为Tracks
- 所有盘面上半径相同的磁道正好组成一个圆柱面,称为柱面,和磁道编号相同,英语中称为Cylinders
- 每个磁道上划分出很多扇形区域,称为扇区,每个磁道上的扇区都从1开始编号,每个扇区512字节,英语中称为Sectors。一个磁道一般有63个扇区。
- 磁盘定位使用CHS,即柱面、磁头、扇区,或称为磁道、盘面、扇区。通常所说的0面0道1扇区指的就是第0面(第0号磁头)、第0磁道(柱面)、第1扇区。
- 一个需要注意的地方:每磁道扇区编号从1开始,全硬盘绝对扇区编号从0开始。
- 整块硬盘可以分为很多分区,每个分区可以格式化为不同的文件系统。每个分区的第1扇区(相对该分区开始来讲),叫做引导扇区(Boot Sector)。在全硬盘的第0扇区,也有一块引导扇区,为了以示区别,将之称为主引导扇区(Master Boot Sector,MBR)。MBR里面前446字节是引导程序,后面紧跟64字节的分区表,再加上2字节的引导标志正好是512字节。每个分区的分区表表项为16字节,整个分区表可以记录四个分区的信息,所以一块硬盘只能有4个主分区。引导扇区一共5个(4个分区的+1个MBR)
- 每个柱面的扇区数为:63×16,又因为每个扇区512字节,所以一个柱面共计63x16x512=516096B
制作空白硬盘镜像
我们制作一个50M左右的镜像,16个磁头,每磁道扇区数63,即一个柱面516096个字节,大约需要100个柱面。
dd if=/dev/zero of=hd.img bs=516096c count=100
if是输入,of是输出,516096c后面的字母c表示单位是1,即516096个字节,写入100次,每次516096个字节。 空白镜像制作完毕。
初始化磁盘并分区
fdisk -u -C100 -S63 -H16 hd.img
指定好柱面数、每磁道扇区数、磁头数。 这个命令的操作如下:
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x49b37849.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c').
Command (m for help): c #关闭DOS Compatibility flag,不关闭也没事
DOS Compatibility flag is not set
Command (m for help): n #新建分区
Command action
e extended
p primary partition (1-4)
p #类型为主分区
Partition number (1-4): 1 #该分区是第一个分区,实际上我们就建立这一个分区
First sector (1-100799, default 1): 63 #该分区从硬盘绝对第63扇区开始,留下前面的0-62扇区给grub等引导程序,这是DOS时代留下来的约定。
Last sector, +sectors or +size{K,M,G} (63-100799, default 100799): #直接回车,让该分区直至硬盘最后的扇区结束
Using default value 100799
Command (m for help): w #写入分区数据并退出
The partition table has been altered!
Syncing disks.
挂载硬盘镜像
losetup -o 32256 /dev/loop0 hd.img
-o 32256是跳过63×512=32256个字节再挂载,还记得第一分区是从硬盘镜像绝对第63扇区开始的吧,这一步就是跳过0-62分区,即跳过32256个字节,直接把第一分区挂载到loop0上。 这一步之所以不用mount是因为mount是用来挂载文件系统的,现在硬盘镜像第一分区里还没有文件系统。losetup命令用来将硬盘分区挂载到loop0设备上。
格式化文件系统
mkfs.ext3 /dev/loop0
将挂到loop0上的分区格式化为ext3文件系统
挂载文件系统
现在文件系统已经建立,是时候将之挂载了
mount -t ext3 /dev/loop0 /mnt
这命令我就不解释了,很简单。
建立boot和grub目录
mkdir -p /mnt/boot/grub
将当前系统上的grub程序文件复制进去,
cp /boot/grub/stage1 /boot/grub/stage2 /boot/grub/e2fs_stage1_5 /mnt/boot/grub/
这一步你也可以自己下载grub源码编译,编译完后也会出现stage1、stage2、e2fsstage15这几个文件,这是grub的核心程序,stage1待会儿会被放到MBR里,开机时BIOS会把MBR里的stage1取到内存里执行,之后stage1会取出stage2文件执行,然后是e2fsstage15。
我们这里不自己编译了,直接使用宿主系统CentOS 6.4的文件。
创建grub.conf文件
cp /boot/grub/grub.conf /mnt/boot/grub/
配置文件依然借用宿主系统CentOS 6.4的。
ln -s /mnt/boot/grub/grub.conf /mnt/boot/grub/menu.lst
这个软链接如果不建立,待会儿开机进入grub时不会出现启动项选择界面
卸载文件系统
umount /mnt/
卸载硬盘分区
losetup -d /dev/loop0
最终安装grub
grub --device-map=/dev/null
运行后依次输入下面的内容敲回车。
grub> device (hd0) hd.img
grub> geometry (hd0) 100 16 63 #柱面数、磁头数、每磁道扇区数
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
启动bochs
在bochs里设置好,然后启动就行了 应该会看到如下提示:
ata0 master: Generic 1234 ATA-6 Hard-Disk ( 49 MBytes)
Press F12 for boot menu.
Booting from Hard Disk...
failed to read image
Press any key to enter the menu
Booting CentOS (2.6.32-358.el6.i686) in 0 seconds...
Error 15: File not found
Press any key to continue...
这界面很正常,毕竟我们只装了grub,操作系统根本不存在,它能找到文件就怪了。按下任意键,就能看到grub启动项选择界面了。因为我们的grub程序文件和配置文件全部来自于宿主系统,所以这里看到的启动项也和宿主系统一样是CentOS 6.4,只不过这个启动项所指定的内核文件不存在而已。
这篇博文就写到这里,下一篇http://www.linuxidc.com/Linux/2016-11/137354.htm我们将内核镜像写入硬盘镜像,这样就能启动内核了,不过要想真正运行Linux系统还是很麻烦的,因为后面还要向硬盘镜像内写入文件系统里面的主要文件,比如/bin/sh之类的。
CentOS 6.0 源码 编译 安装 Bochs http://www.linuxidc.com/Linux/2012-12/76952.htm
openSUSE 安装Bochs 2.6 http://www.linuxidc.com/Linux/2012-11/75156.htm
Linux0.11 运行环境搭建以及调式–Bochs http://www.linuxidc.com/Linux/2012-11/73902.htm
Ubuntu 12.04安装带调试功能的Bochs http://www.linuxidc.com/Linux/2012-10/73251.htm
Ubuntu安装Bochs过程中遇到的问题及解决方法 http://www.linuxidc.com/Linux/2012-05/61422.htm
Ubuntu 14.04 LTS 安装和配置Bochs http://www.linuxidc.com/Linux/2016-10/135905.htm
Ubuntu上使用Bochs http://www.linuxidc.com/Linux/2016-10/135903.htm
使用bochs和gdb联合调试Linux内核 http://www.linuxidc.com/Linux/2016-11/137342.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137353.htm