一直在用gnix_oag大侠提供的loop文件方式安装的Ubuntu 7.04,几个月下来觉得蛮好的,这种方式的优点是显而易见的,安装很简单,不需要分区,备份也简单,把那个可写的文件复制一份就行了。不过它难免也有些缺点。首先它是使用unionfs(aufs)方式把几个squashfs压缩文件和一个可写的ext3文件合并成一个文件系统,经过解压、合并,而且还是loop 方式,效率比直接访问硬盘肯定要低些。这种使用suqashfs文件系统的方式开始能省些空间,不过由于它是只读的,所以在运行系统更新升级软件时,已有的文件只是被做一个已删除的标志,空间并不会被释放,白白浪费空间。放在fat32分区上的rwfs文件最大只能是4GB,以后可能不够用。还有就是启动时用的initrd文件是经过特别定制的,升级内核时需要重新制作,涉及到aufs和ntfs-3g驱动模块,比较麻烦。最后就是我很喜欢ubuntu,打算以后就用它了,所以还是给它一个名份,让它成为一个独立于windows之外的系统吧。生命在于折腾,于是,我又开始折腾了。从头开始再装一遍太麻烦了(没人喜欢重装系统吧),所以我把这个用了几个月的系统拷贝进一个真实的ext3分区里。到现在已经使用了两星期了,没发现有什么后遗症。
乾坤大挪移练功指南
1、使用你熟悉的分区工具(比如gparted)为ubuntu建立一个新分区,格式化成ext3格式,并建立一个swap分区。我是分了10G 的ext3作为root分区,另外还有一个256M的swap。如果你空间足够可以把root分区分的大些,256M swap在我这里足够了,我有1~2G内存,用了两星期,swap最多好象只用过10几M。
2、做好启动新系统的准备。
2a、如果想继续用windows xp的ntldr启动请执行这一步。
首先把希望使用的内核和initrd文件拷贝出来。比如我用的是2.6.20-16-generic,就把vmlinuz-2.6.20-16- generic和initrd.img-2.6.20-16-generic从/boot目录拷贝到原来启动时放内核的目录(如C盘的boot目录)。然后修改原来使用menu.lst文件,加入下面的内容:
title Ubuntu Linux 7.04 Mobile
kernel (hd0,0)/boot/vmlinuz-2.6.20-16-generic root=UUID=9a92ac52-bc67-49bd-8a54-00370f78658a rw splash
initrd (hd0,0)/boot/initrd.img-2.6.20-16-generic
其中“(hd0,0)/boot”要根据自己的情况修改;分区的uuid可以用下面的命令查看:
ls -l /dev/disk/by-uuid
如果刚才新建的分区是在内部硬盘上,那么位置比较固定,可以直接写成“root=/dev/hdax”的形式。由于我是装在移动硬盘上的,用uuid方式更方便。
2b、如果想用grub4dos直接引导启动请执行这一步。
下载并解压缩grub4dos最新版,用bootlace.com安装引导代码: bootlace.com /dev/sda
这里把设备改成你想用来启动的硬盘,我的是在移动硬盘上,所以是sda。然后把grldr拷贝到刚刚新建的那个ext3分区上,并在新分区的根目录下建立一个标志文件,方便grub4do启动时寻找这个分区:
touch /mount-point-of-new-partition/Ubuntu-mobile
然后在新分区的根目录下建立menu.lst文件:
timeout 5
default 0
fallback 1
splashimage /boot/bj2008.xpm.gz
fontfile /boot/fonts
title Ubuntu Linux 7.04 Mobile
find –set-root /ubuntu-mobile
kernel /boot/vmlinuz-2.6.20-16-generic root=UUID=9a92ac52-bc67-49bd-8a54-00370f78658a rw splash
initrd /boot/initrd.img-2.6.20-16-generic
title M$ Windows XP
find –set-root /ntldr
makeactive
chainloader /ntldr
上面的文件仅供参考,请根据自己的情况修改。
3、把现有系统拷贝到新分区上。
这个是重头戏。有资料说可以直接把正在运行的系统拷贝到其他分区上,不过我怕那样可能出现问题,于是采用了在另外一个系统中拷贝的方法。在已经使用了unionfs(aufs)的系统中似乎无法再挂载其他的unionfs文件目录,所以我们需要一个纯净的环境把现有的文件系统挂载起来,然后再拷贝。不幸的是我们一直使用的gnix_oag大侠的这种安装方式就使用了unionfs,所以不能用来实现下面的操作。不过他的initrd环境里有所有我们需要的东西。为了启动到这个initrd环境中,需要把你用loop方式安装的ubuntu文件夹改个名字,比如从feisty改成feisty1,然后启动,由于找不到需要的文件,它就停在initrd的命令行环境下了,这是一个功能非常简单的mini系统,命令提示符是 “(initramfs)”,在这里执行下面的命令就行了。
首先是准备一大堆用来挂载文件系统的临时目录:
mkdir inst cd casper 02 03 rwfs union new
挂载feisty1目录所在的设备,假设你的feisty1目录是在/dev/hda1上:
mount /dev/hda1 inst
挂载文件:
mount -o loop inst/feisty1/ubuntu-7.04-desktop-i386.iso cd
mount -o loop cd/casper/filesystem.squashfs casper
mount -o loop inst/feisty1/02*.rofs 02
mount -o loop inst/feisty1/03*.rofs 03
mount -o loop inst/feisty1/ubuntu.fs rwfs
终于可以使用aufs把这些loop文件合并成我们一直使用的root目录了:
mount -t aufs -o dirs=rwfs=rw:03=ro:02=ro:casper=ro unionfs union
注意,这行里各个目录的顺序是不能改动的!现在union目录下面就是我们熟悉的整个root目录了,把它拷贝到新分区去:
mount /dev/sda1 new
cp -a union/* new
其中/dev/sda1是我刚刚新建的分区。拷贝过程需要几分钟,先休息一下吧。其间看到一些zlib出错的提示,似乎不影响使用,至少我这里没问题。
拷贝完成后修改一下new/etc/fstab文件,删除里面原有的挂载root和swap目录的行,替换成下面这两行:
UUID=9a92ac52-bc67-49bd-8a54-00370f78658a / ext3 defaults,errors=remount-ro 0 1
UUID=77f87526-0686-47c1-b0da-37d178292d2e none swap sw 0 0
同样uuid可以直接用设备号代替。
好了,现在umount刚才挂载的所有分区,重启计算机,选择“Ubuntu Linux 7.04 Mobile”体验一下新系统吧!以后如果需要升级内核,对于用2a方式启动的,把新的vmlinuz和initrd拷贝出来然后修改一下 menu.lst就行了;对于用2b方式启动的直接修改menu.lst就可以了。
我用了两星期,其实速度上没感觉出什么变化,不过升级内核的确方便了,也不担心空间不够用了,呵呵。像我这样折腾的人估计不多,不过文中提到的一些方法其实可以用来修复出错的系统,比如恢复引导代码、修改xorg.conf文件等。
给安装好的ubuntu系统整体搬家
转载请注明出处:服务器评测 » 给安装好的ubuntu系统整体搬家