USB 设置为 /dev/sda 而不是 /dev/sdb

USB 设置为 /dev/sda 而不是 /dev/sdb

我一直在尝试使用 kickstart 文件来引导 Red Hat 安装程序 (RHEL6.5),而无需用户干预。它正确地在 中查找 kickstart 文件/dev/sdb/fs.cfg,但由于 USB 被识别为/dev/sda,因此它实际上位于/dev/sda/fs.cfg.我可以手动将安装程序指向此目的地,但 kickstart 文件的其余部分依赖于本机硬盘驱动器sda。我想在不编辑启动文件的情况下这样做,但这是必要的,我愿意这样做。

有没有办法强制内核将 USB 识别为sdbHD 为sda(我假设内核负责混淆,但我不确定)?它选择外部驱动器(USB)作为sda并强制内部驱动器(HD)似乎很奇怪sdb.

注意:我的问题非常类似于这个,除了我的启动文件绝对取决于高清sda

此问题仅出现在 RHEL6.5 安装程序中,而不会出现在 RHEL5.X 安装程序中(我没有尝试过任何以前版本的 RHEL6.X)。我真正想知道的是为什么版本之间会发生变化。

答案1

好的,这就是启动过程的工作方式:

  • 固件 > 引导加载程序或许> 内核${parameters}> initramfs > 用户空间或许

在 redhat 安装盘上德拉库特脚本系统是构建和构成 initramfs 及其蟒蛇安装系统构成了最终的用户空间。

udev负责处理设备设置 - 例如,它在 中命名设备/dev。但这几乎总是会发生两次init- 一次在 initramfs 中,当内部找到其目标根设备并准备在其上安装时再次进行devfs

这就是它的工作原理:

  • 引导装载程序(或固件)使用可选参数集和可选 initramfs 映像调用内核。该参数集被保存/proc/cmdline,内核会忽略所有它不理解的参数。

  • initramfs 是一个工作的 Linux 用户空间。无论它的/内容是从调用时传递给它的映像中解压出来的,还是编译进去的,都无关紧要——从内核 2.6 开始,它始终是 Linux 内核安装的第一个工作根文件系统。从这一点开始,Linux 内核将一切交给用户空间。

    • 通常(对于 redhat 的 dracut 来说也是如此)initramfs 仅包含查找根设备并将其安装到自身上绝对必需的内容。一般来说,所包含的busybox只是安装目标根设备所需的内核模块。

    • 大概需要udev要这样做,因此udev通常包含在内 - 有自己的一小套规则。

    • 如前所述,initramfs 是它自己的小型完整 Linux 根文件系统。一个完整的可能看起来像:/bin /etc /dev /new_root /proc /sys init。这些目录的内容通常没有什么异常之处 - 几乎总是有一个/bin/sh和 an /etc/fstab

    • 大多数inits 将解析/proc/cmdline它们可能解释的任何内核参数。一个很常见的就是root=/dev/somediskroot=UUID=somediskUUIDroot=LABEL=somedisklabelinit解释这些参数的是 initramfs root=...- 而不是内核或init稍后执行的最终参数(尽管最后一个可能很好地解释其他)。它将接受此参数并将其安装在/new_root (或者它之前用于暂存安装的任何名称switchroot。如果udev包含在 initramfs 中,则由 initramfs 规则集决定目标磁盘条目/dev/...现在的命名 - 但这可以改变。

    • 当 initramfsinit成功找到并安装/new_root设备时,它通常会在其中寻找一些东西exec- 通常/new_root/bin/init- 因此无论该程序是什么都会成为 pid 1。它通常switch_root使用提供的程序来执行此操作busybox- 该程序会执行以下操作:exec同时安装一段时间/new_root 超过 /。其过程描述于内核文档因此:

    但是initramfsrootfs:你既不能pivot_rootrootfs,也不能umount使用它。相反,删除 rootfs 中的所有内容以释放空间find -xdev / -exec rm '{}' ';'),用新的 root 覆盖 rootfscd /newmount; mount --move . /; chroot .),依附于stdin/stdout/stderr/dev/console,又execinit

  • 刚刚执行的根设备init现在必须填充其自己的根文件系统。它根据自己的规则集调用并udev安装自己的规则集,然后执行其余所有操作。完成后,您就可以使用计算机了。devfs/dev

抱歉,我说的太详细了,但我想解释清楚为什么以下说法是正确的:

  • 您从引导加载程序中提交的任何内核参数,例如root=/dev/sda 没有与 initramfs完成后/dev/sda您最终将访问的内容相同。/dev/sda/init

因此,我认为,做到这一点的一种方法是为udev你的蟒蛇disk - 实际上可能是一个 squashfs 存档 - 指示它在其他地方设置所有 USB 磁盘。有一个很好的例子在这里:

KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"

如果您也阅读该链接的其余部分,那将是一件非常好的事情。您应该能够这样做,以便您的 USB 磁盘设备/dev/sda用于 initramfs - 因此您不必更改任何引导加载程序配置 - 但稍后会为/dev/usba与 anaconda 安装系统相同的磁盘创建一个节点。

答案2

进入主机的 BIOS 并重新排列硬盘驱动器和可移动驱动器的顺序。这将调整 Linux 内核中显示的顺序。

答案3

在我闪亮的新但古老的 45 美元 HP G60 笔记本电脑上,我遇到了同样的问题。我通过将新的 SSD 放在启动顺序的第一位,将 USB 从 移动/dev/sda到。/dev/sdb然后在启动时,按 ESC 键,就像进入 BIOS 一样,但有一个 preBIOS 菜单。因此,我没有按 F10 进入 BIOS,而是按 F9 进入启动选项。然后,无论 BIOS 中设置的引导顺序如何,您都可以手动选择从 USB 引导。显然我选择了 USB,然后在安装时我的 SSD 显示为/dev/sda

我搜索了好久,很多人都遇到过类似的问题,但没有人提出这个建议。比我发现的任何其他方法都简单得多。我凭直觉发现了这一点。

答案4

从 RHEL6 开始,您可以对安装介质使用标签,以便通过唯一的名称而不是不一致的内核 sdX 命名来访问驱动器/hd。

当您在 USB 驱动器上创建文件系统时,请确保使用 e2label 或 101 种其他方式来标记文件系统。

标记后,您可以通过该名称访问 USB,例如:ks=hd:LABEL=yourname:/path/to/fs.ks

另请记住,这种类型的命名也可用于其他位置。安装媒体、存储库等...

相关内容