我的回复:
ausun 原帖:楼主的标题不够醒目,实际这里讲的是个性化安装 Ubuntu 到内置硬盘或移动硬盘的另类方法,它快速、简单、可定制,很好的帖子,我看标题可以改为《IDE/USB Disk 的 LiveCD 安装通用指南》。
按照安装介质,回顾操作系统安装的发展,整体上是:floppy disk -> hard disk;几年前以 knoppix 为代表,出现了 LiveCD,── 这是一个划时代的革命,因为从此系统安装拜托了对特定硬件的依赖(指图形界面的操作系统,dos 和 unix 的命令行系统不算),但因为光盘文件系统的只读属性,不能方便的保存配置环境和用户资料(虽然可以存放在其他介质上),再加上光盘启动的低效,没有引起人们的重视;此后出现了 USB 存储介质,移动硬盘或优盘,如果能实现 LiveUSB,那么这是操作系统安装的真正革命,因为它弥补了前面两种操作系统安装的缺点,联合了优点,真正实现了可以移动的操作系统(mobile linux)。
这段历史将要是,floppy disk -> hard disk -> LiveCD -> LiveUSB。
当前,在 LiveCD 和 LiveUSB 之间还有个短暂的 LiveHD,LiveHD 的意义在于,它为人们从 cdrom 到 USB 提供了一个过渡,因为之所以叫做 LiveHD (以 gnix_oag 的硬盘引导光盘镜像为代表),它不同于传统的硬盘安装之处是,开机时的硬件自动侦测以及应用软件和用户环境的预先集成 ── 因为这是 LiveCD 的亮点,同时因为安装介质的可读写属性,它不会自满于对LiveCD 的简单模仿,必然要求对用户环境和配置文件进行保存,因而 gnix_oag 出现了,但 LiveHD (顺带说一下,自认为这个词是我的发明) 相对于 LiveCD 的移动性来讲,是个倒退,而廉价的大容量 USB 外置存储设备的流行,恰恰生逢其时,所以,gnix_oag、ptptptptpt 以及楼主你们的努力,实则有历史的必然。
就我个人而言,当然知道命令行界面的 unix / linux 是可以带着到处跑的,但图形界面(xwindow)就困难异常了 ── 在 Linux 的早期阶段,即使硬盘安装,xwindow 也是很容易出错的,因而 LiveCD 让我兴奋异常,随着 knoppix、morphix、xubuntu 的发展,出现了很多发行版对 LiveUSB 进行尝试,我接触过的有 DSL、feather linux、Flash Linux、PUD 等,但最早的一篇详细讨论 LiveUSB 的文章是在 IBM 的 Linux 社区里,一个英国程序员对移动硬盘安装的原理和步陬做了详细介绍,特别是内核中如何加载 scsi 及 usb 的支持。
在 bios 开始支持 USB 设备,syslinux 和 grub4dos 能够启动 USB 设备,自动侦测硬件的脚本的完善和配置文件的自动生成等技术都已经成熟以后,LiveUSB,已经是一项水到渠成、指日可待的技术,让我们大家共同去努力吧。
一直在用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文件等。