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

ska*_*zin 7 rhel usb kickstart system-installation linux-kernel

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

有什么方法可以强制内核将 USB 识别为sdb和 HD识别为sda(我假设内核负责混淆,但我不确定)?它选择外部驱动器(USB)sda并强制内部驱动器(HD)sdb.

注意:我的问题与这个非常相似,除了我的 kickstart 文件绝对依赖于 HDsda

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

mik*_*erv 5

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

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

在 redhat 安装盘上,他们的dracut脚本系统构建并构成了 initramfs,而他们的anaconda安装系统构成了最终的用户空间。

udev负责处理设备设置——如,它将设备命名为/dev. 但这几乎总是发生两次- 一次在 initramfs 中,另一次是在 insideinit找到其目标根设备并准备在其devfs上安装 a时。

所以这是它的工作原理:

  • 引导加载程序(或固件)使用可选参数集和可选 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和一个/etc/fstab.

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

    • 当initramfs中init成功地找到和坐骑/new_root它通常会寻找的东西设备exec本身成-通常是/new_root/bin/init-因此无论该计划是成为PID 1.它通常与执行此switch_root提供程序busybox-这确实的exec,同时安装/new_root /。它的过程在内核文档中描述,因此

    但是 initramfsrootfs:您既不能pivot_rootrootfs,也不能rootfs umount。而是删除 rootfs 中的所有内容以释放空间( find -xdev / -exec rm '{}' ';'),使用新的 root ( cd /newmount; mount --move . /; chroot .)超载 rootfs ,附加stdin/stdout/stderr到新的/dev/consoleexec新的init.

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

很抱歉这里的详细程度,但我想说明为什么以下是正确的:

  • 您从引导加载程序提交的任何内核参数root=/dev/sda 都不必/dev/sda/dev/sda在 initramfs/init完成后最终访问的参数相同。

所以我认为,一种方法是udev在你的anaconda磁盘上设置一个规则——它实际上可能是一个 squashfs 存档——指示它在其他地方设置所有 USB 磁盘。这里有一个很好的例子:

KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*nez 3

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