乾坤大挪移──给装好的ubuntu系统搬个家

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
ausun
帖子: 65
注册时间: 2007-05-11 9:21

乾坤大挪移──给装好的ubuntu系统搬个家

#1

帖子 ausun » 2007-07-12 13:59

一直在用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文件等。
xiaoyong
帖子: 515
注册时间: 2006-05-20 10:38

#2

帖子 xiaoyong » 2007-07-13 18:16

楼主的标题不够醒目,实际这里讲的是个性化安装 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,已经是一项水到渠成、指日可待的技术,让我们大家共同去努力吧。
ausun
帖子: 65
注册时间: 2007-05-11 9:21

#3

帖子 ausun » 2007-07-14 9:23

把ubuntu装进移动硬盘的确挺好的,我一直这样用。移动硬盘很容易携带,这样在公司和家里就有一个完全一样的操作系统了。以前用XP时就比较麻烦,在公司电脑里装了东西,还要带回家里重新装一遍。
把grub4dos装进用USB移动硬盘直接启动时,往内存里拷贝kernel和initrd文件时速度比较慢,我怀疑是因为刚启动时条件所限硬盘缓存没有启用。所以建议最好还是把kernel和initrd拷贝到内置硬盘里,用ntldr或者在内置硬盘上安装grub4dos引导。
linux启动时会检测硬件,使它很适合在不同电脑间移动使用,windows恐怕不行,即使不蓝屏也需要装驱动、重启、重新激活。不过ubuntu也不是随便拿到一个电脑上就能用的,xwindow就是一个大麻烦。我的两个机器一个是台式机,一个是笔记本,显卡都是ati的,不过一个是9550,一个是x300,显示设置也不一样。开始时换个地方就要重新复制一遍xorg.conf,太麻烦了。后来做了一个简单的自动配置脚本,在启动时先判断当前的环境,根据不同的环境调用不同的xorg配置文件,用着还不错,希望对大家有用,也希望大家说一下自己更好的方法。

代码: 全选

gedit /etc/init.d/autoconfig
写入以下内容:

代码: 全选

#!/bin/sh

computer="unknown"

if [ "`lspci | grep 'Radeon Mobility M300'`" != "" ] && [ "`lspci | grep 'Mobile 915GM'`" != "" ]; then
	# 芯片intel mobile 915,显卡ati m300, 应该是我的nx6130笔记本
	computer="nx6130"
elif [ "`lspci | grep 'Radeon 9550'`" != "" ] && [ "`lspci | grep 'nForce2'`" != "" ]; then
	# 芯片nvidia nforce2,显卡ati 9550, 应该是我家里的台式机
	computer="home"
fi

# 首先删除现有的xorg配置文件
rm -f /etc/X11/xorg.conf

case "$computer" in
	"nx6130")
		# 如果现在是我的笔记本,把事先做好的笔记本xorg配置拷贝成当前配置
		cp -af /etc/X11/xorg.conf.nx6130 /etc/X11/xorg.conf
		;;
	"home")
		# 如果现在是我的台式机,把事先做好的台式机xorg配置拷贝成当前配置
		cp -af /etc/X11/xorg.conf.home /etc/X11/xorg.conf
		;;
	*)
		# 如果是其他机器,对于找不到xorg.conf的情况,系统会运行重新配置向导
		;;
esac
改成可执行,然后在rc2.d里做一个链接。

代码: 全选

chmod +x /etc/init.d/autoconf
ln -s /etc/init.d/autoconf /etc/rc2.d/S11autoconf
现在系统启动时就会进行自动配置了。如果有其他需要在启动时配置的东西也可以放进这个脚本里。
xiaoyong
帖子: 515
注册时间: 2006-05-20 10:38

LiveUSB 与 /etc/fstab

#4

帖子 xiaoyong » 2007-07-14 12:49

我的思路是把 LiveUSB 的运行分成三个阶段,启动、操作、关机,重点是启动和关机:启动时生成针对硬件的配置文件,── 需要首先删除上次运行生成的配置文件,这样每次运行都会进行硬件检测,虽然会减缓开机速度,但能够适应不同的硬件环境;关机时需要保存当前的用户环境和配置文件,── 当然是和硬件无关的部分,最好是间隔一定时间就自动备份;操作部分就没有什么可说的了,与普通系统无异。

这时,在硬件配置文件的处理上, LiveCD 反而简单了,因为文件系统是只读的,它并不保存配置文件,每次运行都会重新检测和生成,── 在这个方面,LiveUSB 需要向 LiveCD 借鉴,把配置文件生成在内存中,关机即消失,下次开机再重新生成,也许这会用到 aufs 文件系统。

关机时需要保存的配置文件,主要是用户环境,包括桌面配置和应用软件的配置, LiveCD 的这个部分是只读的,而 LiveUSB 应该是可读写的。

难点还是在于不同硬件环境下配置文件的灵活适应,比如 /etc/fstab,在 LiveUSB 应该包括 安装系统的移动硬盘本身的分区,还需要有存放硬件环境的虚拟分区,而 LiveCD 的 /etc/fstab 是空的,每次运行都会重新生成, ── 当然这也是个主意,每次开机都可以重新生成 /etc/fstab,但我倾向于在移动硬盘上不保存 /etc/fstab。

/etc/mtab 似乎是用于自动检测到的分区的加载,应该可以那它来加载所有的分区,但这样就不能把 / 装配到实际的移动硬盘分区了。不知你的 /etc/fstab 是怎样处理的,可以把它们的配置贴出来,看得更清楚一些。[/u]
xiaoyong
帖子: 515
注册时间: 2006-05-20 10:38

#5

帖子 xiaoyong » 2007-07-14 19:53

参考楼主文章的另类装机,发在viewtopic.php?p=364338#364338
只要LiveCD能运行,就能够装上的,因为硬件兼容性是通过了,速度太慢,通常是内存太小造成的,可以加内存,我用的是十年前的老联想,cpu只要500Mhz,但我把内存加到了256M,现在可以跑Feisty。

LiveCD里的安装程序,多试几次,应该也是可以的。或者,参考这篇帖子,viewtopic.php?t=64081,原理都是相同的,我就把正在运行的LiveCD拷贝到一个空白的linux分区上,再做些调整,就可以用了,── 一点提示:只须拷贝/casper/filesystem.squashfs下的内容就可以了,假设空白分区在/dev/hda5,

代码:

$sudo mount /dev/hda5 /media/hda5
$sudo cp -ax /asper/filesystem.squashfs/* /media/hda5


然后,修改/etc/fstab,安装Grub,就可以直接启动硬盘里的系统了。
xiaoyong
帖子: 515
注册时间: 2006-05-20 10:38

#6

帖子 xiaoyong » 2007-07-14 19:59

接楼上,我是用gnix_oag的方法用的LiveCD,所以在做完以上一步后,我又手工拷贝ubuntu.fs里的配置文件和更新的软件,还是

代码: 全选

$sudo cp -ax /ubuntu.fs/*  /media/hda5
所以,复制一个运行中的系统,也是可以的,当然这是LiveCD。
xiaoyong
帖子: 515
注册时间: 2006-05-20 10:38

#7

帖子 xiaoyong » 2007-07-14 22:53

再续,第二次复制,会覆盖许多文件,因为ubuntu.fs内的文件是优先于squashfs.filesystem的,所以,要给cp加个参数f,免去回答是否覆盖的问题

代码: 全选

$sudo cp -afx /ubuntu.fs/*  /media/hda5
ausun
帖子: 65
注册时间: 2007-05-11 9:21

Re: LiveUSB 与 /etc/fstab

#8

帖子 ausun » 2007-07-16 10:46

xiaoyong 写了:不知你的 /etc/fstab 是怎样处理的,可以把它们的配置贴出来,看得更清楚一些。
我对fstab的处理和xorg.conf差不多,也是放在那个autoconfig里面。其他的硬件配置我没有做处理,ubuntu自身已经做的很好了,我的笔记本和台式机硬件相差是非常大的,不过一点都不影响使用。
直接拷贝ubuntu.fs里的文件可能会产生问题,比如可能会造成已经做了删除标志的文件被保留下来,所以最好是用unionfs挂载生成真实的文件系统后再拷贝。如果有足够的技巧,直接在当前正在运行的系统中拷贝根目录下的文件应该也是可以的。
cdlww
帖子: 81
注册时间: 2005-10-17 23:56

#9

帖子 cdlww » 2007-10-17 8:39

我试着“大挪移”了!可是启动后我的SUDO和SU都没法用了~~
所有和权限有关的操作都不能用了~
回复