从正在运行的系统中将Ubuntu安装到其他硬盘

我想在连接但未挂载的磁盘上安装Ubuntu,而不是从DVD或USB启动。 目标是在外部磁盘上安装Ubuntu,然后拔下来,插到其他电脑上运行。
我知道需要大约20分钟等等。我只是想在运行中的系统上完成这个操作,而不需要重新启动系统。
我有哪些选择呢?
编辑:为了更清楚,我有以下情景:
- 我的朋友带来一个空白磁盘。 - 我从我的运行系统(Ubuntu)上将系统安装到那个磁盘上。 - 朋友将磁盘放回他的机器并启动这个已安装的系统。
所以,使用USB键或复制我的系统并不是我需要的解决方案。
3个回答

如果您正在使用Ubuntu机器,则可以将运行中的系统复制到外部硬盘。

假设您已经对外部硬盘进行了分区。在这个示例中,我将使用2个分区:/和/home。

$ sudo mkdir -p /target
$ sudo mount /media/external-hdd/main /target
$ sudo sync
$ sudo cp -ax / /target
$ sudo mount /media/external-hdd/home /target/home
$ sudo cp -ax /home /target/home

cp -ax不会跨越不同的文件系统,它会归档(保留权限,不遵循符号链接等)。

然后,您需要更新目标磁盘上的grub设置和fstab。您可以使用chroot,但在此之前,您需要:

$ sudo mount -o bind /sys /target/sys
$ sudo mount -o bind /proc /target/proc
$ sudo mount -o bind /dev /target/dev

现在你已经准备好进行chroot操作了。
$ sudo chroot /target
# (now you are in the external HD as root)

现在,你需要更新fstab和grub中的UUID。为了获取UUID,你可以运行以下命令:
# blkid

然后,在/etc/fstab中用blkid获得的适当id替换UUID。
最后一步是更新引导配置并将引导加载程序安装在外部硬盘上。在我的情况下,我使用grub,所以我要编辑/boot/grub/menu.lst。 您需要将以“# kopt=root=UUID=... ro”开头的行替换为UUID内容,该UUID应指向根文件系统所在的分区。
# grub-install /device/name
# update-grub

在这里,/device/name 是外部硬盘。

然后,你可以退出 chroot 并卸载设备。

# ^D
$ sudo umount /target/sys
$ sudo umount /target/proc
$ sudo umount /target/dev
$ sudo umount /target/home
$ sudo umount /target/

而且磁盘应该已经准备好可以使用了。一旦你启动它,可能会运行fsck,因为它没有正确卸载(你是在拷贝内容时进行的操作)。

1谢谢!如果我想进行干净安装,我应该复制什么?有没有适用于这个目的的Ubuntu压缩分发包? - Ondra Žižka

你可以使用 debootstrap 来实现这个目的,这应该是你需要的。点击 这个链接 查看详情。

这看起来就是我在找的东西。 - Ondra Žižka

如果您有ISO镜像,您可以使用本文提到的任何一种工具创建一个带有实时系统的可启动USB。

https://wiki.ubuntu.com/LiveUsbPendrivePersistent

只需在Unity中键入USB,就会出现一个创建此类磁盘的程序。

一个持久的U盘缺少完整安装的一些功能。 - nanofarad
有什么东西如此重要,以至于在具有用户文件空间的持久性U盘中缺失?也许我理解错了,但目标是创建一个可以在任何机器上引导的东西,对吗?如果您只想准备一些安装到其他机器上的东西,那么使用dd或unetbootin会是更好的选择。 - Maciej Szlosarczyk
问题是某些低级事物,如引导加载程序有所不同,并且特殊磁盘控制器的驱动程序很难加载。一个更好的想法是将整个活动光盘提取到文件夹中(从光盘中提取整个Squashfs文件),然后chroot进去按需运行Ubiquity。 - nanofarad
Maciek,目标是在不离开我的电脑的情况下安装Ubuntu。我经常帮助朋友安装它,而且我不想多次从一张桌子上走到另一张桌子上 :) 所以我宁愿让他们带来一张光盘并在上面安装。 - Ondra Žižka