ubuntu/debian下使用latex小结
一次不愉快的尝试及思考(2)

一次不愉快的尝试及思考(1)

nonoob posted @ Thu, 14 Jun 2012 19:56:02 +0800 in NoTech , 1822 readers

将笔记本中的磁盘都重新格式化为了ex4,但是它在Windows世纪还残存的种种分区的不合理之处实在让我这个有各种强迫症的人感到很不自在。然而问题在于,由于我一直用的是Ubuntu,因此从来没有深入理解过和Linux内核有过半毛钱关系的东西;这次不愉快的fdisk就是一个惨痛的教训——因为我的naive竟然将根分区给格式化了,并且在修复数据无果的情况下最终选择了重装。而最大的教训莫过于像我这种吊丝根本不配用Linux。

首先,我还是选择的是gparted,这是一个界面很友好的软件,其傻瓜程度对比Windows下的PQ等磁盘管理工具; 管理器有过之而无不及;事实上我就是用这个来进行格式化的。当然这个软件设计得比较雷人的地方在于,当磁盘选择格式化操作但还处于挂起状态时居然是不可以继续标记磁盘label。Unix是有个观点是做一件事并做得最好,但是这种类似“语法糖”的东西加上去完全应该是在情理之中吧,况且在GUI下的软件设计理念本来就是应该和CLI下有所区别的。之所以没有用gparted来调整分区的原因在于它不够强大。因为笔记本嘛一块物理硬盘被分割成的多块逻辑分区,而不巧的是我的根分区所在的逻辑盘恰好是出于物理分区的中间位置,然而更可悲的是这个分区的逻辑号恰好是最大的一个(所以每次在使用fdisk -l时总是在总是提示分区顺序不一致的情形,此是后话,容我慢慢细谈)。而gparted在删除分区之前的一个必要条件是比所删除的分区逻辑号大的分区都必须都已经先卸载(umount)了。

那么最先的想法就在:是否可以用gparted来先调整逻辑分区的number?据网上的结果还不可以。于是gparted只把我带到了这儿,剩下的由fdisk来进行吧。fdisk是一款Linux发行版都自带的分区表创建和操作程序,在ubuntu/debian下是打包在util-linux底下的;这组工具的牛逼之处在于如果没用过一半以上完全不好意思说自己搞过运维,没听说过其中的command的话完全不好意思说自己是Linuxer。fdisk尽管是个上层的外部命令,但确实是一把不错的瑞士军刀;只是如此犀利,以致于我辈菜鸟总是划伤自己。

fdisk /dev/sda

界面是个menu,内容还是蛮多的,不过我只用到了m(打印帮助)、p(打印分区信息,相当于直接fdisk -l)、d(删除分区)和x(扩展模式)。“扩展模式”(extended)中有一个选项f传说是可以调整逻辑分区的次序的,可是如果尽管写回(w)了当你使用df或gparted来查看时仍然会显示原来的逻辑号(尽管这时fdisk已经固执己见地认为一切已经ok了);貌似是需要重启的,然后可以看到分区号的确是变化了。(然而,令我迷惑的是在我重装之后调整逻辑号,在重启时分区号没有变化,这是什么原因呢?)

----------------------------休息一下----------------------------------

这里顺便记录对分区的理解。Linux中规定每个硬盘设备最多有4个主分区(primary),但是可以扩展分区(extend)可以让一个Linux的系统存在多于4个分区;Windows早期只承认一个主分区(传说中的ghost等系统安装工具中的“一键将磁盘分成四个分区”事实上是1个主分区+3个逻辑分区;这估计是历史遗留问题吧)。主分区和扩展分区的差别在于,只有主分区可以安装有bootloader;而一般的双系统中的Linux的根分区都是在逻辑分区的,和引导程序所在的分区(比如Windows的c盘)并不在同一个地方。话虽如此,但是扩展分区整体还是占用了一个主分区号,而各个实际的扩展分区部分的逻辑分区(logic)又占了各自的号码。对于每个IDE或者SCSI设备,Linux囫囵吞枣似地分配了16个序列号码;同时规定了主分区(或扩展分区)的号码必须是1~4之间的数字;所以这样,其他那些逻辑分区只好处在了5-16的位置了。从前重装系统时看到分区表的逻辑号总是没有3,4,现在想想我实在是弱爆了(1自然是主分区了,2是后面所有逻辑分区形成的扩展分区,5开始就是逻辑分区了)。按照这个说法,一块正常的硬盘最多可以用到的是15个“感觉得到”的分区(3个主分区+1个由12个逻辑分区组成的扩展分区)。

--------------------------继续痛苦回忆------------------------------

接下来fdisk删除分区了;p一下看看分区表;d之后在提示下输入对应的分区(/dev/sda#格式)。然而,由于仅仅只有一个物理盘,在写回之后提示设备忙且只有在重启或运行partprobe/kpart才能真正调整刚才的操作。但事实上我用了partprobe之后仍然提示无法进行这样的操作;本着不折腾的心只好重启。顺便说一下,从这里已经可以发现fdisk的强大之处了;因为这玩意儿gparted之流是不做的。

当重启电脑的时候,就出现了能够让我这种菜鸟诟病不已而让高手洋洋得意的情景了。grub rescue。。。

什么原因呢?被删除的这块逻辑分区就被丢到了三不管的乱坟岗中,原来删除的逻辑号现在已经不复存在了;“后面”的逻辑盘符就得依次减一。可是grub还是在那里墨守成规,依旧我行我素;结果呢,顺着bootloader中提示的方向再也找不着Linux中加载模块(如normal.mod)的地方了。不过修复这玩意儿还不是很难,原因就在于grub支持的命令实在太少了,而且修复的目标太单纯了:整个过程就是帮助如何寻找缺失的文件。rescue下的命令有set,ls,insmod,root和prefix。

从set可以看到当前的配置信息并可以重新设置新的配置信息。

 

grub rescue>set
grub rescue>prefix=(hd0,msdos8)/boot/grub
grub rescue>root=hd0,msdos9

root是主分区或逻辑分区的盘符;prefix则是模块所在文件夹的路径。注意这里的盘符和Linux中使用的又有所不同,具体可以参看这个页面。围观set的输出,看吧,grub犯二了,还是把我原来的/dev/sda9当成了根分区;而事实上现在已经变成了/dev/sda8。那么如何知道现在已经有了的分区呢,瞎猜可不行?ls!一看就知道是显示分区及文件系统信息的了。不仅可以直接ls,而且可以ls(hd0,msdos5)/boot/之类的,总的来说就是它具备了一个最基本的ls应该具备的功能了。

这下就不用担心了。找到了模块的位置,接下来就是重设root和prefix,

 

grub rescue>set prefix=(hd0,msdos8)/boot/grub
grub rescue>set root=(hd0,msdos8)

据说前面的set以及第二行的括号都是不必须有的;不过这无足轻重。下面加载模式

grub rescue>insmod /boot/grub/normal.mod
grub rescue>normal

如果第一行不显示找不到文件之类信息的话大可进入系统了。但是这样的修改不是永久的,如果发行版没有相应的措施的话下次还得继续手动修改。最简单的做法莫过于grub-install或update-grub了。

到目前为止至少一切还都顺利,只是在我被胜利冲昏头脑时,接下来的事着实让我可以理解RMS在包掉了之后的心情了。下篇继续。


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter