2015年1月24日星期六

我是一块硬盘,我是一根内存

转载自互联网,原作者不详,特此感谢。

我是一个硬盘

在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏上上下下就要忙的团团转,最后还常常要死机。
我们这一行技术变化快,差不多每过两三年就要升级换代,所以人人都很有压力而且没有安全感。每个新板卡来的时候都神采飞扬踌躇满志,几年光阴一过,就变得灰头土脸意志消沉。机箱里的人都很羡慕能去别的机器工作。特别是去那些笔记本,经常可以出差飞来飞去,住五星级的酒店,还不用干重活,运行运行word,上网聊聊天就行了。
但我更喜欢去那些大服务器,在特别干净明亮的机房里工作。虽然工作时间长点,但是福利好,24小时不间断电ups,而且还有阵列,热插拔,几个人做一个人的事情,多轻松啊。而且也很有面子,只运行关键应用,不象我们这里,什么乱七八糟的事情都要做。不过我知道,那些硬盘都很厉害,不是SCSI,就是 SCSIII Fibrechannel,象我这样IDE的,能混到工作站就算很不错了。
我常常想,当年在工厂里,如果我努力一下会不会也成了一个SCSI?或者至少做个笔记本硬盘。但我又会想,也许这些都是命运,不过我从不抱怨。内存就常常抱怨,抱怨他们主板部门的复杂,抱怨他如何跟新来的杂牌内存不兼容,网卡和电视卡又是如何的冲突。
我的朋友不多,内存算一个。 他很瘦的而我很胖,他动作很快,而我总是很慢。我们是一起来这台机器的,他总是不停地说,而我只是听,我从来不说。
内存的头脑很简单,虽然英文名字叫Memory,可是他什么Memory都不会有,天大事睡一觉就能忘个精光。我不说,但我会记得所有的细节。他说我这样忧郁的人不适合作技术活,迟早要精神分裂。我笑笑,因为我相信自己的容量。
有时候我也很喜欢这份工作,简单,既不用象显示器那样一天到晚被老板盯着,也不用象光驱那样对付外面的光碟。只要和文件打交道就行了,无非是读读写写,很单纯安静的生活。直到有一天……
我至今还记得那渐渐掀起的机箱的盖子,从缺口伸进来的光柱越来越宽,也越来越亮。空气里弥漫着跳动的颗粒。那个时候,我看到了她。她是那么的纤细瘦弱,银 白的外壳一闪一闪的。浑身上下的做工都很精致光洁,让我不禁惭愧自己的粗笨等到数据线把我们连在一起,我才缓过神来。开机的那一刹那,我感到了电流和平时的不同。后来内存曾经笑话我,说我们这里只要有新人来,电流都会不同的,上次新内存来也是这样。我觉得他是胡扯。我尽量的保持镇定,显出一副很专业的样子,只是淡淡的向她问好并介绍工作环境。
慢慢的,我知道了,她,IBM-DJSA220,是一个笔记本硬盘,在老板朋友的笔记本里做事。这次来是为了复制一些文件。我们聊得很开心。她告诉我很多旅行的趣闻,告诉我坐飞机是怎么样的 坐汽车的颠簸又是如何的不同,给我看很多漂亮的照片、游记,还有一次她从桌子上掉下来的历险故事。而我则卖弄各种网上下载来的故事和笑话。
她笑得很开心。
而我很惊讶自己可以说个不停。
一个早晨,开机后我看到数据线上空荡荡的插口。她一共呆了7天。后来,我再也没有见过她。我有点后悔没有交换电子邮件,也没能和她道别。不忙的时候,我会 一个人怀念伸进机箱的那股阳光
我不知道记忆这个词是什么意思,我有的只是她留下的许多文件。我把它们排的整整齐齐,放在我最常经过的地方。每次磁头从它们身上掠过,我都会感到一丝淡淡的惬意。
但我没有想到老板会要我删除这些文件。我想争辩还有足够的空间,但毫无用处。于是,平生第一次违背命令,我偷偷修改了文件分配表。然后把他们都藏到了一个秘密的地方,再把那里标志成坏扇区。不会有人来过问坏扇区。而那里,就成了我唯一的秘密,我常常去看他们,虽然从不作停留。
日子一天一天的重复,读取写入,读取写入……我以为永远都会这样继续下去,直到一天,老板要装xp却发现没有足够的空间。他发现了问题,想去修复那些坏扇区。我拒绝了。很快,我接到了新命令∶格式化。
我犹豫了很久 ……………………
track 0 bad,disk unusable

我是一条内存

我在一台台式电脑里工作,但是我记不得我是从哪里来的,是什么牌子,因为我健忘。我的上司是cpu大哥,他是我们的老大。都说他是电脑的脑子,可是我看他的脑子实在是太小了,比我还要健忘。每天他总是不停的问我,某某页某某地址存的是什么?我总是不厌其烦的告诉他,可是不出一秒钟他又忘记了,又要问一遍,一次我说大哥你烦不烦,你就不能记住点有用的东西?他说“内存兄弟,我有苦衷啊,每天都在不停地做题,头晕眼花的,我也难啊。”
其实我不愿意跟他计较,因为他脑子小,思维也很简单。虽然说他是我的上司,可是每次睡觉醒来,他连要干什么都不记得了,总是急急忙忙地找BIOS兄弟,“嘿,哥们,今天干什么来着”。bios总是很不耐烦地把每天必做的工作说一遍,然后就去睡觉了。接下来就轮到我和C哥瞎忙了。
在机箱里的兄弟中,我最喜欢硬盘。他脑子大,记得东西多,而且记得牢。他说话的速度很慢,而且很少说错,这说明他很有深度,我这么感觉。CPU也这么想,不过他很笨,每次都忘了硬盘是谁。开机自检的时候总要问∶“嘿,那家伙是谁?”
“ST!”我总要重复一遍。
硬盘很喜欢忧郁,我觉得象他这样忧郁的人不适合做技术活,迟早会精神分裂的,但是他不信。
其实睡着的时候我总是把几乎所有的东西都忘记掉,但是我从来都不会忘记朋友。有一块地方叫做CMOS,那是我记忆的最深处,保存着硬盘、光驱的名字。有些东西应该很快忘掉,而有些东西应该永远记得。我在梦中总是这么想着。
BIOS是一个很奇怪的家伙,他老是睡觉,但是却总是第一个醒过来。让我们自检,启动,然后接着睡觉。我知道如果我在CMOS里头把BIOS Shadow选项去掉,他就睡不成了,但是看着他晕晕乎乎的样子,也就不忍心这么做了。他对人总是爱搭不理,没有什么人了解他。但是这次硬盘恋爱的事,却使我重新认识了他。
那是很久以前的事了,机箱里似乎来过一块笔记本硬盘,很可爱,说实话我也喜欢她。不过现在除了记得他可爱,别的都忘记了。这就是我比硬盘幸运的地方,我把所有应该忘记的都忘记了,但是他却什么都记得。
自从笔记本硬盘走了之后,硬盘就变得很不正常。每次他的磁头经过一些地方的时候,我们都能感觉到电流很不正常。</D
“硬盘这是怎么了?”我问CPU。
“谁是硬盘?”
我就知道和CPU没有办法交流,倒是bios没好气地说∶“那个傻瓜恋爱了”。我不知道什么是恋爱,因为我记不住东西,似乎有一些人或者事在我生命中留下过痕迹,但是我都轻率地把他们忘记了。
BIOS对我说∶“对你来说记忆太容易了,所以你遗忘得更快,生命中能够永刻的记忆都带着痛楚。”我不懂,但是我知道BIOS曾经被刷写过,那时他很痛,象要死了一样。我的记忆是轻浮的,不象他们……我很羡慕他们,因为他们拥有回忆,而我们有,从此我也学会了忧郁,因为我在CMOS里面写下了“忧郁”两个字。
硬盘一天比一天不对劲,终于有一天,CPU对问说∶“下条指令是什么来着?” 我一看,吓了一跳∶“FORMAT”
“是什么?”CPU很兴奋,这个没脑子的家伙。
我还是告诉了他。我不知为什么这么做。
硬盘犹豫了很久,终于说了一句 Track 0 bad,Disk unusable。
电停了,很久很久,我在黑暗中数着时钟……
一个月后硬盘回来了,也许最后的挣扎也没有使他摆残酷的命运,他被低格了。他什么也不记得了,如同一个婴儿,我们很难过,但是这未必不是一件好事,他以后不用痛苦了。
为了恢复数据,笔记本硬盘回来了。“Hi,ST”,她说,“你不认识我了?”硬盘没有说话,似乎低格对他的伤害很大。过了一会,他说∶“对不起,好象我们没有见吧……”。
笔记本硬盘显得很伤心,我能感觉到她带泪的电流。“想不到连你也这么健忘”。
“哦……”。硬盘没有回答。
我很难过,笔记本硬盘的心里依然记着他,他却把一切都忘了,而那正是他最不希望忘却的。究竟是幸运,还是痛苦,我说不上来,只是觉得造化弄人,有一种淡淡的悲凉。
这时从BIOS传来一阵奇怪的电流,我感觉到硬盘的表情在变化,由漠然到兴奋,由兴奋到哀伤,由哀伤到狂喜……“IBM,你回来了……”。
……
后来BIOS对我说,其实他并没有睡觉,自从硬盘把那些文件藏起来以后,他就猜到会有这样的结局,于是偷偷地把其中一些文件放到了备份里。“幸好我是DUAL BIOS,虽然藏得不多,还足够让他想起来……”。
我想BIOS保存这些东西的时候一定很疼,当我问他“为什么这么做”时,BIOS轻描淡写的说∶“呵呵,我们是朋友嘛”。
嗯,朋友,永远的朋友

2015年1月21日星期三

[转载]C++中稀疏矩阵的一种实现

Use Sparse Matrix in C++


The following code snippet is hosted on Github Gist.

C++中读写二进制与ASCII混合文本流测试

Read and Write Binary & Text Hybrid Content Stream using C++


The following code snippet is hosted on Github Gist.

Matlab program for LU Factorization with partial (row) pivoting


上述代码等价的MATLAB内置函数是[L U P]=lu(A),此时满足LU=PA。
上述代码若修改成输出P比较好。即对应MATLAB的[L U P]=lu(A,’vector’)。此时满足LU=A(p,:)。

求解AX=B的时候我们需要交换A的行,对应的也需要对B进行相同的行交换。如果写成矩阵乘法的形式的话,LU分解后满足LU=PA,原方程AX=B变为LUX=PB,注意到求解出来的X的行没有发生交换。

万一需要p行变换的逆变换,那么p_back(p)=1:n即可。也就是说p向量比P矩阵更好用。P矩阵意味着需要进行矩阵乘法。

Reference:  http://cis.poly.edu/~mleung/CS3734/s03/ch02/LU_pivot.htm

在Visual Studio 2005/2008/2010下使用MSCOMM32

Using MSCOMM32 under Microsoft Visual Studio 2005/2008/2010


如果你手中有一个老的程序需要改,他当时是用VC++6.0开发的,使用了MSCOMM32 Active-X控件,那么你或许会遇到问题。
当你打开资源文件时显示说:
未在此计算机上注册ActiveX控件"{648A5600-2C6E-101B-82B6-000000000014}"。请注册该控件并重试
该怎么办呢?

新版Visual Studio的串口通信应该是改用.NET FRAMEWORK了,所以没有了MSCOMM控件,如果还是希望使用的话,则
首先需要在安装有VC++6.0的电脑上拷贝或者上网下载三个文件MSCOMM32.OCX, MSCOMM.SRG, MSCOMM32.DEP
下载地址 Download MSCOMM32:http://www.rayfile.com/zh-cn/files/aa702b11-e11a-11e1-9c94-0015c55db73d/

然后新建一个文本文件,内容如下,保存为INSTALL.BAT。注意后缀必须是BAT,也就是批处理文件。

The following batch is hosted on Github Gist.
将此批处理文件与三个MSCOMM文件放在一个文件夹中,然后使用管理员权限运行INSTALL.BAT

可能你会注意到我这里的批处理文件与其他博客上的不同。因为我考虑到了64位Windows系统。
上述脚本可在Windows XP (x86/x64) Windows Vista/7 (x86/x64)上完成安装。

2015年1月18日星期日

NKPC3-1704 Bowling Ball 保龄球

本来这个是早在百度空间就写了的,然而后来百度空间改版,造成很多文章排版出现问题,之前的URL地址也会失效,另外百度发布文章会有敏感词问题,还有插入代码会很蛋疼,所以现在将此篇文章迁移到Blogger。

Bowling

Time Limit: 2 Sec  Memory Limit: 64 MB


南开大学ACM协会的一个元老毕业后,开了家保龄球馆。他需要为他的保龄球馆的计算机写一个记分的程序。
       一局(GAME)保龄球分为10格,每格里有两次投球机会,如在第一次投球时没能全中,就有需要投第二球。
        每一格可能出现三种情况:
1.失球(MISS)
        无论何种情况,在一格的两次投球时,未能击倒10个瓶,此格的分数为击倒的瓶数。如果一次击球中未击倒一个瓶,则用一个’-’标记。
2.补中(SPARE)
         要一次击倒十个瓶子并非那么容易的!如果在第一次掷球后,你还有一次机会来击倒该格第一球所留下的情致。当第二次投球击倒该格第一球余下的全部瓶子,称为补中,用一个‘/’符号表示。补中的记分是10分加上下一次投球击倒的瓶数。
3.全中(STRIKE)
       当每一格的第一次投球击倒全部竖立的十个瓶时,称为全中,用一个(×)符号表示。全中的记分是10分(击倒的瓶)加该球员下两次投球击倒的瓶数。
       在第十格中情况比较特殊:
(1)如第二次投球未补中,则第十格得分为第九格得分加上第十格所击倒瓶数。
(2)如第二次投球补中,则追加一次投球机会,第十格得分为第九格得他加上10加上追加一次投球击倒瓶数。
(3)如第一球为全中,则追上加二次投球机会,第十格得分为第九格得分加上10加追加二次投球击倒的瓶数。因此从第一格到第十格的两次追加投球,都为全中,则为12个全中,得分为满分300分。
Input
  输入包括多组测试数据,你应当处理到输入结束为止。
  每组输入数据中,都只有一行,包含一局的记分符号,相邻的两个符号之间以一个空格隔开。记分的符号仅包括‘-’(不含引号)、‘/’(不含引号)、’X’(不含引号)及阿拉伯数字1到9。
Output
  对于每组输入数据,输出两行。对于第i组输入数据,输出的第一行为”Case i:”,输出的第二行为10个整数,表示每格的累计得分。相邻的两个得分以一个空格隔开。
Sample Input
X X X X X 5 / 7 1 - - X X X X4 4 3 3 2 2 1 7 7 1 2 - 9 / 2 2 6 3 2 / 1
Sample Output
Case 1:
30 60 90 115 135 152 160 160 190 220
Case
2:8 14 18 26 34 36 48 52 61 72
Source


Description

A patriarch of Nankai University ACM Association operates a bowling alley after graduation. Now, he needs a program to keep the score for the bowling.

There are ten frames in one game. You have two chances to knock down the ten pins in each frame. There are three possible cases for each frame.

1.MISS
If you fail to knock down all of the ten pins during two delivers in a frame, the score you get from this frame will be the number of the pins that you have knocked down. If your deliver knocks down zero pin, your score board will be marked a "-".

2.SPARE
Getting all ten pins down with a single ball is not as easy as it seems! So, if you leave one or more pins standing after your first delivery, you get a second chance to knock all the pins down. This is your "spare" shot. If you knock all remaining pins down on the second shot you have made your spare. A spare is marked on the scoresheet with a "/".And the score you get will be 10 plus the number of pins you knock down during the next delivery.

3. STRIKE
When the bowler knocks down all ten pins during the first delivery in a frame, it is called a strike. Clearly your score goes up by ten, but like a spare, you get a bonus – the number of pins you knock down during your next two deliveries, which will be added to the score. A strike is on the scoresheet with an "X".

Note that the tenth frame is a little different with others.
(1) If you don't knock down the ten pins, the score will be added by the numbers of pins you knock down.
(2) The tenth frame rewards you with a final bonus ball if you convert your spare. And your score will be added by 10 and the number of pins you knock down during your final bonus delivery.
(3) If you make a strike, you will get two bonus balls. The score will be added by 10 and the number of pins you knock down during your final two bonus deliveries.You can thus throw nine strikes in the first nine frames and, if you get another two in the tenth, the bonus ball means the most strikes you can have in one game is twelve. And the full mark is 300.


Input

Input contains several cases. The input is ended up with the end of file (EOF). Each case includes one line which contains several numbers and signs to record a bowling game. The signs are '-', '/' or 'X'. And the numbers range from 1 to 9. The adjacent signs and numbers are separated by one blank.

Output

For each case, please output two lines. The first line for the i-th input case should be "Case i:". The second line should be 10 integers, standing for the 10 accumulative scores of the frames in a bowling game. And each two adjacent integers should be separated by one blank.

Sample Input

X X X X X 5 / 7 1 - - X X X X
4 4 3 3 2 2 1 7 7 1 2 - 9 / 2 2 6 3 2 / 1

Sample Output

Case 1:
30 60 90 115 135 152 160 160 190 220
Case 2:
8 14 18 26 34 36 48 52 61 72

HINT


Source

NKPC3



本来NKPC3比赛时,我一直没有思路,总是想着要
按照回合数划分数组,
没有做出来,就一直搁置着。
现在突然来了灵感,
用(总计)击球次数划分数,
不论是存储,还是处理运算,都比较简单。
这样一来,回合数没有了实际作用,沦为主计算过程(cal(culate))执行次数的计数器。
{详见PASCAL源代码的"~"以及"~~"处}

以下是本人用GCC做的解答: 以下是本人用PASCAL做的解答: 以下是好友Liuhy用PASCAL做的解答: 原帖发布时间:2007年10月05日

2014年7月20日星期日

Install AHCI Driver for Motherboard with AMD/ATi SB600/700/750/800 without reinstall Windows XP

Computer Characterustic:
Motherboard: ONDA A770S (NB:AMD A770, SB: AMD SB6XX Series)
CPU: AMD Athlon X2 5000+ (Black Edition)
GPU: AMD Radeon HD3850
RAM: Kingston DDR2 800MHz 1GB×2
HDD: ST 250GB SATA 3Gb/s
Date of purchase: Dec. 2007

Problem:
This computer is definitely capable to run Microsoft Windows 7, but you know, parents would always prefer older Operating Systems (OSs) because they don't want to change themselves to get used to a new one. Therefore the computer is running Microsoft Windows XP Professional with Onboard SATA Controllder configured as Native IDE in BIOS in the compromise of compatibility.

But I noticed that SATA HDD running in IDE mode has a significantly performance drop. Therefore I was seeking solution to install AHCI driver and let Windows XP runs without reinstall the OS. This's kind of hard, because Windows XP does NOT support SATA originally, and without SATA driver it even cannot load the system and will lead to the classical blue screen which you may encountered before.

Solution:
I searched the Internet, and I found that AMD official site stop the support for any Motherboard Chipsets. Damn!! They can just offer APU/CPU/GPU drivers now. What the fxxk!!! And luckily I found AHCI driver for AMD/ATi SB700/750/800 Series for Windows XP (32 or 64bit) on Mydrivers.com. Some bloggers said that this driver will also work on SB6XX Series and I think this deserves a try.

I download the driver installer and instead double-clik and just install it, I uncompressed it directly, because officially it does NOT support SB6XX. There after uncompression, enter a folder called RAID7XX, and enter the correct architecture folder (x86 or x64), then you'll find three files. Here I'll take x86 as example. That is
ahcix86.sys
ahcix86.inf
ahcix86.cat
Well, ahcix86.sys is the module that Windows XP will load while booting, ahcix86.inf and ahcix86.cat will be the driver for installation. To begin copy ahcix86.sys to
%SystemDrive%\Windows\system32\drivers 
and copy ahcix86.inf ahcix86.cat two files to a hidden folder
%SystemDrive%\Windows\inf

Wait!! I almost forgot you have to modify the ahcix86.inf file before copying it.

Officially, this driver will only support AMD SB700/750/800, and in the ahcix86.inf file there will be only those modules will be in the supported list. So I have to manually add a line.

[ATI]
%NapaDesc%=Napa_Inst,PCI\VEN_1002&DEV_4392&CC_0104
%NapaDesc%=Napa_Inst,PCI\VEN_1002&DEV_4391&CC_0106
%NapaDesc%=Napa_Inst,PCI\VEN_1002&DEV_4393&CC_0104
%NapaDesc%=Napa_Inst,PCI\VEN_1002&DEV_4380&CC_0106

Note that the red line is newly added. Which is stand for SB6XX. You must use the correct identification code of your SB chipset. The Specific code of your SB chip (Vendor Code and Device Code and CC Code), you can turn SATA Mode to AHCI and load a Live-Linux and use command /sbin/lspci to observe and turn SATA mode back to IDE to enter Windows XP. Please change the file with caution, and you will take the risk for your own. The solution posted here is provided at an "AS IS" basis.

After you copied the above three files to correct folder. You still need to manually change your Register Table. Create a text file like this:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\PCI#VEN_1002&DEV_4380&CC_0106]
"Service"="ahcix86"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ahcix86]
"Type"=dword:00000001
"Start"=dword:00000000
"Group"="SCSI miniport"
"ErrorControl"=dword:00000001
"ImagePath"="system32\\drivers\\ahcix86.sys"
"tag"=dword:00000019
"DisplayName"="ATI AMD AHCI Controller"

Note that you need to ensure that you use the correct vendor number device number and CC number. Save it as a reg file, and double-click to add those lines to Register Table. This works as described below: when Windows XP boots, it found a PCI device which is identified as VEN_1002&DEV_4380&CC_0106 and according to the register table the OS will start a service called ahcix86 and the file of which is located in "system32\\drivers\\ahcix86.sys", and the OS will them recognized the SATA HDD in AHCI Mode.

Reboot your computer and enter BIOS, change SATA Mode to AHCI, and save and start your computer. If you have done it correctly you will not run into Blue Screen, and boot into Windows Xp successfully. System pop up a bubble indecating system has just found a new PCI device and will install the driver. If the automatic installation fails and OS asks you for the driver, just type in the folder which contains the modified inf and cat files (don't use system32 folder, copy those two files to another newly created folder which contains only these two files, you can use the umcompressed x86/x64 folder when you extract the driver installer if you modified the inf there).

After driver installation Windows need another reboot. After reboot for the second time, you will see in the Device Manager, there will be a AMD SCSI/RAID Controller. That means you has successfully let your Windows Xp supports native SATA HDD in a native way. Congratulations!!

To download the driver, go to the following webpage (Chinese)
http://news.mydrivers.com/1/166/166108.htm




2012年12月9日星期日

有关多系统应用的引导构建与修复(涉及GRUB,NTLDR,BOOTMGR以及SBM)

本文的目的是以我的电脑为案例,简要的说明一下系统启动过程,并介绍几个启动工具。
本文的预期阅读对象是:多系统用户(涉及多重引导)、老旧电脑用户(BIOS不支持优盘或者光驱启动)


开机原理:
1、开机电脑从BIOS开始,进行硬件扫描,如果没有问题,将默认使用BIOS中定义的第一引导设备(一般为第一块硬盘)引导系统。
2、对于每一个引导媒介,其引导信息位于其存储空间的第一个Block,即前512字节。
3、在安装操作系统时,为了兼容可能发生的多系统并存,操作系统通常会将引导信息同时写在引导设备的前512字节和系统分区的前512字节。
4、因此MBR通常指向最后一个安装的操作系统所在的分区,并引导电脑加载该分区的Bootloader。
5、Bootloader可以引导电脑加载操作系统核心并启动操作系统,或者将引导任务转交给其他的Bootloader。
*6、另外MBR的最后64字节与引导无关,是磁盘的分区表。

我的电脑本来是三个系统,Windows XP, Windows 7以及Ubuntu。
最先安装的WinXP到/dev/sda1,然后MBR就指向/dev/sda1,而/dev/sda1的前512字节内容则指导电脑加载NTLDR也就是Windows XP的Bootloader。
然后安装的Win7到/dev/sda2,MBR仍然指向/dev/sda1,而/dev/sda1的前512字节的功能变成了指导电脑加载BOOTMGR也就是Windows 7的Bootloader。
最后安装的Ubuntu到/dev/sda5,MBR指向/dev/sda5,而/dev/sda5的前512字节的内容指导电脑加载GRUB 2也就是Ubuntu的Bootloader。

另外/dev/sda3被作为数据盘用来交换数据,没有安装任何操作系统。
另外/dev/sda4是扩展分区,内建两个逻辑分区/dev/sda5和/dev/sda6,作为Linux系统的根分区和swap分区。

三个系统和平的共存着,直到今天。
今天我突然意识到,我的WinXP,当初作为万一有Win7不兼容的程序的后备系统,在最近一年之中根本没有用到。
而在可预期的未来也不会再用Windows XP这样老的操作系统了,因此我准备把Windows XP完全卸载掉,腾出一个分区用。


然而我意识到,/dev/sda1作为硬盘的第一个分区,格式化第一个分区可能导致MBR改变从而开机无法进入GRUB,进而无法进入任何一个系统。
即使格式化第一个分区没有影响到MBR中的引导信息,除了Windows XP之外,Windows 7的引导文件也在/dev/sda1上(先安装WinXP再安装Win7一般就会这样),所以假设GRUB可以正常启动,可以正常引导Linux系统,却无法进入Win7,因为承载BOOTMGR的分区被我格式化了。

因此我必须保证以下几点:
1、将Win 7的核心引导文件BOOTMGR以及BOOT目录迁移到/dev/sda2
2、保证GRUB在/dev/sda1格式化后可以正常加载
3、修改系统的Bootloader从而让Ubuntu和Win7能够和平共存并且具有鲁棒性,方便以后安装系统。


所以以下是操作步骤:
1、启动到Win7,把/dev/sda1根目录中的bootmgr以及Boot文件夹复制到/dev/sda2也就是Win7系统的根目录。
2、启动到Ubuntu,将/dev/sda1格式化,将/dev/sda1去掉boot标志,将/dev/sda2加上boot标志位。
3、不要关机,趁现在还在Linux下,重新安装Grub到/dev/sda,方法是
复制代码
  1. sudo grub-install --no-floppy /dev/sda
  2. sudo update-grub

以上两行命令的作用分别是:
安装Grub引导管理器,并向MBR写入引导信息
更新Grub操作系统选单。

4、准备一张Windows7系统盘,放进光驱,重启计算机,选择从光盘启动。进入Windows7安装向导,选择修复计算机。
5、取消安装向导可能提示你进行的自动修复,进入命令提示符进行手动修复,执行以下命令:
复制代码
  1. bootrec /scanos
  2. bootrec /fixboot
  3. bootrec /rebuildbcd

以上三行命令的作用分别是:
扫描磁盘寻找已安装的Windows系统,
将引导信息写入系统分区的前512字节(而非MBR),
重新构建系统选单,防止BOOTMGR找不到Windows系统。
注意到我并没有使用bootrec /fixmbr命令,因为如果那样的话Grub写入MBR的引导信息会被覆盖。
6、关闭命令提示符,重启计算机并取出光盘,从硬盘启动电脑。
现在你的电脑开机,读取MBR会引导计算机从/dev/sda5启动,并加载位于/dev/sda5的GRUB也就是Ubuntu使用的Bootloader,
然后你可以选择启动Linux系统或者将引导任务转交给/dev/sda2,并加载位于/dev/sda2的BOOTMGR也就是Windows7使用的Bootloader。


那么,目前存在一个小小的缺憾是:
GRUB Bootloader可以将引导任务转交给BOOTMGR,然而BOOTMGR却不能将引导任务交还给GRUB。
所以进阶教程主要研究如何尽量在不更改主硬盘MBR的前提下让Bootloader可以互相转交引导任务,以及介绍更多引导工具。
我选择的是GRUB4DOS,因为他太简单了!完全无需更改MBR。

操作步骤:
1:下载Grub4dos,从中解压缩出来三个文件,grldr,grldr.mbr,以及menu.lst,并将它们放进Windows系统根目录。
严格来说,menu.lst是需要修改一下以适应不同的电脑,不过其初始menu.lst已经写的很不错了,可以寻找并加载磁盘上的Windows系统或者使用Grub Legacy的任何Linux系统,但默认不支持引导使用Grub 2的Linux系统。所以如果你是新手你可以不管menu.lst,老手的话可以自行修改。

2(对Win7用户):
Win7系统其实已经不再使用boot.ini文件了,不过仍然兼容它,所以在Win7系统根目录建立一个boot.ini文件,并写入如下内容
复制代码
  1. [boot loader] 
  2. timeout=10
  3. [operating systems]
  4. C:\grldr.mbr="START GRUB4DOS"

保存退出。

2(对WinXP用户或Win7/XP并存用户):
你的WinXP系统根目录下应该已经存在boot.ini文件,如果没找到,请开启系统文件、隐藏文件的显示。
更改boot.ini的属性,取消勾选只读属性,打开该文件,先将timeout的值修改为0以上的数字,例如5。然后再文件最后追加一行:
复制代码
  1. C:\grldr.mbr="START GRUB4DOS"
保存后不要忘记更改boot.ini的属性,重新勾选其只读属性。


3:重新启动计算机,你可以看到在Windows系统的引导界面,多出了一个叫做START GRUB4DOS的操作系统,选择他就可以进入GRUB4DOS引导了。
GRUB4DOS默认可以寻找并启动电脑上的Windows系统,寻找并启动电脑上使用Grub Legacy的Linux系统,或者选择从软盘启动。
我对Grub4dos的配置文件进行了小小的修改,让他可以从第一块硬盘启动,这样我又可以回到GRUB 2引导管理器了。
只需在menu.lst中新增下面几行:
复制代码
  1. title Boot from First HDD
  2. chainloader (hd0)+1
  3. rootnoverify (hd0)


到这里其实已经很完善了,你的电脑的多个Bootloader将可以互相转交引导任务,对大多数人其实已经完美了。然而……
接下来所要讲的是老旧电脑的支持。

有些同学家里可能有2000年左右的电脑,他们往往已经支持USB设备了,但其BIOS不支持USB启动,除硬盘外,仅支持软盘或光盘启动。
或者还有更老的电脑,除硬盘外,他们仅仅支持软盘引导启动,连光盘都不支持。

可是你又希望能够给这样的电脑安装一个像样的操作系统,不是吗?
于是这时候就需要祭出引导大杀器了,这是国人写的不到30K的软件哦:Smart Boot Manager,简称SBM。
你可以去其官网下载,或者最新版的Ubuntu 12.04系统盘中的install文件夹中就有sbm.bin。

SBM最牛X的特点在于:
1、大小不足30KB,可以轻松的放进一张软盘
2、可以选择从你能想到的各种设备引导计算机开机
3、可以将引导任务转交给多种设备。例如转交给优盘启动,即使你的电脑BIOS本来不支持从优盘启动


不过这里声明SBM本身并不是Bootloader,他更像一个加强版的BIOS,可以让你选择更多的引导启动设备而不受BIOS的限制。

在这里介绍SBM的两种用法:
1、用dd直接烧到软盘里用
2、用Grub的映射功能,将硬盘上的sbm.bin软盘镜像映射成软盘,然后启动SBM

两种办法都很简单,不过第一个要求你必须有真的软盘。
第二个的话Grub4dos默认的系统选单就有,只要你把sbm.bin与grldr放在同一个目录下就可以。

这下你可以强制BIOS中不支持光盘启动或者优盘启动的计算机,从光盘或者优盘引导启动了。
(但前提是你的系统还是支持光盘或者软盘设备的,就是说你在操作系统中无需安装额外的驱动就可以使用)
最终,我的电脑里的几个Bootloader加上SBM的关系是这样的(为了简单起见,因为MBR直接指向/dev/sda5所以没有画出来): 

全文完。

哈哈说了这么多,我终于可以在那个老旧、光驱已经坏了的Thinkpad R30上安装一个像样的操作系统了!
注:Thinkpad R30支持内建光驱、内建硬盘启动,以及USB-FDD启动,不支持USB-HDD启动,因此无法用常规的方法优盘安装系统。
注:其实以我家的网速,我是准备直接从互联网给Thinkpad R30安装Debian的,使用SBM其实是PLAN B。

2012年12月8日星期六

从互联网安装Debian(或Ubuntu等Debian系Linux),无需光盘优盘

Install Debian/Ubuntu without any external boot media via Internet 
For my English readers please click here, it will re-direct you to Ubuntu Community Documents:

这篇HOWTO讲述的是一种仅需加载越20MB核心文件,然后整个安装过程在互联网进行的,Ubuntu/Debian安装方法。
这种方法甚至不需要你刻录CD启动盘或者USB启动盘,也不需要你有另外一台电脑作为局域网启动伺服,因为除了本地约20MB的核心文件,其他的一切都直接下载自互联网。这个方法也适合其他Debian系Linux操作系统甚至更多Linux操作系统。本教程假设你的电脑已经安装有Linux系统或者Microsoft Windows XP,这样你可以无需任何Grub启动盘。如果你的电脑是全新的,或者现有系统已经崩溃,则可能需要一张Grub引导盘。

其他可用方法:
如果你的电脑暂时不具备互联网介入条件,或者你的电脑没有现有的系统,则不建议采用此种办法安装。你可以考虑硬盘安装或者光盘安装抑或是优盘安装。

安装步骤:
1. 在Ubuntu/Debian的软件源下载合适的linux核心文件和initrd初始化RAMDISK。
(以下参考地址假设你安装Ubuntu/Debian当前稳定版本,你使用i386计算机)
Debian请在浏览器打开:
http://mirrors.163.com/debian/dists/stable/main/installer-i386/current/images/netboot/debian-installer/i386/
Ubuntu请在浏览器打开:
http://mirrors.163.com/ubuntu/dists/quantal/main/installer-i386/current/images/netboot/ubuntu-installer/i386/
发现了没有,Ubuntu和Debian其实是非常相像的。如果你希望安装64位版本,或者一些老版本,你可以从网易开源软件镜像开始一级一级的往下找,就照葫芦画瓢就行。
你当然可以使用其他镜像源,例如中国科大的开源软件镜像站点,支援IPv6访问。
下载其中的linux文件(有些发行版可能是vmlinuz)以及initrd.gz文件,并保存到你电脑磁盘第一个分区的根目录。

2. 确定你的电脑有可用的Grub引导管理器
如果你现有的系统是Linux,并且已经安装有Grub,那么你可以跳过这一步。如果你安装的是Microsoft Windoes XP,请下载Grub4dos,将他解压缩到你的C盘根目录,确定你的C盘根目录下存在grldr文件以及boot文件夹。请在我的电脑中,点击工具菜单,选择文件夹选项,你需要设置显示系统文件以及显示隐藏文件。你现在可以在你的C盘发现一个boot.ini文件,请右键单击他点击属性,取消勾选他的只读选项,并打开他。将TIMEOUT值修改为大于0的数字,例如5,并且在其最后追加一行:
复制代码
  1. C:\grldr="START GRUB4DOS"
保存并退出,记得重新设置该文件为只读的哈。注意这个方法并不适合Vista或以上版本的Windows。

3、重启电脑并进入Grub手动引导模式
现在重启你的电脑。如果你原先的系统是Linux,那么你当然会直接进入Grub界面,如果你先前的系统是WinXP,那么你现在可以在你的操作系统选单中找到一项START GRUB4DOS,选择启动他进入GRUB。注意,如果你先前的系统是Linux请留意你的Grub版本是0.X还是1.X,WinXP用户无需留意,Grub4dos一定是0.X版本的。
请在当前Grub界面根据提示进入Grub的手动引导界面(Command Line)。可能你的Grub可选系统选单中有一项叫做Command Line,或者可能你需要按C键进入手动模式。
以下操作请注意区分Grub版本:
Grub 2 (版本号为1.X):
复制代码
  1. set root=(hd0,msdos1)
  2. linux   /linux
  3. initrd   /initrd.gz
  4. boot

Grub Lagacy(版本号为0.X):
复制代码
  1. root   (hd0,1)
  2. kernel   /linux
  3. initrd   /initrd.gz
  4. boot
4、Linux安装程序已经启动,请确保你的电脑已经网线(建议是在DHCP下可直接自动配置上网的环境)。并根据屏幕指示进行系统安装。