将 Ubuntu 安装到 loop 中其实就是 wubi 的做法!
不过由于新版本取消了 wubi 工具,所以一切都得手工搞了!
由于 wubi 依赖 Windows ,只适合安装在 NTFS 分区中。如果手工搞的话没有应该此限制。
用到的软件:grub2win 和 ubuntu 16.04 desktop
实现方法:
使用 ubuntu desktop 光盘引导进入桌面
安装 ubuntu 到某个临时分区(我是用usb3.0优盘做临时分区),注意不要安装引导到硬盘上,以免破坏现有引导。安装完毕后不要重启,继续在光盘启动的 live 中工作。
然后在硬盘上创建一个 loop 设备文件,格式化成 ext4 ,然后挂载,将刚刚安装到临时分区的 ubuntu 所有文件拷贝到 loop 中(注意保持权限、所有者、链接等状态)。
在 loop 中建一个叫 host 的空文件夹
修改 loop 中 /etc/fstab ,将 / 的 UUID 改成当前 loop 的 UUID 。(用 blkid 查询 UUID)
完毕后,用 grub2win 引导系统(也可以是其他引导器)
在 GRUB2 中使用 loopback 装载 loop ,引导 loop 里面的 vmlinuz 和 initrd.img 。
注意 kernel 参数:root= 要设置成 loop 文件所在的硬盘分区, loop= 参数要指向 loop 文件所在分区路径。
注:在 Live 中使用 losetup 创建一个 loop ,然后在运行 ubuntu 的安装程序,此时安装目标无法选择 loop 设备,要不也不用这么麻烦了!
偷懒一点 ,loop 设备文件可以用dd搞!
用 dd if=/dev/sdx1 of=u16.disk bs=1M 这样拷贝也行,不过结束后最好把源分区删掉,因为两个 UUID 相同了!
系统会将 loop 设备文件所在硬盘的物理分区挂载到 /host 中,所以新建一个 host 是留一个挂载点而已!
图中是我的 grub2 和 loop 中 fstab 的配置。里面的 fstab 我没有使用 UUID 了,而是直接从 /host 挂载 loop 设备文件。