启动 操作系统

2013-04-04 15:09:14 NoneKey 阅读数 16265

最近试读了《30天自制操作系统》的前两章,感觉很有意思。

但是发现里面写的系统都是用软盘启动的,现在在大多数电脑上已经看不见软驱了,所以如果想运行书中的操作系统只能通过qemu(随书光盘中已经附带)模拟运行。这样的话成就感就会少很多,感觉像是在做一个简单的控制台程序,相信大多数童鞋都希望能做出一个能在真机上运行,能秀出来的作品。那有没有方法通过U盘去启动书中“自制”的操作系统呢?我的思路就是通过利用U盘启动,然后虚拟软驱去启动img文件(软盘映像),这样原书的代码无需任何修改就可以“移植”到U盘上来,通过学习书中的内容,来定制自己的专属操作系统!

同样以下方法也适用于用U盘启动任何基于软驱的操作系统,例如MS-DOS。

需要以下4种的工具:

HPUSBFW

所用版本:HP优盘格式化工具HPUSBFW+2.20.exe

grubinst_gui

所用版本:grubinst-1.1-bin-w32-2008-01-01

grub4dos

所用版本:grub4dos-0.4.4-2009-01-11

Defraggler

所用版本:Defraggler_2.13.670

下载地址请自行百度

或者从此处下载,我已经把四个工具打包上传

点击打开链接


GRUB是一个多操作系统启动程序,我们利用这个工具来自制我们U盘启动盘,然后去启动对应的软驱映像文件。

1、使用HPUSBFW格式化U盘

注意:格式化U盘会造成U盘所有数据丢失!请备份好重要文件!

在设备一栏选择对应的U盘,千万不要选错!



文件系统就选择FAT32吧,勾选快速格式化,点击开始。



U盘所有数据将被清空,到此HPUSBFW的使命就结束了。

2、安装grub到U盘

解压grubinst-1.1-bin-w32-2008-01-01,运行grubinst_gui.exe



勾选如上图所示,注意磁盘的选择,选择的是你的U盘,由于选择的是磁盘,所以不显示盘符,如果你的电脑有多块硬盘或者插了多个U盘之类的,请注意区分!

点击安装



成功的话如上图所示。

然后解压grub4dos-0.4.4-2009-01-11,拷贝三个文件到U盘根目录



至此grub安装完毕!

3、配置grub

menu.lst是grub的配置文件,通过grub我们可以在开机的时候在多个操作系统中选择,现在我们需要配置menu.lst以启动自制的操作系统!

复制对应的img到U盘,此处以随书光盘下的projects\30_day\harib27f\haribote.img为例

如下图,复制到U盘根目录下


用文本编辑器打开menu.lst,可以看见一些示例配置,其中有一项示例就是启动img映像文件



下面修改menu.lst,我们不使用grub的选项功能,直接启动自制系统(menu.lst的更多配置可以自行百度)

map --mem (hd0,0)/haribote.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)


红色的地方就是.img文件的路径

其实到这里已经差不多快完成了,但是grub启动img有一个小小的限制,就对应的映像文件的物理上必须连续,也就是说没有碎片,不过软盘的映像文件只有1.4MB大小,直接复制进去几乎不可能产生碎片!但是为了以防万一,我们还是要用磁盘整理工具防止.img文件有碎片,这里使用的磁盘整理工具是Defraggler,它可以针对某个文件整理,正好对应了我们的需求。顺带说一句,Defraggler是一款很优秀的磁盘整理工具,如果你忍受不了windows下自带的磁盘整理工具的速度的话,可以试试这个。

打开Defraggler,选择Action->Defrag File,选择U盘下对应的.img文件,点击OK即可


至此我们的自制系统的U盘启动盘就制作完成了!

grub功能很强大,通过配置可以启动各种操作系统,有兴趣的童鞋可以定制自己的U盘启动盘。


接下来就要真机运行一下,要在bios里把U盘设置为第一启动盘

进入bios并设置的方法每个主板都不太一样,请参阅自己机器主板的说明或百度。


如果你暂时不想重启你的电脑只是想试试你的U盘自制系统是否work,可以用VMware配置虚拟机测试,注意在创建虚拟机是要把虚拟机的硬盘配置成物理驱动,选择成制作好的U盘,配置下bios启动顺序即可。

show一下真机运行效果:


《30天自制操作系统》我只试读了前两章,还不知道这个系统怎么用(尴尬),只运行了下bball,好像是用线条画出一个球的图像示例程序。

2012-11-22 19:03:33 sweetsoft 阅读数 31210

安装完windows8 后开始安装sql2012,安装过程中停在“正在启动操作系统功能"NetFx3"”不动了,很是着急,于是上网查了一下资料,原来NetFx3指的是Framework3.5,

于是从微软官方下载了framework 3.5,安装完后,继续按照sql2012,顺利通过。

2016-06-19 12:30:17 Sub_lele 阅读数 9793

在已经安装了Windows10系统的情况下,用U盘安装Ubuntu 16.04双系统, 安装完以后只能进ubuntu

在grub系统选择界面,Windows10操作系统的选项都没有

昨天折腾了一天,试过进入grub命令行界面,输入root= (hd0,msdos1),或 set root = ... 都没有用!!!

解决办法 :

进入ubuntu系统,打开终端输入: sudo update-grub 

 重启,问题解决。


                                    
2008-01-27 21:46:00 pipi_zyp 阅读数 5642

当删除一个操作系统时,有的时候引导区不能自动修正,下面时我遇到的一个情况,然后处理的。

1、在命令行中输入:c:boot.ini。或者在c盘下寻找隐藏的系统文件boot.ini,右键“属性”,去掉只读的选项。用记事本打开该文件。
2、正常的是
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)/WINDOWS   //默认进入那个系统
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Microsoft Windows XP Home Edition" /noexecute=optin /fastdetect

或者
[Boot Loader]
Timeout=5
Default=multi(0)disk(0)rdisk(0)partition(1)/WINNT
[Operating Systems]
multi(0)disk(0)rdisk(0)partition(1)/WINNT="Microsoft Windows 2000 Server" /fastdetect

3、出现多个操作系统,把多余的行去掉,然后保存就可以了。
 

2018-11-09 06:32:25 jiangsgyx 阅读数 5385

Linux操作系统的启动过程一般分为四个阶段:

  • BIOS启动引导阶段;
  • GRUB启动引导阶段;
  • 内核阶段;
  • init初始化阶段。

BIOS启动引导阶段

系统上电开机后,主板BIOS运行POSTPower on self test)代码,检测系统外围一些设备(如:CPU、内存、显卡、I/O、键盘鼠标等),当设备检测通过后,系统开始启动自举程序,根据在BIOS中设置的启动顺序搜索启动驱动器(比如硬盘、光驱、网络服务器等),并获取第一个启动设备的代号,读取第一个启动设备的MBR的引导加载程序(即lilo、grub、spfdisk等)的启动信息,MBR中装载启动引导管理器(GRUB)并运行该启动引导管理。至此进入GRUB启动引导阶段。

GRUB启动引导阶段

主要操作是装载stage1,装载stage1.5,装载stage2

然后读取/boot/grub.conf文件显示启动菜单,装载所选的kernelinitrd文件到内存中。

BIOS通过下面两种方法之一来传递引导记录:

  • 将控制权传递给initial program loaderIPL),该程序安装在磁盘主引导记录(MBR)中  
  • 将控制权传递给initial program loaderIPL),该程序安装在磁盘分区的启动引导扇区中

上面两种方法比较后,无论上面的哪种情况中,IPL都是MBR的一部分,都需要MBR的参与。

IPLGRUB阶段的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);因为stage1没有文件系统识别能力,所以具有文件系统识别能力的stage1.5成为stage1stage2之间连接的桥梁,这样GRUB才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。

stage2对启动系统起关键作用,该部分提供了GRUB启动菜单和交互式的GRUBshell

启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生成。

在启动菜单中选择了kernel之后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中,最后GRUB初始化kernel启动代码,完成之后后续的引导权被移交给kernel

内核阶段

操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。

要想加载linux的核心就必须能识别linux的文件系统,核心文件一般会放在/boot/vmlinuz。

系统启动的控制权移交给kernelKernel会立即初始化系统中各设备并做相关配置工作,其中包括CPUI/O、存储设备等。

配置过程中进行设备驱动加载的时候,一部分设备的驱动编入Linux Kernel中,Kernel会调用这部分驱动初始化相关设备;另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrd中。

initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统时,会先访问initrd文件系统。

initrd中的内容打开来看,会发现有bindevetclibprocsyssysrootinit等文件(包含目录)。

initrd中的内容释放到rootfs(根文件系统)中后,Kernel会执行其中的init文件。

这个时候内核的控制权移交给init文件处理。

驱动加载后,会创建一个根设备,然后将根文件系统以只读的方式挂载。

这步结束后释放未使用内存并执行switch root,转换到真正的根上面去,同时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给 init 进程。

Init初始化阶段

在核心加载完成之后,系统就准备好了,等待程序的执行。整个linux系统中,第一个执行的程序就是“/sbin/init”。

具体步骤如下:

执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了;通过读取配置文件/etc/inittab确定启动后进入的运行级别,在选定运行级别后进入相应的“/etc/rc.d/rcX.d”目录中运行相应的服务内容,该目录下的内容全部都是以S或K开头的链接文件,这些链接文件都链接到“/etc/rc.d/init.d”目录下的各种shell脚本,通过执行这些shell脚本,完成了系统所有的启动任务,linux会启动终端或X-Window来等待用户登录。

Linux系统启动流程图及其相关文件

系统执行流程图