我想在我的 PC 上启动 Linux,但不允许在磁盘上创建其他分区,而且从 USB 启动速度很慢。我有两个磁盘,在第一个磁盘上安装了 Windows 10,在第二个磁盘(格式化为 NTFS 文件系统)上存储了文件。
我尝试将 rootfs 放在第二个磁盘上。为此,我在另一个磁盘上安装了 Arch Linux,并将 GRUB 安装到 USB。我在这个 USB 上创建了一个 FAT 分区,并从已安装的 Arch Linux 复制了内核和 ramdisk。然后,我创建了一个文件 D:\ArchLinux\root.img,将其格式化为 ext4,并从已安装的 Arch Linux 复制了根文件系统。
然后,我启动了 USB,运行 GRUB 命令行,并写入以下命令:
set root=(hd0,msdos1)
linux /vmlinuz-linux rootfstype=ntfs3 root=/dev/sda2 loop=ArchLinux/root.img loopfstype=ext4 rw
initrd /initramfs-linux.img
boot
(我在这个答案中找到了它们:我可以让 SYSLINUX 从 NTFS 分区上的映像文件加载根文件系统吗?)
在启动过程中,我收到一个错误:
mount: /new_root: unknown filesystem type 'ntfs3'.
dmesg(1): may have more information after failed mount system call.
ERROR: Failed to mount '/dev/sda2' on real root
You are now being dropped into an emergency shell.
sh: can't access tty; job control turned off
[rootfs ~]#
请帮我解决一下。
答案1
从技术上来说可以(Ubuntu曾经拥有当然,initramfs 也需要包含底层文件系统所需的所有驱动程序。
这是不是挂载根文件系统的 syslinux或者您的映像;它所加载的只是内核和 initramfs,后者完成其余工作。initramfs 实际上具有根文件系统的驱动程序(在某些时候会自动从主系统中挑选出来);在这里您还需要让工具也包含 NTFS 驱动程序。这MODULES+=(ntfs3)
在 mkinitcpio.conf 中。
(我可能更愿意使用 ntfs-3g;它需要“fuse”模块和 FUSE 库以及 mount.ntfs-3g。虽然它速度较慢,但它仍然比新的 ntfs3 驱动程序更可靠……而且我认为这是 Wubi 以前使用的。)
但是,除了 NTFS 之外,您还需要说服 initramfs 设置实际的循环挂载。但由于构建 initramfs(及其内容)的工具因发行版而异,启动选项也是如此。Fedora 上基于 Dracut 的 initramfs 的有效功能不一定能在 Debian 上有效,并且 Gentoo 上的 genkernel initramfs 识别的参数不一定能被 Arch 上的 mkinitcpio initramfs 识别。
大多数这些工具也是模块化的,因此即使你找到的选项是对于 Arch 来说,它们可能仅由默认情况下未使用的钩子或模块使用;您必须先在 mkinitcpio.conf 中启用它们。但是,在这种情况下,mkinitcpio没有任何钩子会被识别loop=
为选项。但实际上并不存在该功能。
(您找到的帖子是由使用 Mint 的人编写的,基本上就是 Debian – 它构建的 initramfs 与 Arch 的非常不同。)
所以为了使其工作,您还需要 a) 自定义 mkinitcpio“钩子”脚本,或 b) 切换到不同的 initramfs 工具。
对于选项 a),钩子位于 /usr/lib/initcpio 中,编写起来并不难。事实上,AUR 有一个“mkinitcpio-循环子目录“包可能添加了这个功能,尽管可能有不同的选项。(我还没有读过它的文档,但直觉上我会期望图像作为你的根=,而底层分区将是一个单独的选项,就像 cryptdisk= 是单独的一样。)
对于选项 b),有一些变化;我认为基于 systemd 的 mkinitcpio initramfs(相同的工具但不同的钩子集)可以实现这一点,如果您要将 /etc/fstab 嵌入到 initramfs 中。Arch 也有 Dracut 和 Booster 可供选择;前者肯定有这个功能,后者可能没有。