从运行Linux的系统的硬盘直接安装Ubuntu的ISO镜像?

我不想烧录CD、DVD或USB存储设备。我也不关心保存现有的操作系统(Linux Mint)。我想直接从ISO镜像将Ubuntu(实际上是Kubuntu 12.04 LTS)安装到计算机上。该镜像是用于Kubuntu Live DVD(3.5 GB)的。
计算机现在已经启动到了Linux Mint。一系列命令行步骤将是满意的。在我看来,我只需要欺骗现有系统以为我插入了一张CD/DVD,对吗?
我知道已经有一个类似的问题,但它没有一个好答案。答案基本上说,“看这个链接。”我查看了链接,我认为StackExchange需要一个好的答案来回答这个问题。此外,互联网上其他地方的大多数答案都假设用户是从Windows转到Ubuntu。所以我认为这个问题是需要在这里得到一个好答案的。谢谢。

这不就是和这个一样吗?http://askubuntu.com/questions/76401/is-it-possible-to-install-from-a-mounted-ubuntu-11-10-desktop-i386-iso-already-d?rq=1 - fossfreedom
1@fossfreedom - 你看到那个问题的回答了吗?那并不是一个真正的回答,至少我觉得它不值得作为StackExchange的回答。肯定有更好的答案存在。 - MountainX
1你可以从ISO启动,也可以安装。有一个专门的维基就是为了这个而设立的。 - mikewhatever
哎呀,这个维基页面需要进行严肃的清理工作:https://help.ubuntu.com/community/Installation/FromLinux - Richard
其他发行版的图片请参考:http://askubuntu.com/questions/141940 - Ciro Santilli OurBigBook.com
不依赖特定发行版:http://superuser.com/questions/154133/grub-boot-from-iso - Ciro Santilli OurBigBook.com
如果其他问题确实涉及到您的问题,但尚未得到令人满意的答案,您应该在其上**设置悬赏**。 - dessert
2个回答

我在网上找到了这个。
如果在Grub2配置文件中正确定义了条目,Grub2可以直接引导许多Linux发行版的ISO映像。
ISO映像必须放置在一个没有安装操作系统的单独分区上。为了简单起见,我们将其放置在/boot目录下的一个新目录中(假设它在一个单独的分区上)。
  1. 创建新目录并复制您的ISO映像:

    sudo mkdir /boot/iso
    sudo cp ~/Desktop/name.iso /boot/iso
    

    其中~/Desktop/name.iso是您的ISO映像的位置和名称,假设该映像位于桌面上。

  2. 添加Grub2条目:

    需要将ISO映像的条目添加到/etc/grub.d/40_custom文件中。通过以下方式编辑该文件:

    gksudo gedit /etc/grub.d/40_custom
    

    然后用以下内容替换该文件中的文本:

    #!/bin/sh
    echo "Adding 40_custom." >&2
    exec tail -n +4 $0
    # 此文件提供了一种简单的方法来添加自定义菜单项。只需在此注释之后输入要添加的菜单项。注意不要更改上面的 "exec tail" 行。
    
    menuentry "Kubuntu ISO" {
            set isofile="/boot/iso/kubuntu-12.04.iso"
            loopback loop (hd0,8)$isofile
            linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
            initrd (loop)/casper/initrd.lz
    }
    

    其中:

    • Kubuntu ISO = 您希望在Grub菜单中显示的名称。
    • boot/iso/kubuntu-12.04.iso = 您的ISO映像的位置和名称。
    • (hd0,8) = 包含ISO映像的分区。
    • 注意:tail -n +4 的意思是 Grub 从哪一行开始读取配置。在这个例子中,第四行是第一个注释行,这是可以接受的。

    Grub以与Ubuntu不同的方式读取分区。'hd0' 表示第一个硬盘,Ubuntu将其读为 sda,而 '8' 是与Ubuntu相同的分区。因此,(hd0,8) 表示 'sda8'。

    要找出您的分区,请在终端中运行以下命令:

    sudo fdisk -l
    

    假设您的映像包含在 sda1 分区中,则需要将上述行中的 (hd0,8) 改为 (hd0,1);如果映像位于 sdb1 分区中,则将 (hd0,8) 改为 (hd1,1)

  3. 保存并关闭此文件,现在运行以下命令:

    sudo update-grub
    
  4. 重新启动,这次在Grub菜单中选择新的ISO条目。希望能够成功引导到桌面。

    现在,如果您想从同一个ISO执行安装,则需要先卸载ISO映像,因为它是从硬盘上的分区挂载的(可能您只有一个硬盘,并且希望将Ubuntu安装到同一硬盘),并且安装程序需要卸载任何已挂载的分区才能进行任何更改。

    因此,在Live CD环境中,打开终端并运行:

    sudo umount -l /isodevice
    

这就是全部了。现在你可以双击桌面上的“安装”图标并继续安装。

更多信息请参考Ubuntu论坛1Ubuntu论坛2

来源:TuxGarage


8使用此方法加载Ubuntu 14.04(64位),我必须将菜单项的第4行内核更改为vmlinuz.efi,因此它变成了:linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject - nanyaks
1我提交了一个修复。tail -n +3会导致错误。这是在普通的40_custom文件中使用的方式,但是这个示例多了一行回显。在这种情况下应该是+4。 - Timo Jyrinki
2@nanyaks 谢谢,我还得在命令中加上.efi(Ubuntu 14.10,64位)。不知怎的,grep引用到我所需的分区为(hd0,msdos7),而在旧的Ubuntu安装中,它被称为sdb7。 - Dennis van der Schagt
需要将iso文件放在/boot目录下吗?还是可以从其他驱动器指定iso文件的路径,例如如果iso文件位于/dev/sda4/xyz.iso,我可以使用set isofile="/xzy.iso"(hd0,4)吗?还是必须放在/boot目录下? - Pandya
我还没有尝试过那个,但我认为只要路径正确,它应该能够起作用。 - Mitch
如何启动Debian 8?我看到了一个错误信息,说找不到/casper/vmlinuz或者/casper/vmlinuz.efi - Vitaly Zdanevich
嗯,我尝试了Ubuntu 15.10 x64,但是我发现同样的错误,即找不到/casper/vmlinuz/casper/vmlinuz.efi - Vitaly Zdanevich
@VitalyZdanevich 确保文件存在于/casper文件夹下。 - Mitch
1@Mitch 谢谢,我找到了 grub-imageboot - 这是从 ISO 启动的最简单解决方案。 - Vitaly Zdanevich
你好,要查看图像所在的分区,你需要使用命令 sudo mount 并查看根目录的挂载位置,或者使用命令 sudo mount | grep ' / '(在破折号前后加上空格)。 - Iacchus
这个方法有效,但我有一个问题。 - olfek
@sudoman 你有什么问题? - Mitch
如果操作系统正在安装到与ISO文件相同的驱动器上,那么在安装过程中,驱动器(其中包含安装介质)会被格式化,这样安装怎么能成功完成呢? - olfek
必须是一个独立的分区。 - Mitch
@Mitch,实际上在使用这种方法时,我确实使用了一个单独的分区,但是第4步的第2段有点不太清楚,所以我只是好奇而已。 - olfek
@Mitch "必须是一个单独的分区。" 第三段也与此相矛盾。 - olfek
我有点晚来参加派对,但这个答案让我找到了正确的路径。只要你引导的ISO包含了分区所使用文件系统的模块,你就可以使用已经安装操作系统的分区作为启动盘。举个例子,如果要引导位于Windows分区根目录下的ISO,你需要在"set isofile"行之前添加"insmod part_msdos"和"insmod ntfs"。同样地,你可以使用已存在的ext2分区,只需添加"insmod ext2"。请注意,你不能调整包含活动ISO的分区大小(这也是我需要这样做的原因)。 - Xenhat
当我尝试从ISO文件启动时,出现了“无效的扇区大小65535”错误。 - chfast
这对我有用,我在联想笔记本上从Debian 9安装了Ubuntu 16.04.3: https://rizaumami.github.io/2017/04/27/boot-iso-menggunakan-grub/ - luistm
casper/vmlinuz 无法找到。我检查了 ISO 文件夹中的文件是否存在。但是当我重新启动时,ISO 没有被挂载。对于我来说,/dev/sda6 挂载为 /mnt/hitachi/data。但如果现有系统的挂载路径在 fstab 中不同,这应该并不重要。ISO 文件位于 Downloads 文件夹下。所以我所做的就是 isofile="/Downloads/cosmic.iso"。但它没用? - Khurshid Alam
我把它从initrd.lz改成了initrd后,它就正常工作了。他们又改变了命名方式。:( - Khurshid Alam

我无法使用Mitch的答案,因为我想安装Ubuntu minimal,但ISO镜像无法工作(没有vmlinuz)。所以我改编了它,使用NetbootInstall

我将下载的文件放入/boot/netboot,并在grub配置中添加了以下条目:

menuentry "NetInstall" {
    linux (hd0,0)/boot/netboot/ubuntu-installer/amd64/linux
    initrd (hd0,0)/boot/netboot/ubuntu-installer/amd64/initrd.gz
}

我然后忘记跑了
sudo update-grub

所以我不得不再次启动现有的Linux,但是在最终更新了grub之后,实际安装非常顺利。

我尝试了你的网络引导方法,但它没有起作用。ISO文件在哪里?你只是在添加内核和initrd。你能再解释一下吗? - Khurshid Alam